拉卡拉手机刷卡器音频通讯技术原理初步分析
kimmking@163.com
1. 拉卡拉刷卡器
大家都知道,拉卡拉就是一个手机刷卡器。拉卡卡、智能手机、拉卡拉软件、网络,构成了一个完整的、更强大的POS系统。为什么说更强大呢?因为在手机应用app的这一层,拉卡拉可以做很多很多方便的功能,这样借助于类似传统的刷卡服务,提供一系列现在支付宝也正在大力发展的生活服务等功能。而这个是银联的POS所严重缺乏的。目前来说,移动支付里,最方便的肯定是支付宝的快捷支付;但考虑国内目前的安全环境,用户把银行卡和密码托管给一个网站来管理,明显不如用的时候输入一下的方式更能被接受。相对于更安全的支付宝加网银的方式,拉卡拉做到了与发卡行无关,这样也不需要手机上安装各种不同的银行的网银客户端。所以,显然拉卡拉在某些应用场景比一些其他的移动支付方式更有优势。下面我们就来看看拉卡拉的技术原理是怎么回事。
2. 内部结构
上面左右是一个常见的拉卡拉设备,挺好看的。如果我们把它拆开来看,就如右图所示,当然除了这个东西,下面还有个耳机插头、侧面还有一个刷卡的槽。
总体来说,这个电路板很简单。
2.1 一个电池就占了绝大部分地方,导致整个拉卡拉个头偏大,可供刷卡万次以上(见参考资料1)。
2.2 左边的四根引线,对应于耳机插头上的4个区域。分别是左声道(Left)、右声道(Right)、麦克风(Mic)和接地线(Gnd)。其中L和R是接收手机往外输出信号的接口,M是输出信号到手机的接口。需要注意的是并不是所有的顺序都想右图所示。因为存在两个不一样的标准,国际标准和国家标准。像联想、中兴等大部分国产手机都是国家标准,跟右侧的图一样的顺序。而iphone、htc、三星、小米等手机都是国际标准,M和Gnd的顺序是反向的。拉卡拉的某些版本可以自动识别M和G的正反向。(见参考资料2)
2.3 电路板最右面的芯片处理输入信号和转换刷卡数据的A\D(音频\数字)处理模块,它是整个系统的核心。在手机应用里点击刷卡时,音频信号通过L或R从手机发送到电路板,通过A\D模块转换成数据信号。刷卡时电路板拿到银行卡信息,再通过A\D模块转换成音频传输给手机。当然手机APP应用里在信号出入的时候,也需要做相应的A\D编解码工作,这个也是手机APP里最重要的工作。
3. 刷卡支付流程
手机与拉卡拉音频通讯示意图
手机与拉卡拉的音频通讯大概结构见上图,大概的流程是:
3.1 先在手机上打开拉卡拉的应用。点击刷卡。
3.2 手机应用会调用android api的AudioTrack,通过L和R线路给拉卡拉手机刷卡设备发送一段通知信号(L和R表达的信息是一样的,只是波形是反相的,L的高电平对应于R的低电平,还没搞清楚拉卡拉为什么这么设计)。
3.3 芯片上的通讯模块拿到音频信号,解码后发现是刷卡通知,就等待刷卡层传来刷卡信息。
3.4 在刷卡槽刷卡后,卡的信息传递给芯片。
3.5 芯片拿到卡的信息,编码成音频信号,同M线路发送给手机。
3.6 手机APP通过AudioRecord对音频信号进行采样,拿到数字信号。
3.7 手机APP程序通过对数据信号进行解码,拿到实际的数据信息,即卡的信息。
3.8 如果刷卡失败,则手机APP拿到的是一段失败提示信息。
3.9 至此手机与刷卡器的通讯完成,手机APP再使用此卡的信息与拉卡拉的服务器端后台通讯,处理后续支付操作。
其中的技术关键点是(细节本文暂不讨论):
a) 传输上使用什么样的调制方式,采用什么样的波特率、频率。
b) 通讯上如何制定合适的协议,包括如何判断信号开始、如何握手建立连接。
c) 编码上如何编码表示数据,如何校验和纠错,如何滤波和解码数据。
4. 相关的一些技术问题
4.1 A/D转换的问题
耳机线传输一般是1250HZ~9600HZ之间的交流音频信号。信号的调制解调有3种方式,调幅(AM)、调频(FM)和调相(PM)三种。根据对拉卡拉的输入输出信号的分析,我们发现拉卡拉使用的是调幅方式,频率为9600HZ和4800HZ的音频信号。
4.2 耳机接口标准的问题
两种标准见2.2中所描述的。
4.3 不同android手机的问题
a) 我们发现,在个别手机上,接收到的音频波形跟其他手机相比,是反相的。即高电平的波峰变成了低电平的波谷。这个问题可以在解码的时候,根据特定的前导码来判断。
b) 手机Mic采样到的音频信号电平可能会不一样。例如同一段音频信号,使用A手机AudioRecord采样出来,波峰的值大概是32000;另外找一个手机可能是3200,根据我们的多种不同手机测试,发现可以相差10倍。处理方法是,可以额外的进行一次处理,先归一化;或者是滤波的时候,动态的根据峰值来调整阈值。
c) 有些手机的Mic不认非标准的采样率。比如三星的I9308,如果使用9600*4的采样率初始化AudioRecord,就会报错;改成44100就没有问题。
4.4 数据传输的效率
每次通讯报文在100字节左右(50个汉字左右)(见参考资料1)。因此,拉卡拉的传输效率看来不是问题。
4.5 数据传输的准确性
拉卡拉用了一个取巧的方式。其先发送一段9600HZ的音频信号,紧接着再发送一段表示同样数据的4800HZ的音频信号。如果手机能处理高频率的信号,后面的低频率信号就可以用来校验前面的数据。如果前面的处理有问题,直接从后面拿低频率的信号来处理也一样可以保证拿到完整的数据。当然,我们还可以在数据本身叫上校验和纠错。
4.6 数据的安全性
官方说“拉卡拉手机刷卡器内置有安全芯片,每一台刷卡器对应有唯一的银行卡磁条信息保护密钥。使用专用安全算法,保证一机一密,一次一密。用户的个人密码,采用RSA非对称加密方法进行加密”。(见参考资料1)
但是根据我们观察,貌似拉卡拉的电路板上并没有特殊的安全相关模块。整个体系也没有使用CA证书做相关的电子签名和身份认证。所以,其安全性还有待研究。
5. 更多的可能性
拉卡拉的使用场景还是太简单了。其基本上仅仅使用了一个刷卡后的信号通过音频MIC线路传输给手机APP的功能。传输的数据也很简单。其实相当于将数据从电路板发送到手机APP,通过L/R将数据从手机发送到电路板要更简单、更高效,这一块拉卡拉几乎没怎么用上。我们可以在这个系统结构上做更多双向的数据通讯,把一些安全性要求更高的操作放到硬件上来完成,从而实现更高的安全保障,提供更多的功能,适用更多的应用场景。
6. 2012年手机刷卡器的一些数据
最后贴一下2012年手机刷卡器的市场交易规模和手机APP下载数据。
7. 参考资料
1) http://m.lakala.com/answer.html
2) http://m.lakala.com/adapt.html
3) http://blog.csdn.net/xl19862005/article/details/8522869
4) http://www.9mcu.com/9mcubbs/forum.php?mod=viewthread&tid=956073
5) http://it.21cn.com/prnews/a/2013/0320/00/20729935.shtml
转载请注明出处:http://blog.csdn.net/qinjuning
好久没更新博客了,不知道大家是否还记得有一个老朋友呢(得瑟下,- -)。没写博客的原因主要有二:
1、技术方面没有找到可以值得动笔的地方:要么是网上已经存在的,要么是我的理解还不到位,怕误导了
大家;
2、自己有点懒了,没有以前那么喜欢总结了。
前几日在虎嗅网上看到一位作者对Google Reader关闭的评论:”写博客的人越来越少了,信息快餐化越来越来越
严重。”内心着实感到一阵凄凉,同时也闪过一丝惭愧。无论如何对我而言,技术博客不同于其他,不可能沉沦
消失掉 ,IT程序员需要一个净土去盛放那走过的脚印。
三月的春风吹得大地缤纷,妖娆着,望着一片娇嫩地花朵,心里却思念着我将去何方?最近的一个多月我身上
发生了很多事情,有些事情早就注定了:例如我的离职,有些事情就像武汉的夏天鲁莽着赶走了春天,令人惊慌
失措。现在回过来思量,我做了什么?如果我做了,会不会做的更好呢?
精神抖擞,渴望展现自己的能力。可是在项目的发展过程中,偏离了我所预设的轨道,最另外难以忍受的是整个
项目开发期间模块分工的杂乱,没有明晰地任务计划和质量控制,做出来即是谢天谢地了,团队交流也几乎为零,
没有会议讨论,没有技术交流,每天只是大多数期间Coding。出了什么问题,所谓的技术经理总会冒出一句话,
“你不懂你就问我啊,你不问我我怎么晓得呢?”如果这样可以当个好领导,带领好团队,全世界的猪都笑了。
渐渐地,我有点忍耐不住了,这本不是我喜欢的样子。具体到某些问题上,体现出了反抗的苗头,在各方面因素
地综合下,二月底,我 离开了这家公司。当你对工作对团队有不同之声,对领导有很大意见时,只剩下离开这条
道路了。
关于这半年工作地总结,虽然有些不如意,依旧是收获大于所失的。学习了很多新的技术,也接触了不同地公司
以及团队组织,明确了自己更应该改积极主动工作,改变自己,改变团队。
半年工作所得:
1 、关于工作:其实这半年来我做的远远不够,我只希望被动地接受,却没有做到积极地给予,曾经有朋友对
我说“为什么你不尝试去改变呢?”我哑然了。如果我能做点什么,会不会和现在不一样呢?当然前提是存在一个
你值得去做的团队。
2、 关于忍耐:我承认我的性格中存在逆反、犹豫色彩,间接导致我在面对自己不喜欢的人或事物时,很容易
表现出不满。我意识到生活或者工作中都需要忍耐,特别是在孤零零地团队中更加需要忍耐,即是你再不满意,
也请微笑去面对,然后在某时某刻,收拾好行囊转身离开。
3 、公司还是团队?好的团队会最大程度上的发挥员工的价值,如果你没有融入一个团队,没有归属感,何来
自我实现的需要。就我而言,我渴望加入一个开放充分交流组织合理的团队,继而体现出我的价值。努力吧,
少年。
离职后,虽然没有收入来源,却也过的比较滋润,忙着检查、锻炼身体,忙着找工作,忙着面试。一路走来,
失落逐渐取代了必胜的信心,徘徊占据了坚定的信念,在几次面试中,进一步加深了到武汉软件的坑和不足的
认识,最终,还是在茫茫人海中几经波折,找到了一份还不错的工作,希望能通过自己的进取和主动,带来一些
新的变化。在此期间,也感谢几位网友向我抛出的橄榄枝,谢谢你们对我的认可和信赖,出于一些原因,未能牵
手成功。
我们一直在路上探索着,即使时常会跌跌撞撞,一颗强大的内心始终是支撑我们奔波的动力。“我不知道该如何
面对,可我已经无路可对,你要坚持到最后一秒,为了让生活继续。”
Java Virtual Machine》(深入Java虚拟机),给我带来了很多冲击波。我想说如果你想掌握Java,请看这三本书吧;
如果你想深入研究,也请看这三本书吧。
2、关于工作方面,当我们习惯性地利用现有知识解决重复性问题时,短暂期间你会感到充实自豪,时间长了,
就会觉得工作的单调以及由此引发的知识欠缺性,尤其是当你找重新工作时,才发现自己有很多项不符合要求。
纵向和横向学习知识面的重要性。前几日,上海的一个同事就对我抱怨道:“在这边解了太多Bug,面对的都是
一些重复性问题,如今去寻找工作,发现自己有很多不符合他们的要求,尤其是网络编程这块,例如:sockt、http
等。”这儿我建议至少大家可以把网络编程这块认真研究下,这也是我接下来学习的地方。
3、优秀的程序员总是有着出色的技能和技巧,我们很多人却单独有着技能,唯独欠缺技巧。有人可能会反驳
“技巧是写代码写出来的”。没错,但是不完整,生活中的美是善于观察者所得。多看代码,从代码中吸收技巧和
设计模式,并且能够举一反三,借鉴到自己项目中去。
4、看书。设计模式想必大家都知道,我这里强烈推荐《重构--改善既代码的设计》,重构之利剑,方显英雄
本色,很多设计模式的运用不是开始就设计出来的,而是程序在不断发展设计过程中重构出来的。“花点儿时间重构
是值得的” Martin Flower如是说道。
5、锻炼身体。身体的重要性不言而喻,只是当我们失去的时候,才懊悔,才悔不当初。体会到医院的冰冷后,
现在我会每天坚持跑步,锻炼自我。你意识到一件事物对你而言的重要性时,坚持只是自然而然的了。
作为 程序员他们内心的无力之感,我看到的是他们前进拼搏的信念。不管是自嘲还是外界的不解,其实,我们是
IT程序员。借用小说《让青春继续》的语句作为结束寄语,“很多人问过我,青春的诀别是不是意味着年迈的将近?
其实,青春,她一直都在继续。”
如果你在武汉、热爱武汉,请加入武汉Android联盟QQ群:55945620 。即使现在还很弱小,你我共同的呵护,
她会一步步成长的。在这儿,我们分析面试、共同研究,共同成长。
今天发了一条微博:
会原生 JavaScript 不代表什么,懂 jQuery、YUI 等才真正好。怎么这么多人有原生主义情结呢?走出那点小天地,海阔天高。
很多人已经猜出,这是为了晚上的文章而发,提前收集大家的想法。这个话题,很早就想谈,肯定会引起口水仗,但有些事不辩不明,不理不清,与其和谐社会,不如辛亥革命。
奇怪的现象平时工作,时不时能听到一些困惑、感慨:
jQuery 虽好,但只会 jQuery,不会原生 JS 是不被大公司认可的。
最近半年对原生 JS 有些生疏,得补一补。
得好好看看 ECMAScript 规范,把 JS 语言学透彻。
和原生情结对应的,是国内程序员特别喜欢研读源码,比如:
jQuery 源码分析系列
YUI 源码分析
Backbone 及 Underscore 源码解析
国内程序员对源码的热衷,可以拿 SeaJS 的数据来看:
fork 数高达 500 多,但 watch 数只有 1000 多,这其实是不正常的。相比而言,RequireJS 的数据正常很多:
简言之,国内与国外相比,有比较明显的两个特点:
这两点看起来很好,可是:
这肯定跟我们是社会主义国家有关,但我越来越怀疑这一点。
语言高手们真正的语言高手不多,我不是,正在看这篇文章的你,很可能也不是,而且这一辈子可能都和我一样成为不了语言高手。
JavaScript(纯语言,不含 DOM 等)高手,在国内屈指可数。周爱民、白露飞、老赵、winter、月影、hax 等等等等,还有一些非常低调的隐士,这些人读 ECMAScript 规范像磕瓜子一样轻松,甚至能花几个晚上就像 BE 大神一样造出一门新语言来。你我等闲之辈,除了佩服之外,只能去谈恋爱。
工作中,我们需要语言高手吗?肯定的说,需要!可是,我们需要大量语言高手吗?除了特殊岗位,我相信很多公司都不需要!
题外话:目前为人知的 JS 语言高手里,除了周爱民,我最看好白露飞。这是一个有能力也有潜力造就 SuperScript 的人,最佩服的是他有实际行动,虽然方向未必正确。
我们的价值在哪除了重新投胎,我们大部分人这辈子都不大可能有兴趣、有能力、有机缘去成为 BE 大神了。这是个残酷的现实,之所以残酷,只因视野太狭窄。
跳出来,天大地大。妹子多着呢,而且更漂亮。
Douglas Crockford 的 JS 能力很可能不及 winter,但 Douglas 规范并布道了 JSON 格式,天下留名,惠泽全球。
Jeremy Ashkenas 的 JS 能力可能还不如老赵,但 Jeremy 用很裸的代码写就了 Backbone,至少影响了一万人,给各个公司创造的价值总额很可能过千万美刀。
更不用说 Isaac Z. Schlueter,这小伙的 JS 功力很可能还不如我,但 Isaac 打造了 npm 生态圈,而我至今只有精力玩玩 Ant 和 Grunt。
有幸还看过 Google Docs 的前端源码,那代码和 Java 一样中规中矩。但在 RTE 领域,Google Docs 是王者,里面的专利都一堆一堆的……
特别想提及的还有开发 Evernote Clearly 的前端工程师,这小伙子的代码,我眼睁睁看着其从很生涩的 JS 代码,逐步演化成上万行牛逼代码还保持了相当好的可维护性。这份代码就像 Clearly 产品一样奕奕生光。
以及把 jQuery 用得出神入化的 Amazon!前不久那个秒杀国内互联网公司的悬浮菜单,可不是研究原生 JS 能想出来的。
还有 Facebook 的工程师们,Twitter 的工程师们…… 这些故事大家并不陌生。
不是总结的总结不贬低语言高手们,也不反对去研究编译原理、ECMAScript 规范等。作为技术人员,我们需要这种精神。但是,这仅仅是很小很小很小很小很小的一个领域。并且在这个领域里,永远有比你更聪明的人。
具体对 JavaScript 语言来说,会用就好。搞清楚数据类型、作用域、闭包、原型链等基本概念,足矣。再深入进去,对绝大部分人来说,除了能满足下心理上的优越感,对实际工作不会有任何实质性帮助。
语言的本质和互联网一样,只是工具,是剪刀、石头、布。让张小泉去研究怎么做剪刀就好,我们用好剪头,去剪出各种窗花,更有意思。还有一个有趣的事实是,张小泉会造剪头,但剪不好窗花。
跳出很小很小很小很小很小的语言领域之外,天大地大。永远不要妄自菲薄,每个人身上都背负着独特的使命。去努力寻找自己的,不要老盯着别人的,否则就会成为观众。
好像跑题了。前面那个奇怪的现象,还有很多想吐槽的点。比如
源码只是很小很小的一部分。直接读源码往往无法领会类库框架的精髓。不读源码,用心去用,用时间去体味,偶尔针对性看看源码,往往更能掌握一个类库框架的真谛。
对社区的贡献可以有很多很多。你的使用经验、用心的 bug 提交、入乡随俗的 pull request、一个认真的评论等等,这些都比去研究什么狗屁源码更有价值。
一个 Java 高手如果说他会原生 Java,那一定会遭来很多人的围观。我还会谭浩强教我的 C 呢,那几个 if else 还有结构体、指针等谁不会。语言之外的领域知识,才真正造就了高手。对于前端来说,会原生 JS 只能打 20 分,另外 40 分需要你深入使用 CSS、DOM、HTML5 等领域知识,还有 20 分需要你对业务需求、架构设计等有真正的运用,这已经 80 分了,不要太贪心。剩下 20 分,只有两个字:勤奋。
题图:我的网名射雕的来历,喜欢郭靖,无底线。