一個開源且完全自主開發的國產網路協議棧

onps簡介

onps是一個開源且完全自主開發的國產網路協議棧,適用於資源受限的微控制器系統,提供完整地ethernet/ppp/tcp/ip協議族實現,同時提供sntp、dns、ping等網路工具,支援乙太網環境下dhcp動態ip地址申請,也支援動態及靜態路由表。

協議棧還封裝實現了一個伯克利套接字(Berkeley sockets)層。

該層並沒有完全按照Berkeley sockets標準設計實現,而是我根據以往socket程式設計經驗,以方便使用者使用、簡化使用者編碼為設計目標,重新宣告並定義了一組常見socket介面函式:

socket:建立一個socket,目前僅支援udp和tcp兩種型別

close:關閉一個socket,釋放當前佔用的協議棧資源

connect:與目標tcp伺服器建立連線(阻塞型)或繫結一個固定的udp伺服器地址

connect_nb:與目標tcp伺服器建立連線(非阻塞型)

is_tcp_connected:獲取當前tcp鏈路的連線狀態

send:資料傳送函式,tcp鏈路下為阻塞型

send_nb:資料傳送函式,非阻塞型

is_tcp_send_ok:資料是否已成功送達tcp鏈路的對端(收到tcp ack報文)

sendto:udp資料傳送函式,傳送資料到指定目標地址

recv:資料接收函式,udp/tcp鏈路通用

recvfrom:資料接收函式,用於udp鏈路,接收資料的同時函式會返回資料來源的地址資訊

socket_set_rcv_timeout:設定recv()函式接收等待的時長,單位:秒

bind:繫結一個固定埠、地址

listen:tcp伺服器進入監聽狀態

accept:接受一個到達的tcp連線請求

tcpsrv_recv_poll:tcp伺服器專用函式,等待任意一個或多個tcp客戶端資料到達訊號

socket_get_last_error:獲取socket最近一次發生的錯誤資訊

socket_get_last_error_code:獲取socket最近一次發生的錯誤編碼

協議棧簡化了傳統BSD socket程式設計需要的一些繁瑣操作,將一些不必要的操作細節改為底層實現,比如select/poll模型、阻塞及非阻塞讀寫操作等。

簡化並不意味著推翻,socket介面函式的基本定義、主要引數、使用方法並沒有改變,你完全可以根據以往經驗及程式設計習慣快速上手並熟練使用onps棧sockets。

無須過多關注協議棧底層,利用socket api程式設計即可完全滿足複雜通訊應用的需求,而不像LwIp一樣需要使用它自定義的一組介面函式才能達成同樣的目標。

為了適應微控制器系統對記憶體使用極度變態的苛刻要求,onps協議棧在設計之初即考慮採用寫時零複製(zero copy)技術。使用者層資料在向下層協議傳遞過程中,協議棧採用buf list連結串列技術將它們連結到一起,直至將其傳送出去,均無須任何記憶體複製操作。

另外,協議棧採用buddy演算法提供安全、可靠的動態記憶體管理功能,以期最大限度地提高協議棧執行過程中的記憶體利用率並儘可能地減少記憶體碎片。

不同於本世紀00到10年代初,微控制器的應用場景中ucosii等rtos尚未大規模普及,前後臺系統還大行其道的時代,現如今大部分的應用場景下開發人員選擇使用rtos已成為主流。

因此,協議棧在設計之初即不支援前後臺模式,其架構設計建立在時下流行的rtos(RT-Thread、ucosii/iii等)之上。協議棧移植的主要工作也就自然是針對不同rtos編寫相關os適配層功能函數了。

當然,如果你有著極其特定的應用場景,需要將onps棧移植到採用前後臺模式的微控制器上,我的建議是保留tcp/udp之下協議層的通訊處理邏輯,調整上層的系統架構使其適應目標系統執行模式。

軟體架構

onps棧設計實現了一套完整的tcp/ip協議模型。從資料鏈路層到ip層,再到tcp/udp層以及之上的伯克利socket層,最後是使用者自己的通訊應用層,onps棧實現了全棧覆蓋,能夠滿足絕大部分的網路程式設計需求。其架構如下:

一個開源且完全自主開發的國產網路協議棧

可以看出,其與傳統的網路程式設計模型並沒有什麼不同,使用者仍然是繼續利用socket api編寫常見的tcp及udp網路應用。同時你還可以利用協議棧提供的幾個網路工具進行網路校時、dns查詢等操作。

嵌入式物聯網需要學的東西真的非常多,千萬不要學錯了路線和內容,導致工資要不上去!無償分享大家一個資料包,差不多150多G。裡面學習內容、面經、專案都比較新也比較全!某魚上買估計至少要好幾十。

點選這裡找小助理0元領取:加微信領取資料

一個開源且完全自主開發的國產網路協議棧

一個開源且完全自主開發的國產網路協議棧

目錄結構

一個開源且完全自主開發的國產網路協議棧

移植及使用說明

協議棧支援主流的ARM Cortex系列MCU,支援Keil MDK、IAR等常見IDE。移植的核心工作就是完成RTOS模擬層的編寫及適配,詳細的移植說明請參考《onps網路協議棧移植及使用說明v1。0》一文:

https://gitee。com/Neo-T/open-npstack/releases/download/v1。0。0。221017/onps%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E6%A0%88%E7%A7%BB%E6%A4%8D%E5%8F%8A%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8Ev1。0。7z

本說明提供了STM32F103RCT6及STM32F407VET6兩種硬體平臺的移植樣例,每種樣例分別針對RT-Thread和ucosii兩種RTOS。樣例工程經過了嚴格的內部測試,可以直接使用。

如果你沒有太多時間,或者樣例工程與你的目標平臺並不匹配,你可以直接參考協議棧移植的一般性指導檔案《onps棧移植手冊》:

https://gitee。com/Neo-T/open-npstack/raw/master/onps%E6%A0%88%E7%A7%BB%E6%A4%8D%E6%89%8B%E5%86%8C。pdf

協議棧開發的一般性指導檔案請參考

《onps棧API介面手冊》:

https://gitee。com/Neo-T/open-npstack/raw/master/onps%E6%A0%88API%E6%8E%A5%E5%8F%A3%E6%89%8B%E5%86%8C。pdf)

《onps棧使用者使用手冊》:

https://gitee。com/Neo-T/open-npstack/raw/master/onps%E6%A0%88%E7%94%A8%E6%88%B7%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C。pdf

許可協議

Apache License 2。0開源許可協議

原文連結:https://mp。weixin。qq。com/s/_1LE7mGc9mRuajRgNsyirQ

轉載自:嵌入式大雜燴

文章來源於https://gitee。com/Neo-T/open-npstack

版權宣告:本文來源網路,免費傳達知識,版權歸原作者所有,如涉及作品版權問題,請聯絡我進行刪除。