検索
リンク
タグ
ASP.NET
.NET
ASP.NET MVC
F#
Visual Studio
Azure
ASP.NET Core
ライトニングトーク
Plone
AJAX
Selenium
C#
jQuery
ADO.NET Entity Framework
SQL Server
JavaScript
LINQ
WebMatrix
EFCore
Fizz-Buzz
カテゴリ
最新の記事
最新のコメント
記事ランキング
最新のトラックバック
以前の記事
2022年 12月 2022年 11月 2022年 10月 2022年 09月 2022年 08月 2022年 07月 2022年 06月 2022年 05月 2022年 04月 2022年 03月 2022年 02月 2022年 01月 2021年 12月 2021年 11月 2021年 10月 2021年 09月 2021年 08月 2021年 07月 2021年 06月 2021年 05月 2021年 04月 2021年 03月 2021年 02月 2021年 01月 2020年 12月 2020年 11月 2020年 10月 2020年 09月 2020年 08月 2020年 07月 2020年 06月 2020年 05月 2020年 04月 2020年 03月 2020年 02月 2020年 01月 2019年 12月 2019年 11月 2019年 10月 2019年 09月 2019年 08月 2019年 07月 2019年 06月 2019年 05月 2019年 04月 2019年 03月 2019年 02月 2019年 01月 2018年 12月 2018年 11月 2018年 10月 2018年 09月 2018年 08月 2018年 07月 2018年 06月 2018年 05月 2018年 04月 2018年 03月 2018年 02月 2018年 01月 2017年 12月 2017年 11月 2017年 10月 2017年 09月 2017年 08月 2017年 07月 2017年 06月 2017年 05月 2017年 04月 2017年 02月 2017年 01月 2016年 12月 2016年 11月 2016年 10月 2016年 09月 2016年 08月 2016年 07月 2016年 06月 2016年 05月 2016年 04月 2016年 03月 2016年 02月 2016年 01月 2015年 12月 2015年 11月 2015年 10月 2015年 09月 2015年 08月 2015年 07月 2015年 05月 2015年 04月 2015年 03月 2015年 02月 2015年 01月 2014年 12月 2014年 11月 2014年 10月 2014年 09月 2014年 08月 2014年 06月 2014年 04月 2014年 03月 2014年 02月 2014年 01月 2013年 12月 2013年 10月 2013年 09月 2013年 08月 2013年 07月 2013年 06月 2013年 05月 2013年 04月 2013年 03月 2013年 02月 2013年 01月 2012年 12月 2012年 11月 2012年 10月 2012年 09月 2012年 08月 2012年 07月 2012年 06月 2012年 05月 2012年 04月 2012年 03月 2012年 02月 2012年 01月 2011年 12月 2011年 11月 2011年 10月 2011年 09月 2011年 08月 2011年 07月 2011年 06月 2011年 05月 2011年 04月 2011年 03月 2011年 02月 2011年 01月 2010年 12月 2010年 11月 2010年 10月 2010年 09月 2010年 08月 2010年 07月 2010年 06月 2010年 05月 2010年 04月 2010年 03月 2010年 02月 2010年 01月 2009年 12月 2009年 10月 2009年 09月 2009年 07月 2009年 06月 2009年 05月 2009年 04月 2009年 03月 2009年 02月 2009年 01月 2008年 12月 2008年 11月 2008年 10月 2008年 09月 2008年 08月 2008年 07月 2008年 06月 2008年 05月 2008年 04月 2008年 03月 2008年 02月 2008年 01月 2007年 12月 2007年 11月 2007年 04月 2007年 03月 2007年 02月 2007年 01月 2006年 11月 2006年 10月 2006年 09月 2006年 08月 2006年 07月 ファン
ブログジャンル
画像一覧
|
2016年 04月 07日
nfcpy と tagtool.py について復習前回の投稿で触れた、Python で実装された NFC リーダーにアクセスするオープンソースプロダクト「nfcpy」。この nfcpy に実装例として収録されている tagtool.py を使えば、例えば Raspberry Pi 上で、これに接続した NFC タグリーダー SONY RC-S380 を介した、NFC タグの検知とそのタグ ID のコンソール上への表示は容易に実行できる。 前回投稿のとおり環境構築が済んでいれば、tagtool.py が収録されているフォルダまでカレントフォルダを移動した上で、 $ ./tagtool.py showを実行すると(※ tagtool.py に実行可能属性が付与されている前提) ** waiting for a tag **と表示されて NFC タグを検出するまでの待機状態になり、この状態で NFC タグリーダーに NFC タグをかざすと、NFC タグが検出されて Type3Tag IDm=0123456789abcdef PMm=000...のような1行が表示されて tagtool.py が終了し、コマンド入力待ちに戻る。 さらに tagtool.py の show コマンド実行にあたり「-l」オプションを付けると tagtool.py が終了することなく NFC タグ検知 ⇒ 検知したタグのID情報を表示 ⇒ タグ検知待ちに戻る、 という "無限ループ" モードでの動作となる。 これに加えて「-q」オプションを付けると動作上の追加の情報表示が抑制され、タグ検知に特化した表示となる。 nfcpy を利用して NFC タグの検出にからめたプログラムを作るにはさて、このように nfcpy とそれに収録されている tagtool.py を使えば、「NFC タグを検出したら、そのタグの ID に基づいて何かアクションを起こす」 というプログラムを作ることができる。 インフィニットループ社がリリースしている「シュキーン」でやってるような、「かざしてシュキーン」の仕組みのところを(あちらは Android を活用されているが)、Raspberry Pi を使っても真似できそうだ。 そのような、Raspberry Pi 上で動作するプログラム開発にあたって、nfcpy は Python で実装されていることもあり、また、2.x 系列とはいえ Raspberry Pi には Python がはじめからインストールされていることも踏まえると (※ Raspbian Jessie LITE 版には pip 入ってなかったけど) 、Python で実装するのが本来は手ごろだと思う。 ところが自分は、Python については疎い。 とくに、サンプルコードというレベルを超えて、
どうしよう? C# で書きます。そこで、勝手知ったる C# で実装することにした。本ブログで以前にも取り上げているとおり、mono をインストールしておくことで、C# で書いた .exe ファイルがそのまま Raspberry Pi でも動く。 実際、自分は Visual Studio 上で開発をしているのだが、その C# プロジェクトにて、ビルド成功時のカスタムバッチに scp コマンド呼び出しを組むことで、ビルドした .exe や依存関係の .dll などを aspberry Pi 実機に自動的に送り込むようにしてたりする。 つまり、Windows PC 上の Visual Studio にて、カタカタと C# コードを書いて、Ctrl + Shift + B したら、ビルドされた .exe はじめ一式が、もう Raspberry Pi 実機上にコピー済んでて、そのまま実行できる状態である。 C# コードから tagtool.py を呼び出して標準出力を読み取るちょっと話が脱線したが、つまり、C# で書いたコンソールアプリ中から、nfcpy の tagtool.py を -l オプション付きの show コマンド指定で呼び出し、その標準出力を読み取ることで、
C# コードにて、外部プロセスの呼び出しとその標準出力の読み取りは典型的なタスクで、ネットで検索すれば、実装例が多々見つかる。 今回の場合は、具体的なコードとしては下記のとおり。 var process = Process.Start(new ProcessStartInfo ところが動かない!さてこれで OK と思い、実際にためしてみると...nfcpy やデバイス類は正しく機能しているはずなのに、まったく OutputDataReceived イベントが発生しない事態に遭遇。 難しいことしてるわけでもないのに何故!? やろうとしていることがシンプル過ぎて、そんなバグがどうして起こるのか、どうにも思い浮かばない。 また、「-l」オプション抜きで一回検出するのみを試してみると、なんと、ちゃんと OutputDataReceived イベントが発生して、タグの ID 情報が取得できた。 「-l」オプションの有無だけで、標準出力の読み取りが成功・失敗するとはますます訳がわからない... ...と悩み続けて、ようやく閃いた。 バッファだ。 きっと、tagtool.py の標準出力への書き込みがバッファに溜まってて、フラッシュされるまで C# コード側に流れてこないのだろう。 「-l」オプション抜きで一回実行だと、そのまま tagtool.py は終了してバッファフラッシュされるのだろうから、先の動作も合点がいく。 気が付いてみたら、なんとうことはない原因だ。 すぐに気づかなかったのが悔やまれる。 tagtool.py にモンキーパッチということで早速 tagtool.py をテキストエディタで開き、show コマンドを実装している箇所を探す。どうやら「def show_tag(self, tag)」で定義されているメソッドがそれらしい。 (※ということを漠然と嗅ぎ当てられる程度には、自分、Python のソースも読みます) そこで show_tag メソッドを定義しているコードブロックの最後に、標準出力のバッファをフラッシュする「sys.stdout.flush()」を追記。 (※Python で標準出力のフラッシュをどう実装するのかは、ネットで検索して調べた。) こうして書き換えた tagtool.py を保存して、改めて先の C# プログラムを実行してみると、今度はうまくいった! NFC タグリーダーにタグをかざすたびに、C# プログラムが、nfcpy によるタグ検出の結果を読み取って反応してくれる。 まとめと補足思わぬところでうっかり躓いてしまったが、それでも十分手軽に、勝手知ったる C# でお気楽に、Raspberry Pi 上で NFC タグを検知してアクションするプログラムを作り上げることができたのであった。なお、Raspberry Pi 上の C# 製プログラムにて NFC タグリーダーを扱うには、今回投稿のような nfcpy と標準入出力で連携する以外にも、nfcpy は使わずに libnfc.so への P/Invoke で実装することもできるらしい。 自分は試してないが、以下にその参照先を記しておく。 SharpNFC https://github.com/episage/SharpNFC NFCTest (上記 SharpNFC のコードを転用した作例) https://github.com/LuckyOpenU/NFCTest ※でも、念のため付け加えておきますと、C# 製 .exe を Raspberry Pi の mono の上で実行すると、起動するまでは秒単位で時間がかかったりします (プログラムの規模や利用するライブラリなどに左右される。HelloWorld ごときではそんなにかからない)
by developer-adjust
| 2016-04-07 23:04
| その他IT系
|
Comments(0)
|
ファン申請 |
||