どうも、まるさ@maruuusa83です!
Windows8搭載のASUS製タブレット端末を入手したので遊んでみました!
Microsoftのエバンジェリストの方から「NFCおもしろいよ!」と伺っていたのでNFCリーダを搭載した機種ですw
まだまだNFCを使って遊ぶ情報は少ないですね・・・。
というわけで、NFCタグで遊ぶまでの手順をそこそこ詳しくまとめておきます!
必要なもの
・
NFCタグ
NFCとは近距離無線通信規格のことで、いわゆる非接触型ICってやつです。
Amazonでも売ってますし、通販サイトもいくつかありましたよ!
中にテキストデータだったり画像だったりの任意のデータを書き込むことができます。すごい!
とはいいつつ容量は150Byte程度ですがw
・
NFC対応タブレット端末
今回僕の環境ではASUSのTF810Cを使っています。
ディジタイザとタッチパネルでめちゃいい感じですw
・
Windows8 Metroスタイルアプリの開発環境
こちらに使い方をザーッとまとめているのでもし必要であればご覧ください!
早速実装!
0.目標
今回はNFCへの任意のデータの書き込み・読み込みを行えるようにしようと思います!
データのタイプも様々指定できるのですが、今回は次のタイプを使います。
- URLを書き込んで自動でブラウザが立ち上がるタイプ
- アプリ内で使えるような任意のデータの書き込み・読み込みができるタイプ
1.プロジェクトの立ち上げと設定
適当な感じでプロジェクトを立ち上げてください。
プロジェクトを立ち上げたら、近接通信が利用できるように設定します。
- ソリューションエクスプローラーからPackage.appxmanifestを開く
- [機能]タブの[機能>近接]にチェックを入れる
この設定でNFCによる通信が使えるようになります。
2.UI要素の追加
書き込み・読み込み それぞれに必要なUI要素を追加しておきます。
僕はこんな風にしてみました。参考にしてくださいー。
書き込み:
データ記入用TextBox、データタイプ選択ComboBox、データセット用Button
読み込み:
データ読み込み用Button、データ表示用TextBlock、
読み込んだデータを表示するButton
これで準備ができました。
まずはデータを書き込めるようにしましょう。
3.データの書き込み
まずは先ほど作ったページで
Windows.Networking.Proximityと
Windows.Storage.Streamsをusingしておきます。
そして、Set DataのボタンのClickイベントハンドラに次のコードを書き込んでください。
var device = ProximityDevice.GetDefault();
//NFCの環境があるかチェック
if (device ==
null)
{
//NFCの環境が存在しない
Data.Text =
"Can't use NFC.";
return;
}
//ComboBoxに合わせてメッセージタイプを選択する
string messageType =
"";
string message =
"";
if (data_type.SelectionBoxItem.ToString() ==
"URL")
//UI要素に合わせて適当に
{
//読み込むとブラウザが立ち上がり書き込んだURLにジャンプする
messageType =
"WindowsUri:WriteTag";
}
else if (data_type.SelectionBoxItem.ToString() ==
"DATA")
{
//このアプリで使うためのデータとして書き込む。自動でソフトは立ち上がらない。
messageType =
"Windows:WriteTag.SampleData";
}
message = Input_data.Text;
Data.Text =
"Set data : " + message;
//書き込んだデータを画面に出力
var writer =
new DataWriter();
writer.UnicodeEncoding =
UnicodeEncoding.Utf16LE;
writer.WriteString(message);
var publishId = device.PublishBinaryMessage(messageType, writer.DetachBuffer(), (provider, msg) =>
{
provider.StopPublishingMessage(msg);
}
);
これでとりあえずデータを書き込めます!
TextBoxに適当なURLを打ち込んで、ComboBoxをURLにセットして、書き込んでみます。
書き込んでみたら、NFCを一度離したあと読み込ませてみてください。こんな画面がでるハズ
画面右上にトーストが出るので、そいつをクリックしてやるとタグに保存したリンク先にジャンプします。
これでおもろい名刺つくれますね!!
DATAを選択して書き込むとピロピロ音が出るばっかりで何も起きません。
じゃー次で読みだしてみましょう。
4.データの読み出し
こんな感じです。文字コードの読み直しについて調べるのが面倒だったので1バイト飛ばしながら読む暴挙にでています(ごめんなさい)
long subscribedId = -1;
//うまくIDを引き継げなかったのでクラス変数へ・・・
string str_data = "";
//クラスの中で自由に使いたいのでこれもスコープを広げます;
private void GetData_Click(
object sender,
RoutedEventArgs e)
{
var device = ProximityDevice.GetDefault();
if (device == null)
{
//NFCの環境が存在しない
Data.Text =
"Can't use NFC.";
return;
}
Data.Text =
"You can read NFC";
//この行が実行されると読み込み待機になる。
//指定したタイプのデータを読み込むと渡した関数を実行。
subscribedId = device.SubscribeForMessage(
"Windows.SampleData", (provider, message) =>
{
var data = message.Data;
byte[] buffer =
new byte[data.Length];
var reader =
DataReader.FromBuffer(data);
str_data =
"";
for (
int i = 0; i < data.Length / 2; i++)
{
str_data += reader.ReadString(1);
reader.ReadString(1);
}
System.Diagnostics.
Debug.WriteLine(str_data);
device.StopSubscribingForMessage(subscribedId);
//読み込み待機の停止
});
}
これでstr_dataに読み込んだデータが保存されます。
文字コードを読みかえしてしまえばもっとスマートな関数になると思いますw
これでstr_dataにタグ内に「Windows.SampleData」というタイプで保存されたデータならば読みだすことができます。
アプリに合わせて「SampleData」は好きな名前に変えられます。(Windows.xxxxと書ける)
このstr_dataを右画面のTextBlockに反映するように設定すれば完成!
そのうちクラス化して使いやすくしようかなーとおもいます。
NFCリーダライタ同士での通信もできるので、今度はそれに挑戦しようとおもいます!
今日はこの辺で ノ
まるさ