[ESP32 BLE]使用ESP32 BLE与手机通信

蓝牙4.0标准包括传统蓝牙模块部分和低功耗蓝牙模块部分,是一个双模标准。低功耗蓝牙也是建立在传统蓝牙基础之上发展起来的,并区别于传统模块,最大的特点就是成本和功耗降低,应用于实时性要求比较高。
BLE(Bluetooh Low Energy)蓝牙低能耗技术是短距离、低成本、可互操作性的无线技术,它利用许多智能手段最大限度地降低功耗。
BLE技术的工作模式非常适合用于从微型无线传感器(每半秒交换一次数据)或使用完全异步通信的遥控器等其它外设传送数据。这些设备发送的数据量非常少(通常几个字节),而且发送次数也很少(例如每秒几次到每分钟一次,甚至更少)。
BLE与经典蓝牙对比:

[ESP32 BLE]使用ESP32 BLE与手机通信_第1张图片
下面直接上代码:
1.创建服务与特征:

	// 创建电池电量 BLE 服务
    Battery_Server = BLEDevice::createServer();
    Battery_Server->setCallbacks(new MyBatteryServerCallbacks()); 	//设置回调
    BLEService *Battery_Service = Battery_Server->createService(BATTERY_SERVICE_UUID);

    //新增特征
    Battery_Characteristic = Battery_Service->createCharacteristic(BATTERY_CHARACTERISTIC_BATT_LEVEL_UUID,
                                    BLECharacteristic::PROPERTY_NOTIFY);
    Battery_Characteristic->addDescriptor(new BLE2902());

    Battery_Notify_Characteristic = Battery_Service->createCharacteristic(BATTERY_CHARACTERISTIC_RECEIVE_UUID, 
                                    BLECharacteristic::PROPERTY_WRITE);
    Battery_Notify_Characteristic->setCallbacks(new My_Notify()); 	//设置回调

    Battery_Read_Characteristic = Battery_Service->createCharacteristic(BATTERY_READ_UUID, 
                                    BLECharacteristic::PROPERTY_READ|BLECharacteristic::PROPERTY_WRITE);
    Battery_Read_Characteristic->setCallbacks(new MyReadEvent_CallBack()); //设置回调

    Battery_Service->start();
    Battery_Server->getAdvertising()->start();
2.回调函数:
//读事件回调函数
class MyCallbacks : public BLECharacteristicCallbacks
{
    void onWrite(BLECharacteristic *pCharacteristic)
    {
        std::string rxValue = pCharacteristic->getValue(); //接收信息

        if (rxValue.length() > 0)
        { //向串口输出收到的
            Serial.print("RX: ");
            for (int i = 0; i < rxValue.length(); i++)
                Serial.print(rxValue[i]);
            Serial.println();
        }
    }
};

上面代码是Battery_Characteristic 的回调函数,该特征只有读权限

//通知回调
class My_Notify : public BLECharacteristicCallbacks
{
    //应该写  :onNotify函数!!!!
    void onWrite(BLECharacteristic *pCharacteristic)
    {
        std::string rxValue = pCharacteristic->getValue(); //接收信息

        if (rxValue.length() > 0)
        { //向串口输出收到的值
            Serial.print("RX: ");
            for (int i = 0; i < rxValue.length(); i++){
                Serial.print(rxValue[i]);
            }   
            Serial.println();
        }
    }
};

该部分代码是Battery_Notify_Characteristic 的回调函数(回调函数内容是随便编写的,没有太多的实际意义,嘿嘿)。

//我的读事件回调函数
class MyReadEvent_CallBack : public BLECharacteristicCallbacks
{

    void onRead(BLECharacteristic *Battery_Read_Characteristic)
    {
        uint16_t handle_number = Battery_Read_Characteristic->getHandle();//获取处理事件

        //Serial.println(handle_number);
        //读数据事件
        if(handle_number == 62){
            //Battery_Read_Characteristic->setValue(Test_Array_Value,3);
            Battery_Read_Characteristic->setValue(Receive_Char_Read);//读取的数据与写入的数据相同
        }   
    }

    void onWrite(BLECharacteristic *Battery_Read_Characteristic)
    {
        Receive_char = "";//清空字符串
        Receive_Char_Read = "";
        std::string rxValue = Battery_Read_Characteristic->getValue(); //接收信息

        if (rxValue.length() > 0)
        { //向串口输出收到的值
            Serial.print("RX: ");
            for (int i = 0; i < rxValue.length(); i++){
                Receive_char += rxValue[i];
                Receive_Char_Read += rxValue[i];
                Serial.print(rxValue[i]);
            }   
            Serial.println();
        }
    }
};

该部分代码是最主要的,Battery_Read_Characteristic具有可读可写权限。在获取到手机发送的字符串之后,会将字符串显示在OLED上,之后若是在手机端读取字符串,那么读出来的字符串和手机发送的字符串一样,下面展示一下实际效果:

`

[ESP32 BLE]使用ESP32 BLE与手机通信_第2张图片

[ESP32 BLE]使用ESP32 BLE与手机通信_第3张图片

你可能感兴趣的:(日记或心得,单片机)