Direct-BT LE and BREDR Library
Changes
3.3.1
- clang-18 fixes
3.2.4
- Last version conforming to C++17
3.2.3
- SMP key fixes
- Misc pre-paired / pairing fixes
LE Resolvable Address
and IRK fixes- Cleanup startDiscovery overloads
3.2.2
- Add convenience
make[_gatt]()
3.2.1
- Updated documentation / README
3.2.0
- Support attaching a GATT Server with listener in LE master mode
- Allowing to run as GATT client plus providing GATT server functionality
- Support Resolvable Private Address (RPA) for remote LE master/GATT clients
- Support SMP authentication running as a GATT server (LE slave)
- Including TinyCrypt as a
git submodule, supporting
AES128
for IRK w/ LE Resolvable Private Address (RPA) matching. - jaulib v1.1.2
3.1.2
- jaulib v1.1.1
3.0.1
- C++20 clean
- Fixed certain C++17 and C++20 compiler and clang-tidy warnings
3.0.0
- Added and passed clang-tidy diagnostics, multiple issues revealed
- Using 'const T&' as method argument type where applicable
- Not when required to pass value off-thread
- Changed Listener API
- AdapterStatusListener
- BTGattHandler::NativeGattCharListener
- DBGattServer::Listener
- Complete replacing std::function with jau::function
- L2CAPClient::read, HCIComm::read
- preset 'poll' result 'n', avoid garbage comparison
- Use local
close_impl()
in virtual destructor- L2CAPServer, L2CAPClient, NopGattServerHandler, DBGattServerHandler, FwdGattServerHandler
- Explicitly catch
std::bad_alloc
in 'noexcept' methods -> 'abort'- 'abort' was issued implicitly in noexcept methods
- AttPDUMsg*, SMPPDUMsg*: Place
check_range()
in final type, avoid vtable-mess - Performance and API cleansiness
- Using 'const T&' as method argument type where applicable
- Added IDE vscode (vscodium) multi root-workspace config
2.9.0
- Add support for Alpine Linux using musl C library
- Passed platforms testing:
- Debian 11
- Debian 12
- gcc 12.2.0
- clang 14.0.6
- Ubuntu 22.04
- FreeBSD 13.1
- Alpine Linux 3.16
2.8.2 Direct-BT Maturity (Bluetooth LE)
- Change all callback return type: dummy 'bool' -> 'void', now
enabled by
jau::function<void(A...)>
- Fix BTAdapter::reset()
- BTAdapter::poweredOff(): Always use disconnectAllDevices() for
proper device pull-down to clear all its states
- was just deleting all refs if !active
- Waiting until all devices are disconnected after shutdown and before bringup
- Added trial unit test
- BTAdapter::poweredOff(): Always use disconnectAllDevices() for
proper device pull-down to clear all its states
- Fix BTAdapter's background discovery
- Use
jau::service_runner
to ensure singleton pattern on background discovery, avoiding multiple threads - Fix previous
retry==true
endless thread
- Use
2.8.0
- Misc cleanup and adoption of jaulib v0.14.0
- Support Ubuntu 22.04 and 20.04
- C++: Shorten
is*Set()
->is_set()
, fix test requiring all bits set tobit == ( mask & bit )
- Fix bringup tests (C++, Java): They run w/o elevated permissions, hence don't toggle state and require nothing
2.7.0
AdapterstatusListener::deviceFound()
is only called if not already connected and if initially found.- Use
noexcept
where possibleBTGattHandler::send*()
BTGattHandler::GattServerHandler
,BTGattChar
,BTGattDesc
- BTManager is passed as
shared_ptr<BTManager>
, aligning with JNI lifecycle - AdapterStatusListener, BTGattCharListener: Adopt full Java/Native link via DBTNativeDownlink and JavaUplink, clean API, impl and lifecycle
- Robustness of JNI
- Passing
trial.org.direct_bt.TestDBTProvokeClientServer_i470
w/o crash - Use
std::shared_ptr<T>
instead of anaked pointer
for sane lifcycle, see newshared_ptr_ref<T>
.
- Passing
2.6.5
- Fix several memory leaks and uninitialized fields using valgrind
analysis (native and w/ JVM)
- BTGattHandler::disconnect(): Check weak BTDevice before using resources
- BTGattHandler::l2capReaderEndLocked(): Remove off-thread BTDevice::disconnect() on io-error, use BT host's disconnect (simplify tear down)
- BTGattHandler's l2capReader data race (use after free)
- Trial
TestDBClientServer1*
test changes- Split tests into NoEnc, SC0 and SC1 classes
- Have client/server adapter names unique, allowing multi-machine testing in one room
- Bump jaulib v0.8.0
- BTAdapter Server: Offload waiting for L2CAP client connection to BTDevice::processL2CAPSetup() dedicated thread
- [L2CAP, HCI]Comm: Hold external interrupted delegate from
service_runner
for complete interrupted() query - WIP: BTAdapter::startDiscovery(): Retry up to
MAX_BACKGROUND_DISCOVERY_RETRY
(3), mitigating failure to start discovery - BTDevice::notifyLEFeature(): Remove HCIStatusCode param and only call with SUCCESS status code
- Fix and document default connection paramter, leaning to the higher performance side
- Resolve legacy security (SC 0) BlueZ/Kernel Mgmt LTK role of
master
orinitiator
field
2.6.3
- Have trial
TestDBClientServer1*
test in both client/server directions, legacy and secure connections (SC) - Fix BTAdapter's server mode key handling
- Have failed pairing issue disconnect, posting indicative reason
- Use global
inline constexpr
instead of#define
macros - Bump jaulib v0.7.14
2.6.2
- Adopt jaulib detailed git version info: Using post-tag
VERSION_COMMITS
andVERSION_SHA1_SHORT
.VERSION_LONG
reflects post-tag and dirty. - Bump jaulib v0.7.12-1
- Added online unit testing using actual BT adapter, testing client with server functionality.
- BTAdapter/HCIHandler: Fix advertising state: Active until either disabled or connected.
- DBTAdapter: Fix removeAllStatusListener(): Re-add internal listener to maintain functionality.
- GATT Server enhancements, incl new DBGattServer::Mode and
dbt_repeater00
implementation. - BTDevice::getGattServices(): MTU and remote GATT Services shall be processed from here at request only, moved from BTDevice::connectGATT().
- jaulib v0.7.11 fixes
- JNI
DBGatt[Server|Service|Char]_ctorImpl()
fix for 32-bit platforms - BlueZ/Linux >= 5.13 (?) Bug Workaround on 'set_local_name(..)'
2.5.4
- Fixing clang++ 11.0.1 and g++ 8.3.0 compilation issues
- Refine BTAdapter API on commands in powerd-off state only:
setName()
,setSecureConnections()
,setDefaultConnParam()
- Proper definition of
BTDevice::getName()
- Expose refined EInfoReport via
BTDevice::getEIR()
and use it inBTAdapter::startAdvertising()
- Add
DBGattServer::Listener::write[Char|Desc]ValueDone()
callback - Add and use
[BTAdapter|BTManager]::setDefaultConnParam(..)
essential in server mode - Consolidated
BTDevice::setConnSecurity*(..)
and addedBTAdapter::setServerConnSecurity(...)
- Server fixes GATT sendNotification/Indication,
BTDevice::connectGATT()
,AttReadNRsp
. - Server adding proper
AttErrorRsp
replies and supportingAttFindByTypeValueReq/Rsp
. - Server: Using L2CapServer socket/accept services while in advertising mode.
- Reuse
jau::service_runner
, replacing code duplication - Enhance SMP and key managment, LTK validation
- jaulib v0.7.9 fixes
2.5.2
- jaulib v0.7.5 fixes
2.5.1
BTAdapter::pausing_discovery_devices
: Usestd::weak_ptr<BTDevice>
list- Add
BTAdapter::removeDevicePausingDiscovery()
andgetCurrentDiscoveryPolicy()
- DBTAdapter.cxx: Fix AdapterStatusListener.discoveringChanged(..) signature
- Add BTObject::checkValid() implementation overriding jau:JavaUplink, to actually validate whether instance is still valid.
2.5.0
- Added DiscoveryPolicy, allowing fine tuned discovery
keep-alive policy and covering HCI host OS's implied discovery turn-off
when connected (BlueZ/Linux). API change of
BTAdapter::startDiscovery(..)
andAdapterStatusListener::discoveringChanged(..)
- BTDevice::connectGATT(): Discover GATT services and parse
GenericAccess ASAP before
AdapterStatusListener::deviceReady()
- SMPKeyBin::createAndWrite(..): Drop 'overwrite' argument as we shall
set
overwrite = PairingMode::PRE_PAIRED != device.getPairingMode()
- Fix PRE_PAIRED mode for !SC (legacy): Master needs to upload init LTK 1st, then responder LTK (regression)
- Robustness: Reader-Callback Shutdown after 8s and use SC atomic for state
- BTAdapter::startDiscovery(..): Add 'bool filter_dup=true' as last parameter
- Unlock mutex before
notify_all
to avoid pessimistic re-block of notifiedwait()
thread
2.4.0
- Completed Java support for LE slave/server (peripheral) mode incl GATT-Server.
- Add
BTAdapter's Slave Peripheral SMP Key Management
- Full SMP key persistence in peripheral mode
- Reshape SMPKeyBin design: Set and upload from BTDevice (split functionality), v5.
- BTDevice::unpair() is now issued directly by Direct-BT to
have a consistent and stable security workflow:
- when a BTRole::Slave BTDevice is discovered, see AdapterStatusListener::deviceFound().
- when a BTRole::Slave BTDevice is disconnected, see AdapterStatusListener::deviceDisconnected().
- when a BTRole::Master BTDevice gets connected, see AdapterStatusListener::deviceConnected().
- LE slave/server mode (peripheral): 1st Milestone
- BTRole separation implemented and tested
- Advertising implemented and tested
- GATT Server implemented and tested
- Slave / Server SMP Security implemented and testing
- SMPKeyBin v4, added localAddress (adapter) to filename + bin-fmt.
- Simplified
SMP*Key
class names andset[Default|Connected]LE_PHY()
args. - Added EUI48 endian conversion when passing/receiving to Bluetooth
- Passed validation of multiple BT5 adapter.
- Fixed
EInfoReport::read_[ext_]ad_reports()
multiple reports - Added Link-Key support in our SMP processing and SMPKeyBin, supporting non-legacy SC.
- Aligned
BTGatt* findGatt*()
methods across Java/C++ - Moved
EUI48
,EUI48Sub
(C++/Java) anduuid_t
,Octets
(C++) tojaulib
for general use. - Added BTRole and GATTRole for full master/client and slave/server support.
- Added BTAdapter advertising support
- Only use and program selected BTAdapter via BTAdapter::initialize()
(required now)
- Supports using multiple applications, each using one adapter, or
- One application using multiple adapter for different tasks and BTRole
2.3.0
- Removal of TinyB
2.2.14
- Bluetooth 5.0 Support
- Using HCI extended scanning and connecting if supported (old API may not work on new adapter)
- Parsing and translating extended and enhanced event types, etc
- TODO: User selection of
LE_2M
andL2_CODED
, ... ???
2.2.13
- Revised API: BTGattChar::addCharListener(..) in C++ and Java for a more intuitive use.
- Fix EUI48Sub::scanEUI48Sub(..): Fail on missing expected colon, i.e. after each two digits
- Fix JNIAdapterStatusListener::deviceConnected(..): NewObject(.., deviceClazzCtor, ..) used wrong argument order
2.2.11
- Fix EUI48 unit test and refine on application permissions for launching applications
- Make
BTDeviceRegistry
andBTSecurityRegistry
universal - Move
BTDeviceRegistry
andBTSecurityRegistry
todirect_bt
library (from examples) - EUI48Sub: Complement with
hash_code()
,clear()
,indexOf()
,contains()
, ... - SMPKeyBin: Tighten constraints,
readAndApply(..)
must validateminSecLevel
. BTAdapter::mgmtEvDeviceFoundHCI(..)
: Clarify code path, covering name change via AD EIR.- Passthrough all paramter
BTAdapter::startDiscovery(..)
->HCIHandler::le_set_scan_param(..)
: Addle_scan_active
andfilter_policy
. Active scanning is used to gather device name in discovery mode (AD EIR). - Add
-dbt_debug
argument for AD EIRdirect_bt.debug.hci.scan_ad_eir
and parse EIR GAPFlags - Fix BTGattHandler: Gather all Descriptors from all Characteristics (only queried 1st Char.)
- SMPKeyBin's base filename compatibility with FAT32 Long Filename (LFN)
2.2.5
- Complete SMPKeyBin user API: Convenient static 'one shot' entries + support no-encryption case
- Fix leaked AdapterStatusListener
- Fixed HCIHandler and l2cap related issues
- Unified free function to_string(..) and member toString()
- Tested key regeneration use-case: Pairing failure (bad key), key removal and auto security negotiation.
- Adding SMPKeyBin file removal support.
- Tested negative passkey/boolean input, requested via auto security negotiation.
- Using negative passkey response via
setPairingPasskey(passkey = 0)
for performance.
2.2.4
- Providing full featured
SMPKeyBin
for LTK, CSRK and secure connection param setup persistence and upload. - Added Auto Security mode, negotiating the security setup with any device.
- Bugfixes in HCIHandler and ACL/SMP packet processing.
- Enhanced robusteness of underlying C++ API and implementation.
2.2.00
- Kicked off junit testing for Java implementation
- Adding direct_bt-fat.jar (fat jar) bootstrapping its
contained native libraries using merged-in
jaulib
. - Java API renaming, incl package: org.tinyb to org.direct_bt.
- Completing SMP/Security implementation (WIP)
- Replaced std::vector and jau::cow_vector with jau::darray and jau::cow_darray
2.1.33
- Added AdapterStatusListener callback methods devicePairingState(..) and deviceReady(..), supporting security/pairing.
- Added support for LE Secure Connections and LE legacy pairing utilizing SMP and BlueZ/Kernel features.
- Exposing BTSecurityLevel and SMPIOCapability for connection oriented security setup on BlueZ/Kernel, see DBTDevice and BluetoothDevice.
- Covering SMP over L2CAP messaging via SMPPDUMsg types and retrieval via HCI/ACL/L2CAP on BlueZ/Kernel
2.1.30
- Use read lock-free jau::cow_vector for all callback-lists, avoiding locks in callback iteration
- Passed GCC all warnings, compile clean
- Passed GCC sanitizer runtime checks
- Using extracted Jau C++ Support Library, enhanced encapsulation
- Passed valgrind's memcheck, helgrind and drd validating no memory leak nor data race or deadlock using dbt_scanner10
- Added native de-mangled backtrace support using libunwind and and abi::__cxa_demangle
- Reaching robust implementation state of Direct-BT, including recovery from L2CAP transmission breakdown on Raspberry Pi.
- Resolved race conditions on rapid device discovery and connect, using one thread per device.
- API documentation with examples
- Tested on GNU/Linux x86_64, arm32 and arm64 with native and Java examples.
- Tested on Bluetooth Adapter: Intel, CSR and Raspberry Pi
- Almost removed non-standard Linux/BlueZ-Mngr kernel dependency using the universal HCI protocol, remaining portion configures the adapter.
2.0.0
- Java D-Bus implementation details of package 'tinyb' moved to tinyb.dbus.
- The tinyb.jar jar file has been renamed to tinyb2.jar, avoiding conflicts.
- General interfaces matching the original implementation and following BlueZ API were created in package org.tinyb.
- Class org.tinyb.BluetoothFactory provides a factory to instantiate the initial root org.tinyb.BluetoothManager, either using the original D-Bus implementation or an alternative implementation.
- C++ namespace and implementation kept unchanged.
0.5.0
- Added notifications API
- Capitalized RSSI and UUID properly in Java
- Added JNI Helper classes for managing lifetime of JNIEnv and Global Refences
0.4.0
- Added asynchronous methods for discovering BluetoothObjects