概述
1.第一步,设定蓝牙的UUID 共三个,代码如下:
#define SERVICE_UUID "43F4B114-CA67-48E8-A46F-9A8FFEB7146A"
#define CHARACTERISTIC_WRITE_NO_RESPONSE_UUID "BF83F3F1-399A-414D-9035-CE64CEB3FF67"
#define CHARACTERISTIC_NOTIFY_UUID "BF83F3F2-399A-414D-9035-CE64CEB3FF67"
#define BLE_SERVER_NAME "HEA2100010N000019N"
SERVICE_UUID 服务uuid
CHARACTERISTIC_WRITE_NO_RESPONSE_UUID 写入的uuid
CHARACTERISTIC_NOTIFY_UUID 读的UUID
BLE_SERVER_NAME 蓝牙名称
2.第二步,连接低功耗蓝牙,并接收返回数据。
// 搜索到设备时回调功能
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
void onResult(BLEAdvertisedDevice advertisedDevice) {
// if (advertisedDevice.haveServiceUUID() && advertisedDevice.isAdvertisingService(BLEUUID("4fafc201-1fb5-459e-8fcc-c5c9c331914b"))) {
if (advertisedDevice.haveName() && (advertisedDevice.getName() == BLE_SERVER_NAME)) {
advertisedDevice.getScan()->stop(); // 停止当前扫描
pServer = new BLEAdvertisedDevice(advertisedDevice); // 暂存设备
doSacn = false;
doConnect = true;
Serial.println(" - 发现连接设备");
}
}
};
// 客户端与服务器连接与断开回调功能
class MyClientCallback : public BLEClientCallbacks {
void onConnect(BLEClient* pclient) {}
void onDisconnect(BLEClient* pclient) {
doSacn = true;
connected = false;
Serial.println(" - 失去与设备的连接");
}
};
// 收到服务推送的数据时的回调函数
void NotifyCallback(BLERemoteCharacteristic* pBLERemoteCharacteristic, uint8_t* pData, size_t length, bool isNotify) {
char buf[length + 1];
for (size_t i = 0; i < length; i++) {
buf[i] = pData[i];
}
buf[length] = 0;
Serial.printf("[%d]: %sn", length, buf);
}
// 用来连接设备获取其中的服务与特征
bool ConnectToServer(void) {
BLEClient* pClient = BLEDevice::createClient(); // 创建客户端
pClient->setClientCallbacks(new MyClientCallback()); // 添加客户端与服务器连接与断开回调功能
if (!pClient->connect(pServer)) { //尝试连接设备
return false;
}else{
Serial.println(" - [server]: 连接设备成功");
}
BLERemoteService* pRemoteService = pClient->getService(SERVICE_UUID); // 尝试获取设备中的服务
if (pRemoteService == nullptr) {
Serial.println(" - 获取服务失败");
pClient->disconnect();
return false;
}else{
Serial.println(" - [server]: 获取服务成功");
}
pRemoteCharacteristicWrite = pRemoteService->getCharacteristic(CHARACTERISTIC_WRITE_NO_RESPONSE_UUID); // 尝试获取服务中的特征
if (pRemoteCharacteristicWrite == nullptr) {
Serial.println(" - [Write]:获取特性失败");
pClient->disconnect();
return false;
}else{
Serial.println(" - [Write]: 获取特征成功..");
}
if(pRemoteCharacteristicWrite->canRead()) { // 如果特征值可以读取则读取数据
Serial.printf(" - 该特征值可以读取并且当前值为[Write]: %srn", pRemoteCharacteristicWrite->readValue().c_str());
}else{
Serial.println(" - [Write]: CHARACTERISTIC_WRITE_NO_RESPONSE_UUID canRead ERROR!");
}
if(pRemoteCharacteristicWrite->canNotify()) { // 如果特征值启用了推送则添加推送接收处理
pRemoteCharacteristicWrite->registerForNotify(NotifyCallback);
}else{
Serial.println(" - [Write]: CHARACTERISTIC_WRITE_NO_RESPONSE_UUID canNotify ERROR!");
}
pRemoteCharacteristicNotify = pRemoteService->getCharacteristic(CHARACTERISTIC_NOTIFY_UUID); // 尝试获取服务中的特征
if (pRemoteCharacteristicWrite == nullptr) {
Serial.println(" - [Notify]:获取特性失败");
pClient->disconnect();
return false;
}else{
Serial.println(" - [Notify]: 获取特征成功..");
}
if(pRemoteCharacteristicNotify->canRead()) { // 如果特征值可以读取则读取数据
Serial.printf(" - 该特征值可以读取并且当前值为[Write]: %srn", pRemoteCharacteristicNotify->readValue().c_str());
}else{
Serial.println(" - [Notify]: CHARACTERISTIC_NOTIFY_UUID canRead ERROR!");
}
if(pRemoteCharacteristicNotify->canNotify()) { // 如果特征值启用了推送则添加推送接收处理
pRemoteCharacteristicNotify->registerForNotify(NotifyCallback);
}else{
Serial.println(" - [Notify]: CHARACTERISTIC_NOTIFY_UUID canNotify ERROR!");
}
}
3.第三步,写入特征值,获取返回的数据。
最后
以上就是纯情花卷为你收集整理的ESP32-CAM 连接低功耗蓝牙的步骤的全部内容,希望文章能够帮你解决ESP32-CAM 连接低功耗蓝牙的步骤所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复