こんにちは。ニノです。
今回は「NFCタグ」に対して、Android端末からメッセージの読み書きを行います。
こちらの記事の続編となります。
[Kotlin] AndroidでNFCタグを使ってみた① – ID情報取得 –
メッセージの書き込み
NFCタグを扱うために必要な前処理等は前回の記事と同じであるため、NFCタグ検出時のイベント(onNewIntentメソッド)
を書き換えていきます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
/**
* NFCタグの検出時に呼ばれる(書き込み用)
*/
override fun onNewIntent(intent: Intent) {
// 書き込むメッセージ
val text = "write-test"
if(NfcAdapter.ACTION_TECH_DISCOVERED == intent.action
|| NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action) {
val tag = intent.getParcelableExtra<Tag>(NfcAdapter.EXTRA_TAG) ?: return
val ndef = Ndef.get(tag) ?: return
if(ndef.isWritable) {
val record = NdefRecord.createTextRecord("en", text)
val msg = NdefMessage(record);
ndef.connect()
ndef.writeNdefMessage(msg)
ndef.close()
}
}
}
|
これで、NFCタグにスマホをかざすと、”write-test” というメッセージを書き込むことができます。
次は、この書き込んだメッセージを読み取ってみましょう。
メッセージの読み込み
分かりやすくするため、onNewIntentメソッドの中身を読み込み用に置き換えます。
NFCタグから読み取った情報をログとして出力します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
/**
* NFCタグの検出時に呼ばれる(読み込み用)
*/
override fun onNewIntent(intent: Intent) {
if(NfcAdapter.ACTION_TECH_DISCOVERED == intent.action
|| NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action) {
val tag = intent.getParcelableExtra<Tag>(NfcAdapter.EXTRA_TAG) ?: return
val ndef = Ndef.get(tag) ?: return
val raws = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES) ?: return
var msgs = arrayOfNulls<NdefMessage>(raws.size)
for(i in raws.indices) {
msgs[i] = raws[i] as NdefMessage?
if(msgs[i] != null) {
for (record in msgs[i]?.records!!) {
Log.d("TAG", "TNF:" + record.tnf)
Log.d("TAG", "Type:" + String(record.type))
// payload(データ本体)
Log.d("TAG", "payload:" + String(record.payload))
// payloadからメッセージ部分を抽出
Log.d("TAG", "payload-message:" + String(record.payload, 3, record.payload.size - 3))
// payloadの中身を1byteずつ表示
for(i in record.payload.indices){
Log.d("TAG", String.format("payload[%d] : 0x%02x / %c",
i, record.payload[i].toInt() and 0xFF, record.payload[i].toInt() and 0xFF))
}
}
}
}
}
}
|
先程メッセージを書き込んだNFCタグに対して、もう一度スマホをかざすと、以下のログが出力されます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
D/TAG: TNF:1
D/TAG: Type:T
D/TAG: payload:enwrite-test
D/TAG: payload-message:write-test
D/TAG: payload[0] : 0x02 /
D/TAG: payload[1] : 0x65 / e
D/TAG: payload[2] : 0x6e / n
D/TAG: payload[3] : 0x77 / w
D/TAG: payload[4] : 0x72 / r
D/TAG: payload[5] : 0x69 / i
D/TAG: payload[6] : 0x74 / t
D/TAG: payload[7] : 0x65 / e
D/TAG: payload[8] : 0x2d / -
D/TAG: payload[9] : 0x74 / t
D/TAG: payload[10] : 0x65 / e
D/TAG: payload[11] : 0x73 / s
D/TAG: payload[12] : 0x74 / t
|
上から順番に
- TNF:Type Name Format。NDEFレコードがどのような種類であるかを示します。(0x01は TNF_WELL_KNOWN)
- Type:payloadがどのような種類であるかを示します。TNFによって設定できる値が変わります。(Tは RTD_TEXT)
- payload:データ本体。byte配列をそのまま文字列として表示。
- payload-message:payloadのメッセージ部分を抽出して文字列として表示。(4byte目以降を抽出)
- payload[0~12]:payloadのbyte配列を1byteずつ、16進数と文字で表示。
最後の、payloadを1byteずつ出力している部分を見ていただくと分かりやすいですが、
1byte目はテキスト開始の制御コード、2~3byte目は書き込み時に指定した言語コード「en」、
それ以降がメッセージ部となっています。
メッセージ部に、NFCタグに書き込んだ “write-test”という文字列が入っていることが分かります。
以上、今回はNFCタグに対するメッセージの読み書きでした。