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

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

ваша страница уже очень помогла, но я обнаружил проблемы при попытке отформатировать тег 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 = мин. 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();
    }
}


EDIT: и здесь вы можете увидеть информацию о тегах от 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>

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


person michi099    schedule 11.09.2014    source источник
comment
Любые подсказки приветствуются! Майкл   -  person michi099    schedule 20.09.2014


Ответы (1)


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

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


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

person Michael Roland    schedule 17.10.2014
comment
Большое спасибо за Ваш ответ! - person michi099; 20.10.2014
comment
Приятно знать, что автоматическое распознавание не будет работать, но все же есть возможность взаимодействовать с пользовательским приложением. Однако много гибкости теряется. Майкл - person michi099; 20.10.2014