[原创]基于嵌入式系统STM32的ARP 网络寻址实战
0赞最近拿到了一款新的嵌入式设备STM32,这款设备比较新颖,非常漂亮,大家看看。
最近无线连接你我他,我就做一下ARP的寻址测试实战。
主要原理:
本开发板上带有DM9000A网卡芯片,DM9000系列网卡芯片在嵌入式开发板上很常见,尤其是有关的网络连接部分,几乎都是采用该芯片实现的,该芯片的电路原理图如下:
ARP协议原理简述
在网络上标识一台计算机,这台计算机必须有一个惟一的地址,这就是人们熟知的IP网硬件设备并不了理解 地址但是以太
IP( 地址,它们寻址必须基于以太网控制器的物理地址,也就是介质访问控制地址MAC)地址来进行。因此,IP地址必须转换(或映射)到物理地址上,这个工作就由ARP议来完成。而从物理地址向 地址解析协IP地址映射是由RARP反向地址解析协议实现的。ARP的工作原理类似日常生活中的”广播找人”。假设节点A要查询与某个IP地址相对应的物理地址,它就向自身所在的子网发送一个包含该IP地址的广播消息(ARP数据包格式),这个广播消息发送给子网上的每一个节点。子网中与要解析的这个IP地址相匹配的节点B将作出回应,并将自己的物理地址发送给节点A,若目标机接收到此请求,它就发送一个ARP应答,这个应答是明确发给请求者的,应答中有MAC地址。接到了这个应答,就知道了目标机的MAC地址,就可以进行以后的通信了。
具体的测试代码如下:
#include "arp.h"
#include <string.h>
#include <stdio.h>
#define packet_len 42
unsigned char ip_addr[4] = { 192, 168, 12, 134 }; //开发板IP
unsigned char host_ip_addr[4] = { 192, 168, 12, 110 }; //目标机IP
unsigned char host_mac_addr[6]={ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; //广播地址
void arp_request(struct arp_frame *parp_frame)
{
int i;
memcpy(parp_frame->d_mac,host_mac_addr,6);
memcpy(parp_frame->s_mac, mac_addr,6);
parp_frame->type=HON(0x0806);
parp_frame->hwtype=HON(0x01);
parp_frame->protocol=HON(0x0800);
parp_frame->hwlen = 0x06;
parp_frame->protolen = 0x04;
parp_frame->opcode = HON(0x01);
for(i=0;i<6;i++)
parp_frame->smac[i]= mac_addr[i];
for(i=0;i<4;i++)
parp_frame->sipaddr[i]= ip_addr[i];
memcpy(parp_frame->dmac,host_mac_addr,6);
for(i=0;i<4;i++)
parp_frame->dipaddr[i]= host_ip_addr[i];
sendpacket( (unsigned char *)parp_frame, packet_len );
}
通过超级终端,就能看到以下的情况:
若没有打印DM9000 LINK ok!就说明没有连上,可能存在网络问题,是不是有很多启发呢。