blob: 5488ea247f0d5af2d1a64e29b60ce66a43331944 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GAP Event callbacks &mdash; Apache Mynewt latest documentation</title>
<link rel="shortcut icon" href="../../../../_static/mynewt-logo-only-newt32x32.png"/>
<link rel="stylesheet" href="../../../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../../../_static/css/sphinx_theme.css" type="text/css" />
<link rel="stylesheet" href="../../../../_static/css/bootstrap-3.0.3.min.css" type="text/css" />
<link rel="stylesheet" href="../../../../_static/css/v2.css" type="text/css" />
<link rel="stylesheet" href="../../../../_static/css/custom.css" type="text/css" />
<link rel="stylesheet" href="../../../../_static/css/restructuredtext.css" type="text/css" />
<link rel="stylesheet" href="../../../../_static/css/overrides.css" type="text/css" />
<link rel="index" title="Index"
href="../../../../genindex.html"/>
<link rel="search" title="Search" href="../../../../search.html"/>
<link rel="top" title="Apache Mynewt latest documentation" href="../../../../index.html"/>
<link rel="up" title="BLE Peripheral Project" href="../bleprph.html"/>
<link rel="next" title="BLE Peripheral App" href="bleprph-app.html"/>
<link rel="prev" title="Advertising" href="bleprph-adv.html"/>
<script src="../../../../_static/js/modernizr.min.js"></script>
<script>
(function(i, s, o, g, r, a, m) {
i["GoogleAnalyticsObject"] = r;
(i[r] =
i[r] ||
function() {
(i[r].q = i[r].q || []).push(arguments);
}),
(i[r].l = 1 * new Date());
(a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]);
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m);
})(window, document, "script", "//www.google-analytics.com/analytics.js", "ga");
ga("create", "UA-72162311-1", "auto");
ga("send", "pageview");
</script>
</head>
<body class="not-front page-documentation" role="document" >
<div id="wrapper">
<div class="container">
<div id="banner" class="row v2-main-banner">
<a class="logo-cell" href="/">
<img class="logo" src="../../../../_static/img/logo.png">
</a>
<div class="tagline-cell">
<h4 class="tagline">An OS to build, deploy and securely manage billions of devices</h4>
</div>
<div class="news-cell">
<div class="well">
<h4>Latest News:</h4> <a href="/download">Apache Mynewt 1.12.0, Apache NimBLE 1.7.0 </a> released April 4, 2024)
</div>
</div>
</div>
</div>
<header>
<nav id="navbar" class="navbar navbar-inverse" role="navigation">
<div class="container">
<!-- Collapsed navigation -->
<div class="navbar-header">
<!-- Expander button -->
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<!-- Expanded navigation -->
<div class="navbar-collapse collapse">
<!-- Main navigation -->
<ul class="nav navbar-nav navbar-right">
<li>
<a href="/"><i class="fa fa-home" style="font-size: larger;"></i></a>
</li>
<li class="important">
<a href="/quick-start/">Quick Start</a>
</li>
<li>
<a href="/about/">About</a>
</li>
<li>
<a href="/talks/">Talks</a>
</li>
<li class="active">
<a href="/documentation/">Documentation</a>
</li>
<li>
<a href="/download/">Download</a>
</li>
<li>
<a href="/community/">Community</a>
</li>
<li>
<a href="/events/">Events</a>
</li>
</ul>
<!-- Search, Navigation and Repo links -->
<ul class="nav navbar-nav navbar-right">
</ul>
</div>
</div>
</nav>
</header>
<!-- STARTS MAIN CONTENT -->
<div id="main-content">
<div id="breadcrumb">
<div class="container">
<a href="/documentation/">Docs</a> /
<a href="../../../tutorials.html">Tutorials</a> /
<a href="../../ble.html">Bluetooth Low Energy</a> /
<a href="../bleprph.html">BLE Peripheral Project</a> /
GAP Event callbacks
<div class="sourcelink">
<a href="https://github.com/apache/mynewt-documentation/edit/master/docs/tutorials/ble/bleprph/bleprph-sections/bleprph-gap-event.rst" class="icon icon-github"
rel="nofollow"> Edit on GitHub</a>
</div>
</div>
</div>
<!-- STARTS CONTAINER -->
<div class="container">
<!-- STARTS .content -->
<div id="content" class="row">
<!-- STARTS .container-sidebar -->
<div class="container-sidebar col-xs-12 col-sm-3">
<div id="docSidebar" class="sticky-container">
<div role="search" class="sphinx-search">
<form id="rtd-search-form" class="wy-form" action="../../../../search.html" method="get">
<input type="text" name="q" placeholder="Search documentation" class="search-documentation" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
<!-- Note: only works when deployed -->
<select class="form-control" onchange="if (this.value) window.location.href=this.value">
<option value="/latest" selected>
Version: latest
</option>
<option value="/v1_12_0" >
Version: 1.12.0
</option>
<option value="/v1_11_0" >
Version: 1.11.0
</option>
<option value="/v1_10_0" >
Version: 1.10.0
</option>
<option value="/v1_9_0" selected="selected" >
Version: 1.9.0
</option>
<option value="/v1_8_0" >
Version: 1.8.0
</option>
<option value="/v1_7_0" >
Version: 1.7.0
</option>
<option value="/v1_6_0" >
Version: 1.6.0
</option>
<option value="/v1_5_0" >
Version: 1.5.0
</option>
<option value="/v1_4_0" >
Version: 1.4.0
</option>
<option value="/v1_3_0/os/introduction" >
Version: 1.3.0
</option>
<option value="/v1_2_0/os/introduction" >
Version: 1.2.0
</option>
<option value="/v1_1_0/os/introduction" >
Version: 1.1.0
</option>
<option value="/v1_0_0/os/introduction" >
Version: 1.0.0
</option>
<option value="/v0_9_0/os/introduction" >
Version: 0.9.0
</option>
</select>
<div class="region region-sidebar">
<div class="docs-menu">
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../../../index.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../get_started/index.html">Setup &amp; Get Started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../concepts.html">Concepts</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../../../tutorials.html">Tutorials</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../../../blinky/blinky.html">Project Blinky</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../repo/add_repos.html">Working with repositories</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../slinky/project-slinky.html">Project Slinky for Remote Comms</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="../../ble.html">Bluetooth Low Energy</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="../../ble_bare_bones.html">Set up a bare bones NimBLE application</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../ibeacon.html">BLE iBeacon</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../eddystone.html">BLE Eddystone</a></li>
<li class="toctree-l3 current"><a class="reference internal" href="../bleprph.html">BLE Peripheral Project</a><ul class="current">
<li class="toctree-l4"><a class="reference internal" href="bleprph-svc-reg.html">Service Registration</a></li>
<li class="toctree-l4"><a class="reference internal" href="bleprph-chr-access.html">Characteristic Access</a></li>
<li class="toctree-l4"><a class="reference internal" href="bleprph-adv.html">Advertising</a></li>
<li class="toctree-l4 current"><a class="current reference internal" href="#">GAP Event callbacks</a></li>
<li class="toctree-l4"><a class="reference internal" href="bleprph-app.html">BLE Peripheral App</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../../blehci_project.html">Use HCI access to NimBLE controller</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../../../lora/lorawanapp.html">LoRa</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../os_fundamentals/os_fundamentals.html">OS Fundamentals</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../devmgmt/devmgmt.html">Remote Device Management</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../sensors/sensors.html">Sensors</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../tooling/tooling.html">Tooling</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../other/other.html">Other</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../../../external_links.html">Third-party Resources</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../os/os_user_guide.html">OS User Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../network/index.html">BLE User Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../newt/index.html">Newt Tool Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../newtmgr/index.html">Newt Manager Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../mynewt_faq/index.html">Mynewt FAQ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../misc/index.html">Appendix</a></li>
</ul>
</div>
</div>
</div>
<!-- ENDS STICKY CONTAINER -->
</div>
<!-- ENDS .container-sidebar -->
<div class="col-xs-12 col-sm-9">
<div class="alert alert-warning">
<p>
Version 1.9.0 is not the most recent version of the
Apache Mynewt documentation. Click <a href="/latest">here</a> to
read the latest version.
</p>
</div>
<div class="">
<div class="rst-content">
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="gap-event-callbacks">
<h1>GAP Event callbacks<a class="headerlink" href="#gap-event-callbacks" title="Permalink to this headline">ΒΆ</a></h1>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><p><a class="reference internal" href="#overview" id="id1">Overview</a></p></li>
<li><p><a class="reference internal" href="#bleprph-gap-event" id="id2">bleprph_gap_event()</a></p></li>
<li><p><a class="reference internal" href="#guarantees" id="id3">Guarantees</a></p></li>
</ul>
</div>
<div class="section" id="overview">
<h2><a class="toc-backref" href="#id1">Overview</a><a class="headerlink" href="#overview" title="Permalink to this headline">ΒΆ</a></h2>
<p>Every BLE connection has a <em>GAP event callback</em> associated with it. A
GAP event callback is a bit of application code which NimBLE uses to
inform you of connection-related events. For example, if a connection is
terminated, NimBLE lets you know about it with a call to that
connection’s callback.</p>
<p>In the <a class="reference internal" href="bleprph-adv.html"><span class="doc">advertising section</span></a> of this tutorial, we saw
how the application specifies a GAP event callback when it begins
advertising. NimBLE uses this callback to notify the application that a
central has connected to your peripheral after receiving an
advertisement. Let’s revisit how <em>bleprph</em> specifies its connection
callback when advertising:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cm">/* Begin advertising. */</span>
<span class="n">memset</span><span class="p">(</span><span class="o">&amp;</span><span class="n">adv_params</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="w"> </span><span class="n">adv_params</span><span class="p">);</span>
<span class="n">adv_params</span><span class="p">.</span><span class="n">conn_mode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BLE_GAP_CONN_MODE_UND</span><span class="p">;</span>
<span class="n">adv_params</span><span class="p">.</span><span class="n">disc_mode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BLE_GAP_DISC_MODE_GEN</span><span class="p">;</span>
<span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ble_gap_adv_start</span><span class="p">(</span><span class="n">BLE_ADDR_TYPE_PUBLIC</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">BLE_HS_FOREVER</span><span class="p">,</span>
<span class="w"> </span><span class="o">&amp;</span><span class="n">adv_params</span><span class="p">,</span><span class="w"> </span><span class="n">bleprph_gap_event</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span>
<span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">rc</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">BLEPRPH_LOG</span><span class="p">(</span><span class="n">ERROR</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;error enabling advertisement; rc=%d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">rc</span><span class="p">);</span>
<span class="w"> </span><span class="k">return</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
<div class="section" id="bleprph-gap-event">
<h2><a class="toc-backref" href="#id2">bleprph_gap_event()</a><a class="headerlink" href="#bleprph-gap-event" title="Permalink to this headline">ΒΆ</a></h2>
<p>The <code class="docutils literal notranslate"><span class="pre">bleprph_gap_event()</span></code> function is <em>bleprph</em>’s GAP event callback;
NimBLE calls this function when the advertising operation leads to
connection establishment. Upon connection establishment, this callback
becomes permanently associated with the connection; all subsequent
events related to this connection are communicated through this
callback.</p>
<p>Now let’s look at the function that <em>bleprph</em> uses for all its
connection callbacks: <code class="docutils literal notranslate"><span class="pre">bleprph_gap_event()</span></code>.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cm">/**</span>
<span class="cm"> * The nimble host executes this callback when a GAP event occurs. The</span>
<span class="cm"> * application associates a GAP event callback with each connection that forms.</span>
<span class="cm"> * bleprph uses the same callback for all connections.</span>
<span class="cm"> *</span>
<span class="cm"> * @param event The type of event being signalled.</span>
<span class="cm"> * @param ctxt Various information pertaining to the event.</span>
<span class="cm"> * @param arg Application-specified argument; unuesd by</span>
<span class="cm"> * bleprph.</span>
<span class="cm"> *</span>
<span class="cm"> * @return 0 if the application successfully handled the</span>
<span class="cm"> * event; nonzero on failure. The semantics</span>
<span class="cm"> * of the return code is specific to the</span>
<span class="cm"> * particular GAP event being signalled.</span>
<span class="cm"> */</span>
<span class="k">static</span><span class="w"> </span><span class="kt">int</span>
<span class="nf">bleprph_gap_event</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">ble_gap_event</span><span class="w"> </span><span class="o">*</span><span class="n">event</span><span class="p">,</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">arg</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">ble_gap_conn_desc</span><span class="w"> </span><span class="n">desc</span><span class="p">;</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">rc</span><span class="p">;</span>
<span class="w"> </span><span class="k">switch</span><span class="w"> </span><span class="p">(</span><span class="n">event</span><span class="o">-&gt;</span><span class="n">type</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="no">BLE_GAP_EVENT_CONNECT</span><span class="p">:</span>
<span class="w"> </span><span class="cm">/* A new connection was established or a connection attempt failed. */</span>
<span class="w"> </span><span class="n">BLEPRPH_LOG</span><span class="p">(</span><span class="n">INFO</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;connection %s; status=%d &quot;</span><span class="p">,</span>
<span class="w"> </span><span class="n">event</span><span class="o">-&gt;</span><span class="n">connect</span><span class="p">.</span><span class="n">status</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="s">&quot;established&quot;</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="s">&quot;failed&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="n">event</span><span class="o">-&gt;</span><span class="n">connect</span><span class="p">.</span><span class="n">status</span><span class="p">);</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">event</span><span class="o">-&gt;</span><span class="n">connect</span><span class="p">.</span><span class="n">status</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ble_gap_conn_find</span><span class="p">(</span><span class="n">event</span><span class="o">-&gt;</span><span class="n">connect</span><span class="p">.</span><span class="n">conn_handle</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">desc</span><span class="p">);</span>
<span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="n">rc</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>
<span class="w"> </span><span class="n">bleprph_print_conn_desc</span><span class="p">(</span><span class="o">&amp;</span><span class="n">desc</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">BLEPRPH_LOG</span><span class="p">(</span><span class="n">INFO</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">event</span><span class="o">-&gt;</span><span class="n">connect</span><span class="p">.</span><span class="n">status</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="cm">/* Connection failed; resume advertising. */</span>
<span class="w"> </span><span class="n">bleprph_advertise</span><span class="p">();</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="no">BLE_GAP_EVENT_DISCONNECT</span><span class="p">:</span>
<span class="w"> </span><span class="n">BLEPRPH_LOG</span><span class="p">(</span><span class="n">INFO</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;disconnect; reason=%d &quot;</span><span class="p">,</span><span class="w"> </span><span class="n">event</span><span class="o">-&gt;</span><span class="n">disconnect</span><span class="p">.</span><span class="n">reason</span><span class="p">);</span>
<span class="w"> </span><span class="n">bleprph_print_conn_desc</span><span class="p">(</span><span class="o">&amp;</span><span class="n">event</span><span class="o">-&gt;</span><span class="n">disconnect</span><span class="p">.</span><span class="n">conn</span><span class="p">);</span>
<span class="w"> </span><span class="n">BLEPRPH_LOG</span><span class="p">(</span><span class="n">INFO</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span>
<span class="w"> </span><span class="cm">/* Connection terminated; resume advertising. */</span>
<span class="w"> </span><span class="n">bleprph_advertise</span><span class="p">();</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="no">BLE_GAP_EVENT_CONN_UPDATE</span><span class="p">:</span>
<span class="w"> </span><span class="cm">/* The central has updated the connection parameters. */</span>
<span class="w"> </span><span class="n">BLEPRPH_LOG</span><span class="p">(</span><span class="n">INFO</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;connection updated; status=%d &quot;</span><span class="p">,</span>
<span class="w"> </span><span class="n">event</span><span class="o">-&gt;</span><span class="n">conn_update</span><span class="p">.</span><span class="n">status</span><span class="p">);</span>
<span class="w"> </span><span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ble_gap_conn_find</span><span class="p">(</span><span class="n">event</span><span class="o">-&gt;</span><span class="n">connect</span><span class="p">.</span><span class="n">conn_handle</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">desc</span><span class="p">);</span>
<span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="n">rc</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>
<span class="w"> </span><span class="n">bleprph_print_conn_desc</span><span class="p">(</span><span class="o">&amp;</span><span class="n">desc</span><span class="p">);</span>
<span class="w"> </span><span class="n">BLEPRPH_LOG</span><span class="p">(</span><span class="n">INFO</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="no">BLE_GAP_EVENT_ENC_CHANGE</span><span class="p">:</span>
<span class="w"> </span><span class="cm">/* Encryption has been enabled or disabled for this connection. */</span>
<span class="w"> </span><span class="n">BLEPRPH_LOG</span><span class="p">(</span><span class="n">INFO</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;encryption change event; status=%d &quot;</span><span class="p">,</span>
<span class="w"> </span><span class="n">event</span><span class="o">-&gt;</span><span class="n">enc_change</span><span class="p">.</span><span class="n">status</span><span class="p">);</span>
<span class="w"> </span><span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ble_gap_conn_find</span><span class="p">(</span><span class="n">event</span><span class="o">-&gt;</span><span class="n">connect</span><span class="p">.</span><span class="n">conn_handle</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">desc</span><span class="p">);</span>
<span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="n">rc</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>
<span class="w"> </span><span class="n">bleprph_print_conn_desc</span><span class="p">(</span><span class="o">&amp;</span><span class="n">desc</span><span class="p">);</span>
<span class="w"> </span><span class="n">BLEPRPH_LOG</span><span class="p">(</span><span class="n">INFO</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="no">BLE_GAP_EVENT_SUBSCRIBE</span><span class="p">:</span>
<span class="w"> </span><span class="n">BLEPRPH_LOG</span><span class="p">(</span><span class="n">INFO</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;subscribe event; conn_handle=%d attr_handle=%d &quot;</span>
<span class="w"> </span><span class="s">&quot;reason=%d prevn=%d curn=%d previ=%d curi=%d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="n">event</span><span class="o">-&gt;</span><span class="n">subscribe</span><span class="p">.</span><span class="n">conn_handle</span><span class="p">,</span>
<span class="w"> </span><span class="n">event</span><span class="o">-&gt;</span><span class="n">subscribe</span><span class="p">.</span><span class="n">attr_handle</span><span class="p">,</span>
<span class="w"> </span><span class="n">event</span><span class="o">-&gt;</span><span class="n">subscribe</span><span class="p">.</span><span class="n">reason</span><span class="p">,</span>
<span class="w"> </span><span class="n">event</span><span class="o">-&gt;</span><span class="n">subscribe</span><span class="p">.</span><span class="n">prev_notify</span><span class="p">,</span>
<span class="w"> </span><span class="n">event</span><span class="o">-&gt;</span><span class="n">subscribe</span><span class="p">.</span><span class="n">cur_notify</span><span class="p">,</span>
<span class="w"> </span><span class="n">event</span><span class="o">-&gt;</span><span class="n">subscribe</span><span class="p">.</span><span class="n">prev_indicate</span><span class="p">,</span>
<span class="w"> </span><span class="n">event</span><span class="o">-&gt;</span><span class="n">subscribe</span><span class="p">.</span><span class="n">cur_indicate</span><span class="p">);</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</div>
<p>Connection callbacks are used to communicate a variety of events related
to a connection. An application determines the type of event that
occurred by inspecting the value of the <em>event-&gt;type</em> parameter. The
full list of event codes can be found on the <span class="xref std std-doc">GAP
events</span>
page.</p>
</div>
<div class="section" id="guarantees">
<h2><a class="toc-backref" href="#id3">Guarantees</a><a class="headerlink" href="#guarantees" title="Permalink to this headline">ΒΆ</a></h2>
<p>It is important to know what your application code is allowed to do from
within a connection callback.</p>
<p><strong>No restrictions on NimBLE operations</strong></p>
<p>Your app is free to make calls into the NimBLE stack from within a
connection callback. <em>bleprph</em> takes advantage of this freedom when it
resumes advertising upon connection termination. All other NimBLE
operations are also allowed (service discovery, pairing initiation,
etc).</p>
<p><strong>All context data is transient</strong></p>
<p>Pointers in the context object point to data living on the stack. Your
callback is free to read (or write, if appropriate) through these
pointers, but you should not store these pointers for later use. If your
application needs to retain some data from a context object, it needs to
make a copy.</p>
</div>
</div>
</div>
</div>
<div class="rst-footer-buttons row" role="navigation" aria-label="footer navigation">
<a href="bleprph-app.html" class="btn btn-neutral float-right" title="BLE Peripheral App" accesskey="n">Next: BLE Peripheral App <span class="fa fa-arrow-circle-right"></span></a>
<a href="bleprph-adv.html" class="btn btn-neutral" title="Advertising" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous: Advertising</a>
</div>
</div>
</div>
</div>
<!-- ENDS CONTENT SECTION -->
</div>
<!-- ENDS .content -->
</div>
</div>
<footer>
<div class="container">
<div class="row">
<div class="col-xs-12">
<p class="copyright">Apache Mynewt is available under Apache License, version 2.0.</p>
</div>
<div class="col-xs-12">
<div class="logos">
<img src="../../../../_static/img/asf_logo_wide_small.png" alt="Apache" title="Apache">
<small class="footnote">
Apache Mynewt, Mynewt, Apache, the Apache feather logo, and the Apache Mynewt project logo are either
registered trademarks or trademarks of the Apache Software Foundation in the United States and other countries.
</small>
<a href="">
<img src="../../../../_static/img/add_to_slack.png" alt="Slack Icon" title="Join our Slack Community" />
</a>
</div>
</div>
</div>
</div>
</footer>
</div>
<!-- ENDS #wrapper -->
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT:'../../../../',
VERSION:'latest',
COLLAPSE_INDEX:false,
FILE_SUFFIX:'.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt',
LINK_SUFFIX: '.html'
};
</script>
<script type="text/javascript" src="../../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../../_static/doctools.js"></script>
<script type="text/javascript" src="../../../../_static/js/bootstrap-3.0.3.min.js"></script>
<script type="text/javascript" src="../../../../_static/js/affix.js"></script>
<script type="text/javascript" src="../../../../_static/js/main.js"></script>
</body>
</html>