????????本文章主要介绍物联网短距离无线通信的技术之一低功耗蓝牙技术BLE,主要应用领域为智能穿戴设备,一般情况下需要手机端实现BLE上位机(主机、客户端)。以下介绍基于HC05/BT05蓝牙串口透传模块+MCU(STM32F103VET6),当然对于TI的CC2541、乐鑫的ESP32,本工程同样适用!
? ? ? ? 首先介绍两个重要概念,ServiceUUID(服务UUID)与CharacteristicUUID(特征UUID),ServiceUUID我们可以理解为一个班级,这个班级主要负责数据传输的工作,当然班级内部有许多学生,有的学生负责接收数据(特征值的通知功能),有的学生负责发送数据(写特征值),所以BLE进行一次数据传输时,我们需要指定一个班级(ServiceUUID)和若干学生(CharacteristicUUID),对于HC05/BT05蓝牙串口透传模块,由于其已经输入固件,所以CharacteristicUUID通常是一个人(也就是说接收数据与发送数据的是同一个同学);而对于CC2541、ESP32等我们可以直接编程的芯片通过需要指定两个CharacteristicUUID(特征值通知、写特征值)
?1、设置HC05/BT05
通过串口调试助手或者MCU的串口配置HC05/BT05处于从机模式,设备名称任意设置,ServiceUUID为FFF0,CharacteristicUUID为FFF6????????
2、 Android代码中作相应的替换
3、接收数据
?此处我通过STM32采集的温湿度数据,通过串口发送给HC05/BT05,所以接收数据时,要严格按照STM32中的数据进行。Android中程序如下:
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
byte[] desData = characteristic.getValue();
String temp_str, humi_str;
temp_str = getStringSensorData(desData[0])+"."+getStringSensorData(desData[1])+" ℃";
humi_str = getStringSensorData(desData[2])+"."+getStringSensorData(desData[3])+" %";
Log.i(TAG, " >>>>>温度为:" + temp_str);
Log.i(TAG, " >>>>>湿度为:" + humi_str);
temp.setText(temp_str);
humi.setText(humi_str);
}
?STM32中透传程序如下:
void BLE_Printf()
{
u8 sendbuf[4];
sendbuf[0] = (int)temp_int;
sendbuf[1] = (int)temp_deci;
sendbuf[2] = (int)humi_int;
sendbuf[3] = (int)humi_deci;
if(BLE_State()==1)
{
SendSensorData(sendbuf ,4);
}
else
{
}
}
4、 发送数据(控制指令)
此处我通过手机端发送控制指令控制STM32连接的LED灯,Android中代码如下:
public void KeyEvent() {
swh_led.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (swh_led.isChecked()) {
String data = "LEDON";
sendLeData(data.getBytes());
} else {
String data = "LEDOFF";
sendLeData(data.getBytes());
}
}
});
btn_ble.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mConnectionState) {
cancelDialog.show();
cancelDialog.setMessage(getString(list_disconnecting_ble));
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
cancelDialog.dismiss();
}
}, 1000);
mConnectionState = false;
//btn_ble.setText(getString(R.string.list_connect_ble));
if (mBluetoothGatt != null) {
mBluetoothGatt.disconnect();
}
} else {
scanLeDevice(true);
}
}
});
}
STM32中的程序如下:
void LED_Control(void)
{
if(ReceiveState == 1)
{
RxCounter=0;
ReceiveState=0;
if(FindStr((char*)aRxBuffer,"LEDON")==1)
{
//printf("Receive Data:%s\n",aRxBuffer);
LED2(1);
LED3(1);
LED4(1);
}
else if(FindStr((char*)aRxBuffer,"LEDOFF")==1)
{
//printf("Receive Data:%s\n",aRxBuffer);
LED2(0);
LED3(0);
LED4(0);
}
else
{
}
memset(aRxBuffer,'\0', sizeof(aRxBuffer));
}
}
以上就是BLE模块与手机蓝牙进行双向通信的简单过程,有兴趣的可以下载Android工程的完整代码如下https://download.csdn.net/download/baidu_40311265/35088959
|