移植及使用說(shuō)明
協(xié)議棧支持主流的ARM Cortex系列MCU,支持Keil MDK、IAR等常見(jiàn)IDE。移植的核心工作就是完成RTOS模擬層的編寫及適配,詳細(xì)的移植說(shuō)明請(qǐng)參考《onps網(wǎng)絡(luò)協(xié)議棧移植及使用說(shuō)明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
本說(shuō)明提供了STM32F103RCT6及STM32F407VET6兩種硬件平臺(tái)的移植樣例,每種樣例分別針對(duì)RT-Thread和ucosii兩種RTOS。樣例工程經(jīng)過(guò)了嚴(yán)格的內(nèi)部測(cè)試,可以直接使用。 ????如果你沒(méi)有太多時(shí)間,或者樣例工程與你的目標(biāo)平臺(tái)并不匹配,你可以直接參考協(xié)議棧移植的一般性指導(dǎo)文件《onps棧移植手冊(cè)》:
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
協(xié)議棧開(kāi)發(fā)的一般性指導(dǎo)文件請(qǐng)參考 ????《onps棧API接口手冊(cè)》:
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棧用戶使用手冊(cè)》:
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
許可協(xié)議:Apache License 2.0開(kāi)源許可協(xié)議。
onps簡(jiǎn)介
onps是一個(gè)開(kāi)源且完全自主開(kāi)發(fā)的國(guó)產(chǎn)網(wǎng)絡(luò)協(xié)議棧,適用于資源受限的單片機(jī)系統(tǒng),提供完整地ethernet/ppp/tcp/ip協(xié)議族實(shí)現(xiàn),同時(shí)提供sntp、dns、ping等網(wǎng)絡(luò)工具,支持以太網(wǎng)環(huán)境下dhcp動(dòng)態(tài)ip地址申請(qǐng),也支持動(dòng)態(tài)及靜態(tài)路由表。 ????協(xié)議棧還封裝實(shí)現(xiàn)了一個(gè)伯克利套接字(Berkeley sockets)層。 ????該層并沒(méi)有完全按照Berkeley sockets標(biāo)準(zhǔn)設(shè)計(jì)實(shí)現(xiàn),而是我根據(jù)以往socket編程經(jīng)驗(yàn),以方便用戶使用、簡(jiǎn)化用戶編碼為設(shè)計(jì)目標(biāo),重新聲明并定義了一組常見(jiàn)socket接口函數(shù):
socket:創(chuàng)建一個(gè)socket,目前僅支持udp和tcp兩種類型
close:關(guān)閉一個(gè)socket,釋放當(dāng)前占用的協(xié)議棧資源
connect:與目標(biāo)tcp服務(wù)器建立連接(阻塞型)或綁定一個(gè)固定的udp服務(wù)器地址
connect_nb:與目標(biāo)tcp服務(wù)器建立連接(非阻塞型)
is_tcp_connected:獲取當(dāng)前tcp鏈路的連接狀態(tài)
send:數(shù)據(jù)發(fā)送函數(shù),tcp鏈路下為阻塞型
send_nb:數(shù)據(jù)發(fā)送函數(shù),非阻塞型
is_tcp_send_ok:數(shù)據(jù)是否已成功送達(dá)tcp鏈路的對(duì)端(收到tcp ack報(bào)文)
sendto:udp數(shù)據(jù)發(fā)送函數(shù),發(fā)送數(shù)據(jù)到指定目標(biāo)地址
recv:數(shù)據(jù)接收函數(shù),udp/tcp鏈路通用
recvfrom:數(shù)據(jù)接收函數(shù),用于udp鏈路,接收數(shù)據(jù)的同時(shí)函數(shù)會(huì)返回?cái)?shù)據(jù)源的地址信息
socket_set_rcv_timeout:設(shè)定recv()函數(shù)接收等待的時(shí)長(zhǎng),單位:秒
bind:綁定一個(gè)固定端口、地址
listen:tcp服務(wù)器進(jìn)入監(jiān)聽(tīng)狀態(tài)
accept:接受一個(gè)到達(dá)的tcp連接請(qǐng)求
tcpsrv_recv_poll:tcp服務(wù)器專用函數(shù),等待任意一個(gè)或多個(gè)tcp客戶端數(shù)據(jù)到達(dá)信號(hào)
socket_get_last_error:獲取socket最近一次發(fā)生的錯(cuò)誤信息
socket_get_last_error_code:獲取socket最近一次發(fā)生的錯(cuò)誤編碼
協(xié)議棧簡(jiǎn)化了傳統(tǒng)BSD socket編程需要的一些繁瑣操作,將一些不必要的操作細(xì)節(jié)改為底層實(shí)現(xiàn),比如select/poll模型、阻塞及非阻塞讀寫操作等。 ????簡(jiǎn)化并不意味著推翻,socket接口函數(shù)的基本定義、主要參數(shù)、使用方法并沒(méi)有改變,你完全可以根據(jù)以往經(jīng)驗(yàn)及編程習(xí)慣快速上手并熟練使用onps棧sockets。 ????無(wú)須過(guò)多關(guān)注協(xié)議棧底層,利用socket api編程即可完全滿足復(fù)雜通訊應(yīng)用的需求,而不像LwIp一樣需要使用它自定義的一組接口函數(shù)才能達(dá)成同樣的目標(biāo)。 ????為了適應(yīng)單片機(jī)系統(tǒng)對(duì)內(nèi)存使用極度變態(tài)的苛刻要求,onps協(xié)議棧在設(shè)計(jì)之初即考慮采用寫時(shí)零復(fù)制(zero copy)技術(shù)。用戶層數(shù)據(jù)在向下層協(xié)議傳遞過(guò)程中,協(xié)議棧采用buf list鏈表技術(shù)將它們鏈接到一起,直至將其發(fā)送出去,均無(wú)須任何內(nèi)存復(fù)制操作。 ????另外,協(xié)議棧采用buddy算法提供安全、可靠的動(dòng)態(tài)內(nèi)存管理功能,以期最大限度地提高協(xié)議棧運(yùn)行過(guò)程中的內(nèi)存利用率并盡可能地減少內(nèi)存碎片。 ????不同于本世紀(jì)00到10年代初,單片機(jī)的應(yīng)用場(chǎng)景中ucosii等rtos尚未大規(guī)模普及,前后臺(tái)系統(tǒng)還大行其道的時(shí)代,現(xiàn)如今大部分的應(yīng)用場(chǎng)景下開(kāi)發(fā)人員選擇使用rtos已成為主流。 ????因此,協(xié)議棧在設(shè)計(jì)之初即不支持前后臺(tái)模式,其架構(gòu)設(shè)計(jì)建立在時(shí)下流行的rtos(RT-Thread、ucosii/iii等)之上。協(xié)議棧移植的主要工作也就自然是針對(duì)不同rtos編寫相關(guān)os適配層功能函數(shù)了。 ????當(dāng)然,如果你有著極其特定的應(yīng)用場(chǎng)景,需要將onps棧移植到采用前后臺(tái)模式的單片機(jī)上,我的建議是保留tcp/udp之下協(xié)議層的通訊處理邏輯,調(diào)整上層的系統(tǒng)架構(gòu)使其適應(yīng)目標(biāo)系統(tǒng)運(yùn)行模式。
軟件架構(gòu)
onps棧設(shè)計(jì)實(shí)現(xiàn)了一套完整的tcp/ip協(xié)議模型。從數(shù)據(jù)鏈路層到ip層,再到tcp/udp層以及之上的伯克利socket層,最后是用戶自己的通訊應(yīng)用層,onps棧實(shí)現(xiàn)了全棧覆蓋,能夠滿足絕大部分的網(wǎng)絡(luò)編程需求。其架構(gòu)如下:
可以看出,其與傳統(tǒng)的網(wǎng)絡(luò)編程模型并沒(méi)有什么不同,用戶仍然是繼續(xù)利用socket api編寫常見(jiàn)的tcp及udp網(wǎng)絡(luò)應(yīng)用。同時(shí)你還可以利用協(xié)議棧提供的幾個(gè)網(wǎng)絡(luò)工具進(jìn)行網(wǎng)絡(luò)校時(shí)、dns查詢等操作。
目錄結(jié)構(gòu):
編輯:黃飛
?
評(píng)論