当前位置: 首页 > news >正文

Unity for Android使用蓝牙低功耗Bluetooth LE

Unity2021.3.35f1

插件:Bluetooth LE for iOS and Android v2.3.unitypackage

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

2.修改插件中的AndroidManifest文件

<?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.编写UI

2个按钮:StartScanningBtn(扫描)、DisconnectBtn(断开连接)

2个Text

1个Container(带Vertical Layout Group),用于显示扫描到的终端

4.制作预制体DeviceInfo,一个Button一个Text,点击按钮可连接蓝牙终端

预制体上挂一个脚本DeviceInfo,代码始下

using UnityEngine;
using UnityEngine.UI;public class DeviceInfo : MonoBehaviour
{public Button btnConnect;public Text textName;public Text textAddress;
}

5.编写BlueToothTest.cs代码

using System;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.UI;public class BlueToothTest: MonoBehaviour
{//连接的蓝牙mac地址private string bleAddress;//表示是否开始扫描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);DeviceInfo info = game.GetComponent<DeviceInfo>();info.textName.text = name;info.textAddress.text = address;game.transform.localScale = Vector3.one;game.transform.SetParent(container);info.btnConnect.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) =>{otherText.text += "连接成功\n";SubscribeCharacteristicWithDeviceAddress(address, serviceUUID, characteristicUUID);});}catch (Exception e){Show("连接失败");}}/// <summary>/// 连接成功的回调/// </summary>private void SubscribeCharacteristicWithDeviceAddress(string address, string serviceUUID, string characteristicUUID){if(!string.IsNullOrEmpty(serviceUUID) && !string.IsNullOrEmpty(characteristicUUID)){otherText.text += "正在订阅消息:"+ serviceUUID + ":" + characteristicUUID + "\n"; 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("-", "");}
}

6.挂载脚本并赋值,打包apk运行

注:本文参考了Unity插件-适用于iOS,tvOS和Android的蓝牙LE(2.3)的测试使用方法_unity蓝牙-CSDN博客

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • linux 操作系统下crontab命令及使用案例介绍
  • mysql对于上期同期的时间的处理
  • 【QT】使用QOpenGLWidget后,窗口全屏之后右键菜单出不来的问题
  • 软件测试面试少走弯路
  • burp suite professional 产品介绍
  • 程序员转行方向推荐
  • 99AutoML 自动化机器学习实践--NNI 自动化机器学习工具包
  • Rider使用习惯
  • 【C++】——string类的模拟实现
  • OpenAI o1 Review 大模型PHD水平数理推理能力 OpenAI o1 vs GPT4o vs Gemini vs Claude
  • SVN的使用技巧
  • 《黑神话:悟空》怎么备份游戏存档?
  • 【C++】认识C++(前言)
  • 顶级高效的ChatGPT论文润色提示词和使用技巧
  • AndroidStudio清除重置Http Proxy代理的方式
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【刷算法】求1+2+3+...+n
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • Android框架之Volley
  • Angular数据绑定机制
  • k8s如何管理Pod
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Python语法速览与机器学习开发环境搭建
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • vue中实现单选
  • 官方解决所有 npm 全局安装权限问题
  • 技术:超级实用的电脑小技巧
  • 悄悄地说一个bug
  • 少走弯路,给Java 1~5 年程序员的建议
  • 一个完整Java Web项目背后的密码
  • 智能合约Solidity教程-事件和日志(一)
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (八)Spring源码解析:Spring MVC
  • (独孤九剑)--文件系统
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (四)汇编语言——简单程序
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转载)Linux网络编程入门
  • ***原理与防范
  • *上位机的定义
  • .gitignore文件_Git:.gitignore
  • .NET 5种线程安全集合
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • [1181]linux两台服务器之间传输文件和文件夹
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • [20190416]完善shared latch测试脚本2.txt
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [BUUCTF NewStarCTF 2023 公开赛道] week3 crypto/pwn
  • [BZOJ] 2044: 三维导弹拦截
  • [C++]AVL树怎么转