688|0

253

帖子

3

TA的资源

纯净的硅(初级)

楼主
 

【得捷电子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是一个非常强大的网络抓包分析工具,是网络调试的不二法宝,熟练使用,会让网络调试开发工作如虎添翼。

 

点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表