LoginSignup
2
0

windowsでNFCのIdmを取得したいけど、どうします?

Last updated at Posted at 2024-03-10

こんにちは、あるいは、こんばんは。

弊社は、スマートロックにNFCのタグを取得して開閉と記録をとっています。

このNFCのタグはamazonで売っているようなこんなタグです。(一例)

開錠にはNFCのタグごとのIdmが必要です。

このIdmはターミナル上でNFCのIdmを読み取ることは以下のコードで取得できる。

felica_read.py
import binascii
import nfc
import signal


class FelicaCardReader(object):

    def on_connect(self, tag):
        if tag.product != ['FeliCa Standard']:
            # felica
            self.idm = binascii.hexlify(tag.identifier)
        else:
            # nfc
            self.idm = binascii.hexlify(tag.idm)
        return True

    def read_idm(self):
        clf = nfc.ContactlessFrontend('usb')
        try:
            clf.connect(rdwr={'on-connect': self.on_connect})
        finally:
            clf.close()


if __name__ == '__main__':
    read_card = FelicaCardReader()
    while True:
        read_card.read_idm()
        idm = str(read_card.idm, encoding='utf-8', errors='replace')
        print(f'IDm: {idm}')
        signal.signal(signal.SIGINT, signal.SIG_DFL)

だが、これだと人が増えたりした時に「Idmを取得してくだい」という仕事が私に降ってくる。

その度に、macにRC-S380を接続してターミナルでこのプログラムを走らせなければいけない。

非常にめんどくさい

とても改善できるポイントですね!

弊社には Raspberry Pi3(以後ラズパイと略す) と pasori RC-S380(以後パソリと略す) が余っている。
ラズパイのOSはdebian系で対応しました。
ラズパイを常時起動するか、再起動した時にプログラムを起動するようにして、NFCの読み取り後Idmをslackのチャンネルに通知するようにすればいいんじゃないか?

とりあえず、slackのwebhookを準備するんだ。
あえてここでは説明しない。

その後、先ほどのコードに以下のコードを追加する。

import requests

def _get_webhook_notification_url():
    return ('https://hooks.slack.com/services/省略')  # 各自webhookの設定をしてここに書く。


def send_slack(message):
    if isinstance(message, dict):
        post_data = message
    else:
        post_data = {
            "text": message,
        }

    post_data['username'] = 'ユーザーネームは各自で'
    post_data['channel'] = 'チャンネル名も各自で'
    post_data['icon_emoji'] = '絵文字も各自で'

    print(post_data)

    response = requests.post(
        _get_webhook_notification_url(),
        json=post_data,
    )

    return response

if __name__ == '__main__':
    read_card = FelicaCardReader()
    while True:
        read_card.read_idm()
        idm = str(read_card.idm, encoding='utf-8', errors='replace')
        send_slack(f'IDm: {idm}')
        signal.signal(signal.SIGINT, signal.SIG_DFL)

ラズパイ側の設定

pipで必要なものインストールする

pip3 install requests  
pip3 install nfcpy
pip3 install requires

コード実行

sudo python3 felica_read.py >> felica_read.log 2>&1

これでslackに通知されちゃうよ!
Slack_-チャンネル___nfc-tracker-_torico.png

では再起動する時どうしよう

crontabで入れるとして単純に以下の内容だと一瞬走るだけでタグを読み取らない。

crontab
# ${HOME}にpythonファイルを置いている前提
@reboot sudo python3 ${HOME}/read_felica.py' >> ${HOME}/cronlog/read_felica.log 2>&1

そんなこんなでtmuxしか思いつかなかったので、とりあえず、tmuxで対応しました。

sudo apt install tmux -y
crontab
@reboot (. ~/.profile; tmux new-session -d 'sudo python3 ${HOME}/read_felica.py') >> ${HOME}/cronlog/read_felica.log 2>&1

これで再起動しても大丈夫!

これで私がいなくてもIdmを読み取ってくれるぜ!

もっといい方法がありそうだけど、とりあえず目の前のあるものでなんとかしてみるという対応で終わりました。

みなさまご参考ください。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0