1 /** 2 * Arduino Wrapper for BTstack 3 */ 4 #pragma once 5 6 #include "ble/att.h" 7 #include "btstack_util.h" 8 #include "ble/gatt_client.h" 9 #include "hci.h" 10 #include <stdint.h> 11 12 typedef enum BLEStatus { 13 BLE_STATUS_OK, 14 BLE_STATUS_DONE, // e.g. for service or characteristic discovery done 15 BLE_STATUS_CONNECTION_TIMEOUT, 16 BLE_STATUS_CONNECTION_ERROR, 17 BLE_STATUS_OTHER_ERROR 18 } BLEStatus; 19 20 typedef void (*btstack_packet_handler_t) (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size); 21 22 class UUID { 23 private: 24 uint8_t uuid[16]; 25 public: 26 UUID(); 27 UUID(const uint8_t uuid[16]); 28 UUID(const char * uuidStr); 29 const char * getUuidString() const; 30 const char * getUuid128String() const; 31 const uint8_t * getUuid(void) const; 32 bool matches(UUID *uuid) const; 33 }; 34 35 typedef enum BD_ADDR_TYPE { 36 PUBLIC_ADDRESS = 0, 37 PRIVAT_ADDRESS 38 } BD_ADDR_TYPE; 39 40 class BD_ADDR { 41 private: 42 uint8_t address[6]; 43 BD_ADDR_TYPE address_type; 44 public: 45 BD_ADDR(); 46 BD_ADDR(const char * address_string, BD_ADDR_TYPE address_type = PUBLIC_ADDRESS); 47 BD_ADDR(const uint8_t address[6], BD_ADDR_TYPE address_type = PUBLIC_ADDRESS); 48 const uint8_t * getAddress(); 49 const char * getAddressString(); 50 BD_ADDR_TYPE getAddressType(); 51 }; 52 53 class BLEAdvertisement { 54 private: 55 uint8_t advertising_event_type; 56 uint8_t rssi; 57 uint8_t data_length; 58 uint8_t data[10 + LE_ADVERTISING_DATA_SIZE]; 59 BD_ADDR bd_addr; 60 UUID * iBeacon_UUID; 61 public: 62 BLEAdvertisement(uint8_t * event_packet); 63 ~BLEAdvertisement(); 64 BD_ADDR * getBdAddr(); 65 BD_ADDR_TYPE getBdAddrType(); 66 int getRssi(); 67 bool containsService(UUID * service); 68 bool nameHasPrefix(const char * namePrefix); 69 const uint8_t * getAdvData(); 70 bool isIBeacon(); 71 const UUID * getIBeaconUUID(); 72 uint16_t getIBeaconMajorID(); 73 uint16_t getIBecaonMinorID(); 74 uint8_t getiBeaconMeasuredPower(); 75 }; 76 77 class BLECharacteristic { 78 private: 79 le_characteristic_t characteristic; 80 UUID uuid; 81 public: 82 BLECharacteristic(); 83 BLECharacteristic(le_characteristic_t characteristic); 84 const UUID * getUUID(); 85 bool matches(UUID * uuid); 86 bool isValueHandle(uint16_t value_handle); 87 const le_characteristic_t * getCharacteristic(); 88 }; 89 90 class BLEService { 91 private: 92 le_service_t service; 93 UUID uuid; 94 public: 95 BLEService(); 96 BLEService(le_service_t service); 97 const UUID * getUUID(); 98 bool matches(UUID * uuid); 99 const le_service_t * getService(); 100 }; 101 102 class BLEDevice { 103 private: 104 uint16_t handle; 105 public: 106 BLEDevice(); 107 BLEDevice(uint16_t handle); 108 uint16_t getHandle(); 109 110 // discovery of services and characteristics 111 int discoverGATTServices(); 112 int discoverCharacteristicsForService(BLEService * service); 113 114 // read/write 115 int readCharacteristic(BLECharacteristic * characteristic); 116 int writeCharacteristic(BLECharacteristic * characteristic, uint8_t * data, uint16_t size); 117 int writeCharacteristicWithoutResponse(BLECharacteristic * characteristic, uint8_t * data, uint16_t size); 118 119 // subscribe/unsubscribe 120 int subscribeForNotifications(BLECharacteristic * characteristic); 121 int unsubscribeFromNotifications(BLECharacteristic * characteristic); 122 int subscribeForIndications(BLECharacteristic * characteristic); 123 int unsubscribeFromIndications(BLECharacteristic * characteristic); 124 }; 125 126 class BTstackManager { 127 public: 128 BTstackManager(void); 129 void setup(void); 130 void loop(void); 131 132 void setPublicBdAddr(bd_addr_t addr); 133 void enablePacketLogger(); 134 void enableDebugLogger(); 135 136 void setAdvData(uint16_t size, const uint8_t * data); 137 void iBeaconConfigure(UUID * uuid, uint16_t major_id, uint16_t minor_id, uint8_t measured_power = 0xc6); 138 void startAdvertising(); 139 void stopAdvertising(); 140 141 void bleStartScanning(); 142 void bleStopScanning(); 143 144 // connection management 145 void bleConnect(BD_ADDR_TYPE address_type, const uint8_t address[6], int timeout_ms); 146 void bleConnect(BD_ADDR_TYPE address_type, const char * address, int timeout_ms); 147 void bleConnect(BD_ADDR * address, int timeout_ms); 148 void bleConnect(BLEAdvertisement * advertisement, int timeout_ms); 149 void bleDisconnect(BLEDevice * device); 150 151 // discovery of services and characteristics 152 int discoverGATTServices(BLEDevice * device); 153 int discoverCharacteristicsForService(BLEDevice * peripheral, BLEService * service); 154 155 // read/write 156 int readCharacteristic(BLEDevice * device, BLECharacteristic * characteristic); 157 int writeCharacteristic(BLEDevice * device, BLECharacteristic * characteristic, uint8_t * data, uint16_t size); 158 int writeCharacteristicWithoutResponse(BLEDevice * device, BLECharacteristic * characteristic, uint8_t * data, uint16_t size); 159 160 // subscribe/unsubscribe notification and indications 161 int subscribeForNotifications(BLEDevice * device, BLECharacteristic * characteristic); 162 int unsubscribeFromNotifications(BLEDevice * device, BLECharacteristic * characteristic); 163 int subscribeForIndications(BLEDevice * device, BLECharacteristic * characteristic); 164 int unsubscribeFromIndications(BLEDevice * device, BLECharacteristic * characteristic); 165 166 // Callbacks 167 void setBLEAdvertisementCallback(void (*)(BLEAdvertisement * bleAdvertisement)); 168 void setBLEDeviceConnectedCallback(void (*)(BLEStatus status, BLEDevice * device)); 169 void setBLEDeviceDisconnectedCallback(void (*)(BLEDevice * device)); 170 void setGATTServiceDiscoveredCallback(void (*)(BLEStatus status, BLEDevice * device, BLEService * bleService)); 171 void setGATTCharacteristicDiscoveredCallback(void (*)(BLEStatus status, BLEDevice * device, BLECharacteristic * characteristic)); 172 void setGATTCharacteristicReadCallback(void (*)(BLEStatus status, BLEDevice * device, uint8_t * value, uint16_t length)); 173 void setGATTCharacteristicNotificationCallback(void (*)(BLEDevice * device, uint16_t value_handle, uint8_t* value, uint16_t length)); 174 void setGATTCharacteristicIndicationCallback(void (*)(BLEDevice * device, uint16_t value_handle, uint8_t* value, uint16_t length)); 175 void setGATTDoneCallback(void (*)(BLEStatus status, BLEDevice * device)); 176 177 void setGATTCharacteristicWrittenCallback(void (*)(BLEStatus status, BLEDevice * device)); 178 void setGATTCharacteristicSubscribedCallback(void (*)(BLEStatus status, BLEDevice * device)); 179 void setGATTCharacteristicUnsubscribedCallback(void (*)(BLEStatus status, BLEDevice * device)); 180 181 void setGATTCharacteristicRead(uint16_t (*)(uint16_t characteristic_id, uint8_t * buffer, uint16_t buffer_size)); 182 void setGATTCharacteristicWrite(int (*)(uint16_t characteristic_id, uint8_t *buffer, uint16_t buffer_size)); 183 184 void addGATTService(UUID * uuid); 185 uint16_t addGATTCharacteristic(UUID * uuid, uint16_t flags, const char * text); 186 uint16_t addGATTCharacteristic(UUID * uuid, uint16_t flags, uint8_t * data, uint16_t data_len); 187 uint16_t addGATTCharacteristicDynamic(UUID * uuid, uint16_t flags, uint16_t characteristic_id); 188 }; 189 190 extern BTstackManager BTstack;