onps是一個開源且完全自主開發的國產網絡協議棧,適用于資源受限的單片機系統,提供完整地ethernet/ppp/tcp/ip協議族實現,同時提供sntp、dns、ping等網絡工具,支持以太網環境下dhcp動態ip地址申請,也支持動態及靜態路由表。
協議棧還封裝實現了一個伯克利套接字(Berkeley sockets)層。
該層并沒有完全按照Berkeley sockets標準設計實現,而是我根據以往socket編程經驗,以方便用戶使用、簡化用戶編碼為設計目標,重新聲明并定義了一組常見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查詢等操作。
| 名稱 | 描述 |
|---|---|
| bsd | 伯克利sockets層的相關接口函數實現源文件 |
| ethernet | 以太網協議族如ethernet-ii/arp及emac層、dhcp客戶端等的相關實現源文件 |
| include | 協議棧的頭文件 |
| ip | ip及其上層icmp/tcp/udp協議族的相關實現源文件 |
| mmu | 協議棧內存管理模塊的相關實現源文件 |
| net_tools | 網絡工具實現源文件,如dns查詢、網絡校時、ping等 |
| netif | 網卡及路由管理等相關接口實現源文件 |
| port | 協議棧移植相關的源文件 |
| ppp | ppp鏈路層相關實現源文件,包括lcp/ipcp/chap/pap等協議族的實現源文件 |
| TcpServerForStackTesting | 用于協議棧測試的tcp服務器,IDE為vs2015開發,目標系統為win7及以上 |
| test_code | linux下的ppp撥號原理驗證文件 |
協議棧支持主流的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開源許可協議
版權聲明:本文來源網絡,免費傳達知識,版權歸原作者所有。如涉及作品版權問題,請聯系我進行刪除。
注意
由于微信公眾號近期改變了推送規則,為了防止找不到,可以星標置頂,這樣每次推送的文章才會出現在您的訂閱列表里。
猜你喜歡:
嵌入式設備AP配網實例分享
嵌入式Linux單板連接飛燕物聯網平臺
分享一種靈活性很高的協議格式(附代碼例子)
嵌入式大雜燴周記 | 第 16 期
嵌入式大雜燴周記 | 第 15 期
訪問非法內存為什么不會出錯?
嵌入式大雜燴周記 | 第 14 期
分享幾個實用的代碼片段(第二彈)
分享一種你可能不知道的bug定位方法
分享一種修改配置文件的方法
《嵌入式大雜燴周記第 13 期:lz4》
《嵌入式并行多線程處理器,了解一下!》
《分享一種修改配置文件的方法》
《分享幾個實用的代碼片段(附代碼例子)》
《廢舊板子再利用:搭建無線調試環境!》
《嵌入式段錯誤的3種調試方法匯總!》
《簡說TCP通信非阻塞接收(附代碼例子)》
《TCP通信常用接口的使用封裝》
《嵌入式軟件中,總線錯誤的坑?替大家先踩一步》
《分享嵌入式軟件調試方法及幾個有用的工具!》
《分享兩點提高編程能力的建議!》
在公眾號聊天界面回復1024,可獲取嵌入式資源;回復?m?,可查看文章匯總