记录使用微信小程序的NFC和蓝牙功能读取15693芯片的开发历程

(1) 对于Android手机,直接通过微信小程序调用手机的NFC功能,对15693协议的芯片进行读写操作;

(2)对于苹果手机(及没有NFC模块的手机),通过微信小程序的蓝牙功能连接到蓝牙/NFC读写器,然后通过蓝牙发送指令操作读写器对15693协议的芯片进行读写操作。

 

DAY #1

上午开了半天会,下午开始开发。

 

先开发简单的:直接通过Android手机的NFC模块读写芯片。开发思路如下:

1. 首先调用 wx.getHCEState(OBJECT), 判断设备是否支持NFC,如果不支持就走蓝牙通道;

2. 调用 wx.startHCE(OBJECT) 初始化手机的NFC模块;

3. 初始化完成后,调用  wx.onHCEMessage(CALLBACK) 监听芯片响应的消息;

4. 点击页面上的“询卡”按钮,调用 wx.sendHCEMessage(OBJECT)发送询卡指令;

5. 这时 wx.onHCEMessage(CALLBACK) 应该可以收到带有uid信息的芯片响应数据;

6. 根据uid发送select指令,以及后续多个指令;

7. 全部操作完成后之后,调用 wx.stopHCE(OBJECT) 停止手机的NFC模块;

8. 完成。

 

思路很清晰,并且开发思路中需要用到的每一个NFC的接口都有对应文档,应该是没有什么问题了,接着就开始开发NFC模块了。

 

第一步、微信小程序基本框架搭建,非常顺利的完成界面,调试模式等。

然后开始写nfc模块,首先是 wx.getHCEState(OBJECT),比较顺利,同时测试了一下没有NFC模块的手机/NFC为开启等多种情况的返回值(因为小程序开发文档没有写啊)。

 

然后是初始化NFC模块,也比较顺利。

 

然后完成wx.onHCEMessage(CALLBACK)消息监听,然后就是点击按钮发送消息  wx.sendHCEMessage(OBJECT),从这时开始就开始进入无助的状态。

 

尝试了多组数据进行发送,始终不能触发 wx.onHCEMessage, 折腾了半个小时,未果,等第二天解决吧。

 

DAY #2

 

首先仍然怀疑是数据格式不对,因为第一次开发跟芯片相关的程序,并且也是第一次接触15693协议,所以一开始非常坚定的相信是自己组装的发送数据不对,然后就去请教了芯片开发大牛,以及把15693协议的相关部分读了大约10遍,在网上找15693协议相关资料,百度微信小程序NFC开发资料。

 

还是不能触发 wx.onHCEMessage。

 

直到在微信小程序开发社区,输入关键字“wx.onHCEMessage”,然后从寥寥的几篇post中,终于明白:TMD微信小程序的NFC功能仅仅是把手机模拟成一张芯片卡,而不是把手机当做芯片读写器!WTF! 

 

这时已经下午3点。

 

因为我一开始跟公司领导说的是微信小程序可以直接调NFC读取芯片,这下就尴尬了,对项目的规划影响巨大。然后,抱着一丝恐惧,也抱着一丝希望,多方搜索,多方确认,TMD微信小程序目前确实只能把手机模拟成一张芯片卡。

 

然后跟公司领导电话里简单汇报了一下,领导说第二天开会讨论。

 

然后开始写蓝牙通道的解决方案。

 

微信小程序开放的蓝牙接口如下:

记录使用微信小程序的NFC和蓝牙功能读取15693芯片的开发历程

 

共18个接口,实在是太多了。这里不得不吐槽一下微信小程序的架构师们,你们设计的开发文档太粗糙了,需要开发人员写大量的代码才能完成一些基本功能,比如我自己想要完成的一些功能:

1. 初始化蓝牙模块;

2. 打开/关闭蓝牙发现;

3. 随时只允许单一设备连接,不允许多设备连接;

4. 已连接上的蓝牙断开后自动重连,自动重连失败后提示并继续自动重连;

5. 每次连上蓝牙设备后自动记住蓝牙设备ID,并写入一个长度为5的数组,并写到storage里面,这样下次进入小程序后就可以自动连接曾经连过的蓝牙设备。

 

下面是我希望自己的程序可以这样调用蓝牙模块的伪代码:

1 Page({ 2 onLoad: function(){ 3 ble.onMessageReceived = function(res){ 4 5 }; 6 ble.onDeviceFound = function(device){ 7 //参数是device 而不要 devices 8 }; 9 ble.autoReconnect = true; 10 ble.maxConnections = 1; 11 ble.maxRememberedConnections = 5; 12 ble.init(function(){ //init 方法里面初始化蓝牙模块 13 ble.autoConnectToRememberedDevice(function(res){ 14 if(ble.connectedDevices.length == 0){ 15 //连接记住的设备失败,跳转到蓝牙发现页面 16 } 17 }); 18 }); 19 }, 20 connectToNewDevice: function(newDeviceId){ 21 //由于设置了最大连接数为1,这时调这个方法就会主动断掉之前的连接 22 //这样就不需要先调 disconnect了, 也不需要检查设备ID/状态是否不一致 23 ble.connectToDevice(newDeviceId, function(){ 24 25 }); 26 } 27 });

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspjjx.html