1 /** 2 * Arduino Wrapper for BTstack 3 */ 4 #pragma once 5 6 #include "ble/att.h" 7 #include "utils.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 public: 61 BLEAdvertisement(uint8_t * event_packet); 62 BD_ADDR * getBdAddr(); 63 BD_ADDR_TYPE getBdAddrType(); 64 int getRssi(); 65 bool containsService(UUID * service); 66 bool nameHasPrefix(const char * namePrefix); 67 const uint8_t * getAdvData(); 68 bool isIBeacon(); 69 const UUID * getIBeaconUUID(); 70 uint16_t getIBeaconMajorID(); 71 uint16_t getIBecaonMinorID(); 72 uint8_t getiBeaconMeasuredPower(); 73 }; 74 75 class BLECharacteristic { 76 private: 77 le_characteristic_t characteristic; 78 UUID uuid; 79 public: 80 BLECharacteristic(); 81 BLECharacteristic(le_characteristic_t characteristic); 82 const UUID * getUUID(); 83 bool matches(UUID * uuid); 84 bool isValueHandle(uint16_t value_handle); 85 const le_characteristic_t * getCharacteristic(); 86 }; 87 88 class BLEService { 89 private: 90 le_service_t service; 91 UUID uuid; 92 public: 93 BLEService(); 94 BLEService(le_service_t service); 95 const UUID * getUUID(); 96 bool matches(UUID * uuid); 97 const le_service_t * getService(); 98 }; 99 100 class BLEDevice { 101 private: 102 uint16_t handle; 103 public: 104 BLEDevice(); 105 BLEDevice(uint16_t handle); 106 uint16_t getHandle(); 107 108 // discovery of services and characteristics 109 int discoverGATTServices(); 110 int discoverCharacteristicsForService(BLEService * service); 111 112 // read/write 113 int readCharacteristic(BLECharacteristic * characteristic); 114 int writeCharacteristic(BLECharacteristic * characteristic, uint8_t * data, uint16_t size); 115 int writeCharacteristicWithoutResponse(BLECharacteristic * characteristic, uint8_t * data, uint16_t size); 116 117 // subscribe/unsubscribe 118 int subscribeForNotifications(BLECharacteristic * characteristic); 119 int unsubscribeFromNotifications(BLECharacteristic * characteristic); 120 int subscribeForIndications(BLECharacteristic * characteristic); 121 int unsubscribeFromIndications(BLECharacteristic * characteristic); 122 }; 123 124 class BTstackManager { 125 public: 126 BTstackManager(void); 127 void setup(void); 128 void loop(void); 129 130 void setPublicBdAddr(bd_addr_t addr); 131 void enablePacketLogger(); 132 void enableDebugLogger(); 133 134 void setAdvData(uint16_t size, const uint8_t * data); 135 void iBeaconConfigure(UUID * uuid, uint16_t major_id, uint16_t minor_id, uint8_t measured_power = 0xc6); 136 void startAdvertising(); 137 void stopAdvertising(); 138 139 void bleStartScanning(); 140 void bleStopScanning(); 141 142 // connection management 143 void bleConnect(BD_ADDR_TYPE address_type, const uint8_t address[6], int timeout_ms); 144 void bleConnect(BD_ADDR_TYPE address_type, const char * address, int timeout_ms); 145 void bleConnect(BD_ADDR * address, int timeout_ms); 146 void bleConnect(BLEAdvertisement * advertisement, int timeout_ms); 147 void bleDisconnect(BLEDevice * device); 148 149 // discovery of services and characteristics 150 int discoverGATTServices(BLEDevice * device); 151 int discoverCharacteristicsForService(BLEDevice * peripheral, BLEService * service); 152 153 // read/write 154 int readCharacteristic(BLEDevice * device, BLECharacteristic * characteristic); 155 int writeCharacteristic(BLEDevice * device, BLECharacteristic * characteristic, uint8_t * data, uint16_t size); 156 int writeCharacteristicWithoutResponse(BLEDevice * device, BLECharacteristic * characteristic, uint8_t * data, uint16_t size); 157 158 // subscribe/unsubscribe notification and indications 159 int subscribeForNotifications(BLEDevice * device, BLECharacteristic * characteristic); 160 int unsubscribeFromNotifications(BLEDevice * device, BLECharacteristic * characteristic); 161 int subscribeForIndications(BLEDevice * device, BLECharacteristic * characteristic); 162 int unsubscribeFromIndications(BLEDevice * device, BLECharacteristic * characteristic); 163 164 // Callbacks 165 void setBLEAdvertisementCallback(void (*)(BLEAdvertisement * bleAdvertisement)); 166 void setBLEDeviceConnectedCallback(void (*)(BLEStatus status, BLEDevice * device)); 167 void setBLEDeviceDisconnectedCallback(void (*)(BLEDevice * device)); 168 void setGATTServiceDiscoveredCallback(void (*)(BLEStatus status, BLEDevice * device, BLEService * bleService)); 169 void setGATTCharacteristicDiscoveredCallback(void (*)(BLEStatus status, BLEDevice * device, BLECharacteristic * characteristic)); 170 void setGATTCharacteristicReadCallback(void (*)(BLEStatus status, BLEDevice * device, uint8_t * value, uint16_t length)); 171 void setGATTCharacteristicNotificationCallback(void (*)(BLEDevice * device, uint16_t value_handle, uint8_t* value, uint16_t length)); 172 void setGATTCharacteristicIndicationCallback(void (*)(BLEDevice * device, uint16_t value_handle, uint8_t* value, uint16_t length)); 173 void setGATTDoneCallback(void (*)(BLEStatus status, BLEDevice * device)); 174 175 void setGATTCharacteristicWrittenCallback(void (*)(BLEStatus status, BLEDevice * device)); 176 void setGATTCharacteristicSubscribedCallback(void (*)(BLEStatus status, BLEDevice * device)); 177 void setGATTCharacteristicUnsubscribedCallback(void (*)(BLEStatus status, BLEDevice * device)); 178 179 void setGATTCharacteristicRead(uint16_t (*)(uint16_t characteristic_id, uint8_t * buffer, uint16_t buffer_size)); 180 void setGATTCharacteristicWrite(int (*)(uint16_t characteristic_id, uint8_t *buffer, uint16_t buffer_size)); 181 182 void addGATTService(UUID * uuid); 183 uint16_t addGATTCharacteristic(UUID * uuid, uint16_t flags, const char * text); 184 uint16_t addGATTCharacteristic(UUID * uuid, uint16_t flags, uint8_t * data, uint16_t data_len); 185 uint16_t addGATTCharacteristicDynamic(UUID * uuid, uint16_t flags, uint16_t characteristic_id); 186 }; 187 188 extern BTstackManager BTstack;