mirror of
https://github.com/h2zero/esp-nimble-cpp.git
synced 2024-11-21 20:50:55 +01:00
Update docs.
This commit is contained in:
parent
a36655c105
commit
38a1a2013b
6 changed files with 158 additions and 321 deletions
|
@ -7,12 +7,11 @@ Extended advertising allows for much more capability and flexibility.
|
||||||
|
|
||||||
* New PHY's (physical layers) that allow for faster data rate (2M PHY) or long range/slower data rates (CODED PHY) as well as the original 1M PHY.
|
* New PHY's (physical layers) that allow for faster data rate (2M PHY) or long range/slower data rates (CODED PHY) as well as the original 1M PHY.
|
||||||
|
|
||||||
* New periodic advertising, allowing the scanning device to sync with the advertisements of a beacon. This allows for the scanning device to sleep or perform other tasks before the next expected advertisement is sent, preserving cpu cycles and power (To be implemented).
|
* New periodic advertising, allowing the scanning device to sync with the advertisements of a beacon. This allows for the scanning device to sleep or perform other tasks before the next expected advertisement is sent, preserving cpu cycles and power (To be implemented).
|
||||||
<br>
|
<br/>
|
||||||
|
|
||||||
## Enabling extended advertising
|
## Enabling extended advertising
|
||||||
Extended advertising is supported when enabled with the config option `CONFIG_BT_NIMBLE_EXT_ADV` set to a value of 1. This is done in menuconfig under `Component config > Bluetooth > NimBLE options >
|
Extended advertising is supported when enabled with the config option `CONFIG_BT_NIMBLE_EXT_ADV` set to a value of 1. This is done in menuconfig under `Component config > Bluetooth > NimBLE options > Enable extended advertising`, or set in `nimconfig.h` for Arduino, or in `build_flags` in PlatformIO.
|
||||||
Enable extended advertising`.
|
|
||||||
|
|
||||||
When enabled the following will occur:
|
When enabled the following will occur:
|
||||||
* `NimBLEScan::start` method will scan on both the 1M PHY and the coded PHY standards automatically.
|
* `NimBLEScan::start` method will scan on both the 1M PHY and the coded PHY standards automatically.
|
||||||
|
|
|
@ -1,142 +0,0 @@
|
||||||
# Arduino command line and platformio config options
|
|
||||||
|
|
||||||
`CONFIG_BT_NIMBLE_MAX_CONNECTIONS`
|
|
||||||
|
|
||||||
Sets the number of simultaneous connections (esp controller max is 9)
|
|
||||||
- Default value is 3
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
`CONFIG_NIMBLE_CPP_ATT_VALUE_TIMESTAMP_ENABLED`
|
|
||||||
|
|
||||||
Enable/disable storing the timestamp when an attribute value is updated
|
|
||||||
This allows for checking the last update time using getTimeStamp() or getValue(time_t*)
|
|
||||||
If disabled, the timestamp returned from these functions will be 0.
|
|
||||||
Disabling timestamps will reduce the memory used for each value.
|
|
||||||
1 = Enabled, 0 = Disabled; Default = Disabled
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
`CONFIG_NIMBLE_CPP_ATT_VALUE_INIT_LENGTH`
|
|
||||||
|
|
||||||
Set the default allocation size (bytes) for each attribute.
|
|
||||||
If not specified when the constructor is called. This is also the size used when a remote
|
|
||||||
characteristic or descriptor is constructed before a value is read/notifed.
|
|
||||||
Increasing this will reduce reallocations but increase memory footprint.
|
|
||||||
Default value is 20. Range: 1 : 512 (BLE_ATT_ATTR_MAX_LEN)
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
`CONFIG_BT_NIMBLE_ATT_PREFERRED_MTU`
|
|
||||||
|
|
||||||
Sets the default MTU size.
|
|
||||||
- Default value is 255
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
`CONFIG_BT_NIMBLE_SVC_GAP_DEVICE_NAME`
|
|
||||||
|
|
||||||
Set the default device name
|
|
||||||
- Default value is "nimble"
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
`CONFIG_BT_NIMBLE_DEBUG`
|
|
||||||
|
|
||||||
If defined, enables debug log messages from the NimBLE host
|
|
||||||
- Uses approx. 32kB of flash memory.
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
`CONFIG_NIMBLE_CPP_LOG_LEVEL`
|
|
||||||
|
|
||||||
Define to set the debug log message level from the NimBLE CPP Wrapper.
|
|
||||||
If not defined it will use the same value as the Arduino core debug level.
|
|
||||||
Values: 0 = NONE, 1 = ERROR, 2 = WARNING, 3 = INFO, 4+ = DEBUG
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
`CONFIG_NIMBLE_CPP_ENABLE_RETURN_CODE_TEXT`
|
|
||||||
|
|
||||||
If defined, NimBLE host return codes will be printed as text in debug log messages.
|
|
||||||
- Uses approx. 7kB of flash memory.
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
`CONFIG_NIMBLE_CPP_ENABLE_GAP_EVENT_CODE_TEXT`
|
|
||||||
|
|
||||||
If defined, GAP event codes will be printed as text in debug log messages.
|
|
||||||
- Uses approx. 1kB of flash memory.
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
`CONFIG_NIMBLE_CPP_ENABLE_ADVERTISMENT_TYPE_TEXT`
|
|
||||||
|
|
||||||
If defined, advertisment types will be printed as text while scanning in debug log messages.
|
|
||||||
- Uses approx. 250 bytes of flash memory.
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
`CONFIG_BT_NIMBLE_SVC_GAP_APPEARANCE`
|
|
||||||
|
|
||||||
Set the default appearance.
|
|
||||||
- Default value is 0x00
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
`CONFIG_BT_NIMBLE_ROLE_CENTRAL_DISABLED`
|
|
||||||
|
|
||||||
If defined, NimBLE Client functions will not be included.
|
|
||||||
- Reduces flash size by approx. 7kB.
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
`CONFIG_BT_NIMBLE_ROLE_OBSERVER_DISABLED`
|
|
||||||
|
|
||||||
If defined, NimBLE Scan functions will not be included.
|
|
||||||
- Reduces flash size by approx. 26kB.
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
`CONFIG_BT_NIMBLE_ROLE_PERIPHERAL_DISABLED`
|
|
||||||
|
|
||||||
If defined NimBLE Server functions will not be included.
|
|
||||||
- Reduces flash size by approx. 16kB.
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
`CONFIG_BT_NIMBLE_ROLE_BROADCASTER_DISABLED`
|
|
||||||
|
|
||||||
If defined, NimBLE Advertising functions will not be included.
|
|
||||||
- Reduces flash size by approx. 5kB.
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
`CONFIG_BT_NIMBLE_MAX_BONDS`
|
|
||||||
|
|
||||||
Sets the number of devices allowed to store/bond with
|
|
||||||
- Default value is 3
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
`CONFIG_BT_NIMBLE_MAX_CCCDS`
|
|
||||||
|
|
||||||
Sets the maximum number of CCCD subscriptions to store
|
|
||||||
- Default value is 8
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
`CONFIG_BT_NIMBLE_RPA_TIMEOUT`
|
|
||||||
|
|
||||||
Sets the random address refresh time in seconds.
|
|
||||||
- Default value is 900
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
`CONFIG_BT_NIMBLE_MSYS1_BLOCK_COUNT`
|
|
||||||
|
|
||||||
Set the number of msys blocks For prepare write & prepare responses. This may need to be increased if
|
|
||||||
you are sending large blocks of data with a low MTU. E.g: 512 bytes with 23 MTU will fail.
|
|
||||||
- Default value is 12
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
`CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_EXTERNAL`
|
|
||||||
|
|
||||||
Sets the NimBLE stack to use external PSRAM will be loaded
|
|
||||||
- Must be defined with a value of 1; Default is CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_INTERNAL 1
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
`CONFIG_BT_NIMBLE_PINNED_TO_CORE`
|
|
||||||
|
|
||||||
Sets the core the NimBLE host stack will run on
|
|
||||||
- Options: 0 or 1
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
`CONFIG_BT_NIMBLE_TASK_STACK_SIZE`
|
|
||||||
|
|
||||||
Set the task stack size for the NimBLE core.
|
|
||||||
- Default is 4096
|
|
||||||
<br/>
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
# Improvements and updates
|
# Improvements and updates
|
||||||
|
|
||||||
Many improvements have been made to this library vs the original, this is a brief overview of the most significant changes.
|
Many improvements have been made to this library vs the original, this is a brief overview of the most significant changes. Refer to the [class documentation](https://h2zero.github.io/esp-nimble-cpp/annotated.html) for further information on class specifics.
|
||||||
Refer to the [class documentation](https://h2zero.github.io/esp-nimble-cpp/annotated.html) for futher information on class specifics.
|
|
||||||
|
|
||||||
* [Server](#server)
|
* [Server](#server)
|
||||||
* [Advertising](#advertising)
|
* [Advertising](#advertising)
|
||||||
|
@ -10,23 +9,26 @@ Refer to the [class documentation](https://h2zero.github.io/esp-nimble-cpp/annot
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
<a name="server"></a>
|
<a name="server"></a>
|
||||||
# Server
|
# Server
|
||||||
|
|
||||||
`NimBLECharacteristic::setValue(const T &s)`
|
`NimBLEService::NimBLEService::createCharacteristic` takes a 3rd parameter to specify the maximum data size that can be stored by the characteristic. This allows for limiting the RAM use of the characteristic in cases where small amounts of data are expected.
|
||||||
`NimBLEDescriptor::setValue(const T &s)`
|
<br/>
|
||||||
|
|
||||||
Now use a template to accomodate standard and custom types/values.
|
`NimBLECharacteristic::setValue(const T &s)`
|
||||||
|
`NimBLEDescriptor::setValue(const T &s)`
|
||||||
|
|
||||||
|
Now use the `NimbleAttValue` class and templates to accommodate standard and custom types/values.
|
||||||
|
|
||||||
**Example**
|
**Example**
|
||||||
```
|
```
|
||||||
struct my_struct{
|
struct my_struct {
|
||||||
uint8_t one;
|
uint8_t one;
|
||||||
uint16_t two;
|
uint16_t two;
|
||||||
uint32_t four;
|
uint32_t four;
|
||||||
uint64_t eight;
|
uint64_t eight;
|
||||||
float flt;
|
float flt;
|
||||||
}myStruct;
|
} myStruct;
|
||||||
|
|
||||||
myStruct.one = 1;
|
myStruct.one = 1;
|
||||||
myStruct.two = 2;
|
myStruct.two = 2;
|
||||||
myStruct.four = 4;
|
myStruct.four = 4;
|
||||||
|
@ -34,12 +36,14 @@ struct my_struct{
|
||||||
myStruct.flt = 1234.56;
|
myStruct.flt = 1234.56;
|
||||||
|
|
||||||
pCharacteristic->setValue(myStruct);
|
pCharacteristic->setValue(myStruct);
|
||||||
```
|
|
||||||
This will send the struct to the recieving client when read or a notification sent.
|
|
||||||
|
|
||||||
`NimBLECharacteristic::getValue` now takes an optional timestamp parameter which will update it's value with
|
// Arduino String support
|
||||||
the time the last value was recieved. In addition an overloaded template has been added to retrieve the value
|
String myString = "Hello";
|
||||||
as a type specified by the user.
|
pCharacteristic->setValue(myString);
|
||||||
|
```
|
||||||
|
This will send the struct to the receiving client when read or a notification sent.
|
||||||
|
|
||||||
|
`NimBLECharacteristic::getValue` now takes an optional timestamp parameter which will update it's value with the time the last value was received. In addition an overloaded template has been added to retrieve the value as a type specified by the user.
|
||||||
|
|
||||||
**Example**
|
**Example**
|
||||||
```
|
```
|
||||||
|
@ -48,38 +52,34 @@ as a type specified by the user.
|
||||||
```
|
```
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
**Advertising will automatically start when a client disconnects.**
|
**Advertising will automatically start when a client disconnects.**
|
||||||
|
|
||||||
A new method `NimBLEServer::advertiseOnDisconnect(bool)` has been implemented to control this, true(default) = enabled.
|
A new method `NimBLEServer::advertiseOnDisconnect(bool)` has been implemented to control this, true(default) = enabled.
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
`NimBLEServer::removeService` takes an additional parameter `bool deleteSvc` that if true will delete the service
|
`NimBLEServer::removeService` takes an additional parameter `bool deleteSvc` that if true will delete the service and all characteristics / descriptors belonging to it and invalidating any pointers to them.
|
||||||
and all characteristics / descriptors belonging to it and invalidating any pointers to them.
|
|
||||||
|
|
||||||
If false the service is only removed from visibility by clients. The pointers to the service and
|
If false the service is only removed from visibility by clients. The pointers to the service and it's characteristics / descriptors will remain valid and the service can be re-added in the future using `NimBLEServer::addService`.
|
||||||
it's characteristics / descriptors will remain valid and the service can be re-added in the future
|
|
||||||
using `NimBLEServer::addService`.
|
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
<a name="advertising"></a>
|
<a name="advertising"></a>
|
||||||
# Advertising
|
# Advertising
|
||||||
`NimBLEAdvertising::start`
|
`NimBLEAdvertising::start`
|
||||||
|
|
||||||
Now takes 2 optional parameters, the first is the duration to advertise for (in seconds), the second is a callback
|
Now takes 2 optional parameters, the first is the duration to advertise for (in seconds), the second is a callback that is invoked when advertising ends and takes a pointer to a `NimBLEAdvertising` object (similar to the `NimBLEScan::start` API).
|
||||||
that is invoked when advertsing ends and takes a pointer to a `NimBLEAdvertising` object (similar to the `NimBLEScan::start` API).
|
|
||||||
|
|
||||||
This provides an opportunity to update the advertisment data if desired.
|
This provides an opportunity to update the advertisement data if desired.
|
||||||
|
|
||||||
Also now returns a bool value to indicate if advertising successfully started or not.
|
Also now returns a bool value to indicate if advertising successfully started or not.
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
<a name="client"></a>
|
<a name="client"></a>
|
||||||
# Client
|
# Client
|
||||||
|
|
||||||
`NimBLERemoteCharacteristic::readValue(time_t\*, bool)`
|
`NimBLERemoteCharacteristic::readValue(time_t\*, bool)`
|
||||||
`NimBLERemoteDescriptor::readValue(bool)`
|
`NimBLERemoteDescriptor::readValue(bool)`
|
||||||
|
|
||||||
Have been added as templates to allow reading the values as any specified type.
|
Have been added as templates to allow reading the values as any specified type.
|
||||||
|
|
||||||
**Example**
|
**Example**
|
||||||
```
|
```
|
||||||
|
@ -93,56 +93,56 @@ struct my_struct{
|
||||||
|
|
||||||
time_t timestamp;
|
time_t timestamp;
|
||||||
myStruct = pRemoteCharacteristic->readValue<myStruct>(×tamp); // timestamp optional
|
myStruct = pRemoteCharacteristic->readValue<myStruct>(×tamp); // timestamp optional
|
||||||
```
|
```
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
`NimBLERemoteCharacteristic::registerForNotify`
|
`NimBLERemoteCharacteristic::registerForNotify`
|
||||||
Has been **deprecated** as now the internally stored characteristic value is updated when notification/indication is recieved.
|
Has been **deprecated** as now the internally stored characteristic value is updated when notification/indication is received.
|
||||||
|
|
||||||
`NimBLERemoteCharacteristic::subscribe` and `NimBLERemoteCharacteristic::unsubscribe` have been implemented to replace it.
|
`NimBLERemoteCharacteristic::subscribe` and `NimBLERemoteCharacteristic::unsubscribe` have been implemented to replace it.
|
||||||
A callback is no longer requred to get the most recent value unless timing is important. Instead, the application can call `NimBLERemoteCharacteristic::getValue` to
|
A callback is no longer required to get the most recent value unless timing is important. Instead, the application can call `NimBLERemoteCharacteristic::getValue` to get the last updated value any time.
|
||||||
get the last updated value any time.
|
<br/>
|
||||||
<br/>
|
|
||||||
|
|
||||||
The `notifiy_callback` function is now defined as a `std::function` to take advantage of using `std::bind` to specifiy a class member function for the callback.
|
The `notify_callback` function is now defined as a `std::function` to take advantage of using `std::bind` to specify a class member function for the callback.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
```
|
```
|
||||||
using namespace std::placeholders;
|
using namespace std::placeholders;
|
||||||
notify_callback callback = std::bind(&<ClassName>::<memberFunctionCallbackName>, this, _1, _2, _3, _4);
|
notify_callback callback = std::bind(&<ClassName>::<memberFunctionCallbackName>, this, _1, _2, _3, _4);
|
||||||
|
|
||||||
<remoteCharacteristicInstance>->subscribe(true, callback);
|
<remoteCharacteristicInstance>->subscribe(true, callback);
|
||||||
```
|
```
|
||||||
|
|
||||||
`NimBLERemoteCharacteristic::readValue` and `NimBLERemoteCharacteristic::getValue` take an optional timestamp parameter which will update it's value with
|
`NimBLERemoteCharacteristic::readValue` and `NimBLERemoteCharacteristic::getValue` take an optional timestamp parameter which will update it's value with
|
||||||
the time the last value was recieved.
|
the time the last value was received.
|
||||||
|
|
||||||
> NimBLEClient::getService
|
> NimBLEClient::getService
|
||||||
> NimBLERemoteService::getCharacteristic
|
> NimBLERemoteService::getCharacteristic
|
||||||
> NimBLERemoteCharacteristic::getDescriptor
|
> NimBLERemoteCharacteristic::getDescriptor
|
||||||
|
|
||||||
These methods will now check the respective vectors for the attribute object and, if not found, will retrieve (only)
|
These methods will now check the respective vectors for the attribute object and, if not found, will retrieve (only)
|
||||||
the specified attribute from the peripheral.
|
the specified attribute from the peripheral.
|
||||||
|
|
||||||
These changes allow more control for the user to manage the resources used for the attributes.
|
These changes allow more control for the user to manage the resources used for the attributes.
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
`NimBLEClient::connect()` can now be called without an address or advertised device parameter. This will connect to the
|
`NimBLEClient::connect()` can now be called without an address or advertised device parameter. This will connect to the device with the address previously set when last connected or set with `NimBLEDevice::setPeerAddress()`.
|
||||||
device with the address previously set when last connected or set with `NimBLEDevice::setPeerAddress()`.
|
|
||||||
|
|
||||||
<a name="general"></a>
|
<a name="general"></a>
|
||||||
# General
|
# General
|
||||||
To reduce resource use all instances of `std::map` have been replaced with `std::vector`.
|
To reduce resource use all instances of `std::map` have been replaced with `std::vector`.
|
||||||
|
|
||||||
Use of `FreeRTOS::Semaphore` has been removed as it was consuming too much ram, the related files have been left in place to accomodate application use.
|
Use of `FreeRTOS::Semaphore` has been removed as it was consuming too much ram, the related files have been left in place to accomodate application use.
|
||||||
|
|
||||||
Operators `==`, `!=` and `std::string` have been added to `NimBLEAddress` and `NimBLEUUID` for easier comparison and logging.
|
Operators `==`, `!=` and `std::string` have been added to `NimBLEAddress` and `NimBLEUUID` for easier comparison and logging.
|
||||||
|
|
||||||
New constructor for `NimBLEUUID(uint32_t, uint16_t, uint16_t, uint64_t)` added to lower memory use vs string construction. See: [#21](https://github.com/h2zero/NimBLE-Arduino/pull/21).
|
New constructor for `NimBLEUUID(uint32_t, uint16_t, uint16_t, uint64_t)` added to lower memory use vs string construction. See: [#21](https://github.com/h2zero/NimBLE-Arduino/pull/21).
|
||||||
|
|
||||||
Security/pairing operations are now handled in the respective `NimBLEClientCallbacks` and `NimBLEServerCallbacks` classes, `NimBLESecurity`(deprecated) remains for backward compatibility.
|
Security/pairing operations are now handled in the respective `NimBLEClientCallbacks` and `NimBLEServerCallbacks` classes, `NimBLESecurity`(deprecated) remains for backward compatibility.
|
||||||
|
|
||||||
Configuration options have been added to add or remove debugging information, when disabled (default) significatly reduces binary size.
|
Configuration options have been added to add or remove debugging information, when disabled (default) significantly reduces binary size.
|
||||||
In ESP-IDF the options are in menuconfig: `Main menu -> ESP-NimBLE-cpp configuration`.
|
In ESP-IDF the options are in menuconfig: `Main menu -> ESP-NimBLE-cpp configuration`.
|
||||||
For Arduino the options must be commented / uncommented in nimconfig.h.
|
For Arduino the options must be commented / uncommented in nimconfig.h.
|
||||||
<br/>
|
|
||||||
|
Characteristics and descriptors now use the `NimBLEAttValue` class to store their data. This is a polymorphic container class capable of converting to/from many different types efficiently. See: [#286](https://github.com/h2zero/NimBLE-Arduino/pull/286)
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
# Migrating from Bluedroid to NimBLE
|
# Migrating from Bluedroid to NimBLE
|
||||||
|
|
||||||
This guide describes the required changes to existing projects migrating from the original bluedroid API to NimBLE.
|
This guide describes the required changes to existing projects migrating from the original bluedroid API to NimBLE.
|
||||||
|
|
||||||
**The changes listed here are only the required changes that must be made**, and a short overview of options for migrating existing applications.
|
**The changes listed here are only the required changes that must be made**, and a short overview of options for migrating existing applications.
|
||||||
|
|
||||||
For more information on the improvements and additions please refer to the [class documentation](https://h2zero.github.io/esp-nimble-cpp/annotated.html) and [Improvements and updates](Improvements_and_updates.md)
|
For more information on the improvements and additions please refer to the [class documentation](https://h2zero.github.io/esp-nimble-cpp/annotated.html) and [Improvements and updates](Improvements_and_updates.md)
|
||||||
|
|
||||||
|
@ -18,45 +18,40 @@ For more information on the improvements and additions please refer to the [clas
|
||||||
* [Remote characteristics](#remote-characteristics)
|
* [Remote characteristics](#remote-characteristics)
|
||||||
* [Security](#client-security)
|
* [Security](#client-security)
|
||||||
* [General Security](#security-api)
|
* [General Security](#security-api)
|
||||||
* [Configuration](#arduino-configuration)
|
* [Configuration](#arduino-configuration)
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
<a name="general-information"></a>
|
<a name="general-information"></a>
|
||||||
## General Information
|
## General Information
|
||||||
|
|
||||||
### Header Files
|
### Header Files
|
||||||
All classes are accessible by including `NimBLEDevice.h` in your application, no further headers need to be included.
|
All classes are accessible by including `NimBLEDevice.h` in your application, no further headers need to be included.
|
||||||
|
|
||||||
(Mainly for Arduino) You may choose to include `NimBLELog.h` in your appplication if you want to use the `NIMBLE_LOGx` macros for debugging.
|
(Mainly for Arduino) You may choose to include `NimBLELog.h` in your appplication if you want to use the `NIMBLE_LOGx` macros for debugging. These macros are used the same way as the `ESP_LOGx` macros.
|
||||||
These macros are used the same way as the `ESP_LOGx` macros.
|
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
### Class Names
|
### Class Names
|
||||||
Class names remain the same as the original with the addition of a "Nim" prefix.
|
Class names remain the same as the original with the addition of a "Nim" prefix.
|
||||||
For example `BLEDevice` is now `NimBLEDevice` and `BLEServer` is now `NimBLEServer` etc.
|
For example `BLEDevice` is now `NimBLEDevice` and `BLEServer` is now `NimBLEServer` etc.
|
||||||
|
|
||||||
For convienience definitions have been added to allow applications to use either name for all classes
|
For convienience definitions have been added to allow applications to use either name for all classes this means **no class names need to be changed in existing code** and makes migrating easier.
|
||||||
this means **no class names need to be changed in existing code** and makes migrating easier.
|
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
### BLE Addresses
|
### BLE Addresses
|
||||||
`BLEAddress` (`NimBLEAddress`) When constructing an address the constructor now takes an *(optional)* `uint8_t type` paramameter
|
`BLEAddress` (`NimBLEAddress`) When constructing an address the constructor now takes an *(optional)* `uint8_t type` paramameter to specify the address type. Default is (0) Public static address.
|
||||||
to specify the address type. Default is (0) Public static address.
|
|
||||||
|
|
||||||
For example `BLEAddress addr(11:22:33:44:55:66, 1)` will create the address object with an address type of: 1 (Random).
|
For example `BLEAddress addr(11:22:33:44:55:66, 1)` will create the address object with an address type of: 1 (Random).
|
||||||
|
|
||||||
As this paramameter is optional no changes to existing code are needed, it is mentioned here for information.
|
As this paramameter is optional no changes to existing code are needed, it is mentioned here for information.
|
||||||
<br/>
|
|
||||||
`BLEAddress::getNative` (`NimBLEAddress::getNative`) returns a uint8_t pointer to the native address byte array.
|
`BLEAddress::getNative` (`NimBLEAddress::getNative`) returns a uint8_t pointer to the native address byte array. In this library the address bytes are stored in reverse order from the original library. This is due to the way the NimBLE stack expects addresses to be presented to it. All other functions such as `toString` are
|
||||||
In this library the address bytes are stored in reverse order from the original library. This is due to the way
|
|
||||||
the NimBLE stack expects addresses to be presented to it. All other functions such as `toString` are
|
|
||||||
not affected as the endian change is made within them.
|
not affected as the endian change is made within them.
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
<a name="server-api"></a>
|
<a name="server-api"></a>
|
||||||
## Server API
|
## Server API
|
||||||
Creating a `BLEServer` instance is the same as original, no changes required.
|
Creating a `BLEServer` instance is the same as original, no changes required.
|
||||||
For example `BLEDevice::createServer()` will work just as it did before.
|
For example `BLEDevice::createServer()` will work just as it did before.
|
||||||
|
|
||||||
`BLEServerCallbacks` (`NimBLEServerCallbacks`) has new methods for handling security operations.
|
`BLEServerCallbacks` (`NimBLEServerCallbacks`) has new methods for handling security operations.
|
||||||
**Note:** All callback methods have default implementations which allows the application to implement only the methods applicable.
|
**Note:** All callback methods have default implementations which allows the application to implement only the methods applicable.
|
||||||
|
@ -64,12 +59,12 @@ For example `BLEDevice::createServer()` will work just as it did before.
|
||||||
|
|
||||||
<a name="services"></a>
|
<a name="services"></a>
|
||||||
### Services
|
### Services
|
||||||
Creating a `BLEService` (`NimBLEService`) instance is the same as original, no changes required.
|
Creating a `BLEService` (`NimBLEService`) instance is the same as original, no changes required.
|
||||||
For example `BLEServer::createService(SERVICE_UUID)` will work just as it did before.
|
For example `BLEServer::createService(SERVICE_UUID)` will work just as it did before.
|
||||||
|
|
||||||
<a name="characteristics"></a>
|
<a name="characteristics"></a>
|
||||||
### Characteristics
|
### Characteristics
|
||||||
`BLEService::createCharacteristic` (`NimBLEService::createCharacteristic`) is used the same way as originally except the properties parameter has changed.
|
`BLEService::createCharacteristic` (`NimBLEService::createCharacteristic`) is used the same way as originally except the properties parameter has changed.
|
||||||
|
|
||||||
When creating a characteristic the properties are now set with `NIMBLE_PROPERTY::XXXX` instead of `BLECharacteristic::XXXX`.
|
When creating a characteristic the properties are now set with `NIMBLE_PROPERTY::XXXX` instead of `BLECharacteristic::XXXX`.
|
||||||
|
|
||||||
|
@ -79,7 +74,7 @@ When creating a characteristic the properties are now set with `NIMBLE_PROPERTY:
|
||||||
|
|
||||||
#### Is Now
|
#### Is Now
|
||||||
> NIMBLE_PROPERTY::READ |
|
> NIMBLE_PROPERTY::READ |
|
||||||
> NIMBLE_PROPERTY::WRITE
|
> NIMBLE_PROPERTY::WRITE
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
#### The full list of properties
|
#### The full list of properties
|
||||||
|
@ -93,8 +88,9 @@ When creating a characteristic the properties are now set with `NIMBLE_PROPERTY:
|
||||||
> NIMBLE_PROPERTY::WRITE_AUTHEN
|
> NIMBLE_PROPERTY::WRITE_AUTHEN
|
||||||
> NIMBLE_PROPERTY::WRITE_AUTHOR
|
> NIMBLE_PROPERTY::WRITE_AUTHOR
|
||||||
> NIMBLE_PROPERTY::BROADCAST
|
> NIMBLE_PROPERTY::BROADCAST
|
||||||
> NIMBLE_PROPERTY::NOTIFY
|
> NIMBLE_PROPERTY::NOTIFY
|
||||||
> NIMBLE_PROPERTY::INDICATE
|
> NIMBLE_PROPERTY::INDICATE
|
||||||
|
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
|
@ -102,7 +98,7 @@ When creating a characteristic the properties are now set with `NIMBLE_PROPERTY:
|
||||||
BLECharacteristic *pCharacteristic = pService->createCharacteristic(
|
BLECharacteristic *pCharacteristic = pService->createCharacteristic(
|
||||||
CHARACTERISTIC_UUID,
|
CHARACTERISTIC_UUID,
|
||||||
BLECharacteristic::PROPERTY_READ |
|
BLECharacteristic::PROPERTY_READ |
|
||||||
BLECharacteristic::PROPERTY_WRITE
|
BLECharacteristic::PROPERTY_WRITE
|
||||||
);
|
);
|
||||||
|
|
||||||
```
|
```
|
||||||
|
@ -111,23 +107,22 @@ Needs to be changed to:
|
||||||
BLECharacteristic *pCharacteristic = pService->createCharacteristic(
|
BLECharacteristic *pCharacteristic = pService->createCharacteristic(
|
||||||
CHARACTERISTIC_UUID,
|
CHARACTERISTIC_UUID,
|
||||||
NIMBLE_PROPERTY::READ |
|
NIMBLE_PROPERTY::READ |
|
||||||
NIMBLE_PROPERTY::WRITE
|
NIMBLE_PROPERTY::WRITE
|
||||||
);
|
);
|
||||||
```
|
```
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
`BLECharacteristicCallbacks` (`NimBLECharacteristicCallbacks`) has a new method `NimBLECharacteristicCallbacks::onSubscribe`
|
`BLECharacteristicCallbacks` (`NimBLECharacteristicCallbacks`) has a new method `NimBLECharacteristicCallbacks::onSubscribe` which is called when a client subscribes to notifications/indications.
|
||||||
which is called when a client subscribes to notifications/indications.
|
|
||||||
|
|
||||||
**Note:** All callback methods have default implementations which allows the application to implement only the methods applicable.
|
**Note:** All callback methods have default implementations which allows the application to implement only the methods applicable.
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
> BLECharacteristic::getData
|
> BLECharacteristic::getData
|
||||||
|
|
||||||
**Has been removed from the API.**
|
**Has been removed from the API.**
|
||||||
Originally this returned a `uint8_t*` to the internal data, which is volatile.
|
Originally this returned a `uint8_t*` to the internal data, which is volatile.
|
||||||
To prevent possibly throwing exceptions this has been removed and `NimBLECharacteristic::getValue` should be used
|
To prevent possibly throwing exceptions this has been removed and `NimBLECharacteristic::getValue` should be used
|
||||||
to get a copy of the data first which can then safely be accessed via pointer.
|
to get a copy of the data first which can then safely be accessed via pointer.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
```
|
```
|
||||||
|
@ -142,38 +137,37 @@ my_struct_t myStruct = pChr->getValue<my_struct_t>();
|
||||||
|
|
||||||
<a name="descriptors"></a>
|
<a name="descriptors"></a>
|
||||||
### Descriptors
|
### Descriptors
|
||||||
The previous method `BLECharacteristic::addDescriptor()` has been removed.
|
|
||||||
|
|
||||||
Descriptors are now created using the `NimBLECharacteristic::createDescriptor` method.
|
Descriptors are now created using the `NimBLECharacteristic::createDescriptor` method.
|
||||||
|
|
||||||
BLE2902 or NimBLE2902 class has been removed.
|
|
||||||
NimBLE automatically creates the 0x2902 descriptor if a characteristic has a notification or indication property assigned to it.
|
|
||||||
|
|
||||||
It was no longer useful to have a class for the 0x2902 descriptor as a new callback `NimBLECharacteristicCallbacks::onSubscribe` was added
|
BLE2902 or NimBLE2902 class has been removed.
|
||||||
to handle callback functionality and the client subscription status is handled internally.
|
NimBLE automatically creates the 0x2902 descriptor if a characteristic has a notification or indication property assigned to it.
|
||||||
|
|
||||||
**Note:** Attempting to create a 0x2902 descriptor will trigger an assert to notify the error,
|
It was no longer useful to have a class for the 0x2902 descriptor as a new callback `NimBLECharacteristicCallbacks::onSubscribe` was added
|
||||||
|
to handle callback functionality and the client subscription status is handled internally.
|
||||||
|
|
||||||
|
**Note:** Attempting to create a 0x2902 descriptor will trigger an assert to notify the error,
|
||||||
allowing the creation of it would cause a fault in the NimBLE stack.
|
allowing the creation of it would cause a fault in the NimBLE stack.
|
||||||
|
|
||||||
All other descriptors are now created just as characteristics are by using the `NimBLECharacteristic::createDescriptor` method (except 0x2904, see below).
|
All other descriptors are now created just as characteristics are by using the `NimBLECharacteristic::createDescriptor` method (except 0x2904, see below).
|
||||||
Which are defined as:
|
Which are defined as:
|
||||||
```
|
```
|
||||||
NimBLEDescriptor* createDescriptor(const char* uuid,
|
NimBLEDescriptor* createDescriptor(const char* uuid,
|
||||||
uint32_t properties =
|
uint32_t properties =
|
||||||
NIMBLE_PROPERTY::READ |
|
NIMBLE_PROPERTY::READ |
|
||||||
NIMBLE_PROPERTY::WRITE,
|
NIMBLE_PROPERTY::WRITE,
|
||||||
uint16_t max_len = 100);
|
uint16_t max_len = 100);
|
||||||
|
|
||||||
NimBLEDescriptor* createDescriptor(NimBLEUUID uuid,
|
NimBLEDescriptor* createDescriptor(NimBLEUUID uuid,
|
||||||
uint32_t properties =
|
uint32_t properties =
|
||||||
NIMBLE_PROPERTY::READ |
|
NIMBLE_PROPERTY::READ |
|
||||||
NIMBLE_PROPERTY::WRITE,
|
NIMBLE_PROPERTY::WRITE,
|
||||||
uint16_t max_len = 100);
|
uint16_t max_len = 100);
|
||||||
```
|
```
|
||||||
##### Example
|
##### Example
|
||||||
```
|
```
|
||||||
pDescriptor = pCharacteristic->createDescriptor("ABCD",
|
pDescriptor = pCharacteristic->createDescriptor("ABCD",
|
||||||
NIMBLE_PROPERTY::READ |
|
NIMBLE_PROPERTY::READ |
|
||||||
NIMBLE_PROPERTY::WRITE |
|
NIMBLE_PROPERTY::WRITE |
|
||||||
NIMBLE_PROPERTY::WRITE_ENC,
|
NIMBLE_PROPERTY::WRITE_ENC,
|
||||||
25);
|
25);
|
||||||
|
@ -183,7 +177,7 @@ Would create a descriptor with the UUID 0xABCD, publicly readable but only writa
|
||||||
|
|
||||||
For the 0x2904, there is a special class that is created when you call `createDescriptor("2904").
|
For the 0x2904, there is a special class that is created when you call `createDescriptor("2904").
|
||||||
|
|
||||||
The pointer returned is of the base class `NimBLEDescriptor` but the call will create the derived class of `NimBLE2904` so you must cast the returned pointer to
|
The pointer returned is of the base class `NimBLEDescriptor` but the call will create the derived class of `NimBLE2904` so you must cast the returned pointer to
|
||||||
`NimBLE2904` to access the specific class methods.
|
`NimBLE2904` to access the specific class methods.
|
||||||
|
|
||||||
##### Example
|
##### Example
|
||||||
|
@ -200,104 +194,92 @@ Security is set on the characteristic or descriptor properties by applying one o
|
||||||
> NIMBLE_PROPERTY::READ_AUTHOR
|
> NIMBLE_PROPERTY::READ_AUTHOR
|
||||||
> NIMBLE_PROPERTY::WRITE_ENC
|
> NIMBLE_PROPERTY::WRITE_ENC
|
||||||
> NIMBLE_PROPERTY::WRITE_AUTHEN
|
> NIMBLE_PROPERTY::WRITE_AUTHEN
|
||||||
> NIMBLE_PROPERTY::WRITE_AUTHOR
|
> NIMBLE_PROPERTY::WRITE_AUTHOR
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
When a peer wants to read or write a characteristic or descriptor with any of these properties applied it will trigger the pairing process. By default the "just-works" pairing will be performed automatically.
|
||||||
|
|
||||||
When a peer wants to read or write a characteristic or descriptor with any of these properties applied
|
|
||||||
it will trigger the pairing process. By default the "just-works" pairing will be performed automatically.
|
|
||||||
This can be changed to use passkey authentication or numeric comparison. See [Security API](#security-api) for details.
|
This can be changed to use passkey authentication or numeric comparison. See [Security API](#security-api) for details.
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
<a name="advertising-api"></a>
|
<a name="advertising-api"></a>
|
||||||
## Advertising API
|
## Advertising API
|
||||||
Advertising works the same as the original API except:
|
Advertising works the same as the original API except:
|
||||||
> BLEAdvertising::setMinPreferred
|
|
||||||
> BLEAdvertising::setMaxPreferred
|
|
||||||
|
|
||||||
These methods were found to not provide useful functionality and consumed valuable advertising space (6 bytes of 31) if used unknowingly.
|
Calling `NimBLEAdvertising::setAdvertisementData` will entirely replace any data set with `NimBLEAdvertising::addServiceUUID`, or
|
||||||
If you wish to advertise these parameters you can still do so manually via `BLEAdvertisementData::addData` (`NimBLEAdvertisementData::addData`).
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
Calling `NimBLEAdvertising::setAdvertisementData` will entirely replace any data set with `NimBLEAdvertising::addServiceUUID`, or
|
|
||||||
`NimBLEAdvertising::setAppearance` or similar methods. You should set all the data you wish to advertise within the `NimBLEAdvertisementData` instead.
|
`NimBLEAdvertising::setAppearance` or similar methods. You should set all the data you wish to advertise within the `NimBLEAdvertisementData` instead.
|
||||||
|
|
||||||
~~Calling `NimBLEAdvertising::setScanResponseData` without also calling `NimBLEAdvertising::setAdvertisementData` will have no effect.
|
|
||||||
When using custom scan response data you must also use custom advertisement data.~~
|
|
||||||
No longer true as of release 1.2.0 and above, custom scan response is now supported without custom advertisement data.
|
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
> BLEAdvertising::start (NimBLEAdvertising::start)
|
> BLEAdvertising::start (NimBLEAdvertising::start)
|
||||||
|
|
||||||
Now takes 2 optional parameters, the first is the duration to advertise for (in seconds), the second is a callback
|
Now takes 2 optional parameters, the first is the duration to advertise for (in seconds), the second is a callback that is invoked when advertsing ends and takes a pointer to a `NimBLEAdvertising` object (similar to the `NimBLEScan::start` API).
|
||||||
that is invoked when advertsing ends and takes a pointer to a `NimBLEAdvertising` object (similar to the `NimBLEScan::start` API).
|
|
||||||
|
|
||||||
This provides an opportunity to update the advertisment data if desired.
|
This provides an opportunity to update the advertisment data if desired.
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
<a name="client-api"></a>
|
<a name="client-api"></a>
|
||||||
## Client API
|
## Client API
|
||||||
|
|
||||||
Client instances are created just as before with `BLEDevice::createClient` (`NimBLEDevice::createClient`).
|
Client instances are created just as before with `BLEDevice::createClient` (`NimBLEDevice::createClient`).
|
||||||
|
|
||||||
Multiple client instances can be created, up to the maximum number of connections set in the config file (default: 3).
|
Multiple client instances can be created, up to the maximum number of connections set in the config file (default: 3). To delete a client instance you must use `NimBLEDevice::deleteClient`.
|
||||||
To delete a client instance you must use `NimBLEDevice::deleteClient`.
|
|
||||||
|
|
||||||
`BLEClient::connect`(`NimBLEClient::connect`) Has had it's parameters altered.
|
`BLEClient::connect`(`NimBLEClient::connect`) Has had it's parameters altered.
|
||||||
Defined as:
|
Defined as:
|
||||||
> NimBLEClient::connect(bool deleteServices = true);
|
> NimBLEClient::connect(bool deleteServices = true);
|
||||||
> NimBLEClient::connect(NimBLEAdvertisedDevice\* device, bool deleteServices = true);
|
> NimBLEClient::connect(NimBLEAdvertisedDevice\* device, bool deleteServices = true);
|
||||||
> NimBLEClient::connect(NimBLEAddress address, bool deleteServices = true);
|
> NimBLEClient::connect(NimBLEAddress address, bool deleteServices = true);
|
||||||
|
|
||||||
|
The type parameter has been removed and a new bool parameter has been added to indicate if the client should delete the attribute database previously retrieved (if applicable) for the peripheral, default value is true.
|
||||||
|
|
||||||
|
If set to false the client will use the attribute database it retrieved from the peripheral when previously connected.
|
||||||
|
|
||||||
The type parameter has been removed and a new bool parameter has been added to indicate if the client should
|
|
||||||
delete the attribute database previously retrieved (if applicable) for the peripheral, default value is true.
|
|
||||||
If set to false the client will use the attribute database it retrieved from the peripheral when previously connected.
|
|
||||||
This allows for faster connections and power saving if the devices dropped connection and are reconnecting.
|
This allows for faster connections and power saving if the devices dropped connection and are reconnecting.
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
> `BLEClient::getServices` (`NimBLEClient::getServices`)
|
> `BLEClient::getServices` (`NimBLEClient::getServices`)
|
||||||
|
|
||||||
This method now takes an optional (bool) parameter to indicate if the services should be retrieved from the server (true) or
|
This method now takes an optional (bool) parameter to indicate if the services should be retrieved from the server (true) or the currently known database returned (false : default).
|
||||||
the currently known database returned (false : default).
|
|
||||||
Also now returns a pointer to `std::vector` instead of `std::map`.
|
Also now returns a pointer to `std::vector` instead of `std::map`.
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
**Removed:** the automatic discovery of all peripheral attributes as they consumed time and resources for data
|
**Removed:** the automatic discovery of all peripheral attributes as they consumed time and resources for data the user may not be interested in.
|
||||||
the user may not be interested in.
|
|
||||||
|
**Added:** `NimBLEClient::discoverAttributes` for the user to discover all the peripheral attributes to replace the the removed automatic functionality.
|
||||||
**Added:** `NimBLEClient::discoverAttributes` for the user to discover all the peripheral attributes
|
|
||||||
to replace the the removed automatic functionality.
|
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
<a name="remote-services"></a>
|
<a name="remote-services"></a>
|
||||||
### Remote Services
|
### Remote Services
|
||||||
`BLERemoteService` (`NimBLERemoteService`) Methods remain mostly unchanged with the exceptions of:
|
`BLERemoteService` (`NimBLERemoteService`) Methods remain mostly unchanged with the exceptions of:
|
||||||
|
|
||||||
> BLERemoteService::getCharacteristicsByHandle
|
> BLERemoteService::getCharacteristicsByHandle
|
||||||
|
|
||||||
This method has been removed.
|
This method has been removed.
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
> `BLERemoteService::getCharacteristics` (`NimBLERemoteService::getCharacteristics`)
|
> `BLERemoteService::getCharacteristics` (`NimBLERemoteService::getCharacteristics`)
|
||||||
|
|
||||||
This method now takes an optional (bool) parameter to indicate if the characteristics should be retrieved from the server (true) or
|
This method now takes an optional (bool) parameter to indicate if the characteristics should be retrieved from the server (true) or
|
||||||
the currently known database returned (false : default).
|
the currently known database returned (false : default).
|
||||||
Also now returns a pointer to `std::vector` instead of `std::map`.
|
Also now returns a pointer to `std::vector` instead of `std::map`.
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
<a name="remote-characteristics"></a>
|
<a name="remote-characteristics"></a>
|
||||||
### Remote Characteristics
|
### Remote Characteristics
|
||||||
`BLERemoteCharacteristic` (`NimBLERemoteCharacteristic`) There have been a few changes to the methods in this class:
|
`BLERemoteCharacteristic` (`NimBLERemoteCharacteristic`)
|
||||||
|
There have been a few changes to the methods in this class:
|
||||||
|
|
||||||
> `BLERemoteCharacteristic::writeValue` (`NimBLERemoteCharacteristic::writeValue`)
|
> `BLERemoteCharacteristic::writeValue` (`NimBLERemoteCharacteristic::writeValue`)
|
||||||
> `BLERemoteCharacteristic::registerForNotify` (`NimBLERemoteCharacteristic::registerForNotify`)
|
> `BLERemoteCharacteristic::registerForNotify` (`NimBLERemoteCharacteristic::registerForNotify`)
|
||||||
|
|
||||||
Now return true or false to indicate success or failure so you can choose to disconnect or try again.
|
Now return true or false to indicate success or failure so you can choose to disconnect or try again.
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
> `BLERemoteCharacteristic::registerForNotify` (`NimBLERemoteCharacteristic::registerForNotify`)
|
> `BLERemoteCharacteristic::registerForNotify` (`NimBLERemoteCharacteristic::registerForNotify`)
|
||||||
|
|
||||||
Is now **deprecated**.
|
Is now **deprecated**.
|
||||||
> `NimBLERemoteCharacteristic::subscribe`
|
> `NimBLERemoteCharacteristic::subscribe`
|
||||||
> `NimBLERemoteCharacteristic::unsubscribe`
|
> `NimBLERemoteCharacteristic::unsubscribe`
|
||||||
|
|
||||||
Are the new methods added to replace it.
|
Are the new methods added to replace it.
|
||||||
<br/>
|
<br/>
|
||||||
|
@ -305,17 +287,17 @@ Are the new methods added to replace it.
|
||||||
> `BLERemoteCharacteristic::readUInt8` (`NimBLERemoteCharacteristic::readUInt8`)
|
> `BLERemoteCharacteristic::readUInt8` (`NimBLERemoteCharacteristic::readUInt8`)
|
||||||
> `BLERemoteCharacteristic::readUInt16` (`NimBLERemoteCharacteristic::readUInt16`)
|
> `BLERemoteCharacteristic::readUInt16` (`NimBLERemoteCharacteristic::readUInt16`)
|
||||||
> `BLERemoteCharacteristic::readUInt32` (`NimBLERemoteCharacteristic::readUInt32`)
|
> `BLERemoteCharacteristic::readUInt32` (`NimBLERemoteCharacteristic::readUInt32`)
|
||||||
> `BLERemoteCharacteristic::readFloat` (`NimBLERemoteCharacteristic::readFloat`)
|
> `BLERemoteCharacteristic::readFloat` (`NimBLERemoteCharacteristic::readFloat`)
|
||||||
|
|
||||||
Are **deprecated** a template: NimBLERemoteCharacteristic::readValue<type\>(time_t\*, bool) has been added to replace them.
|
Are **deprecated** a template: `NimBLERemoteCharacteristic::readValue<type\>(time_t\*, bool)` has been added to replace them.
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
> `BLERemoteCharacteristic::readRawData`
|
> `BLERemoteCharacteristic::readRawData`
|
||||||
|
|
||||||
**Has been removed from the API**
|
**Has been removed from the API**
|
||||||
Originally it stored an unnecessary copy of the data and was returning a `uint8_t` pointer to volatile internal data.
|
Originally it stored an unnecessary copy of the data and was returning a `uint8_t` pointer to volatile internal data.
|
||||||
The user application should use `NimBLERemoteCharacteristic::readValue` or `NimBLERemoteCharacteristic::getValue`.
|
The user application should use `NimBLERemoteCharacteristic::readValue` or `NimBLERemoteCharacteristic::getValue`.
|
||||||
To obatain a copy of the data, then cast the returned std::string to the type required such as:
|
To obatain a copy of the data, then cast the returned std::string to the type required such as:
|
||||||
```
|
```
|
||||||
std::string value = pChr->readValue();
|
std::string value = pChr->readValue();
|
||||||
uint8_t *data = (uint8_t*)value.data();
|
uint8_t *data = (uint8_t*)value.data();
|
||||||
|
@ -325,10 +307,10 @@ Alternatively use the `readValue` template:
|
||||||
my_struct_t myStruct = pChr->readValue<my_struct_t>();
|
my_struct_t myStruct = pChr->readValue<my_struct_t>();
|
||||||
```
|
```
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
> `BLERemoteCharacteristic::getDescriptors` (`NimBLERemoteCharacteristic::getDescriptors`)
|
|
||||||
|
|
||||||
This method now takes an optional (bool) parameter to indicate if the descriptors should be retrieved from the server (true) or
|
> `BLERemoteCharacteristic::getDescriptors` (`NimBLERemoteCharacteristic::getDescriptors`)
|
||||||
|
|
||||||
|
This method now takes an optional (bool) parameter to indicate if the descriptors should be retrieved from the server (true) or
|
||||||
the currently known database returned (false : default).
|
the currently known database returned (false : default).
|
||||||
Also now returns a pointer to `std::vector` instead of `std::map`.
|
Also now returns a pointer to `std::vector` instead of `std::map`.
|
||||||
<br/>
|
<br/>
|
||||||
|
@ -343,45 +325,45 @@ The default configuration will use "just-works" pairing with no bonding, if you
|
||||||
## Security API
|
## Security API
|
||||||
Security operations have been moved to `BLEDevice` (`NimBLEDevice`).
|
Security operations have been moved to `BLEDevice` (`NimBLEDevice`).
|
||||||
|
|
||||||
Also security callback methods are now incorporated in the `NimBLEServerCallbacks` / `NimBLEClientCallbacks` classes.
|
Also security callback methods are now incorporated in the `NimBLEServerCallbacks` / `NimBLEClientCallbacks` classes.
|
||||||
However backward compatibility with the original `BLESecurity` (`NimBLESecurity`) class is retained to minimize application code changes.
|
However backward compatibility with the original `BLESecurity` (`NimBLESecurity`) class is retained to minimize application code changes.
|
||||||
|
|
||||||
The callback methods are:
|
The callback methods are:
|
||||||
|
|
||||||
> `bool onConfirmPIN(uint32_t pin)`
|
> `bool onConfirmPIN(uint32_t pin)`
|
||||||
|
|
||||||
Receives the pin when using numeric comparison authentication, `return true;` to accept.
|
Receives the pin when using numeric comparison authentication, `return true;` to accept.
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
> `uint32_t onPassKeyRequest()`
|
> `uint32_t onPassKeyRequest()`
|
||||||
|
|
||||||
For server callback; return the passkey expected from the client.
|
For server callback; return the passkey expected from the client.
|
||||||
For client callback; return the passkey to send to the server.
|
For client callback; return the passkey to send to the server.
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
> `void onAuthenticationComplete(ble_gap_conn_desc\* desc)`
|
> `void onAuthenticationComplete(ble_gap_conn_desc\* desc)`
|
||||||
|
|
||||||
Authentication complete, success or failed information is in `desc`.
|
Authentication complete, success or failed information is in `desc`.
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
Security settings and IO capabilities are now set by the following methods of NimBLEDevice.
|
Security settings and IO capabilities are now set by the following methods of NimBLEDevice.
|
||||||
> `NimBLEDevice::setSecurityAuth(bool bonding, bool mitm, bool sc)`
|
> `NimBLEDevice::setSecurityAuth(bool bonding, bool mitm, bool sc)`
|
||||||
> `NimBLEDevice::setSecurityAuth(uint8_t auth_req)`
|
> `NimBLEDevice::setSecurityAuth(uint8_t auth_req)`
|
||||||
|
|
||||||
Sets the authorization mode for this device.
|
Sets the authorization mode for this device.
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
> `NimBLEDevice::setSecurityIOCap(uint8_t iocap)`
|
> `NimBLEDevice::setSecurityIOCap(uint8_t iocap)`
|
||||||
|
|
||||||
Sets the Input/Output capabilities of this device.
|
Sets the Input/Output capabilities of this device.
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
> `NimBLEDevice::setSecurityInitKey(uint8_t init_key)`
|
> `NimBLEDevice::setSecurityInitKey(uint8_t init_key)`
|
||||||
|
|
||||||
If we are the initiator of the security procedure this sets the keys we will distribute.
|
If we are the initiator of the security procedure this sets the keys we will distribute.
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
> `NimBLEDevice::setSecurityRespKey(uint8_t resp_key)`
|
> `NimBLEDevice::setSecurityRespKey(uint8_t resp_key)`
|
||||||
|
|
||||||
Sets the keys we are willing to accept from the peer during pairing.
|
Sets the keys we are willing to accept from the peer during pairing.
|
||||||
<br/>
|
<br/>
|
||||||
|
@ -389,11 +371,9 @@ Sets the keys we are willing to accept from the peer during pairing.
|
||||||
<a name="arduino-configuration"></a>
|
<a name="arduino-configuration"></a>
|
||||||
## Arduino Configuration
|
## Arduino Configuration
|
||||||
|
|
||||||
Unlike the original library pre-packaged in the esp32-arduino, this library has all the configuration
|
Unlike the original library pre-packaged in the esp32-arduino, this library has all the configuration options that are normally set in menuconfig available in the *src/nimconfig.h* file.
|
||||||
options that are normally set in menuconfig available in the *src/nimconfig.h* file.
|
|
||||||
|
|
||||||
This allows Arduino users to fully customize the build, such as increasing max connections
|
This allows Arduino users to fully customize the build, such as increasing max connections or loading the BLE stack into external PSRAM.
|
||||||
or loading the BLE stack into external PSRAM.
|
|
||||||
|
|
||||||
For details on the options, they are fully commented in *nimconfig.h*
|
For details on the options, they are fully commented in *nimconfig.h*
|
||||||
<br/>
|
<br/>
|
||||||
|
|
|
@ -23,7 +23,7 @@ This can be called any time you wish to use BLE functions and does not need to b
|
||||||
|
|
||||||
<a name="creating-a-server"></a>
|
<a name="creating-a-server"></a>
|
||||||
## Creating a Server
|
## Creating a Server
|
||||||
BLE servers perform 2 tasks, they advertise their existance for clients to find them and they provide services which contain information for the connecting client.
|
BLE servers perform 2 tasks, they advertise their existence for clients to find them and they provide services which contain information for the connecting client.
|
||||||
|
|
||||||
After initializing the NimBLE stack we create a server by calling `NimBLEDevice::createServer()`, this will create a server instance and return a pointer to it.
|
After initializing the NimBLE stack we create a server by calling `NimBLEDevice::createServer()`, this will create a server instance and return a pointer to it.
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ void app_main(void)
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
All that's left to do now is start the sevice, give the characteristic a value and start advertising for clients.
|
All that's left to do now is start the service, give the characteristic a value and start advertising for clients.
|
||||||
|
|
||||||
Fist we start the service by calling `NimBLEService::start()`.
|
Fist we start the service by calling `NimBLEService::start()`.
|
||||||
|
|
||||||
|
@ -214,7 +214,7 @@ for(int i = 0; i < results.getCount(); i++) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
As shown, the call to `NimBLEClient::connect` should have it's eturn value tested to make sure it succeeded before proceeding to get data.
|
As shown, the call to `NimBLEClient::connect` should have it's return value tested to make sure it succeeded before proceeding to get data.
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
Next we need to access the servers data by asking it for the service and the characteristic we are interested in, then read the characteristic value.
|
Next we need to access the servers data by asking it for the service and the characteristic we are interested in, then read the characteristic value.
|
||||||
|
@ -222,7 +222,7 @@ Next we need to access the servers data by asking it for the service and the cha
|
||||||
To do this we call `NimBLEClient::getService`, which takes as a parameter the UUID of the service and returns
|
To do this we call `NimBLEClient::getService`, which takes as a parameter the UUID of the service and returns
|
||||||
a pointer an instance to `NimBLERemoteService` or `nullptr` if the service was not found.
|
a pointer an instance to `NimBLERemoteService` or `nullptr` if the service was not found.
|
||||||
|
|
||||||
Next we will call `NimBLERemoteService::getCharateristic` which takes as a parameter the UUID of the service and returns
|
Next we will call `NimBLERemoteService::getCharacteristic` which takes as a parameter the UUID of the service and returns
|
||||||
a pointer to an instance of `NimBLERemoteCharacteristic` or `nullptr` if not found.
|
a pointer to an instance of `NimBLERemoteCharacteristic` or `nullptr` if not found.
|
||||||
|
|
||||||
Finally we will read the characteristic value with `NimBLERemoteCharacteristic::readValue()`.
|
Finally we will read the characteristic value with `NimBLERemoteCharacteristic::readValue()`.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
## Put BLE functions in a task running on the NimBLE stack core
|
## Put BLE functions in a task running on the NimBLE stack core
|
||||||
|
|
||||||
When commands are sent to the stack from a differnt core they can experience delays in execution.
|
When commands are sent to the stack from a different core they can experience delays in execution.
|
||||||
This library detects this and invokes the esp32 IPC to reroute these commands through the correct core but this also increases overhead.
|
This library detects this and invokes the esp32 IPC to reroute these commands through the correct core but this also increases overhead.
|
||||||
Therefore it is highly recommended to create tasks for BLE to run on the same core, the macro `CONFIG_BT_NIMBLE_PINNED_TO_CORE` can be used to set the core.
|
Therefore it is highly recommended to create tasks for BLE to run on the same core, the macro `CONFIG_BT_NIMBLE_PINNED_TO_CORE` can be used to set the core.
|
||||||
<br/>
|
<br/>
|
||||||
|
@ -13,12 +13,12 @@ When a client instance has been created and has connected to a peer device and i
|
||||||
If you are periodically connecting to the same devices and you have deleted the client instance or the services when connecting again it will cause a retrieval of that information from the peer again.
|
If you are periodically connecting to the same devices and you have deleted the client instance or the services when connecting again it will cause a retrieval of that information from the peer again.
|
||||||
This results in significant energy drain on the battery of the devices, fragments heap, and reduces connection performance.
|
This results in significant energy drain on the battery of the devices, fragments heap, and reduces connection performance.
|
||||||
|
|
||||||
Client instances in this library use approximately 20% of the original bluedroid library, deleteing them will provide much less gain than it did before.
|
Client instances in this library use approximately 20% of the original bluedroid library, deleting them will provide much less gain than it did before.
|
||||||
|
|
||||||
It is recommended to retain the client instance in cases where the time between connecting to the same device is less than 5 minutes.
|
It is recommended to retain the client instance in cases where the time between connecting to the same device is less than 5 minutes.
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
## Only retrieve the services and characteriscs needed
|
## Only retrieve the services and characteristics needed
|
||||||
|
|
||||||
As a client the use of `NimBLEClient::getServices` or `NimBLERemoteService::getCharacteristics` and using `true` for the parameter should be limited to devices that are not known.
|
As a client the use of `NimBLEClient::getServices` or `NimBLERemoteService::getCharacteristics` and using `true` for the parameter should be limited to devices that are not known.
|
||||||
Instead `NimBLEClient::getService(NimBLEUUID)` or `NimBLERemoteService::getCharacteristic(NimBLEUUID)` should be used to access certain attributes that are useful to the application.
|
Instead `NimBLEClient::getService(NimBLEUUID)` or `NimBLERemoteService::getCharacteristic(NimBLEUUID)` should be used to access certain attributes that are useful to the application.
|
||||||
|
|
Loading…
Reference in a new issue