Unity插件-适用于iOS,tvOS和Android的蓝牙LE(2.3)的测试使用方法

目录

一、使用介绍

二、使用步骤

1、将插件资源包导入unity中

2、修改插件中的AndroidManifest文件

3、新建一个TestBLE场景

1、在场景中新建一个Canvas,新建所需要的组件,如下图所示

①创建一个Container(空物体Empty)(存放搜索到的设备列表)

②创建两个文本Text,两个按钮Button

2、制作一个预制体DeviceInfo

4、创建一个新的脚本,命名为BlueTooth

三、效果演示

1、点击扫描,扫描设备中

2、点击连接,设备连接成功


一、使用介绍

插件来源:Unity AssetStore

Bluetooth LE for iOS, tvOS and Android | 网络 | Unity Asset Store

使用版本:Unity 2020.3.43f1c1、Bluetooth LE for iOS, tvOS and Android 2.3

参考教程:Unity Bluetooth LE Plugin for Android插件的使用记录_unity 蓝牙插件-CSDN博客

二、使用步骤

1、将插件资源包导入unity中

2、修改插件中的AndroidManifest文件

这个插件中的AndroidManifest是有错误的,需要把原先属于 <activity android:name="com.unity3d.player.UnityPlayerProxyActivity"下面的<intent-filter>... </intent-filter>挪到 <activity android:name="com.unity3d.player.UnityPlayerActivity"下面,修改后的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.unity3d.player" android:installLocation="preferExternal" android:versionCode="1" android:versionName="1.0">
  <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
  <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" />
  <application android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="true">
    <activity android:name="com.unity3d.player.UnityPlayerProxyActivity" android:label="@string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
    </activity>
    <activity android:name="com.unity3d.player.UnityPlayerActivity" android:label="@string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <activity android:name="com.unity3d.player.UnityPlayerNativeActivity" android:label="@string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
      <meta-data android:name="android.app.lib_name" android:value="unity" />
      <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
    </activity>
    <meta-data android:name="platform_high" android:value="1" />
    <meta-data android:name="enable_entitlementcheck" android:value="0" />
  </application>
</manifest>

3、新建一个TestBLE场景

(1)在场景中新建一个Canvas,新建所需要的组件,如下图所示

(参考来源详见使用介绍中参考教程) 

①创建一个Container(空物体Empty)(存放搜索到的设备列表)

添加Vertical Layout Group组件

②创建两个文本Text,两个按钮Button

(2)制作一个预制体DeviceInfo

创建一个文本Text,一个按钮Button,文本用来显示搜索到的设备名称和地址,按钮用来控制设备的连接

4、创建一个新的脚本,命名为BlueTooth

代码如下:

using System;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.UI;

public class Bluethooh : MonoBehaviour
{
    //连接的蓝牙mac地址
    private string bleAddress;
    //保存的uuid
    private string serviceUUID = "";//此处是设备的serviceUUID
    //保存的特征值
    private string characteristicUUID = "";//此处是设备的characteristicUUID 
    //表示是否开始扫描
    private bool isScanning;
    //表示是否已经蓝牙初始化
    private bool isInit;
    //设备信息预制体 当扫描到一个设备时就会创建一个实例并放到滚动视图中去
    public GameObject deviceInfoPrefab;
    //滚动视图的容器结点
    public Transform container;
    //提示的文本信息框  连接提示。。。
    public Text text;
    //提示的其他文本信息框  接受数据提示。。。
    public Text otherText;
    //断开连接按钮
    public Button disConnectBtn;
    //开始扫描按钮
    public Button startScanningBtn;
    //以设备名字做个存储,相同名字的就忽视不在扫描
    private HashSet<string> deviceHashSet = new HashSet<string>();
    //设备名、设备地址字典
    private Dictionary<string, string> deviceDictionary = new Dictionary<string, string>();

    void Start()
    {
        Input.location.Start(); //定位
        InitBluethood();
        startScanningBtn.onClick.AddListener(() =>
        {
            StartScnnning();
        });
        disConnectBtn.onClick.AddListener(() =>
        {
            DisConnect();
        });
    }

    /// <summary>
    /// 初始化蓝牙设备
    /// </summary>
    private void InitBluethood()
    {
        if (!isInit)
        {
            BluetoothLEHardwareInterface.Initialize(true, false, () =>
            {
                Show("蓝牙初始化成功");//初始化成功执行回调
                isInit = true;
            },
           (error) =>
           {
               Show(error.ToString());//初始化失败的回调响应
           });
        }
    }
    /// <summary>
    /// 扫描设备
    /// </summary>
    private void StartScnnning()
    {
        if (!isScanning && isInit)
        {
            Show("扫描设备中");
            Input.location.Start(); //定位
            Invoke("FindDevice", 1f);
            isScanning = true;
        }
    }
    public void FindDevice()
    {
        BluetoothLEHardwareInterface.ScanForPeripheralsWithServices(null, (address, name) =>
        {
            if (deviceHashSet.Contains(name)) return;
            CreationTextPrefab(address, name);
            //扫描处理,加入设备列表              
            AddPeripheral(name, address);
            deviceHashSet.Add(name);

        }, (address, name, rssi, advertisingInfo) =>
        {
            if (deviceHashSet.Contains(name)) return;
            CreationTextPrefab(address, name);
            AddPeripheral(name, address);
            deviceHashSet.Add(name);
        });
    }

    public void Show(string info)
    {
        text.text = info;
    }
    /// <summary>
    /// 创建提示信息预制件
    /// </summary>
    /// <param name="address"></param>
    /// <param name="name"></param>
    private void CreationTextPrefab(string address, string name)
    {
        GameObject game = Instantiate<GameObject>(deviceInfoPrefab);
        game.transform.Find("Text").GetComponent<Text>().text = "设备名字:" + name + "   " + "地址:" + address + "\n";
        game.transform.localScale = Vector3.one;
        game.transform.SetParent(container);
        Button button = game.transform.Find("Button").GetComponent<Button>();
        button.onClick.AddListener(() =>
        {
            if (deviceHashSet.Contains(name)) //找到名字一样的设备
            {
                BluetoothLEHardwareInterface.StopScan(); //停止扫描
                ConnectBluetooth(deviceDictionary[name]);  //开始连接
            }
        });
    }

    /// <summary>
    /// 更新存储要连接设备的名字,是否扫描到
    /// </summary>
    /// <param name="name"></param>
    /// <param name="address"></param>
    public void AddPeripheral(string name, string address)
    {
        deviceDictionary.Add(name, address);
    }
    /// <summary>
    /// 开始连接设备
    /// </summary>
    public void ConnectBluetooth(string adress)
    {
        Show("开始连接设备");
        try
        {
            BluetoothLEHardwareInterface.ConnectToPeripheral(adress, null, null, (address, serviceUUID, characteristicUUID) =>
            {
                SubscribeCharacteristicWithDeviceAddress(address);
            });
        }
        catch (Exception e)
        {
            Show("连接失败");
        }
    }

    /// <summary>
    /// 连接成功的回调
    /// </summary>
    private void SubscribeCharacteristicWithDeviceAddress(string address)
    {
        otherText.text += "\n" + "尝试接受数据";
        otherText.text = serviceUUID + "\n" + characteristicUUID;
        bleAddress = address;
        BluetoothLEHardwareInterface.SubscribeCharacteristicWithDeviceAddress(address, serviceUUID, characteristicUUID, delegate { }, OnCharacteristicNotification);
    }
    /// <summary>
    /// 收到数据
    /// </summary>
    /// <param name="arg1"></param>
    /// <param name="arg2"></param>
    /// <param name="arg3"></param>
    private void OnCharacteristicNotification(string arg1, string arg2, byte[] arg3)
    {
        //Show("接收到数据");
        otherText.text = "连接成功" + "\narg1=" + arg1 + "\narg2=" + arg2 + "\n";
        Show(ByteArrayToString(arg3));
    }
    /// <summary>
    /// 断开连接
    /// </summary>
    public void DisConnect()
    {
        BluetoothLEHardwareInterface.DisconnectPeripheral(bleAddress, (bleAddress) =>
        {
            Show(bleAddress + "已经断开");
            otherText.text = "";
            isScanning = false;
        });
    }
    /// <summary>
    /// 字节组转换为字符串
    /// </summary>
    /// <param name="ba"></param>
    /// <returns></returns>
    public static string ByteArrayToString(byte[] ba)
    {
        string hex = BitConverter.ToString(ba);
        return hex.Replace("-", "");
    }
}

serviceUUID和characteristicUUID为需要连接设备的uuid

4、将代码挂载到场景任意物体上,例如Canvas,如图:

将需要引用的组件拖至相应位置

5、制作完成,示例场景如图所示:

6、打包为apk到安卓端可以测试效果

注意打包发布前选择竖屏,手机连接需要打开蓝牙以及位置信息

三、效果演示

1、点击扫描,扫描设备中

2、点击连接,设备连接成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值