一个开源且完全自主开发的国产网络协议栈
已剪輯自: https://mp.weixin.qq.com/s/_1LE7mGc9mRuajRgNsyirQ
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查詢等操作。
目錄結構
名稱描述
| 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開源許可協議
版權聲明:本文來源網絡,免費傳達知識,版權歸原作者所有。如涉及作品版權問題,請聯系我進行刪除。
總結
以上是生活随笔為你收集整理的一个开源且完全自主开发的国产网络协议栈的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows下合并iso镜像文件
- 下一篇: 第26章、OnKeyListener键盘