姜 帆,聂建波,李 延,秦理想,丁贺苹
(1.北京智芯微电子科技有限公司 国家电网公司重点实验室 电力芯片设计分析实验室,北京 100192;2.北京智芯微电子科技有限公司 北京市电力高可靠性集成电路设计工程技术研究中心,北京 100192;3.国网浙江省电力公司物资分公司,杭州 310007)
IC卡读卡器是读写IC卡的机具设备,早前大多数读卡器通过USB通讯线连接到PC机才能够使用,这种方式的弊端就是移动性和便携性较差。在移动技术快速发展的今天,随着智能手机的迅速普及以及大规模物联网的快速发展,IC卡读卡器也迎来了跨越式发展,由以前的只支持PC机的Windows系统发展到可以支持手机的Android和IOS系统,因此IC卡读卡器正向着小型化、便携化的方向发展,当前大多数移动式读卡器的开发模式是在硬件读卡设备上集成一个蓝牙模块,然后通过蓝牙与手机的蓝牙通讯,这种方式需要在手机上开发一款APP应用软件。而本文所研究的读卡器是基于微信硬件平台技术开发,用户可以通过微信在自己的手机上实现对接触式IC卡的读卡、写卡等操作,与APP读卡器相比,微信读卡器降低了开发成本,节省了项目资源,研究了利用微信操作读卡器的方法,对于读卡器的发展与应用具有重要意义。
在我们的日常生活中,每家每户都有许许多多的各种卡,电卡、水卡、燃气卡、银行卡等,目前除银行卡外,很多行业的IC卡,在用户需要充值或查询时,大多需要去柜台或者自助值机,排队现象是一个普遍的现象,耗费了很多时间成本,浪费了很多社会资源,特别是遇到意外的突发的情况,比如夜里着急用电的时候,却突然断电,而营业厅又比较远,或者已经关门;在比如你想知道家里还有多少电、多少水、多少气的时候,想查询下卡内余额。如果营业厅就像影子一样,随时在你身边多好。
自2010年以来,随着苹果IOS系统、谷歌Android系统的逐步成熟与商业化,智能手机如雨后春笋般迅速普及,而随着3G乃至4G技术的发展,以及移动资费的不断下调,智能手机用户不断增长,据CNNC中国互联网发展统计调查显示,截止2016年12月[1]。我国网民规模达7.31亿,互联网普及率53.2%,与此同时手机网民规模达6.95亿,网民中使用手机上网的人群的占比由2015年的90.1%提升至95.1%,移动互联网的迅猛发展,使得很多读卡器商家也看到了巨大商机[2]。近5年来,基于移动智能手机开发了很多种类读卡器,如基于手机音频口的音频读卡器、基于手机USB接口的OTG 读卡器、基于手机蓝牙的蓝牙读卡器等,不过这些手机都需要开发单独的应用APP软件。
自2011年腾讯推出微信以来,伴随着移动手机的发展,微信以其实用、高效的特点迅速占领了市场,用户数不断增长,截止2016年12月,微信活跃用户数已经近乎超越QQ,通过微信公众平台,微信实现了人与人的连接,目前不断涌现的企业公众号或订阅号,实现了人与服务的连接,在此基础上,2014年底,基于微信公众平台,微信推出了微信硬件平台,通过平台规定的连接协议,各种智能设备如蓝牙设备、WIFI设备和其他移动网络设备都能方便的接入微信,完成设备—人—服务的连接[3]。
微信蓝牙读卡器基于微信硬件平台技术,系统架构主要由蓝牙读卡器、手机微信、微信后台、厂商云等4个部分组成,微信硬件平台的接入需要2个阶段,开发阶段和正式上线与发售阶段,本文论述的是开发阶段,在开发阶段需要分3步,即申请测试号、开通设备功能和设备开发。申请测试号和设备功能开通按照微信硬件平台的规定在网上提交材料即可完成,这里不再赘述。设备开发需要完成读卡器的软硬件开发以及手机微信测试号功能开发,微信蓝牙读卡器的使用流程如图1所示。
图1 基于微信硬件平台的蓝牙读卡器使用流程图
根据微信硬件平台的系统架构,本读卡器的研发分为3个部分,一是硬件电路设计,二是硬件底层驱动设计,三是手机微信测试号开发。以上3个部分构成了产品设备开发。
读卡器的基本功能需求如下:
1)支持接触式IC卡接口,符合ISO/IEC 7816-3标准;
2)支持蓝牙通信,蓝牙需支持微信的WeChat AirSync协议;
3)内置可充电锂电池,容量不小于200mAh;
4)Flash空间不小于128K,SRAM不小于48K;
5)带充电状态指示和通信状态指示。
Cotex-M0微控制器作为硬件系统的核心MC基于以上功能需求,本读卡器选择一款Cotex-M0微控制器作为硬件系统的核心MCU,该MCU硬件资源丰富,包含512K的Flash和48K的SRAM,空间足够用,MCU集成2路7816主接口,支持与ISO/IEC 7816-3 标准T=0和T=1传输协议兼容的智能卡设备。集成USB2.0全速设备接口模块,可以实现USB通信,此外还支持 UART、I2C、GPIO等接口。从功能、性能看完全满足微信蓝牙读卡器功能需求。
蓝牙部分需要支持微信的开放协议AirSync,且必须通过微信硬件平台的认证,微信硬件平台的官网有已经取得认证的蓝牙芯片和蓝牙模块的型号及供应商,为降低成本和加快研发进度,本读卡器选择北京艾威梯(IVT)的CSR蓝牙模块。该蓝牙模块支持BR/EDR/BLE等蓝牙规范,支持微信的AirSync协议,硬件对外接口为UART接口,工作电压范围2.3~3.6 V,最大发射功率+7 dBm,有效通信距离>5 m。
此外读卡器集成了锂电池充电电路,该电路通过4颗led灯指示充电状态以及是否充电完成,锂电池标称电压3.7V,满充电压4.2V,另外读卡器上还有一颗led,用于指示通信状态。读卡器硬件系统如图2所示。
图2 微信蓝牙读卡器硬件架构框图
读卡器软件部分包括MCU驱动部分和蓝牙模块部分,MCU与蓝牙模块之间通过UART接口连接,通信波特率115200,8个数据位,1个停止位,无校验。
蓝牙模块对手机蓝牙接口协议为AirSync,该协议已经封装在蓝牙模块内,对开发者而言,蓝牙模块会把UART口传入数据流转为符合AirSync协议的数据包发给手机,用户无需关注蓝牙模块内的AirSync协议是如何实现的。
MCU部分需要开发智能卡接口程序,用于读写兼容ISO7816的智能IC卡,此外需要编写UART接收中断处理函数,并在UART的中断处理函数中处理与蓝牙模块的通信数据。程序主函数首先进行系统初始化,配置MCU工作主频并使能指令缓存模块(ICACHE),然后进行GPIO、UART、7816等接口初始化,配置通信状态指示灯闪烁三次,表示读卡器上电成功,使能蓝牙模块电源VCC,在while(1)循环里,程序检测UART接口是否产生接收中断,如果蓝牙模块接收到上位机(手机微信)的消息,则会产生UART接收中断并置接收成功标志ReceiveOK=1,然后判断消息类型,如是初始化指令,则对智能卡执行冷复位,获得IC卡的ATR信息,并通过蓝牙模块的AirSync返回给上位机,如是读卡指令,则发相应APDU指令给智能卡,智能卡产生response后,通过响应位SW1、SW2判断是否读卡成功,如成功则把数据返回给上位机,如不成功,则返状态字节SW1、SW2返给手机微信。如是写卡指令,则组织好写卡报文发给智能卡,根据IC卡响应,判断是否写卡成功,并把SW1、SW2返给手机微信。读卡器部分程序流程如图3所示。
图3 微信蓝牙读卡器程序流程图
微信硬件平台是微信在实现人与人连接,人与服务连接之后,腾讯推出的设备与设备及设备与服务连接的物联网解决方案。微信硬件平台规定了蓝牙设备与手机微信之间的通信协议是AirSync,协议支持经典蓝牙和4.0 BLE蓝牙,目前该协议支持Android和IOS两个系统,本微信读卡器选择的是4.0 BLE蓝牙[4]。微信蓝牙设备硬件平台整体架构如图4所示,其中厂商服务器和蓝牙外设需要厂商开发完成,微信提供服务器的接口以对接厂商的服务器,提供手机的接口(如本文规定的蓝牙协议AirSync)以对接厂商的蓝牙外设[5]。
图4 微信蓝牙设备硬件平台整体架构
对于本项目,根据微信硬件平台的系统架构,在功能实现流程上,主要有测试号申请与开通、扫码绑定与进入测试号、消息的推送与数据接收处理、功能菜单的设计等。
在开发阶段里,我们使用测试号进行测试,按规定每个测试号可以支持100个设备id。测试号需要申请并开通硬件功能权限,申请测试号需要提供蓝牙模块的MAC地址和deviceId等信息,在进行测试号连接时需要记录appID和appsecret这两个信息,其次通过微信公众平台接口调试工具获取到token令牌和URL,然后获取一个独立设备的id,调用API接口create_qrcode,传入设备id获取对应的二维码生成串,从而生成设备二维码图片。设备二维码,mac,deviceType+deviceId 是一一对应的,手机微信扫描这个二维码后,就可以直接绑定这个蓝牙设备,绑定后进入聊天界面,可以操作硬件设备,扫码绑定流程如图5所示。
图5 微信蓝牙设备扫码绑定流程
扫码绑定只是微信服务端部署的第一步,在此基础上,需要做消息的推送与处理,为此需要在微信服务端代码里调用相关功能类接口,以Android为例,需要用到的类接口及作用有:
1)微信推送消息处理入口类:
com.bluelight.demo.consts;com.bluelight.demo.mock;com.bluelight.demo.protocol;
com.bluelight.demo.service;
com.bluelight.demo.util;
com.bluelight.demo.web。
(1)对整条光链路进行故障判断。具体方法为在两站端连接至继保装置处的尾纤头用光源和光功率计测试。一站端的尾纤头连接光源发光,另一站端的连接光功率计测试。收发两条链路都要进行检查测试,检查链路是否畅通,衰耗是否满足继保通道的需求。若畅通且衰耗满足要求,则可认定为光链路无任何问题,故障并不在通信专业的运维界面内,流程转至第(5)步;若不通畅或者衰耗不达标,则需要进行具体故障位置定位,流程转至第(2)步。
2)API调用包:
com.bluelight.demo.api; com.bluelight.demo.api.json;com.bluelight.demo.api.util。
3)开发调试工具类:
com.bluelight.tools.Tools,用于调试阶段:创建菜单、进行设备授权、生成二维码。
4)config.properties配置公号信息及token
基于对以上类的调用,完成微信测试号与读卡设备间的消息传递,即消息的推送PUSH(微信测试号→读卡设备)和消息接收处理(读卡设备→微信测试号)。在本部分的设计中,我们主要依据微信蓝牙外设协议1.0.4(即AirSync)中的有关规定,同时加入私有的自定义协议。
表1 微信测试号发送数据给读卡器数据包格式
表2 PUSH包中私有协议规定
·P2=0时表示有后续帧,P2=1时表示是最后一帧。
·P3为APDU的长度,每包APDU数据的最大长度为64,当APDU的长度大于64时APDU需做拆包处理。APDU指的是ISO7816协议规定的智能卡应用协议数据单元。
2)读卡设备→微信测试号的通信协议:详见表3所示。
表3 读卡器返给微信测试号的数据包结构说明
·P2=0时表示有后续帧,P2=1时表示是最后一帧。
·P3为DATA+CRC16的长度,每包DATA数据的最大长度为64,当DATA的长度大于64时读卡器做拆包处理并发送,微信测试号接收数据时需根据本约定做拆包和数据拼接。
·CRC16是data的校验值(含9000等SW值)。
基于以上协议规定,实现了读卡设备、微信、公众平台、厂商服务器之间的数据上下行处理,具体的流程请详见图6和图7。
图6 微信测试号消息推送(PUSH)实现流程
对于图6,进一步补充说明如下:
1)用户点击菜单,选择相应功能;
2)微信测试号推送菜单点击事件到厂商服务器;
3)厂商服务器根据用户标识查询绑定的读卡器信息,未绑定则无法控制读卡器;
4)厂商服务器根据菜单要求构造要发送给设备的数据,转为二进制。
5)进行 Base64 编码。
6)调用发送设备消息 API 接口,发送消息。
7)微信测试号收到消息后,解码后发送给读卡器。
图7 读卡器数据返回测试号实现流程
对于图7中的厂商服务端,进一步补充说明如下:
1)收到读卡设备返回的数据,首先进行 BASE64 解码。
2)将二进制数据反序列化为自定义的结构。该结构使用与设备约定好的协议解析数据。
3)进行业务逻辑处理。
4)在测试号APP中,将设备发送的消息以文本消息的形式推送到用户微信公众号界面进行展示,如IC卡的客户编号、卡余额等,并响应一个resp包,返回设备发送来的数据。
5)将需要返回的数据序列化为二进制数据。
6)对二进制数据进行BASE64编码并按照PUSH流程回复。
为了便于测试,本微信读卡器设计了测试UI界面,在测试UI界面完成了自定义Click按钮添加,消息封装等功能。菜单分一二级,在Click一级菜单时,弹出二级菜单,菜单结构和主要功能如图8所示。在绑定设备、进入测试号后,用户Click相应功能按钮,即可实现对读卡器的操作。
图8 微信测试号菜单结构及主要功能
经过以上工作后,我们完成了微信测试号客户端和厂商服务端的开发,将代码部署到服务器后,即可以展开测试。
测试验证分2步,一是使用AirSyncDebugger工具测试,二是使用开发的微信测试号进行设备联调测试。AirSyncDebugger是腾讯开发的一个便于用户测试硬件设备与AirSync协议是否兼容的测试APP。通过AirSyncDebugger测试,意味着蓝牙设备和微信客户端通信正常。
首先在手机上安装AirSyncDebugge.apk,安装完成后,打开APP后,APP会自动打开手机蓝牙,然后给蓝牙读卡器上电(已插IC卡),进入APP测试界面后,选择手动测试,选择手动测试的好处是可以自定义PUSH包和Response包。由于本蓝牙读卡器在AirSync协议里数据包的包体里加入了私有协议,因此用手动发包方式比较合适。测试过程如下:
1)进入手动测试;
2)完成“连接设备→Auth检测→Init检测”基本测试,该测试属于自动完成。若蓝牙模块得到微信授权并且按照AirSync协议开发,则会自动进入下一步;
3)选择“编辑Send Data Push包”;
4)按本文章节3.2所述的“微信测试号发送数据给读卡器数据包格式”编辑PUSH包。注意选择16进制编辑。编辑完点击“发送”。本测试选择一条对IC卡的初始化指令,包格式如下:FE 01 00 1E 75 31 00 00 0A 00 12 10 FE CF 00 01 00 0A 00 CD 00 01 05 00 12 00 00 00 18 00,其中的红色是依据协议添加的私有协议,表示对IC卡的初始化,即取IC卡的ATR信息;
5)以上测试可通过查看APP与读卡器之间的数据交互,确认是否与读卡器通信成功。
本测试截取发送的PUSH包和读卡器返回的log信息如下:
**** send Custom Push ****
data len = 30
data dump = FE 01 00 1E 75 31 00 00 0A 00 12 10 FE CF 00 01 00 0A 00 CD 00 01 05 00 12 00 00 00 18 00。该测试PUSH包中,00 CD 00 01 05 00 12 00 00 00为自定义的对IC卡取ATR指令。
------On data receive------
data length = 66
data dump = FE 01 00 42 27 12 00 03 0A 00 12 34 FE CF 00 01 00 34 00 01 00 01 00 00 00 EF 00 01 0F 3B 69 00 00 41 0A FC EB 3D BE 47 AB 9A 55 97 18 00
data receive seq = 3。该返回数据包为自定义的格式,具体见本文第三章协议部分描述。
从AirSyncDebugger测试可以看出,发送的对IC卡取ATR信息的PUSH包得到了读卡器的正确响应。即读卡器的硬件设备符合AirSync协议。
首先给蓝牙读卡器上电并插卡,然后打开手机蓝牙及微信测试号,扫描生成的二维码,关注测试号,并绑定连接设备,进入到测试界面后,点击相应的功能按钮进行测试,测试部分截图如图9和图10所示。
图9 设备联调截图
从设备联调测试结果看,基于微信硬件平台开发的读卡器达到了设计预期。
本设计基于微信硬件技术平台设计,采用先进的Cotex-M0微控制器作为硬件系统的核心MCU,选择通过微信认证的支持微信AirSync协议的蓝牙模块,开发了微信蓝牙读卡器的软硬件程序,并依据微信的硬件平台框架说明和接入流程,开发了微信测试号服务端程序,添加了必要的功能,实现了微信蓝牙读卡器的基本功能。该项目的研发得益于微信推出的物物相连的设计思想,受益于庞大的微信用户,相信该项目的研究能够提高读卡器产品的用户体验。接下来的工作可以进一步的优化和丰富产品的功能,实现产品的正式上线与发售。
图10 设备联调截图
[1] 肖金华,黄丽红.基于微信的图书馆信息服务模式研究 [J].现代情报,2013(6):55-57.
[2] 朱智星,白鹏飞,罗智杰,等.基于微信公众平台的云智能采集系统的设计[J].电子技术应用,2015,41(8):17-19.
[3] 刘 峰.无线多功能读卡器的研究与设计[D].淮南:安徽理工大学,2016.6.
[4] 王金海,于 双,国海丁,等.基于微信公众平台的移动血压监护系统的设计[J].生物医学工程研究,2016,35(4):260-264.
[5] 张宏鹏,尹小亮.基于微信硬件云的智能车位锁系统设计[J].计算机与数字工程,2017, 328(2):403-408.
[6] 腾讯.微信公众平台开发者文档[ EB / OL ].[ 2015 - 04 - 15 ] .http:/ / mp.weixin.qq.com / wiki / home / index . html.