當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀] 1.前言 嵌入式以太網(wǎng)開發(fā)是一個(gè)很有挑戰(zhàn)性的工作。通過幾個(gè)月的學(xué)習(xí),我個(gè)人覺得大致有兩條途徑。第一條途徑,先通過高級語言熟悉socket編程,例如C#或C++,對bind,listen,connect,accept等函數(shù)熟悉

1.前言

嵌入式以太網(wǎng)開發(fā)是一個(gè)很有挑戰(zhàn)性的工作。通過幾個(gè)月的學(xué)習(xí),我個(gè)人覺得大致有兩條途徑。第一條途徑,先通過高級語言熟悉socket編程,例如C#或C++,對bind,listen,connect,accept等函數(shù)熟悉之后,應(yīng)用 lwIP。第二種途徑,通過分析嵌入式以太網(wǎng)代碼,結(jié)合TCPIP協(xié)議棧規(guī)范逐步實(shí)踐代碼。第一種途徑效率高,開發(fā)周期短,編寫出來的代碼性能穩(wěn)定,第二種途徑花的時(shí)間長,開發(fā)出來的代碼功能不完善,但是由于緊緊結(jié)合TCPIP規(guī)范,可以了解的內(nèi)容較多,適合學(xué)習(xí)。本文通過分析和修改AVRNET源碼,逐步實(shí)現(xiàn)TCPIP協(xié)議棧的各個(gè)子部分,包括ETHERNET部分,ARP部分,IP部分,ICMP部分,UDP部分,TCP部分和HTTP部分。

本文將實(shí)現(xiàn)IP部分和ICMP部分。

1.2 相關(guān)資料

【ENC28J60學(xué)習(xí)筆記】

STM32NET學(xué)習(xí)筆記 ARP和Ethernet部分】

【AVRNET項(xiàng)目(國外)】

【AVR webserver項(xiàng)目(國外)】


1.3 代碼倉庫

【代碼倉庫】——CSDN Code代碼倉庫。


2.IP部分實(shí)現(xiàn)

IP層是TCP和UDP實(shí)現(xiàn)的基礎(chǔ)。IP首部緊跟以太網(wǎng)首部,長度為20字節(jié)。IP首部具有最基本的兩個(gè)任務(wù),

【第一】定義IP包的具體協(xié)議類型,例如ICMP,TCP或UDP等;

【第二】定義IP報(bào)文從哪個(gè)IP地址來和到哪個(gè)IP地址去。

需要強(qiáng)調(diào),在同一個(gè)子網(wǎng)中即同一個(gè)物理網(wǎng)絡(luò)中,IP報(bào)文中的目標(biāo)IP地址和以太網(wǎng)首部中的目標(biāo)MAC地址相對應(yīng),若不在同一個(gè)物理網(wǎng)路中,目標(biāo)IP地址和目標(biāo)MAC地址不同,目標(biāo)MAC地址被路由器的MAC地址替代,意味著通過路由器轉(zhuǎn)發(fā)報(bào)文。在IP首部中還包括很多其他內(nèi)容,需要注意的是IP標(biāo)識符,該標(biāo)識符主要用于區(qū)分IP報(bào)文,最簡單的算法即每發(fā)送一個(gè)IP報(bào)文后IP標(biāo)識符累加。具體通過以下代碼實(shí)現(xiàn)IP首部的填充。

2.1 IP首部填充


  1. //IP首部總長度

  2. #defineIP_HEADER_LEN20

  3. //協(xié)議類型

  4. //ICMP協(xié)議

  5. #defineIP_PROTO_ICMP_V0x01

  6. //TCP協(xié)議

  7. #defineIP_PROTO_TCP_V0x06

  8. //UDP協(xié)議

  9. #defineIP_PROTO_UDP_V0x11

  10. //IPV4版本

  11. #defineIP_V4_V0x40

  12. #defineIP_HEADER_LENGTH_V0x05

  13. //IP版本號位置以太網(wǎng)首部2+6+6

  14. #defineIP_P0x0E

  15. //首部長度

  16. #defineIP_HEADER_VER_LEN_P0x0E

  17. //服務(wù)類型

  18. #defineIP_TOS_P0x0F

  19. //IP總長度

  20. #defineIP_TOTLEN_H_P0x10

  21. #defineIP_TOTLEN_L_P0x11

  22. //IP標(biāo)識

  23. #defineIP_ID_H_P0x12

  24. #defineIP_ID_L_P0x13

  25. //

  26. #defineIP_FLAGS_H_P0x14

  27. #defineIP_FLAGS_L_P0x15

  28. //TTL生存時(shí)間

  29. #defineIP_TTL_P0x16

  30. //IP協(xié)議類型例如ICMPTCPUDP

  31. #defineIP_PROTO_P0x17

  32. //首部校驗(yàn)和

  33. #defineIP_CHECKSUM_H_P0x18

  34. #defineIP_CHECKSUM_L_P0x19

  35. //源IP地址

  36. #defineIP_SRC_IP_P0x1A

  37. //目標(biāo)IP地址

  38. #defineIP_DST_IP_P0x1E

  39. voidip_generate_header(BYTE*rxtx_buffer,WORD_BYTEStotal_length,BYTEprotocol,BYTE*dest_ip)

  40. {

  41. BYTEi;

  42. //校驗(yàn)結(jié)果

  43. WORD_BYTESck;

  44. //版本號和首都長度

  45. rxtx_buffer[IP_P]=IP_V4_V|IP_HEADER_LENGTH_V;

  46. //服務(wù)類型

  47. rxtx_buffer[IP_TOS_P]=0x00;

  48. //總長度

  49. rxtx_buffer[IP_TOTLEN_H_P]=total_length.byte.high;

  50. rxtx_buffer[IP_TOTLEN_L_P]=total_length.byte.low;

  51. //IP標(biāo)識

  52. rxtx_buffer[IP_ID_H_P]=ip_identfier>>8;

  53. rxtx_buffer[IP_ID_H_P]=ip_identfier&0x00ff;

  54. //累加

  55. ip_identfier++;

  56. //標(biāo)志和分片偏移

  57. rxtx_buffer[IP_FLAGS_H_P]=0x00;

  58. rxtx_buffer[IP_FLAGS_L_P]=0x00;

  59. //生存時(shí)間

  60. rxtx_buffer[IP_TTL_P]=128;

  61. //setippackettypetotcp/udp/icmp...

  62. rxtx_buffer[IP_PROTO_P]=protocol;

  63. //設(shè)定目標(biāo)地址和源地址

  64. for(i=0;i<4;i++)

  65. {

  66. rxtx_buffer[IP_DST_IP_P+i]=dest_ip[i];

  67. rxtx_buffer[IP_SRC_IP_P+i]=avr_ip.byte[i];

  68. }

  69. //校驗(yàn)結(jié)果

  70. rxtx_buffer[IP_CHECKSUM_H_P]=0;

  71. rxtx_buffer[IP_CHECKSUM_L_P]=0;

  72. ck.word=software_checksum(&rxtx_buffer[IP_P],sizeof(IP_HEADER),0);

  73. rxtx_buffer[IP_CHECKSUM_H_P]=ck.byte.high;

  74. rxtx_buffer[IP_CHECKSUM_L_P]=ck.byte.low;

  75. }



2.2 IP報(bào)文查詢

IP報(bào)文查詢功能對應(yīng)于ARP報(bào)文查詢功能,通過以太網(wǎng)首部中的最后2個(gè)字節(jié)判斷該報(bào)文是否為IP報(bào)文;如果是IP報(bào)文則繼續(xù)和本機(jī)IP地址相比較。如果兩步檢查均通過則認(rèn)為是合法的IP報(bào)文,當(dāng)然這其中舍棄了IP版本號和首部校驗(yàn)和的檢查,雖然存在某些隱患但并不妨礙實(shí)現(xiàn)基本功能。


  1. BYTEip_packet_is_ip(BYTE*rxtx_buffer)

  2. {

  3. unsignedchari;

  4. //檢查該報(bào)文是否為IP報(bào)文

  5. if(rxtx_buffer[ETH_TYPE_H_P]!=ETH_TYPE_IP_H_V||rxtx_buffer[ETH_TYPE_L_P]!=ETH_TYPE_IP_L_V)

  6. return0;

  7. //檢查該報(bào)文的IP地址是否為本機(jī)IP地址,逐個(gè)檢查

  8. for(i=0;i

  9. {

  10. if(rxtx_buffer[IP_DST_IP_P+i]!=avr_ip.byte[i])

  11. return0;

  12. }

  13. //若該報(bào)文為IP報(bào)文,且目標(biāo)IP地址為本機(jī)地址,返回1

  14. return1;

  15. }



3.ICMP部分實(shí)現(xiàn)

雖然ICMP具有很多的子協(xié)議,但是其中最著名的要數(shù)ping程序,即ICMP回顯請求和應(yīng)答報(bào)文。通過使用ping命令來判斷報(bào)文是否可以到達(dá)目標(biāo)地址。ICMP的實(shí)現(xiàn)是一個(gè)逐步遵守規(guī)則的過程,即向固定的字節(jié)填充數(shù)據(jù)。


  1. //回顯應(yīng)答

  2. #defineICMP_TYPE_ECHOREPLY_V0

  3. //回顯請求

  4. #defineICMP_TYPE_ECHOREQUEST_V8

  5. //ICMP首部長度

  6. #defineICMP_PACKET_LEN40

  7. //ICMP類型

  8. #defineICMP_TYPE_P0x22

  9. //ICMP代碼

  10. #defineICMP_CODE_P0x23

  11. //ICMP首部校驗(yàn)和

  12. #defineICMP_CHECKSUM_H_P0x24

  13. #defineICMP_CHECKSUM_L_P0x25

  14. //ICMP標(biāo)識符

  15. #defineICMP_IDENTIFIER_H_P0x26

  16. #defineICMP_IDENTIFIER_L_P0x27

  17. //ICMP序號

  18. #defineICMP_SEQUENCE_H_P0x28

  19. #defineICMP_SEQUENCE_L_P0x29

  20. #defineICMP_DATA_P0x2A



3.1 ICMP首部填充

ICMP首部填充需要根據(jù)協(xié)議類型填充不同的內(nèi)容,對于回顯請求而言只需在ICMP協(xié)議類型部分填充0即可,當(dāng)然ICMP部分也包括ICMP首部校驗(yàn)和。


  1. voidicmp_generate_packet(BYTE*rxtx_buffer,BYTEtype)

  2. {

  3. BYTEi;

  4. WORD_BYTESck;

  5. //ICMP回顯請求

  6. if(type==ICMP_TYPE_ECHOREQUEST_V)

  7. {

  8. rxtx_buffer[ICMP_TYPE_P]==ICMP_TYPE_ECHOREQUEST_V;

  9. rxtx_buffer[ICMP_CODE_P]=0;

  10. rxtx_buffer[ICMP_IDENTIFIER_H_P]=icmp_id;

  11. rxtx_buffer[ ICMP_IDENTIFIER_L_P ] = 0;

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉