大約是06年,因項目之需我開始接觸應用於單片機系統的國外開源tcp/ip協議棧——LwIP,並藉此順勢創作了我的第一本印成鉛字的書——《嵌入式網絡系統設計——基於Atmel ARM7系列》。這本書的反響還不錯,好多人給我發msn(可惜這麼好的一個即時通訊工具就這麼被微軟放棄了,好多聯繫人就此失聯, )或郵件諮詢相關問題。在我原來的寫作計劃中,這本書的出版只是一個開始,接下來還要寫第二本——系統介紹LwIP包含的ppp協議棧的移植、應用及設計實現等相關內容。但,事與願違,這本書跳票了,且這一跳就是十二年……
細細想來,當初跳票的主因有二:其一,因家庭、工作等致可支配時間太少;其二,缺乏足夠的ppp協議相關知識及技術儲備致信心不足,畏首畏尾,裹足不前。但,這件事始終是我的一個遺憾。十二年的時間,不長亦不短,但足夠讓心底的遺憾變成一粒小小的種子並茁壯成長為一棵夢想的參天大樹。
如今,世界來到了疫情肆虐的二零年代。我的可支配時間多了起來,技術能力亦遠非當年可比。夢想之樹到了開花結果的時候了。遙想當初,入行還沒幾年,技術能力有限,我只能站在大神的肩膀上研究如何移植、使用LwIP,ppp棧碰都沒敢碰。現在,如果還只是延續十幾年前的工作,那這件事做起來就無甚意義。基於對自身技術實力的準確認識,我決定自己從零開始搭建一個完整的網絡協議棧。終,歷6個月餘,onps協議棧(onps,open net protocol stack)完成初版開發,並內部測試通過。十餘年的遺憾今日得償。另,從業20餘年,內心終有一個做核心基礎軟件的夢。今,這二之夢想亦藉此得償。
新鶯初啼,總免不了會有諸多不盡如人意的地方。開源,則可與志趣相投者共享、共用、共研,歷諸位嚴苛手段使之快速迭代,快速成熟,比肩LwIP可期。
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、telnet等 |
| 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》一文,點此下載。本說明提供了STM32F103RCT6及STM32F407VET6兩種硬件平台的移植樣例,每種樣例分別針對RT-Thread和ucosii兩種RTOS。樣例工程經過了嚴格的內部測試,可以直接使用。
如果你沒有太多時間,或者樣例工程與你的目標平台並不匹配,你可以直接參考協議棧移植的一般性指導文件《onps棧移植手冊》。
協議棧開發的一般性指導文件請參考《onps棧API接口手冊》及《onps棧用戶使用手冊》。
STM32F407VET6平台: RT-Thread移植樣例ucos-ii移植樣例
沁恆CH32V307平台: 鴻蒙LiteOS-M移植樣例Free-rtos移植樣例RT-Thread移植樣例
您可以隨時訪問onps棧官方網站,獲取協議棧研發進度、後續計劃、最新版本等相關信息。
如您在使用過程中遇到任何問題或建議,您可以到onps棧交流社區提出您的建議或問題,新版本發布也會在交流社區第一時間通知。
您也可以加入QQ群進行在線技術交流:
Apache License 2.0開源許可協議
為了項目能夠持續下去,期望得到您的支持,您可以掃描下面的二維碼通過支付寶/微信向本項目捐款:

