前段时间收到一个蓝牙设备,需求是控制板子上面的电机,这对于从未接触过硬件的小白来说无疑是一个挑战,然而我是一个喜欢挑战的蓝人,于是开始了我的研究。
我开始各种搜罗Demo,查看文档及各大论坛。
终于,黄天不负苦心人,我成功的连接上了设备,并且获取到了他的服务及特征值,当然,每台外设可用的服务及特征值都是不一样的,而且有些是不可用的,什么 read、write、notify、indicate 要根据自己的操作需求去看哪个特征值支持。每个服务下面都有不同的特征值,每个特征值下面又分出来几个不同的特征值列表,接下来就是根据自己需求筛选了。
支持列表:
read:读取低功耗蓝牙设备的特征值的二进制数据值
write:向低功耗蓝牙设备特征值中写入二进制数据
notify || indicate:启用低功耗蓝牙设备特征值变化时的 notify 功能,订阅特征值
这些都选好后该开始向蓝牙设备写入指令,让他动起来了(想想就有些小激动)
不过根据官方提供的方式转换指令并写入的时候,意外发生了!
我在回调里面打印成功与否的时候,显示成功,但是设备却没人任何反应,于是我又开始找原因(设备通过某个App试过,写入指令后是正常的),又开始了我的搜寻之旅。
之后发现原因是因为我使用的指令转换后超过了20字节,在Api文档中
https://developers.weixin.qq.com/miniprogram/dev/api/wx.writeBLECharacteristicValue.html
标注了建议每次写入不超过20字节,但是也不是强制性的呀,导致我很懵逼,明明返回的是成功。
事到如今,只能接着寻找解决方法了,总不能跟他这么耗着呀。接着我的搜寻之旅吧!(废话那么多,重点该来了)
终于,找到种分包的方式,把超过20字节的指令分批发送(当然,没有超过20字节的话,也不影响使用),这边需要注意一下,不能直接连发,需要有一个延迟,然后~完美写入指令,我的小电机动起来了。
整体的流程如下:
打开蓝牙模块 => 搜索蓝牙 => 获取所有已发现的设备 => 连接蓝牙设备 => 获取蓝牙设备的所有服务 => 获取蓝牙设备服务下的所有特征值 => 向蓝牙设备写入指令 => 完成 =>关闭蓝牙模块
行了,不哔哔了。我结合官方提供的Demo修改了一下,添加了一个分包写入,已经打包成代码片段,可以直接使用。
代码片段中服务和特征值这两个地方我写成了固定的,根据自己的需求可以修改下。
核心代码:
延时定时器
格式转换
判断并分包写入
代码片段:
https://developers.weixin.qq.com/s/oFJc70mI7o8K
如有不对的地方或者更好的解决方案,还望大佬们及时提出,希望对你们有所帮助。