國產ARM/RISCV與OpenHarmony物聯網項目(六)SF1節點開發

一、終端節點功能設計

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 服務器主任務,實現網絡連接與數據交互

核心流程

  1. 初始化 E53_SF1 傳感器并校準

  2. 連接 WiFi 網絡

  3. 創建 TCP 套接字,綁定端口 8888 并監聽連接

  4. 循環接受客戶端連接,處理數據交互

關鍵函數調用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)

功能:處理客戶端命令并返回響應

核心流程

  1. 接收客戶端消息并解析Message結構體

  2. 驗證消息幀頭和校驗和(通過parse_message

  3. 根據消息類型(msg_type)執行不同操作:

    • 0x01(上傳數據):返回氣體濃度的高低字節

    • 0x02(控制命令):手動控制蜂鳴器

    • 0x03(設置命令):更新氣體濃度閾值gas_max

  4. 封裝響應消息并發送

關鍵變量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(構造響應)

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85547.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85547.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85547.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Plotly圖表全面使用指南 -- Displaying Figures in Python

文中內容僅限技術學習與代碼實踐參考,市場存在不確定性,技術分析需謹慎驗證,不構成任何投資建議。 在 Python 中顯示圖形 使用 Plotly 的 Python 圖形庫顯示圖形。 顯示圖形 Plotly的Python圖形庫plotly.py提供了多種顯示圖形的選項和方法…

getx用法詳細解析以及注意事項

源碼地址 在 Flutter 中,Get 是來自 get 包的一個輕量級、功能強大的狀態管理與路由框架,常用于: 狀態管理路由管理依賴注入(DI)Snackbar / Dialog / BottomSheet 管理本地化(多語言) 下面是 …

深度學習:人工神經網絡基礎概念

本文目錄: 一、什么是神經網絡二、如何構建神經網絡三、神經網絡內部狀態值和激活值 一、什么是神經網絡 人工神經網絡(Artificial Neural Network, 簡寫為ANN)也簡稱為神經網絡(NN),是一種模仿…

Unity2D 街機風太空射擊游戲 學習記錄 #12環射道具的引入

概述 這是一款基于Unity引擎開發的2D街機風太空射擊游戲,筆者并不是游戲開發人,作者是siki學院的涼鞋老師。 筆者只是學習項目,記錄學習,同時也想幫助他人更好的學習這個項目 作者會記錄學習這一期用到的知識,和一些…

網站如何啟用HTTPS訪問?本地內網部署的https網站怎么在外網打開?

在互聯網的世界里,數據安全已經成為了每個網站和用戶都不得不面對的問題。近期,網絡信息泄露事件頻發,讓越來越多的網站開始重視起用戶數據的安全性,因此啟用HTTPS訪問成為了一個熱門話題。作為一名網絡安全專家,我希望…

計算機網絡-----詳解網絡原理TCP/IP(上)

文章目錄 📕1. UDP協議??1.1 UDP的特點??1.2 基于UDP的應用層協議 📕2. TCP協議??2.1 TCP協議段格式??2.2 TCP協議特點之確認應答??2.3 TCP協議特點之超時重傳??2.4 TCP協議特點之連接管理??2.5 TCP協議特點之滑動窗口??2.6 TCP協議特點…

Lora訓練

一種大模型高效訓練方式&#xff08;PEFT&#xff09; 目標&#xff1a; 訓練有限的ΔW&#xff08;權重更新矩陣&#xff09; ΔW為低秩矩陣→ΔWAB&#xff08;其中A的大小為dr, B的大小為rk&#xff0c;且r<<min(d,k)&#xff09;→ 原本要更新的dk參數量大幅度縮減…

藍牙 5.0 新特性全解析:傳輸距離與速度提升的底層邏輯(面試寶典版)

藍牙技術自 1994 年誕生以來,已經經歷了多次重大升級。作為當前主流的無線通信標準之一,藍牙 5.0 在 2016 年發布后,憑借其顯著的性能提升成為了物聯網(IoT)、智能家居、可穿戴設備等領域的核心技術。本文將深入解析藍牙 5.0 在傳輸距離和速度上的底層技術邏輯,并結合面試…

Minio使用https自簽證書

自簽證書參考&#xff1a;window和ubuntu自簽證書_windows 自簽證書-CSDN博客 // certFilePath: 直接放在 resources 目錄下 或者可以自定實現讀取邏輯 // 讀取的是 .crt 證書文件public static OkHttpClient createTrustingOkHttpClient(String certFilePath) throws Excep…

汽車前縱梁焊接總成與沖壓件的高效自動化三維檢測方案

汽車主體結構件上存在很多安裝位&#xff0c;為保證汽車裝配時的準確性&#xff0c;主體結構件需要進行全方位的尺寸和孔位置精度檢測&#xff0c;以確保裝配線的主體結構件質量合格。 前縱梁焊接總成是車身框架的核心承載部件&#xff0c;焊接總成由多片鈑金沖壓件焊接組成&a…

F接口基礎.go

前言&#xff1a;接口是一組方法的集合&#xff0c;它定義了一個類型應該具備哪些行為&#xff0c;但不關心具體怎么實現這些行為。一個類型只要實現了接口中定義的所有方法&#xff0c;那么它就實現了這個接口。這種實現是隱式的&#xff0c;不需要顯式聲明。 目錄 接口的定…

cartographer官方指導文件說明---第3章 cartographer前端算法流程介紹

cartographer官方指導文件說明 第3章 cartographer前端算法流程介紹 3.1 Scan Match掃描匹配 掃描匹配&#xff08;Scan Matching&#xff09;是 Cartographer 中實現局部SLAM的核心技術&#xff0c;它通過優化算法將當前激光掃描數據對齊到子圖地圖中。下面從計算過程、數學…

汽車整車廠如何用數字孿生系統打造“透明車間”

隨著工業4.0時代的發展&#xff0c;數字孿生技術已成為現代制造業的重要利器。特別是在汽車整車廠&#xff0c;通過數字孿生系統的應用&#xff0c;能夠有效打造一個“透明車間”&#xff0c;實現生產過程的全面可視化與實時監控&#xff0c;提高生產效率&#xff0c;降低成本&…

openKylin適配RISC-V高性能服務器芯片,攜手睿思芯科共拓智算新藍海

3月31日&#xff0c;睿思芯科&#xff08;深圳&#xff09;技術有限公司&#xff08;簡稱“睿思芯科”&#xff09;2025春季新品發布會在深圳前海國際會議中心盛大舉行&#xff0c;作為RISC-V領域的年度盛事&#xff0c;此次發布會吸引了眾多業內目光。此次發布會上&#xff0c…

【已解決】lxml.etree.ParserError: Document is empty

本專欄解決日常生活工作中非快速找到解決方案的問題。 問題背景 在爬取某網站時&#xff0c;使用開源框架報錯&#xff1a;lxml.etree.ParserError: Document is empty 解決方案 1、多個搜索引擎中查找&#xff0c;建議都是對lxml的python源碼進行修改&#xff0c;不好用。…

mac電腦調試iphone真機safari網頁

mac電腦調試iphone真機safari網頁 start 本文主要是記錄一下如何調試蘋果手機上的safari的網頁 方法 1.蘋果手機打開 web檢查器 操作步驟&#xff1a; 打開設置搜索safari最底部“高級”開啟“網頁檢查器” 2.mac電腦打開safari 操作步驟&#xff1a; 先用數據線連接手機和…

opencv依據圖像類型讀取圖像像素點

Mat數據類型和通道對應的type()&#xff1a; 庫類型C1C2C3C4CV_8U081624CV_8S191725CV_16U2101826CV_16S3111927CV_32S4122028CV_32F5132129CV_64F6142230 通過c程序查看類型并讀取圖像像素點&#xff1a; switch (im->type()){case 0:std::cout << "at (&quo…

軟件架構的發展歷程——從早期的單體架構到如今的云原生與智能架構

軟件架構的發展歷程是技術演進與業務需求相互驅動的結果&#xff0c;從早期的單體架構到如今的云原生與智能架構&#xff0c;每一步都在突破系統的可擴展性、靈活性和效率邊界。以下是其核心發展脈絡及未來趨勢的全景解析&#xff1a; 一、發展歷程&#xff1a;從單體到智能的…

Oracle 基礎語句大全:從數據定義到復雜查詢

一、DDL&#xff08;數據定義語言&#xff09;&#xff1a;定義數據庫結構 1. 創建表&#xff08;CREATE TABLE&#xff09; -- 語法格式 CREATE TABLE [schema.]table_name (column1 datatype [CONSTRAINT constraint1],column2 datatype [DEFAULT default_value],-- 表級約…

【學習筆記】鎖+死鎖+gdb調試死鎖

【學習筆記】鎖死鎖gdb調試死鎖 一、互斥鎖&#xff08;std::mutex&#xff09; 最基本的鎖類型&#xff0c;提供排他性訪問&#xff0c;同一時間僅允許一個線程持有鎖。 #include <iostream> #include <mutex> #include <thread>std::mutex mtx; // 全局…