aftershokz蓝牙搜不到_硬核!小程序时怎么控制蓝牙设备的?

cbb2814c6e4622803292dc08466ff9f4.png

文章涉及到大量软硬件知识,没有编程基础的小伙伴看起来会很吃力,硬核预警!

434d8cf38790c2fdea1e04bddb4f42fb.png

hi,大家好,因为个人原因没办法上传视频,所以最近将会以文章的形式进行更新,点赞投币收藏转发还是需要的,谢谢大家。

如果说你们公司要开发蓝牙应用,或者说你作为爱好者需要用蓝牙来控制东西,那么你怎么去控制蓝牙设备呢?按照传统来说,你只能开发手机APP了,因为手机有蓝牙功能直接编写出来的APP自然有能力去调用手机自身的硬件。但是如果你以前就没接触过手机APP的开发,这个时候你绝对化抓瞎,因为学习曲线太陡你的投入产出根本就不会形成正比,另一方面如果我们只是简简单单的为我们自己的diy项目提供一个控制的界面直接去写一个APP那其实也是杀鸡用牛刀,这个时候你就必须要使用小程序进行蓝牙的开发了。由于篇幅限制我不能铺垫太多东西,这里罗列一下软硬件及开发环境:硬件使用ESP32开发环境为arduino,小程序开发环境为uniapp开发语言为vuejs。OK,那么开始吧。

434d8cf38790c2fdea1e04bddb4f42fb.png

首先,我们来研究一下蓝牙的硬件方面,市面上有很多蓝牙芯片,但是在我的元件库中只有一个ESP32开发板,这个芯片挺有意思既有wifi也有蓝牙,同时蓝牙更是BLE低功耗蓝牙版本为蓝牙4.0,(你想使用小程序控制蓝牙设备时非常重要的,小程序只能控制BLE蓝牙!!!一定要注意!)

4edac10df0d2419ba950123a04d32a80.png

esp32可以使用的软件开发环境有官方的有microPython同时也有大名鼎鼎的arduino,我为什么选用arduino是因为目前为止只有arduino的esp32蓝牙库是比较稳定的,同时开发方式也比较简单,友情提示一下,目前你在网上去搜索的教程都不太靠谱!最直接的方式是直接去阅读官方例程!废话不多说,直接看蓝牙部分的源代码。

dd1d36bcddf049bf923c89aff7ae3a12.png

我在硬件代码中,能写的注释已经都写了,对于蓝牙来说不得不啰嗦一些:对于蓝牙来说1.蓝牙服务 2.蓝牙特征,这两个概念是必须要搞清楚的,大致的理解课参考如下图:

d51cdfd5c3516a496c02ceb1938a268b.png

适当幼儿园化的解释是,每个蓝牙芯片可以有多个蓝牙服务,每个蓝牙服务又可以包括多个特征,我们最终是通过特征进行读写数据的,因此硬件设备上定义好服务和特征尤为重要。如上面蓝牙设备的硬件代码中可以看出,我定义了一个蓝牙服务,同时定义了四个特征。(那么,这里其实是有一个大坑的,在广播信息的时候,安卓系统和ios系统是有差别的,同时广播数据时,把定义的服务id广播出去才能加速连接,这点非常必要)

434d8cf38790c2fdea1e04bddb4f42fb.png

那么,我们之前处理好了硬件部分,重头戏就来了,接下来使用微信小程序控制蓝牙设备了。一开始我就想问一个问题,为什么小程序能控制蓝牙呢?换着方式来问就是,为什么小程序这个页面能控制硬件蓝牙呢?我总结了一下小程序和微信及手机系统的关系:

9a7cafe71b8c00d89a2fde62c50549db.png

微信对外提供除了API(应用程序接口),这就回答了上一个问题,为什么小程序的页面能够控制手机的蓝牙硬件。因为微信的APP是直接安装在手机上的,所以微信能够有能力去直接操作手机上的硬件设备,而小程序又是寄生在微信身上,因此小程序就有了控制手机硬件设备的能力了,是不是非常有意思?理清了原理,那我们去开发吧,这个时候你会问有没有api文档可以参考啊?微信官方提供的小程序的api文档地址为:https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/wx.onBLEPeripheralConnectionStateChanged.html

然后怎么找微信能控制什么设备呢?

2a8cb8abdc8f34128af4455339900724.png

好了,铺垫好了,开始撸小程序代码了。这篇文章的核心就来了,这是所有人都不会告诉你的事情。那么当你不管是用什么控制蓝牙应该用什么流程去控制?应该是这样几步:1.打开蓝牙适配器,2.搜索蓝牙,3.连接蓝牙,4.发送数据,5.关闭连接。理论很好,实际映射到我们的小程序代码里到底要怎么写?这才是重中之重。

第一步:

5f823b643bb77aa0c2cd08c00eaede9a.png

我们为了防止用户瞎操作出现奇奇怪怪的问题,必须把蓝牙的连接放在小程序页面显示的时候去连接!

8ed9dff9f547f6d9385f465e3533674d.png

eae49095a0b803a75d9b8e305d1170dc.png

e9601316cae82704a3cc585baf1e576c.png

代码写在这里,就有一个非常核心的问题了。那就是ios和安卓连接蓝牙是不一样的。有什么不一样?ios和安卓这两个手机系统里面搜索出来的蓝牙服务id是不一样的,你一脸懵逼,什么跟什么啊。那我就简单解释一下,还记得我们在硬件那块说了服务和特征,最终反映到代码中他们对应到一个字符串id,如图中显示,我的定义如下:

cf4fcda1fdaa7b62fb4dfb6b52108182.png

ios和安卓的差别就在这里体现出来了,安卓手机搜索出来的各种uuid都是你硬件中定义的id,但是!在ios中搜索出来就就不一样了。我硬件里定义的serviceid是“abcdefghjkl”,安卓里搜索出来的也是“abcdefghjkl”,ios里面搜索出来的可能就是“uip34344ggfg”这种样子了。你又会问啊,不一样就不一样有什么区别?区别就在于要连接蓝牙必须要通过这个id去连接,如果它在两个系统里会变那我们想直接去连接就不行了,就必须要搜索出来才能去连接了。这就是代码里为什么要判断手机系统,安卓我们直接连接,ios搜索一下直到搜索到我们的设备才去连接。这种情况下连接速度就变慢了!

然后,我们连接上蓝牙了又怎么发送和读取数据呢?这里又扯到之前的特征这个东西了,特征也是有id的,我们通过这个id才能去读写数据,使用这个api:

b669e2b6b4ca2611635db63ad999dc04.png

你从这个接口的注释中可以看到设备id,服务id特征id这三个id同时确定才能通过蓝牙读写数据,这里ios安卓两个平台有区别所以在处理的时候必须要针对两种平台做不通处理。同时有个必须要处理的是,发数据发什么样的数据呢?向硬件发送字符串“abcdefg”可以吗?回答是绝对不行!!这就扯到了数据是怎么传输的,任何数据在网络上传输都是通过二进制形式进行传输的!!二进制!!!二进制!!二进制!!将你的数据利用js转换成二进制是一个技术活,我这里提供一个样板!

d6c2b7bc876621c45f98b9ce2e682748.png

那么硬件中的回调函数要怎么写呢?如下图:

dd3dd94bc08a98fe12d781160bf68e6b.png

我在硬件中定义的是,当蓝牙发送“1”到重启设备特征时,设备就重启。但是1可不是单单的1,在ASCII码中,1对应的是49所以要去判断发送的值是不是49而不是1,这里涉及到了ASCII码,不明白的需要去理解理解。

434d8cf38790c2fdea1e04bddb4f42fb.png

OK,流程说的差不多了。开始说你永远搜不到的坑了!!

第一:ios和安卓系统中蓝牙相关id搜索出来是不一样的,要根据不同系统做兼容性处理。

第二:即使你知道各种id在ios系统中,你都必须要搜索一遍,否则无法使用!也就是说ios中要做很多看似脱裤子放屁的事情,但是比必须要这么做。

第三:连接上的蓝牙设备你再次搜索是搜索不出来的

第四:数据必须要通过二进制的形式发送

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值