blob: 4a4bcdf8c577b27239c914e154a901a7b2055d62 [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>Service Registration &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="Characteristic Access" href="bleprph-chr-access.html"/>
<link rel="prev" title="BLE Peripheral Project" href="../bleprph.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> /
Service Registration
<div class="sourcelink">
<a href="https://github.com/apache/mynewt-documentation/edit/master/docs/tutorials/ble/bleprph/bleprph-sections/bleprph-svc-reg.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 current"><a class="current reference internal" href="#">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"><a class="reference internal" href="bleprph-gap-event.html">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="service-registration">
<h1>Service Registration<a class="headerlink" href="#service-registration" title="Permalink to this headline"></a></h1>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><p><a class="reference internal" href="#attribute-set" id="id1">Attribute Set</a></p></li>
<li><p><a class="reference internal" href="#registration-function" id="id2">Registration function</a></p></li>
<li><p><a class="reference internal" href="#descriptors-and-included-services" id="id3">Descriptors and Included Services</a></p></li>
</ul>
</div>
<div class="section" id="attribute-set">
<h2><a class="toc-backref" href="#id1">Attribute Set</a><a class="headerlink" href="#attribute-set" title="Permalink to this headline"></a></h2>
<p>The NimBLE host uses a table-based design for GATT server configuration.
The set of supported attributes are expressed as a series of tables that
resides in your C code. When possible, we recommend using a single
monolithic table, as it results in code that is simpler and less error
prone. Multiple tables can be used if it is impractical for the entire
attribute set to live in one place in your code.</p>
<p><em>bleprph</em> uses a single attribute table located in the <em>gatt_svr.c</em>
file, so let’s take a look at that now. The attribute table is called
<code class="docutils literal notranslate"><span class="pre">gatt_svr_svcs</span></code>; here are the first several lines from this table:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">static</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">ble_gatt_svc_def</span><span class="w"> </span><span class="n">gatt_svr_svcs</span><span class="p">[]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="cm">/*** Service: Security test. */</span>
<span class="w"> </span><span class="p">.</span><span class="n">type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BLE_GATT_SVC_TYPE_PRIMARY</span><span class="p">,</span>
<span class="w"> </span><span class="p">.</span><span class="n">uuid</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&amp;</span><span class="n">gatt_svr_svc_sec_test_uuid</span><span class="p">.</span><span class="n">u</span><span class="p">,</span>
<span class="w"> </span><span class="p">.</span><span class="n">characteristics</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">ble_gatt_chr_def</span><span class="p">[])</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="cm">/*** Characteristic: Random number generator. */</span>
<span class="w"> </span><span class="p">.</span><span class="n">uuid</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&amp;</span><span class="n">gatt_svr_chr_sec_test_rand_uuid</span><span class="p">.</span><span class="n">u</span><span class="p">,</span>
<span class="w"> </span><span class="p">.</span><span class="n">access_cb</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">gatt_svr_chr_access_sec_test</span><span class="p">,</span>
<span class="w"> </span><span class="p">.</span><span class="n">flags</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BLE_GATT_CHR_F_READ</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">BLE_GATT_CHR_F_READ_ENC</span><span class="p">,</span>
<span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="cm">/*** Characteristic: Static value. */</span>
<span class="w"> </span><span class="p">.</span><span class="n">uuid</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">gatt_svr_chr_sec_test_static_uuid</span><span class="p">.</span><span class="n">u</span><span class="p">,</span>
<span class="w"> </span><span class="p">.</span><span class="n">access_cb</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">gatt_svr_chr_access_sec_test</span><span class="p">,</span>
<span class="w"> </span><span class="p">.</span><span class="n">flags</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BLE_GATT_CHR_F_READ</span><span class="w"> </span><span class="o">|</span>
<span class="w"> </span><span class="n">BLE_GATT_CHR_F_WRITE</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">BLE_GATT_CHR_F_WRITE_ENC</span><span class="p">,</span>
<span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// [...]</span>
</pre></div>
</div>
<p>As you can see, the table is an array of service definitions (
<code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">ble_gatt_svc_def</span></code>). This code excerpt contains a small part of
the <em>GAP service</em>. The GAP service exposes generic information about a
device, such as its name and appearance. Support for the GAP service is
mandatory for all BLE peripherals. Let’s now consider the contents of
this table in more detail.</p>
<p>A service definition consists of the following fields:</p>
<table class="docutils align-default">
<colgroup>
<col style="width: 31%" />
<col style="width: 38%" />
<col style="width: 31%" />
</colgroup>
<thead>
<tr class="row-odd"><th class="head"><p><em>Field</em></p></th>
<th class="head"><p><em>Meaning</em></p></th>
<th class="head"><p><em>Notes</em></p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p>type</p></td>
<td><p>Specifies
whether
this is a
primary or
secondary
service.</p></td>
<td><p>Secondar
y
services
are not
very
common.
When in
doubt,
specify
<em>BLE_GA
TT_SVC_TYPE_P
RIMARY</em>
for new
services
.</p></td>
</tr>
<tr class="row-odd"><td><p>uuid128</p></td>
<td><p>The
UUID of
this
service.</p></td>
<td><p>If the
service
has a
16-bit
UUID,
you can
convert
it to
its
correspo
nding
128-bit
UUID
with the
<code class="docutils literal notranslate"><span class="pre">BLE_UU</span>
<span class="pre">ID16()</span></code>
macro.</p></td>
</tr>
<tr class="row-even"><td><p>characte
ristics</p></td>
<td><p>The array
of
characteri
stics
that
belong to
this
service.</p></td>
<td></td>
</tr>
</tbody>
</table>
<p>A service is little more than a container of characteristics; the
characteristics themselves are where the real action happens. A
characteristic definition consists of the following fields:</p>
<table class="docutils align-default">
<colgroup>
<col style="width: 31%" />
<col style="width: 38%" />
<col style="width: 31%" />
</colgroup>
<thead>
<tr class="row-odd"><th class="head"><p><em>Field</em></p></th>
<th class="head"><p><em>Meaning</em></p></th>
<th class="head"><p><em>Notes</em></p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p>uuid128</p></td>
<td><p>The
UUID of
this
characteri
stic.</p></td>
<td><p>If the
characte
ristic
has a
16-bit
UUID,
you can
convert
it to
its
correspo
nding
128-bit
UUID
with the
<code class="docutils literal notranslate"><span class="pre">BLE_UU</span>
<span class="pre">ID16()</span></code>
macro.</p></td>
</tr>
<tr class="row-odd"><td><p>access_
cb</p></td>
<td><p>A callback
function
that gets
executed
whenever a
peer
device
accesses
this
characteri
stic.</p></td>
<td><p><em>For
reads:</em>
this
function
generate
s
the
value
that
gets
sent
back to
the
peer.*
For
writes:*
this
function
receives
the
written
value as
an
argument
.</p></td>
</tr>
<tr class="row-even"><td><p>flags</p></td>
<td><p>Indicates
which
operations
are
permitted
for this
characteri
stic.
The NimBLE
stack
responds
negatively
when a
peer
attempts
an
unsupporte
d
operation.</p></td>
<td><p>The full
list of
flags
can be
found
under
<code class="docutils literal notranslate"><span class="pre">ble_ga</span>
<span class="pre">tt_chr_f</span>
<span class="pre">lags</span></code>
in
<a class="reference external" href="https://github.com/apache/mynewt-core/blob/master/net/nimble/host/include/host/ble_gatt.h">net/nim
ble/host
/include
/host/bl
e_gatt.
h</a>
.</p></td>
</tr>
</tbody>
</table>
<p>The access callback is what implements the characteristic’s behavior.
Access callbacks are described in detail in the next section: <a class="reference internal" href="bleprph-chr-access.html"><span class="doc">BLE
Peripheral - Characteristic Access</span></a>.</p>
<p>The service definition array and each characteristic definition array is
terminated with an empty entry, represented with a 0. The below code
listing shows the last service in the array, including terminating zeros
for the characteristic array and service array.</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">{</span>
<span class="go"> /*** Service: Security test. */</span>
<span class="go"> .type = BLE_GATT_SVC_TYPE_PRIMARY,</span>
<span class="go"> .uuid = &amp;gatt_svr_svc_sec_test_uuid.u,</span>
<span class="go"> .characteristics = (struct ble_gatt_chr_def[]) { {</span>
<span class="go"> /*** Characteristic: Random number generator. */</span>
<span class="go"> .uuid = &amp;gatt_svr_chr_sec_test_rand_uuid.u,</span>
<span class="go"> .access_cb = gatt_svr_chr_access_sec_test,</span>
<span class="go"> .flags = BLE_GATT_CHR_F_READ | BLE_GATT_CHR_F_READ_ENC,</span>
<span class="go"> }, {</span>
<span class="go"> /*** Characteristic: Static value. */</span>
<span class="go"> .uuid = &amp;gatt_svr_chr_sec_test_static_uuid.u,</span>
<span class="go"> .access_cb = gatt_svr_chr_access_sec_test,</span>
<span class="go"> .flags = BLE_GATT_CHR_F_READ |</span>
<span class="go"> BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_WRITE_ENC,</span>
<span class="go"> }, {</span>
<span class="hll"><span class="go"> 0, /* No more characteristics in this service. */</span>
</span><span class="go"> } },</span>
<span class="go">},</span>
<span class="go">{</span>
<span class="hll"><span class="go"> 0, /* No more services. */</span>
</span><span class="go">},</span>
</pre></div>
</div>
</div>
<div class="section" id="registration-function">
<h2><a class="toc-backref" href="#id2">Registration function</a><a class="headerlink" href="#registration-function" title="Permalink to this headline"></a></h2>
<p>After you have created your service table, your app needs to register it
with the NimBLE stack. This is done by calling the following function:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span>
<span class="n">ble_gatts_add_svcs</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">ble_gatt_svc_def</span><span class="w"> </span><span class="o">*</span><span class="n">svcs</span><span class="p">)</span>
</pre></div>
</div>
<p>where <em>svcs</em> is table of services to register.</p>
<p>The <code class="docutils literal notranslate"><span class="pre">ble_gatts_add_svcs()</span></code> function returns 0 on success, or a
<em>BLE_HS_E[…]</em> error code on failure.</p>
<p>More detailed information about the registration callback function can
be found in the <span class="xref std std-doc">BLE User Guide</span>
(TBD).</p>
<p>The <em>bleprph</em> app registers its services as follows:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ble_gatts_add_svcs</span><span class="p">(</span><span class="n">gatt_svr_svcs</span><span class="p">);</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>
</pre></div>
</div>
<p>which adds services to registration queue. On startup NimBLE host automatically calls <code class="docutils literal notranslate"><span class="pre">ble_gatts_start()</span></code> function which makes all registered serivices available to peers.</p>
</div>
<div class="section" id="descriptors-and-included-services">
<h2><a class="toc-backref" href="#id3">Descriptors and Included Services</a><a class="headerlink" href="#descriptors-and-included-services" title="Permalink to this headline"></a></h2>
<p>Your peripheral can also expose descriptors and included services. These
are less common, so they are not covered in this tutorial. For more
information, see the <span class="xref std std-doc">BLE User
Guide</span>.</p>
</div>
</div>
</div>
</div>
<div class="rst-footer-buttons row" role="navigation" aria-label="footer navigation">
<a href="bleprph-chr-access.html" class="btn btn-neutral float-right" title="Characteristic Access" accesskey="n">Next: Characteristic Access <span class="fa fa-arrow-circle-right"></span></a>
<a href="../bleprph.html" class="btn btn-neutral" title="BLE Peripheral Project" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous: BLE Peripheral Project</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>