2012年2月10日

[sts]やはりソースから仕様を考えると間違う

昨日、SmartTagが届いた。
飲んだくれていたので、触る力もなく眠る。。。

今日は帰ってきて、動かした。


以前作ったソフトを動かしてみた。

ポーリングは、当然動く。
ステータス取得も動いた。

あとは画像転送とレイアウト設定だけしか作っていないのだが、なんかダメだ。
レイアウト設定は、結構動くのだけど、なぜかたまにだめだ。
画像転送は、Write w/o Encにタイムアウトが発生しているようだ。
CommunicateThruEXのタイムアウトは十分にあるのだけどなあ。

 

データを作る部分もいくつか間違っていたけど、そう大きくは間違ってないみたい。
ACKは来るから、Write w/o Enc自体は間違ってない。
ということは、SmartTagに送信したデータが今ひとつということか。

シーケンス番号とかのルールは確認しているつもりだが、洗い直さねばな。

2012年2月8日

[rcs620s]RFConfiguration

いきなり方向転換して、RC-S620/Sで使えるコマンドの詳細説明をしていこう。

といっても、ドキュメントに書いてある以上のことは特にない。
ないのだが・・・私のネタもないのだ。

資料は、SONYさんの技術情報にある「RC-S620/Sコマンドリファレンスマニュアル<簡易版>」だ。

http://www.sony.co.jp/Products/felica/business/tech-support/index.html?j-short=tech-support#Port02

このドキュメントには4つのコマンドが説明してある。

  1. RFConfiguration
  2. Reset
  3. InListPassiveTarget
  4. CommunicateThruEX

初回は、RFConfigurationコマンドだ。

RFというのは、Radio Frequency、日本語だと「高周波」と書くことが多いが、まあだいたい無線のことを指している。
Configurationは設定だから、無線の設定コマンド、かな。

 

コマンドコードは0xD4、サブコマンドコードが0x32。
レスポンスコードは、0xD5、サブレスポンスコードが0x33。

これを見てわかるように、レスポンスコードはコマンドコードに1を足したもの、サブレスポンスコードはサブコマンドコードに1を足したものになっている。

「そもそも、コマンドコードとかサブコマンドコードってのは何だ?」と問われると、私もうまく答えられない。
コマンドコードは、ドキュメントに書いてある範囲では0xD4で、コマンドの違いはサブコマンドコードに現れている。


RFConfigurationコマンドは、パラメータCfgItemでさらに機能が分かれていて、それによってデータConfigurationDataも変わってくる。

たとえば、CfgItem=0x05ならば、ConfigurationData=3byteである。
以下は、ConfigurationDataが3つとも0x00のときの例である。

00 00 ff 06 fa d4 32 05 00 00 00 f5 00

そうすると、こういうレスポンスが返ってくる。

00 00 ff 02 fe d5 33 f8 00

 


RFConfigurationはR/Wに向けて行うコマンドだ。
使うときは、私は2つあると思っている。

  • RC-S620/S起動直後
  • 無線出力を止めたい場合

起動時に、CfgItem=0x05と0x81を設定。
無線を止めたいとき(強制的に終わらせるときなど)は、CfgItem=0x01。
無線を出すときに、わざわざ使ってはいないな。

 

困ったことに、「こういう値にしたらいいよ」という指標がわからない。
FeliCa OSの起動時間なんてどっから仕入れればいいんだ。
うーむ。

私は、FeliCa Deveopers' BlogのArduinoサンプルを元にした。
元にしたと言うよりも、当時はこれしか情報がなく、RFConfigurationというコマンド名も知らずにまねをしたというところだ。

ここに書きたいものだが、書いていいのかどうかがよくわからん。
よいなら、追記するかもしれんが、Arduinoのソースを見た方がよいだろう。
私はその値で困っていない(と思う)。


最後に「モード遷移」というのがある。

R/Wは「モード」というものを持っている。
まあ、状態遷移と思っておくれ。

電源ON直後は、モード0。
InListPassiveTargetすると、モード6。
Resetすると、モード0に戻る。
DEPとかFALPとかでモードは変わるんだけど、このドキュメントには書かれていないので割愛。


実装するときは、RC-S620/Sとの通信路が確保できたら(UART接続か)、まず接続確認も兼ねてこのコマンドを実行することになる。

そうして次の、InListPassiveTargetコマンドを実行するのだろう。

2012年2月7日

[nfc]DEPとLLCPとSNEP

ようやくここまで来た。
私が一番注目している、DEP関係だ。

あとこれ以外のネタとなると、RC-S620/Sの扱い方とかになってしまうのだが、これはどこまで書いていいのかよくわからない。
私としては一番書きやすいのだけど、書いていいのかどうかがそもそもわからないのだ。

当たり障りのないところから書く、という手もあるが、はてさて。


DEP

DEPは、Data Exchange Protocolの略。
データを交換するプロトコル、だ。

今までを思い出してほしいが、アクセスするのはカード相手だった。
なので、カードに書いたり、カードを読んだり。

しかしDEPは「交換」だ。
自分が送信したデータを相手が受けとり、相手が送信したデータを自分が受けとる。
カードにアクセスするだけと思っていたら、何と通信機器と化すのだ。
興奮する話ではないか!

 

・・・私だけか?


細かい話をすると、DEPには有名なところで2つの方式がある(私が知らないだけかもしれないが)。

1つは、NFC-DEP。
これは、ISO18092に由来するDEP方式である。

もう1つは、ISO-DEP。
これは、ISO14443に由来するDEP方式である。

残念なことに、私はISO14443のドキュメントを読んだことがないので、ISO-DEPなるものがどういう方式なのかは知らない。

しかし、NXPのPN533ドキュメントを読む限りでは、あまり深く知らなくても使えそうな気がする。
無線のプロトコルとしては、いろいろとコマンドがあったりパラメータが決まっていたりするのだが、有線のプロトコルではそこら辺をうまいことチップが吸収してくれている(と思う)。

私もPaSoRiとRC-S620/SでDEPしてみたが、案外あっさり動いた。
ただ、それがNFC-DEPで動いているのかISO-DEPで動いているのかと問われると、よくわからない。


LLCP

DEPは、単なるデータのやりとりをするしくみだ。
土管みたいなものである。

土管の両側に人がいて、相手に何かを渡したかったり受け取りたかったりしたら、いくつか確認したいことが出てくるだろう。

  • 今送ってもいい?
  • このくらいの大きさだけど、受け取れる?
  • それより、あんたは誰なの?

などなど。

こういったやりとりを行うために、DEPの上位層としてLLCPというものをNFC Forumでは置いている。
Logical Link Control Protocolの略である。

最近まで知らなかったのだが、インターネットみたいなやつにもLLCってのがあるみたい。
NFC専用の言葉ではなく、ネットワーク用語と思ってもいいのだろう。
IEEE802.2のLLC副層、というものらしい。

 

ともかく、LLCPはNFCに特化したNFC-DEP制御用のプロトコルである。
(そう、NFC ForumのLLCPは、NFC-DEPなのだ!)

これを使うことで、NFCのInitiatorとTargetでデータ交換をできるというものだ。


SNEP

しかし、それだけではまだだめだ。

もうちょっとアプリケーションよりの部分まで規定しないと、各自が勝手なルールを作ってしまい、プロトコルが乱立するのが目に見えている。

そう思ったのかどうかは知らないけれども、最近SNEPというプロトコルがNFC Forumで公開された。
Simple NDEF Exchange Protocolの略だ。
読んで文字の通り、シンプルにNDEFを交換するプロトコル、である。

これは、LLCPの上に載っかる。
LLCPの下には、DEPがいる。
そしてDEPが、相手のDEPと通信し、相手にもLLCPとSNEPがいる、という構造。

NFC ForumにSNEPのドキュメントがあるが、短い。
ページ数で20だし、本文は10ページちょっとだ。


おまけ

Android Beamってのがあるが、あれはSNEPを使っている。
SNEPで送信してみて、相手が受け取れなかったらNPPで送信している。

NPPってのは、NDEF Push Protocolの略。
手元にあるPDFには「Android NDEF Push Protocol」と書いてあるので、Android用なのだろう。

NPPもLLCPの上に載っかる。
おそらく、Android 2.3.4くらいにはこれだけが載っていて、最近の4.0にはSNEPを載せているんじゃなかろうか。
NPPは、おそらく静かに消えていくのだろう。


さて、ISO-DEPが気になるかもしれない。

これは、Android(すまん、Androidの情報しか持ってないのだ)では、APIとして存在する。
あれ、NFC-DEPは?と思うかもしれんが、こっちはAPIがない。

こういう言い方もできよう。
Androidではシステム側がNFC-DEPを使用し、ISO-DEPをユーザに公開している、と。


そんなわけで、私はNFC-DEPできる端末を探しているのであった。
Android端末もできるのだけど、携帯電話は壊れるまで買い替えたくないのだ。
(私は電話の類が、あまりお好きでない。。)

2012年2月6日

Type1 Tagの不思議

SONYの「NFCアイデアソン/ハッカソン」の6ページを見て、「ああ、Type1 TagはNFC-Aでよかったんだ」、と安心した。

NFC Forumの「Digital Protocol」でも、ちゃんとそう書いてある。
あるのだけど、無線パケットのCRCが、CRC_Bになっているのだ。
用語集には、CRC_BはNFC-BのCRCって書いてあるのに。。。

まあ、そんなことを不思議に思ったけど、NFC-Bはしばらくやることはなさそうだから、忘れてしまおう。

LibreOfficeのImpressでテンプレートを削除してひどい目に会う

福岡でNFCの勉強会があるので、何か作ろうと思った。
こういうときは、プレゼンテーションの資料だろう、と思い、LibreOfficeのImpressを使った。
PowerPointも持ってはいるのだけど、なるべくフリーで使えるものの方がいいよなあ、と思ったのだ。

あまり使ったことがないのだが、テンプレートで自分フォーマットを作っておくと便利だろう、とあれこれやっていた。
追加したり、削除したり。
そしたらですな、なんか「フィルタの選択」というダイアログが出てきて、OKしてもキャンセルしても何もできなくなってしまった。
タスクマネージャ(Windowsだから)から殺して、もう一度。
出る。。。
なんなんだーー!

どうも動きを見ていると、Impressの右側に出てくる「最近使用」にマスタースライドを表示させようとして、該当するものがないから妙な動きになっているようだった。
ならばキャッシュか何かに残っているものを削除すればいいんじゃないか、と思ったが、これがまたそういう項目が見当たらない。
Documents and Settingsの下にあるTempファイルも削除したし、レジストリも検索して該当しそうな名前(フィルタの選択ダイアログに名前が出てくるので)を削除。
それでもだめだ。。。

最終的に行き着いたのは、このページ。
http://www.oooninja.com/2009/01/recent-documents-clean-erase-delete.html
OpenOfficeだが、履歴を削除したいときのやり方が書いてあった。
LibreOfficeではパスが多少異なるが、こんなのがあった。
C:\Documents and Settings\<なまえ>\Application Data\LibreOffice\3\user\registrymodifications.xcu
これをテキストエディタで開き、「フィルタの選択」に出てきていた名前で検索。
あった。
これを、含んでいるitemタグまるまる削除。
何箇所かあったので、中身も見ずに、とにかく<item>~</item>までを削除した。
そしたら、大丈夫になった。
ふいぃ。。。

2012年2月4日

[sts]とりあえずSmartTagアプリを作ってみよう

アイオイさんのSmartTag。
実装から仕様書を起こしたので、それに対してSDK for NFC Starter Kitで実装を行ってみた。
妄想実装だ。
もうここまで来たので、解析結果も置いた。(やはり間違ってたので、削除)
https://github.com/hirokuma/NfcStarterKitWrap/tree/master/SmartTagRW

困ったことにまだ実機がないので、作ってみただけって感じがしている。
ユーザデータのアクセスには対応していない。
画像の転送と登録ができたらいいな、というところだ。
動作結果を教えていただけるとありがたいです。

こんな動きをするはず(してほしい)

起動して、PaSoRi上にSmartTagを置いて「Polling」ボタンを押すと、左下のステータス表示が変化する。
他のボタンも押せるようになる。

縦に1~12が並んだところをクリックすると、SmartTagが指定した番号のレイアウトに変化する。

「select」ボタンを押して、ほどほどの画像ファイルを選択すると左側に200x96サイズの画像が表示され、右側に2値化された画像が表示。
スライダーバーで閾値が変わるし画像も変わる。

「send」ボタンを押すと、右側の画像がSmartTagに転送され、表示される。

「register」ボタンを押すと、現在選択しているレイアウトに画像が登録される。

一番の難関は、やはり画像転送だ。
なんといっても、データができるかどうかのテストすらしていないってところがまずいな。
サンプルの動作は、こうだ。

画像を1/0反転してビットデータに変換。
なぜかというと、液晶画面の特性が「1→黒」「0→何もしないので白く見える」となるからだ。
電卓やポケコンを想像してもらうとよいだろう。
画面サイズは200x96だが、ビット変換して8分の1になり、2400byteになる。

転送する場合、ブロック単位になる。
1ブロックは16byte。
FeliCa PlugのWrite Without EncryptionやRead Without Encryptionの仕様から、1回のコマンドに載せることができるブロック数は12(=192byte)となっている。
16byteでよければ1ブロックだが、17byteになると2ブロックということになる。
Excelでいえば「=ceiling(バイト数, 16)/16」でブロック数が算出される。
Cとかなら、「(バイト数+15)/16」で出てくる。
2400byteとなると1回のWrite w/o Encでは送信できない。
その場合は、連続してWrite w/o Encを呼び出すことになる。

SmartTagのコマンドは、16byteの制御部+データ部という作りになっている。
つまり、データ部のサイズにかかわらず1ブロックは消費することになる。
また、データ部が1~16byteであれば、それはそれで1ブロックで済むことになる。
2400byteを転送したい場合は、こうなる。
(制御部+11ブロックのデータ部)×13+(制御部+7ブロックのデータ部)

SmartTagは、おそらく月曜日に入金確認されて、週末くらいには来るんじゃなかろうか。
ユーザデータのところも、そのあたりには追加しておきたいところだ。

[sts]スマートタグアプリの解析

ようやく、アイオイさんのスマートタグを注文できた。

届くのは来週か再来週だろう。
それまではやれることがない・・・と思ったら、アプリのダウンロードができるようだった。
仕様書は届くまでダウンロードできないので、ソースだけでも追っておこう。

 

とりあえず解析。
あってるかどうかは知らん。

仕様書の複写はいかんらしいが、まだ読んでないし、ソースも修正BSDライセンスだから解析したって問題はないと思うが。。。
こういう解析結果って、載せていいものなのかね?

ライセンスが絡むと、びくびくしていかんなぁ。


よくわからないのが、ユーザデータの扱い方。

1回で512byteまで書き込めるのだけど、アドレスはバイト単位での指定になっている。
サイズは、RFで飛ばしたWrite w/o Encに載せられる分なので、176byteまでになっている。

たぶんEEPROMへ書き込むのだろうから、1セクタ512byteくらいじゃなかろうか。
その512byteが、1回で512byteまでというところにからんでるのだと思う。
だとしたら、512byteアラインでアクセスするようにした方がいいんじゃないかなあ。

まあ、サンプルは必ずアドレス0x000からになっていたので、そこを考慮して作れってことかもしれんがね。
ソースから仕様を読み取るのは難しいですな。

[img]カラー画像のグレースケール変換

とあるソースファイルを見ていると、カラー画像をグレースケール変換する部分があった。
最近は知らないが、私が画像処理をしている頃はカラーをグレースケールに変換する式があった。
RGBのうち、人間の目に見える成分から・・・というやつだ。
緑成分が強めになるためか、そんな式になっている。
わかりやすい説明をしているページがあった。
http://www.r-nakai.com/archives/41



グレースケールに変換すると、2値変換もしたくなるだろう。
つまり、白か黒にするのだ。
グレースケール変換すると、画素値がある幅に収まる。
まあ、ここでは0~255にしたとしよう。0が真っ黒、255が真っ白。
単純にやると、127とか128を境目にして0か255かにしてしまう方法になるか。
閾値(threshold)を静的に決めるやりかただ。
他にもある。
私が知っているところでは、画像のヒストグラムを2つのグループにクラス分けして、グループ間の距離が等しいところに閾値を設定する方法だ。
静的に閾値を決めると画像の明るい/暗いに影響されてしまうが、クラスタリングする方法だとほどよくやってくれる可能性が高い。
なんて呼ぶのか忘れたけど、名前があったと思う。
あとは、パーセンタイル法とかいうのがあったように思う。
新聞みたいな画像に向いているって説明があったような記憶がうっすらとあるが、忘れた。



画像処理は見た目が派手で面白いのだが、今はライブラリとかが充実しているからコードを書いたりすることは少ないのだろうなぁ。
機会があれば勉強し直したいものだが、老後かな(先過ぎる・・・)。

(a+(n-1)) / nということ

私はときどき手厳しいので、ご容赦いただきたい。

今日見たソースファイルに、こんな記述があった。
int getBlocks(int bytes)

{

  int ret = bytes / BLOCK_SIZE;

  if((bytes % BLOCK_SIZE) > 0) {

    ret++;

  }

  return ret;

}
なにをしているのだろう?と思ったが、これはこういうことだ。
1ブロック16byteのしくみがある。
そこにデータ長だけ与えられて、何ブロック必要になるかを求めているのだ。
この世界、int型の割り算は切り捨てになるので、最初のretは切り捨てた割り算の結果が得られる。
その後、剰余が0以上であればきっちり割り切れたわけではないので、++しているというところだ。

書くなら、こんな感じだろうか。
int getBlocks(int bytes)

{

  return (bytes + (BLOCK_SIZE - 1)) / BLOCK_SIZE;

}

たとえば、BLOCK_SIZE=16としよう。
bytesが0なら、
(0 + 15) / 16 ===> 0
だし、1~16なら
(1 + 15) / 16 ===> 1
(16+ 15) / 16 ===> 1
なのだ。
突き詰めると、
(a + (n-1)) / n
ということになる。
なると思うのだ。

最近はよく知らないが、除算命令を載せたCPUは少ないと思う。
その代わりに、割り算が発生するとコンパイラが関数に置き換えるのだ。
関数で何をするかというと、引き算だ。
筆算と同じように、上の桁から引いていけば商と余りが得られるのだ。
しかし、それは味気ない。
もうちょっとなんだかねー、というところだ。
そういう場には、ちょうどいいんじゃなかろうかね。

2012年2月3日

[nfc]NFCカードへの読み書きとNDEF

さて、NFC-AなりBなりFなりの仕様を把握し、NFCカードへ書き込んだり、読み込んだりできるようになったとしよう。
その書き込みデータや読み込みデータは、どういう形式になっているだろうか?

答・・・なのかどうかわからんが、私は「書いたとおりに書けるし、読んだように読める」だと思っている。
つまり、書き込むデータを決めるのは書き込む人だし、読み込んだデータをどう扱うかも読み込んだ人次第ということだ。

 

しかし、それでは各人が好き勝手にやることだろう。
もちろん、それでよい場合もあるのだが、NFCカードを介してデータを交換する、すなわちお互いに意図したデータを書き、それを意図したとおりに読み出すためにはフォーマットが必要になる。

NFC Forumが決めたフォーマットが「NDEF」だ(えぬでふ、と私は呼んでいる)。
NFC Data Exchange Formatの略である。


NFCカードを使って不特定多数の人とやりとりをするならば、NDEFに従うのが無難であろう。
今のところ私は、これ以外にNFCに関するフォーマットを知らない。
人に知られたくない秘密サークル用のNFCカード(あるのか?)であれば、そのサークル内でフォーマットを決めて使えばよいだけだ。
カードをどう使うかは、自由である。

 

さて、そのNDEFだが、フォーマットはNFC Forumの技術文書ページからダウンロードできる。
今のところ、バージョンは1.0のようだ。

仕様書にありがちなことだが、具体例が少なくて理解がしづらい。
そういうときは、DoCoMoさんの技術ページのなかに、「iCタグリーダー」に関するものがある。
実は、iCタグリーダーはNDEF対応なのだ。
データフォーマット仕様書は、DoCoMoのiCタグリーダーで読むことができるデータという具体的な例なので、わかりやすい。
これを足がかりに理解していくといいのではなかろうか。


NDEFは単なるデータフォーマットなので、これをNFCカードにどうやって書き込むか、というのは別の話になる。

もちろん、各NFCカードに沿った書き込み方法があるのだが、それとは別に、カード内への配置やヘッダなどがカード依存になっている。
その辺りの情報もNFC Forumにあるのだが、これはNDEFのドキュメントではなくTagのドキュメントになる。
例えばNFC-Fの場合、「NFCForum-TS-Type-3-Tag_1.1」というドキュメントに書かれているのだ。

 

NFC Forumでは、

  • Technologyとして、NFC-A, B, F
  • Platformとして、Type1, 2, 3, 4A, 4B Tag
  • Protocolとして、ISO-DEPとNFC-DEP

という分類?になっている。
用語を覚える必要はないだろうけど、なんか分け方があるんだ、くらいは知っておいてもいいのではないかな。