unity 2017.3 安卓蓝牙(一)初始化蓝牙连接

最近在使用Bluetooth+LE+for+iOS+and+Android+v2.3这个插件开发基于安卓设备的蓝牙模块。

蓝牙模块大概分成七步:

1.建立中心角色2.扫描外设(discover)

3.连接外设(connect)

4.扫描外设中的服务和特征(discover)

    4.1 获取外设的services

    4.2 获取外设的Characteristics,获取Characteristics的值,获取Characteristics的Descriptor和Descriptor的值
5.与外设做数据交互(explore and interact)
6.订阅Characteristic的通知

7.断开连接(disconnect)

权限

安卓设备的软件开发首先要配置权限,找到AndroidManifest.xml文件。

  <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
  <uses-permission android:name="android.permission.BLUETOOTH"/>
  <uses-feature android:name="android.hardware.bluetooth_le" android:required="false"/>

申请蓝牙权限,安卓6.0以后可能需要特殊处理。

<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/>

初始化蓝牙

    /// <summary>
    /// 初始化蓝牙
    /// </summary>
    public void InitBluetooth()
    {
        BluetoothLEHardwareInterface.Initialize(true, false, delegate
          {
              Show("蓝牙初始化成功!");
              Invoke("ScanBluetooth", 0.1f);
          }, delegate (string errorInfo)
         {
              Show("蓝牙初始化失败!");
          });
    }

我们通常把app设置为centeral端,第一个参数表示是否把app设置为centeral端,第二个参数表示是否设置为peripheral端。

搜索蓝牙设备

蓝牙初始化成功后,开始搜索蓝牙设备,第一个参数表示是否根据UUID来搜索制定的蓝牙设备,null表示搜索所有蓝牙设备。

    /// <summary>
    /// 搜索蓝牙设备
    /// </summary>
    public void ScanBluetooth()
    {
        Show("开始搜索蓝牙设备...");
        BluetoothLEHardwareInterface.ScanForPeripheralsWithServices(null, (address, name) =>
        {
            Show("已搜索到蓝牙设备");
            AddPeripheral(name, address);
        },
            (address, name, rssi, advertisingInfo) =>
            {
                Show("新信息");
                if (advertisingInfo != null)
                    BluetoothLEHardwareInterface.Log(string.Format("Device: {0} RSSI: {1} Data Length: {2} Bytes: {3}", name, rssi, advertisingInfo.Length, BytesToString(advertisingInfo)));
                //log address name rssi advertisingInfo
            });

    }

检查蓝牙合法性

搜索到蓝牙设备后,我们需要检查一下是不是我们想要连接的蓝牙设备

    /// <summary>
    /// 检查蓝牙合法性
    /// </summary>
    void AddPeripheral(string name, string address)
    {
        bleName = name.ToString();
        bleAddress = address.ToString();
        if (bleName == "Thingy")
        {
            Show("遥控器已上线");
            ConnectBluetooth();
        }
        else
        {
            Show("错误的设备,重新搜索");
            ScanBluetooth();
        }
    }

连接到蓝牙设备

确定是我们要连接的设备后,开始连接

    /// <summary>
    /// 连接到蓝牙
    /// </summary>
    public void ConnectBluetooth()
    {
        Show("开始连接到蓝牙:");

        BluetoothLEHardwareInterface.ConnectToPeripheral(bleAddress, (address) =>
        {
            Show("蓝牙连接成功!");
            SubscribeBluetoothMsg();
        },(address, serviceUUID) =>
                {
                },(address, serviceUUID, characteristicUUID) =>
                {

                }, delegate { });
    }

第一个回调函数只会在第一次连接到设备后被调用,在收到广告数据的情况下第二个回调会被调用。

输出信息 方便观察

把信息加上时间头,输出到UI上,方便我们观察进度。

    public Text debug;
    /// <summary>
    /// 将信息输出到UI上 方便观察
    /// </summary>
    /// <param name="str">输出的值 不需要加换行符</param>
    void Show(string str)
    {
        debug.text += (DateTime.Now.ToString("hh:mm:ss") + ":\t" + str + "\n");
    }

猜你喜欢

转载自blog.csdn.net/Testiness_Wind/article/details/80677963