/* * BLEDevice.h * * Created on: Mar 16, 2017 * Author: kolban * * Modified on: Feb 18, 2025 * Author: lucasssvaz (based on kolban's and h2zero's work) * Description: Added support for NimBLE */ #ifndef MAIN_BLEDevice_H_ #define MAIN_BLEDevice_H_ #include "soc/soc_caps.h" #include "sdkconfig.h" #if defined(SOC_BLE_SUPPORTED) || defined(CONFIG_ESP_HOSTED_ENABLE_BT_NIMBLE) #if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) /*************************************************************************** * Common includes * ***************************************************************************/ #include #if defined(SOC_BLE_SUPPORTED) #include #else // For ESP32-P4 and other chips without native BLE support // Define minimal types needed for interface compatibility typedef int esp_power_level_t; typedef int esp_ble_power_type_t; #define ESP_BLE_PWR_TYPE_DEFAULT 0 #define ESP_PWR_LVL_N12 0 #endif #include "WString.h" #include "BLEServer.h" #include "BLEClient.h" #include "BLEUtils.h" #include "BLEScan.h" #include "BLEAdvertising.h" #include "BLESecurity.h" #include "BLEAddress.h" #include "BLEUtils.h" #include "BLEUUID.h" #include "BLEAdvertisedDevice.h" /*************************************************************************** * Common definitions * ***************************************************************************/ enum class BLEStack { BLUEDROID, NIMBLE, UNKNOWN }; /*************************************************************************** * Bluedroid includes * ***************************************************************************/ #if defined(CONFIG_BLUEDROID_ENABLED) #include #include #include #endif /*************************************************************************** * NimBLE includes and definitions * ***************************************************************************/ #if defined(CONFIG_NIMBLE_ENABLED) #include #define ESP_GATT_IF_NONE BLE_HS_CONN_HANDLE_NONE // Hosted HCI transport implementation is provided in BLEHostedHCI.cpp // and is automatically linked when building for ESP32-P4 // NimBLE configuration compatibility macros #if defined(CONFIG_SCAN_DUPLICATE_BY_DEVICE_ADDR) && !defined(CONFIG_BTDM_SCAN_DUPL_TYPE_DEVICE) #define CONFIG_BTDM_SCAN_DUPL_TYPE_DEVICE CONFIG_SCAN_DUPLICATE_BY_DEVICE_ADDR #endif #if defined(CONFIG_SCAN_DUPLICATE_BY_ADV_DATA) && !defined(CONFIG_BTDM_SCAN_DUPL_TYPE_DATA) #define CONFIG_BTDM_SCAN_DUPL_TYPE_DATA CONFIG_SCAN_DUPLICATE_BY_ADV_DATA #endif #if defined(CONFIG_SCAN_DUPLICATE_BY_ADV_DATA_AND_DEVICE_ADDR) && !defined(CONFIG_BTDM_SCAN_DUPL_TYPE_DATA_DEVICE) #define CONFIG_BTDM_SCAN_DUPL_TYPE_DATA_DEVICE CONFIG_SCAN_DUPLICATE_BY_ADV_DATA_AND_DEVICE_ADDR #endif #if defined(CONFIG_SCAN_DUPLICATE_TYPE) && !defined(CONFIG_BTDM_SCAN_DUPL_TYPE) #define CONFIG_BTDM_SCAN_DUPL_TYPE CONFIG_SCAN_DUPLICATE_TYPE #endif #if defined(CONFIG_BT_CTRL_SCAN_DUPL_TYPE) && !defined(CONFIG_BTDM_SCAN_DUPL_TYPE) #define CONFIG_BTDM_SCAN_DUPL_TYPE CONFIG_BT_CTRL_SCAN_DUPL_TYPE #endif #if defined(CONFIG_BT_LE_SCAN_DUPL_TYPE) && !defined(CONFIG_BTDM_SCAN_DUPL_TYPE) #define CONFIG_BTDM_SCAN_DUPL_TYPE CONFIG_BT_LE_SCAN_DUPL_TYPE #endif #if defined(CONFIG_DUPLICATE_SCAN_CACHE_SIZE) && !defined(CONFIG_BTDM_SCAN_DUPL_CACHE_SIZE) #define CONFIG_BTDM_SCAN_DUPL_CACHE_SIZE CONFIG_DUPLICATE_SCAN_CACHE_SIZE #endif #if defined(CONFIG_BT_CTRL_SCAN_DUPL_CACHE_SIZE) && !defined(CONFIG_BTDM_SCAN_DUPL_CACHE_SIZE) #define CONFIG_BTDM_SCAN_DUPL_CACHE_SIZE CONFIG_BT_CTRL_SCAN_DUPL_CACHE_SIZE #endif #if defined(CONFIG_BT_LE_LL_DUP_SCAN_LIST_COUNT) && !defined(CONFIG_BTDM_SCAN_DUPL_CACHE_SIZE) #define CONFIG_BTDM_SCAN_DUPL_CACHE_SIZE CONFIG_BT_LE_LL_DUP_SCAN_LIST_COUNT #endif #if defined(CONFIG_NIMBLE_MAX_CONNECTIONS) && !defined(CONFIG_BT_NIMBLE_MAX_CONNECTIONS) #define CONFIG_BT_NIMBLE_MAX_CONNECTIONS CONFIG_NIMBLE_MAX_CONNECTIONS #endif #endif /*************************************************************************** * Forward declarations * ***************************************************************************/ class BLEAddress; class BLEDeviceCallbacks; class BLESecurityCallbacks; class BLEServer; class BLEScan; class BLEAdvertising; class BLEClient; class BLESecurity; /*************************************************************************** * Bluedroid type definitions * ***************************************************************************/ #if defined(CONFIG_BLUEDROID_ENABLED) typedef void (*gap_event_handler)(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param); typedef void (*gattc_event_handler)(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param); typedef void (*gatts_event_handler)(esp_gatts_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gatts_cb_param_t *param); #endif /*************************************************************************** * NimBLE type definitions and externals * ***************************************************************************/ #if defined(CONFIG_NIMBLE_ENABLED) extern "C" void ble_store_config_init(void); typedef int (*gap_event_handler)(struct ble_gap_event *event, void *param); #endif class BLEDevice { public: /*************************************************************************** * Common public properties * ***************************************************************************/ static uint16_t m_appId; static uint16_t m_localMTU; static gap_event_handler m_customGapHandler; /*************************************************************************** * Bluedroid public properties * ***************************************************************************/ #if defined(CONFIG_BLUEDROID_ENABLED) static gattc_event_handler m_customGattcHandler; static gatts_event_handler m_customGattsHandler; #endif /*************************************************************************** * Common public declarations * ***************************************************************************/ static BLEClient *createClient(); static BLEServer *createServer(); static BLEAddress getAddress(); static BLEServer *getServer(); static BLEScan *getScan(); static String getValue(BLEAddress bdAddress, BLEUUID serviceUUID, BLEUUID characteristicUUID); static void init(String deviceName); static void setPower(esp_power_level_t powerLevel, esp_ble_power_type_t powerType = ESP_BLE_PWR_TYPE_DEFAULT); static int getPower(esp_ble_power_type_t powerType = ESP_BLE_PWR_TYPE_DEFAULT); static void setValue(BLEAddress bdAddress, BLEUUID serviceUUID, BLEUUID characteristicUUID, String value); static String toString(); static void whiteListAdd(BLEAddress address); static void whiteListRemove(BLEAddress address); static void setSecurityCallbacks(BLESecurityCallbacks *pCallbacks); static esp_err_t setMTU(uint16_t mtu); static uint16_t getMTU(); static bool getInitialized(); static BLEAdvertising *getAdvertising(); static void startAdvertising(); static void stopAdvertising(); static std::map getPeerDevices(bool client); static void addPeerDevice(void *peer, bool is_client, uint16_t conn_id); static void updatePeerDevice(void *peer, bool _client, uint16_t conn_id); static void removePeerDevice(uint16_t conn_id, bool client); static BLEClient *getClientByID(uint16_t conn_id); static BLEClient *getClientByAddress(BLEAddress address); static BLEClient *getClientByGattIf(uint16_t conn_id); static void setCustomGapHandler(gap_event_handler handler); static void deinit(bool release_memory = false); static BLEStack getBLEStack(); static String getBLEStackString(); static bool isHostedBLE(); /*************************************************************************** * Bluedroid public declarations * ***************************************************************************/ #if defined(CONFIG_BLUEDROID_ENABLED) static void setCustomGattcHandler(gattc_event_handler handler); static void setCustomGattsHandler(gatts_event_handler handler); #endif /*************************************************************************** * NimBLE public declarations * ***************************************************************************/ #if defined(CONFIG_NIMBLE_ENABLED) static void onReset(int reason); static void onSync(void); static void host_task(void *param); static bool setOwnAddrType(uint8_t type); static bool setOwnAddr(BLEAddress &addr); static bool setOwnAddr(uint8_t *addr); static void setDeviceCallbacks(BLEDeviceCallbacks *cb); static bool onWhiteList(BLEAddress &address); #endif private: friend class BLEClient; friend class BLEScan; friend class BLEServer; friend class BLECharacteristic; friend class BLEAdvertising; /*************************************************************************** * Common private properties * ***************************************************************************/ static BLEServer *m_pServer; static BLEScan *m_pScan; static BLEClient *m_pClient; static BLESecurityCallbacks *m_securityCallbacks; static BLEAdvertising *m_bleAdvertising; static std::map m_connectedClientsMap; static portMUX_TYPE mux; /*************************************************************************** * NimBLE private properties * ***************************************************************************/ #if defined(CONFIG_NIMBLE_ENABLED) static uint8_t m_ownAddrType; static bool m_synced; static std::vector m_whiteList; static BLEDeviceCallbacks defaultDeviceCallbacks; static BLEDeviceCallbacks *m_pDeviceCallbacks; static ble_gap_event_listener m_listener; #endif /*************************************************************************** * Bluedroid private declarations * ***************************************************************************/ #if defined(CONFIG_BLUEDROID_ENABLED) static esp_gatt_if_t getGattcIF(); static void gattClientEventHandler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param); static void gattServerEventHandler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param); static void gapEventHandler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param); #endif }; // class BLE /*************************************************************************** * NimBLE specific classes * ***************************************************************************/ #if defined(CONFIG_NIMBLE_ENABLED) class BLEDeviceCallbacks { public: virtual ~BLEDeviceCallbacks(){}; virtual int onStoreStatus(struct ble_store_status_event *event, void *arg); }; #endif #endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED || CONFIG_ESP_HOSTED_ENABLE_BT_NIMBLE */ #endif /* MAIN_BLEDevice_H_ */