在安卓系统上使用NFC技术的模拟M1卡的探索之路

先说下背景,公司的厂内物流系统,通过自助制卡,获取一张IC卡,该卡关联运输任务信息。然后司机携带这张IC卡去园区内进行装卸货。装卸货系统通过IC卡读取器,读取卡号,然后调用物流系统的接口,获取运输任务信息,如要装什么产品,装多少,再执行装车任务(通过管道灌注液体)。

即这张卡作为媒介,实现了装卸车系统与物流系统的交互,本来运行流畅,但由于疫情的原因,大货车司机是重点人群,风险较高,为了减少接触,要求装卸货过程中司机不要下车,由工作人员代为刷卡,这样虽然一定程度上降低了风险,但客观上仍然存在接触的环节,即工作人员需要跟司机来传递卡片。

为了降低风险,提出来免接触优化,想出来这么一种解决思路:将IC卡更换为二维码,在装卸车区域,直接通过二维码来传递数据。

该方案看上去很美好,但实际是受限的,即需要现场装车系统,能够识别二维码,不仅仅是涉及到软件的改造,还会涉及到硬件的改造,例如增加二维码读取的硬件设备,开发及部署程序,升级软件等,费用是一方面,最关键的是工期较长(现场有很多套不同年份实施的装车系统,早期设备与系统仅支持IC卡模式,不支持二维码的读取和处理)。

疫情形势严峻,该项目要求1个月内完成改造,而装卸车系统厂家评估改造硬件及升级需要3个月以上,因此二维码方式可作为一个未来的优化方案,近期则需要考虑一个临时过渡方案,即不做硬件系统升级和改造的情况下,如何来实现免接触?

有几个解决思路,但都存在一些限制和约束:
1.给现场配备制卡设备和应用,技术上不可行,主要在于物理IC卡卡号是唯一的,无法与进厂时制卡环节一致,需要软件改造进行,实现软关联,并影响到其他环节如门禁、过磅等。
2.装卸车现场配置几张物理卡,通过软件应用,根据车号定位运输任务,选取一张物理卡与之关联,技术上可行,但同样需要软件改造进行,并影响到其他环节如门禁、过磅等,同时,现场多张卡交替使用,容易发生混淆和混乱情况。

经过讨论,想出来一种新的思路,主要依托NFC技术实现,即给现场装卸车区域的工作人员配置安卓平板,在该平板上部署一个APP应用,通过车牌,查询到运输任务,然后将该平板模拟为一张IC卡,供现场装卸车系统来读取。

思路是有了,但技术实现这块遇到了重重问题,主要在于,没有了解NFC技术的人员,因此由我进行技术攻关。

首先了查阅了大量资料,发现大都讲的是如何进行NFC卡片的读写,这块在安卓开发的SDK包已经附带了,并测试可以正常运行,没有权限限制。

然后,如何将安卓平板模拟成一张IC卡,这块遇到了障碍,一方面,确实华为手机可以使用华为钱包的钥匙功能,创建一张空白卡,来复制小区门禁卡、员工卡等;另一方面,找不到API可用来干这件事。这两者看上去是矛盾的。

同时测试中发现,手机可以使用华为钱包的钥匙功能,创建空白卡速度非常慢,大概花费1分钟,会严重影响使用体验,并且同样不支持人为指定卡号。查看NFC的官方SDK,并未发现有创建虚拟卡的API,推测华为要么是覆写了NFC底层处理库,要么是自己又加了一层虚拟化来实现的,我们自己来实现类似功能或操作是不现实的。

通过阅读大量资料,深入了解NFC相关体系和运行机制,发现底层协议自身即约定了模拟卡号随机,未提供设置卡号的API函数,需通过进程注入(类黑客手段)或root操作系统后修改配置文件(影响机器维保)的非正常手段才能实现预期目的,弊端较多,不考虑采用该方案。

这条路走不通了,需要再调整下思路:

查找拷贝卡的实现方案,测试第三方工具,发现Mifare Classic Tool工具可实现读取A卡卡号、写入B卡卡号功能。其中A卡为当前物流系统使用的M1卡,B卡为支持卡号区域反复可擦写的CUID卡,经测试,可拷贝物流系统的实体卡片卡号至测试卡片,测试通过。

综合限制与约束,最佳临时实现方案如下:
装卸货现场使用安卓平板运行自开发应用,根据车号定位任务,获取到制卡环节的物理卡号,然后调用NFC写卡功能,将卡号写入到CUID卡中,使用该卡刷装卸车系统,即现场使用平板上自开发的app实现制备临时卡的功能,对其他业务环节无影响。

此外,可以在操作上进一步优化,即可以将一张CUID卡沾到平板的NFC区域,对于用户来说,基本等同于我们最开始的设想,即将平板模拟成一张NFC卡来刷装卸车系统。

    原文作者:lwq2025
    原文地址: https://blog.csdn.net/seawaving/article/details/124216656
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞