(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微信小程序目前确实只能把手机模拟成一张芯片卡。
然后跟公司领导电话里简单汇报了一下,领导说第二天开会讨论。
然后开始写蓝牙通道的解决方案。
微信小程序开放的蓝牙接口如下:
共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 });