ยินดีต้อนรับสู่ที่เก็บ picoTCP เพียงหนึ่งเดียว
picoTCP เป็นสแต็ก TCP/IP แบบโมดูลาร์ขนาดเล็กที่ออกแบบมาสำหรับระบบฝังตัวและ Internet of Things ได้รับการพัฒนาอย่างแข็งขันโดย Altran Intelligent Systems
รหัสนี้เผยแพร่ภายใต้เงื่อนไขของ GNU GPL v2 และ GNU GPL v3 สงวนลิขสิทธิ์บางส่วน ใบอนุญาตอื่นๆ อาจนำไปใช้ตามดุลยพินิจของผู้ถือลิขสิทธิ์แต่เพียงผู้เดียว
เรียนรู้วิธีใช้ picoTCP ในโปรเจ็กต์ของคุณโดยอ่าน คู่มือเริ่มต้นใช้งาน บนวิกิ GitHub ของเรา
สำหรับข้อมูลเพิ่มเติมส่งอีเมลถึงเราหรือติดต่อเราทาง Twitter, Facebook หรือ Reddit
สงสัยเกี่ยวกับคุณภาพของโค้ดของ picoTCP ใช่ไหม ตรวจสอบคะแนน TiCS ของเรา
การทดสอบการทำงาน: - การทดสอบหน่วย : - การปฏิบัติตาม RFC : - คุณภาพ TICS : สถานะ Coverity Scan Build:
ด้วยการรักษาอินเทอร์เฟซให้เรียบง่าย ความพยายามในการพอร์ตไปยังแพลตฟอร์มใหม่และ OSses จึงต่ำมาก เพื่อเป็นการบ่งชี้: การย้ายไปยังแพลตฟอร์มใหม่สามารถทำได้ภายใน 3 วันหรือน้อยกว่านั้น, OS ใหม่ในวันเดียว และหากคุณคลั่งไคล้จริงๆ คุณสามารถสร้างพอร์ตเริ่มแรกได้ในเย็นวันเดียว แพลตฟอร์มที่ต่างกัน หมายถึงคอมไพเลอร์ที่แตกต่างกัน นั่นคือเหตุผลที่เรารวบรวมสแต็กของเราอย่างต่อเนื่องด้วยสแต็กจำนวนมาก รายการต่อไปนี้แสดงแพลตฟอร์ม ไดรเวอร์อุปกรณ์ และคอมไพเลอร์ที่รองรับในปัจจุบัน
แพลตฟอร์ม 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 Ethernet ENET/EMAC (IEEE 802.3), Stellaris Ethernet (IEEE 802.3), STM32 Ethernet (IEEE 802.3), Wiznet W5100 (IEEE 802.3), ยูเอสบี CDC-ECM (CDC1.2), PPP, ไดรเวอร์เสมือน (TUN/TAP, VDE, Libpcap)
(RT)OSes picoTCP ได้รับการรวมเข้ากับ : ไม่มี OS / Bare Metal, 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
น่าเสียดายที่เราไม่สามารถปล่อยโค้ดทั้งหมดได้ ao เนื่องจากบางส่วนขึ้นอยู่กับโค้ดหรือไบนารีที่ไม่รองรับ GPL บางส่วนได้รับการพัฒนาภายใต้สัญญาเชิงพาณิชย์ และบางส่วนประกอบด้วยโค้ดพิสูจน์แนวคิดที่หยาบมาก หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับความพร้อมใช้งานภายใต้ใบอนุญาตเชิงพาณิชย์ หรือความเป็นไปได้ในการใช้บริการจากผู้เชี่ยวชาญของเราในการย้ายพอร์ตหรือการพัฒนาไดรเวอร์ โปรดติดต่อเราที่ [email protected]
รายการโปรดของคุณไม่อยู่ในรายการ? ตรวจสอบวิกิเพื่อดูข้อมูลและตัวอย่างเกี่ยวกับวิธีการพอร์ต 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
อีกครั้ง และดูว่าเกิดอะไรขึ้น คุณควรเห็นคำขอ ARP จาก picoTCP ถึง Linux และการตอบกลับ หลังจากนั้นคุณจะเห็นคำขอ ping และตอบกลับไปมา
โปรดทราบว่าบางครั้งคุณอาจเห็นสิ่งอื่นๆ มากมาย การร้องขอเราเตอร์ IPv6 การออกอากาศต่างๆ mDNS, DNS-SD ฯลฯ - นี่คือของคุณเมื่อ Linux ของคุณสังเกตเห็นว่าอินเทอร์เฟซเครือข่ายใหม่ทำงาน และเริ่มการค้นพบทุกประเภท เมื่อใช้อุปกรณ์ TAP แบบถาวร สิ่งนี้มักจะเกิดขึ้นในครั้งแรกที่คุณเริ่มแอปพลิเคชันเท่านั้น เริ่มการจับภาพ wireshark ใหม่ และเริ่มแอปพลิเคชันอีกครั้ง ตอนนี้ควรจะสะอาดกว่านี้มาก
ตอนนี้คุณสามารถทำการเปลี่ยนแปลงกับไฟล์ main.c
และทดลองสักหน่อย! เก็บสถิติการ Ping ของคุณ (สูงสุด ต่ำสุด เวลาเฉลี่ย) เปิดซ็อกเก็ต UDP ส่งบางสิ่งไปยังอินสแตนซ์ netcat บน linux ของคุณ หรือสร้างเครื่องสแกนพอร์ตพื้นฐาน ดูว่าพอร์ตใดบ้างที่เปิดอยู่บนเครื่องของคุณ
นี่เป็นเพียงภาพรวมโดยย่อ สามารถดูข้อมูลเพิ่มเติมได้ในวิกิของเรา
ผู้ร่วมให้ข้อมูลมีความยินดีเป็นอย่างยิ่ง รายงานข้อบกพร่อง แนะนำวิธีปรับปรุงเอกสารของเรา หรือเขียนโค้ดใหม่
อย่างไรก็ตาม โปรดทราบว่าก่อนที่จะยอมรับรหัสของคุณ เราจะขอให้คุณลงนามในข้อตกลงใบอนุญาตช่างภาพของเรา รหัสของคุณยังคงอยู่ภายใต้ลิขสิทธิ์ของคุณและจะสามารถใช้ได้ภายใต้ GPLv2 และ GPLv3 เสมอ อย่างไรก็ตาม CLA นี้ช่วยให้เราสามารถใช้ picoTCP (รวมถึงโค้ดจากผู้มีส่วนร่วมภายนอกเช่นคุณ) ภายใต้ใบอนุญาตอื่น ๆ รวมถึงใบอนุญาตเชิงพาณิชย์ของเรา การทำโครงการเชิงพาณิชย์ทำให้เราสามารถลงทุนในคุณภาพและคุณสมบัติของ picoTCP ต่อไปได้