一、終端節點功能設計
1. 功能說明
終端節點設計的是基于鴻蒙操作系統的 TCP 服務器程序,用于監測空氣質量并提供遠程控制功能。與之前的光照監測程序相比,這個程序使用 E53_SF1 模塊(煙霧 / 氣體傳感器),主要功能包括:
空氣質量監測:通過 MQ2 傳感器檢測有害氣體濃度
自動報警:當氣體濃度超過閾值時觸發蜂鳴器報警
網絡通信:
連接 WiFi 網絡
建立 TCP 服務器監聽客戶端連接
實現自定義消息協議進行數據交換
遠程控制:支持三種命令類型:
上傳數據:返回氣體濃度數據
控制命令:手動控制蜂鳴器
設置命令:調整氣體濃度閾值和控制模式
2. 軟硬件環境
板卡詳細開發說明:OpenHarmony輕量系統--BearPi-Nano開發板網絡程序測試
終端節點采用BearPi-HM_Nano開發板
BearPi-HM_Nano開發板是一塊專門為HarmonyOS設計的HarmonyOS開發板,板載高度集成的2.4GHz WLAN SoC芯片Hi3861,并板載NFC電路及標準的E53接口,標準的E53接口可擴展智能加濕器、智能臺燈、智能安防、智能煙感等案例。
節點項目代碼在鴻蒙的lite-os系統源碼的sample目錄下,完整路徑如下:
~/lite-os-dev/bearpi-hm_nano/applications/BearPi/BearPi-HM_Nano/sample/D4_iot_tcp_server_sf1
代碼工程目錄如下,build.gn是編譯配置文件,tcp_server_demo.c是主功能程序,E53_SF1.c程序實現節點數據采集功能,wifi_connect.c程序實現wifi網絡通信基礎功能。
3. 程序運行
程序下載到節點板卡后,通過type-c數據線接電腦,電腦接到板卡對應的串口終端,可看到調試運行信息。
節點串口顯示節點分配到的IP地址:
飛騰派網絡通信程序通過上述IP地址連接到終端節點:
節點串口顯示接收到飛騰派的通信協議數據:
二、程序流程分析與設計
終端節點通過 "傳感器數據采集→網絡協議交互→自動 / 手動控制" 的閉環邏輯,實現了基于 TCP 協議的遠程氣體監測與報警系統。傳感器數據通過自定義消息協議傳輸,支持遠程設置報警閾值和手動控制報警裝置,適用于智能家居或工業環境監測場景。
1. 系統初始化階段
-
程序啟動
系統通過
APP_FEATURE_INIT
宏自動調用TCPServerDemo
函數
TCPServerDemo
創建并啟動TCPServerTask
線程
-
傳感器初始化
調用Init_E53_SF1()初始化 E53_SF1 傳感器模塊
等待 1 秒(usleep(1000000))后進行傳感器校準(MQ2_PPM_Calibration())
初始化全局變量:gas_max(氣體濃度閾值,默認 100)、auto_control(自動控制標志,默認開啟)
-
網絡初始化
連接 WiFi 網絡(SSID: "xxxx",密碼: "xxxx")
創建 TCP 套接字,綁定到 8888 端口并開始監聽
2. 主循環階段
-
等待客戶端連接
調用
accept
函數阻塞等待客戶端連接連接建立后,獲取客戶端 IP 地址并打印日志
-
數據采集與命令處理循環
循環執行
e53_Task()
采集氣體濃度數據調用
cmd_proc()
處理客戶端發送的命令處理完成后休眠 1 秒,繼續下一輪循環
-
連接管理
若
cmd_proc()
返回非 1 值(如連接斷開或錯誤),退出內層循環關閉客戶端套接字,返回外層循環等待新連接
3. 傳感器數據采集與自動控制
-
數據采集
e53_Task()
調用Get_MQ2_PPM()
獲取當前氣體濃度打印氣體濃度值到控制臺
-
自動控制邏輯
當
auto_control
為 1 時,進入自動控制模式比較當前氣體濃度與閾值
gas_max
若超過閾值,調用
Beep_StatusSet(ON)
開啟蜂鳴器報警若低于閾值,關閉蜂鳴器
4. 命令處理流程
-
消息接收與解析
接收客戶端發送的消息并復制到
Message
結構體調用
parse_message()
驗證消息有效性:
檢查幀頭是否為
0xAA, 0x55
計算并驗證校驗和
-
根據消息類型執行不同操作
上傳數據命令 (0x01):
將當前氣體濃度轉換為高低字節
封裝響應消息(節點 ID: 0x02)
控制命令 (0x02):
設置
auto_control
為 0(關閉自動控制)根據命令參數手動控制蜂鳴器開關
設置命令 (0x03):
設置
auto_control
為 1(開啟自動控制)更新氣體濃度閾值
gas_max
-
發送響應
調用
pack_message()
封裝響應消息打印響應消息內容(調試用)
通過
sock_fd
發送響應到客戶端
5. 異常處理
-
連接斷開處理
在
cmd_proc()
中,若recv()
返回值小于等于 0,判定為連接斷開退出內層循環,關閉套接字,等待新連接
-
消息解析錯誤
若
parse_message()
返回非 0 值,打印錯誤信息并忽略該消息繼續下一輪循環,等待新消息
三、程序功能分析與設計
1. 初始化與系統任務函數
TCPServerDemo()
功能:創建并啟動 TCP 服務器任務線程
實現:
配置線程屬性(名稱、棧大小 10240 字節、優先級)
使用
osThreadNew
創建TCPServerTask
線程調用時機:通過
APP_FEATURE_INIT
宏在系統啟動時自動初始化
TCPServerTask()
功能:TCP 服務器主任務,實現網絡連接與數據交互
核心流程:
初始化 E53_SF1 傳感器并校準
連接 WiFi 網絡
創建 TCP 套接字,綁定端口 8888 并監聽連接
循環接受客戶端連接,處理數據交互
關鍵函數調用:
Init_E53_SF1()
、MQ2_PPM_Calibration()
、WifiConnect()
、cmd_proc()
2. 傳感器數據采集與控制函數
e53_Task()
功能:讀取氣體傳感器數據并實現自動報警控制
核心邏輯:
調用
Get_MQ2_PPM()
獲取氣體濃度(單位:PPM)若處于自動控制模式(
auto_control=1
),當濃度超過閾值gas_max
時觸發蜂鳴器報警輸出:打印氣體濃度值到控制臺
Init_E53_SF1()
功能:初始化 E53_SF1 傳感器模塊
調用時機:在
TCPServerTask
中服務器啟動時執行
MQ2_PPM_Calibration()
功能:校準 MQ2 氣體傳感器
使用場景:傳感器開機后需等待 1 秒(通過
usleep(1000000)
實現)再校準,確保數據準確性
Beep_StatusSet(Status status)
功能:控制蜂鳴器開關狀態
參數:
ON
(開啟)或OFF
(關閉)調用場景:自動報警或手動控制時執行
3. 網絡通信與命令處理函數
cmd_proc(int new_fd)
功能:處理客戶端命令并返回響應
核心流程:
接收客戶端消息并解析
Message
結構體驗證消息幀頭和校驗和(通過
parse_message
)根據消息類型(
msg_type
)執行不同操作:
0x01
(上傳數據):返回氣體濃度的高低字節
0x02
(控制命令):手動控制蜂鳴器
0x03
(設置命令):更新氣體濃度閾值gas_max
封裝響應消息并發送
關鍵變量:
recvbuf
(接收緩沖區)、response
(響應消息結構體)
WifiConnect(char *ssid, char *psk)
功能:連接指定 WiFi 網絡
參數:WiFi 名稱(
ssid
)和密碼(psk
)調用時機:服務器啟動時在
TCPServerTask
中執行
4. 消息協議處理函數
Message結構體
功能:定義通信消息格式
字段說明:
frame_header[2]
:幀頭(固定為0xAA, 0x55
)
msg_type
:消息類型(上傳 / 控制 / 設置)
node_id
:設備節點 ID(本程序中為0x02
)
data_len
:數據長度
data[10]
:數據內容
checksum
:校驗和(通過異或運算生成)
calculate_checksum(Message *msg)
功能:計算消息校驗和
實現:對消息所有字段(除校驗和本身)進行異或運算
作用:確保消息傳輸的完整性
parse_message(Message *msg)
功能:解析并驗證消息合法性
驗證邏輯:
檢查幀頭是否為
0xAA, 0x55
計算校驗和并與消息中的
checksum
對比返回值:
0
(成功)、-1
(幀頭錯誤)、-2
(校驗和錯誤)
pack_message(Message *msg, ...)
功能:封裝響應消息
參數:消息類型、節點 ID、數據長度及內容
實現:填充消息結構體并計算校驗和
調用場景:服務器向客戶端返回響應時使用
print_message(Message *msg)
功能:調試時打印消息內容
輸出:消息類型、節點 ID、數據長度及數據內容
5. 輔助工具函數
Get_MQ2_PPM()
功能:獲取 MQ2 傳感器的氣體濃度值(單位:PPM)
返回值:浮點型濃度值
closesocket(int sockfd)
功能:關閉套接字連接
調用場景:客戶端斷開連接時釋放資源
6. 函數調用關系總結
啟動流程:
APP_FEATURE_INIT → TCPServerDemo → TCPServerTask
? Init_E53_SF1 + MQ2_PPM_Calibration(傳感器初始化)
? WifiConnect(網絡連接)
通信循環:
TCPServerTask → accept(等待客戶端連接)
? e53_Task(定時采集傳感器數據)
? cmd_proc(處理客戶端命令)
? pack_message + send(返回響應)
協議處理:
cmd_proc → parse_message(解析請求)
? calculate_checksum(校驗消息合法性)
? pack_message(構造響應)
?