2014年4月2日

ブログ移転いたしました

この度、新しいブログに移転することとなりました。

新しいブログでは、NFCだけでなく、
他の技術トレンドもお届けしてまいります。

新URL
http://bril-tech.blogspot.jp/

新RSS
http://bril-tech.blogspot.com/feeds/posts/default

お手数をかけますが、再登録をお願いいたします。

どうぞよろしくお願い致します。

2012年10月11日

SDK for NFC Wrapper Library - Polling


前回SDK for NFC Wrapper Libraryのプロトタイプを作りました。
ここから各NFCデバイスに向けての機能を肉付けしていきたいと思います。
現段階ではコマンドを発行することができないので、コマンド発行まで実装したいと思います。

デバイス使用権の獲得

コマンド発行するには、デバイス使用権の獲得をしなければなりません
こちらの記事を参照
デバイス使用権獲得にはtarget_numberと呼ばれる値が必要になります。
target_numberは各NFCデバイスごとの構造体にパースした後に取得することができるので、イベント発行前にデバイス使用権獲得のコードを仕込みます。


コマンドの発行

FeliCaのコマンドについてはこちらから参照できます
Sony Japan | FeliCa | 法人のお客様 | 技術情報
http://www.sony.co.jp/Products/felica/business/tech-support/index.html?j-short=tech-support
「FeliCaカードユーザーズマニュアル」を読むと一番簡単なコマンド「Polling」の仕様が書かれているので、こちらを実装したいと思います。
今回新しく以下のクラスを作りました。

ICommand.cs
FeliCaコマンドのインターフェイスです。

PollingCommand.cs
Pollingを発行するためのコマンド
システムコードやリクエストコードを指定することができます。

CommandResponse.cs
コマンドのレスポンスです。
レスポンス長と実際のレスポンスを分解することが役割です。

PollingCommandResponse.cs
Pollingコマンドのレスポンスです。
Pollingを発行して帰ってきたレスポンスを分解することが役割です。

FeliCaException.cs
コマンド発行中になんかしらのエラーが発生した際に投げられる例外です。

FeliCaLibWrapper.cs
FeliCaコマンドを実行するクラスです。

以上のクラスを使い、Pollingするまでのサンプルコードは以下です。


試行錯誤しています

まだ設計がふにゃふにゃとしているので、大きく仕様が変わる恐れがあります。
たとえば
FeliCaLibWrapperと書いているが、実際にはTypeAへのコマンドも投げられるので、NFCCommandExecutorとかFeliCaではなくてNFCという名前にした方がいいんじゃないか
とか
Pollingのタイムスロット数変えられないの?
とか
戻り値booleanじゃなくて、もっとExceptionを活用すべき
などなど…
自分自身もトライアンドエラーを繰り返しているので、いろいろもやもやと考えているところです。

FeliCaについてやりたいこと
・サンプルに付属していたc#ラッパークラスを別に新しく定義する
 ・FeliCaLibWrapperとfelica_nfc_dll_wrapper_basicと2つあるので、統合したい。
・ライブラリを叩いたときの戻り値で例外が発生したことを表しているが、Exceptionを使うことで実装がすっきりしそう。

ソースコード


https://github.com/bs-nfc/SDK-for-NFC-Wrapper-Library

カスタマー開発部 山下智樹

2012年10月5日

SDK for NFC Wrapper Library


呼び出しが大変

新しいプロジェクト立ち上げの度に、毎回API呼び出し手順にしたがって呼び出すのも、なかなかめんどうです。
またこのSDKでは各NFCデバイス(NFC-A,NFC-B,NFC-F)の検出までは共通化できますが、そこからのコマンド発行については個別に実装していかなければなりません。
ライブラリ化してより簡単にNFCデバイスにアクセスできるようにします。

要件


  • NFCデバイスを検知するとイベントが発生する。
  • どのNFCデバイスを検出するか選択できるようにする。
  • 各NFCデバイスで異なるイベントを発生させる。
  • SDK for NFCのログ出力フラグを持つ。
  • AndroidのNFC APIのようにNFCデバイスを意識しなくてもNDEFを書き込めるようにする
  • ポーリング開始と停止を任意のタイミングで行える。


基本設計


  • Windowメッセージで飛んでくるので、Formを拡張する形で進める。
  • SDK for NFC Wrapper Library(仮)を使う場合は、そのFormを継承して使う。
  • 検出するNFCデバイスの指定はポーリングの開始時に指定する。
    • できるだけ現在の方法より分かりやすい方法に…。
  • ログ出力フラグについてはconfigファイルに定義する。


ドロップ

要件を大きく広げてしまったが、”NFCデバイスを意識しなくてもNDEFを書き込めるようにする”という項目は各デバイスのコマンドを実装しなければならないため、大きく工数がとられてしまいます。
とりあえず今回はその部分以外を実装したいと思います。

ソースコード

bs-nfc/SDK-for-NFC-Wrapper-Library · GitHub
https://github.com/bs-nfc/SDK-for-NFC-Wrapper-Library

解説

基本的には先日書いたSDK for NFCライブラリの使い方と同じです。
Formのイベントとして発行するために、イベント引数と定義したり、イベントを発行する処理を書いたりしています。

使い方


  1. ライブラリ参照設定に追加する
  2. Formを継承しているところを、NFCForm継承に変更する
  3. フォームのデザインモード画面を開き、プロパティからイベントを追加する
    1. StartPollingを書く # ここで検出するNFCデバイスを引数に指定する
    2. NFC検出イベントはDiscoverNFC~という名前です。
  4. イベントには各構造体に入ったNFCデバイスの情報が引数で渡されますので、それぞれ処理をします。


サンプル

SDK for NFC Wrapper Libraryを使用したSampleProjectを含めました。
以前のコードよりだいぶすっきりしました。


カスタマー開発部 山下智樹

2012年10月4日

NFC-IDを表示するWindowsアプリケーションを作る

NFC対応アプリケーションを作る

Windows7にPaSoRi(RC-S330)を接続してNFCタグをかざすと、そのIDを表示するアプリケーションを作成します。
API呼び出し順序については前回のエントリを参照してください

ディレクトリ構成


  • ./Program.cs
    • アプリケーションのスタートアップポイントです。
  • ./felica_nfc_dll_wrapper_basic.cs
    • SDK for NFCをC#で使うためのラッパーです。
  • ./Forms/NFCHandleForm*.cs
    • 主に処理が書かれているフォームです。

解説はNFCHandleForm.csを中心に説明していきます。

プログラム

スタートアップ

./Program.cs
VisualStudioにて自動生成されたそのままです。
起動すると、NFCHandleFormを表示します。

ポーリングまでの処理

SDK for NFCのAPI呼び出し順序にしたがって、初期化、オープンをします。
NFCデバイス補足時にはWindowメッセージで検出されるので、Windowメッセージの登録も行います。
ポーリングの開始には、反応するNFCデバイスの種類を指定します。
今回はType Fのみ反応することにしたいので、Type Fのフラグを立てた値を引数に渡します。
また、各地点でエラーが発生した場合にエラーの理由がわかるように、エラー番号を出力するメソッドを作成しています。

NFCデバイス補足

デバイスを補足するとWindowメッセージが飛んできます。
渡されたMessage引数から、FeliCaの構造体に展開します。
FeliCaのNFC-IDに当たるものはIDmになります。
IDmはNFCID2という項目に入っているので、それを文字列に変換した後にメッセージにて表示します。

実行イメージ


ソースコード
https://github.com/bs-nfc/NFCHandleWindow

カスタマー開発部 山下智樹

2012年10月3日

SDK for NFCのライブラリのAPIを見る

SDK for NFCのライブラリのAPIを見る

SDK for NFCを使ったプログラムを作成するには、”felica_nfc_library.dll“というライブラリを使用します。
ライブラリのAPIについて簡単にまとめます。
この内容はSDKに含まれるマニュアルに書かれていますので、詳しくはそちらを御覧ください。

APIアクセスの順序

簡単に図にまとめました。











































  • felicalib_nfc_initialize
  • felicalib_nfc_uninitialize

ライブラリの初期化と終了化をします。


  • felicalib_nfc_open
  • felicalib_nfc_close

R/Wのオープンとクローズをします。


  • felicalib_nfc_start_poll_mode
  • felicalib_nfc_stop_poll_mode

ポーリング(デバイス補足処理)の開始と終了をします。


  • felicalib_nfc_start_dev_access
  • felicalib_nfc_stop_dev_access

デバイス使用権の獲得と開放をします。


  • felicalib_nfc_poll_and_start_dev_access

ポーリングの開始と同時にデバイス使用権の獲得をします。


  • felicalib_nfc_thru

デバイスコマンドを発行します。


図に書かれていないAPI

  • felicalib_nfc_select_device
  • felicalib_nfc_deselect_device

デバイスのSELECTとDESELECTをします。
ドキュメントを読んでもこれ以上の文言がなく、使いどころが分かりません…。
start_dev_accessの説明を読むと”デバイスの使用権の獲得に成功した場合、デバイスはSELECT状態になります。」とあるので、このコマンドは使用しなくてもよいという認識です。


  • felicalib_nfc_set_timeout
  • felicalib_nfc_get_timeout

タイムアウトの設定と取得をします。


  • felicalib_nfc_set_poll_callback_parameters

デバイス補足情報の通知情報を設定します。
デバイスを補足した際の情報はWindowメッセージを経由で取得します。


  • felicalib_nfc_get_last_error

最後に発生したエラーを取得します。


  • felicalib_nfc_start_logging
  • felicalib_nfc_stop_logging

ログ出力の有効化と無効化をします。

2012-10-04 09:50 追記























FacebookにてFeliCaさんからselect_deviceに関して教えていただきました。ありがとうございます。
TypeA,TypeBデバイスに対して使うAPIだそうです。
詳細に関しては検証の後に更新したいと思います。

カスタマー開発部 山下智樹

WindowsでのNFC開発環境を整える

WindowsでのNFC開発環境を整える

WindowsでNFC開発するための環境を整えます。

PC

Windows 7 SP1 .NET Framework 4.0
開発にはC#を使用するため、.NET Frameworkが必要です。

NFC-R/W

PaSoRi RC-S330/S
PaSoRi RC-S370
PaSoRi RC-S380
店頭では確定申告のコーナーにおいてあるかも…。
ネット通販で買うのがお勧めです。

ドライバ

Sony Japan | FeliCa | 個人のお客様 | ダウンロード | NFCポートソフトウェア
http://www.sony.co.jp/Products/felica/consumer/download/felicaportsoftware.html
SDKに同梱されています。

SDK

Sony Japan | FeliCa | 法人のお客様 | 製品情報 | ICS-D010・D004・D002・D003
http://www.sony.co.jp/Products/felica/business/products/ICS-D004_002_003.html
NFCのSDKは「SDK for NFC Starter Kit」と「SDK for NFC Lite」です。
個人利用や評価の場合のみ「SDK for NFC Starter Kit」が使用できます。
商用利用の場合、「SDK for NFC Lite」を購入しましょう。

IDE

Microsoft Visual Studio 2010
http://www.microsoft.com/japan/visualstudio/products/2010-editions
C#で開発します。

カスタマー開発部 山下智樹

2012年9月25日

AndroidでRTD URIを書く

AndroidでRTD URIを書く

RTD URIを書く

AndroidでRTD URIを書き込みます
NFCに反応する部分までは以前書きましたので、そちらをご参照ください。
> ブリリアントサービス NFC技術ブログ: AndroidでRTD Textを書く 

NdefMessageの作成

書き込み対象のRTD URI RecordをもったNdefMessageを作成します。
NdefRecordの作成には
  • TNF
  • TYPE
  • ID
  • PAYLOAD
が必要になります。(他に全てのバイナリから作成することも可能です)
TNFはTextRecord#TNF_WELL_KNOWN を使用します。
TYPEはTextRecord#RTD_URI を使用します。
IDは今回使用しないので空の配列を渡します。
PAYLOADは自作する必要があります。


NDEFを書き込む

NDEFの書き込みに関しては以前書きましたので、そちらをご参照ください。
> ブリリアントサービス NFC技術ブログ: AndroidでRTD Textを書く 

ソースコード


カスタマー開発部 山下智樹