基于uni-app的商用化蓝牙通讯模块设计
前言
物联网设备与外界交互,一般使用蓝牙模块、WIFI模块、4G模块、网卡模块4大模块中的一种或多种同时共用,但蓝牙通讯是其中最经济的一种,也是搭配最广泛的一种。
uni-app是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等多个平台。
基本上我们在uni-app下开发完善好蓝牙通讯模块,可以适配全端,给用户提供更流畅的体验。
来百度APP畅享高清图片
设备与APP交互流程
初始化蓝牙设备 - 开启搜索周边设备 - 选择物联网设备连接 - 获取设备服务 - 监听设备Notify服务及获取写通道UUID - 通过写通道向设备发消息、通过Nofity服务获取物联网设备回返消息
强壮商用模块要点
一、初始化蓝牙前的鉴权及主动授权
- 小程序鉴定是否开启蓝牙及位置服务授权,未授权主动提示用户去手动开启授权(APP环境跳过此步骤)
- 检测对APP授权蓝牙、位置权限,未授权提示用户进入APP授权页,让用户手动授权。安卓可直接授权、IOS必须手动授权
- 初始化蓝牙设备,错误消息码处理 如已授权,但用户关闭了蓝牙,需要提示用户主动开启蓝牙
二、搜索周边设备
- 根据广播名筛选功能 如开始名规则匹配、全名匹配、模糊匹配等过滤规则
- 根据信号值筛选功能 如RSSI值 > -80dBm
- 自动记忆功能,方便生产环境下,已记忆的广播名无需搜索,直接连设备
三、连接设备
- 连接失败尝试重连 任何连接都不能保证百分百,重连机制可保证生产的稳健性。
四、获取设备主服务
- 连接成功设备需延时获取设备主服务,第一时候获取设备主服务,基本上获取不到,具体可成功获取时间视物联网设备而定,这里需要做三次及以上,每次延时1秒的尝试
- 安卓针对物联网设备比较友好,如物联网设备出厂时已固化通道UUID,可直接跳过获取主服务步骤,直接监听Notify服务
五、监听Notify服务
- 监听Notify服务失败尝试重监听
六、队列化执行事件
实际应用场景中,需求千变万化。但根据场景,基本上归结为4类事件
- MacIsWork 设备是否在广播中
- ConnectMac 连接指定的广播设备
- NotityMac 连接并监听设备Notify服务
- SendMessageToMac 发送数据包到设备,未连接先连接,未Notify先Notify,直到发送成功或发生错误
无论以哪种场景下与物联网设备交互,均遵守上面提到的“设备与APP交互流程”,但需要根据场景,跳过已完成的流程及补全未完成的流程。所以第一个动作均需要把“设备与APP交互流程”形成一个队列,按队列执行完后,触发完成事件钩子,失败触发失败事件钩子。
六、蓝牙模块的状态
- 模块各类状态:
- DeviceStatus:{
- IsInit:false//初始化状态
- ,available:true//设备是否可用
- ,Discovery:false//搜索设备中
- ,Connecting:false//连接中
- ,Connected:false//是否连接
- ,HadNotify:false//是否初始化通道
- }
- 设备错误描述详细
- DeviceErrorRes:
- {
- InitError:null//初始化错误
- ,DiscoveryError:null//发现设备错误
- ,ConnectDeviceError:null//连接设备错误
- ,GetDevicesError:null//获取主服务错误
- ,NofityError:null//通道错误
- }
结语
涉及到硬件交互的模块,均需要大量的试错,优化调整。此蓝牙通讯模块均以实际应用场景为测试环境,经过8次重大优化调整而总结出来的可商用化的模块方案,分享给大家