0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎样使用Square Reader和Android设备读取任何磁条卡

454398 来源:工程师吴畏 作者:工程师吴畏 2019-11-19 17:01 次阅读

步骤1:了解格式

怎样使用Square Reader和Android设备读取任何磁条卡

磁性编码条带数据遵循通用标准。磁条由3条物理上分开的“磁道”组成。磁道1最靠近卡的底部,磁道3最高。 Square的读取器位于读取轨道2的位置。轨道2是最常用的轨道,但是大多数信用卡也使用轨道1。轨道2包括卡号和有效期。音轨1包括那个加号。根据特定的卡,可能还会有其他数据。这些磁道的宽度规定为0.11英寸,因此要使用Square的读取器读取磁道1,我们只需要重新布置条纹,使磁道1与读取头对齐即可。

每个磁道中的数据均通过磁编码域翻转。长话短说:一系列的域翻转对波形进行编码,该波形被解释为二进制。此编码中的二进制0是任意频率。 1是该频率的两倍。

数据以一组前导零开始,以建立基本频率。在可变数目的零之后,出现开始标记。对于音轨2,开始标记为“;”。每个字符被编码为整数,最低有效位在前。对于磁道2,每个字符包含4个数据位和1个奇偶校验位。为每个字符设置奇偶校验位,以使1的数量为奇数。如果为每个字符的整数值加上48(ASCII编码为“ 0”),则将显示ASCII字符。除了数字“ 0”到“ 9”之外,磁道2还可以编码一些其他字符,包括“;”。 (开始标记),“ =“(字段分隔符)和“?” (末尾)。

步骤2:制作垫片以读取音轨1

磁卡的磁道1比磁道2更靠近卡的边缘.11英寸。由于Square读卡器被设置为读取磁道2,因此如果我们在磁道中粘贴一些东西,读取器将卡提升.11英寸时,读取头将与轨道1对齐,而不是与轨道2对齐。

您可以通过从另一张卡上剪切0.11英寸的条来创建垫片。我还发现廉价垃圾袋的缠结也差不多。

第3步:录制一些音频

就电话而言,Square阅读器只是一个麦克风。因此,要从卡中获取数据,我们需要记录音频。请参阅其他Android文档(例如本教程:http://eurodev.blogspot.com/2009/09/raw-audio-manipulation-in-android.html)以获取详细说明,或使用RhombusLib(请参阅最后的链接) )。以下是一些Java代码,可以开始在Android应用中记录音频:

AudioRecord audioRecord =新的AudioRecord(MediaRecorder.AudioSource.MIC,

频率,channelConfiguration,

audioEncoding,bufferSize);

audioRecord.startRecording();

录音时,我们需要不断从录音机中读取数据并将其放入缓冲区中。

//创建一个DataOutputStream以写入音频数据

ByteArrayOutputStream os = new ByteArrayOutputStream ();

BufferedOutputStream bos =新的BufferedOutputStream(os);

DataOutputStream dos =新的DataOutputStream(bos);

short bufferVal;

short [] buffer = new short [bufferSize];

while(recording){

bufferReadResult = audioRecord.read(buffer,0,bufferSize);

for(int i = 0; i bufferVal = buffer [i];

dos.writeShort(buffer [i]);

}

}

dos.close();

byte [] audioBytes = os.toByteArray();

上面的代码是从RhombusLib中提取并简化的。录制后,您将拥有一个字节数组,代表麦克风中的样本,可以进行分析。

步骤4:解码音频

因此,现在我们的设备上有很多音频。我们如何解码它?我的代码基于Android教程,该教程显示了如何记录数据然后进行回放。就我而言,我确保将音频保存为16位PCM编码。我以44100hz采样。在Android(以及其他地方,我想)上,16位PCM数据意味着每个样本都是一个带符号的16位值。因为我们只关心频率,所以我们只需要关心“零交叉”之间有多少时间。过零是指信号从正向变为负,反之亦然。 0位将由2个交叉点之间的间隔表示,而1将在大约相同的时间段内有一个额外的交叉点。

每个磁道中的卡数据以一些(可变)数0开始,以建立基本频率。我所做的是听取高于某个“安静”阈值的第一个样本,然后计算零交叉之间的样本数。该数字将成为0的基值。由于这些卡是手工刷卡的,因此从扫描开始到结束,实际频率将有所变化。因此,我做了一个简单的方法,确定自上次零交叉以来的样本数量是否更接近基本频率或两倍于基本频率(基本样本数量的一半)。然后,它会相应地调整预期的基本频率。只要两个逻辑位之间的变化很小,此方法就可以很好地工作。而且它们几乎肯定会。

检测零交叉,我们需要查看每个样本的符号并将其与前一个样本的符号进行比较。如果它们不同(一个正,一个负),则信号在这些样本之间越过0。

基本算法是遍历字节数组,提取样本。计算零交叉之间的样本数,并将其与0或1的预期计数进行比较。好的,经过一番挥舞之后,我们现在有了一个二进制数据序列,我们想回过头来。转换成ASCII。最常见的编码(也是我编写的唯一处理程序)将每个字符编码为一定数量的位,再加上一个奇偶校验位。对于音轨2,字符为4位,奇偶校验为1,组成5位组。从最低有效位到最高读取位,最后一位是奇偶校验位。将奇偶校验位设置为使组中的1的个数为奇数。在我的实现中,我只是忽略了奇偶校验位,但这将有助于确定读取是否正确。在磁道1中,字符的6位加上奇偶校验。

磁道的字符集也有所不同,但是两者都是ASCII子集,具有一些偏移量。对于仅编码一些符号和数字的磁道2,字符集从48开始,这是“ 0”的ASCII码。因此,如果我们得到0,0,0,0,1作为我们的角色,则将其变成0,加48,得到48。类似地,1,0,0,0,0为1。1 + 48 = 49 = ASCII“ 1”。

对于轨道1,字符集以“”(空格)开头,即ASCII32。因此,我们在解码的数字值上加上32,得到ASCII字符。之后,我们有了数据,因此剩下的一切都只是在挂接UI胶水。

责任编辑:wv

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android
    +关注

    关注

    12

    文章

    3923

    浏览量

    127119
  • BSQUARE
    +关注

    关注

    0

    文章

    5

    浏览量

    8752
  • 磁条卡
    +关注

    关注

    0

    文章

    8

    浏览量

    6861
收藏 人收藏

    评论

    相关推荐

    使用TF的常见问题

    、视频、文档等数据。 1. TF无法被识别 问题描述: 当你将TF插入设备时,设备无法识别或读取TF
    的头像 发表于 11-04 09:54 419次阅读

    谷歌正式向Pixel设备推送Android 15稳定版

    10月17日最新资讯,谷歌今日已正式向Pixel系列设备推送Android 15稳定版更新。目前,已有部分Pixel设备成功完成升级,而更大范围的推送预计将在本周末进行。
    的头像 发表于 10-17 16:31 346次阅读

    智能IC测试设备的技术原理和应用场景

    提供工作电压,完成数据的读写操作。 数据处理: 测试设备向IC发送各种指令(如读取数据、写入数据、修改数据等),并接收来自IC的响应。 通过分析响应数据,测试
    发表于 09-26 14:27

    物联网产品在生产测试过程中快速读取贴片SIM卡号的方案

    卡号,读卡表产品可以解决在研发测试过程中,方便读取物联网贴片卡号的问题。 二、该问题带来的危害及影响 如果不读出设备的SIM卡号,无法将设备
    的头像 发表于 09-23 16:14 211次阅读
    物联网产品在生产测试过程中快速<b class='flag-5'>读取</b>贴片SIM卡号的方案

    如何读取多张的UID,有偿

    应用场景是在一摞卡片,需要通过循环读取卡片的UID,来获取所有卡片的UID。但是普通MFRC522模组的磁场强度无法给多张供电,想咨询如何给一摞供电,当然模组可以移动,或许只需要给部分卡片供电即可。红包200元,财力有限,请
    发表于 08-17 21:50

    丢掉数据线,你还会调试Android设备吗?

    ADB(AndroidDebugBridge)作为Android开发中非常重要的工具,开发者可以使用ADB设备在电脑上对Android设备
    的头像 发表于 08-14 17:09 311次阅读
    丢掉数据线,你还会调试<b class='flag-5'>Android</b><b class='flag-5'>设备</b>吗?

    谷歌宣布对Android设备流媒体服务进行重大扩展

    8月8日,谷歌宣布对其Android设备流媒体服务进行重大扩展,此举旨在进一步赋能开发者,让他们能够远程接入并测试更多品牌及型号的真实Android物理设备。自2014年该服务问世以来
    的头像 发表于 08-08 16:30 650次阅读

    怎样修改LVGL的lv_port_fs文件,让它使用rt-thread的DFS文件系统中的API函数读取SD中的图片?

    我想问一下,怎样修改LVGL的lv_port_fs文件,可以让它使用rt-thread的DFS文件系统中的API函数(这些API函数在rt-thread的dfs_posix.c中)读取SD中的图片?
    发表于 07-11 06:53

    X Square获得1050万美元A轮融资

    近日,专注于人工智能与机器人领域技术创新的X Square公司成功获得了一笔1050万美元的A轮融资。此次融资由Wavemaker Partners领投,同时获得了SEEDS Capital和Goldbell Corporation的参与投资。
    的头像 发表于 05-31 11:45 1000次阅读

    Square Enix北美、欧洲分社调整发行策略,启动裁员计划

    近期,Square Enix发布的财务报告显示,公司正计划对海外业务部门进行全面重组,并通过结构性改革来降低欧洲及美国办公室的运营成本。
    的头像 发表于 05-14 10:09 323次阅读

    ST25DV04可以读取实体IC吗?

    我最近打算使用ST25DV04做一个NFC,这款芯片可以读取实体IC,获取IC信息,并模拟IC刷卡吗?
    发表于 03-18 07:04

    sd是什么有什么用途 TF和SD有什么区别

    取出并在其他设备读取。 SD卡通常用于数字相机、智能手机、平板电脑、音乐播放器、游戏机、导航系统和其他支持SD设备中。它们提供了扩展存储空间的功能,允许用户在内存不够的情况下存储
    的头像 发表于 01-31 13:53 4811次阅读

    Aurix TC297 pFlash为什么不能读取任何闪存地址?

    我尝试读取闪存,并定义宏内存(地址)来读取闪存。 #define MEM(地址)* ((uint32 *)(地址)) aa = MEM (0xa0008000);bb=aa ; 但是不能读取
    发表于 01-24 07:51

    Holtek新推出BC45B4522 NFC Reader Controller

    Holtek新推出NFC Reader Controller BC45B4522,提供门禁锁、标签读写器、付款机等近场无线通信应用优秀解决方案。
    的头像 发表于 01-16 14:22 508次阅读

    数据采集怎么用 数据采集怎么读取数据

    数据采集怎么用 数据采集怎么读取数据  数据采集(Data Acquisition Card)是一种用于采集和转换各种输入信号的硬件设备
    的头像 发表于 12-15 09:50 1693次阅读