首頁 > 後端開發 > C++ > 主體

如何保證ESPased可程式控制器的目前TCP連接

DDD
發布: 2024-10-19 14:07:01
原創
800 人瀏覽過

在設計簡易可程式控制器的軟體系統架構時,我主要考慮以下幾點:
(1)需要支援TCP伺服器以及TCP客戶端同時復用,TCP伺服器有三種連接情況,瀏覽器下載內建網頁後進行通信,用於第三方軟體的通信連接,用於Modbus-TCP協定的連接;
TCP客戶端用於連​​接雲端伺服器上的TCP伺服器,以實現遠端存取。考慮到 ESP8266 的資源情況,按照 TCP 伺服器支援 4 個 TCP 用戶端連接,同時 1 個 TCP 用戶端連接雲端伺服器的規格進行並發設計;
(2)需要控制最多5路TCP/IP資料通訊的流量,並為PLC相關任務調度分配足夠的時間片,以確保PLC功能的可靠調度和即時響應;
3)主任務為LWIP任務和主任務,LWIP任務的優先順序低於主任務,同時確保主任務沒有耗時長或阻塞的任務,並且主任務以10ms tik為單位進行調度,主任務執行完畢後主動進入阻塞狀態,釋放CPU用於調度其他任務;
結合這些,我設計了附近的軟體架構;
當TCP伺服器或TCP客戶端接收到資料時,LWIP的任務執行資料接收的回呼函數;
在回呼函數中,程式只是將接收到的資料存入接收緩衝區,但不會對資料進行處理;
有五個接收緩衝區,每個用於五個並發連接;當存入這些緩衝區時,同時處理TCP包解包和粘包情況,HTTP協議數據通過rnrn字符結尾進行解包;
當接收到新資料時,LWIP 任務會透過信號量信號量喚醒主任務進行處理。
主任務每次偵測這5個緩衝區的狀態,如果有接收到的數據,則處理相關數據並產生回應回傳給發送方;
為了確保所有 5 個連線都有相同的機會被處理,主任務輪流優先考慮這 5 個快取的狀態。
例如,如果調度程序首先確定連接 0 的緩存,則下一個調度程序確定連接 1 的緩存。
這可以透過簡單的程式碼來實現;

簽名短 http_get_recvs(U32 *msg, U32 *addr, U16 *port){
U8 i;
帶符號短 res = -1;
for(i = 0; i {

    if(tcpclient_curquery_client >= TCPSERVER_CLIENT_NUM){
        tcpclient_curquery_client = 0;
    }
    if(tcpclient_info[tcpclient_curquery_client].used == TRUE){
        if(tcpclient_info[tcpclient_curquery_client].received){
            *msg = (U32)tcpclient_info[tcpclient_curquery_client].recvbuff;
            *addr = tcpclient_info[tcpclient_curquery_client].ipaddr;
            *port = tcpclient_info[tcpclient_curquery_client].port;
            res = (signed short)tcpclient_curquery_client;
            break;
        }
    }
    tcpclient_curquery_client++;
}
return(res);
登入後複製

}

How to ensure oncurrent TCP connection for ESPased programmable controller

How to ensure oncurrent TCP connection for ESPased programmable controller

以上是如何保證ESPased可程式控制器的目前TCP連接的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!