马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
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"下面,修改后的代码如下:
- <?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、点击毗连,设备毗连乐成
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |