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