在开发前,以为蓝牙这块已经很成熟了,基本信手拈来。

蛋是!搜索一圈下来,发现unity支持蓝牙开发的寥寥无几,找下来就发现一个BLE的插件和一个arduino的插件。然而...我要做的是通过PC的蓝牙模块来连接并取得蓝牙传感器数据,开始方了...

由于我是一个unity钉子户,.Net的winform不会写,网上找到的窗体应用也无法复用,又没有开发过蓝牙,项目又催得紧,只能抓紧时间各种找资料。

功夫不负有心人,在stack上找到一个国外大牛的发言,他自己做了一套unity可以调用BLE的库,果断请教。

后来去大佬的github down下来,(末尾已贴链接)本地打开测试后已经可以连接,但是会遇到身份验证无法通过的一个问题,问过硬件厂商说没有加身份验证。

然后偶然发现是我在电脑的蓝牙上需要先连接匹配上传感器,然后在项目内在扫描蓝牙设备,找到自己需要的service name和特征码,点击订阅,就可以接收到传感器的数据了,贴下我自己修改的部分代码,基本没啥大改。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;public class Demo : MonoBehaviour
{public GameManager manager;public bool isScanningDevices = false;public bool isScanningServices = false;public bool isScanningCharacteristics = false;public bool isSubscribed = false;public Text deviceScanButtonText;public Text deviceScanStatusText;public GameObject deviceScanResultProto;public Button serviceScanButton;public Text serviceScanStatusText;public Dropdown serviceDropdown;public Button characteristicScanButton;public Text characteristicScanStatusText;public Dropdown characteristicDropdown;public Button subscribeButton;public Text subcribeText;public Button writeButton;public InputField writeInput;public Text errorText;Transform scanResultRoot;public string selectedDeviceId;public string selectedServiceId;Dictionary<string, string> characteristicNames = new Dictionary<string, string>();public string selectedCharacteristicId;Dictionary<string, Dictionary<string, string>> devices = new Dictionary<string, Dictionary<string, string>>();string lastError;// Start is called before the first frame updatevoid Start(){scanResultRoot = deviceScanResultProto.transform.parent;deviceScanResultProto.transform.SetParent(null);}GameObject g = null;// Update is called once per framevoid Update(){BleApi.ScanStatus status;if (isScanningDevices){BleApi.DeviceUpdate res = new BleApi.DeviceUpdate();do{status = BleApi.PollDevice(ref res, false);if (status == BleApi.ScanStatus.AVAILABLE){if (!devices.ContainsKey(res.id)){devices[res.id] = new Dictionary<string, string>() {{ "name", "" },{ "isConnectable", "False" }};}if (res.nameUpdated)devices[res.id]["name"] = res.name;if (res.isConnectableUpdated)devices[res.id]["isConnectable"] = res.isConnectable.ToString();// consider only devices which have a name and which are connectableif (devices[res.id]["name"] != "" && devices[res.id]["isConnectable"] == "True"){// add new device to listGameObject g = Instantiate(deviceScanResultProto, scanResultRoot);g.name = res.id;g.transform.GetChild(0).GetComponent<Text>().text = devices[res.id]["name"];g.transform.GetChild(1).GetComponent<Text>().text = res.id;}}else if (status == BleApi.ScanStatus.FINISHED){isScanningDevices = false;deviceScanButtonText.text = "扫描设备";deviceScanStatusText.text = "finished";}} while (status == BleApi.ScanStatus.AVAILABLE);//isScanningDevices = false;}if (isScanningServices){BleApi.Service res = new BleApi.Service();do{status = BleApi.PollService(out res, false);if (status == BleApi.ScanStatus.AVAILABLE){serviceDropdown.AddOptions(new List<string> { res.uuid });// first option gets selectedif (serviceDropdown.options.Count == 1)SelectService(serviceDropdown.gameObject);}else if (status == BleApi.ScanStatus.FINISHED){isScanningServices = false;serviceScanButton.interactable = true;serviceScanStatusText.text = "finished";}} while (status == BleApi.ScanStatus.AVAILABLE);}if (isScanningCharacteristics){BleApi.Characteristic res = new BleApi.Characteristic();do{status = BleApi.PollCharacteristic(out res, false);if (status == BleApi.ScanStatus.AVAILABLE){string name = res.userDescription != "no description available" ? res.userDescription : res.uuid;characteristicNames[name] = res.uuid;characteristicDropdown.AddOptions(new List<string> { name });// first option gets selectedif (characteristicDropdown.options.Count == 1)SelectCharacteristic(characteristicDropdown.gameObject);}else if (status == BleApi.ScanStatus.FINISHED){isScanningCharacteristics = false;characteristicScanButton.interactable = true;characteristicScanStatusText.text = "finished";}} while (status == BleApi.ScanStatus.AVAILABLE);}if (isSubscribed){ BleApi.BLEData res = new BleApi.BLEData();while (BleApi.PollData(out res, false)){subcribeText.text = BitConverter.ToString(res.buf, 0, res.size);subcribeText.text= Hex2Ten(subcribeText.text);string[] TenArray = subcribeText.text.Split(' ');//manager.currentturnCount = manager.totalturnCount -lastCount ;manager.totalturnCount = int.Parse(TenArray[18]);}}{// log potential errorsBleApi.ErrorMessage res = new BleApi.ErrorMessage();BleApi.GetError(out res);if (lastError != res.msg){Debug.LogError(res.msg);errorText.text = res.msg;lastError = res.msg;}}//lastCount = manager.totalturnCount;//Debug.Log("lastCount" + lastCount);//Debug.Log("currentturnCount" + manager.currentturnCount);}int lastCount = 0;public static string Hex2Ten(string hex){string[] array = hex.Split('-');string str = "";for (int k = 0; k < array.Length; k++){int ten= Convert.ToInt32(array[k], 16);str += ten.ToString() + " ";}return str.ToString();}private void OnApplicationQuit(){BleApi.Quit();}public void StartStopDeviceScan(){if (!isScanningDevices){// start new scanfor (int i = scanResultRoot.childCount - 1; i >= 0; i--)Destroy(scanResultRoot.GetChild(i).gameObject);BleApi.StartDeviceScan();isScanningDevices = true;deviceScanButtonText.text = "停止扫描";deviceScanStatusText.text = "scanning";}else{// stop scanisScanningDevices = false;BleApi.StopDeviceScan();deviceScanButtonText.text = "扫描设备";deviceScanStatusText.text = "stopped";}}public void SelectDevice(GameObject data){for (int i = 0; i < scanResultRoot.transform.childCount; i++){var child = scanResultRoot.transform.GetChild(i).gameObject;child.transform.GetChild(0).GetComponent<Text>().color = child == data ? Color.red :deviceScanResultProto.transform.GetChild(0).GetComponent<Text>().color;}selectedDeviceId = data.name;serviceScanButton.interactable = true;}public void StartServiceScan(){if (!isScanningServices){// start new scanserviceDropdown.ClearOptions();BleApi.ScanServices(selectedDeviceId);isScanningServices = true;serviceScanStatusText.text = "scanning";serviceScanButton.interactable = false;}}public void SelectService(GameObject data){selectedServiceId = serviceDropdown.options[serviceDropdown.value].text;characteristicScanButton.interactable = true;}public void StartCharacteristicScan(){if (!isScanningCharacteristics){// start new scancharacteristicDropdown.ClearOptions();BleApi.ScanCharacteristics(selectedDeviceId, selectedServiceId);isScanningCharacteristics = true;characteristicScanStatusText.text = "scanning";characteristicScanButton.interactable = false;}}public void SelectCharacteristic(GameObject data){string name = characteristicDropdown.options[characteristicDropdown.value].text;selectedCharacteristicId = characteristicNames[name];subscribeButton.interactable = true;writeButton.interactable = true;}public void Subscribe(){// no error code available in non-blocking modeBleApi.SubscribeCharacteristic(selectedDeviceId, selectedServiceId, selectedCharacteristicId, false);isSubscribed = true;}public void Write(){byte[] payload = Encoding.ASCII.GetBytes(writeInput.text);BleApi.BLEData data = new BleApi.BLEData();data.buf = new byte[512];data.size = (short)payload.Length;data.deviceId = selectedDeviceId;data.serviceUuid = selectedServiceId;data.characteristicUuid = selectedCharacteristicId;for (int i = 0; i < payload.Length; i++)data.buf[i] = payload[i];// no error code available in non-blocking modeBleApi.SendData(in data, false);}
}

中间做了一个取值和进制转换,就可以渠道自己想要的数据了。

https://github.com/adabru/BleWinrtDll

再次感谢大佬,希望有用到的朋友可以给他点个star。

ok,分享就到这了。

下载不了的私信我。

下载地址:BleWinrtDll-main.zip-互联网文档类资源-CSDN下载

使用Unity开发在PC端连接并接收蓝牙数据相关推荐

  1. 第48篇 接收蓝牙数据及PHP研究 Saturday

    一.接收蓝牙数据 1.1 Chrome extension接口 接口名称:chrome.extension 地址:https://developer.chrome.com/extensions/ext ...

  2. APP实现接收蓝牙数据并动态绘图

    APP实现接收蓝牙数据并动态绘图 效果展示

  3. unity开发微信小游戏(5)- 微信好友排行榜

    效果展示: 如果感觉文章有用的,也烦请大家多多支持(扫描上面二维码n(*≧▽≦*)n)!!❤❤❤ unity开发微信好友排行榜可以说是把我虐的体无完肤,但为了拿下这功能,硬壳了三天,把我所踩过的坑分享 ...

  4. 【Android 逆向】Android 逆向通用工具开发 ( Android 端远程命令工具 | Android 端可执行程序的 main 函数操作 | TCP 协议服务器建立 | 接收客户端数据 )

    文章目录 前言 一.Android 端可执行程序的 main 函数操作 二.Android 端 TCP 协议服务器建立 三.Android 端接收 PC 端传来的数据 四.博客资源 前言 本篇博客重点 ...

  5. unity开发入门_Unity游戏开发终极入门指南

    unity开发入门 Unity is a great tool for prototyping everything from games, to interactive visualisations ...

  6. Windows Mobile 与 PC之间的通过蓝牙(Bluetooth) 传输文件的开发

    背景 之前也写过一些Windows Mobile和Wince下Bluetooth开发的文章如下. .NET Compact Framework下的Bluetooth开发 之 Windows Embed ...

  7. C#微信公众号开发系列教程五(接收事件推送与消息排重)

    C#微信公众号开发系列教程五(接收事件推送与消息排重) 原文:C#微信公众号开发系列教程五(接收事件推送与消息排重) 微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续 ...

  8. Unity开发《一起来捉妖》教程 | 1.陀螺仪控制相机

    洪流学堂,让你快人几步.你好,我是郑洪智. 洪流学堂公众号回复捉妖,可以获取本教程的源码工程. 大智:"小新,你小子最近是不是谈恋爱了,怎么天天往外跑?" 小新:"嘿嘿& ...

  9. 使用Unity开发RPG游戏完整指南(全)

    使用Unity开发RPG游戏完整指南(全) - GameRes游资网 关注公众号 风色年代(itfantasycc) 200G Unity资料合集送上~ 本教程教大家如何使用Unity创建一个RPG游 ...

最新文章

  1. php异常跑出,php 抛出异常但继续往下执行为什么
  2. 来自 IsayNo (@IsayNooo) 的推文
  3. 【CF888G】Xor-MST(最小生成树,Trie树)
  4. 你可能不知道的java、python、JavaScript以及jquary循环语句的区别
  5. 金三银四的腾讯、阿里、​字节等大厂前端社招面经
  6. stackexchange.mysql_.net core使用redis基于StackExchange.Redis
  7. windows 下编译libcurl,通过url下载图片数据
  8. 去掉字符串最后一个字符
  9. Flink on Zeppelin (1) - 入门篇
  10. BRVAH(BaseRecyclerViewAdapterHelper)详解
  11. HTML+CSS+JS新年倒计时(实时更新)
  12. 配置分离式LANP源代码编译实例
  13. BEC剑桥英语高级真题4 Test 2-Part 2-High fliers of the future head for specialist fairs
  14. 【VOLTE】【SRVCC】 SRVCC TO 3GPP
  15. 极客算法训练笔记(七),十大经典排序之归并排序,全网最详
  16. 华为matebook14摄像头无法启动问题
  17. VS Code远程调试报错:Exception escaped from start_client
  18. 如何应对面试官问你职业规划问题
  19. 服务器的表格修复原来的内容,数据恢复 数据修复 远程数据恢复 EXCEL文件修复 XLS表格修复 WORD文档修复 DOC档案修复 - 慧龙软件服务中心...
  20. Solid Converter PDF,PDF转Word的利器

热门文章

  1. nuxt3: 不同环境.env文件应用
  2. 机器学习:基于朴素贝叶斯对花瓣花萼的宽度和长度分类预测
  3. 电话号码的正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号)
  4. 墨刀的初级应用 UI设计师展现作品的神器
  5. 以太坊2.0区块链代码将于下个月最终确定
  6. Pe怎么备份linux数据,如何用PE给电脑系统做备份
  7. 计算机u盘使用记录在哪里,如何清除电脑系统中U盘使用记录(图文)
  8. 网站后台 英文用户名不区分大小写都可以登录...
  9. 职称计算机证书A级,英语A级证书是什么证书
  10. Unity 动画驱动位移的动画fbx导入设置