0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

怎樣使用Square Reader和Android設(shè)備讀取任何磁條卡

454398 ? 來(lái)源:工程師吳畏 ? 作者:工程師吳畏 ? 2019-11-19 17:01 ? 次閱讀

步驟1:了解格式

怎樣使用Square Reader和Android設(shè)備讀取任何磁條卡

磁性編碼條帶數(shù)據(jù)遵循通用標(biāo)準(zhǔn)。磁條由3條物理上分開(kāi)的“磁道”組成。磁道1最靠近卡的底部,磁道3最高。 Square的讀取器位于讀取軌道2的位置。軌道2是最常用的軌道,但是大多數(shù)信用卡也使用軌道1。軌道2包括卡號(hào)和有效期。音軌1包括那個(gè)加號(hào)。根據(jù)特定的卡,可能還會(huì)有其他數(shù)據(jù)。這些磁道的寬度規(guī)定為0.11英寸,因此要使用Square的讀取器讀取磁道1,我們只需要重新布置條紋,使磁道1與讀取頭對(duì)齊即可。

每個(gè)磁道中的數(shù)據(jù)均通過(guò)磁編碼域翻轉(zhuǎn)。長(zhǎng)話短說(shuō):一系列的域翻轉(zhuǎn)對(duì)波形進(jìn)行編碼,該波形被解釋為二進(jìn)制。此編碼中的二進(jìn)制0是任意頻率。 1是該頻率的兩倍。

數(shù)據(jù)以一組前導(dǎo)零開(kāi)始,以建立基本頻率。在可變數(shù)目的零之后,出現(xiàn)開(kāi)始標(biāo)記。對(duì)于音軌2,開(kāi)始標(biāo)記為“;”。每個(gè)字符被編碼為整數(shù),最低有效位在前。對(duì)于磁道2,每個(gè)字符包含4個(gè)數(shù)據(jù)位和1個(gè)奇偶校驗(yàn)位。為每個(gè)字符設(shè)置奇偶校驗(yàn)位,以使1的數(shù)量為奇數(shù)。如果為每個(gè)字符的整數(shù)值加上48(ASCII編碼為“ 0”),則將顯示ASCII字符。除了數(shù)字“ 0”到“ 9”之外,磁道2還可以編碼一些其他字符,包括“;”。 (開(kāi)始標(biāo)記),“ =“(字段分隔符)和“?” (末尾)。

步驟2:制作墊片以讀取音軌1

磁卡的磁道1比磁道2更靠近卡的邊緣.11英寸。由于Square讀卡器被設(shè)置為讀取磁道2,因此如果我們?cè)诖诺乐姓迟N一些東西,讀取器將卡提升.11英寸時(shí),讀取頭將與軌道1對(duì)齊,而不是與軌道2對(duì)齊。

您可以通過(guò)從另一張卡上剪切0.11英寸的條來(lái)創(chuàng)建墊片。我還發(fā)現(xiàn)廉價(jià)垃圾袋的纏結(jié)也差不多。

第3步:錄制一些音頻

就電話而言,Square閱讀器只是一個(gè)麥克風(fēng)。因此,要從卡中獲取數(shù)據(jù),我們需要記錄音頻。請(qǐng)參閱其他Android文檔(例如本教程:http://eurodev.blogspot.com/2009/09/raw-audio-manipulation-in-android.html)以獲取詳細(xì)說(shuō)明,或使用RhombusLib(請(qǐng)參閱最后的鏈接) )。以下是一些Java代碼,可以開(kāi)始在Android應(yīng)用中記錄音頻:

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

頻率,channelConfiguration,

audioEncoding,bufferSize);

audioRecord.startRecording();

錄音時(shí),我們需要不斷從錄音機(jī)中讀取數(shù)據(jù)并將其放入緩沖區(qū)中。

//創(chuàng)建一個(gè)DataOutputStream以寫入音頻數(shù)據(jù)

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中提取并簡(jiǎn)化的。錄制后,您將擁有一個(gè)字節(jié)數(shù)組,代表麥克風(fēng)中的樣本,可以進(jìn)行分析。

步驟4:解碼音頻

因此,現(xiàn)在我們的設(shè)備上有很多音頻。我們?nèi)绾谓獯a它?我的代碼基于Android教程,該教程顯示了如何記錄數(shù)據(jù)然后進(jìn)行回放。就我而言,我確保將音頻保存為16位PCM編碼。我以44100hz采樣。在Android(以及其他地方,我想)上,16位PCM數(shù)據(jù)意味著每個(gè)樣本都是一個(gè)帶符號(hào)的16位值。因?yàn)槲覀冎魂P(guān)心頻率,所以我們只需要關(guān)心“零交叉”之間有多少時(shí)間。過(guò)零是指信號(hào)從正向變?yōu)樨?fù),反之亦然。 0位將由2個(gè)交叉點(diǎn)之間的間隔表示,而1將在大約相同的時(shí)間段內(nèi)有一個(gè)額外的交叉點(diǎn)。

每個(gè)磁道中的卡數(shù)據(jù)以一些(可變)數(shù)0開(kāi)始,以建立基本頻率。我所做的是聽(tīng)取高于某個(gè)“安靜”閾值的第一個(gè)樣本,然后計(jì)算零交叉之間的樣本數(shù)。該數(shù)字將成為0的基值。由于這些卡是手工刷卡的,因此從掃描開(kāi)始到結(jié)束,實(shí)際頻率將有所變化。因此,我做了一個(gè)簡(jiǎn)單的方法,確定自上次零交叉以來(lái)的樣本數(shù)量是否更接近基本頻率或兩倍于基本頻率(基本樣本數(shù)量的一半)。然后,它會(huì)相應(yīng)地調(diào)整預(yù)期的基本頻率。只要兩個(gè)邏輯位之間的變化很小,此方法就可以很好地工作。而且它們幾乎肯定會(huì)。

檢測(cè)零交叉,我們需要查看每個(gè)樣本的符號(hào)并將其與前一個(gè)樣本的符號(hào)進(jìn)行比較。如果它們不同(一個(gè)正,一個(gè)負(fù)),則信號(hào)在這些樣本之間越過(guò)0。

基本算法是遍歷字節(jié)數(shù)組,提取樣本。計(jì)算零交叉之間的樣本數(shù),并將其與0或1的預(yù)期計(jì)數(shù)進(jìn)行比較。好的,經(jīng)過(guò)一番揮舞之后,我們現(xiàn)在有了一個(gè)二進(jìn)制數(shù)據(jù)序列,我們想回過(guò)頭來(lái)。轉(zhuǎn)換成ASCII。最常見(jiàn)的編碼(也是我編寫的唯一處理程序)將每個(gè)字符編碼為一定數(shù)量的位,再加上一個(gè)奇偶校驗(yàn)位。對(duì)于音軌2,字符為4位,奇偶校驗(yàn)為1,組成5位組。從最低有效位到最高讀取位,最后一位是奇偶校驗(yàn)位。將奇偶校驗(yàn)位設(shè)置為使組中的1的個(gè)數(shù)為奇數(shù)。在我的實(shí)現(xiàn)中,我只是忽略了奇偶校驗(yàn)位,但這將有助于確定讀取是否正確。在磁道1中,字符的6位加上奇偶校驗(yàn)。

磁道的字符集也有所不同,但是兩者都是ASCII子集,具有一些偏移量。對(duì)于僅編碼一些符號(hào)和數(shù)字的磁道2,字符集從48開(kāi)始,這是“ 0”的ASCII碼。因此,如果我們得到0,0,0,0,1作為我們的角色,則將其變成0,加48,得到48。類似地,1,0,0,0,0為1。1 + 48 = 49 = ASCII“ 1”。

對(duì)于軌道1,字符集以“”(空格)開(kāi)頭,即ASCII32。因此,我們?cè)诮獯a的數(shù)字值上加上32,得到ASCII字符。之后,我們有了數(shù)據(jù),因此剩下的一切都只是在掛接UI膠水。

責(zé)任編輯:wv

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Android
    +關(guān)注

    關(guān)注

    12

    文章

    3941

    瀏覽量

    127719
  • BSQUARE
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    8759
  • 磁條卡
    +關(guān)注

    關(guān)注

    0

    文章

    8

    瀏覽量

    6884
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Android 實(shí)現(xiàn)讀卡器讀取各種卡號(hào)的信息

    。ConstraintLayout是Android開(kāi)發(fā)中非常強(qiáng)大的一個(gè)布局管理器,它允許你以相對(duì)位置的方式定義界面中的元素,使得布局更加靈活和易于管理。下面是對(duì)這段代碼的簡(jiǎn)單解釋: :這是XML聲明,指定了XML的版本為
    的頭像 發(fā)表于 12-30 15:45 ?142次閱讀
    <b class='flag-5'>Android</b> 實(shí)現(xiàn)讀卡器<b class='flag-5'>讀取</b>各種卡號(hào)的信息

    網(wǎng)絡(luò)讀卡器qt代碼示例,包含獲取本地ip地址。讀取IC卡號(hào),讀取扇區(qū)數(shù)據(jù)

    getAllIPAddresses() { QStringList ips; QList list = QNetworkInterface::allAddresses(); for (int i = 0; i //解析讀取
    的頭像 發(fā)表于 12-30 09:22 ?148次閱讀
    網(wǎng)絡(luò)讀卡器qt代碼示例,包含獲取本地ip地址。<b class='flag-5'>讀取</b>IC<b class='flag-5'>卡</b>卡號(hào),<b class='flag-5'>讀取</b>扇區(qū)數(shù)據(jù)

    使用TF的常見(jiàn)問(wèn)題

    、視頻、文檔等數(shù)據(jù)。 1. TF無(wú)法被識(shí)別 問(wèn)題描述: 當(dāng)你將TF插入設(shè)備時(shí),設(shè)備無(wú)法識(shí)別或讀取TF
    的頭像 發(fā)表于 11-04 09:54 ?1453次閱讀

    谷歌正式向Pixel設(shè)備推送Android 15穩(wěn)定版

    10月17日最新資訊,谷歌今日已正式向Pixel系列設(shè)備推送Android 15穩(wěn)定版更新。目前,已有部分Pixel設(shè)備成功完成升級(jí),而更大范圍的推送預(yù)計(jì)將在本周末進(jìn)行。
    的頭像 發(fā)表于 10-17 16:31 ?481次閱讀

    智能IC測(cè)試設(shè)備的技術(shù)原理和應(yīng)用場(chǎng)景

    提供工作電壓,完成數(shù)據(jù)的讀寫操作。 數(shù)據(jù)處理: 測(cè)試設(shè)備向IC發(fā)送各種指令(如讀取數(shù)據(jù)、寫入數(shù)據(jù)、修改數(shù)據(jù)等),并接收來(lái)自IC的響應(yīng)。 通過(guò)分析響應(yīng)數(shù)據(jù),測(cè)試
    發(fā)表于 09-26 14:27

    物聯(lián)網(wǎng)產(chǎn)品在生產(chǎn)測(cè)試過(guò)程中快速讀取貼片SIM卡號(hào)的方案

    卡號(hào),讀卡表產(chǎn)品可以解決在研發(fā)測(cè)試過(guò)程中,方便讀取物聯(lián)網(wǎng)貼片卡號(hào)的問(wèn)題。 二、該問(wèn)題帶來(lái)的危害及影響 如果不讀出設(shè)備的SIM卡號(hào),無(wú)法將設(shè)備
    的頭像 發(fā)表于 09-23 16:14 ?368次閱讀
    物聯(lián)網(wǎng)產(chǎn)品在生產(chǎn)測(cè)試過(guò)程中快速<b class='flag-5'>讀取</b>貼片SIM卡號(hào)的方案

    如何讀取多張的UID,有償

    應(yīng)用場(chǎng)景是在一摞卡片,需要通過(guò)循環(huán)讀取卡片的UID,來(lái)獲取所有卡片的UID。但是普通MFRC522模組的磁場(chǎng)強(qiáng)度無(wú)法給多張供電,想咨詢?nèi)绾谓o一摞供電,當(dāng)然模組可以移動(dòng),或許只需要給部分卡片供電即可。紅包200元,財(cái)力有限,請(qǐng)
    發(fā)表于 08-17 21:50

    丟掉數(shù)據(jù)線,你還會(huì)調(diào)試Android設(shè)備嗎?

    ADB(AndroidDebugBridge)作為Android開(kāi)發(fā)中非常重要的工具,開(kāi)發(fā)者可以使用ADB設(shè)備在電腦上對(duì)Android設(shè)備進(jìn)
    的頭像 發(fā)表于 08-14 17:09 ?425次閱讀
    丟掉數(shù)據(jù)線,你還會(huì)調(diào)試<b class='flag-5'>Android</b><b class='flag-5'>設(shè)備</b>嗎?

    谷歌宣布對(duì)Android設(shè)備流媒體服務(wù)進(jìn)行重大擴(kuò)展

    8月8日,谷歌宣布對(duì)其Android設(shè)備流媒體服務(wù)進(jìn)行重大擴(kuò)展,此舉旨在進(jìn)一步賦能開(kāi)發(fā)者,讓他們能夠遠(yuǎn)程接入并測(cè)試更多品牌及型號(hào)的真實(shí)Android物理設(shè)備。自2014年該服務(wù)問(wèn)世以來(lái)
    的頭像 發(fā)表于 08-08 16:30 ?721次閱讀

    怎樣修改LVGL的lv_port_fs文件,讓它使用rt-thread的DFS文件系統(tǒng)中的API函數(shù)讀取SD中的圖片?

    我想問(wèn)一下,怎樣修改LVGL的lv_port_fs文件,可以讓它使用rt-thread的DFS文件系統(tǒng)中的API函數(shù)(這些API函數(shù)在rt-thread的dfs_posix.c中)讀取SD中的圖片?
    發(fā)表于 07-11 06:53

    X Square獲得1050萬(wàn)美元A輪融資

    近日,專注于人工智能與機(jī)器人領(lǐng)域技術(shù)創(chuàng)新的X Square公司成功獲得了一筆1050萬(wàn)美元的A輪融資。此次融資由Wavemaker Partners領(lǐng)投,同時(shí)獲得了SEEDS Capital和Goldbell Corporation的參與投資。
    的頭像 發(fā)表于 05-31 11:45 ?1093次閱讀

    Square Enix北美、歐洲分社調(diào)整發(fā)行策略,啟動(dòng)裁員計(jì)劃

    近期,Square Enix發(fā)布的財(cái)務(wù)報(bào)告顯示,公司正計(jì)劃對(duì)海外業(yè)務(wù)部門進(jìn)行全面重組,并通過(guò)結(jié)構(gòu)性改革來(lái)降低歐洲及美國(guó)辦公室的運(yùn)營(yíng)成本。
    的頭像 發(fā)表于 05-14 10:09 ?406次閱讀

    ST25DV04可以讀取實(shí)體IC嗎?

    我最近打算使用ST25DV04做一個(gè)NFC,這款芯片可以讀取實(shí)體IC,獲取IC信息,并模擬IC刷卡嗎?
    發(fā)表于 03-18 07:04

    sd是什么有什么用途 TF和SD有什么區(qū)別

    取出并在其他設(shè)備讀取。 SD卡通常用于數(shù)字相機(jī)、智能手機(jī)、平板電腦、音樂(lè)播放器、游戲機(jī)、導(dǎo)航系統(tǒng)和其他支持SD設(shè)備中。它們提供了擴(kuò)展存儲(chǔ)空間的功能,允許用戶在內(nèi)存不夠的情況下存儲(chǔ)
    的頭像 發(fā)表于 01-31 13:53 ?5640次閱讀

    Aurix TC297 pFlash為什么不能讀取任何閃存地址?

    我嘗試讀取閃存,并定義宏內(nèi)存(地址)來(lái)讀取閃存。 #define MEM(地址)* ((uint32 *)(地址)) aa = MEM (0xa0008000);bb=aa ; 但是不能讀取
    發(fā)表于 01-24 07:51