esp-nimble-cpp/CHANGELOG.md
h2zero 675d6bbf0d [BREAKING] Remove NimBLEAddress type default value.
When constructing a NimBLEAddress via string or other non `ble_addr_t` parameters it is important that the address type be specified.
This will help prevent issues where applications are not able to connect or identify scanned devices when comparing their addresses.
2024-12-14 13:56:50 -07:00

37 KiB

Changelog

All notable changes to this project will be documented in this file.

[Unreleased]

Breaking changes

  • All connection oriented callbacks now receive a reference to NimBLEConnInfo, the ble_gap_conn_desc has also been replace with NimBLEConnInfo in the functions that received it.
  • All functions that take a time input parameter now expect the value to be in milliseconds instead of seconds.
  • Removed Eddystone URL as it has been shutdown by google since 2021.
  • NimBLESecurity class removed.
  • NimBLEDevice Ignore list functions removed.
  • NimBLEDevice::startSecurity now returns a bool, true on success, instead of an int to be consistent with the rest of the library.
  • NimBLEDevice::getInitialized renamed to NimBLEDevice::isInitialized.
  • NimBLEDevice::setPower no longer takes the esp_power_level_t and esp_ble_power_type_t, instead only an integer value in dbm units is accepted.
  • NimBLEDevice::setOwnAddrType no longer takes a bool nrpa parameter.
  • NimBLEDevice::getClientListSize replaced with NimBLEDevice::getCreatedClientCount.
  • NimBLEDevice::getClientList was removed.
  • NimBLEServer::disconnect now returns bool, true = success, instead of int to be consistent with the rest of the library.
  • NimBLEServerCallbacks::onMTUChanged renamed to NimBLEServerCallbacks::onMTUChange to be consistent with the client callback.
  • NimBLEServer::getPeerIDInfo renamed to NimBLEServer::getPeerInfoByHandle to better describe it's use.
  • NimBLEServerCallbacks::onPassKeyRequest has been replaced with NimBLEServer::onPassKeyDisplay which should display the pairing pin that the client is expected to send.
  • NimBLEServerCallbacks::onAuthenticationComplete now takes a NimBLEConnInfo& parameter.
  • NimBLEClient::getServices now returns a const reference to std::vector<NimBLERemoteService*> instead of a pointer to the internal vector.
  • NimBLEClient::getConnId has been renamed to getConnHandle to be consistent with bluetooth terminology.
  • NimBLEClient::disconnect now returns a bool, true on success, instead of an int to be consistent with the rest of the library.
  • NimBLEClientCallbacks::onDisconnect now takes an additional int reason parameter to let the application know why the disconnect occurred.
  • NimBLEClientCallbacks::onPassKeyRequest has been changed to NimBLEClientCallbacks::onPassKeyEntry which takes a NimBLEConnInfo& parameter and does not return a value. Instead or returning a value this callback should prompt a user to enter a pin number which is sent later via NimBLEDevice::injectPassKey.
  • NimBLEClientCallbacks::onConfirmPIN renamed to NimBLEClientCallbacks::onConfirmPasskey and no longer returns a value and now takes a NimBLEConnInfo& parameter. This should be used to prompt a user to confirm the pin on the display (YES/NO) after which the response should be sent with NimBLEDevice::injectConfirmPasskey.
  • NimBLEAdvertising::setMinPreferred and NimBLEAdvertising::setMaxPreferred have been removed, use NimBLEAdvertising::setPreferredParams instead.
  • Advertising the name and TX power of the device will no longer happen by default and should be set manually by the application.
  • NimBLEAdvertising::setAdvertisementType has been renamed to NimBLEAdvertising::setConnectableMode to better reflect it's function.
  • NimBLEAdvertising::setScanResponse has been renamed to NimBLEAdvertising::enableScanResponse to better reflect it's function.
  • NimBLEAdvertising; Scan response is no longer enabled by default.
  • NimBLEAdvertising::start No longer takes a callback pointer parameter, instead the new method NimBLEAdvertising::setAdvertisingCompleteCallback should be used.
  • NimBLEAdvertisementData::addData now takes either a std::vector<uint8_t> or uint8_t* + length instead of std::string or char + length.
  • NimBLEAdvertisementData::getPayload now returns std::vector<uint8_t> instead of std::string.
  • The callback parameter for NimBLEScan::start has been removed and the blocking overload of NimBLEScan::start has been replaced by an overload of NimBLEScan::getResults with the same parameters.
  • NimBLEAdvertisedDeviceCallbacks Has been replaced by NimBLEScanCallbacks which contains the following methods: onResult, onScanEnd, and `onDiscovered
    • NimBLEScanCallbacks::onResult, functions the same as the old NimBLEAdvertisedDeviceCallbacks::onResult but now takes aa const NimBLEAdvertisedDevice* instead of non-const.
    • NimBLEScanCallbacks::onScanEnd, replaces the scanEnded callback passed to NimBLEScan::start and now takes a const NimBLEScanResults& and int reason parameter.
    • NimBLEScanCallbacks::onDiscovered, This is called immediately when a device is first scanned, before any scan response data is available and takes a const NimBLEAdvertisedDevice* parameter.
  • NimBLEScan::stop will no longer call the onScanEnd callback as the caller should know its been stopped when this is called.
  • NimBLEScan::clearDuplicateCache has been removed as it was problematic and only for the esp32. Stop and start the scanner for the same effect.
  • NimBLEScanResults::getDevice methods now return const NimBLEAdvertisedDevice*.
  • NimBLEScanResults iterators are now const_iterator.
  • NimBLEAdvertisedDevice::hasRSSI removed as redundant, RSSI is always available.
  • NimBLEAdvertisedDevice::getPayload now returns const std::vector<uint8_t> instead of a pointer to internal memory.
  • NimBLEAdvertisedDevice Timestamp removed, if needed then the app should track the time from the callback.
  • NimBLECharacteristic::notify no longer takes a bool is_notification parameter, instead indicate() should be called to send indications.
  • NimBLECharacteristicCallbacks::onNotify removed as unnecessary, the library does not call notify without app input.
  • NimBLECharacteristicCallbacks::onStatus No longer takes a status parameter, refer to the return code for success/failure.
  • NimBLERemoteCharacteristic::getRemoteService now returns a const NimBLERemoteService* instead of non-const.
  • NimBLERemoteCharacteristic::readUInt32 Has been removed.
  • NimBLERemoteCharacteristic::readUInt16 Has been removed.
  • NimBLERemoteCharacteristic::readUInt8 Has been removed.
  • NimBLERemoteCharacteristic::readFloat Has been removed.
  • NimBLERemoteCharacteristic::registerForNotify Has been removed.
  • NimBLERemoteService::getCharacteristics now returns a const std::vector<NimBLERemoteCharacteristic*>& instead of non-const std::vector<NimBLERemoteCharacteristic*>*.
  • NimBLERemoteService::getValue now returns NimBLEAttValue instead of std::string.
  • NimBLEService::getCharacteristics now returns a const std::vector<NimBLECharacteristic*>& instead of std::vector<NimBLECharacteristic *>.
  • NimBLEUUID::getNative method replaced with NimBLEUUID::getBase which returns a read-only pointer to the underlying ble_uuid_t struct.
  • NimBLEUUID; msbFirst parameter has been removed from constructor, caller should reverse the data first or call the new reverseByteOrder method after.
  • NimBLEAddress constructor; default value for the type parameter removed, caller should know the address type and specify it.
  • NimBLEAddress::getNative replaced with NimBLEAddress::getBase and now returns a pointer to const ble_addr_t instead of a pointer to the address value.
  • NimBLEAddress::equals method and NimBLEAddress::== operator will now also test if the address types are the same.
  • NimBLEUtils::dumpGapEvent function removed.
  • NimBLEUtils::buildHexData replaced with NimBLEUtils::dataToHexString, which returns a std::string containing the hex string.
  • NimBLEEddystoneTLM::setTemp now takes an int16_t parameter instead of float to be friendly to devices without floating point support.
  • NimBLEEddystoneTLM::getTemp now returns int16_t to work with devices that don't have floating point support.
  • NimBLEEddystoneTLM::setData now takes a reference to * NimBLEEddystoneTLM::BeaconData instead of std::string.
  • NimBLEEddystoneTLM::getData now returns a reference to * NimBLEEddystoneTLM::BeaconData instead of std::string.
  • NimBLEBeacon::setData now takes const NimBLEBeacon::BeaconData& instead of std::string.
  • NimBLEBeacon::getData now returns const NimBLEBeacon::BeaconData& instead of std::string.
  • NimBLEHIDDevice::reportMap renamed to NimBLEHIDDevice::getReportMap.
  • NimBLEHIDDevice::hidControl renamed to NimBLEHIDDevice::getHidControl.
  • NimBLEHIDDevice::inputReportrenamed to NimBLEHIDDevice::getInputReport.
  • NimBLEHIDDevice::outputReportrenamed to NimBLEHIDDevice::getOutputReport.
  • NimBLEHIDDevice::featureReportrenamed to NimBLEHIDDevice::getFeatureReport.
  • NimBLEHIDDevice::protocolModerenamed to NimBLEHIDDevice::getProtocolMode.
  • NimBLEHIDDevice::bootOutputrenamed to NimBLEHIDDevice::getBootOutput.
  • NimBLEHIDDevice::pnprenamed to NimBLEHIDDevice::setPnp.
  • NimBLEHIDDevice::hidInforenamed to NimBLEHIDDevice::setHidInfo.
  • NimBLEHIDDevice::deviceInforenamed to NimBLEHIDDevice::getDeviceInfoService.
  • NimBLEHIDDevice::hidServicerenamed to NimBLEHIDDevice::getHidService.
  • NimBLEHIDDevice::batteryServicerenamed to NimBLEHIDDevice::getBatteryService.

Fixed

  • NimBLEDevice::getPower and NimBLEDevice::getPowerLevel bug worked around for the esp32s3 and esp32c3.
  • NimBLEDevice::setPower and NimBLEDevice::getPower now support the full power range for all esp devices.
  • NimBLEDevice::setOwnAddrType will now correctly apply the provided address type for all devices.
  • NimBLEDevice::getPower (esp32) return value is now calculated to support devices with different min/max ranges.
  • Crash if NimBLEDevice::deinit is called when the stack has not been initialized.
  • NimBLEServer service changed notifications will now wait until the changes have taken effect and the server re-started before indicating the change to peers, reducing difficultly for some clients to update their data.
  • NimBLEService::getHandle will now fetch the handle from the stack if not valid to avoid returning an invalid value.
  • std::vector input to set/write values template.
  • NimBLEHIDDevice::pnp will now set the data correctly.
  • Check for Arduino component
  • Fixed building with esp-idf version 5.x.
  • Fixed pairing failing when the process was started by the peer first.
  • Fixed building with esp-idf and Arduino component.
  • Workaround for esp32s3 and esp32c3 not returning the correct txPower with some IDF versions.

Changed

  • NimBLEClient::secureConnection now takes an additional parameter bool async, if true, will send the secure command and return immediately with a true value for successfully sending the command, else false. This allows for asynchronously securing a connection.
  • Deleting the client instance from the onDisconnect callback is now supported.
  • NimBLEClient::connect will no longer cancel already in progress connections.
  • NimBLEClient::setDataLen now returns bool, true if successful.
  • NimBLEClient::updateConnParams now returns bool, true if successful.
  • NimBLEClient::setPeerAddress now returns a bool, true on success.
  • NimBLEDevice::startSecurity now takes and additional parameter int* rcPtr which will provide the return code from the stack if provided.
  • NimBLEDevice::deleteClient no longer blocks tasks.
  • NimBLEDevice::getAddress will now return the address currently in use.
  • NimBLEDevice::init now returns a bool with true indicating success.
  • NimBLEDevice::deinit now returns a bool with true indicating success.
  • NimBLEDevice::setDeviceName now returns a bool with true indicating success.
  • NimBLEDevice::setCustomGapHandler now returns a bool with true indicating success.
  • NimBLEDevice::setOwnAddrType now returns a bool with true indicating success and works with non-esp32 devices.
  • NimBLEDevice::setPower now returns a bool value, true = success.
  • NimBLEDevice::setMTU now returns a bool value, true = success.
  • NimBLEDevice::deleteAllBonds now returns true on success, otherwise false.
  • NimBLEEddystoneTLM internal data struct type BeaconData is now public and usable by the application.
  • NimBLEBeacon internal data struct type BeaconData is now public and can be used by the application.
  • Removed tracking of client characteristic subscription status from NimBLEServer and NimBLECharacteristic and instead uses the functions and tracking in the host stack.
  • NimBLECharacteristic::indicate now takes the same parameters as notify.
  • NimBLECharacteristic::notify and NimBLECharacteristic::indicate now return a bool, true = success.
  • Added optional connHandle parameter to NimBLECharacteristic::notify to allow for sending notifications to specific clients.
  • NimBLEServer Now uses a std::array to store client connection handles instead of std::vector to reduce memory allocation.
  • NimBLEExtAdvertisement : All functions that set data now return bool, true = success.
  • NimBLEAdvertising Advertising data is now stored in instances of NimBLEAdvertisingData and old vectors removed.
  • NimBLEAdvertising::setAdvertisementData and NimBLEAdvertising::setScanResponseData now return bool, true = success.
  • Added optional NimBLEAddress parameter to NimBLEAdvertising::start to allow for directed advertising to a peer.
  • All NimBLEAdvertising functions that change data values now return bool, true = success.
  • All NimBLEAdvertisementData functions that change data values now return bool, true = success.
  • NimBLEAdvertising advertising complete callback is now defined as std::function to allow for using std::bind for callback functions.
  • NimBLEAdvertisementData::setName now takes an optional bool parameter to indicate if the name is complete or incomplete, default = complete.
  • NimBLEAdvertisementData moved to it's own .h and .cpp files.
  • NimBLEScan::start takes a new bool restart parameter, default true, that will restart an already in progress scan and clear the duplicate filter so all devices will be discovered again.
  • Scan response data that is received without advertisement first will now create the device and send a callback.
  • NimBLEScan::start will no longer clear cache or results if scanning is already in progress.
  • NimBLEScan::start will now allow the start command to be sent with updated parameters if already scanning.
  • NimBLEScan::clearResults will now reset the vector capacity to 0.
  • Host reset will now no longer restart scanning and instead will call NimBLEScanCallbacks::onScanEnd.
  • Added optional index parameter to NimBLEAdvertisedDevice::getPayloadByType
  • NimBLEAdvertisedDevice::getManufacturerData now takes an optional index parameter for use in the case of multiple manufacturer data fields.
  • NimBLEUtils: Add missing GAP event strings.
  • NimBLEUtils: Add missing return code strings.
  • NimBLEUtils: Event/error code strings optimized.
  • NimBLEAttValue cleanup and optimization.
  • cleaned up code, removed assert/abort calls, replaced with a configurable option to enable debug asserts.

Added

  • (esp32 specific) NimBLEDevice::setPowerLevel and NimBLEDevice::getPowerLevel which take and return the related esp_power_level* types.
  • NimBLEDevice::setDefaultPhy which will set the default preferred PHY for all connections.
  • NimBLEDevice::getConnectedClients, which returns a vector of pointers to the currently connected client instances.
  • NimBLEDevice::setOwnAddr function added, which takes a uint8_t* or NimBLEAddress& and will set the mac address of the device, returns bool true= success.
  • NimBLEDevice::injectPassKey Used to send the pairing passkey instead of a return value from the client callback.
  • NimBLEDevice::injectConfirmPasskey Used to send the numeric comparison pairing passkey confirmation instead of a return value from the client callback.
  • NimBLEDevice::setDeviceName to change the device name after initialization.
  • NimBLECharacteristic::create2904 which will specifically create a Characteristic Presentation Format (0x2904) descriptor.
  • NimBLEAdvertising::refreshAdvertisingData refreshes the advertisement data while still actively advertising.
  • NimBLEClient::updatePhy to request a PHY change with a peer.
  • NimBLEClient::getPhy to read the current connection PHY setting.
  • Config struct to NimBLEClient to efficiently set single bit config settings.
  • NimBLEClient::setSelfDelete that takes the bool parameters deleteOnDisconnect and deleteOnConnectFail, which will configure the client to delete itself when disconnected or the connection attempt fails.
  • NimBLEClient::setConfig and NimBLEClient::getConfig which takes or returns a NimBLEClient::Config object respectively.
  • NimBLEClient::cancelConnect() to cancel an in-progress connection, returns bool, true = success.
  • Non-blocking NimBLEClient::connect option added via 2 new bool parameters added to the function:
    • asyncConnect; if true, will send the connect command and return immediately.
    • exchangeMTU; if true will send the exchange MTU command upon connection.
  • NimBLEClientCallbacks::onConnectFail callback that is called when the connection attempt fail while connecting asynchronously.
  • NimBLEClientCallbacks::onMTUChange callback which will be called when the MTU exchange completes and takes a NimBLEClient* and uint16_t MTU parameter.
  • NimBLEClientCallbacks::onPhyUpdate and -NimBLEServerCallbacks::onPhyUpdate Which are called when the PHY update is complete.
  • Extended scan example.
  • NimBLEServer::updatePhy to request a PHY change with a peer.
  • NimBLEServer::getPhy to read the PHY of a peer connection.
  • NimBLEServer::getClient which will create a client instance from the provided peer connHandle or connInfo to facilitate reading/write from the connected client.
  • NimBLEServerCallbacks::onConnParamsUpdate callback.
  • NimBLEScan::erase overload that takes a const NimBLEAdvertisedDevice* parameter.
  • NimBLEScan::setScanPhy to enable/disable the PHY's to scan on (extended advertising only).
  • NimBLEScan::setScanPeriod which will allow for setting a scan restart timer in the controller (extended advertising only).
  • NimBLEAdvertisedDevice::isScannable() that returns true if the device is scannable.
  • NimBLEAdvertisedDevice::begin and NimBLEAdvertisedDevice::end read-only iterators for convenience and use in range loops.
  • NimBLEAdvertisedDevice::getAdvFlags returns the advertisement flags of the advertiser.
  • NimBLEAdvertisedDevice::getPayloadByType Generic use function that returns the data from the advertisement with the specified type.
  • NimBLEAdvertisedDevice::haveType Generic use function that returns true if the advertisement data contains a field with the specified type.
  • Support for esp32c6, esp32c2, esp32h2, and esp32p4.
  • NimBLEExtAdvertisement::removeData, which will remove the data of the specified type from the advertisement.
  • NimBLEExtAdvertisement::addServiceUUID, which will append to the service uuids advertised.
  • NimBLEExtAdvertisement::removeServiceUUID, which will remove the service from the uuids advertised.
  • NimBLEExtAdvertisement::removeServices, which will remove all service uuids advertised.
  • New overloads for NimBLEExtAdvertisement::setServiceData with the parameters const NimBLEUUID& uuid, const uint8_t* data, size_t length and const NimBLEUUID& uuid, const std::vector<uint8_t>& data.
  • NimBLEExtAdvertisement::getDataLocation, which returns the location in the advertisement data of the type requested in parameter uint8_t type.
  • NimBLEExtAdvertisement::toString which returns a hex string representation of the advertisement data.
  • NimBLEAdvertising::getAdvertisementData, which returns a reference to the currently set advertisement data.
  • NimBLEAdvertising::getScanData, which returns a reference to the currently set scan response data.
  • New overloads for NimBLEAdvertising::removeServiceUUID and NimBLEAdvertisementData::removeServiceUUID to accept a const char*
  • NimBLEAdvertising::clearData, which will clear the advertisement and scan response data.
  • NimBLEAdvertising::setManufacturerData Overload that takes a const uint8_t* and , size_t` parameter.
  • NimBLEAdvertising::setServiceData Overload that takes const NimBLEUUID& uuid, const uint8_t* data, size_t length as parameters.
  • NimBLEAdvertising::setServiceData Overload that takes const NimBLEUUID& uuid, const std::vector<uint8_t>& as parameters.
  • NimBLEAdvertising::setDiscoverableMode to allow applications to control the discoverability of the advertiser.
  • NimBLEAdvertising::setAdvertisingCompleteCallback sets the callback to call when advertising ends.
  • NimBLEAdvertising::setPreferredParams that takes the min and max preferred connection parameters as an alternative for setMinPreferred and setMaxPreferred.
  • NimBLEAdvertising::setAdvertisingInterval Sets the advertisement interval for min and max to the same value instead of calling setMinInterval and setMaxInterval separately if there is not value difference.
  • NimBLEAdvertisementData::removeData, which takes a parameter uint8_t type, the data type to remove.
  • NimBLEAdvertisementData::toString, which will print the data in hex.
  • NimBLEUtils::taskWait which causes the calling task to wait for an event.
  • NimBLEUtils::taskRelease releases the task from and event.
  • NimBLEUtils::generateAddr function added with will generate a random address and takes a bool parameter, true = create non-resolvable private address, otherwise a random static address is created, returns NimBLEAddress.
  • NimBLEUUID::getValue which returns a read-only uint8_t pointer to the UUID value.
  • NimBLEUUID::reverseByteOrder, this will reverse the bytes of the UUID, which can be useful for advertising/logging.
  • NimBLEUUID constructor overload that takes a reference to ble_uuid_any_t.
  • NimBLEAddress::isNrpa method to test if an address is random non-resolvable.
  • NimBLEAddress::isStatic method to test if an address is random static.
  • NimBLEAddress::isPublic method to test if an address is a public address.
  • NimBLEAddress::isNull methods to test if an address is NULL.
  • NimBLEAddress::getValue method which returns a read-only pointer to the address value.
  • NimBLEAddress::reverseByteOrder method which will reverse the byte order of the address value.
  • NimBLEHIDDevice::batteryLevel returns the HID device battery level characteristic.
  • NimBLEBeacon::setData overload that takes uint8_t* data and uint8_t length.
  • NimBLEHIDDevice::getPnp function added to access the pnp characteristic.
  • NimBLEHIDDevice::getHidInfo function added to access the hid info characteristic.

[1.4.1] - 2022-10-30

Fixed

  • NimBLEDevice::getPower incorrect value when power level is -3db.
  • Failed pairing when already in progress.

Changed

  • Revert previous change that forced writing with response when subscribing in favor of allowing the application to decide.

Added

  • Added NimBLEHIDDevice::batteryLevel.
  • Added NimBLEDevice::setDeviceName allowing for changing the device name while the BLE stack is active.
  • CI Builds

[1.4.0] - 2022-07-31

Fixed

  • Fixed missing data from long notification values.
  • Fixed NimbleCharacteristicCallbacks::onRead not being called when a non-long read command is received.
  • Prevent a potential crash when retrieving characteristics from a service if the result was successful but no characteristics found.
  • logs/typos.

Changed

  • AD flags are no longer set in the advertisements of non-connectable beacons, freeing up 3 bytes of advertisement room.
  • Save resources when retrieving descriptors if the characteristic handle is the same as the end handle (no descriptors).
  • Subscribing to characteristic notifications/indications will now always use write with response, as per BLE specifications.
  • NimBLEClient::discoverAttributes now returns a bool value to indicate success/failure.
  • Scan result callbacks are no longer called when the scan response data is updated in order to reduce duplicates.

Added

  • Preliminary support for non-esp devices, NRF51 and NRF52 devices supported with n-able arduino core
  • Alias added for NimBLEServerCallbacks::onMTUChange to onMtuChanged in order to support porting code from original library.
  • NimBLEAttValue Class added to reduce and control RAM footprint of characteristic/descriptor values and support conversions from Arduino Strings and many other data types.
  • Bluetooth 5 extended advertising support for capable devices. CODED Phy, 2M Phy, extended advertising data, and multi-advertising are supported, periodic advertising will be implemented in the future.

[1.3.3] - 2022-02-15

Changed

  • If attribute retrieval fails with a "not found" try again with the 16 bit version if a 128 bit base uuid is used.

Fixed

  • Memory leak when deleting client instance.
  • IDf version check for data length extension.
  • Memory leak when server services changed.
  • Compiler warnings for non-esp32 devices.

[1.3.2] - 2022-01-15

Fixed

  • Initialize advertising complete callback in NimBLEAdvertising constructor.
  • Clear client disconnect timer in constructor before initializing.
  • Fix missing data when reading large values.
  • Fix missing data in notifications when using a large MTU size and more than 270 bytes of data are sent.
  • Workaround fix added for cases when the task notification value is not cleared, causing various functions that should block not to block.

Added

  • NimBLEClient::getLastError : Gets the error code of the last function call that produces a return code from the stack.
  • NimBLECharacteristic::notify : Overload method to send notifications/indications with custom values.
  • Added conditional checks for ESP32 specific functions/values to support use of the library on non-esp32 devices.
  • Added an alias to use the callback name from the original library onMtuChanged.
  • NimBLEClient::setDataLen and NimBLEServer::setDataLen: Data length extension support (IDF version >= 4.3.2 only)
  • Config option to set logging level for esp-nimble-cpp

Changed

  • Critical section calls now use the NimBLE API instead of FreeRTOS directly. This removes the need for a portMUX_TYPE variable in the class definitions.
  • Removed unnecessary variables in NimBLEService and changed the constructor no no longer accept numHandles and inst_id parameters.

[1.3.1] - 2021-08-04

Fixed

  • Corrected a compiler/linker error when an application or a library uses bluetooth classic due to the redefinition of btInUse.

[1.3.0] - 2021-08-02

Added

  • NimBLECharacteristic::removeDescriptor: Dynamically remove a descriptor from a characteristic. Takes effect after all connections are closed and sends a service changed indication.

  • NimBLEService::removeCharacteristic: Dynamically remove a characteristic from a service. Takes effect after all connections are closed and sends a service changed indication

  • NimBLEServerCallbacks::onMTUChange: This is callback is called when the MTU is updated after connection with a client.

  • ESP32C3 support

  • Whitelist API:

    • NimBLEDevice::whiteListAdd: Add a device to the whitelist.
    • NimBLEDevice::whiteListRemove: Remove a device from the whitelist.
    • NimBLEDevice::onWhiteList: Check if the device is on the whitelist.
    • NimBLEDevice::getWhiteListCount: Gets the size of the whitelist
    • NimBLEDevice::getWhiteListAddress: Get the address of a device on the whitelist by index value.
  • Bond management API:

    • NimBLEDevice::getNumBonds: Gets the number of bonds stored.
    • NimBLEDevice::isBonded: Checks if the device is bonded.
    • NimBLEDevice::deleteAllBonds: Deletes all bonds.
    • NimBLEDevice::getBondedAddress: Gets the address of a bonded device by the index value.
  • NimBLECharacteristic::getCallbacks to retrieve the current callback handler.

  • Connection Information class: NimBLEConnInfo.

  • NimBLEScan::clearDuplicateCache: This can be used to reset the cache of advertised devices so they will be immediately discovered again.

Changed

  • FreeRTOS files have been removed as they are not used by the library.
  • Services, characteristics and descriptors can now be created statically and added after.
  • Excess logging and some asserts removed.
  • Use ESP_LOGx macros to enable using local log level filtering.

Fixed

  • NimBLECharacteristicCallbacks::onSubscribe Is now called after the connection is added to the vector.
  • Corrected bonding failure when reinitializing the BLE stack.
  • Writing to a characteristic with a std::string value now correctly writes values with null characters.
  • Retrieving remote descriptors now uses the characteristic end handle correctly.
  • Missing data in long writes to remote descriptors.
  • Hanging on task notification when sending an indication from the characteristic callback.
  • BLE controller memory could be released when using Arduino as a component.
  • Compile errors with NimBLE release 1.3.0.

[1.2.0] - 2021-02-08

Added

  • NimBLECharacteristic::getDescriptorByHandle: Return the BLE Descriptor for the given handle.

  • NimBLEDescriptor::getStringValue: Get the value of this descriptor as a string.

  • NimBLEServer::getServiceByHandle: Get a service by its handle.

  • NimBLEService::getCharacteristicByHandle: Get a pointer to the characteristic object with the specified handle.

  • NimBLEService::getCharacteristics: Get the vector containing pointers to each characteristic associated with this service. Overloads to get a vector containing pointers to all the characteristics in a service with the UUID. (supports multiple same UUID's in a service)

    • NimBLEService::getCharacteristics(const char *uuid)
    • NimBLEService::getCharacteristics(const NimBLEUUID &uuid)
  • NimBLEAdvertisementData New methods:

    • NimBLEAdvertisementData::addTxPower: Adds transmission power to the advertisement.
    • NimBLEAdvertisementData::setPreferredParams: Adds connection parameters to the advertisement.
    • NimBLEAdvertisementData::setURI: Adds URI data to the advertisement.
  • NimBLEAdvertising New methods:

    • NimBLEAdvertising::setName: Set the name advertised.
    • NimBLEAdvertising::setManufacturerData: Adds manufacturer data to the advertisement.
    • NimBLEAdvertising::setURI: Adds URI data to the advertisement.
    • NimBLEAdvertising::setServiceData: Adds service data to the advertisement.
    • NimBLEAdvertising::addTxPower: Adds transmission power to the advertisement.
    • NimBLEAdvertising::reset: Stops the current advertising and resets the advertising data to the default values.
  • NimBLEDevice::setScanFilterMode: Set the controller duplicate filter mode for filtering scanned devices.

  • NimBLEDevice::setScanDuplicateCacheSize: Sets the number of advertisements filtered before the cache is reset.

  • NimBLEScan::setMaxResults: This allows for setting a maximum number of advertised devices stored in the results vector.

  • NimBLEAdvertisedDevice New data retrieval methods added:

    • haveAdvInterval/getAdvInterval: checks if the interval is advertised / gets the advertisement interval value.

    • haveConnParams/getMinInterval/getMaxInterval: checks if the parameters are advertised / get min value / get max value.

    • haveURI/getURI: checks if a URI is advertised / gets the URI data.

    • haveTargetAddress/getTargetAddressCount/getTargetAddress(index): checks if a target address is present / gets a count of the addresses targeted / gets the address of the target at index.

Changed

  • nimconfig.h (Arduino) is now easier to use.

  • NimBLEServer::getServiceByUUID Now takes an extra parameter of instanceID to support multiple services with the same UUID.

  • NimBLEService::getCharacteristic Now takes an extra parameter of instanceID to support multiple characteristics with the same UUID.

  • NimBLEAdvertising Transmission power is no longer advertised by default and can be added to the advertisement by calling NimBLEAdvertising::addTxPower

  • NimBLEAdvertising Custom scan response data can now be used without custom advertisement.

  • NimBLEScan Now uses the controller duplicate filter.

  • NimBLEAdvertisedDevice Has been refactored to store the complete advertisement payload and no longer parses the data from each advertisement. Instead the data will be parsed on-demand when the user application asks for specific data.

Fixed

  • NimBLEHIDDevice Characteristics now use encryption, this resolves an issue with communicating with devices requiring encryption for HID devices.

[1.1.0] - 2021-01-20

Added

  • NimBLEDevice::setOwnAddrType added to enable the use of random and random-resolvable addresses, by asukiaaa

  • New examples for securing and authenticating client/server connections, by mblasee.

  • NimBLEAdvertising::SetMinPreferred and NimBLEAdvertising::SetMinPreferred re-added.

  • Conditional checks added for command line config options in nimconfig.h to support custom configuration in platformio.

  • NimBLEClient::setValue Now takes an extra bool parameter response to enable the use of write with response (default = false).

  • NimBLEClient::getCharacteristic(uint16_t handle) Enabling the use of the characteristic handle to be used to find the NimBLERemoteCharacteristic object.

  • NimBLEHIDDevice class added by wakwak-koba.

  • NimBLEServerCallbacks::onDisconnect overloaded callback added to provide a ble_gap_conn_desc parameter for the application to obtain information about the disconnected client.

  • Conditional checks in nimconfig.h for command line defined macros to support platformio config settings.

Changed

  • NimBLEAdvertising::start now returns a bool value to indicate success/failure.

  • Some asserts were removed in NimBLEAdvertising::start and replaced with better return code handling and logging.

  • If a host reset event occurs, scanning and advertising will now only be restarted if their previous duration was indefinite.

  • NimBLERemoteCharacteristic::subscribe and NimBLERemoteCharacteristic::registerForNotify will now set the callback regardless of the existence of the CCCD and return true unless the descriptor write operation failed.

  • Advertising tx power level is now sent in the advertisement packet instead of scan response.

  • NimBLEScan When the scan ends the scan stopped flag is now set before calling the scan complete callback (if used) this allows the starting of a new scan from the callback function.

Fixed

  • Sometimes NimBLEClient::connect would hang on the task block if no event arrived to unblock. A time limit has been added to timeout appropriately.

  • When getting descriptors for a characteristic the end handle of the service was used as a proxy for the characteristic end handle. This would be rejected by some devices and has been changed to use the next characteristic handle as the end when possible.

  • An exception could occur when deleting a client instance if a notification arrived while the attribute vectors were being deleted. A flag has been added to prevent this.

  • An exception could occur after a host reset event when the host re-synced if the tasks that were stopped during the event did not finish processing. A yield has been added after re-syncing to allow tasks to finish before proceeding.

  • Occasionally the controller would fail to send a disconnected event causing the client to indicate it is connected and would be unable to reconnect. A timer has been added to reset the host/controller if it expires.

  • Occasionally the call to start scanning would get stuck in a loop on BLE_HS_EBUSY, this loop has been removed.

  • 16bit and 32bit UUID's in some cases were not discovered or compared correctly if the device advertised them as 16/32bit but resolved them to 128bits. Both are now checked.

  • FreeRTOS compile errors resolved in latest Arduino core and IDF v3.3.

  • Multiple instances of time() called inside critical sections caused sporadic crashes, these have been moved out of critical regions.

  • Advertisement type now correctly set when using non-connectable (advertiser only) mode.

  • Advertising payload length correction, now accounts for appearance.

  • (Arduino) Ensure controller mode is set to BLE Only.

[1.0.2] - 2020-09-13

Changed

  • NimBLEAdvertising::start 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).

  • (Arduino) Maximum BLE connections can now be altered by only changing the value of CONFIG_BT_NIMBLE_MAX_CONNECTIONS in nimconfig.h. Any changes to the controller max connection settings in sdkconfig.h will now have no effect when using this library.

  • (Arduino) Revert the previous change to fix the advertising start delay. Instead a replacement fix that routes all BLE controller commands from a task running on core 0 (same as the controller) has been implemented. This improves response times and reliability for all BLE functions.

[1.0.1] - 2020-09-02

Added

  • Empty NimBLEAddress constructor: NimBLEAddress() produces an address of 00:00:00:00:00:00 type 0.
  • Documentation of the difference of NimBLEAddress::getNative vs the original bluedroid library.

Changed

  • notify_callback typedef is now defined as std::function to enable the use of std::bind to call a class member function.

Fixed

  • Fix advertising start delay when first called.

[1.0.0] - 2020-08-22

First stable release.

All the original library functionality is complete and many extras added with full documentation.