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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/53966.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统优化工具 | PC Cleaner v9.7.0.3 绿色版

PC Cleaner是一款功能强大的电脑清理和优化工具&#xff0c;旨在通过清理系统垃圾文件、解除恶意软件和优化系统性能来提高计算机的运行效率。该软件提供了多种功能&#xff0c;可以帮助用户维护和提升计算机的整体表现。 PC Cleaner 支持 Windows 7 及以上操作系统&#xff0…

Qt使用绿色pdf阅读器打开文件

1.下载SumatraPDF 2.设置 3.代码 void MainWindow::on_pushButton_clicked() {QProcess *process new QProcess();QString filePath "C:\\Users\\jude\\Desktop\\su\\11.pdf";QString sumatraPath "C:\\Users\\jude\\Desktop\\su\\SumatraPDF-3.5.2-64.exe&q…

电瓶车火灾频发背后的隐忧

近年来&#xff0c;电瓶车火灾事件频发&#xff0c;不仅严重威胁着人民群众的生命财产安全&#xff0c;也给社会带来了极大的安全隐患。从城市街道到居民小区&#xff0c;电瓶车火灾的阴影无处不在&#xff0c;如何有效防范与自救成为了全社会关注的焦点。 一、电瓶车火灾频发…

linux_L1_linux重启服务器

使用putty登录到linux服务器切换到管理员账号 sudo -s重启命令 reboot

钾盐矿开采与加工过程中的机电设备选型及管理指南

创作不易&#xff0c;您的打赏、关注、点赞、收藏和转发是我坚持下去的动力&#xff01; 在钾盐矿的开采和加工过程中&#xff0c;需要使用多种机电设备以确保生产的顺利进行。这些设备主要用于矿石开采、破碎、运输、选矿以及矿物产品的深加工等过程。以下是钾盐矿常用的一些机…

Leetcode 字母异位词分组

这道题目的意思就是&#xff1a;把包含字母字符相同的单词分到同一组。 算法思路&#xff1a; 使用哈希表来解决。 首先将每个字符串进行排序&#xff0c;将排序之后的字符串作为 key&#xff0c;然后将用 key 所对应的异位词组 作为value。然后我们使用 std::pair 来遍历 键…

AI prompt(提示词)

# 好用的用于学习的AI提示词 ## 费曼学习法 请使用费曼学习法&#xff0c;用简单的语言解释&#xff08;量子力学&#xff09;是什么&#xff0c;并提供一个简单的例子来说明它如何应用 ## 帕累托法则&#xff08;80/20原则&#xff09; 将&#xff08;量子力学&#xff09;最…

基于SSM的大学生心理健康服务平台的设计与实现---附源码75713

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 相关技术介绍 2.1 SSM框架 2.2 Java语言 2.3 MySQL数据库 3系统分析 3.1 可行性分析 3.2 系统功能分析 3.3 系统用例分析 3.4系统流程分析 3.4.1 用户登录流程 3.4.2 数据删除流程 4 系…

P3565 [POI2014] HOT-Hotels

~~~~~ P3565 [POI2014] HOT-Hotels ~~~~~ 总题单链接 ~~~~~ 2024.9.10&#xff1a;DP方程有问题&#xff0c;已修改&#xff0c;同时更新了长链剖分优化版本。 思路 ~~~~~ 设 g [ u ] [ i ] g[u][i] g[u][i] 表示在 u u u 的子树内&#xff0c;距离 u u u 为 i i i 的点的…

设计模式-行为型模式-访问者模式

访问者模式难以实现&#xff0c;且应用该模式可能会导致代码可读性变差&#xff0c;可维护性变差&#xff0c;除非必要&#xff0c;不建议使用&#xff1b; 1.访问者模式定义 允许在运行时将一个或多个操作应用于一组对象&#xff0c;将操作与对象结构分离&#xff1b; 访问者…

【QT】Qt窗口

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;QT 目录 &#x1f449;&#x1f3fb;菜单栏设置&#x1f449;&#x1f3fb;QToolBar练习 &#x1f449;&#x1f3fb;QStausBar&#x1f449;&#x1f3fb;Q…

Debian11.9镜像基于jre1.8的Dockerfile

Debian11.9基于jre1.8的Dockerfile编写 # 使用Debian 11.9作为基础镜像 FROM debian:11.9 # 维护者信息&#xff08;建议使用LABEL而不是MAINTAINER&#xff0c;因为MAINTAINER已被弃用&#xff09; LABEL maintainer"caibingsen" # 创建一个目录来存放jre …

短剧市场快速发展,短剧APP成为了新的商业机遇

近几年&#xff0c;短剧作为一匹行业黑马&#xff0c;展现出了自身爆发式的发展态势&#xff0c;成功获得了大众关注&#xff0c;短剧的用户群体更是在持续上升&#xff0c;市场规模将达到500亿&#xff0c;发展前景巨大&#xff01; 目前&#xff0c;短剧都在小程序或者APP上…

多态(上)【C++】

文章目录 多态的概念多态的实现多态产生的条件什么是虚函数&#xff1f;虚函数的重写和协变重写协变 析构函数的重写为什么有必要要让析构函数构成重写&#xff1f; 多态的概念 C中的多态是面向对象编程&#xff08;OOP&#xff09;的一个核心特性&#xff0c;指的是同一个接口…

员工监控系统有哪些?6款员工屏幕监控系统大揭秘!(老板必看)

在企业管理中&#xff0c;如何提升员工工作效率并保障公司信息安全始终是管理者关注的焦点。 员工屏幕监控系统正是一个强大的工具&#xff0c;能够帮助企业了解员工的工作状态、管理工作进程&#xff0c;同时防止数据泄露。 今天小编就来为大家揭秘6款优秀的员工监控系统&…

JDK 家族成员 OpenKona 介绍

之前介绍过 JDK 的家族成员&#xff0c;具体戳这里。 本文将介绍 OpenKona(TencentKona)。 OpenKona 是基于 OpenJDK 研发的、支持国内技术生态和标准、开放源代码的 Java 开发工具包。OpenKona 兼容 JavaSE 规范&#xff0c;经过海量业务生产验证&#xff0c;生产环境开箱即用…

【linux笔记dpkg-buildpackage打包】把一个helloworld程序打包为deb包

说明 打包发布可以不用编译源代码安装&#xff0c;看起来是更方便的软件拷贝方式&#xff0c;下面是一个dpkg-buildpackage工具的最简打包过程实例 先建立一个helloworld程序 main.c #include <stdio.h>int main() {printf("Hello, World!\n");return 0; }…

长短期记忆网络和UKF的结合|Python代码例程

结合长短期记忆网络(LSTM)和无迹卡尔曼滤波器(UKF)的技术在机器人导航和状态估计中具有广泛的应用前景。 文章目录 结合LSTM和UKF的背景结合LSTM和UKF的优势应用实例研究现状Python代码示例结合LSTM和UKF的背景 长短期记忆网络(LSTM)是一种特殊的递归神经网络(RNN),…

电巢科技携Ecosmos元宇宙产品亮相第25届中国光博会

第25届中国国际光电博览会&#xff08;“CIOE中国光博会”&#xff09;今日在深圳国际会展中心盛大开幕。本届博览会以“光电引领未来&#xff0c;驱动应用创新”为主题&#xff0c;吸引了全球超过3700家优质光电企业参展&#xff0c;展示了光电产业的最新成果和前沿技术。 电…

动手学深度学习(pytorch土堆)-04torchvision中数据集的使用

CIFAR10 CIFAR-10 数据集由 10 个类的 60000 张 32x32 彩色图像组成&#xff0c;每个类有 6000 张图像。有 50000 张训练图像和 10000 张测试图像。 数据集分为 5 个训练批次和 1 个测试批次&#xff0c;每个批次有 10000 张图像。测试批次包含每个类中随机选择的 1000 张图像…