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