一.數(shù)據(jù)幀格式 為防止DTU和服務(wù)器傳輸過程中因網(wǎng)絡(luò)原因?qū)е虏鸢⒄嘲虼思s定傳輸?shù)幕緮?shù)據(jù)幀格式如下,DTU上傳和服務(wù)器下發(fā)的數(shù)據(jù)包均需滿足此數(shù)據(jù)幀格式要求。服務(wù)器應(yīng)解決TCP傳輸過程中的拆包粘包問題,確保每次處理的是完整的數(shù)據(jù)包。 基本數(shù)據(jù)幀格式: | | | | | | | | | | | | | | | | | 從Data到CheckSum的字節(jié)數(shù)。大端格式(高字節(jié)在前) |
| 從Type開始按字節(jié)累加到本域的前一字節(jié).每次累加進(jìn)位去掉。 |
Type:數(shù)據(jù)包類型,也理解為Command. 不同的Tyep其對應(yīng)的Length大小可能不同,Data也有所區(qū)別。 Length:在此之后的數(shù)據(jù)長度。大端格式。 CheckSum:校驗(yàn)和,雖然TCP傳輸協(xié)議本身已經(jīng)有CRC校驗(yàn),但網(wǎng)絡(luò)傳輸路徑的復(fù)雜性仍然無法保證數(shù)據(jù)一定無誤,因此需要對每個數(shù)據(jù)幀(包)再進(jìn)行簡單的校驗(yàn)。
二.Login和LoginAck及其Data含義DTU每次和服務(wù)器建立TCP連接后,首先必須先往服務(wù)器發(fā)Login命令,服務(wù)器根據(jù)業(yè)務(wù)需要判斷其合法性(鑒權(quán)),然后回復(fù)LoginAck命令。 | | | | Data內(nèi)容格式 (按順序排列,排在前面的先傳輸,大端格式) | | | | | PSN(uint32)|PASS(uint32)|PName(uchar[8])|CurVer(uint16)| CCID(char[20]) | | | | | | Right(uchar)|FoTaFlag(uchar)|TickTime(uchar)|SendTestMode(uchar)|SendTestTime(uchar)|NewVer(uint16)|NewPort(uint16)|NewIP(uchar[4])| |
PSN:DTU編碼.每個DTU都有唯一的產(chǎn)品序列號(或簡稱DTU編碼)。 PASS: DTU密碼。 服務(wù)器建立PSN和PASS關(guān)系表,初始化情況下PASS為0,當(dāng)DTU請求Login時,如果數(shù)據(jù)庫里PSN對應(yīng)的PASS為0時,不需比對直接通過,并將DTU上傳的PASS值寫入數(shù)據(jù)庫中,下次DTU再登錄服務(wù)器時,因數(shù)據(jù)庫的PASS非0而需要比較DTU上傳的PASS和數(shù)據(jù)庫的PASS是否相同,不同則認(rèn)為鑒權(quán)失敗。 PName:產(chǎn)品名稱,如HS121, 不夠8字節(jié)的后面補(bǔ)0. CurVer:當(dāng)前DTU應(yīng)用版本號。 CCID: SIM卡的ICCID號(20個字符)。 Right:服務(wù)器鑒權(quán)結(jié)果。 Right=0xEA表示鑒權(quán)成功! 其他值均表示鑒權(quán)失敗。如果鑒權(quán)失敗,服務(wù)器應(yīng)在發(fā)完這條響應(yīng)數(shù)據(jù)包后主動關(guān)閉此TCP連接。 FoTaFlag: 空中升級配置標(biāo)志: FoTaFlag =0--不支持空中升級; FoTaFlag =1--可手動空中升級;用戶通過串口或按鍵組合才能觸發(fā)觸發(fā)空中升級。 FoTaFlag =2--可自動空中升級。DTU收到此信息后應(yīng)馬上進(jìn)入空中升級模式。 TickTime:上傳心跳時間間隔 SendTestMode: 數(shù)據(jù)上傳模式,可以選擇服務(wù)器查詢,或者DTU自動上傳。(目前此模式無效,只支持定時上傳) SendTestMode=0 :任何一個測量值發(fā)生變化終端馬上上傳,但上傳速度不大于SendTestTime 所設(shè)定的時間。如SendTestTime=3則最快上傳速度為3 秒一次。 SendTestMode =255:忽略Test值是否有變化,只按照SendTestTime設(shè)定的時間間隔上傳。 SendTestMode=x( 0<x<255):當(dāng)?shù)?~x個Test參數(shù)中有任何一個變化時馬上上傳,否則將根據(jù)SendTestTime所設(shè)定的時間定時上傳. Test測量值順序按終端和服務(wù)器約定的SendTest命令中Data的TestValue順序排列,2字節(jié)一組(組成unsigned short 或short類型數(shù)據(jù))。 SendTestTime: DTU上傳Test時間,在沒有服務(wù)端下發(fā)查詢的時候DTU以此時間間隔上傳DTU保存值,為0時表示不自動上傳。 NewVer:表示當(dāng)前DTU軟件的最新版本號,0表示沒有新版本。當(dāng)DTU檢查到當(dāng)前版本小于最新版本時,DTU根據(jù)FoTaFlag決定是否遠(yuǎn)程升級。 NewPort:新服務(wù)器端口。 NewIP:新服務(wù)器端IP地址。如123.86.55.33 第一個字節(jié)為123 按此順序。 NewPort和NewIP 可用于服務(wù)器遷移和負(fù)載均衡需要。為0時終端不處理,非0時終端將更新存儲的服務(wù)器IP和Port,下次鏈接服務(wù)器將用新的IP和Port. 三、SendTick和SendTickAck及其Data含義: DTU Login到服務(wù)器時,服務(wù)器下發(fā)的LoginAck中包含了TickTime參數(shù)(單位為秒),其值代表了DTU應(yīng)該至少在多長時間內(nèi)發(fā)起一次上行數(shù)據(jù),如果在這個時間段內(nèi)沒有任何上行數(shù)據(jù)傳輸(如SendTest或SendSetup),則必須發(fā)一個SendTick 數(shù)據(jù)包到服務(wù)器,以便服務(wù)器持續(xù)保持TCP鏈路。 四. SaveSetup和SaveSetupAck及其相關(guān)的Data含義:SaveSetup用于服務(wù)器配置自動上傳數(shù)據(jù)的時間間隔,以及DTU里關(guān)于寄存器地址的信息列表,即“寄存器列表”,DTU將根據(jù)此列表讀取對應(yīng)寄存器地址的值(value)。配置成功后DTU用SaveSetupAck包把所配置的寄存器列表返回給服務(wù)器,可供服務(wù)器用于校驗(yàn)配置成功與否。 | | | | Data內(nèi)容格式 (按順序排列,排在前面的先傳輸,大端格式) | | | | | SendTestTime(uchar)| SetDev1(uchar)|SetAddr1 (int16)|SetDev2(uchar)| SetAddr2(int16)|... | | | | | Result(uchar)|SendTestTimeAck(uchar)|SetDevAck1(uchar)|SetAddrAck1 (int16)|SetDevAck2(uchar)| SetAddrAck2(int16)|... |
寄存器地址列表: 下行SaveSetup: SendTestTime:配置自動上傳數(shù)據(jù)的時間間隔(單位:秒) SetDev1,SetAddr1:從機(jī)號,寄存器地址 SetDev2,SetAddr2:從機(jī)號,寄存器地址 SetDev3,SetAddr3:從機(jī)號,寄存器地址 SetDev4,SetAddr4:從機(jī)號,寄存器地址 SetDev5,SetAddr5:從機(jī)號,寄存器地址 ...... 上行SaveSetupAck: 成功返回: Result:1 SendTestTimeAck: 自動上傳數(shù)據(jù)的時間間隔(單位:秒) SetDevAck1,SetAddrAck1:從機(jī)號,寄存器地址 SetDevAck2,SetAddrAck2:從機(jī)號,寄存器地址 SetDevAck3,SetAddrAck3:從機(jī)號,寄存器地址 SetDevAck4,SetAddrAck4:從機(jī)號,寄存器地址 SetDevAck5,SetAddrAck5:從機(jī)號,寄存器地址 ...... 失敗返回: Result:0 五. ReadSetup和ReadSetupAck及其相關(guān)的Data含義:ReadSetup用于服務(wù)器讀取DTU里存儲的自動上傳時間間隔參數(shù),以及“寄存器列表”。 | | | | Data內(nèi)容格式 (按順序排列,排在前面的先傳輸,大端格式) | | | | | | | | | | SendTestTime (uchar)|ReadDev1(uchar)|ReadAddr1 (int16) | ReadDev2(uchar)|ReadAddr2(int16)|... |
SendTestTime:自動上傳時間間隔 ReadDev1,ReadAddr1:從機(jī)號,寄存器地址 ReadDev2,ReadAddr2:從機(jī)號,寄存器地址 ReadDev3,ReadAddr3:從機(jī)號,寄存器地址 ReadDev4,ReadAddr4:從機(jī)號,寄存器地址 ReadDev5,ReadAddr5:從機(jī)號,寄存器地址 ......
六、SendTest和SendTestAck及其相關(guān)的Data含義: SendTest是DTU定時自動上傳的數(shù)據(jù)包,數(shù)據(jù)內(nèi)容為寄存器里的值(value)。DTU將根據(jù)“寄存器列表”去獲取從機(jī)的對應(yīng)的寄存器里對應(yīng)值(value),按順序排列為如Value1,Value2,Value3... 將所有測量數(shù)據(jù)一起打包成SendTest數(shù)據(jù)包上傳給服務(wù)器。 | | | | Data內(nèi)容格式 (按順序排列,排在前面的先傳輸,大端格式) | | | | | NetState(uchar)|TestCode(uchar)|Value1(int16) | Value2(int16)... | | | | 服務(wù)器響應(yīng)DTU上傳測量數(shù)據(jù) | |
NetState: 網(wǎng)絡(luò)狀態(tài).DTU通訊模塊的CSQ值。 TestCode: 測量值標(biāo)識碼。為了DTU同步Value數(shù)據(jù)到服務(wù)器,服務(wù)器收到SendTest數(shù)據(jù)包并成功解析、存儲后將此TestCode回傳給DTU。 當(dāng)DTU本地的各種Value發(fā)生變化且滿足SendTestMode要求時,本地記錄的TestCode加一(255加1等于0),然后和所有的Value打包成SendTest數(shù)據(jù)包上傳給服務(wù)器,當(dāng)服務(wù)器收到SendTest數(shù)據(jù)包且成功解析并保存后將其值返回給DTU即可,假如服務(wù)器收到的SendTest數(shù)據(jù)包和事先約定的數(shù)據(jù)包不相符(比如個數(shù)少了),則服務(wù)器可以通過將TestCode減一(0減1等于255)后再回傳給DTU,這樣DTU會觸發(fā)重傳。TestCode服務(wù)器不需要保存在數(shù)據(jù)庫中。 Value1 : 第一個寄存器地址里的值; Value2 : 第二個寄存器地址里的值; Value3 : 第三個寄存器地址里的值; Value4 : 第四個寄存器地址里的值; ...... 七.ReadTest和ReadTestACK及相關(guān)的Data含義ResdTest用于服務(wù)器查詢指定寄存器的數(shù)據(jù)。 ResdTestAck是DTU返回給服務(wù)器的數(shù)據(jù)包,由對應(yīng)的寄存器的值(value)組成。 | | | | Data內(nèi)容格式 (按順序排列,排在前面的先傳輸,大端格式) | | | | | ReadValueDev1(uchar)|ReadValueAddr1 (int16)|ReadValueDev2(uchar)| ReadValueAddr2(int16)|... | | | | | Result(uchar)|ReadValue1(int16)| ReadValue12(int16)...... |
上行ResdTest: ReadValueDev1,ReadValueAddr1:從機(jī)號,寄存器地址 ReadValueDev2,ReadValueAddr2:從機(jī)號,寄存器地址 ReadValueDev3,ReadValueAddr3:從機(jī)號,寄存器地址 ReadValueDev4,ReadValueAddr4:從機(jī)號,寄存器地址 ReadValueDev5,ReadValueAddr5:從機(jī)號,寄存器地址 ......
下行ResdTestAck: 成功返回: Result:1 ReadValue1: 第一個寄存器地址里的值 ReadValue2: 第一個寄存器地址里的值 ReadValue3: 第一個寄存器地址里的值 ReadValue4: 第一個寄存器地址里的值 ReadValue5: 第一個寄存器地址里的值 ...... 失敗返回: Result:0 八. SetControl和SetControl Ack及相關(guān)的Data含義從機(jī)中,某些寄存器是用于配置的。SetControl用于服務(wù)器給DTU下發(fā)指令,讓DTU去設(shè)置某些寄存器的參數(shù). SetControlAck為DTU響應(yīng)服務(wù)器的數(shù)據(jù)包,跟服務(wù)器下發(fā)的配置參數(shù)一致,可供服務(wù)器校驗(yàn)配置成功與否。 | | | | Data內(nèi)容格式 (按順序排列,排在前面的先傳輸,大端格式) | | | | | SetValueDev1 (uchar) |SetValueAddr 1(int16)| SetValue(int16)1| SetValueDev2 (uchar) |SetValueAddr 2(int16)| SetValue(int16)2|...... | | | | | Result(uchar)|SetValueDevAck1 (uchar)|SetValueAddrAck1 (int16)| SetValueAck1 (int16) |SetValueDevAck2 (uchar)|SetValueAddrAck2 (int16)| SetValueAck2 (int16)|...... |
下行SetControl: SetValueDev1: 從機(jī)號 SetValueAddr1:寄存器地址 SetValue1:參數(shù) SetValueDev2: 從機(jī)號 SetValueAddr2:寄存器地址 SetValue2:參數(shù) ......
上行SetControlAck: 成功返回: Result:1 SetValueDevAck1: 從機(jī)號 SetValueAddrAck1:寄存器地址 SetValueAck1:參數(shù) SetValueDevAck2: 從機(jī)號 SetValueAddrAck2:寄存器地址 SetValueAck2:參數(shù) ......
失敗返回: Result:0
附: DTUDTU內(nèi)的寄存器列地址和寄存器值列表示意:
完整的Word格式文檔51黑下載地址:
|