Unity连接ble蓝牙脉搏心率设备
公司的一个项目的生理设备数据采集模块,用的是Bluetooth+LE+for+iOS+and+Android+v2.3这个插件开发。
- 1.蓝牙初始化
public void InitBT()
{
BluetoothLEHardwareInterface.Initialize(true, false, () =>
{
Show("蓝牙初始化成功");//初始化成功执行回调
Invoke("FindDevice", 0.5f);
}, (error) =>
{
Show("请打开蓝牙");//初始化失败的回调响应
});
}
这里两个回调分别初始化成功失败执行,目前我只发现手机蓝牙没开会导致初始化失败,初始化成功延迟执行搜索方法,这里如果不延迟执行的话搜索设备可能会出问题,延迟0.1 0.5即可。
- 2 .蓝牙搜索
public void FindDevice()
{
BluetoothLEHardwareInterface.ScanForPeripheralsWithServices(null, (address, name) => {
//扫描处理,加入设备列表
AddPeripheral(name, address);
}, (address, name, rssi, advertisingInfo) => {
//txt.text = "advertisingInfo" +name ;
//扫描处理,加入设备列表
AddPeripheral(name, address);
});
}
搜索所有设备,将设备的名字与地址拿到
public void AddPeripheral(string name, string address)
{
bleName = name.ToString();
bleAddress = address.ToString();
if (bleName == "BerryMed")
{
BluetoothLEHardwareInterface.StopScan();
ConnectBluetooth();
}
}
将搜索到的设备信息与我们需要的设备比较,看是否是我们需要连接的设备,当然这里也可以将信息显示出来给用户选择连接。
- 3.连接设备
public void ConnectBluetooth()
{
Show("开始连接");
BluetoothLEHardwareInterface.ConnectToPeripheral(bleAddress, null, null, (address, serviceUUID, characteristicUUID) => {
SubscribeCharacteristicWithDeviceAddress();
});
}
连接我们需要的设备,并通过设备的UUID和服务的UUID订阅蓝牙的服务,UUID如果设备方没有提供,可自行通过蓝牙调试助手获取。
- 4.接收数据
private void SubscribeCharacteristicWithDeviceAddress()
{
BluetoothLEHardwareInterface.SubscribeCharacteristicWithDeviceAddress(bleAddress, ServiceUUID, SubscribeCharacteristic, delegate { }, OnCharacteristicNotification);
}
订阅蓝牙服务之后我们就可以进行我们需要的数据操作了,OnCharacteristicNotification会返回接收到的数据,其实具体的数据接发模式还有很多,这里看我的项目需求和设备类型是这样的,更多的可以去查蓝牙的模式。
- 5.数据解析
private void OnCharacteristicNotification(string arg1, string arg2, byte[] arg3)
{
//Show("接收到数据");
for (int i = 0; i < arg3.Length; i++)
{
buffer[index] = arg3[i];
index++;
if (index==buffer.Length)
{
spo2 = buffer[4];
heat= buffer[3] | ((buffer[2] & 0x40) << 1);
pi = buffer[0] & 0x0f;
vec = buffer[1] / 2;
t.text ="脉搏速率: "+heat.ToString()+"\n"+"血氧浓度SPO2: "+spo2+"\n"+"血流灌注指数PI: "+pi + "\n" + "波形图值: " + vec;
DrawLine(vec);
index = 0;
}
}
//StringBuilder hex = new StringBuilder(arg3.Length * 2);
//foreach (byte b in arg3)
//{
// hex.AppendFormat("{0:x2}", b);
// //hex.AppendFormat(b.ToString());
// //hex.AppendFormat(b.ToString()+",");
//}
//Show(hex.ToString());
}
这里看具体的数据协议来写解析并输出就ok
- 遇到的坑,在android6.0以上版本运行时,要用到的蓝牙权限,除了在android的xml文件申请外,还需要一个定位权限,这个坑找了好久。然后在需要的时候调一下unity自带的定位的api去开启权限才可以正常使用蓝牙功能。
转载:https://blog.csdn.net/weixin_44459562/article/details/101375026
查看评论