18caefee3SMatthias Ringwald /** 28caefee3SMatthias Ringwald * Arduino Wrapper for BTstack 38caefee3SMatthias Ringwald */ 478707112SMatthias Ringwald #ifndef __ARDUINO_BTSTACK_H 578707112SMatthias Ringwald #define __ARDUINO_BTSTACK_H 678707112SMatthias Ringwald 778707112SMatthias Ringwald #if defined __cplusplus 878707112SMatthias Ringwald extern "C" { 978707112SMatthias Ringwald #endif 108caefee3SMatthias Ringwald 11591423b2SMatthias Ringwald #include "ble/att_db.h" 12eb886013SMatthias Ringwald #include "btstack_util.h" 133edc84c5SMatthias Ringwald #include "ble/gatt_client.h" 148caefee3SMatthias Ringwald #include "hci.h" 158caefee3SMatthias Ringwald #include <stdint.h> 168caefee3SMatthias Ringwald 178caefee3SMatthias Ringwald typedef enum BLEStatus { 188caefee3SMatthias Ringwald BLE_STATUS_OK, 198caefee3SMatthias Ringwald BLE_STATUS_DONE, // e.g. for service or characteristic discovery done 208caefee3SMatthias Ringwald BLE_STATUS_CONNECTION_TIMEOUT, 218caefee3SMatthias Ringwald BLE_STATUS_CONNECTION_ERROR, 228caefee3SMatthias Ringwald BLE_STATUS_OTHER_ERROR 238caefee3SMatthias Ringwald } BLEStatus; 248caefee3SMatthias Ringwald 258caefee3SMatthias Ringwald typedef void (*btstack_packet_handler_t) (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size); 268caefee3SMatthias Ringwald 278caefee3SMatthias Ringwald class UUID { 288caefee3SMatthias Ringwald private: 298caefee3SMatthias Ringwald uint8_t uuid[16]; 308caefee3SMatthias Ringwald public: 318caefee3SMatthias Ringwald UUID(); 328caefee3SMatthias Ringwald UUID(const uint8_t uuid[16]); 338caefee3SMatthias Ringwald UUID(const char * uuidStr); 348caefee3SMatthias Ringwald const char * getUuidString() const; 358caefee3SMatthias Ringwald const char * getUuid128String() const; 368caefee3SMatthias Ringwald const uint8_t * getUuid(void) const; 378caefee3SMatthias Ringwald bool matches(UUID *uuid) const; 388caefee3SMatthias Ringwald }; 398caefee3SMatthias Ringwald 408caefee3SMatthias Ringwald typedef enum BD_ADDR_TYPE { 418caefee3SMatthias Ringwald PUBLIC_ADDRESS = 0, 428caefee3SMatthias Ringwald PRIVAT_ADDRESS 438caefee3SMatthias Ringwald } BD_ADDR_TYPE; 448caefee3SMatthias Ringwald 458caefee3SMatthias Ringwald class BD_ADDR { 468caefee3SMatthias Ringwald private: 478caefee3SMatthias Ringwald uint8_t address[6]; 488caefee3SMatthias Ringwald BD_ADDR_TYPE address_type; 498caefee3SMatthias Ringwald public: 508caefee3SMatthias Ringwald BD_ADDR(); 518caefee3SMatthias Ringwald BD_ADDR(const char * address_string, BD_ADDR_TYPE address_type = PUBLIC_ADDRESS); 528caefee3SMatthias Ringwald BD_ADDR(const uint8_t address[6], BD_ADDR_TYPE address_type = PUBLIC_ADDRESS); 538caefee3SMatthias Ringwald const uint8_t * getAddress(); 548caefee3SMatthias Ringwald const char * getAddressString(); 558caefee3SMatthias Ringwald BD_ADDR_TYPE getAddressType(); 568caefee3SMatthias Ringwald }; 578caefee3SMatthias Ringwald 588caefee3SMatthias Ringwald class BLEAdvertisement { 598caefee3SMatthias Ringwald private: 608caefee3SMatthias Ringwald uint8_t advertising_event_type; 618caefee3SMatthias Ringwald uint8_t rssi; 628caefee3SMatthias Ringwald uint8_t data_length; 638caefee3SMatthias Ringwald uint8_t data[10 + LE_ADVERTISING_DATA_SIZE]; 648caefee3SMatthias Ringwald BD_ADDR bd_addr; 65f5054c00SMatthias Ringwald UUID * iBeacon_UUID; 668caefee3SMatthias Ringwald public: 678caefee3SMatthias Ringwald BLEAdvertisement(uint8_t * event_packet); 68f5054c00SMatthias Ringwald ~BLEAdvertisement(); 698caefee3SMatthias Ringwald BD_ADDR * getBdAddr(); 708caefee3SMatthias Ringwald BD_ADDR_TYPE getBdAddrType(); 718caefee3SMatthias Ringwald int getRssi(); 728caefee3SMatthias Ringwald bool containsService(UUID * service); 738caefee3SMatthias Ringwald bool nameHasPrefix(const char * namePrefix); 748caefee3SMatthias Ringwald const uint8_t * getAdvData(); 758caefee3SMatthias Ringwald bool isIBeacon(); 768caefee3SMatthias Ringwald const UUID * getIBeaconUUID(); 778caefee3SMatthias Ringwald uint16_t getIBeaconMajorID(); 788caefee3SMatthias Ringwald uint16_t getIBecaonMinorID(); 798caefee3SMatthias Ringwald uint8_t getiBeaconMeasuredPower(); 808caefee3SMatthias Ringwald }; 818caefee3SMatthias Ringwald 828caefee3SMatthias Ringwald class BLECharacteristic { 838caefee3SMatthias Ringwald private: 84d25c33e5SMatthias Ringwald gatt_client_characteristic_t characteristic; 858caefee3SMatthias Ringwald UUID uuid; 868caefee3SMatthias Ringwald public: 878caefee3SMatthias Ringwald BLECharacteristic(); 88d25c33e5SMatthias Ringwald BLECharacteristic(gatt_client_characteristic_t characteristic); 898caefee3SMatthias Ringwald const UUID * getUUID(); 908caefee3SMatthias Ringwald bool matches(UUID * uuid); 918caefee3SMatthias Ringwald bool isValueHandle(uint16_t value_handle); 92d25c33e5SMatthias Ringwald const gatt_client_characteristic_t * getCharacteristic(); 938caefee3SMatthias Ringwald }; 948caefee3SMatthias Ringwald 958caefee3SMatthias Ringwald class BLEService { 968caefee3SMatthias Ringwald private: 97d25c33e5SMatthias Ringwald gatt_client_service_t service; 988caefee3SMatthias Ringwald UUID uuid; 998caefee3SMatthias Ringwald public: 1008caefee3SMatthias Ringwald BLEService(); 101d25c33e5SMatthias Ringwald BLEService(gatt_client_service_t service); 1028caefee3SMatthias Ringwald const UUID * getUUID(); 1038caefee3SMatthias Ringwald bool matches(UUID * uuid); 104d25c33e5SMatthias Ringwald const gatt_client_service_t * getService(); 1058caefee3SMatthias Ringwald }; 1068caefee3SMatthias Ringwald 1078caefee3SMatthias Ringwald class BLEDevice { 1088caefee3SMatthias Ringwald private: 109*591e5551SMatthias Ringwald hci_con_handle_t handle; 1108caefee3SMatthias Ringwald public: 1118caefee3SMatthias Ringwald BLEDevice(); 112*591e5551SMatthias Ringwald BLEDevice(hci_con_handle_t handle); 113*591e5551SMatthias Ringwald hci_con_handle_t getHandle(); 1148caefee3SMatthias Ringwald 1158caefee3SMatthias Ringwald // discovery of services and characteristics 1168caefee3SMatthias Ringwald int discoverGATTServices(); 1178caefee3SMatthias Ringwald int discoverCharacteristicsForService(BLEService * service); 1188caefee3SMatthias Ringwald 1198caefee3SMatthias Ringwald // read/write 1208caefee3SMatthias Ringwald int readCharacteristic(BLECharacteristic * characteristic); 1218caefee3SMatthias Ringwald int writeCharacteristic(BLECharacteristic * characteristic, uint8_t * data, uint16_t size); 1228caefee3SMatthias Ringwald int writeCharacteristicWithoutResponse(BLECharacteristic * characteristic, uint8_t * data, uint16_t size); 1238caefee3SMatthias Ringwald 1248caefee3SMatthias Ringwald // subscribe/unsubscribe 1258caefee3SMatthias Ringwald int subscribeForNotifications(BLECharacteristic * characteristic); 1268caefee3SMatthias Ringwald int unsubscribeFromNotifications(BLECharacteristic * characteristic); 1278caefee3SMatthias Ringwald int subscribeForIndications(BLECharacteristic * characteristic); 1288caefee3SMatthias Ringwald int unsubscribeFromIndications(BLECharacteristic * characteristic); 1298caefee3SMatthias Ringwald }; 1308caefee3SMatthias Ringwald 1318caefee3SMatthias Ringwald class BTstackManager { 1328caefee3SMatthias Ringwald public: 1338caefee3SMatthias Ringwald BTstackManager(void); 1348caefee3SMatthias Ringwald void setup(void); 1358caefee3SMatthias Ringwald void loop(void); 1368caefee3SMatthias Ringwald 1378caefee3SMatthias Ringwald void setPublicBdAddr(bd_addr_t addr); 1388caefee3SMatthias Ringwald void enablePacketLogger(); 1398caefee3SMatthias Ringwald void enableDebugLogger(); 1408caefee3SMatthias Ringwald 1418caefee3SMatthias Ringwald void setAdvData(uint16_t size, const uint8_t * data); 1428caefee3SMatthias Ringwald void iBeaconConfigure(UUID * uuid, uint16_t major_id, uint16_t minor_id, uint8_t measured_power = 0xc6); 1438caefee3SMatthias Ringwald void startAdvertising(); 1448caefee3SMatthias Ringwald void stopAdvertising(); 1458caefee3SMatthias Ringwald 1468caefee3SMatthias Ringwald void bleStartScanning(); 1478caefee3SMatthias Ringwald void bleStopScanning(); 1488caefee3SMatthias Ringwald 1498caefee3SMatthias Ringwald // connection management 1508caefee3SMatthias Ringwald void bleConnect(BD_ADDR_TYPE address_type, const uint8_t address[6], int timeout_ms); 1518caefee3SMatthias Ringwald void bleConnect(BD_ADDR_TYPE address_type, const char * address, int timeout_ms); 1528caefee3SMatthias Ringwald void bleConnect(BD_ADDR * address, int timeout_ms); 1538caefee3SMatthias Ringwald void bleConnect(BLEAdvertisement * advertisement, int timeout_ms); 1548caefee3SMatthias Ringwald void bleDisconnect(BLEDevice * device); 1558caefee3SMatthias Ringwald 1568caefee3SMatthias Ringwald // discovery of services and characteristics 1578caefee3SMatthias Ringwald int discoverGATTServices(BLEDevice * device); 1588caefee3SMatthias Ringwald int discoverCharacteristicsForService(BLEDevice * peripheral, BLEService * service); 1598caefee3SMatthias Ringwald 1608caefee3SMatthias Ringwald // read/write 1618caefee3SMatthias Ringwald int readCharacteristic(BLEDevice * device, BLECharacteristic * characteristic); 1628caefee3SMatthias Ringwald int writeCharacteristic(BLEDevice * device, BLECharacteristic * characteristic, uint8_t * data, uint16_t size); 1638caefee3SMatthias Ringwald int writeCharacteristicWithoutResponse(BLEDevice * device, BLECharacteristic * characteristic, uint8_t * data, uint16_t size); 1648caefee3SMatthias Ringwald 1658caefee3SMatthias Ringwald // subscribe/unsubscribe notification and indications 1668caefee3SMatthias Ringwald int subscribeForNotifications(BLEDevice * device, BLECharacteristic * characteristic); 1678caefee3SMatthias Ringwald int unsubscribeFromNotifications(BLEDevice * device, BLECharacteristic * characteristic); 1688caefee3SMatthias Ringwald int subscribeForIndications(BLEDevice * device, BLECharacteristic * characteristic); 1698caefee3SMatthias Ringwald int unsubscribeFromIndications(BLEDevice * device, BLECharacteristic * characteristic); 1708caefee3SMatthias Ringwald 1718caefee3SMatthias Ringwald // Callbacks 1728caefee3SMatthias Ringwald void setBLEAdvertisementCallback(void (*)(BLEAdvertisement * bleAdvertisement)); 1738caefee3SMatthias Ringwald void setBLEDeviceConnectedCallback(void (*)(BLEStatus status, BLEDevice * device)); 1748caefee3SMatthias Ringwald void setBLEDeviceDisconnectedCallback(void (*)(BLEDevice * device)); 1758caefee3SMatthias Ringwald void setGATTServiceDiscoveredCallback(void (*)(BLEStatus status, BLEDevice * device, BLEService * bleService)); 1768caefee3SMatthias Ringwald void setGATTCharacteristicDiscoveredCallback(void (*)(BLEStatus status, BLEDevice * device, BLECharacteristic * characteristic)); 1778caefee3SMatthias Ringwald void setGATTCharacteristicReadCallback(void (*)(BLEStatus status, BLEDevice * device, uint8_t * value, uint16_t length)); 1788caefee3SMatthias Ringwald void setGATTCharacteristicNotificationCallback(void (*)(BLEDevice * device, uint16_t value_handle, uint8_t* value, uint16_t length)); 1798caefee3SMatthias Ringwald void setGATTCharacteristicIndicationCallback(void (*)(BLEDevice * device, uint16_t value_handle, uint8_t* value, uint16_t length)); 1808caefee3SMatthias Ringwald void setGATTDoneCallback(void (*)(BLEStatus status, BLEDevice * device)); 1818caefee3SMatthias Ringwald 1828caefee3SMatthias Ringwald void setGATTCharacteristicWrittenCallback(void (*)(BLEStatus status, BLEDevice * device)); 1838caefee3SMatthias Ringwald void setGATTCharacteristicSubscribedCallback(void (*)(BLEStatus status, BLEDevice * device)); 1848caefee3SMatthias Ringwald void setGATTCharacteristicUnsubscribedCallback(void (*)(BLEStatus status, BLEDevice * device)); 1858caefee3SMatthias Ringwald 1868caefee3SMatthias Ringwald void setGATTCharacteristicRead(uint16_t (*)(uint16_t characteristic_id, uint8_t * buffer, uint16_t buffer_size)); 1878caefee3SMatthias Ringwald void setGATTCharacteristicWrite(int (*)(uint16_t characteristic_id, uint8_t *buffer, uint16_t buffer_size)); 1888caefee3SMatthias Ringwald 1898caefee3SMatthias Ringwald void addGATTService(UUID * uuid); 1908caefee3SMatthias Ringwald uint16_t addGATTCharacteristic(UUID * uuid, uint16_t flags, const char * text); 1918caefee3SMatthias Ringwald uint16_t addGATTCharacteristic(UUID * uuid, uint16_t flags, uint8_t * data, uint16_t data_len); 1928caefee3SMatthias Ringwald uint16_t addGATTCharacteristicDynamic(UUID * uuid, uint16_t flags, uint16_t characteristic_id); 1938caefee3SMatthias Ringwald }; 1948caefee3SMatthias Ringwald 1958caefee3SMatthias Ringwald extern BTstackManager BTstack; 19678707112SMatthias Ringwald 19778707112SMatthias Ringwald #if defined __cplusplus 19878707112SMatthias Ringwald } 19978707112SMatthias Ringwald #endif 20078707112SMatthias Ringwald 20178707112SMatthias Ringwald #endif // __ARDUINO_BTSTACK_H