歡迎來到唯一的 picoTCP 儲存庫。
picoTCP 是一種小型模組化 TCP/IP 堆疊,專為嵌入式系統和物聯網而設計。它由Altran 智慧系統公司積極開發。
該程式碼是根據 GNU GPL v2 和 GNU GPL v3 的條款發布的。保留一些權利。版權所有者可自行決定是否適用其他許可證。
透過閱讀我們的 GitHub wiki 上的入門指南,了解如何在專案中使用 picoTCP。
如需了解更多信息,請發送電子郵件給我們,或透過 Twitter、Facebook 或 Reddit 與我們聯繫。
想了解 picoTCP 的程式碼品質嗎?查看我們的 TiCS 分數
功能測試: - 單元測試: - RFC 合規性: - TICS 品質: Coverity Scan 建置狀態:
透過保持介面簡單,向新平台和作業系統的移植工作量非常低。給你一個指示:移植到新平台可以在 3 天或更短的時間內完成,新作業系統可以在一天內完成,如果你真的很瘋狂,你可以在一個晚上完成初始移植。不同的平台意味著不同的編譯器,這就是為什麼我們不斷地使用一堆編譯器來編譯我們的堆疊。以下列表顯示了一些目前支援的平台、裝置驅動程式和編譯器。
picoTCP 運作平台:ARM Cortex-M 系列(ST Micro STM、NXP LPC、TI Stellaris、Freescale K64F)、ARM ARM9 系列(ST Micro STR9)、Texas Instruments(MSP430)、Microchip(PIC24、PIC32)、Atmel( AVR 8位元)、Linux(使用者空間(TUN/TAP)、核心空間)、Windows(使用者空間(TAP))
picoTCP 所使用的網路設備:BCM43362 (IEEE 802.11)、MRF24WG (IEEE 802.11)、LPC 乙太網路ENET/EMAC (IEEE 802.3)、Stellaris 乙太網路(IEEE 802.3)、STM32 乙太網路( 802.3)、 USB CDC-ECM (CDC1.2)、PPP、虛擬驅動程式(TUN/TAP、VDE、Libpcap)
(RT)OSes picoTCP 已整合至:無作業系統/裸機、FreeRTOS、mbed-RTOS、Frosted、linux/POSIX、MS DOS、MS Windows
picoTCP 已與以下庫整合:wolfSSL、mbedTLS、Mongoose RESTful 庫、MicroPython
picoTCP 編譯器:GCC、Clang、TCC、ARM-RCVT、IAR、XC-16、XC-32、MSP-GCC、AVR-GCC
不幸的是,我們無法發布所有程式碼,因為有些部分依賴不相容 GPL 的程式碼或二進位文件,有些部分是根據商業合約開發的,有些部分包含非常粗糙的概念驗證程式碼。如果您想了解有關商業許可下的可用性的更多信息,或者使用我們的專家服務進行移植或驅動程式開發的可能性,請隨時透過 [email protected] 與我們聯繫。
你最喜歡的不在名單中?請參閱 wiki,了解有關如何將 picoTCP 移植到新平台的資訊和範例!
功能在 picoTCP 中作為模組開發,讓您在應用程式中選擇所需的功能。這會產生盡可能最小的堆棧,同時仍符合網路標準。下面的示意圖概述了所有已實現的協定。
本範例使用 Ubuntu 14.04。它也適用於其他 Linux 發行版,但您可能需要更改一些套件名稱。請參閱設定環境以取得更多資訊。
sudo apt-get install git check vde2 libvdeplug2-dev libpcap0.8-dev openvpn wireshark
git clone https://github.com/tass-belgium/picotcp
cd picotcp
make TAP=1
cd ..
然後建立一個新目錄,例如example
,並建立一個包含以下內容的檔案: //: # (下面的程式碼是透過我們的CI 提取的- 請保留程式碼提取器註解不變!) //: # (程式碼提取器啟動)
#include
#include
#include
#include
#include
#define NUM_PING 10
static int finished = 0 ;
/* gets called when the ping receives a reply, or encounters a problem */
void cb_ping ( struct pico_icmp4_stats * s )
{
char host [ 30 ];
pico_ipv4_to_string ( host , s -> dst . addr );
if ( s -> err == 0 ) {
/* if all is well, print some pretty info */
printf ( "%lu bytes from %s: icmp_req=%lu ttl=%lu time=%lu msn" , s -> size ,
host , s -> seq , s -> ttl , ( long unsigned int ) s -> time );
if ( s -> seq >= NUM_PING )
finished = 1 ;
} else {
/* if something went wrong, print it and signal we want to stop */
printf ( "PING %lu to %s: Error %dn" , s -> seq , host , s -> err );
finished = 1 ;
}
}
int main ( void ){
int id ;
struct pico_ip4 ipaddr , netmask ;
struct pico_device * dev ;
/* initialise the stack. Super important if you don't want ugly stuff like
* segfaults and such! */
pico_stack_init ();
/* create the tap device */
dev = pico_tap_create ( "tap0" );
if (! dev )
return -1 ;
/* assign the IP address to the tap interface */
pico_string_to_ipv4 ( "192.168.5.4" , & ipaddr . addr );
pico_string_to_ipv4 ( "255.255.255.0" , & netmask . addr );
pico_ipv4_link_add ( dev , ipaddr , netmask );
printf ( "starting pingn" );
id = pico_icmp4_ping ( "192.168.5.5" , NUM_PING , 1000 , 10000 , 64 , cb_ping );
if ( id == -1 )
return -1 ;
/* keep running stack ticks to have picoTCP do its network magic. Note that
* you can do other stuff here as well, or sleep a little. This will impact
* your network performance, but everything should keep working (provided
* you don't go overboard with the delays). */
while ( finished != 1 )
{
usleep ( 1000 );
pico_stack_tick ();
}
printf ( "finished !n" );
return 0 ;
}
現在我們可以透過運行來編譯它並連結它
gcc -c -o main.o -I../picotcp/build/include main.c
gcc -o main.elf main.o ../picotcp/build/lib/libpicotcp.a
接下來我們將建立一個持久的分流設備 - 一個虛擬網路連接埠。您不需要每次都重複此操作,設備將一直存在,直到您重新啟動,或直到您執行sudo tunctl -d tap0
sudo tunctl -u < username >
sudo ifconfig tap0 192.168.5.5
現在,您應該能夠運行./main.elf
,並看到類似的輸出
Protocol ethernet registered (layer: 2).
Protocol ipv4 registered (layer: 3).
Protocol ipv6 registered (layer: 3).
Protocol icmp4 registered (layer: 4).
Protocol icmp6 registered (layer: 4).
Protocol igmp registered (layer: 4).
Protocol udp registered (layer: 4).
Protocol tcp registered (layer: 4).
Device tap0 created.
Assigned ipv4 192.168.5.4 to device tap0
starting ping
64 bytes from 192.168.5.5: icmp_req=1 ttl=64 time=5 ms
64 bytes from 192.168.5.5: icmp_req=2 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=3 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=4 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=5 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=6 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=7 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=8 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=9 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=10 ttl=64 time=0 ms
finished !
當應用程式運行時,您也可以運行
ping 192.168.5.4
向另一個方向發送 ping。
運行wireshark,並嗅探tap0介面。然後再次運行./main.elf
,看看會發生什麼。您應該會看到從 picoTCP 到 Linux 的 ARP 請求以及回覆。之後,您應該會看到來回的 ping 請求和回覆。
請注意,有時您可能會看到很多其他內容,IPv6 路由器請求、各種廣播、mDNS、DNS-SD 等- 當您的Linux 注意到新的網路介面已啟動並開始各種發現時,您就會看到這些內容。對於持久性 TAP 設備,這種情況通常只會在您第一次啟動應用程式時發生。啟動一個新的wireshark捕獲,然後再次啟動應用程序,現在應該乾淨多了。
現在您可以對main.c
檔案進行一些更改,並進行一些實驗!保留一些 ping 的統計資料(最大、最小、平均時間)。開啟 UDP 套接字,將一些內容傳送到 Linux 上的 netcat 實例。或建立一個基本的連接埠掃描器,查看您的電腦上開啟了哪些連接埠。
這只是一個非常快速的概述,更多資訊可以在我們的 wiki 中找到。
非常歡迎貢獻者。報告錯誤,提出改進文檔的方法,或編寫一些新程式碼。
但請注意,在接受您的程式碼之前,我們會要求您簽署我們的貢獻者授權協議。您的程式碼仍然受您的版權保護,並且將始終在 GPLv2 和 GPLv3 下可用。但是,此 CLA 使我們能夠在其他許可證(包括我們的商業許可證)下使用 picoTCP(包括來自像您這樣的外部貢獻者的程式碼)。透過做商業項目,我們可以繼續投資 picoTCP 的品質和功能。