【得捷电子Follow me第4期】基础任务一:静态IP配置、Ping、抓包分析
[复制链接]
【得捷电子Follow me第4期】基础任务一:完成主控板W5500初始化(静态IP配置),并能使用局域网电脑ping通,同时W5500可以ping通互联网站点;通过抓包软件(Wireshark、Sniffer等)抓取本地PC的ping报文,展示并分析。
基础任务一,属于较为基础的网络配置和使用,在Arduino开发环境中,可以很好的完成,下面是具体过程。
一、硬件了解
首先,要从开发板的引脚图中,找到W5500对应的连接引脚:
从上图可以看到,W5500直接连接到了SPI0对应的GPIO,片选为GPIO17,在初始化网卡设备的时候,需要使用到。
二、Arduino IDE添加开发板支持库
支持库的地址,使用以下两者之一均可,不用同时设置:
设置完成,等待自动更新库信息,然后安装对应的板子库即可:
安装完成后,将开发板连接到电脑,初次最好按住BOOT按键不放,再连接到电脑,知道电脑上会出现一个U盘再放开BOOT按键:
然后选择开发板:
要提供W5500有线网络模块的支持,还需要安装如下的库:
要实现再开发板上执行ping功能,则还需要安装下面的库:
下载后,拷贝到Arduino的libraries目录备用。
安装完成后,在Arduino文件菜单中,检查是否都能够被正确识别:
三、静态IP配置
Ethernet库配置好了,默认可以支持DHCP连接,也可以通过初始化设置,来支持进行静态IP、DNS服务器、网关、子网掩码的设置。
具体的代码如下:
#include <SPI.h>
#include <Ethernet.h>
// 网卡mac地址
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xE1, 0xF2, 0xE3 };
// 静态ip地址、DNS服务、网关、子网掩码
// byte ip[] = { 192, 168, 1, 188 };
IPAddress ip(192, 168, 1, 188);
IPAddress myDns(192, 168, 1, 1);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
void setup() {
// 配置串口
Serial.begin(115200);
while (!Serial) {
; // 等待串口连接
}
// 静态IP设置
Serial.println("Ethernet Begin");
Ethernet.init(17);
Ethernet.begin(mac, ip, myDns, gateway, subnet);
// 输出网卡mac地址、IP地址、子网掩码、DNS、网关
Serial.print("My Mac address: ");
byte macBuffer[6]; // 设置mac地址存储buff
Ethernet.MACAddress(macBuffer); // 读取mac地址
for (byte octet = 0; octet < 6; octet++) {
Serial.print(macBuffer[octet], HEX);
if (octet < 5) {
Serial.print('-');
}
}
Serial.println("");
Serial.print("My IP address: ");
Serial.println(Ethernet.localIP());
Serial.print("My subnet: ");
Serial.println(Ethernet.subnetMask());
Serial.print("My DNS address: ");
Serial.println(Ethernet.dnsServerIP());
Serial.print("My GateWay address: ");
Serial.println(Ethernet.gatewayIP());
}
void loop() {
}
因为W5500_Evb_Pico的W5500是SPI接口的有线网络模块,所以最开始调用了SPI和Ethernet库。
然后,配置了对应的mac地址(EE-A1-B2-C3-D4-F5)、静态IP地址(192.168.1.188)、DNS服务(192.168.1.1)、网关(192.168.1.1)、子网掩码(255.255.255.0)
并使用 Ethernet.init(17)来片选 W5500_Evb_Pico 对应的 W5500连接,以及使用 Ethernet.begin(mac, ip, myDns, gateway, subnet) 来设置上述信息。
编译上述代码,下载固件到开发板,运行后,串口输出如下:
此时,可以在电脑上,Ping开发板的IP地址:
在路由器的管理界面中,也可以看到对应mac地址和ip的设备连接成功:
四、DNS解析
要Ping通互联网网站的域名,就需要使用域名解析服务。
在上面的代码中,添加如下的部分,即可使用域名解析服务:
// DNS
#include <Dns.h>
// DNS
DNSClient dnClient;
// DNS解析用的ip
IPAddress dstip;
void setup() {
// 在联网成功以后,添加如下的代码
// 解析域名
dnClient.begin(Ethernet.dnsServerIP());
const char domains[3][20] = { "www.eeworld.com.cn", "www.digikey.cn", "www.digikey.com" };
for (int i = 0; i < 3; i++) {
if (dnClient.getHostByName(domains[i], dstip) == 1) {
Serial.print(domains[i]);
Serial.print(" = ");
Serial.println(dstip);
} else Serial.println(F("dns lookup failed"));
}
}
编译下载后,运行结果如下:
五、Ping 互联网站点
在上一步中,已经成功实现了域名解析,下一步,就可以使用得到的ip地址,进行Ping了。
使用前面安装的EthernetICMP库,来完成Ping的工作,具体添加代码如下:
// ICMP
#include <EthernetICMP.h>
// ICMP Ping
char buffer[256];
SOCKET pingSocket = 0;
EthernetICMPPing ping(pingSocket, (uint16_t)random(0, 255));
// Ping测试
void pingTest() {
EthernetICMPEchoReply echoReply = ping(dstip, 4);
if (echoReply.status == SUCCESS) {
sprintf(buffer,
"Reply[%d] from: %d.%d.%d.%d: bytes=%d time=%ldms TTL=%d",
echoReply.data.seq,
echoReply.addr[0],
echoReply.addr[1],
echoReply.addr[2],
echoReply.addr[3],
REQ_DATASIZE,
millis() - echoReply.data.time,
echoReply.ttl);
} else {
sprintf(buffer, "Echo request failed; %d", echoReply.status);
}
Serial.println(buffer);
}
void setup() {
// 在联网成功以后,添加如下的代码
// 解析域名
dnClient.begin(Ethernet.dnsServerIP());
const char domains[3][20] = { "www.eeworld.com.cn", "www.digikey.cn", "www.digikey.com" };
for (int i = 0; i < 3; i++) {
if (dnClient.getHostByName(domains[i], dstip) == 1) {
Serial.print(domains[i]);
Serial.print(" = ");
Serial.println(dstip);
if (i == 0)
pingTest();
} else Serial.println(F("dns lookup failed"));
}
}
上述代码中,对第一个域名的解析ip,执行ping的操作。
编译下载后,运行结果如下:
六、抓包工具分析ping报文
分析网络报文,使用 Wireshark 非常合适,安装打开后,选择连接到局域网的网卡:
点击后,即可开始进行找抓包分析了。
1. 在电脑上ping开发板:
默认情况下,Wireshark找到所有通信的数据,这样子不好分析,可以用下面的过滤器:
ip.dst==192.168.1.188 and ip.src==192.168.1.100
这个过滤器,表示数据包目标ip是192.168.1.188,也就是开发板的IP地址,而源地址则是本机IP 192.168.1.100,应用后,即可找到实际需要的数据了:
点击一条,进行分析:
可以很清晰的看到,从什么地址Src,到什么地址Dst,以及什么协议Protocol.
2. 从开发板ping电脑:
要在开发板上ping电脑,可以在loop()部分添加如下的代码:
void loop() {
dstip.fromString("192.168.1.100");
pingTest();
delay(1000);
}
上述IP地址为电脑的IP地址。
编译下载后,运行结果如下:
此时,在 Wireshark 中,应用下面的过滤规则:
ip.src==192.168.1.188 and ip.dst==192.168.1.100
可以很清晰的看到,从地址Src 192.168.1.188,到地址Dst 192.168.1.100,以及协议Protocol (Echo (ping) request)。
七、总结
到这里,就完成了W5500_Evb_Pico上的基础网络配置、域名解析、Ping,以及报文分析了。
在此基础上,后续就能进行网络服务和网络请求的任务。
另外,Wireshark是一个非常强大的网络抓包分析工具,是网络调试的不二法宝,熟练使用,会让网络调试开发工作如虎添翼。
|