Direct-BT  2.3.1
Direct-BT - Direct Bluetooth Programming.
dbt_scanner00.cpp
Go to the documentation of this file.
1 /*
2  * Author: Sven Gothel <sgothel@jausoft.com>
3  * Copyright (c) 2020 Gothel Software e.K.
4  * Copyright (c) 2020 ZAFENA AB
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining
7  * a copy of this software and associated documentation files (the
8  * "Software"), to deal in the Software without restriction, including
9  * without limitation the rights to use, copy, modify, merge, publish,
10  * distribute, sublicense, and/or sell copies of the Software, and to
11  * permit persons to whom the Software is furnished to do so, subject to
12  * the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be
15  * included in all copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24  */
25 
26 #include <cinttypes>
27 
28 #include <jau/dfa_utf8_decode.hpp>
29 
30 #include <direct_bt/DirectBT.hpp>
31 
32 extern "C" {
33  #include <unistd.h>
34 }
35 
36 using namespace direct_bt;
37 using namespace jau;
38 
39 /**
40  * This C++ direct_bt scanner example is a TinyB backward compatible and not fully event driven.
41  * It uses a more simple high-level approach via semantic GATT types (Service, Characteristic, ..)
42  * without bothering with fine implementation details of BTGattHandler.
43  * <p>
44  * For a more technical and low-level approach see dbt_scanner01.cpp!
45  * </p>
46  * <p>
47  * This example does not represent the recommended utilization of Direct-BT.
48  * </p>
49  */
50 
51 std::shared_ptr<BTDevice> deviceFound = nullptr;
52 std::mutex mtxDeviceFound;
53 std::condition_variable cvDeviceFound;
54 
56  void adapterSettingsChanged(BTAdapter &a, const AdapterSetting oldmask, const AdapterSetting newmask,
57  const AdapterSetting changedmask, const uint64_t timestamp) override {
58  fprintf(stderr, "****** Native Adapter SETTINGS_CHANGED: %s -> %s, changed %s\n",
59  to_string(oldmask).c_str(),
60  to_string(newmask).c_str(),
61  to_string(changedmask).c_str());
62  fprintf(stderr, "Status BTAdapter:\n");
63  fprintf(stderr, "%s\n", a.toString().c_str());
64  (void)timestamp;
65  }
66 
67  void discoveringChanged(BTAdapter &a, const ScanType currentMeta, const ScanType changedType, const bool changedEnabled, const bool keepAlive, const uint64_t timestamp) override {
68  fprintf(stderr, "****** DISCOVERING: meta %s, changed[%s, enabled %d, keepAlive %d]: %s\n",
69  to_string(currentMeta).c_str(), to_string(changedType).c_str(), changedEnabled, keepAlive, a.toString().c_str());
70  (void)timestamp;
71  }
72 
73  bool deviceFound(std::shared_ptr<BTDevice> device, const uint64_t timestamp) override {
74  fprintf(stderr, "****** FOUND__: %s\n", device->toString(true).c_str());
75  fprintf(stderr, "Status Adapter:\n");
76  fprintf(stderr, "%s\n", device->getAdapter().toString().c_str());
77  {
78  std::unique_lock<std::mutex> lockRead(mtxDeviceFound); // RAII-style acquire and relinquish via destructor
79  ::deviceFound = device;
80  cvDeviceFound.notify_all(); // notify waiting getter
81  return true;
82  }
83  (void)timestamp;
84  }
85  void deviceUpdated(std::shared_ptr<BTDevice> device, const EIRDataType updateMask, const uint64_t timestamp) override {
86  fprintf(stderr, "****** UPDATED: %s of %s\n", to_string(updateMask).c_str(), device->toString(true).c_str());
87  (void)timestamp;
88  }
89  void deviceConnected(std::shared_ptr<BTDevice> device, const uint16_t handle, const uint64_t timestamp) override {
90  fprintf(stderr, "****** CONNECTED: %s\n", device->toString(true).c_str());
91  (void)handle;
92  (void)timestamp;
93  }
94  void devicePairingState(std::shared_ptr<BTDevice> device, const SMPPairingState state, const PairingMode mode, const uint64_t timestamp) override {
95  fprintf(stderr, "****** PAIRING STATE: state %s, mode %s, %s\n",
96  to_string(state).c_str(), to_string(mode).c_str(), device->toString().c_str());
97  (void)timestamp;
98  }
99  void deviceReady(std::shared_ptr<BTDevice> device, const uint64_t timestamp) override {
100  fprintf(stderr, "****** READY: %s\n", device->toString().c_str());
101  (void)timestamp;
102  }
103  void deviceDisconnected(std::shared_ptr<BTDevice> device, const HCIStatusCode reason, const uint16_t handle, const uint64_t timestamp) override {
104  fprintf(stderr, "****** DISCONNECTED: Reason 0x%X (%s), old handle %s: %s\n",
105  static_cast<uint8_t>(reason), to_string(reason).c_str(),
106  to_hexstring(handle).c_str(), device->toString(true).c_str());
107  (void)handle;
108  (void)timestamp;
109  }
110 
111  std::string toString() const override {
112  return "MyAdapterStatusListener[this "+to_hexstring(this)+"]";
113  }
114 };
115 
117 
119  public:
120 
122 
123  void notificationReceived(BTGattCharRef charDecl, const TROOctets& charValue, const uint64_t timestamp) override {
124  const std::shared_ptr<BTDevice> dev = charDecl->getDeviceChecked();
125  const uint64_t tR = getCurrentMilliseconds();
126  fprintf(stderr, "****** GATT Notify (td %" PRIu64 " ms, dev-discovered %" PRIu64 " ms): From %s\n",
127  (tR-timestamp), (tR-dev->ts_creation), dev->toString().c_str());
128  if( nullptr != charDecl ) {
129  fprintf(stderr, "****** decl %s\n", charDecl->toString().c_str());
130  }
131  fprintf(stderr, "****** rawv %s\n", charValue.toString().c_str());
132  }
133 
135  const TROOctets& charValue, const uint64_t timestamp,
136  const bool confirmationSent) override
137  {
138  const std::shared_ptr<BTDevice> dev = charDecl->getDeviceChecked();
139  const uint64_t tR = getCurrentMilliseconds();
140  fprintf(stderr, "****** GATT Indication (confirmed %d, td(msg %" PRIu64 " ms, dev-discovered %" PRIu64 " ms): From %s\n",
141  confirmationSent, (tR-timestamp), (tR-dev->ts_creation), dev->toString().c_str());
142  if( nullptr != charDecl ) {
143  fprintf(stderr, "****** decl %s\n", charDecl->toString().c_str());
144  if( _TEMPERATURE_MEASUREMENT == *charDecl->value_type ) {
145  std::shared_ptr<GattTemperatureMeasurement> temp = GattTemperatureMeasurement::get(charValue);
146  if( nullptr != temp ) {
147  fprintf(stderr, "****** valu %s\n", temp->toString().c_str());
148  }
149  }
150  }
151  fprintf(stderr, "****** rawv %s\n", charValue.toString().c_str());
152  }
153 };
154 
155 int main(int argc, char *argv[])
156 {
157  bool ok = true, foundDevice=false;
158  int dev_id = 0; // default
159  bool waitForEnter=false;
161  bool forever = false;
162 
163  /**
164  * BT Core Spec v5.2: Vol 3, Part A L2CAP Spec: 7.9 PRIORITIZING DATA OVER HCI
165  *
166  * In order for guaranteed channels to meet their guarantees,
167  * L2CAP should prioritize traffic over the HCI transport in devices that support HCI.
168  * Packets for Guaranteed channels should receive higher priority than packets for Best Effort channels.
169  * ...
170  * I have noticed that w/o HCI le_connect, overall communication takes twice as long!!!
171  */
172  bool doHCI_Connect = true;
173 
174  for(int i=1; i<argc; i++) {
175  if( !strcmp("-wait", argv[i]) ) {
176  waitForEnter = true;
177  } else if( !strcmp("-forever", argv[i]) ) {
178  forever = true;
179  } else if( !strcmp("-dev_id", argv[i]) && argc > (i+1) ) {
180  dev_id = atoi(argv[++i]);
181  } else if( !strcmp("-skipConnect", argv[i]) ) {
182  doHCI_Connect = false;
183  } else if( !strcmp("-mac", argv[i]) && argc > (i+1) ) {
184  std::string macstr = std::string(argv[++i]);
185  waitForDevice = BDAddressAndType(EUI48(macstr), BDAddressType::BDADDR_UNDEFINED);
186  }
187  }
188  fprintf(stderr, "dev_id %d\n", dev_id);
189  fprintf(stderr, "doHCI_Connect %d\n", doHCI_Connect);
190  fprintf(stderr, "waitForDevice: %s\n", waitForDevice.toString().c_str());
191 
192  if( waitForEnter ) {
193  fprintf(stderr, "Press ENTER to continue\n");
194  getchar();
195  }
196  BTManager & mngr = BTManager::get();
197 
198  std::shared_ptr<BTAdapter> adapter = mngr.getAdapter(dev_id);
199  if( nullptr == adapter ) {
200  fprintf(stderr, "adapter dev_id %d not available.\n", dev_id);
201  exit(1);
202  }
203  if( !adapter->isValid() ) {
204  fprintf(stderr, "Adapter invalid: %s\n", adapter->toString().c_str());
205  exit(1);
206  }
207  if( !adapter->isPowered() ) {
208  fprintf(stderr, "Adapter not powered: %s\n", adapter->toString().c_str());
209  exit(1);
210  }
211  fprintf(stderr, "Using adapter: %s\n", adapter->toString().c_str());
212 
213  adapter->addStatusListener(std::shared_ptr<AdapterStatusListener>(new MyAdapterStatusListener()));
214 
215  const uint64_t t0 = getCurrentMilliseconds();
216 
217  while( ok && ( forever || !foundDevice ) ) {
218  ok = HCIStatusCode::SUCCESS == adapter->startDiscovery(true /* keepAlive */);
219  if( !ok) {
220  perror("Adapter start discovery failed");
221  goto out;
222  }
223 
224  std::shared_ptr<BTDevice> device = nullptr;
225  {
226  std::unique_lock<std::mutex> lockRead(mtxDeviceFound); // RAII-style acquire and relinquish via destructor
227  while( nullptr == device ) { // FIXME deadlock, waiting forever!
228  cvDeviceFound.wait(lockRead);
229  if( nullptr != deviceFound ) {
230  foundDevice = deviceFound->getAddressAndType().matches(waitForDevice); // match
231  if( foundDevice || ( BDAddressAndType::ANY_DEVICE == waitForDevice && deviceFound->getAddressAndType().isLEAddress() ) ) {
232  // match or any LE device
233  device.swap(deviceFound); // take over deviceFound
234  }
235  }
236  }
237  }
238  adapter->stopDiscovery();
239 
240  if( ok && nullptr != device ) {
241  const uint64_t t1 = getCurrentMilliseconds();
242 
243  //
244  // HCI LE-Connect
245  // (Without: Overall communication takes ~twice as long!!!)
246  //
247  if( doHCI_Connect ) {
248  HCIStatusCode res;
249  if( ( res = device->connectDefault() ) != HCIStatusCode::SUCCESS ) {
250  fprintf(stderr, "Connect: Failed res %s, %s\n", to_string(res).c_str(), device->toString().c_str());
251  // we tolerate the failed immediate connect, as it might happen at a later time
252  } else {
253  fprintf(stderr, "Connect: Success\n");
254  }
255  } else {
256  fprintf(stderr, "Connect: Skipped %s\n", device->toString().c_str());
257  }
258 
259  //
260  // GATT Service Processing
261  //
262  jau::darray<BTGattServiceRef> primServices = device->getGattServices(); // implicit GATT connect...
263  if( primServices.size() > 0 ) {
264  const uint64_t t5 = getCurrentMilliseconds();
265  {
266  const uint64_t td15 = t5 - t1; // discovered -> connect -> gatt complete
267  const uint64_t td05 = t5 - t0; // total
268  fprintf(stderr, "\n\n\n");
269  fprintf(stderr, "GATT primary-services completed\n");
270  fprintf(stderr, " discovery-done to gatt complete %" PRIu64 " ms,\n"
271  " discovered to gatt complete %" PRIu64 " ms,\n"
272  " total %" PRIu64 " ms\n\n",
273  td15, (t5 - device->getCreationTimestamp()), td05);
274  }
275  std::shared_ptr<GattGenericAccessSvc> ga = device->getGattGenericAccess();
276  if( nullptr != ga ) {
277  fprintf(stderr, " GenericAccess: %s\n\n", ga->toString().c_str());
278  }
279  {
280  std::shared_ptr<BTGattHandler> gatt = device->getGattHandler();
281  if( nullptr != gatt && gatt->isConnected() ) {
282  std::shared_ptr<GattDeviceInformationSvc> di = gatt->getDeviceInformation(primServices);
283  if( nullptr != di ) {
284  fprintf(stderr, " DeviceInformation: %s\n\n", di->toString().c_str());
285  }
286  }
287  }
288 
289  for(size_t i=0; i<primServices.size(); i++) {
290  BTGattService & primService = *primServices.at(i);
291  fprintf(stderr, " [%2.2d] Service %s\n", (int)i, primService.toString().c_str());
292  fprintf(stderr, " [%2.2d] Service Characteristics\n", (int)i);
293  jau::darray<BTGattCharRef> & serviceCharacteristics = primService.characteristicList;
294  for(size_t j=0; j<serviceCharacteristics.size(); j++) {
295  BTGattChar & serviceChar = *serviceCharacteristics.at(j);
296  fprintf(stderr, " [%2.2d.%2.2d] Decla: %s\n", (int)i, (int)j, serviceChar.toString().c_str());
299  if( serviceChar.readValue(value) ) {
300  std::string sval = dfa_utf8_decode(value.get_ptr(), value.getSize());
301  fprintf(stderr, " [%2.2d.%2.2d] Value: %s ('%s')\n", (int)i, (int)j, value.toString().c_str(), sval.c_str());
302  }
303  }
304  bool cccdEnableResult[2];
305  bool cccdRet = serviceChar.configNotificationIndication(true /* enableNotification */, true /* enableIndication */, cccdEnableResult);
306  fprintf(stderr, " [%2.2d.%2.2d] Config Notification(%d), Indication(%d): Result %d\n",
307  (int)i, (int)j, cccdEnableResult[0], cccdEnableResult[1], cccdRet);
308  if( cccdRet ) {
309  serviceChar.addCharListener( std::shared_ptr<BTGattChar::Listener>( new MyGATTEventListener() ) );
310  }
311  }
312  }
313  // FIXME sleep 1s for potential callbacks ..
314  sleep(1);
315  }
316  device->disconnect(); // OK if not connected, also issues device->disconnectGATT() -> gatt->disconnect()
317  } // if( ok && nullptr != device )
318  }
319 
320 out:
321  return 0;
322 }
323 
direct_bt::BTGattService::characteristicList
jau::darray< BTGattCharRef > characteristicList
List of Characteristic Declarations as shared reference.
Definition: BTGattService.hpp:97
direct_bt::BTAdapter::stopDiscovery
HCIStatusCode stopDiscovery() noexcept
Closes the discovery session.
Definition: BTAdapter.cpp:756
direct_bt::BTDevice::connectDefault
HCIStatusCode connectDefault() noexcept
Establish a default HCI connection to this device, using certain default parameter.
Definition: BTDevice.cpp:532
jau::darray::at
const_reference at(size_type i) const
Like std::vector::at(size_type), immutable reference.
Definition: darray.hpp:719
direct_bt::AdapterSetting
AdapterSetting
Adapter Setting Bits.
Definition: BTTypes1.hpp:136
DirectBT.hpp
direct_bt::BTGattHandler::getDeviceInformation
std::shared_ptr< GattDeviceInformationSvc > getDeviceInformation(jau::darray< BTGattServiceRef > &primServices)
Definition: BTGattHandler.cpp:1096
direct_bt::BTGattChar::hasProperties
bool hasProperties(const PropertyBitVal v) const noexcept
Definition: BTGattChar.hpp:216
direct_bt::GattGenericAccessSvc::toString
std::string toString() const noexcept
Definition: GATTNumbers.cpp:382
direct_bt::TROOctets::getSize
constexpr jau::nsize_t getSize() const noexcept
Returns the used memory size for read and write operations, may be zero.
Definition: OctetTypes.hpp:118
direct_bt::GattTemperatureMeasurement::get
static std::shared_ptr< GattTemperatureMeasurement > get(const TROOctets &source) noexcept
Definition: GATTNumbers.cpp:414
direct_bt::BDAddressAndType::ANY_DEVICE
static const BDAddressAndType ANY_DEVICE
Using EUI48::ANY_DEVICE and BDAddressType::BDADDR_UNDEFINED to match any device.
Definition: BTAddress.hpp:426
MyGATTEventListener::notificationReceived
void notificationReceived(BTGattCharRef charDecl, const TROOctets &charValue, const uint64_t timestamp) override
Called from native BLE stack, initiated by a received notification associated with the given BTGattCh...
Definition: dbt_scanner00.cpp:123
direct_bt::EIRDataType
EIRDataType
Bit mask of 'Extended Inquiry Response' (EIR) data fields, indicating a set of related data.
Definition: BTTypes0.hpp:752
MyGATTEventListener::MyGATTEventListener
MyGATTEventListener()
Definition: dbt_scanner00.cpp:121
direct_bt::BTGattChar::readValue
bool readValue(POctets &res, int expectedLength=-1)
BT Core Spec v5.2: Vol 3, Part G GATT: 4.8.1 Read Characteristic Value.
Definition: BTGattChar.cpp:304
dfa_utf8_decode.hpp
direct_bt
Definition: ATTPDUTypes.hpp:171
_TEMPERATURE_MEASUREMENT
static const uuid16_t _TEMPERATURE_MEASUREMENT(GattCharacteristicType::TEMPERATURE_MEASUREMENT)
direct_bt::BTGattChar
Definition: BTGattChar.hpp:75
direct_bt::AdapterStatusListener
BTAdapter status listener for BTDevice discovery events: Added, updated and removed; as well as for c...
Definition: BTAdapter.hpp:67
direct_bt::uuid16_t
Definition: UUID.hpp:98
direct_bt::TROOctets::get_ptr
constexpr uint8_t const * get_ptr() const noexcept
Definition: OctetTypes.hpp:228
direct_bt::BDAddressAndType::toString
std::string toString() const noexcept
Definition: BTTypes0.cpp:333
jau
Definition: basic_algos.hpp:34
direct_bt::BTDevice::getCreationTimestamp
uint64_t getCreationTimestamp() const noexcept
Returns the timestamp in monotonic milliseconds when this device instance has been created,...
Definition: BTDevice.hpp:253
direct_bt::BTGattService
Representing a complete [Primary] Service Declaration including its list of Characteristic Declaratio...
Definition: BTGattService.hpp:67
direct_bt::ScanType
ScanType
Meta ScanType as derived from BTMode, with defined value mask consisting of BDAddressType bits.
Definition: BTTypes0.hpp:294
direct_bt::BTDevice::toString
std::string toString() const noexcept override
Definition: BTDevice.hpp:303
direct_bt::BTGattChar::addCharListener
bool addCharListener(std::shared_ptr< Listener > l)
Add the given BTGattChar::Listener to the listener list if not already present.
Definition: BTGattChar.cpp:285
direct_bt::BTAdapter::isPowered
bool isPowered() const noexcept
Returns whether the adapter is valid, plugged in and powered.
Definition: BTAdapter.hpp:437
direct_bt::HCIStatusCode
HCIStatusCode
BT Core Spec v5.2: Vol 1, Part F Controller Error Codes: 1.3 List of Error Codes.
Definition: HCITypes.hpp:124
jau::darray< BTGattServiceRef >
direct_bt::BTGattCharRef
std::shared_ptr< BTGattChar > BTGattCharRef
Definition: BTGattChar.hpp:409
direct_bt::BTDevice::getGattGenericAccess
std::shared_ptr< GattGenericAccessSvc > getGattGenericAccess()
Returns the shared GenericAccess instance, retrieved by getGattService() or nullptr if not available.
Definition: BTDevice.cpp:1590
TEMPERATURE_MEASUREMENT
@ TEMPERATURE_MEASUREMENT
Definition: test_datatype02.hpp:82
direct_bt::BTAdapter::toString
std::string toString() const noexcept override
Definition: BTAdapter.hpp:784
direct_bt::BTGattHandler::Defaults::MAX_ATT_MTU
@ MAX_ATT_MTU
mtxDeviceFound
std::mutex mtxDeviceFound
Definition: dbt_scanner00.cpp:52
direct_bt::BTManager::get
static BTManager & get(const BTMode defaultBTMode=BTMode::NONE)
Retrieves the singleton instance.
Definition: BTManager.hpp:320
direct_bt::BTDevice::disconnect
HCIStatusCode disconnect(const HCIStatusCode reason=HCIStatusCode::REMOTE_USER_TERMINATED_CONNECTION) noexcept
Disconnect the LE or BREDR peer's GATT and HCI connection.
Definition: BTDevice.cpp:1701
main
int main(int argc, char *argv[])
Definition: dbt_scanner00.cpp:155
direct_bt::BTDevice::ts_creation
const uint64_t ts_creation
Definition: BTDevice.hpp:220
direct_bt::GattDeviceInformationSvc::toString
std::string toString() const noexcept
Definition: GATTNumbers.cpp:407
jau::darray::size
constexpr size_type size() const noexcept
Like std::vector::size().
Definition: darray.hpp:668
Read
@ Read
Definition: test_datatype02.hpp:106
direct_bt::PairingMode
PairingMode
Bluetooth secure pairing mode.
Definition: BTTypes0.hpp:261
MyAdapterStatusListener
Definition: dbt_scanner00.cpp:55
direct_bt::BTManager
A thread safe singleton handler of the Linux Kernel's BlueZ manager control channel.
Definition: BTManager.hpp:201
jau::dfa_utf8_decode
uint32_t dfa_utf8_decode(uint32_t &state, uint32_t &codep, const uint32_t byte_value)
Definition: dfa_utf8_decode.cpp:90
direct_bt::BTAdapter::addStatusListener
bool addStatusListener(std::shared_ptr< AdapterStatusListener > l)
Add the given listener to the list if not already present.
Definition: BTAdapter.cpp:548
direct_bt::BTGattChar::toString
std::string toString() const noexcept override
Definition: BTGattChar.cpp:106
MyGATTEventListener::indicationReceived
void indicationReceived(BTGattCharRef charDecl, const TROOctets &charValue, const uint64_t timestamp, const bool confirmationSent) override
Called from native BLE stack, initiated by a received indication associated with the given BTGattChar...
Definition: dbt_scanner00.cpp:134
direct_bt::TROOctets
Transient read only octet data, i.e.
Definition: OctetTypes.hpp:59
direct_bt::to_string
std::string to_string(const BDAddressType type) noexcept
Definition: BTTypes0.cpp:129
direct_bt::BTAdapter
BTAdapter represents one Bluetooth Controller.
Definition: BTAdapter.hpp:250
jau::getCurrentMilliseconds
uint64_t getCurrentMilliseconds() noexcept
Returns current monotonic time in milliseconds.
Definition: basic_types.cpp:47
charValue
static int charValue
Definition: dbt_scanner10.cpp:121
direct_bt::EUI48
A packed 48 bit EUI-48 identifier, formerly known as MAC-48 or simply network device MAC address (Med...
Definition: BTAddress.hpp:388
jau::to_hexstring
std::string to_hexstring(value_type const &v) noexcept
Produce a lower-case hexadecimal string representation of the given pointer.
Definition: string_util.hpp:104
direct_bt::BTAdapter::isValid
bool isValid() const noexcept
Returns whether the adapter is valid, i.e.
Definition: BTAdapter.hpp:480
direct_bt::BTGattService::toString
std::string toString() const noexcept override
Definition: BTGattService.cpp:66
direct_bt::BTDevice::getGattServices
jau::darray< std::shared_ptr< BTGattService > > getGattServices() noexcept
Returns a list of shared GATTService available on this device if successful, otherwise returns an emp...
Definition: BTDevice.cpp:1525
direct_bt::BTGattHandler::isConnected
bool isConnected() const noexcept
Definition: BTGattHandler.hpp:253
MyGATTEventListener
Definition: dbt_scanner00.cpp:118
direct_bt::HCIStatusCode::SUCCESS
@ SUCCESS
direct_bt::BTGattChar::configNotificationIndication
bool configNotificationIndication(const bool enableNotification, const bool enableIndication, bool enabledState[2])
BT Core Spec v5.2: Vol 3, Part G GATT: 3.3.3.3 Client Characteristic Configuration.
Definition: BTGattChar.cpp:186
direct_bt::BTDevice::getGattHandler
std::shared_ptr< BTGattHandler > getGattHandler() noexcept
Returns the connected GATTHandler or nullptr, see connectGATT(), getGattService() and disconnect().
Definition: BTDevice.cpp:1520
direct_bt::POctets::toString
std::string toString() const
Definition: OctetTypes.hpp:666
deviceFound
std::shared_ptr< BTDevice > deviceFound
This C++ direct_bt scanner example is a TinyB backward compatible and not fully event driven.
Definition: dbt_scanner00.cpp:51
cvDeviceFound
std::condition_variable cvDeviceFound
Definition: dbt_scanner00.cpp:53
direct_bt::POctets
Persistent octet data, i.e.
Definition: OctetTypes.hpp:451
direct_bt::BTAdapter::startDiscovery
HCIStatusCode startDiscovery(const bool keepAlive=true, const bool le_scan_active=false, const uint16_t le_scan_interval=24, const uint16_t le_scan_window=24, const uint8_t filter_policy=0x00)
Starts a new discovery session.
Definition: BTAdapter.cpp:679
direct_bt::SMPPairingState
SMPPairingState
SMP Pairing Process state definition.
Definition: SMPTypes.hpp:101
direct_bt::BTGattHandler::number
static constexpr int number(const Defaults d)
Definition: BTGattHandler.hpp:149
direct_bt::BDAddressAndType
Unique Bluetooth EUI48 address and BDAddressType tuple.
Definition: BTAddress.hpp:417
direct_bt::BTManager::getAdapter
std::shared_ptr< BTAdapter > getAdapter(const uint16_t dev_id) const noexcept
Returns the DBTAdapter with the given dev_id, or nullptr if not found.
Definition: BTManager.cpp:624
direct_bt::BTDevice::getAdapter
BTAdapter & getAdapter() const
Returns the managing adapter.
Definition: BTDevice.hpp:243
direct_bt::GattTemperatureMeasurement::toString
std::string toString() const noexcept
Definition: GATTNumbers.cpp:453
direct_bt::BTGattChar::Listener
BTGattChar event listener for notification and indication events.
Definition: BTGattChar.hpp:122
direct_bt::BDAddressType::BDADDR_UNDEFINED
@ BDADDR_UNDEFINED
Undefined.