最終更新:
moonlight_aska 2012年09月17日(月) 23:17:49履歴
NFCのデータ交換フォーマット(NDEF : NFC Data Exchange Format)は, NFC準拠のデバイスとNFCカード/タグとの間で通信を行う際の共通データフォーマットとして定義されている.
その中の1つに, RTD(Record Type Definition) Textフォーマットというのがある.
RTD Textフォーマットは,

↓(NFC TagInfoで確認)

その中の1つに, RTD(Record Type Definition) Textフォーマットというのがある.
- Payloadの構造
オフセット(bytes) | 長さ(bytes) | 説明 |
0 | 1 | ステータスバイト |
1 | <n> | ISO/IANA言語コード |
n+1 | <m> | テキスト文字列. UTF-8 or UTF-16エンコード |
- ステータスバイトの構造
ビット番号(0:LSB) | 説明 |
7 | 0:UTF-8, 1:UTF-16 |
6 | RFU(0) |
5..0 | 言語コードの長さ |
- Nfc04.java
RTD Textフォーマットは,
- UTF8 or UTF16の文字セットを判定する.
- 言語コードをバイト列に変換する.
- テキストをバイト列に変換する.
- Payload[0]のbit7にUTF8/UTF16の情報を, bit0-bit5に言語コードバイト数をセットする.
- Payload[1]〜[n]まで, 言語コードをセットする.
- Payload[n+1]から, テキストをセットする.
- TNFにTNF_WELL_KNOWN, Record TypeにRTD_TEXTを指定し, NdefRecordのインスタンスを生成する.
private void writeTag(Intent intent, String text) throws IOException, FormatException {
String action = intent.getAction();
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
// Ndefメッセージ生成
NdefRecord record = createTextRecord(true, "en", text);
NdefMessage msg = new NdefMessage(new NdefRecord[] {record});
// Ndefメッセージの書き込み
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
Ndef ndef = Ndef.get(tag);
ndef.connect();
ndef.writeNdefMessage(msg);
Log.v("NFC", "write " + text);
ndef.close();
}
}
// RTD TextフォーマットのNdefレコード作成
private NdefRecord createTextRecord(boolean isUtf8, String lang, String text) {
Charset utfType = isUtf8 ? Charset.forName("UTF-8"):Charset.forName("UTF-16");
byte[] langCode = lang.getBytes(utfType);
byte[] textData = text.getBytes(utfType);
byte[] status = new byte[] {(byte)( (isUtf8 ? 0:(1<<7)) + langCode.length & 0x3f)};
// Payloadのデータ組み立て
byte[] payload = new byte[status.length + langCode.length + textData.length];
System.arraycopy(status, 0, payload, 0, status.length);
System.arraycopy(langCode, 0, payload, status.length, langCode.length);
System.arraycopy(textData, 0, payload, status.length + langCode.length, textData.length);
return new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[]{}, payload);
}
- 動作例

↓(NFC TagInfoで確認)

コメントをかく