blob: 15588f74a2de86f0d7c13ec9c66870f67d0bbd14 [file] [log] [blame]
<div class="row">
<div class="col-xs-12 v2-sub-page">
<h2>NimBLE - Mynewt's Bluetooth 4.2 compliant stack </h2>
<p>
NimBLE is a complete Bluetooth Low Energy 4.2 stack featuring source code for both host and controller subsystems. You can choose to run NimBLE as
</p>
<ul>
<li> a complete stack in a single processor</li>
<li> host only</li>
<li> controller only</li>
<li> host and controller in separate processors on a board</li>
</ul>
<p>
The standardized Host Controller Interface (HCI) allows you to mix and match Mynewt’s host or controller portion with another vendor’s controller or host implementation respectively, to suit your product hardware and application. As an example, you may run the NimBLE controller with BlueZ, the Linux Bluetooth host protocol stack. As a reverse example you could choose to run NimBLE's host with a chip vendor's controller that supports HCI over UART transport.
</p>
<h3>Features</h3>
<ul>
<li>LE Privacy 1.2 </li>
<li>Security Manager (SM) with support for LE Legacy Pairing (Just Works, Numeric Comparison, Passkey Entry, OOB), LE Secure Connections, Transport Specific Key Distribution</li>
<li>LE Data Length Extension</li>
<li>Concurrent multiple roles (master(central)/slave(peripheral), server/client)</li>
<li>Simultaneous advertising and scanning</li>
<li>Low Duty Cycle Directed Advertising</li>
<li>Connection parameters request procedure</li>
<li>LE Ping</li>
<li>32 bit UUIS</li>
<li>L2CAP Connection Oriented Channels</li>
<li>Full GATT Server, Client, and all sub-procedures</li>
<li>Host Controller Interface (HCI) between the host and controller either through software API or by UART hardware connection</li>
</ul>
<h3>Profile and Service support</h3>
<ul>
<li>Alert Notification Profile and Service(ANS)</li>
<li>Immediate Alert Service (IAS)</li>
<li>Link Loss Profile and Service</li>
<li>Transmit Power Service</li>
</ul>
<h3>Memory sizing</h3>
<p>
The recommended memory size for running Mynewt OS with NimBLE is 64 kB of RAM and 512 kB of Flash. This allows the application developer to build an image for a product with ample space for application data and logic, security capabilities such as secure bootloader, and operational utilities such as detailed logs and statistics.
</p>
<p>
While the recommendations are for higher amounts of memory, Mynewt OS with NimBLE can be optimized to operate with 32 kB of RAM and 256 kB of Flash.
</p>
<uL>
<li> Core OS kernel: <1 kB of RAM, <6 kB of Flash </li>
<li> NimBLE Stack (including both peripheral and central roles, legacy pairing): 4.5 kB of RAM, 69 kB of Flash </li>
<li> BLE peripheral application using Mynewt OS, NimBLE with security: 15 kB of RAM, 99 kB of Flash </li>
</ul>
<h3>Role configuration</h3>
<p>
NimBLE gives you tremendous flexibility to meet your application and device requirements. </p>
<ul>
<li>Up to 32 concurrent connections as a Central </li>
<li>Up to 32 concurrent connections as a Peripheral </li>
<li>Up to 32 concurrent connections in any combination of Central and Peripheral with Observer and Broadcaster roles running simultaneously. </li>
<li>Ability for a peripheral to connect to multiple centrals </li>
<li>Flexibility to configure the scheduler to allow for larger data bursts when connected to a large number of peripherals</li>
</ul>
<h3>System configuration</h3>
<p>
NimBLE allows the application developer to configure the system to extract the most suitable performance. Whether it is getting the most number of concurrent connections or getting a high throughput or ensuring low latencies for data bursts to several peripherals, NimBLE offers plenty of options. Of course, any changes to the default configuration has implications on code size, runtime RAM usage etc., a glimpse of which is shown below.
</p>
<table style="width:100%">
<tr>
<th>Subsystem</th>
<th>Examples of Configuration Options</th>
<th>Default(kB)</th>
<th>Element Size(kB)</th>
<th>Default Size(kB)</th>
<th>Size for x # of connections</th>
</tr>
<tr>
<th rowspan="4">Host</th>
<td>Max. number of config descriptors</td>
<td>1</td>
<td>4</td>
<td>4</td>
<td>(x+1)*3</td>
</tr>
<tr>
<td>Max. number of attributes in a single GATT Reliable Write procedure</td>
<td>36</td>
<td>32</td>
<td>1152</td>
<td>Independent</td>
</tr>
<tr>
<td>Max. number of concurrent connections</td>
<td>1</td>
<td>80</td>
<td>80</td>
<td>x*80</td>
</tr>
<tr>
<td>...and several more. Full system configuration is specified in /net/nimble/host/syscfg.yml with sensible defaults. </td>
</tr>
<tr>
<th rowspan="4">Controller</th>
<td>Whitelist size</td>
<td>8</td>
<td>8</td>
<td>64</td>
<td>Independent</td>
</tr>
<tr>
<td>RNG buffer size</td>
<td>32</td>
<td>1</td>
<td>32</td>
<td>Independent</td>
</tr>
<tr>
<td>Max. number of concurrent connections</td>
<td>1</td>
<td>416</td>
<td>416</td>
<td>x*416</td>
</tr>
<tr>
<td>...and several more. Full system configuration is specified in /net/nimble/controller/syscfg.yml with sensible defaults.</td>
</tr>
</table>
</div>
</div>