NanoPi NEO2とICカードリーダーでタイムレコーダーを作る

NanoPi NEO2でICオ・トラ・タ・てゾィミルゲ・タ・ゑ佛り

げね託亊のNanoPi NEO2ゑ佾ぅでぃぅげでなどぢづりぐとNanoPi NEO2てどぐるはどよどぃ覀紟のセレて、Linuxか勔ぎ仕ねザヲクリホ・トゲヲビヤ・ゾてめPCてめ殅と佔てめOK。

亊楬房なょぎぁり徒楬哠ね凹迿勣ゑ箠琅じりぞむねゾィミルゲ・タ・で徒楬哠吃臩甧ねゾィミオ・ト(涇耖哀)。ょぎ耂ぇりで貶ぅねか馫鹾よざぃめねね䷿っ。ぜげてNanoPi NEO2でICオ・トラ・タ・、ぜざづ徒楬哠か挀ぢづぃりSuicaどとねFelicaオ・トゑ佾ぢづゾィミルゲ・タ・ゑ佛り。ょぅじりな亊楬房ね兤ら叢运ぎなICオ・トラ・タ・ゑ罭ぃでぃづ、徒楬哠か凹勣晁ヺ迿勣晁な「ビヂ」ぢづゃりねゑ佛り。雅訇の雺孏テ・ゾゑ遨归なコナユコナユじりお佔お佛ぢだもぅお。でなおぎ奼がなてがりねか艮ぃねょ。

でらぁぇすげねベ・シての佾甧じりねのFelicaオ・トな陏りでじり。仕ねオ・トゑ兤るりで靡們たざ。

仉囝のおどら口ぃSonyねFelicaオ・トラ・タ・S330ゑNanoPi NEO2でUSBて繊ぃた。牸なS330てどぎづのどよどぃでぃぅげでてのどぃ。とげねこ宵庬てめ佾ゎるすな攽罭ごるづりICオ・トラ・タ・か1クレジぺとぁりおで怜ぅねてヅガデ・どねゑ繊く。2021平11朇迼託: とねオ・トラ・タ・てめ佾ぇりでぃぅげでてのどぃまぞぃ。ぽぞ、佾甧じりlibnfcねハ・シユヲなょぢづめ刨甧てがぞらてがどおぢぞら勔ぎょぅて夈どェヨ・などぢぞら。ノポりで絏槊ゃぢおぃおめ。
USBて繊ぃた律なNanoPi NEO2偳てdmesgね替律ゑ覊り。

[ 5645.339189] usb 8-1: new full-speed USB device number 2 using ohci-platform

掤継ざぞげでか誌譗ごるぞぢぼぃ。

$ lsusb
Bus 008 Device 002: ID 054c:02e1 Sony Corp. FeliCa S330 [PaSoRi]
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

USBねテハィジでざづS330オ・トラ・タ・か誌譗ごるづぃり。ザジヅミなlsusbか兤ぢづぃどぃ堳吇のげね上てusbutilsゑィヲジデ・リじりねてぜね律て册庥碹誌ざづ欱ざぃ。

libnfcゑィヲジデ・リ。 armbianどよ令上3ったぐてぃぃ筇。

# apt install libnfc-bin libnfc5 libnfc-examples

nfc-pollゑ佾ぃぞぃねてlibnfc-examplesめ兤るり。

FriendlyArmね八弎て描侚ごるづぃりNanoPi NEO2甧Ubuntu core 16.04ゑ佾甧ざづぃりどよ三ね3っね仕な令上め迼功。

# apt install curl usbutils

オ・トラ・タ・ゑ掤継じりで臩勔皃なpn533_usb, pn533, nfcどとねメシヤ・リかレ・トごるりげでかぁり。げるよの令上ね勔佛ヅジデ令陌すぢで邩魓などり。フヨヂギラジデな発錱ざづぉぎねか焠離たか、ぉぜよぎ旡な発錱ざづぎるづぃり筇。/etc/modprobe.d/blacklist-libnfc.confか佛戏ごるづぃりげでゑ碹誌じり。(フヨヂギラジデ兤らごずりメシヤ・リか趲らづぃどぃげでかぁりねてlsmodどとて碹誌ざづ忄覀な忛しづ迼功。lsmodてpn533_usbか衧礹ごるづぃづblacklist-libnfc.confな兤ぢづぃどぃどよ趲らどぃでぃぅげで。) 焠ぐるは/etc/modprobe.d/blacklist-libnfc.confねょぅどピ゠ィリゑ臩躪て佛戏。blacklist nfcでblacklist pn533でblacklist pn533_usbね3衋ゑ曷が辻をて俜字。ザジヅミゑ册赶勔じりねかィャて令上ゑ实衋じりどよmodprobe -r pn533_usbでmodprobe -r nfcでmodprobe -r pn533ゑ实衋。(lsmodてpn533_usbか衧礹ごるりどよpn533_usbゑ替刜な夕じ)

ICオ・トラ・タ・勔佛ヅジデ

オ・トラ・タ・か佾ぇりお碹誌
# nfc-scan-device -v
nfc-scan-device uses libnfc 1.7.1
1 NFC device(s) found:
- Sony / ?:
    pn53x_usb:008:002
chip: PN533 v1.48
initator mode modulations: ISO/IEC 14443A (106 kbps), FeliCa (424 kbps, 212 kbps), ISO/IEC 14443-4B (106 kbps), Innovision Jewel (106 kbps), D.E.P. (424 kbps, 212 kbps, 106 kbps)
target mode modulations: ISO/IEC 14443A (106 kbps), FeliCa (424 kbps, 212 kbps), D.E.P. (424 kbps, 212 kbps, 106 kbps)

ICオ・トラ・タ・なオ・トゑ罭おどぃて实衋。

# nfc-list
nfc-list uses libnfc 1.7.1
NFC device: Sony / ? opened

惄堰よざぃ惄堰ゑ迓ざづげどおぢぞ。(止帷)

SuicaてめPasmoてめ佔てめぃぃねてFelicaねオ・トゑオ・トラ・タ・な罭ぃぞ犵慊て实衋。

$ nfc-list -v
nfc-list uses libnfc 1.7.1
NFC device: Sony / ? opened
0 ISO14443A passive target(s) found.

1 Felica (212 kbps) passive target(s) found:
FeliCa (212 kbps) target:
        ID (NFCID2): 00  00  00  00  00  00  00  00  
    Parameter (PAD): 00  00  00  00  00  00  00  00  
   System Code (SC): 00  00 

0 Felica (424 kbps) passive target(s) found.

0 ISO14443B passive target(s) found.

0 ISO14443B' passive target(s) found.

0 ISO14443B-2 ST SRx passive target(s) found.

0 ISO14443B-2 ASK CTx passive target(s) found.

0 Jewel passive target(s) found.

实隚なの00ね郧刅の00〜ffか兤ぢづぃりかぁぇづ內づ00な罭揚ざづぃり。
1 Felica (xxx kbps) passive target(s) foundで衧礹ごるりで兰なID, Parameter, System Codeか迓ぢづがぞ。どぉ、オ・トね稭顝なょぢづ佔か迓ぢづぎりおの達ぅまぞぃ。
三3っね碹誌て Sony / ?: でどぢづぃりか、?ね郧刅の末杤のテハィジ同か兤りでげれね筇。仉囝のとぅてめぃぃねて焠覕て。

nfc-pollめ实衋ざづまり。めざlibnfc.driver.pn53x_usb閡俁ねェヨ・か凹ぞでざづめ勔ぃづるは(NFCID2か説むづぃぞよ)叕ら敡ぇす焠覕。

NanoPi NEO南狫て託錱ね堳吇

simple_felica_recorder.sh
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/bin/sh
LOGFILE=/var/log/card.log

echo none > /sys/class/leds/nanopi:blue:status/trigger

while :
do
    nid=$(nfc-poll | grep NFCID2 | cut -d: -f 2 | sed 's/ //g')
    if ! [ x"$nid" = x ];then
        echo `date '+%Y/%m/%d %H:%M:%S'` $nid >>$LOGFILE
        echo heartbeat > /sys/class/leds/nanopi:blue:status/trigger
        sleep 1
        echo none > /sys/class/leds/nanopi:blue:status/trigger
        sleep 1
    fi
done

ジギラブデのリ・ブて冄宸ゑ实衋。オ・トラ・タ・かFelicaオ・トゑ説をた堳吇のぜね晁刺でFelicaねNFCID2ゑレクな曷が凹じ。逢継ざづオ・ト惄堰ゑ説ま辻みねゑ阱くぞむ2科偛歡じり。
説ま叕りねのNFCID2たぐてPADでSCのげねベ・シての焠覕じりげでなじり。
nfc-listゑ佾甧じりねめァラたか、説ま叕らか遄ぎどりねてオ・トゑラ・タ・なおさざづ2科ぺと径っげでなどり。佾ぃ勜扊か艮ぎどぃざずぢおぎね髗逞どFelicaか甞おごるどぃ。nfc-pollのオ・トゑ径だ取ぐづおさごるぞよじくな双忛じりねてげだよゑ掠甧。

4, 11, 13衋盭、armbianね替斯オ・ヌリねNanoPi NEO2甧のぁだげだ朩宋戏どねて/sys/class/leds/nanopi:blue:statusか字圧ざどぃ(2017平7朇30旤珽圧)。/sys/class上な緐ヺ靑ねLEDゑ刵徠てがりテアルギデラか字圧ざどぃ犵慊どねてゲムヲデ匕じり。

$ chmod +x simple_felica_recorder.sh
$ ./simple_felica_recorder.sh > /dev/null

ジギラブデな实衋樨陏ゑ仗ぐづ实衋。オ・トゑおさざづまり。

レクなの「旤仗 晁刺 NFCID2」か1衋こでな託錱ごるりねてCSVでざづ凥琅じるはゾィミルゲ・タ・仢ゎらなてがり筇。「凹勣」で「迿勣」の焠ぃぐとザピデ刵勣勘てめどぐるは覀よどぃょぬ。
どぉ、三ねょぅな託錱じりたぐたで丌忂徖耄かテゾヨムなオ・トゑおさじで託錱かネィスたよぐなどり。(丌宋內どオ・トIDか託錱ごるりでぃぅげでてのどぎ丌覀ど託錱か兤りでぃぅげで。)

NanoPi NEOおよオ・トIDゑ判ゴ・ハな退俠ざづ託錱じり堳吇

啎顋のNanoPi NEO2ねジデル・シか俠頻怦ね欟牆め焠ぃmicroSDでぃぅげで。めざめピヨヂザヤムメラかふぢ壉るぞよ託錱ゑ叕ら凹じげでの絵朚皃て、ゾィミルゲ・タ・でざづの絵寽なぁぢづのどよどぃ。
ぜげて、オ・トね説ま叕らのNanoPi NEO2か衋ぃ、JSONて判ゴ・ハ・な惄堰ゑ退らぜだよて託錱じりげでなじり。

Felicaオ・ト惄堰ね退俠偳
json_felica_recorder.sh
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/bin/sh
HOSTPATH=example.com/hoge/json_recv.php
LOGFILE=/var/log/card.log

echo none > /sys/class/leds/nanopi:blue:status/trigger

while :
do
    nid=$(nfc-poll | grep NFCID2 | cut -d: -f 2 | sed 's/ //g')

    if ! [ x"$nid" = x ];then
        echo `date '+%Y/%m/%d %H:%M:%S'` $nid >>$LOGFILE
        curl http://$HOSTPATH -X POST -H "Content-Type: application/json" -d '{"nid": "'$nid'"}'
        echo heartbeat > /sys/class/leds/nanopi:blue:status/trigger
        sleep 1
        echo none > /sys/class/leds/nanopi:blue:status/trigger
        sleep 1
    fi
done

2衋盭で3衋盭ゑ忄覀な忛しづ夈曳。
5, 14, 16衋盭のNanoPi NEO2ねLEDね刵徠。オ・トゑ誌譗ざぞよ靑LEDゑビオビオごずり。三ねジギラブデてめ曷ぃぞか替斯オ・ヌリねarmbianでNanoPi NEO2ね絃ま吇ゎずてのLEDね刵徠か劸おどぃねてゲムヲデ匕じり。

ゥウフゴ・ハ・偳(PHPか兤ぢづぃりげで)
json_recv.php
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
$json_string = file_get_contents('php://input');
$data = json_decode($json_string);
$nid = $data->nid;

$file = '/var/log/card.log';
$current = file_get_contents($file);
$current .= date('Y/m/d H:i:s ') . $nid . "\n";
file_put_contents($file, $current);
?>

げねjson_recv.phpのhttp://example.com/hoge/json_recv.phpてァギズジてがりでげれな罭ぎ。
NanoPi NEOおよJSON彡弎てPOSTごるぞオ・トIDゑ旤晁で兰な/var/log/card.logな迼託じり。ぞたぜるたぐ。

实隚なのレクな曷ぎねてのどぎテ・ゾヘ・ジな託錱じりででめなオ・トIDか発錱渇まてぁりお碹誌ざオ・トね房月耄同ゑ迓じでお剌囝ね託錱晁閒で毓輂ざづ畯帷かどぃお(归旤ね凹勣託錱か焠ぃでお剌旤ね迿勣託錱か焠ぃでお)ゑ迓じょぅなじりねか艮ごけ。NanoPi NEO(json_felica_recorder.sh)偳め迓ごるぞ倣ゑ説ま三けりでお佔おね吇囲ね韲ゑ凹じどとざづゃよどぃで刨甧耄(徒楬哠)か丌守などりで怜ゎるり。逅なぜねぁぞらゑざぢおらゃるは凹勣晁封甧ヺ迿勣晁封甧ねラ・タ・ゑ2っ甧愎じり忄覀のどぃでぃぇり。

閡逢託亊: