小言_互联网的博客

Unity连接ble蓝牙脉搏心率设备

435人阅读  评论(0)

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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场