18#ifndef NIMBLE_CPP_DEVICE_H_ 
   19#define NIMBLE_CPP_DEVICE_H_ 
   21#include "syscfg/syscfg.h" 
   22#if CONFIG_BT_NIMBLE_ENABLED 
   24#  ifndef CONFIG_IDF_TARGET_ESP32P4 
   29# if defined(CONFIG_NIMBLE_CPP_IDF) 
   30#  include <host/ble_gap.h> 
   32#  include <nimble/nimble/host/include/host/ble_gap.h> 
   43# if MYNEWT_VAL(BLE_ROLE_CENTRAL) 
   48# if MYNEWT_VAL(BLE_ROLE_OBSERVER) 
   52# if MYNEWT_VAL(BLE_ROLE_BROADCASTER) 
   53#  if MYNEWT_VAL(BLE_EXT_ADV) 
   54class NimBLEExtAdvertising;
 
   60# if MYNEWT_VAL(BLE_ROLE_PERIPHERAL) 
   62#  if MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM) 
   63class NimBLEL2CAPServer;
 
   67# if MYNEWT_VAL(BLE_ROLE_PERIPHERAL) || MYNEWT_VAL(BLE_ROLE_CENTRAL) 
   74# define BLEDevice                    NimBLEDevice 
   75# define BLEClient                    NimBLEClient 
   76# define BLERemoteService             NimBLERemoteService 
   77# define BLERemoteCharacteristic      NimBLERemoteCharacteristic 
   78# define BLERemoteDescriptor          NimBLERemoteDescriptor 
   79# define BLEAdvertisedDevice          NimBLEAdvertisedDevice 
   80# define BLEScan                      NimBLEScan 
   81# define BLEUUID                      NimBLEUUID 
   82# define BLEAddress                   NimBLEAddress 
   83# define BLEUtils                     NimBLEUtils 
   84# define BLEClientCallbacks           NimBLEClientCallbacks 
   85# define BLEAdvertisedDeviceCallbacks NimBLEScanCallbacks 
   86# define BLEScanResults               NimBLEScanResults 
   87# define BLEServer                    NimBLEServer 
   88# define BLEService                   NimBLEService 
   89# define BLECharacteristic            NimBLECharacteristic 
   90# define BLEAdvertising               NimBLEAdvertising 
   91# define BLEServerCallbacks           NimBLEServerCallbacks 
   92# define BLECharacteristicCallbacks   NimBLECharacteristicCallbacks 
   93# define BLEAdvertisementData         NimBLEAdvertisementData 
   94# define BLEDescriptor                NimBLEDescriptor 
   95# define BLE2904                      NimBLE2904 
   96# define BLEDescriptorCallbacks       NimBLEDescriptorCallbacks 
   97# define BLEBeacon                    NimBLEBeacon 
   98# define BLEEddystoneTLM              NimBLEEddystoneTLM 
   99# define BLEEddystoneURL              NimBLEEddystoneURL 
  100# define BLEConnInfo                  NimBLEConnInfo 
  101# define BLEL2CAPServer               NimBLEL2CAPServer 
  102# define BLEL2CAPService              NimBLEL2CAPService 
  103# define BLEL2CAPServiceCallbacks     NimBLEL2CAPServiceCallbacks 
  104# define BLEL2CAPClient               NimBLEL2CAPClient 
  105# define BLEL2CAPClientCallbacks      NimBLEL2CAPClientCallbacks 
  106# define BLEL2CAPChannel              NimBLEL2CAPChannel 
  107# define BLEL2CAPChannelCallbacks     NimBLEL2CAPChannelCallbacks 
  109enum class NimBLETxPowerType { All = 0, Advertise = 1, Scan = 2, Connection = 3 };
 
  111typedef int (*gap_event_handler)(ble_gap_event* event, 
void* arg);
 
  118    static bool          init(
const std::string& deviceName);
 
  119    static bool          deinit(
bool clearAll = 
false);
 
  133    static void          setScanDuplicateCacheSize(uint16_t cacheSize);
 
  134    static void          setScanFilterMode(uint8_t type);
 
  135    static void          setScanDuplicateCacheResetTime(uint16_t time);
 
  144    static bool          startSecurity(uint16_t connHandle, 
int* rcPtr = 
nullptr);
 
  145    static bool          setMTU(uint16_t mtu);
 
  147    static void          onReset(
int reason);
 
  150    static int           getPower(NimBLETxPowerType type = NimBLETxPowerType::All);
 
  151    static bool          setPower(int8_t dbm, NimBLETxPowerType type = NimBLETxPowerType::All);
 
  152    static bool          setDefaultPhy(uint8_t txPhyMask, uint8_t rxPhyMask);
 
  155#  ifndef CONFIG_IDF_TARGET_ESP32P4 
  156    static esp_power_level_t getPowerLevel(esp_ble_power_type_t powerType = ESP_BLE_PWR_TYPE_DEFAULT);
 
  157    static bool setPowerLevel(esp_power_level_t powerLevel, esp_ble_power_type_t powerType = ESP_BLE_PWR_TYPE_DEFAULT);
 
  161# if MYNEWT_VAL(BLE_ROLE_OBSERVER) 
  162    static NimBLEScan* getScan();
 
  165# if MYNEWT_VAL(BLE_ROLE_PERIPHERAL) 
  166    static NimBLEServer* createServer();
 
  167    static NimBLEServer* getServer();
 
  168#  if MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM) 
  169    static NimBLEL2CAPServer* createL2CAPServer();
 
  170    static NimBLEL2CAPServer* getL2CAPServer();
 
  174# if MYNEWT_VAL(BLE_ROLE_PERIPHERAL) || MYNEWT_VAL(BLE_ROLE_CENTRAL) 
  175    static bool injectConfirmPasskey(
const NimBLEConnInfo& peerInfo, 
bool accept);
 
  176    static bool injectPassKey(
const NimBLEConnInfo& peerInfo, uint32_t pin);
 
  179# if MYNEWT_VAL(BLE_ROLE_BROADCASTER) 
  180#  if MYNEWT_VAL(BLE_EXT_ADV) 
  181    static NimBLEExtAdvertising* getAdvertising();
 
  182    static bool                  startAdvertising(uint8_t instId, 
int duration = 0, 
int maxEvents = 0);
 
  183    static bool                  stopAdvertising(uint8_t instId);
 
  184    static bool                  stopAdvertising();
 
  186#  if !MYNEWT_VAL(BLE_EXT_ADV) || defined(_DOXYGEN_) 
  188    static bool               startAdvertising(uint32_t duration = 0);
 
  189    static bool               stopAdvertising();
 
  193# if MYNEWT_VAL(BLE_ROLE_CENTRAL) 
  194    static NimBLEClient*              createClient();
 
  195    static NimBLEClient*              createClient(
const NimBLEAddress& peerAddress);
 
  196    static bool                       deleteClient(NimBLEClient* pClient);
 
  197    static NimBLEClient*              getClientByHandle(uint16_t connHandle);
 
  198    static NimBLEClient*              getClientByPeerAddress(
const NimBLEAddress& peerAddress);
 
  199    static NimBLEClient*              getDisconnectedClient();
 
  200    static size_t                     getCreatedClientCount();
 
  201    static std::vector<NimBLEClient*> getConnectedClients();
 
  204# if MYNEWT_VAL(BLE_ROLE_CENTRAL) || MYNEWT_VAL(BLE_ROLE_PERIPHERAL) 
  206    static int           getNumBonds();
 
  208    static bool          deleteAllBonds();
 
  213    static bool                       m_synced;
 
  214    static bool                       m_initialized;
 
  215    static uint32_t                   m_passkey;
 
  216    static ble_gap_event_listener     m_listener;
 
  217    static uint8_t                    m_ownAddrType;
 
  218    static std::vector<NimBLEAddress> m_whiteList;
 
  222# if MYNEWT_VAL(BLE_ROLE_OBSERVER) 
  223    static NimBLEScan* m_pScan;
 
  226# if MYNEWT_VAL(BLE_ROLE_PERIPHERAL) 
  227    static NimBLEServer* m_pServer;
 
  228#  if MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM) 
  229    static NimBLEL2CAPServer* m_pL2CAPServer;
 
  233# if MYNEWT_VAL(BLE_ROLE_BROADCASTER) 
  234#  if MYNEWT_VAL(BLE_EXT_ADV) 
  235    static NimBLEExtAdvertising* m_bleAdvertising;
 
  241# if MYNEWT_VAL(BLE_ROLE_CENTRAL) 
  242    static std::array<NimBLEClient*, MYNEWT_VAL(BLE_MAX_CONNECTIONS)> m_pClients;
 
  246#  if CONFIG_BTDM_BLE_SCAN_DUPL || CONFIG_BT_LE_SCAN_DUPL 
  247    static uint16_t m_scanDuplicateSize;
 
  248    static uint8_t  m_scanFilterMode;
 
  249    static uint16_t m_scanDuplicateResetTime;
 
  253# if MYNEWT_VAL(BLE_ROLE_CENTRAL) 
  254    friend class NimBLEClient;
 
  257# if MYNEWT_VAL(BLE_ROLE_OBSERVER) 
  258    friend class NimBLEScan;
 
  261# if MYNEWT_VAL(BLE_ROLE_PERIPHERAL) 
  262    friend class NimBLEServer;
 
  263    friend class NimBLECharacteristic;
 
  266# if MYNEWT_VAL(BLE_ROLE_BROADCASTER) 
  268#  if MYNEWT_VAL(BLE_EXT_ADV) 
  269    friend class NimBLEExtAdvertising;
 
  270    friend class NimBLEExtAdvertisement;
 
 
  275# if MYNEWT_VAL(BLE_ROLE_CENTRAL) 
  276#  include "NimBLEClient.h" 
  277#  include "NimBLERemoteService.h" 
  278#  include "NimBLERemoteCharacteristic.h" 
  279#  include "NimBLERemoteDescriptor.h" 
  282# if MYNEWT_VAL(BLE_ROLE_OBSERVER) 
  283#  include "NimBLEScan.h" 
  286# if MYNEWT_VAL(BLE_ROLE_PERIPHERAL) 
  287#  include "NimBLEServer.h" 
  288#  include "NimBLEService.h" 
  289#  include "NimBLECharacteristic.h" 
  290#  include "NimBLEDescriptor.h" 
  291#  if MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM) 
  292#   include "NimBLEL2CAPServer.h" 
  293#   include "NimBLEL2CAPChannel.h" 
  297# if MYNEWT_VAL(BLE_ROLE_BROADCASTER) 
  298#  if MYNEWT_VAL(BLE_EXT_ADV) 
  299#   include "NimBLEExtAdvertising.h" 
  301#   include "NimBLEAdvertising.h" 
  305# if MYNEWT_VAL(BLE_ROLE_CENTRAL) || MYNEWT_VAL(BLE_ROLE_PERIPHERAL) 
  306#  include "NimBLEConnInfo.h" 
  309# include "NimBLEAddress.h" 
  310# include "NimBLEUtils.h" 
  331    virtual int onStoreStatus(
struct ble_store_status_event* event, 
void* arg);
 
 
A BLE device address.
Definition NimBLEAddress.h:42
Perform and manage BLE advertising.
Definition NimBLEAdvertising.h:51
Connection information.
Definition NimBLEConnInfo.h:32
Callbacks associated with a BLE device.
Definition NimBLEDevice.h:315
virtual int onStoreStatus(struct ble_store_status_event *event, void *arg)
Indicates an inability to perform a store operation. This callback should do one of two things: -Addr...
Definition NimBLEDevice.cpp:1345
A model of a BLE Device from which all the BLE roles are created.
Definition NimBLEDevice.h:116
static void onSync(void)
Host synced with controller, all clear to make calls to the stack.
Definition NimBLEDevice.cpp:821
static bool setDefaultPhy(uint8_t txPhyMask, uint8_t rxPhyMask)
Set the preferred default phy to use for connections.
Definition NimBLEDevice.cpp:795
static bool setOwnAddr(const NimBLEAddress &addr)
Set the device address to use.
Definition NimBLEDevice.cpp:1133
static bool setCustomGapHandler(gap_event_handler handler)
Set a custom callback for gap events.
Definition NimBLEDevice.cpp:1308
static void onReset(int reason)
Host reset, we pass the message so we don't make calls until re-synced.
Definition NimBLEDevice.cpp:808
static bool init(const std::string &deviceName)
Initialize the BLE environment.
Definition NimBLEDevice.cpp:880
static bool setOwnAddrType(uint8_t type)
Sets the address type to use.
Definition NimBLEDevice.cpp:1104
static bool isInitialized()
Check if the initialization is complete.
Definition NimBLEDevice.cpp:1070
static bool setMTU(uint16_t mtu)
Setup local mtu that will be used to negotiate mtu during request from client peer.
Definition NimBLEDevice.cpp:595
static NimBLEAddress getWhiteListAddress(size_t index)
Gets the address at the vector index.
Definition NimBLEDevice.cpp:768
static uint16_t getMTU()
Get local MTU value set.
Definition NimBLEDevice.cpp:608
static int getPower(NimBLETxPowerType type=NimBLETxPowerType::All)
Get the transmission power.
Definition NimBLEDevice.cpp:554
static bool deinit(bool clearAll=false)
Shutdown the NimBLE stack/controller.
Definition NimBLEDevice.cpp:1009
static NimBLEAddress getAddress()
Get our device address.
Definition NimBLEDevice.cpp:1082
static bool whiteListRemove(const NimBLEAddress &address)
Remove a peer address from the whitelist.
Definition NimBLEDevice.cpp:737
static bool startSecurity(uint16_t connHandle, int *rcPtr=nullptr)
Start the connection securing and authorization for this connection.
Definition NimBLEDevice.cpp:1246
static uint32_t getSecurityPasskey()
Get the current passkey used for pairing.
Definition NimBLEDevice.cpp:1236
static void setSecurityAuth(bool bonding, bool mitm, bool sc)
Set the authorization mode for this device.
Definition NimBLEDevice.cpp:1163
static bool setDeviceName(const std::string &deviceName)
Set the BLEDevice name.
Definition NimBLEDevice.cpp:1292
static bool whiteListAdd(const NimBLEAddress &address)
Add a peer address to the whitelist.
Definition NimBLEDevice.cpp:718
static void setSecurityInitKey(uint8_t initKey)
If we are the initiator of the security procedure this sets the keys we will distribute.
Definition NimBLEDevice.cpp:1207
static size_t getWhiteListCount()
Gets the count of addresses in the whitelist.
Definition NimBLEDevice.cpp:759
static void host_task(void *param)
The main host task.
Definition NimBLEDevice.cpp:870
static void setSecurityPasskey(uint32_t passKey)
Set the passkey the server will ask for when pairing.
Definition NimBLEDevice.cpp:1228
static void setSecurityRespKey(uint8_t respKey)
Set the keys we are willing to accept during pairing.
Definition NimBLEDevice.cpp:1220
static void setSecurityIOCap(uint8_t iocap)
Set the Input/Output capabilities of this device.
Definition NimBLEDevice.cpp:1194
static std::string toString()
Return a string representation of the address of this device.
Definition NimBLEDevice.cpp:1324
static bool setPower(int8_t dbm, NimBLETxPowerType type=NimBLETxPowerType::All)
Retrieve the Scan object that we use for scanning.
Definition NimBLEDevice.cpp:511
static bool onWhiteList(const NimBLEAddress &address)
Checks if a peer device is whitelisted.
Definition NimBLEDevice.cpp:703