2017-10-11

[NFC] NDEF (NFC Data Exchange Format) 內容初步解析

Hi 大家好,最近工作上的需要快速認識NFCNDEF的定義,因此這邊比較像是針對工作上做個筆記備忘。

[前言]

1.     關於NFC的科普可以直接透過 wiki 初步認識一下,本篇文章主要專注於讀卡機模式(Reader/Writer mode

2.     請務必事先閱讀今天,你NFC了沒? 這網站介紹的NFC Type Tag基本概觀

[操作]

1.     這邊是透過CR95 (Reader) ,讀取我們產品的NFC tagNFC forum Data Area部分,如圖所示:
PS. 避免機密外洩,圖中黑色遮住的部分是 NDEF Payload 部分,

2.     這邊是透過產品 Console dump出來的NFC tag內容,如圖所示:

3.     承上題,console dump出來的格式是透過NDEF NFC去實現的,先看不懂印出來的格式沒關係,這邊是確保我們可以驗證 CR95讀取和console dump是否一致?

[解說]

這兒簡單介紹一下剛才所提到的內容,全都是16進制:
0xE1 0x40 0x40 0x05                                                         /* Capability Container */
0x03 0x98 0x92 0x04 0x61 0x74 0x65 0x78 0x74           /* NDEF Message TLV */
0x** 0x** 0x** ……                                                        /* Payload of NDEF Message TLV */

另外NFC Tagmemory map如圖下:

PS. 本文章的NFC Tag沒有Lock Control TL Memory Control TLV
,不同類型的晶片實現方式隨之不同,這邊我們重點放在NDEF

/* Capability Container */

如圖藍色框框部分是Capability container,內容如下:

0xE1 0x40 0x40 0x05
ð 0xE1表示採用NFC Forum標準,0x40表示版本號碼4.0,若版本號碼3.1此值為0x31

0xE1 0x40 0x40 0x05
ð 0x40 表示記憶體容量,0x40等於十進制64,表示64 * 8bits = 512 bytes

0xE1 0x40 0x40 0x05
ð 0x05的前四個位元是表示讀取記憶體機制,後四個位元是表示寫入機制,這邊不是很確定內容意義為何,這邊先保留

   

/* NDEF Message TLV */

如圖紅色框框部分是 NDEFMessage TLV,內容如下:

0x03 0x98 0x92 0x04 0x61 0x74 0x65 0x78 0x74
ð 0x03表示採用控制資料類型碼是 NDEF 的訊息區塊,0x98表示此 NDEF Message TLV內所有的Record (Header + Payload) 長度共152 bytes,如範例所示我們 NDEF Message TLV 包含兩個 Records,這邊只介紹第一個 Record,爾後 Record 以此類推

0x03 0x98 0x92 0x04 0x61 0x74 0x65 0x78 0x74
ð 0x92這邊是NDEF Message RecordHeader,可表示成二進制: 10010010,對照如下

Flag
Value
Description
MB
1
1表示第一筆Record
ME
0
0表示非最後一筆Record
CF
0
0表示不是長訊息
SR
1
1表示短紀錄格式,此payload長度不超過254 bytes
IL
0
0表示ID LENGTHID被省略。這邊對範例來說不重要,可略過
TNF
0
1
0

0x03 0x98 0x92 0x04 0x61 0x74 0x65 0x78 0x74
ð 0x04表示Type Length,表示0x74 0x65 0x78 0x74 的長度為4 bytes,這邊可以看成ASCII的"TEXT",表示文字。至於0x61指的是此RecordPayload 長度為97 bytes

還記得剛才前面的圖嗎? Record的長度為104 bytes算法是這樣子的
0x03 0x98 0x92 0x04 0x61 0x74 0x65 0x78 0x74 0x** 0x** 0x** ……..
ð 0x92 0x04 0x61 0x74 0x65 0x78 0x74 7 bytes
ð 0x** 0x** 0x** …….. Payload97 bytes
ð 7 bytes + 97 bytes = 104 bytes

[總結]

我們第二個Record長度48 bytes,細節就不再贅述。因此本範例NDEF MessageRecord長度總共:
ð 104 bytes (1st Record) + 48 bytes (2nd Record) = 152 bytes


0x03 0x98 0x92 0x04 0x61 0x74 0x65 0x78 0x74 0x** 0x** 0x** …….
ð 104 bytes 的16進制為0x98,所以才會有0x98的存在
ð 152 bytes 的16進制為0x98所以才會有0x98的存在 (update: 2017/10/11)

這邊工作紀錄就提供大家參考,開發之前的Know How真的很花時間:( 謝謝。

Jhanggj 2017/10/10 in Taipei

2017-10-09

[RPI] How to verify a program on the RPI broad in realtime by using NFS service

Hi 大家好,這邊介紹如何在使用 RPI 與 Linux PC 共同連接同一台 router 情況下,可以使用RPI 的 Toolchain 在 Linux PC 端編譯 program 之後,透過 mount 指令方式直接在 RPI 上執行,不用透過 scp 指令把 program 傳輸至 RPI 執行,目的是可以提升驗證程式的速度。

Note:

    1. Linux PC 這邊指的是在 Window 筆電上執行 Vmware 中的 Ubuntu

    2. NFS dir 指的是在 Linux PC 所開放的 NFS 的目錄

    3. 目前環境設定 RPI 與 Linux PC 有連接共同的 router,並且互相可以 ping 對方

[Test environment]

    1. Linux PC ubuntu-14.04.5-desktop-i386.iso

    2. RPI OS: 2016-11-25-raspbian-jessie-lite

2017-10-08

Good tips for being a good R&D

這邊隨手紀錄工作習慣。

1. git commit內容:
git commit 要有redmine的issue number,redmine也要有git commit的number or link,方便查閱紀錄。

2. make > dev/null:
build的時候,請make > /dev/null,減少了print log時間,完成速度會快很多。

3. 整理command:
一些常用command請存成*.txt,使用時直接複製貼上console會更方便。

4. 描述issue,
a. 問題現象是什麼?
b. 如何複製問題?
c. 發生問題機率?
d. 什麼樣的環境? FW版本? FW設定? 是否有先做factoryReset?

5. 請在Outlook打開信件,按下ctrl + alt + F  儲存郵件,看是要上傳至redmine or onenote保存查看都可以
(onenote可以直接儲存outlook)

PPT做的很爛

PPT怎麼搞請GOOGLE,我想說的是,PPT是給群眾看的,曲高和寡的ppt,useless!