Как NDEF форматировать NFC-теги?

Добрый вечер,

Ваша страница уже очень помогла, но я обнаружил проблемы при форматировании NFC-тега и не смог найти тему, связанную с NDEF-форматированием тега.

Сначала я должен сказать, что я новичок в технологии NFC.

Я купил следующий тег: http://www.ti.com/product/RI-I16-112A-03/description

Этот чип проверен на заводе и поэтому каждый байт записан в 0x00.

И теперь начинаются проблемы: я скачал примечание о приложении к тегу: http://www.ti.com/lit/an/sloa166a/sloa166a.pdf и создал приложение для Android (исходный код ниже) для записи памяти, как показано на рисунке 12. Когда я считываю содержимое тега с помощью приложения NXP-TagInfo, память выглядит так, как должна. Проблема по-прежнему заключается в том, что в NXP-TagInfo показано, что "нет хранилища данных NFC", и, кроме того, оно обнаружено как NFC_TECH. Скажите, если я ошибаюсь, но это показывает, что тег определенно не отформатирован в NDEF.

Для записи в тег я провел некоторое исследование, потому что оно не задокументировано в примечании к приложению / таблице данных, и это то, что меня больше всего смущает. Существуют ли какие-либо документы, в которых указано, какие байтовые флаги можно использовать или какие существуют? Я использовал 0x42, потому что я видел его на этом форуме - если вы хотите источник, пожалуйста, спросите его.

Мое железо: Sony Xperia S - Android 4.1.2 (номер сборки: 6.2.B.1.96)
Скомпилировано с Eclipse - целевой SDK= min SDK = API-уровень 16

И, наконец, код:

public class Nfc_activity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    TextView textView = new TextView(this);
    String result = "";
    textView.setTextSize(40);

    Intent intent = getIntent();
    Tag receivedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

    byte[] block0 = new byte[] {0x42,0x21,(byte)0x00,(byte)0xe1,0x40,0x20,0x01};
    byte[] block1 = new byte[] {0x42,0x21,(byte)0x01,0x03,0x0b,(byte)0xd1,0x01};

    byte[] block2 = new byte[] {0x42,0x21,(byte)0x02,0x07,0x55,0x01,0x74};
    byte[] block3 = new byte[] {0x42,0x21,(byte)0x03,0x69,0x2e,0x63,0x6f};
    byte[] block4 = new byte[] {0x42,0x21,(byte)0x04,0x6d,(byte)0xfe,(byte)0x00,(byte)0x00};

    for(int i=0; i<receivedTag.getId().length; i++) {
        result+= Integer.toHexString(receivedTag.getId()[i]&0xff)+':';
    }


    textView.setText(result);
    setContentView(textView);

    NfcV nvcv = NfcV.get(receivedTag);

    try {
        nvcv.connect();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        nvcv.transceive(block0);
    } catch (IOException e2) {
        // TODO Auto-generated catch block
        e2.printStackTrace();
    }

    try {
        nvcv.transceive(block1);
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    try {
        nvcv.transceive(block2);
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    try {
        nvcv.transceive(block3);
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    try {
        nvcv.transceive(block4);
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    try {
        nvcv.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}


РЕДАКТИРОВАТЬ: и здесь вы можете увидеть taginfo по NXP:

<?xml version="1.0" encoding="UTF-8"?>
<scan>
    <version>3.0</version>
    <date>2014-09-20 14:19:38</date>
    <title>Texas Instruments Tag-it HF-I Plus (inlay) tag</title>
    <uid nxp="false">3C:A7:4C:2B:00:00:07:E0</uid>
    <hasndef>false</hasndef>
    <section>
        <subsection title="IC manufacturer">
            <block type="text">
    <content>Texas Instruments</content>
</block>
        </subsection>
        <subsection title="IC type">
            <block type="text">
    <content>Tag-it HF-I Plus (inlay)</content>
</block>
        </subsection>
    </section>
    <section>
        <subsection title="No NFC data set storage">
            <block type="text">
    <content></content>
</block>
        </subsection>
    </section>
    <section>
        <subsection title="Memory size">
            <block type="text">
    <content>256 bytes
► 64 blocks, with 4 bytes per block</content>
</block>
        </subsection>
        <subsection title="IC detailed information">
            <block type="text">
    <content>Supported read commands:
► Single Block Read
► Multiple Block Read
► Get System Information
AFI supported
DSFID supported
IC reference value: 0x8B</content>
</block>
        </subsection>
    </section>
    <section>
        <subsection title="Technologies supported">
            <block type="text">
    <content>ISO/IEC 15693-3 compatible
ISO/IEC 15693-2 compatible</content>
</block>
        </subsection>
        <subsection title="Android technology information">
            <block type="text">
    <content>Tag description:
► TAG: Tech [android.nfc.tech.NfcV]
android.nfc.tech.NfcV
► Maximum transceive length: 253 bytes
<hexoutput>MIFARE Classic support present in Android</hexoutput></content>
</block>
        </subsection>
        <subsection title="Detailed protocol information">
            <block type="text">
    <content>ID: E0:07:00:00:2B:4C:A7:3C
AFI: 0x00
DSFID: 0x00</content>
</block>
        </subsection>
        <subsection title="Memory content">
            <block>
    <address>0</address>
    <data access=".">E1 40 20 01</data>
</block>
<block>
    <address>1</address>
    <data access=".">03 0B D1 01</data>
</block>
<block>
    <address>2</address>
    <data access=".">07 55 01 74</data>
</block>
<block>
    <address>3</address>
    <data access=".">69 2E 63 6F</data>
</block>
<block>
    <address>4</address>
    <data access=".">6D FE 00 00</data>
</block>
<block>
    <address>5</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>6</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>7</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>8</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>9</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>10</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>11</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>12</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>13</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>14</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>15</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>16</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>17</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>18</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>19</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>20</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>21</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>22</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>23</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>24</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>25</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>26</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>27</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>28</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>29</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>30</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>31</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>32</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>33</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>34</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>35</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>36</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>37</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>38</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>39</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>40</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>41</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>42</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>43</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>44</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>45</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>46</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>47</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>48</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>49</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>50</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>51</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>52</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>53</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>54</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>55</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>56</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>57</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>58</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>59</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>60</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>61</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>62</address>
    <data access=".">00 00 00 00</data>
</block>
<block>
    <address>63</address>
    <data access=".">00 00 00 00</data>
</block>
<block type="text">
    <content>
  x:user locked, *:factory locked, .:unlocked</content>
</block>
        </subsection>
    </section>
</scan>

Спасибо за ваши ответы.
Майкл

1 ответ

Решение

Использование тегов NfcV (ISO/IEC 15693) в качестве тегов NDEF до сих пор не стандартизировано. Следовательно, производители устройств должны интегрировать поддержку собственных определений производителей тегов (в то же время они похожи / идентичны в большинстве частей) в свои версии Android.

Используемое вами устройство (в сочетании с этой версией Android) не имеет поддержки NDEF для тегов NfcV. Следовательно, вы не можете отформатировать тег таким образом, чтобы ваше устройство Android обнаруживало сообщение NDEF.


1) На самом деле это не совсем так. Это устройство может поддерживать NDEF в тегах ICODE NXP (используя тот же формат, который вы использовали в теге TI). К сожалению, эта поддержка была ограничена тегами NXP путем тестирования, если указание производителя в серийном номере тега равно 0x04 (= NXP).

Другие вопросы по тегам