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

    文章

    3986

    浏览量

    133084
  • BSQUARE
    +关注

    关注

    0

    文章

    5

    浏览量

    8851
  • 磁条卡
    +关注

    关注

    0

    文章

    8

    浏览量

    7015
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Joycode 无法跨项目读取源码怎么办?MCP Easy Code Reader 帮你解决!

    本篇文章主要介绍 MCP Server Easy Code Reader ,它可以帮助你在使用 Joycode 编写代码时,根据调用链路将多个项目或 Jar 包中相关的代码读取到上下文中,供
    的头像 发表于 11-19 15:50 851次阅读
    Joycode 无法跨项目<b class='flag-5'>读取</b>源码怎么办?MCP Easy Code <b class='flag-5'>Reader</b> 帮你解决!

    华大电子助力多家银行发行银联-VISA双标

    。这款集银联PBOC标准与国际EMV标准于一体的芯片,有效解决传统磁条卡在安全性与兼容性方面短板,标志着我国金融芯片产品实现从本土化到全球化的跨越式突破。
    的头像 发表于 07-25 16:18 724次阅读

    aicube的ngpu索引该如何添加?

    请问有人知道aicube怎样才能读取n的gpu索引呢,我已经安装了cuda和cudnn,在全局的py里添加了torch,能够调用gpu,当还是只能看到默认的gpu0,显示不了gpu1,gpu0是集显,训练速度太感人了 你只有一块英伟达的卡,aicube不支持AMD的显
    发表于 07-25 08:18

    如何为 Android 操作系统/设备生成 APK ?

    如何为 Android 操作系统/设备生成 APK ?
    发表于 06-30 07:12

    CYUSB3025如何同时读取2张SD吗?

    我们想使用 CYUSB3025 读取 2 张 SD ,但是我们正在进行板载测试。 最后它只读了一张。 我可以知道如何同时读取 2 张 SD
    发表于 05-19 07:51

    如何在Android设备上安装Cyusb3014芯片驱动?

    1.如何在Android设备上安装Cyusb3014芯片驱动? 我们在 Windows 上有 FX3 驱动程序 SDK。 2.如何在Android系统上下载固件到芯片中?
    发表于 05-15 07:23

    RFID智能的应用

    RFID智能的特点高安全性:RFID智能内置加密芯片,能够有效防止信息被非法复制或篡改。多功能性:可以存储多种类型的信息,如身份信息、支付信息等。快速读取:支持非接触式读取,大幅提
    的头像 发表于 05-14 18:16 862次阅读
    RFID智能<b class='flag-5'>卡</b>的应用

    【STM32系统】基于STM32设计的SD数据读取与上位机显示系统(SDIO接口驱动、雷龙贴片SD

    。   1.2 研究目的   本研究的主要目的是基于STM32F103微控制器,设计一个能够读取SD数据并显示到上位机的系统。SD的数据读取不仅是为了验证存储
    发表于 05-09 16:11

    如何从FX2LP设备的EEPROM读取固件(.iic)?

    是否有任何工具可以从 FX2LP 设备的 EEPROM 读取固件(.iic)? 我想备份旧固件来重新编程我的设备,但我丢失了旧的 IIC 固件。
    发表于 05-07 06:37

    Android 16有哪些变更

    全球范围内有超过 30 亿台 Android 设备正在使用中,这使得 Android 生态系统比以往任何时候都更加活跃。Android 移动
    的头像 发表于 03-27 10:18 1553次阅读

    门禁有哪些分类

    的时候芯片内码号就已经固话不可更改,每次使用只是读取ID的卡号和相关信息进行关联。ID与磁卡一样,都仅仅使用了“的号码”而已,内除了
    的头像 发表于 03-17 17:24 5616次阅读
    门禁<b class='flag-5'>卡</b>有哪些分类

    Android 16的首个Beta版现已推出,升级功能有这些

    Android 16 的首个 Beta 版现已推出,这是向开发者和早期体验者开放试用的最好时机。您现在可以注册任何受支持的 Pixel 设备,以便以 OTA 方式获取此版本和未来的 Andro
    的头像 发表于 03-14 10:58 1406次阅读
    <b class='flag-5'>Android</b> 16的首个Beta版现已推出,升级功能有这些

    Spire.XLS for Android via Java组件说明

    。Spire.XLS for Android via Java 提供了一系列丰富的操作 Excel 的功能,例如创建、读取、编辑和转换 Excel 工作
    的头像 发表于 01-24 12:16 823次阅读
    Spire.XLS for <b class='flag-5'>Android</b> via Java组件说明

    Android 实现读卡器读取各种卡号的信息

    。ConstraintLayout是Android开发中非常强大的一个布局管理器,它允许你以相对位置的方式定义界面中的元素,使得布局更加灵活和易于管理。下面是对这段代码的简单解释: :这是XML声明,指定了XML的版本为
    的头像 发表于 12-30 15:45 751次阅读
    <b class='flag-5'>Android</b> 实现读卡器<b class='flag-5'>读取</b>各种卡号的信息

    网络读卡器qt代码示例,包含获取本地ip地址。读取IC卡号,读取扇区数据

    getAllIPAddresses() { QStringList ips; QList list = QNetworkInterface::allAddresses(); for (int i = 0; i //解析读取
    的头像 发表于 12-30 09:22 1425次阅读
    网络读卡器qt代码示例,包含获取本地ip地址。<b class='flag-5'>读取</b>IC<b class='flag-5'>卡</b>卡号,<b class='flag-5'>读取</b>扇区数据