Proximity APIによるNFC関連ネタ第二弾です。
Windows 8 ストアアプリでは、Proximity APIを使って非接触タグに対するデータの読み書きが可能です。
タグに記憶されているデータをNFCリーダーで読込んで、以下のことができます。
- テキストデータならText Editor、JPEGデータならPhotoアプリというように、読込んだデータフォーマットに合わせてそのデータを扱うアプリを起動
- 読込んだURLを基にブラウザで表示
- Windowsストアアプリを引数付きで起動(インストールされていない場合は、Windowsストアのアプリページを表示)
上の3つができるためには、タグにデータが書き込まれていなければなりません。Proximity APIを使えば、タグにデータを書き込むことができます。
さぁ始めよう…でも非接触タグなんてないよ~って方。例えば、https://www.facebook.com/RealTouchShopとかで買えます。東京駅の八重洲中央口を出て少し行ったところで実物見て買えます。あ、それから、NFCリーダー付のWindows 8 PCをご用意ください。
先ずは、書き込みです。テキストデータの書き込みは、
var device = ProximityDevice.GetDefault();
if (device == null)
{
tbStatus.Text = "This Device doesn't support NFC!";
return;
}
var kindSelect = "Spade";
var numberSelect = "Ace";
string messageType = "WindowsMime:WriteTag.text/plain";
string message = string.Format("mark={0},number={1}", kindSelect, numberSelect);
var writer = newDataWriter();
writer.UnicodeEncoding = UnicodeEncoding.Utf16LE;
writer.WriteString(message);
publishedId = device.PublishBinaryMessage(messageType , writer.DetachBuffer(), (provider, msg) =>
{
provider.StopPublishingMessage(msg);
});
こんな感じでおしまい。NFCリーダー付きのPCはそんなに多くないので、��初にチェックをします。Windows.Networking.Proximity名前空間のProximityDeviceクラス、このGetDefault()メソッドのコール結果がnullでなければ、非接触タグの読み書きが可能です。
書き込みの基本は、DataWriterクラス(名前空間はWindows.Storage.Streams)で書き込むデータを組み立て、ProximityDeviceのPublishBinaryMessage()でデータのタイプを指定して書き込む、という流れです。Publishメソッドをコールすると、NFCリーダーは書き込み待ちになるので、非接触タグをNFCリーダーに近づけるとタグへの書き込みが行われます。Publishメソッドをコールしっぱなしだと、複数のタグに書き込みできます。ただ、書き込み済みのタグを誤って書き換えてしまうこともあるので、コードの最後に示すように、StopPublishingMessage()メソッドをコールして、書き込みを終了します。
上に示したコードでmessageTypeに代入している文字列は、メッセージのフォーマット指定です。上の例では、平文のテキストです。他のデータフォーマットを送りたい場合は、
http://msdn.microsoft.com/ja-jp/library/windows/apps/hh701129.aspx
を見てください。
次にブラウザで開くURLの書き込みです。上のコードで、messageTypeに"WindowsUri:WriteTag"を、messageに表示したい、URLをセットすれば、OKです。
次にWindowsストアアプリを起動するデータを書き込む方法です。messageTypeは、"LaunchApp:WriteTag"を指定してください。messageの部分は、
string launchArgs = String.Format("mark={0},number={1}", kindSelect, numberSelect);
string praid = "App";
string appName = Windows.ApplicationModel.Package.Current.Id.FamilyName + "!" + praid;
string message = launchArgs + "\tWindows\t" + appName;
で組み立てます。launchArgsは、起動するWindowsストアアプリに渡す引数です。praidの”App”は、Package.appxmanifestをコードで開いて、<Applications>の下位の<ApplicationId="..." のIdアトリビュートの値を書いてください。Package.appxmanifestのGUI表示のIdではないのでご注意。
messageのフォーマットは、
アプリ引数 + プラットフォーム + 起動するアプリ
という形式です。これで書き込んだタグを近づけると、
こんな感じでトーストノーティフィケーションが表示されます。これをタップすると、
アプリが起動します。ユーザーがOKを出さないとアプリは起動されないので、勝手に変なアプリを密かにすれ違いざまに入れられてしまうということは出来ません。安心ですね。
URLを書き込んだタグをNFCリーダーに近づけると、
こんな表示が出ます。これをタップするとブラウザが起動します。
さて、テキストや画像の場合ですが、読込み方法は、
var subscribedId = device.SubscribeForMessage("NDEF:MIME.text/plain", (provider, message) =>
{
var data = message.Data;
byte[] buffer = newbyte[data.Length];
var reader = DataReader.FromBuffer(data);
reader.ReadBytes(buffer);
というコードで読込みます。ProximityDeviceクラスのSubscribeForMessage()メソッドをコールして、タグがタップされるのを待ちます。この際、第一引数に読込みたいデータのフォーマットを指定します。タグがタップされれば、var data以降のコードが実行され、bufferにタグに書き込まれていたバイナリ―データが読み込まれます。
第一引数は、http://www.nfc-forum.org/が規定しているフォーマットで指定します。書き込むときの指定と違うのでご注意ください。NDEF形式で読込まれたデータを元に戻す方法はまた別のポストで説明しますね。
タグの読み書きは以上です。是非お試しください。