|
- 費(fèi)了好大勁!本來很簡(jiǎn)單,一個(gè)校驗(yàn)擦!
- 注意,一定要注意
-
- #include "ARP.h"
- #include "IP.H"
- #include "UDP.H"
- #include "ENC28J60_SPI.h"
- #include "ENC28J60_Send_Receive.h"
- #include "ENC28J60_Buff_Operation.h"
- #include "UART.H"
- /*******************************8
-
-
- 發(fā)送UDP數(shù)據(jù)包
- 指定目標(biāo)IP,本地IP,本地端口,目標(biāo)端口
- 還有數(shù)據(jù)大小,什么數(shù)據(jù),第幾個(gè)包
- uchar *MAC_Target_add,//MAC地址。一般情況下由ARP計(jì)算得出
- uchar *IP_Source_add,//IP源地址
- uchar *IP_Target_add,//IP目標(biāo)地址
- uint UDP_Source_Port,UDP源端口
- uint UDP_Target_Port,UDP目標(biāo)端口
- uchar * UDP_Send_Data, UDP數(shù)據(jù)
- uchar UDP_Send_Data_length UDP數(shù)據(jù)長(zhǎng)度
- **********************************/
- //Send_UDP_packet( ); //應(yīng)答
- void Send_UDP_packet( uchar *MAC_Target_add,
- uchar *IP_Target_add,
- uchar *UDP_Source_Port,
- uchar *UDP_Target_Port,
- uchar *UDP_Send_Data,
- uchar UDP_Send_Data_length
- )
- {
- TypeDef_MAC_Frame_H xdata MAC_Frame_H;//MAC定義一個(gè)結(jié)構(gòu)體頭
- TypeDef_IP_Frame_H xdata IP_Frame_H; //IP定義一個(gè)結(jié)構(gòu)體頭
- TypeDef_UDP_Frame_H xdata UDP_Frame_H;//UDP定義數(shù)據(jù)結(jié)構(gòu)
- xdata unsigned long a,b;
- xdata uchar i;
- xdata uint tab[10];
- xdata uint msb,lsb;
- xdata uchar d;
- xdata uint da1;
- xdata uint da2;
- xdata uchar MSB_SUM,LSB_SUM;
- UDP_Frame_Set(&MAC_Frame_H,&IP_Frame_H,&UDP_Frame_H);//設(shè)置UDP相關(guān)參數(shù)
- /*MAC目標(biāo)地址*/
- MAC_Frame_H.Destination_MAC[0]=MAC_Target_add[0];
- MAC_Frame_H.Destination_MAC[1]=MAC_Target_add[1];
- MAC_Frame_H.Destination_MAC[2]=MAC_Target_add[2];
- MAC_Frame_H.Destination_MAC[3]=MAC_Target_add[3];
- MAC_Frame_H.Destination_MAC[4]=MAC_Target_add[4];
- MAC_Frame_H.Destination_MAC[5]=MAC_Target_add[5];
- /*IP目標(biāo)地址*/
- IP_Frame_H.IP_Dstination[0]=IP_Target_add[0];
- IP_Frame_H.IP_Dstination[1]=IP_Target_add[1];
- IP_Frame_H.IP_Dstination[2]=IP_Target_add[2];
- IP_Frame_H.IP_Dstination[3]=IP_Target_add[3];
- //數(shù)據(jù)長(zhǎng)度,
- /*這個(gè)長(zhǎng)度等于IP部首20字節(jié)+UDP部首8字節(jié)+UDP數(shù)據(jù),這里是1字節(jié)*/
- IP_Frame_H.IP_Total_Length[0]=0;//設(shè)置總長(zhǎng)度
- IP_Frame_H.IP_Total_Length[1]=0x1d;//設(shè)置總長(zhǎng)度 //29字節(jié)
- /*計(jì)算IP部首校驗(yàn)和**/
- IP_Frame_H.IP_Check_sum[0]=0;
- IP_Frame_H.IP_Check_sum[1]=0; //先設(shè)置為0
-
-
- msb=IP_Frame_H.IP_Version_Head; //IP的版本號(hào)和IP的部首長(zhǎng)度,默認(rèn)為0X45,版本是4,部首是20字節(jié)
- msb=msb<<8;
- lsb=IP_Frame_H.IP_Tos; //ip的TOS據(jù)我抓包觀察一般是00
- tab[0]=msb+lsb;
- msb=IP_Frame_H.IP_Total_Length[0];//總數(shù)據(jù)報(bào)文長(zhǎng)度
- msb=msb<<8;
- lsb=IP_Frame_H.IP_Total_Length[1];//總數(shù)據(jù)報(bào)文長(zhǎng)度
- tab[1]=msb+lsb;
- msb=IP_Frame_H.IP_Indentification[0];//IP標(biāo)識(shí)字段,標(biāo)識(shí)字段唯一地標(biāo)識(shí)主機(jī)發(fā)送的每一份數(shù)據(jù)報(bào)。通常每發(fā)送一份報(bào)文它的值就會(huì)加1
- msb=msb<<8;
- lsb=IP_Frame_H.IP_Indentification[1];
- tab[2]=msb+lsb;
- msb=IP_Frame_H.IP_Flage_FRAGMENT_OFFSET[0];//標(biāo)志位和片偏移
- msb=msb<<8;
- lsb=IP_Frame_H.IP_Flage_FRAGMENT_OFFSET[1];//標(biāo)志位和片偏移
- tab[3]=msb+lsb;
- msb=IP_Frame_H.IP_TTL; //生存時(shí)間
- msb=msb<<8;
- lsb=IP_Frame_H.IP_Protocol; //協(xié)議類型
- tab[4]=msb+lsb;
- msb=IP_Frame_H.IP_Check_sum[0];//部首校驗(yàn)和
- msb=msb<<8;
- lsb=IP_Frame_H.IP_Check_sum[0];//部首校驗(yàn)和
- tab[5]=msb+lsb;
- msb=IP_Frame_H.IP_Source[0];//32IP位源地址
- msb=msb<<8;
- lsb=IP_Frame_H.IP_Source[1];//32IP位源地址
- tab[6]=msb+lsb;
- msb=IP_Frame_H.IP_Source[2];//32IP位源地址
- msb=msb<<8;
- lsb=IP_Frame_H.IP_Source[3];//32IP位源地址
- tab[7]=msb+lsb;
- msb=IP_Frame_H.IP_Dstination[0];//32位IP目標(biāo)地址
- msb=msb<<8;
- lsb=IP_Frame_H.IP_Dstination[1];//32位IP目標(biāo)地址
- tab[8]=msb+lsb;
- msb=IP_Frame_H.IP_Dstination[2];//32位IP目標(biāo)地址
- msb=msb<<8;
- lsb=IP_Frame_H.IP_Dstination[3];//32位IP目標(biāo)地址
- tab[9]=msb+lsb;
- /**我操原來是沒有清空變量草,費(fèi)了我一天時(shí)間,我說第一次運(yùn)行正確,其后不對(duì)
- 沒有清零!我擦我操!
- 2012年3月7日
- 日照高科園
- 王均偉*/
- a=0;
- b=0;
- for(i=0;i<10;i++)
- {
- a=a+tab[i]; //變量加
- b=a;//暫存A中
- b+=(a>>16)&0x0000ffff; //取高位與地位相加,并且加完了清0高八位
- }
- b=~b; //取反
- da1=b;
- da2=da1;
- da2=(da2>>8)&0x00ff;
- //da=IP_Check_Sum_Verify(&IP_Frame_H); //計(jì)算IP部首校驗(yàn)和
- LSB_SUM=da1;
- MSB_SUM=da2;
- IP_Frame_H.IP_Check_sum[0]=MSB_SUM;
- IP_Frame_H.IP_Check_sum[1]=LSB_SUM; //寫入IP部首校驗(yàn)和
-
- UDP_Frame_H.UDP_Source_Port[0]=UDP_Source_Port[0];
- UDP_Frame_H.UDP_Source_Port[1]=UDP_Source_Port[1];//源端口是8080
- UDP_Frame_H.UDP_Dstination_Port[0]=UDP_Target_Port[0];
- UDP_Frame_H.UDP_Dstination_Port[1]=UDP_Target_Port[1];//目標(biāo)端口是8080
- //for(i=0;i<UDP_Send_Data_length;i++) //等到多數(shù)據(jù)寫入時(shí)采用的測(cè)試只發(fā)送一個(gè)字節(jié)
- UDP_Frame_H.UDP_Data[0]=UDP_Send_Data[0];//數(shù)據(jù)寫入
-
- /* 物理操作 */
- set_send_buffer_add(0x0200,0x023f);//緩沖區(qū)的大小設(shè)定,開始200結(jié)束1fff
-
- write_buffer_add(0x0200,0x0e);//控制字節(jié)
- // MAC
- write_buffer_add(0x0201,MAC_Frame_H.Destination_MAC[0]);//
- write_buffer_add(0x0202,MAC_Frame_H.Destination_MAC[1]);//
- write_buffer_add(0x0203,MAC_Frame_H.Destination_MAC[2]);//
- write_buffer_add(0x0204,MAC_Frame_H.Destination_MAC[3]);//
- write_buffer_add(0x0205,MAC_Frame_H.Destination_MAC[4]);// MAC目的地址
- write_buffer_add(0x0206,MAC_Frame_H.Destination_MAC[5]);//
- write_buffer_add(0x0207, MAC_Frame_H.Source_add_MAC[0]);//
- write_buffer_add(0x0208, MAC_Frame_H.Source_add_MAC[1]);//
- write_buffer_add(0x0209, MAC_Frame_H.Source_add_MAC[2]);// MAC源地址
- write_buffer_add(0x020A, MAC_Frame_H.Source_add_MAC[3]);//
- write_buffer_add(0x020B, MAC_Frame_H.Source_add_MAC[4]);//
- write_buffer_add(0x020C, MAC_Frame_H.Source_add_MAC[5]);//
- write_buffer_add(0x020D, MAC_Frame_H.Type[0]);// MAC類型
- write_buffer_add(0x020E, MAC_Frame_H.Type[1]);//
-
- //IP
- write_buffer_add(0x020F,IP_Frame_H.IP_Version_Head);//
- write_buffer_add(0x0210,IP_Frame_H.IP_Tos);//
- write_buffer_add(0x0211,IP_Frame_H.IP_Total_Length[0]);
- write_buffer_add(0x0212,IP_Frame_H.IP_Total_Length[1]);
- write_buffer_add(0x0213,IP_Frame_H.IP_Indentification[0]);
- write_buffer_add(0x0214,IP_Frame_H.IP_Indentification[1]);
- write_buffer_add(0x0215,IP_Frame_H.IP_Flage_FRAGMENT_OFFSET[0]);
- write_buffer_add(0x0216,IP_Frame_H.IP_Flage_FRAGMENT_OFFSET[1]);
- write_buffer_add(0x0217,IP_Frame_H.IP_TTL);
- write_buffer_add(0x0218,IP_Frame_H.IP_Protocol);
- write_buffer_add(0x0219,IP_Frame_H.IP_Check_sum[0]);
- write_buffer_add(0x021A,IP_Frame_H.IP_Check_sum[1]);
- write_buffer_add(0x021B,IP_Frame_H.IP_Source[0]);
- write_buffer_add(0x021C,IP_Frame_H.IP_Source[1]);
- write_buffer_add(0x021D,IP_Frame_H.IP_Source[2]);
- write_buffer_add(0x021E,IP_Frame_H.IP_Source[3]);
- write_buffer_add(0x021F,IP_Frame_H.IP_Dstination[0]);
- write_buffer_add(0x0220,IP_Frame_H.IP_Dstination[1]);
- write_buffer_add(0x0221,IP_Frame_H.IP_Dstination[2]);
- write_buffer_add(0x0222,IP_Frame_H.IP_Dstination[3]);
- //UDP
- write_buffer_add(0x0223,UDP_Frame_H.UDP_Source_Port[0]);
- write_buffer_add(0x0224,UDP_Frame_H.UDP_Source_Port[1]);
- write_buffer_add(0x0225,UDP_Frame_H.UDP_Dstination_Port[0]);
- write_buffer_add(0x0226,UDP_Frame_H.UDP_Dstination_Port[1]);
- write_buffer_add(0x0227,UDP_Frame_H.UDP_Length[0]);
- write_buffer_add(0x0228,UDP_Frame_H.UDP_Length[1]);
- write_buffer_add(0x0229,UDP_Frame_H.UDP_check_sum[0]);
- write_buffer_add(0x022A,UDP_Frame_H.UDP_check_sum[1]);
- //數(shù)據(jù)
- write_buffer_add(0x022B,UDP_Frame_H.UDP_Data[0]);
- write_ENC28J60_REG_SPI(ECON1,0x0c);//允許發(fā)送,允許接收
- for(;;)
- {
-
- d=read_ENC28J60_REG_SPI(EIR);//讀取數(shù)據(jù)包接收標(biāo)志位
- if((d&0x08)==0x08)break; //發(fā)送完畢??OK退出ifNO死在里面
-
- }
-
-
-
-
- }
- /*****************************
- 只有接收到一個(gè)請(qǐng)求后才會(huì)
- 發(fā)送一個(gè)arp應(yīng)答數(shù)據(jù)包,
- Receive_MAC_Source_add_MAC:源MAC,即本機(jī)MAC
- Receive_ARP_Frame_sender_IP :本機(jī)IP
- Receive_ARP_Frame_Target_IP:目標(biāo)IP
- ******************************/
- void Send_ARP_Answer_packet(uchar *Receive_MAC_Source_add_MAC,
- uchar *Receive_ARP_Frame_sender_IP,
- uchar *Receive_ARP_Frame_Target_IP
- )
- {
- uchar xdata d;
- TypeDef_ARP_Frame xdata ARP_Frame;
- TypeDef_MAC_Frame_H xdata MAC_Frame_H; //定義兩個(gè)類型結(jié)構(gòu)變量
- /*傳遞了兩個(gè)結(jié)構(gòu)傳遞過去,設(shè)置完了在回來用
- 也是我頭回用結(jié)構(gòu)做程序
- */
- ARP_Frame_Set(&ARP_Frame,&MAC_Frame_H);//加載ARP數(shù)據(jù)包
- /*mac目標(biāo)地址*/
- MAC_Frame_H.Destination_MAC[0]=*(Receive_MAC_Source_add_MAC);
- MAC_Frame_H.Destination_MAC[1]=*(Receive_MAC_Source_add_MAC+1);
- MAC_Frame_H.Destination_MAC[2]=*(Receive_MAC_Source_add_MAC+2);
- MAC_Frame_H.Destination_MAC[3]=*(Receive_MAC_Source_add_MAC+3);
- MAC_Frame_H.Destination_MAC[4]=*(Receive_MAC_Source_add_MAC+4);
- MAC_Frame_H.Destination_MAC[5]=*(Receive_MAC_Source_add_MAC+5);
- /*發(fā)送者IP*/
- ARP_Frame.sender_IP[0]=Receive_ARP_Frame_Target_IP[0];
- ARP_Frame.sender_IP[1]=Receive_ARP_Frame_Target_IP[1];
- ARP_Frame.sender_IP[2]=Receive_ARP_Frame_Target_IP[2];
- ARP_Frame.sender_IP[3]=Receive_ARP_Frame_Target_IP[3];
- /*mac目標(biāo)*/
- ARP_Frame.Target_MAC[0]=*(Receive_MAC_Source_add_MAC);
- ARP_Frame.Target_MAC[1]=*(Receive_MAC_Source_add_MAC+1);
- ARP_Frame.Target_MAC[2]=*(Receive_MAC_Source_add_MAC+2);
- ARP_Frame.Target_MAC[3]=*(Receive_MAC_Source_add_MAC+3);
- ARP_Frame.Target_MAC[4]=*(Receive_MAC_Source_add_MAC+4);
- ARP_Frame.Target_MAC[5]=*(Receive_MAC_Source_add_MAC+5);
- /*目標(biāo)IP*/
- ARP_Frame.Target_IP[0]=Receive_ARP_Frame_sender_IP[0];
- ARP_Frame.Target_IP[1]=Receive_ARP_Frame_sender_IP[1];
- ARP_Frame.Target_IP[2]=Receive_ARP_Frame_sender_IP[2];
- ARP_Frame.Target_IP[3]=Receive_ARP_Frame_sender_IP[3];
- set_send_buffer_add(0x0200,0x023f);//緩沖區(qū)的大小設(shè)定,開始200結(jié)束1fff
-
- write_buffer_add(0x0200,0x0e);//控制字節(jié)
- write_buffer_add(0x0201,MAC_Frame_H.Destination_MAC[0]);//
- write_buffer_add(0x0202,MAC_Frame_H.Destination_MAC[1]);//
- write_buffer_add(0x0203,MAC_Frame_H.Destination_MAC[2]);//
- write_buffer_add(0x0204,MAC_Frame_H.Destination_MAC[3]);//
- write_buffer_add(0x0205,MAC_Frame_H.Destination_MAC[4]);// MAC目的地址
- write_buffer_add(0x0206,MAC_Frame_H.Destination_MAC[5]);//
- write_buffer_add(0x0207, MAC_Frame_H.Source_add_MAC[0]);//
- write_buffer_add(0x0208, MAC_Frame_H.Source_add_MAC[1]);//
- write_buffer_add(0x0209, MAC_Frame_H.Source_add_MAC[2]);// MAC源地址
- write_buffer_add(0x020A, MAC_Frame_H.Source_add_MAC[3]);//
- write_buffer_add(0x020B, MAC_Frame_H.Source_add_MAC[4]);//
- write_buffer_add(0x020C, MAC_Frame_H.Source_add_MAC[5]);//
- write_buffer_add(0x020D, MAC_Frame_H.Type[0]);// MAC類型
- write_buffer_add(0x020E, MAC_Frame_H.Type[1]);//
-
- write_buffer_add(0x020F,ARP_Frame.Hardware_type[0]);//
- write_buffer_add(0x0210,ARP_Frame.Hardware_type[1]);//
- write_buffer_add(0x0211,ARP_Frame.Protocol_type[0]);
- write_buffer_add(0x0212,ARP_Frame.Protocol_type[1]);
- write_buffer_add(0x0213,ARP_Frame.Hardware_address_length);
- write_buffer_add(0x0214,ARP_Frame.Protocol_address_length);
- write_buffer_add(0x0215,ARP_Frame.Operation_code[0]);
- write_buffer_add(0x0216,ARP_Frame.Operation_code[1]);
- write_buffer_add(0x0217,ARP_Frame.sender_MAC[0]);
- write_buffer_add(0x0218,ARP_Frame.sender_MAC[1]);
- write_buffer_add(0x0219,ARP_Frame.sender_MAC[2]);
- write_buffer_add(0x021A,ARP_Frame.sender_MAC[3]);
- write_buffer_add(0x021B,ARP_Frame.sender_MAC[4]);
- write_buffer_add(0x021C,ARP_Frame.sender_MAC[5]);
- write_buffer_add(0x021D,ARP_Frame.sender_IP[0]);
- write_buffer_add(0x021E,ARP_Frame.sender_IP[1]);
- write_buffer_add(0x021F,ARP_Frame.sender_IP[2]);
- write_buffer_add(0x0220,ARP_Frame.sender_IP[3]);
- write_buffer_add(0x0221,ARP_Frame.Target_MAC[0]);
- write_buffer_add(0x0222,ARP_Frame.Target_MAC[1]);
- write_buffer_add(0x0223,ARP_Frame.Target_MAC[2]);
- write_buffer_add(0x0224,ARP_Frame.Target_MAC[3]);
- write_buffer_add(0x0225,ARP_Frame.Target_MAC[4]);
- write_buffer_add(0x0226,ARP_Frame.Target_MAC[5]);
- write_buffer_add(0x0227,ARP_Frame.Target_IP[0]);
- write_buffer_add(0x0228,ARP_Frame.Target_IP[1]);
- write_buffer_add(0x0229,ARP_Frame.Target_IP[2]);
- write_buffer_add(0x022A,ARP_Frame.Target_IP[3]);
- write_ENC28J60_REG_SPI(ECON1,0x0c);//允許發(fā)送,允許接收
- for(;;)
- {
-
- d=read_ENC28J60_REG_SPI(EIR);//讀取數(shù)據(jù)包接收標(biāo)志位
- //SendOneByte(d);調(diào)試
- if((d&0x08)==0x08)break; //發(fā)送完畢??OK退出ifNO死在里面
-
- }
-
- }
復(fù)制代碼
|
|