段學松,劉童瑤,繆程澳,曲中水
(哈爾濱理工大學 計算機科學與技術學院,黑龍江 哈爾濱150080)
近場通信(Near Field Communication,NFC)作為一種由RFID 技術演變而來新興的技術,可以在彼此靠近的情況下低功耗進行數據交換。利用NFC 配合藍牙無線傳輸技術實現對電子設備的非實時非在線維護是一種新的數據維護方式,具有較高的工程應用價值。
空中下載技術(Over The Air Technology,OTA)是一種無線升級技術,常用于Android 手機等嵌入式設備的系統升級上。首先通過運營商提供的數據流量或者Wifi等方式把系統升級包下載至本地手機,然后通過解壓縮系統升級包到特定目錄來修復設備或者更新系統。
隨著科技的發展,越來越多的嵌入式設備都支持ISP(In System Programing)在系統編程技術。ISP 技術能夠做到無需取下電路板上的器件的情況下對器件編程。ISP 技術一般由上位機以有線的方式對下位機的器件進行編程,因此需要在設計電路的時候預留相關的接口。ISP 技術無論是在各種單片機還是在FPGA 上都有比較廣泛地應用。
NFC 用于P2P 數據交換時,采用的是簡單NDEF 交換協議(simple NDEF exchange protocol,SNEP)[1]。兩個NFC 設備進行通信前,要把數據封裝為NDEF 格式[1],才能通過SNEP 協議進行通信。
整個系統由硬件系統與軟件系統兩部分組成。
硬件系統的主控板采用ARM 公司的STM32 開發板,但是考慮到不同的電子設備的功耗要求以及數據修改量,硬件系統分為兩種方案來實現。
4.1.1 針對功耗要求苛刻、少量數據修改的電子設備的硬件系統實現方案(方案一)
電子設備對功耗要求比較苛刻,而對數據僅有少量的修改的情況比較常見,對于這種情況,數據傳輸應當選擇傳輸功耗較低,數據傳輸速度也很低的NFC 模塊PN532 作為數據傳輸控制的硬件設備。硬件系統通過數據維護接口實現對電子設備內存儲設備進行修改,實現無線數據維護的功能。由于對傳輸的速率要求較低,因此用單片機的片內RAM 即可實現數據的臨時存儲,無需采用多余的存儲模塊,降低了成本。
4.1.2 針對功耗要求不高、大量數據修改的電子設備的硬件系統實現方案(方案二)
當電子設備對功耗要求不是十分嚴格時,為了提高傳輸效率,達到功耗與數據傳輸速率的平衡,采用藍牙實現無線數據傳輸,通過把藍牙的配置信息以及配對PIN寫入NFC 標簽的方式加速藍牙連接,實現NFC 技術與藍牙技術融合[2]。藍牙模塊采用HC05[5]藍牙模塊。硬件系統同樣通過數據維護接口實現對電子設備內存儲設備進行修改。當需要大量的數據修改時,需要用存儲設備作為緩沖區來臨時存儲接收到的數據。考慮到價格以及可拓展性等因素,采用SD 卡作為數據緩沖區,上位機通過掃描帶有藍牙配對信息的NFC 標簽并獲得藍牙HC05 模塊的配置信息以及配對的PIN 后,直接連接到HC05 模塊,與上位機通信收到的數據都會先被臨時存儲到SD卡內,通過數據維護接口寫入要維護的電子設備中。

圖1 MMHF 的協議規范

圖2 Android 讀取NFC 標簽和NFCP2P 通信的樣例代碼
4.2.1 NFC 傳輸協議定義
上位機主要通過NFC 實現與下位機的數據交互。考慮到NFC 傳輸速度較慢,同時為了方便發送和接受數據包,可以把NDEF 協議再一次封裝為MMHF(Memory Maintenance Hex File)協議。該協議是適用于本系統手機到下位機數據傳輸的專用協議。下位機可根據本協議的修改記錄對EEPROM 修改指定地址的數據。MMHF 的協議規范如圖1 所示。
MMHF 的協議字段具體含義如下:
Header (4Byte):大小為4 字節的固定字符串“MMHF”,是識別傳輸協議的頭部。
Type(6Byte):大小為6Byte 用來記錄的是下位機存儲芯片的型號的字符串。
Check(16Byte):大小為16Byte 的字符串,是一個校驗碼,用于確保和驗證該數據是維護人員發出的,增加了一定安全性,該值由開發人員自主設定,如果下位機校驗Check 字段不是設定的值,會把發來的數據丟棄。
BodyCnt(1Byte):BodyCnt 是一個大小為1Byte 數,記錄了需要傳輸的次數。
Body(大小不固定):多條修改記錄的集合,其大小不固定。
AllRecordSize(1Byte):大小為1Byte 的數,記錄所在的Body 中修改記錄的總字節大小。由于下位機數據存儲大小有限,因此單次傳輸一個Body 中的所有修改記錄的總大小不能超過115B。Android 解析本文件的時候會檢查記錄的總大小,如果超過115B 會報錯。
RecordCnt(1Byte):大小為8bit 的數,記錄的是本文件中修改記錄的數量。
Record(大小不固定):一條EEPROM 的修改記錄,包含地址和數據。
4.2.2 藍牙傳輸協議定義
上位機主要通過藍牙來實現與下位機的數據交互,為了方便接收和發送數據包,可以在藍牙SSP 協議的基礎上,繼續封裝協議,命名為SSP+協議。協議分為6 段。其中,START1 段為一個字節大小的固定16 進制數:0x0A,START2 段為一個字節大小的固定16 進制數0xFA,這兩個字節作為數據包的包頭,用來識別數據包是基于SSP+協議的。

圖3 通過MAC 地址直接連接已經配對的藍牙設備樣例程序代碼
Count 段大小是一個兩個字節,表示要接收的字節流的長度。Data[]段大小為Count 字節,表示數據傳輸的真實數據。END1 段是一個字節大小的固定16 進制數0x00,END2 段是一個字節大小的固定16 進制數0x0B,這兩個字節作為數據包的包尾,用來作為識別數據包結束。
Android[6]是一套真正意義上的開發性的移動設備綜合平臺,它包括操作系統、中間件和一些關鍵的平臺應用。安卓系統具有開放性、豐富的硬件、大量的開發商等特點。安卓系統是開放免費的,并且Android 手機本身普遍具有NFC 和藍牙兩種功能,因此上位機采用Android系統的智能手機來實現比較合適。
4.3.1 Android 下NFC 通信[3]的實現
Android 中用NdefMessage 和NdefRecord 兩個類來表示NFC 標簽中的信息。NFC 標簽的識別實時過程是由硬件實現的,當硬件發現有NFC 標簽的時候,會對已經注冊NFC 權限[3]的Activity 產生一個onNewIntent()的調用。在Android 系統中用SNEP 協議實現兩個NFC 設備的通信,要用到兩個API 接口,分別是當與支持NFCP2P的設備接觸時,發送含有多個NFC 標簽的消息到設備的setNdefPushMessage()和產生一個消息發送成功回調的setNdefPushMessageCallback()。Android 利用NFC 通信的代碼如圖2 所示。
4.3.2 Android 下藍牙通信[4]的實現
Android 同樣也采用適配器管理類來操作藍牙設備。獲取藍牙適配器,同樣僅需一行語句:BluetoothAdaptermBluet oothAdapter=BluetoothAdapter.getDefaultAdapter(this)。得到適配器之后通過BluetoothDevice 類來獲得藍牙設備。藍牙通信與NFC 不同的是,藍牙通信需要建立連接,因此藍牙有專用的BluetoothSocket 類。代碼如圖3 所示。
本文設計基于NFC 無線通信的電子設備非實時維護系統,該系統是一種具有實用價值的創新性的系統維護方式,利用現代移動設備的便利性、普及性,對于非聯網設備的維護給出了一種新的解決方案,不僅節省了設備異地維護過程的人力物力,也提高了解決問題的效率。