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

打印 上一主题 下一主题

主题 1012|帖子 1012|积分 3036

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目录

一、利用先容
二、利用步调
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"下面,修改后的代码如下:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.unity3d.player" android:installLocation="preferExternal" android:versionCode="1" android:versionName="1.0">
  3.   <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
  4.   <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
  5.   <uses-permission android:name="android.permission.BLUETOOTH" />
  6.   <uses-feature android:name="android.hardware.bluetooth_le" android:required="false" />
  7.   <application android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="true">
  8.     <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">
  9.     </activity>
  10.     <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">
  11.       <intent-filter>
  12.         <action android:name="android.intent.action.MAIN" />
  13.         <category android:name="android.intent.category.LAUNCHER" />
  14.       </intent-filter>
  15.     </activity>
  16.     <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">
  17.       <meta-data android:name="android.app.lib_name" android:value="unity" />
  18.       <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
  19.     </activity>
  20.     <meta-data android:name="platform_high" android:value="1" />
  21.     <meta-data android:name="enable_entitlementcheck" android:value="0" />
  22.   </application>
  23. </manifest>
复制代码
3、新建一个TestBLE场景

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


(参考来源详见利用先容中参考教程) 
①创建一个Container(空物体Empty)(存放搜索到的设备列表)

添加Vertical Layout Group组件

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

(2)制作一个预制体DeviceInfo

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


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

代码如下:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using UnityEngine;
  5. using UnityEngine.UI;
  6. public class Bluethooh : MonoBehaviour
  7. {
  8.     //连接的蓝牙mac地址
  9.     private string bleAddress;
  10.     //保存的uuid
  11.     private string serviceUUID = "";//此处是设备的serviceUUID
  12.     //保存的特征值
  13.     private string characteristicUUID = "";//此处是设备的characteristicUUID
  14.     //表示是否开始扫描
  15.     private bool isScanning;
  16.     //表示是否已经蓝牙初始化
  17.     private bool isInit;
  18.     //设备信息预制体 当扫描到一个设备时就会创建一个实例并放到滚动视图中去
  19.     public GameObject deviceInfoPrefab;
  20.     //滚动视图的容器结点
  21.     public Transform container;
  22.     //提示的文本信息框  连接提示。。。
  23.     public Text text;
  24.     //提示的其他文本信息框  接受数据提示。。。
  25.     public Text otherText;
  26.     //断开连接按钮
  27.     public Button disConnectBtn;
  28.     //开始扫描按钮
  29.     public Button startScanningBtn;
  30.     //以设备名字做个存储,相同名字的就忽视不在扫描
  31.     private HashSet<string> deviceHashSet = new HashSet<string>();
  32.     //设备名、设备地址字典
  33.     private Dictionary<string, string> deviceDictionary = new Dictionary<string, string>();
  34.     void Start()
  35.     {
  36.         Input.location.Start(); //定位
  37.         InitBluethood();
  38.         startScanningBtn.onClick.AddListener(() =>
  39.         {
  40.             StartScnnning();
  41.         });
  42.         disConnectBtn.onClick.AddListener(() =>
  43.         {
  44.             DisConnect();
  45.         });
  46.     }
  47.     /// <summary>
  48.     /// 初始化蓝牙设备
  49.     /// </summary>
  50.     private void InitBluethood()
  51.     {
  52.         if (!isInit)
  53.         {
  54.             BluetoothLEHardwareInterface.Initialize(true, false, () =>
  55.             {
  56.                 Show("蓝牙初始化成功");//初始化成功执行回调
  57.                 isInit = true;
  58.             },
  59.            (error) =>
  60.            {
  61.                Show(error.ToString());//初始化失败的回调响应
  62.            });
  63.         }
  64.     }
  65.     /// <summary>
  66.     /// 扫描设备
  67.     /// </summary>
  68.     private void StartScnnning()
  69.     {
  70.         if (!isScanning && isInit)
  71.         {
  72.             Show("扫描设备中");
  73.             Input.location.Start(); //定位
  74.             Invoke("FindDevice", 1f);
  75.             isScanning = true;
  76.         }
  77.     }
  78.     public void FindDevice()
  79.     {
  80.         BluetoothLEHardwareInterface.ScanForPeripheralsWithServices(null, (address, name) =>
  81.         {
  82.             if (deviceHashSet.Contains(name)) return;
  83.             CreationTextPrefab(address, name);
  84.             //扫描处理,加入设备列表              
  85.             AddPeripheral(name, address);
  86.             deviceHashSet.Add(name);
  87.         }, (address, name, rssi, advertisingInfo) =>
  88.         {
  89.             if (deviceHashSet.Contains(name)) return;
  90.             CreationTextPrefab(address, name);
  91.             AddPeripheral(name, address);
  92.             deviceHashSet.Add(name);
  93.         });
  94.     }
  95.     public void Show(string info)
  96.     {
  97.         text.text = info;
  98.     }
  99.     /// <summary>
  100.     /// 创建提示信息预制件
  101.     /// </summary>
  102.     /// <param name="address"></param>
  103.     /// <param name="name"></param>
  104.     private void CreationTextPrefab(string address, string name)
  105.     {
  106.         GameObject game = Instantiate<GameObject>(deviceInfoPrefab);
  107.         game.transform.Find("Text").GetComponent<Text>().text = "设备名字:" + name + "   " + "地址:" + address + "\n";
  108.         game.transform.localScale = Vector3.one;
  109.         game.transform.SetParent(container);
  110.         Button button = game.transform.Find("Button").GetComponent<Button>();
  111.         button.onClick.AddListener(() =>
  112.         {
  113.             if (deviceHashSet.Contains(name)) //找到名字一样的设备
  114.             {
  115.                 BluetoothLEHardwareInterface.StopScan(); //停止扫描
  116.                 ConnectBluetooth(deviceDictionary[name]);  //开始连接
  117.             }
  118.         });
  119.     }
  120.     /// <summary>
  121.     /// 更新存储要连接设备的名字,是否扫描到
  122.     /// </summary>
  123.     /// <param name="name"></param>
  124.     /// <param name="address"></param>
  125.     public void AddPeripheral(string name, string address)
  126.     {
  127.         deviceDictionary.Add(name, address);
  128.     }
  129.     /// <summary>
  130.     /// 开始连接设备
  131.     /// </summary>
  132.     public void ConnectBluetooth(string adress)
  133.     {
  134.         Show("开始连接设备");
  135.         try
  136.         {
  137.             BluetoothLEHardwareInterface.ConnectToPeripheral(adress, null, null, (address, serviceUUID, characteristicUUID) =>
  138.             {
  139.                 SubscribeCharacteristicWithDeviceAddress(address);
  140.             });
  141.         }
  142.         catch (Exception e)
  143.         {
  144.             Show("连接失败");
  145.         }
  146.     }
  147.     /// <summary>
  148.     /// 连接成功的回调
  149.     /// </summary>
  150.     private void SubscribeCharacteristicWithDeviceAddress(string address)
  151.     {
  152.         otherText.text += "\n" + "尝试接受数据";
  153.         otherText.text = serviceUUID + "\n" + characteristicUUID;
  154.         bleAddress = address;
  155.         BluetoothLEHardwareInterface.SubscribeCharacteristicWithDeviceAddress(address, serviceUUID, characteristicUUID, delegate { }, OnCharacteristicNotification);
  156.     }
  157.     /// <summary>
  158.     /// 收到数据
  159.     /// </summary>
  160.     /// <param name="arg1"></param>
  161.     /// <param name="arg2"></param>
  162.     /// <param name="arg3"></param>
  163.     private void OnCharacteristicNotification(string arg1, string arg2, byte[] arg3)
  164.     {
  165.         //Show("接收到数据");
  166.         otherText.text = "连接成功" + "\narg1=" + arg1 + "\narg2=" + arg2 + "\n";
  167.         Show(ByteArrayToString(arg3));
  168.     }
  169.     /// <summary>
  170.     /// 断开连接
  171.     /// </summary>
  172.     public void DisConnect()
  173.     {
  174.         BluetoothLEHardwareInterface.DisconnectPeripheral(bleAddress, (bleAddress) =>
  175.         {
  176.             Show(bleAddress + "已经断开");
  177.             otherText.text = "";
  178.             isScanning = false;
  179.         });
  180.     }
  181.     /// <summary>
  182.     /// 字节组转换为字符串
  183.     /// </summary>
  184.     /// <param name="ba"></param>
  185.     /// <returns></returns>
  186.     public static string ByteArrayToString(byte[] ba)
  187.     {
  188.         string hex = BitConverter.ToString(ba);
  189.         return hex.Replace("-", "");
  190.     }
  191. }
复制代码
serviceUUID和characteristicUUID为必要毗连设备的uuid
4、将代码挂载到场景任意物体上,例如Canvas,如图:

将必要引用的组件拖至相应位置
5、制作完成,示例场景如图所示:

6、打包为apk到安卓端可以测试效果
留意打包发布前选择竖屏,手机毗连必要打开蓝牙以及位置信息
三、效果演示

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


2、点击毗连,设备毗连乐成





免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

欢乐狗

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表