公司做的项目有需要连接第三方的蓝牙设备,要求Android、IOS都要连接这台蓝牙设备,然后去识别NFC标签。
那个设备是德科物联的,DK309的设备,在这记录一下开发的过程。
首先呢,去了解了一下蓝牙设备的一些基础知识,这个可以在很多网站上都可以查得到。大致过程就是:
1. 我这边首先拿到了第三方的设备,然后尝试用自己的手机的蓝牙去连接,一直连接不上,然后找到了厂家,他们给了测试用的APK。结合网络上查询到的知识,得到一个新的知识点。并不是所有蓝牙设备连接的时候都需要确认匹配的那个pin码,以前连耳机这些都是需要点击确认的。
2. 然后就是,厂家只有原生的Android和IOS的方法,并没有那种在uniapp上使用的那种。然后就是下载手机端测试蓝牙连接的软件,IOS和Android平台都有一个叫LightBlue的软件,可以测试和设备的通信。
3. 然后就是基于uniapp的蓝牙连接的过程,有很多可以参考的文档,我这边是参考的这些文章:
https://www.cnblogs.com/mlw1814011067/p/16708559.html
UNI-APP实现物联网中BLE蓝牙的数据交互 - 知乎
蓝牙设备有设备ID,服务值,特征值。uniapp也提供了蓝牙连接的方法,在官网上就有。大致步骤在文章中也写了思路。
主要踩坑的点是,uniapp的那些关于蓝牙的方法,最好最好最好用settimeout异步一下,不然返回的数据结果很有可能是空的。让你误以为没连接上没数据。
然后就是根据第三方提供的底层协议,向蓝牙设备发送指令,然后解析返回的结果,这个就要根据具体设备进行定制了。
deviceId: {{ item.deviceId }} 信号强度: {{ item.RSSI }}dBm ({{
Math.max(100 + item.RSSI, 0)
}}%)
连接
断开
已成功连接蓝牙设备
监听
与蓝牙设备建立通信成功
开始识别
{{ findCardText }}
停止识别
获取NFC内容
返回巡检页面
{{nfcDataASCI}}
这个代码里面添加了对应的指令以及解析对应的数据。需要一定的NFC标签卡的数据存储结构的知识,可以参考这篇文章。
浅谈Mifare ultralight原理_liujianhua1989的博客-CSDN博客
大致就是,NFC卡都有16个块存储数据,除了卡片自身的UID 外,还有存储的写入数据。
代码里面加了两个页面的跳转通信,在需要跳转的页面,用这种方法来进行读取设备识别到的NFC标签数据内容。A页面,跳转到蓝牙连接的页面。则在A页面加上:
uni.navigateTo({
url: '页面的路径',
events: {
acceptDataFromOpenedPage: function(data) {
console.log(data)
},
getNFCCompleteCode: function(NFCData) {
console.log(NFCData)
}
},
success:function(res){
res.eventChannel.emit('acceptDataFromOpenerPage', { data: '从巡检列表过来的' })
}
})
难点就在于,向设备发送数据,uniapp提供的方法只示例发送0x00的16进制数据。
因为第三方的通行协议上写的指令都是十六进制,所以我这边把指令都转换为10进制对应的值,然后再通过ArrayBuffer和DataView进行转换成数据流。这个在代码的writeDateTo方法可以看到。