信頼はずっと、挑戦はもっと。

お問い合わせ
TEL:03-3496-3888

BLOG コアテックの社員ブログ (毎週月曜~金曜更新中)

LIST OF ARTICLES

記事一覧

  • 画像:ブログサムネイル

    テクログ

    【nfcpyでLINE通知】ちょうど目の前にICカードリーダーとNFCチップが転がっていたので

    こんにちはじゅんすです。私は実家暮らしで兄弟がいるのですが、どうも兄が家に帰ってきても手を洗っていないっぽいのです。時期が時期なのでちゃんと手洗いうがいはしてほしいのですが、、。こりゃどうしたもんか、、、と思ったその時、ちょうど目の前にICカードリーダーとNFCチップが転がっていたので「手を洗ったらICカードリーダーにピッてしてLINEのトークルームに通知を送るシステム」を作っちゃいました。Pythonだと参考資料が多かったのでPythonで開発しました。触ったことないですけどね、、資料が多かったもんで、。なのでコードに至らない部分は多くあると思いますがご了承ください。以下にざっくりと処理の流れを記載しておきます。ICカードリーダーでNFCチップのIDm(固有ID)を取得。取得したIDmでDBからユーザー名を取得。「〇〇〇(ユーザー名)は手を洗ったよ」という内容でLINE通知。開発環境■各バージョンWindows 10 Home 64-bitPython 3.8.2libusb 1.0.23Zadig 2.5nfcpy 1.0.3MySQL 8.0.19■DBクライアントMySQL Workbench■USBドライバZadig■ICカードリーダー非接触型ICカードリーダー / ライター RC-S380(SONY製)■NFCチップNTAG213(NXP製)下準備ただICカードリーダー差してコードを書いただけじゃ動かないので以下の準備をしておきます。■libusbのインストール公式サイト(https://libusb.info/)からダウンロードできます(私の時はlibusb-1.0.23.7zでした)。ダウンロードしたファイルを解凍したら以下の操作をします。64ビット版Windowsの場合MS64\dll\libusb-1.0.dllをC:\Windows\System32にコピーMS32\dll\libusb-1.0.dllをC:\Windows\SysWOW64にコピー32ビット版Windowsの場合MS32\dll\libusb-1.0.dllをC:\Windows\System32にコピー■ドライバの適用公式サイト(https://zadig.akeo.ie/)からダウンロードできます(私の時はZadig 2.5でした)。ダウンロードしたらZadigアプリケーションを実行する前にPCにRC-S380を差します。ドライバが自動適用されたらZadigアプリケーションを実行します。表示されたウィンドウの上にあるリストボックスからNFC Port/PaSoRi 100 USBを選択します(ない場合はOptions ⇒ List All Devicesで表示されます)。Driverの項目はWinUSBにします。Replace Driverをクリックしたら完了です。■LINE Notify アクセストークンの発行公式サイト(https://notify-bot.line.me/ja/)にログインして、右上のアカウントからマイページに行きます。マイページの下部にトークンを発行するがあるのでトークン名の入力と通知したいトークルームを選択して発行します。※発行されたトークンは1度しか表示されないので注意。■DBの設定まずhand_washingという名前でDBを作成します。CREATE DATABASE hand_washing  CHARACTER SET utf8  COLLATE utf8_general_ci; 続いてNFCチップのデータを入れるnfc_tipsと、それを使うユーザーのデータを入れるusersテーブルを作成します。CREATE TABLE `hand_washing`.`nfc_tips` (  `id` INT NOT NULL AUTO_INCREMENT,  `idm` VARCHAR(50) NOT NULL COMMENT 'NFCチップの固有ID',  `user_id` INT NOT NULL COMMENT 'NFCチップを使用するユーザーのID',  `created_at` DATETIME NOT NULL,  `updated_at` DATETIME NOT NULL,  PRIMARY KEY (`id`)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COMMENT = 'NFCチップデータ用のテーブル'; CREATE TABLE `hand_washing`.`users` (  `id` INT NOT NULL AUTO_INCREMENT,  `name` VARCHAR(10) NOT NULL COMMENT 'ユーザー名',  `created_at` DATETIME NOT NULL,  `updated_at` DATETIME NOT NULL,  PRIMARY KEY (`id`)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COMMENT = 'NFCチップを使用するユーザー用テーブル'; テーブル作成も無事終わったらそれぞれのテーブルにデータを登録しておきます。nfc_tipsのidmには後述するnfc_reader.pyで取得したidmを登録します(ちょっと手間ですが、、登録機能を先に作っといた方がよかったなぁ)。動作確認■パッケージのインストールnfcpyとrequestsをpipでインストールします。pip install nfcpy pip install requests ■ファイルの作成以下3つのファイルを全て同階層に作成します。DBに接続してNFCチップのIDmからユーザー名を取得する処理を書いたdb_crud.py。import MySQLdb # データベース接続 connection = MySQLdb.connect(  host = 'ホスト名もしくはIP',  user = 'ユーザー名',  passwd = 'パスワード',  db = 'hand_washing',  charset='utf8' ) # カーソル生成 cursor = connection.cursor() # NFCのIDmからユーザー名を取得 def getUserNameByIdm(idm):  cursor.execute("SELECT users.name FROM nfc_tips JOIN users ON nfc_tips.user_id = users.id WHERE idm = '%s'" % idm.decode())  return cursor.fetchone()[0] LINEに通知を送る処理を書いたline_notify.py。import requests # LINE Notifyの情報 line_notify_token = 'アクセストークン' line_notify_api = 'https://notify-api.line.me/api/notify' # LINEでメッセージを送る def sendMessage(person):  message = str(person) + 'は手を洗ったよ'  payload = {'message': message}  headers = {'Authorization': 'Bearer ' + line_notify_token}  # 送信  requests.post(line_notify_api, data = payload, headers = headers) NFCチップのデータを読み込む処理を書いたnfc_reader.py。import nfc import binascii import time # 外部ファイル import db_crud import line_notify # タッチ待ち受けの1サイクル秒 TIME_CYCLE = 2.0 # タッチ待ち受けの反応インターバル秒 TIME_INTERVAL = 2.0 # タッチされてから次の待ち受けを開始するまで無効化する秒 TIME_WAIT = 5 # NFC接続リクエストのための準備 # NXP製のNFCチップのため106A(通信規格TypeA)で設定(Suicaで試したい人は212F) remoteTarget = nfc.clf.RemoteTarget("106A") print("カードをかざしてください") while True:  # USBに接続されたNFCリーダに接続してインスタンス化  with nfc.ContactlessFrontend("usb") as clf:   # タッチ待ち受け開始   # clf.sense( [リモートターゲット], [検索回数], [検索の間隔] )   target = clf.sense(remoteTarget, iterations = int(TIME_CYCLE//TIME_INTERVAL) + 1, interval = TIME_INTERVAL)   while target:    tag = nfc.tag.activate(clf, target)    if tag != None:     #固有のIDmを取り出す     idm = binascii.hexlify(tag.identifier).upper()     # ユーザー名取得     person = db_crud.getUserNameByIdm(idm)     print("読み込み成功\n")     print("タグ情報:" + str(tag))     print("IDm:" + idm.decode())     print("ユーザー名:" + person + "\n")     print("カードをかざしてください")     # LINEに通知する     line_notify.sendMessage(person)    else:     print("読み込みに失敗しました")    time.sleep(TIME_WAIT)    break 各ファイルが用意出来たらターミナルでnfc_reader.pyのある階層までいきます。以下のコマンドでnfc_reader.pyの処理を実行します。python nfc_reader.py すると以下のように表示されるのでNFCチップをICカードリーダーに2秒ほどかざします。python nfc_reader.py カードをかざしてください NFCチップのデータとユーザー名が表示されると同時にLINEに通知が送られます。python nfc_reader.py カードをかざしてください タグ情報:〇〇〇〇〇〇 IDm:〇〇〇〇〇〇 ユーザー名:〇〇〇〇〇〇 カードをかざしてください とまぁ、こんな感じで通知システムを作ってみたってお話です。ただ、これだけじゃ手を洗ったふりしてICカードリーダーにピッてする不正行為ができてしまうので、手の汚れをブラックライトで可視化してカメラで読み込む機能等と組み合わせるなどしたほうが良いかなとか思ったり思わなかったりって感じですね、、(Raspberry Piが欲しい)。皆さんも目の前に転がっていたら色々作ってみてください!ではでは!
  • 画像:ブログサムネイル

    テクログ

    ブラウザテストフレームワークの5月でした

    ブラウザテストフレームワーク、使ってますか!単体テストもいいけど、やっぱりユーザが使って実際ちゃんと動作してるの?ってのが気になりますよね。最近はjsでいろいろやることも多いし、関連するところが動かなくなったり。(jsの単体テストやれって話もありますが)で、有償無償問わず、いろいろと見てみました。結構網羅したり、試したりするだけでもそれなりにかかったので、なんとなく一覧的に。・いわゆるツールでの自動テスト系teststudioRanorexAutifyTestCompleteUnified Functional TestingROBOWAREuipathkatalon studioimacros・いわゆるブラウザテストフレームワーク(E2Eテスト用)Seleniumを直使用CodeceptionCodeceptJSNightwatch.jsWebdriverIOScrapywatirAppiumSelenideGebおよびSpockCapybaraSplinterCasperJSSST (selenium-simple-test)重要視した点としては、パッとつくれて、パッと動かせる。なんだこれ、どうやるんだ、みたいなのはなし。……ということで、有償の自動テストツール系について、可能なものは体験版を入れてちょっと動かしたりしました。「ちょっと」なのはあえてちょっとだけやって、それでもできないのならば簡単じゃない!ということでした。もちろんデモや動画をみてると、「なんかすごいことやってるし、なんでもできそう…」となりますし、実際理解すればなんでもできるのかもしれません。でも少しだけいじっただけでは全く思ったとおりに動かないんですよね。というわけでツール系はなくなり、ブラウザテストフレームワークの検証となりました。テストコード書かないといけない、というのは確かに手軽とはいえないですが、サンプルがあればあとはその改良をつづけていけばなんとかなる、という思惑です。現状のサポート具合、活発さ、書きやすさ…などからCodeceptionCodeceptJSが残り、mac,PCでのブラウザテストはクリア。実機もやりたい、ということでAppium連携をしたり…ということをやっていましたよ。実機動作は結構コツが必要だったり、iPhoneだとやりたいことがどうしてもできない部分があったり…となりましたが、それ以外は結構思ったとおりのテストができましたので、毎回確認しないといけない動作がある、とか、そういった場合には役に立つのではないでしょうか。一個小ネタでいえば、テストをAWS Lambdaに連携させて、外への影響を確認したりする、ということもやってみました。純粋なE2Eテストの範疇からは外れるかとは思いますが、やはりどうしても確認したい内容もありますので、そういうものもいかがでしょう。ちなみに最終的に残ったのはCodeceptJS+Appiumでした!(以下イメージ画像
  • テクログ

    つい最近の現象

    朝からグループ会社から連絡が入り会社についてから折り返すとpcのデータが消えていると。最初はプロファイルのエラーかと思い復元の手順を教えたが、復元データがありませんと出る。バックアップの設定を確認してみると確かに設定はしてあるが、データが無くなっているまたは消されている。利用者に詳しく聞いてみると昨日帰る時にpcの電源を入れたままで、唯一開いていたフォルダのみ残っていた状況。後のフォルダ、マイドキュメント、メールデータ(一部は残っていた)、ダウンロードなどは全て無くなっていた。そして、program filesの中に実行ファイルはあるが、スタートメニューのショートカットでは起動ができない。ユーザープロファイルのフォルダを開けてみるもエラーフォルダもなく正常のユーザーフォルダしか見当たらない。windowsのログを確認してみるとなにやら怪しい形跡がある。リモートソフトの利用とエラー履歴がありそれは真夜中。確実にそれが原因かはわからないがウイルスの可能性、ハッキングの可能性を疑った。lanを抜く指示を出しリカバリの処理を行う。原因自体はPCが遠隔地にあるのと、すぐに利用したいとの事でリカバリ作業に入ってしますので不明のままになってしまった。引き続き情報を集めて未然に防ぐ対策を考えているが、今の認証式の社内共有などにバックアップを作るくらいしか思い浮かばない。