1.2.文檔對象 該文檔主要面向高速公路運營商、網絡和硬件工程師、系統管理員等技術人員。同時,對于相關的軟件和高速公路管理人員,本文檔也將提供重要的參考信息。
1.3.文檔內容 文檔的主要內容包括:
系統概述:簡單介紹物聯感知平臺的設計和功能。
設備接入:詳細說明如何配置和接入硬件設備。
網絡連接:解釋如何建立和測試網絡連接。
軟件接口:描述如何通過軟件接口與系統交互。
故障排除:提供一些常見問題的解決方案和建議。
系統維護:提供系統日常維護和更新的建議。
希望通過本文檔,用戶可以有效地接入和使用物聯感知平臺,提升高速公路的管理效率和服務質量。

本文檔會介紹物聯感知平臺的總體結構、主要功能、系統需求以及相關的硬件和軟件組件。但這部分內容將不會深入到具體的實現技術或編程細節。
1.2.2 設備接入
我們會詳細解釋如何將各類設備(如傳感器、攝像頭等)接入到物聯感知平臺中,包括設備的配置和連接過程。但是,具體的設備安裝和物理布線等步驟可能會根據設備的型號和規格略有不同,這些內容不在本文檔的討論范圍內。
1.2.3 網絡連接
本文檔會介紹如何建立和測試網絡連接,包括局域網(LAN)、廣域網(WAN)和無線網絡(Wi-Fi)。我們不會討論如何建立和管理網絡基礎設施,如路由器、交換機和防火墻等。
1.2.4 軟件接口
我們會詳細描述如何通過軟件接口與物聯感知平臺進行交互。然而,本文檔并不包括如何開發或定制這些接口的具體編程指南。
1.2.5 故障排除
本文檔會提供解決物聯感知平臺中常見問題的建議和解決步驟,但并不會涵蓋所有可能的故障或錯誤。對于一些具體的、復雜的問題,可能需要聯系系統供應商或專業的技術支持。
1.2.6 系統維護
我們將介紹如何進行系統的日常維護和更新,但不會提供關于硬件維修或替換的詳細指南。
總的來說,本文檔旨在提供一個關于如何接入和使用物聯感知平臺的綜合指南,而不會涉及到具體的設備安裝、網絡基礎設施建設、接口編程、硬件維修等深層次的技術細節。
本文檔對高速公路運營商提供了關于如何使用和管理物聯感知平臺的指導。它可以幫助他們理解系統的功能和結構,以便有效地監控和優化公路的運營。
1.3.2 網絡和硬件工程師
網絡和硬件工程師是本文檔的主要讀者群體。本文檔將為他們提供如何配置、連接設備,以及如何建立和測試網絡連接的詳細步驟。
1.3.3 系統管理員
系統管理員可以通過本文檔了解如何進行系統的日常維護和更新,以及如何解決系統中可能出現的常見問題。
1.3.4 軟件
雖然本文檔并不包括具體的編程指南,但軟件仍然可以從中了解如何通過軟件接口與物聯感知平臺進行交互。
1.3.5 高速公路管理人員
對于參與高速公路管理和運營決策的人員,本文檔也可以提供有用的參考信息,幫助他們了解物聯感知平臺的功能和用途。
請注意,由于本文檔涉及到一些技術性的內容,讀者需要具有一定的網絡和硬件知識才能充分理解。對于沒有相關背景的讀者,我們建議他們在閱讀本文檔時與具有相關技術知識的專業人員一起進行。
1. 設備認證
(1) 加密認證(推薦)
(2) 簡單認證
2. 設備交互
(1) 發布物模型、設備信息、時鐘同步相關Mqtt主題
(2) 訂閱物模型、設備升級、時鐘同步相關Mqtt主題
3. 設備AP配網(可選,Wifi類設備)
(1) 設備檢測接口
(2) 設備配置接口
l 目前只支持Mqtt協議設備接入,其他協議例如TCP和Modbus協議在開發中
l 如果設備的Mqtt消息格式是固定的,可以通過EMQX的規則引擎進行轉發,適配到平臺
l 設備認證
n 加密認證(推薦)
n 簡單認證
u 認證類型:S=簡單認證,E=加密認證
u 產品啟用設備碼后,碼不能為空
u 用戶ID就是登陸用戶的ID,使用不同用戶ID,設備歸屬于不同用戶??梢越y一使用admin賬號1,后面通過配網或者掃碼關聯設備分配給不同用戶。
u 設備編號有兩種方式獲?。?.使用系統新建設備時,生成的設備編號;2.系統未新建設備,硬件端生成一個編號作為設備編號,認證后系統會自動注冊一個設備實體(設備比較多時,推薦這種方式)
l 設備交互
n 發布物模型、設備信息、時鐘同步相關Mqtt主題
n 訂閱物模型、設備升級、時鐘同步相關Mqtt主題
l 設備AP配網(可選,Wifi類設備)
n 設備檢測接口
n 設備配置接口
# 客戶端Id等于 認證類型 + 設備編號 + 產品編號 + 用戶 IDclientId = E & deviceNumber & productId & userId |
# 用戶名 userName = smart |
# 密碼 password = mqtt 密碼 & 過期時間 password = mqtt 密碼 & 過期時間 & 設備碼 (產品啟用設備時格式 ) |
l 用戶名直接輸入Mqtt賬號
l 密碼等于 Mqtt密碼 + 密碼過期時間 + 設備碼(可選),然后進行AES加密。為了安全,密碼過期時間應該在24小時以內,采用時間戳格式,精確到毫秒。
l 賬號配置信息示例:
clientId = "E&D68329VL588&2&1" |
userName = "smart" |
password = "/W2A/4MK+9cEGBhyBDgr2K5c62DAjAK4m0b5pvwxX6FFMzI3h1pUmaDY3BH1P2mI" |
# 客戶端Id等于 認證類型 + 設備編號 + 產品編號 + 用戶 IDclientId = S & deviceNumber & productId & userId |
# 用戶名 userName = smart |
# 密碼 password = mqtt 密碼 password = mqtt 密碼 & 設備碼 (產品啟用設備時格式 ) |
# 客戶端Id等于 認證類型 + 設備編號 + 產品編號 + 用戶 IDclientId = "S&D68329VL588&2&1"userName = "smart"password = "PHYFED93WSFF1DAS"password = "PHYFED93WSFF1DAS&ADBFCC8934864B26B55658C66F562A"(產品啟用設備時格式 ) |
# deviceSendTime 值為設備當前運行的毫秒數 http ://localhost :8080/iot /tool /ntp ?deviceSendTime =35768 |
# 計算時間 設備當前時間 = (服務端接收時間 + 服務端發送時間 + 設備接收時間 - 設備發送時間 ) / 2 |
加密模式: CBC |
填 充: pkcs5padding |
數 據 塊: 128位 |
偏 移 量: smart -open |
輸 出: base64 |
密 碼: 對應系統的產品秘鑰 |
加密內容: mqtt密碼 & expireTime & 碼(可選 ) |
主題 | 描述 |
---|---|
/{productId}/{deviceNum}/info/get | 訂閱設備信息(訂閱到該主題就發布設備信息) |
/{productId}/{deviceNum}/ota/get | 訂閱設備升級 |
/{productId}/{deviceNum}/property/get | 訂閱屬性(服務端發布,設備訂閱) |
/{productId}/{deviceNum}/property-online/get | 訂閱屬性(在線模式,用戶端發布,設備訂閱) |
/{productId}/{deviceNum}/function/get | 訂閱功能(服務端發布,設備訂閱) |
/{productId}/{deviceNum}/function-online/get | 訂閱功能(在線模式,用戶端發布,設備訂閱) |
/{productId}/{deviceNum}/monitor/get | 訂閱實時監測信號(根據監測次數和間隔,然后發布監測數據) |
/{productId}/{deviceNum}/ntp/get | 訂閱時鐘同步(可選,用于同步設備的當前時間) |
| |
| |
主題 | 描述 |
---|---|
/{productId}/{deviceNum}/info/post | 發布設備信息 |
/{productId}/{deviceNum}/property/post | 發布屬性 (實時顯示,包括監測數據,可定時上報監測數據) |
/{productId}/{deviceNum}/function/post | 發布功能 (實時顯示) |
/{productId}/{deviceNum}/event/post | 發布事件 |
/{productId}/{deviceNum}/monitor/post | 發布實時監測數據(僅用于實時監測圖表顯示,不會存儲) |
/{productId}/{deviceNum}/ntp/post | 發布時鐘同步(可選) |
l 訂閱設備信息,對應主題:/info/get
# 描述:訂閱到設備信息后,發布設備信息,解決設備狀態同步問題 |
# 設備消息內容為空 |
l 發布設備信息,對應主題:/info/post
# 描述: 1.設備上電后發布設備信息; 2.設備接收到設備信息指令后發布設備信息 # rssi 設備信號(信號 [-55— 0],信號好 [-70— -55],信號一般 [-85— -70],信號差 [-100— -85]) # status 設備狀態,固定為 3,表示在線 # firmwareVersion 固件版本 # userId 可選,用戶的 ID,可設置為admin用戶 ID為 1,僅Wifi類設備需要上傳用戶 ID,配網時再分配設備給用戶。 # longitude 可選,經度,使用設備定位時需要上傳 # latitude 可選,緯度,使用設備定位時需要上傳 # summary 可選,摘要,設備的配置信息等,json格式,對象可自定義 { "rssi": -43, "firmwareVersion": 1.2, "status": 3, "userId": "1", "longitude": 0, "latitude": 0, "summary": { "name": "gaocheng-smart", "chip": "esp8266", "author": "kerwincui", "version": 1.2, "createTime": "2022-06-06" } } |
l 訂閱實時監測,對應主題:/monitor/get
# 描述:訂閱到實時監測消息,根據數量和間隔發布實時監測數據 # count 數量 # interval 間隔,毫秒為單位 { "count": 60, "interval": 1000 } |
l 發布實時監測,對應主題:/monitor/post
# 描述:根據訂閱到的實時監測消息,發布數量和間隔的監測數據 # id 標識符,實時監測是物模型中的屬性,產品詳情中查看標識符,對應id值 # value 設備采集的值,只能是整數或者小數,以字符串類型傳遞 # remark 可為空或者使用設備當前時間 [{ "id": "temperature", "value": "27.43", "remark": ""}, { "id": "humidity", "value": "32.18", "remark": "" }] |
l 訂閱屬性/功能,對應主題:/property/get、/function/get、property-online/get、/function-online/get
# 描述:屬性、功能、事件都屬于物模型,Json定義是一樣的。屬性和功能的在線模式和普通模式,用于區分不同種類消息,但是設備的處理都是一樣的。例如都訂閱到消息打開開關,設備的處理都是把開關打開。 # id 標識符,產品詳情中查看物模型,對應物模型的標識符 # value 值,對應物模型中定義,以字符串類型傳遞 # remark 平臺中告警、場景聯動和定時下發的指令有備注信息 [{ "id": "gear", "value": "1", "remark": "設備定時"},{ "id": "switch", "value": "0", "remark": "場景聯動觸發" }] |
l 發布屬性/功能/事件,對應主題:/property/post、/function/post、/event/post
# 描述:屬性、功能、事件都屬于物模型,Json定義是一樣的。 `value` 的值如果是布爾類型,值為 "0"或者 "1",代表打開 /關閉;枚舉類型對應枚舉項的鍵值(例如 "1",代表中速檔位 );數組類型是以英文逗號分隔的字符串。 # id 標識符,產品詳情中查看物模型,對應物模型的標識符 # value 值,對應物模型中定義,以字符串類型傳遞 # remark 可以直接使用訂閱到的備注信息,設備日志信息中查看到該備注 [{ "id": "gear", "value": "1", "remark": "檔位設置成功"}, { "id": "switch", "value": "0", "remark": "開關已關閉" }] |
相關物模型說明
l 所有物模型的Id(標識符)都是的,盡量不要使用特殊字符,以字母和數字為主。
l 對象類型物模型下面子模型Id(標識符)格式:parentId_childId,對象數組類型同樣,子模型Id增加父級的Id以下劃線分隔,例如:
# 父級物模型Id:power# 子級物模型Id:power_light |
l 數組類型(包括對象數組類型)的物模型Id(標識符)只有一個,物模型值為數組(以英文逗號分隔的字符串存儲),例如98,100,50字符串。所以上報數組類型的屬性/功能/事件,相對特殊,Id(標識符)必須以array_索引開頭,索引是兩位數,例如:
# 普通數組格式 `array_00_RGB`# 對象數組格式 `array_00_power_switch`# 索引00代表數組中個元素,02 / 03 ... 98 / 99 以此類推,數組長度不能超過100 [{ "id": "array_01_power_switch" , // array_01 作為前綴,表示數組中的第二個元素 "value": "1" , "remark": "" }] |
l 發布時鐘同步,對應主題:/ntp/post
# 描述:可選,發布時鐘同步消息,服務端訂閱到后下發時鐘同步消息 # deviceSendTime 設備發送時間 {"deviceSendTime": "1592361428000"} |
l 訂閱時鐘同步,對應主題:/ntp/get
# 描述:可選,訂閱到時鐘同步消息,計算當前時間 = (服務端接收時間 + 服務端發送時間 + 設備接收時間 - 設備發送時間 ) / 2# deviceSendTime 設備發送時間 # serverRecvTime 服務端接收時間 # serverSendTime 服務端發送時間 { "deviceSendTime": "1592361428000", "serverSendTime": "1592366463548", "serverRecvTime": "1592366463548"} |
l 訂閱OTA升級,對應主題:/ota/get
# 描述:訂閱到設備升級消息后,根據固件下載地址,Http請求下載固件并升級 # version 版本號,可用于匹配固件版本 # downloadUrl 固件下載地址 { "version": 1.1, "downloadUrl": "https://iot.gaocheng.live/prod-api/profile/iot/6/2022-0616-140539.bin" } |
(1) 通信協議根據實際情況選擇,一般默認JSON解析協議
(2) 傳輸協議選擇MQTT
(3) 認證方式選擇簡單加密方式
(4) 針對當前產品綁定對于物模型
2、系統創建設備
(1) 創建設備選擇的產品
(2) 生成或者填入設備編碼
(3) 創建完畢會出現mqtt連接信息,得到連接信息使用設備或者工具模擬
3、使用MQTTX或其他工具模擬設備上線下線,上報數據
(1) 打開MQTTX工具設置好連接信息進行保存
(2) 點擊連接按鈕 模擬設備上線
(3) /151/D15NTQGMU9KA/property/post 發送地址發送json格式數據如下圖
l 設備心跳
l 設備信息查詢
l 設備通道查詢
l 設備直播
l 云臺控制
l 設備管理統一到平臺
l 設備本地錄像在線播放
l 設備通道國標ID生成
l 云端錄像存儲,接入七牛云,螢石云,阿里云等
l 移動端播放器,主要適配h5端
l 語音對講
l P2P協議,AI能力對接
l 其他監控管理協議適配
l 選擇產品分類和設備類型
l 新建SIP配置,流媒體服務器配置
l 點擊獲取默認配置,然后新建SIP配置
l 修改流媒體服務器IP為部署服務器公網IP,默認為http播放協議,用https需修改zlmedia/conf/default.pem證書
l 新建設備,生成設備ID和通道ID
l 攝像頭:設備類型為"IPC",通道類型為"IPC"
l 錄像機:設備類型為"錄像機",通道類型為"錄像機"
l NVR+IPC:設備類型為"NVR",通道類型為"IPC"
l DVR+IPC:設備類型為"DVR",通道類型為"IPC"
l 將相關信息填入設備
l 將產品中SIP配置和生成的id填入設備
l 服務器ID = SIP服務器ID(??担?= SIP服務器編號(大華)
l 服務器域 = SIP服務器域(海康) = SIP域(大華)
l 部署服務器公網IP = SIP服務器地址(海康) = SIP服務器IP(大華)
l 服務器端口 = SIP服務器端口(??担?= SIP服務器端口(大華)
l 認證密碼 = 密碼(??担?= 注冊密碼(大華)
l 設備ID = SIP用戶名(海康) = SIP用戶認證ID(海康) = 設備編號
l 通道ID = 視頻通道編號ID(??担?= 通道編號(大華)
l ??到尤胧纠?配置路徑:配置-> 網絡-> 高級配置-> 平臺接入
l 大華接入示例: 配置路徑:配置-> 網絡配置-> 平臺接入
l 攝像頭流媒體格式建議為:視頻:h264 音頻:aac
l 監控設備管理
l 設備詳情
l 設備通道
l 設備直播
l 設備錄像點播
SDP全稱是Session Description Protocol,翻譯過來就是描述會話的協議。主要用于兩個會話實體之間的媒體協商。 SDP描述由許多文本行組成,文本行的格式為<類型>=<值>,表示為key=value; SIP負責建立和釋放會話,一般來說,會話中包含相關的媒體,比如視頻和音頻。媒體數據是由SDP描述的。SDP一般不單獨使用,它與SIP配合使用時會放到SIP協議的body中。會話建立時,需要媒體協商,雙方才能確定對方的媒體能力以及交換媒體的數據(這就是sdp的工作)。
本平臺實現modbus協議的方式有兩種方案,按照需要選擇
Modbus實現有兩種方式
a. 云端輪詢:云端結合采集點模板定時下發讀指令給設備,由于是云端定時執行,無法做到實時性,當設備量少時,上千級的設備量以下,使用沒有壓力。當設備量超過萬級時,云端壓力較大,實時性很差,不推薦
b. 邊緣網關:輪詢交給邊緣網關處理,外加MCU作為輪詢載體,成本低,而且移植性強,大大提高云端處理數據的能力,而且能做到實時性,推薦使用。需要配合Dtu或者模組固件進行采集
采集點詳情配置如下: 點擊新增->添加變量模板,
1. 添加從機:
從機地址 : 硬件設備的地址編碼,例如485接口,有1-3個子設備,設備地址可以為 01 02 03
功能碼:目前支持 03,04
寄存器起始地址(10進制): 一般為0x00,例如設備有0~100個寄存器,起始地址就為 0 寄存器結束地址(10進制): 例如設備有0~100個寄存器,起始地址就為 100 批量采集頻率:目前這個參數沒有作用,采集頻率在: 系統監控-定時任務-modbus云端輪詢的定時任務調節 組包寄存器數量 : 該參數決定批量讀取寄存器的個數,默認為32,若寄存器小于32,會根據起始地址和結束地址進行計算長度
2. 為從機添加變量
單個變量添加流程: 選中從機,點擊添加變量,如下, 模型名稱:該物模型顯示的名稱 模型標識:如果是modbus,模型標識根據寄存器地址一樣,自動填充 寄存器: 目前功能碼支持 03 04,暫不支持01。后面輸入框為寄存器地址值(10進制)
批量導入變量:點擊導入變量,下載模板填寫:如下
3. 新建產品
在前面步驟新建了設備通訊協議和采集點模板后,新增一個產品,如下
選擇通訊協議:系統目前只支持三種
選擇采集點模塊,我這里選擇先配置好的采集模塊,modbus從機組,
傳輸協議:目前支持 系統支持MQTT,TCP,其他協議服務如UDP,已經搭建,但是沒有做協議解析邏輯。
設備類型: 這里選擇了modbus-rtu協議后,自動選擇網關設備
4. 產品物模型:
新增后,可以看到配置的產品物模型:
5. 新建設備
選擇對應的產品,設備編號需要填寫模組的IMEI號或者Dtu設備的MAC編號
6. 運行狀態和服務下發
新增完成后,可以看到設備的運行狀態頁簽,設備的一次數據緩存
從機地址: 每個從機都有地址,占用一個字節,范圍0-255,其中有效范圍是1-247,其中255是廣播地址(廣播就是對所有從機發送應答)
功能碼: 占用一個字節,功能碼的意義就是,知道這個指令是干啥的,比如你可以查詢從機的數據,也可以修改從機的數據,所以不同功能碼對應不同功能.
數據: 根據功能碼不同,有不同功能,比方說功能碼是查詢從機的數據,這里就是查詢數據的地址和查詢字節數等。
校驗: 在數據傳輸過程中可能數據會發生錯誤,CRC檢驗檢測接收的數據是否正確
標題 | 標簽 | 字段名 |
---|---|---|
01H | 讀取輸出線圈 | |
02H | 讀取輸入線圈 | |
03H | 讀取保持寄存器 | |
04H | 讀取輸入寄存器 | |
05H | 寫入單線圈 | |
06H | 寫入單寄存器 | |
0FH | 寫入多線圈 | |
10H | 寫入多寄存器 | |
_ | | |
0x01:從機的地址 0x03:查詢功能,讀取從機寄存器的數據 0x00 0x01: 代表讀取的起始寄存器地址.說明從0x0001開始讀取. 0x00 0x01: 查詢的寄存器數量為0x0001個 Modbus把數據存放在寄存器中,通過查詢寄存器來得到不同變量的值,一個寄存器地址對應2字節數據; 寄存器地址對應著從機實際的存儲地址 0xD5 0xCA: 循環冗余校驗 CRC
從機回復報文格式如下: | 從站地址 | 功能碼 | 字節計數 | 字節1 |字節2 | 校驗 | | 0x01 | 0x03| 0x02| 0x01 | 0x00| 0x17| 0xF8 0x4A |
0x01:從機的地址 0x03:查詢功能,讀取從機寄存器的數據 0x02: 返回字節數為2個 一個寄存器2個字節 0x00 0x17:寄存器的值是0017 0xF8 0x4A: 循環冗余校驗 CRC
x01:從機的地址 0x06:修改功能,修改從機寄存器的數據 0x00 0x01: 代表修改的起始寄存器地址.說明修改0x0000-0x0001的存儲內容 0x00 0x17: 要修改的數據值為0017 0x98 0x04: 循環冗余校驗 CRC
從機回復報文一樣
0106000100179804
0x01 | 06 | 00 01 | 00 17 | 98 04 |
---|---|---|---|---|
從機地址 | 功能號 | 數據地址 | 數據 | CRC校驗 |
0x01 | 03 | 00 01 | 00 01 | D5 CA |
---|---|---|---|---|
從機地址 | 功能號 | 數據地址 | 讀取數據個數 | CRC校驗 |
0x01 06 00 01 00 17 98 04 從機地址 功能號 數據地址 數據 CRC校驗
0x01 06 00 01 00 17 98 04 從機地址 功能號 數據地址 數據 CRC校驗
0x01 06 00 01 00 17 98 04 從機地址 功能號 數據地址 數據 CRC校驗
下行報文:01 03 00 04 00 02 85 ca
從機地址 | 功能碼 | 寄存器起始地址 | 讀取寄存器個數 | CRC校驗 |
01 | 03 | 00 04 | 00 02 | 85 ca |
從機地址 | 功能碼 | 返回字節個數 | 寄存器40005數據 | 寄存器40006數據 | CRC校驗 |
01 | 03 | 04 | 00 00 | 00 00 | 21 33 |
數據類型 | 讀功能碼 | 寫功能碼 | 對象類型 |
離散量輸入 | 02 | | 單個位 |
線圈狀態 | 01 | 05,15 | 單個位 |
輸入寄存器 | 04 | | 16位字 |
保持寄存器 | 03 | 06,16 | 16位字 |
數據類型 | 參數地址,寄存器編號 |
離散量輸入 | 00001~0FFFF |
線圈狀態 | 10001~1FFFF |
輸入寄存器 | 30001~3FFFF |
保持寄存器 | 40001~4FFFF |
由于TCP設備連接,需要識別設備,因此TCP客戶端連接時,上報的個報文為客戶端的注冊包。
例如:7e80D4AD203F3A1C7e
其中 7e 是包頭包尾
80是注冊包的標識位
D4AD203F3A1C 是設備編號
客戶端上報注冊包后,更新設備狀態為在線
l 心跳包:
TCP需要主動發送消息來維持設備的心跳保持,上圖中 keep-alive 是心跳超時的判定時間 70s,因此設備的心跳需要維持在70s以下。
心跳包例如: 7e817e 7e 是包頭包尾,81是標識位 (心跳包只是維持TCP長連接,一般無其他實際意義)
l 特殊的注冊,心跳 數據包:
在有些設備客戶端,會把設備的注冊包,心跳包,數據包,定時上報,一方面是包含了設備編號,也可以維持了心跳,數據包還包含了設備上報的信息,這種情況系統也是可以支持的。
模擬客戶端上線
發送注冊包:配置好后,點擊鏈接,發送注冊包,如下 7e80D4AD203F3A1C7e
這個時候,看下本地啟動服務可以看到
a. TCP客戶端上線
b. 更新TCP客戶的狀態
c. 記錄設備事件記錄
查看前端頁面展示: webSocket 推送設備上線消息,實時更新前端顯示
斷開連接是,打印信息如下,更新設備上下線狀態,新增設備事件記錄,前端ws推送實時更新
同樣模擬客戶端斷電,需要等待客戶端超過心跳超時時間 (70s),更新動作跟設備斷開一致。
新建產品后,選中產品新建設備即可。
因為TCP是面向流,沒有邊界,而操作系統在發送TCP數據時,會通過緩沖區來進行優化,例如緩沖區為1024個字節大小。
如果一次請求發送的數據量比較小,沒達到緩沖區大小,TCP則會將多個請求合并為同一個請求進行發送,這就形成了粘包問題。
如果一次請求發送的數據量比較大,超過了緩沖區大小,TCP就會將其拆分為多次發送,這就是拆包。
對于粘包和拆包問題,常見的解決方案有四種:
發送端將每個包都封裝成固定的長度,比如100字節大小。如果不足100字節可通過補0或空等進行填充到長度;
發送端在每個包的末尾使用固定的分隔符,例如
。如果發生拆包需等待多個包發送過來之后再找到其中的
進行合并;例如,FTP協議;
將消息分為頭部和消息體,頭部中保存整個消息的長度,只有讀取到足夠長度的消息之后才算是讀到了一個完整的消息;
通過自定義協議進行粘包和拆包的處理
Netty對粘包和拆包問題的處理
Netty對解決粘包和拆包的方案做了抽象,提供了一些(Decoder)來解決粘包和拆包的問題。如:
LineBasedFrameDecoder:以行為單位進行數據包的解碼;
DelimiterBasedFrameDecoder:以特殊的符號作為分隔來進行數據包的解碼;
FixedLengthFrameDecoder:以固定長度進行數據包的解碼;
LenghtFieldBasedFrameDecode:適用于消息頭包含消息長度的協議();
設備影子:用于緩存設備的屬性和功能。設備離線時可以控制設備,設備上線后系統把離線控制的屬性和功能下發給設備,設備作出響應。
場景聯動:一種自動化業務邏輯的可視化編程方式。例如設置晚上回家這個場景,門鎖一打開,就把電視、飲水機和空調打開。