2022-11-11 来源:华纳网 责任编辑:谷雨老师 人气:
核心提示:本课内容: 大家好,欢迎来到谷雨课堂 本节,我们继续换个口味, 今天我们来使用ESP32来实现蓝牙BLE的双向数据通信 作 为物联网的产品,蓝牙那一定是不能缺席的, 那么,使用蓝牙低功耗BLE进行数据双向通信, 有没有特别的复杂呢? 那是一定复杂的, 首先,

本课内容:

大家好,欢迎来到谷雨课堂

 


 

本节,我们继续换个口味,
今天我们来使用ESP32来实现蓝牙BLE的双向数据通信
 
为物联网的产品,蓝牙那一定是不能缺席的,
那么,使用蓝牙低功耗BLE进行数据双向通信,
有没有特别的复杂呢?
那是一定复杂的,
首先,必要的概念是必须要了解的

Request和Response其实就是我们经常说的ATT命令(ATT PDU),也就是说Client和Server之间通过ATT PDU进行交互。

在BLE中,数据是通过characteristic进行包装的,而且多个characteristic组成一个service,service是一个独立的服务单元,或者说service是一个基本的BLE应用。如果某个service是一个蓝牙联盟定义的标准服务,也可以称其为profile,比如HID/心率计/体温计/血糖仪等,都是标准蓝牙服务,因此都有相应的profile规格书。

 

不过好在我们有现成的软件库可以用,

以下就是本节用到所有源代码,

是完全可以运行的哦

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
/*No.38 使用ESP32实现BLE设备并收发数据
    Video: https://www.youtube.com/watch?v=oCMOYS71NIU    Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleNotify.cpp    Ported to Arduino ESP32 by Evandro Copercini    updated by chegewara
   Create a BLE server that, once we receive a connection, will send periodic notifications.   The service advertises itself as: 4fafc201-1fb5-459e-8fcc-c5c9c331914b   And has a characteristic of: beb5483e-36e1-4688-b7f5-ea07361b26a8
   The design of creating the BLE server is:   1. Create a BLE Server   2. Create a BLE Service   3. Create a BLE Characteristic on the Service   4. Create a BLE Descriptor on the characteristic   5. Start the service.   6. Start advertising.
   A connect hander associated with the server starts a background task that performs notification   every couple of seconds.*/
/** NimBLE differences highlighted in comment blocks **/
#include <NimBLEDevice.h>
BLEServer* pServer = NULL;BLECharacteristic* pCharacteristic = NULL;bool deviceConnected = false;bool oldDeviceConnected = false;uint32_t value = 0;
#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"#define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
class MyServerCallbacks: public BLEServerCallbacks {void onConnect(BLEServer* pServer) {      deviceConnected = true;      BLEDevice::startAdvertising();    };
void onDisconnect(BLEServer* pServer) {      deviceConnected = false;    }/***************** New - Security handled here ********************  ****** Note: these are the same return values as defaults ********/uint32_t onPassKeyRequest(){      Serial.println("Server PassKeyRequest");return 123456;     }
bool onConfirmPIN(uint32_t pass_key){      Serial.print("The passkey YES/NO number: ");      Serial.println(pass_key);return true;     }
void onAuthenticationComplete(ble_gap_conn_desc desc){      Serial.println("Starting BLE work!");    }/*******************************************************************/};

class MyCallbacks: public BLECharacteristicCallbacks {void onWrite(BLECharacteristic *pCharacteristic) {std::string rxValue = pCharacteristic->getValue();
if (rxValue.length() > 0) {        Serial.println("*********");        Serial.print("Received Value: ");for (int i = 0; i < rxValue.length(); i++)          Serial.print(rxValue[i]);
        Serial.println();        Serial.println("*********");      }    }};
void setup() {  Serial.begin(115200);
// Create the BLE Device  BLEDevice::init("GuYuBle01");
// Create the BLE Server  pServer = BLEDevice::createServer();  pServer->setCallbacks(new MyServerCallbacks());
// Create the BLE Service  BLEService *pService = pServer->createService(SERVICE_UUID);
// Create a BLE Characteristic  pCharacteristic = pService->createCharacteristic(                      CHARACTERISTIC_UUID,/******* Enum Type NIMBLE_PROPERTY now *******                           BLECharacteristic::PROPERTY_READ   |                      BLECharacteristic::PROPERTY_WRITE  |                      BLECharacteristic::PROPERTY_NOTIFY |                      BLECharacteristic::PROPERTY_INDICATE                    );                **********************************************/                      NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::NOTIFY                     );
  BLECharacteristic * pRxCharacteristic = pService->createCharacteristic(                                            CHARACTERISTIC_UUID_RX,                                            NIMBLE_PROPERTY::WRITE                                            );
  pRxCharacteristic->setCallbacks(new MyCallbacks());
// Start the service  pService->start();
// Start advertising  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();  pAdvertising->addServiceUUID(SERVICE_UUID);  pAdvertising->setScanResponse(false);/** Note, this could be left out as that is the default value */  pAdvertising->setMinPreferred(0x0);  // set value to 0x00 to not advertise this parameter
  BLEDevice::startAdvertising();  Serial.println("Waiting a client connection to notify...");}
void loop() {// notify changed valueif (deviceConnected) {        pCharacteristic->setValue((uint8_t*)&value, 4);        pCharacteristic->notify();        value++;        delay(10); // bluetooth stack will go into congestion, if too many packets are sent, in 6 hours test i was able to go as low as 3ms    }
// disconnectingif (!deviceConnected && oldDeviceConnected) {        delay(500); // give the bluetooth stack the chance to get things ready        pServer->startAdvertising(); // restart advertising        Serial.println("start advertising");        oldDeviceConnected = deviceConnected;    }
// connectingif (deviceConnected && !oldDeviceConnected) {// do stuff here on connecting        oldDeviceConnected = deviceConnected;    }}

 

 
 

完整的源代码可以登录【华纳网】下载。

 

https://www.worldwarner.com/





 





免责声明:本文仅代表作者个人观点,与华纳网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。