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