当前位置: 首页 > news >正文

W5100S-EVB-PICO主动PING主机IP检测连通性(十)

前言

        上一章节我们用我们开发板在UDP组播模式下进行数据回环测试,本章我们用开发板去主动ping主机IP地址来检测与该主机之间网络的连通性。

什么是PING?

        PING是一种命令, 是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接。ping 使用的是ICMP协议,它发送icmp回送请求消息给目的主机。ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机。如果源主机在一定时间内收到应答,则认为主机可达。可以理解为ping命令是ICMP的一种形式,而ICMP属于网络层协议,因而ping也工作在网络层。

连接方式

  • 开发板直连主机
  • 开发板和主机都接在路由器LAN口

PING测试

        我们的W5100S以太网芯片,既可以通过一个socket端口开启IPRAW模式自己组包(ICMP报文)对目标IP进行ping测试,从而在软件上实现ping功能,也可以通过配置SOCKET-less命令相关寄存器,通过SOCKET-less命令直接在硬件上实现ping功能,省去了在软件上组包、解析数据包的烦恼,而且不占用socket端口,非常方便和易于实现。下面我们通过这两种方式分别进行ping测试:

1. 相关代码

1. 通过IPRAW模式实现(软件)

        我们打开库文件PING文件夹里的ping.c文件,我们主要用到这几个函数:ping_auto()、ping_request()、ping_reply()、do_ping()等,ping_request()和ping_reply()主要是ping请求的组包和收到ping回复的数据包解析,用到的数据转换和处理大家自行查看,这里我们主要看下ping_auto()函数,它通过在一个循环里构建一个状态机来对socket状态进行轮询,做出对应处理,如果端口关闭状态,就设置对应端口协议为ICMP协议,然后以IPRAW模式打开;进入IPRAW模式后,发送ping请求,然后判断是否收到或超时,收到就进行解析,之后跳出,超时则跳出,当请求数和回复数相等且为4次时结束大循环,然后将它再封装成do_ping()方便直接调用,如下所示:

/* Ping the Internet automatically. */
void ping_auto(uint8_t sn, uint8_t *addr)
{int32_t len = 0;uint8_t cnt = 0;uint8_t i;for (i = 0; i < 10; i++){if (req == rep && req == 4)break;switch (getSn_SR(sn)){case SOCK_IPRAW:ping_request(sn, addr);req++;while (1){if ((len = getSn_RX_RSR(sn)) > 0){ping_reply(sn, addr, len);sleep_ms(50);rep++;break;}else if (cnt > 200){printf("Request Time out.\r\n");cnt = 0;break;}else{cnt++;sleep_ms(50);}}break;case SOCK_CLOSED:close(sn);setSn_PROTO(sn, IPPROTO_ICMP);if (socket(sn, Sn_MR_IPRAW, 3000, 0) != 0){}while (getSn_SR(sn) != SOCK_IPRAW);sleep_ms(2000);default:break;}
#ifdef PING_DEBUGif (rep != 0){printf(" Ping Request = %d, PING_Reply = %d\r\n", req, rep);if (rep == req)printf(" PING SUCCESS\r\n ");elseprintf(" REPLY_ERROR\r\n ");}
#endif// if(rep==4)break;}
}/* ping response. */
uint8_t ping_request(uint8_t sn, uint8_t *addr)
{uint16_t i;int32_t t;ping_reply_received = 0;PingRequest.Type = PING_REQUEST;    /*Ping-Request*/PingRequest.Code = CODE_ZERO;       /*总是 '0'*/PingRequest.ID = htons(RandomID++); /*设置ping响应ID为随机的整型变量*/PingRequest.SeqNum = htons(RandomSeqNum++);for (i = 0; i < BUF_LEN; i++){PingRequest.Data[i] = (i) % 8;}PingRequest.CheckSum = 0;PingRequest.CheckSum = htons(checksum((uint8_t *)&PingRequest, sizeof(PingRequest)));t = sendto(sn, (uint8_t *)&PingRequest, sizeof(PingRequest), addr, 3000);if (t == 0){printf("\r\n Fail to send ping-reply packet  r\n");}else{printf(" 正在 Ping: %d.%d.%d.%d  \r\n", (addr[0]), (addr[1]), (addr[2]), (addr[3]));}return 0;
}/* Resolving ping reply. */
uint8_t ping_reply(uint8_t s, uint8_t *addr, uint16_t rlen)
{uint16_t tmp_checksum;uint16_t len;uint16_t i;uint8_t data_buf[128];uint16_t port = 3000;PINGMSGR PingReply;len = recvfrom(s, (uint8_t *)data_buf, rlen, addr, &port); /*从目的端接收数据*/if (data_buf[0] == PING_REPLY){PingReply.Type = data_buf[0];PingReply.Code = data_buf[1];PingReply.CheckSum = (data_buf[3] << 8) + data_buf[2];PingReply.ID = (data_buf[5] << 8) + data_buf[4];PingReply.SeqNum = (data_buf[7] << 8) + data_buf[6];for (i = 0; i < len - 8; i++){PingReply.Data[i] = data_buf[8 + i];}tmp_checksum = ~checksum(data_buf, len); /*检查ping回复的次数*/if (tmp_checksum != 0xffff)printf("tmp_checksum = %x\r\n", tmp_checksum);else{printf(" 来自 %d.%d.%d.%d 的回复: ID=%x 字节=%d \r\n",(addr[0]), (addr[1]), (addr[2]), (addr[3]), htons(PingReply.ID), (rlen + 6));ping_reply_received = 1; /*当退出ping回复循环时,设置ping回复标志为1*/}}else if (data_buf[0] == PING_REQUEST){PingReply.Code = data_buf[1];PingReply.Type = data_buf[2];PingReply.CheckSum = (data_buf[3] << 8) + data_buf[2];PingReply.ID = (data_buf[5] << 8) + data_buf[4];PingReply.SeqNum = (data_buf[7] << 8) + data_buf[6];for (i = 0; i < len - 8; i++){PingReply.Data[i] = data_buf[8 + i];}tmp_checksum = PingReply.CheckSum; /*检查ping回复次数*/PingReply.CheckSum = 0;if (tmp_checksum != PingReply.CheckSum){printf(" \n CheckSum is in correct %x shold be %x \n", (tmp_checksum), htons(PingReply.CheckSum));}else{}printf("  Request from %d.%d.%d.%d  ID:%x SeqNum:%x  :data size %d bytes\r\n",(addr[0]), (addr[1]), (addr[2]), (addr[3]), (PingReply.ID), (PingReply.SeqNum), (rlen + 6));ping_reply_received = 1; /* 当退出ping回复循环时,设置ping回复标志为1  */}else{printf(" Unkonwn msg. \n");}return 0;
}void do_ping(uint8_t sn, uint8_t *ip)
{if (req < 4){printf("------------------PING test start-----------------------\r\n");sleep_ms(1000);ping_auto(sn, ip);}else if (req == 4)close(sn);
}

2. 通过SOCKET-less命令实现(硬件)

我们找到SLping()函数,它需要我们传入两个参数:ping测试远程IP地址和ping测试次数,然后我们配置相应的SOCKET-less重传时间、重传次数、远程IP地址、中断屏蔽寄存器,然后根据传入的参数值设置ping次数,传入的值为0则将其设置为数据类型的最大值;接着在for循环里面,设置ping序列号和ID,并开启ping请求发送命令,用Switch状态机轮询中断寄存器,根据中断置位情况进行相应处理,这里分为超时和收到ping应答两个状态(情况),最后统计请求和应答成功、失败数后,进入阻塞;如下所示:

/*** socket-less ping* remote_ip:  ping ip address* ping_count: ping times, if its 0,always request to the max :65535 times.*/
void SLping(uint8_t *remote_ip, uint16_t ping_count)
{uint16_t i;static uint16_t succ_count = 0;setSLRTR(5000); // 5000 * 100us = 500mssetSLRCR(2);setSLPIPR(remote_ip);setSLIMR(0x05);if (ping_count == 0)ping_count = 65535;for (i = 0; i < ping_count; i++){printf("Ping the %d.%d.%d.%d \r\n", remote_ip[0], remote_ip[1], remote_ip[2], remote_ip[3]);setPINGSEQR(RandomSeqNum);setPINGIDR(RandomID);setSLCR(0X01);  // pingsleep_ms(2000); // waitswitch (getSLIR() & 0x07){case PING_INT:printf("Reply from %d.%d.%d.%d : ID: %x SeqNum: %x.\r\n", remote_ip[0], remote_ip[1], remote_ip[2], remote_ip[3], getPINGIDR(), getPINGSEQR());succ_count++;break;case TIMEOUT_INT:printf("Request timeout\r\n");default:break;}RandomID++;RandomSeqNum++;}printf("Ping request: %d, Succ: %d, Fail: %d.\r\n", ping_count, succ_count, (ping_count - succ_count));while (1);
}

主程序只需要初始化相关对应信息后,传入主函数循环调用即可,这里我们要进行ping测试的主机IP为我们开发板同一网段的电脑IP,如下所示:

#define SOCKET_ID 0
#define ETHERNET_BUF_MAX_SIZE (1024 * 2)void network_init(void);wiz_NetInfo net_info = {.mac = {0x00, 0x08, 0xdc, 0x16, 0xed, 0x2e},.ip = {192, 168, 1, 11},.sn = {255, 255, 255, 0},.gw = {192, 168, 1, 1},.dns = {8, 8, 8, 8},.dhcp = NETINFO_STATIC};
wiz_NetInfo get_info;
static uint8_t ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {0,};
static uint8_t remote_ip[4] = {192, 168, 1, 2};int main()                                                          
{   stdio_init_all();sleep_ms(2000);network_init();while(true){do_ping(SOCKET_ID, remote_ip);// SLping(remote_ip, 4);sleep_ms(500);}
}void network_init(void)
{uint8_t temp;wizchip_initialize();printf("W5100s udp client example.\r\n");sleep_ms(2000);wizchip_setnetinfo(&net_info);print_network_information(get_info);sleep_ms(2000);   
}

2. 测试现象

编译烧录后,打开串行监视器,打开wireshark输入过滤条件<icmp>然后开启监听,可以看到在串口打印的配置信息,以及ping测试情况,wireshark的抓包情况,这里是通过软件实现的测试,硬件实现大家自行尝试;测试结果如下图所示:

相关链接

本章例程链接icon-default.png?t=N7T8https://gitee.com/wiznet-hk/w5100s-evb-pico-routine.git

相关文章:

W5100S-EVB-PICO主动PING主机IP检测连通性(十)

前言 上一章节我们用我们开发板在UDP组播模式下进行数据回环测试&#xff0c;本章我们用开发板去主动ping主机IP地址来检测与该主机之间网络的连通性。 什么是PING&#xff1f; PING是一种命令&#xff0c; 是用来探测主机到主机之间是否可通信&#xff0c;如果不能ping到某台…...

使用 Nginx 搭建文件下载服务器

文章目录 一、基础环境二、适用场景三、方法和步骤四、其他说明 版权声明&#xff1a;本文为CSDN博主「杨群」的原创文章&#xff0c;遵循 CC 4.0 BY-SA版权协议&#xff0c;于2023年8月27日首发于CSDN&#xff0c;转载请附上原文出处链接及本声明。 原文链接&#xff1a;http…...

链式栈StackT

C关键词&#xff1a;内部类/模板类/头插 C自学精简教程 目录(必读) C数据结构与算法实现&#xff08;目录&#xff09; 栈的内存结构 空栈&#xff1a; 有一个元素的栈&#xff1a; 多个元素的栈&#xff1a; 成员函数说明 0 clear 清空栈 clear 函数负责将栈的对内存释放…...

Fiddler中 AutoResponder 使用

Fiddler的 AutoResponder &#xff0c;即URL重定向功能非常强大。不管我们做URL重定向&#xff0c;还是做mock测试等&#xff0c;都可以通过该功能进行实践。 下面&#xff0c;小酋就来具体讲下该功能的用法。 Enable rules 启用规则Unmatched requests passthrough 没有匹配…...

77GHz线性调频连续波雷达

文章目录 前言 一、背景 二、优缺点 三、工作原理 四、电路模块设计 4.1.LFMCW信号源 4.2.发射电路 4.3.接收电路 4.4.信号处理器 五、应用 5.1.汽车测距 5.2.军事方面 5.3.气象方面 总结 前言 这篇文章是博主本科期间整理的关于77GHz线性调频连续波雷达的相关资料&#xff0c;…...

YOLOV8改进:更换为MPDIOU,实现有效涨点

1.该文章属于YOLOV5/YOLOV7/YOLOV8改进专栏,包含大量的改进方式,主要以2023年的最新文章和2022年的文章提出改进方式。 2.提供更加详细的改进方法,如将注意力机制添加到网络的不同位置,便于做实验,也可以当做论文的创新点。 2.涨点效果:更换为MPDIOU,实现有效涨点! 目录…...

BookStack开源免费知识库docker-compose部署

BookStack&#xff08;书栈&#xff09;是一个功能强大且易于使用的开源知识管理平台&#xff0c;适用于个人、团队或企业的文档协作和知识共享。 一、BookStack特点 简单易用&#xff1a;BookStack提供了一个直观的用户界面&#xff0c;使用户能够轻松创建、编辑和组织文档多…...

Linux:编译遇到 Please port gnulib freadahead.c to your platform ,怎么破

问题背景 编译m4时遇到以下错误&#xff0c;该怎么解决呢&#xff1f; 解决方法 进入m4的build目录&#xff1a;build/host-m4-1.4.17 输入命令&#xff1a; sed -i s/IO_ftrylockfile/IO_EOF_SEEN/ lib/*.c echo "#define _IO_IN_BACKUP 0x100" >> lib/std…...

three.js(三):three.js的渲染结构

three.js 的渲染结构 概述 three.js 封装了场景、灯光、阴影、材质、纹理和三维算法&#xff0c;不必在直接用WebGL 开发项目&#xff0c;但有的时候会间接用到WebGL&#xff0c;比如自定义着色器。three.js 在渲染三维场景时&#xff0c;需要创建很多对象&#xff0c;并将它…...

客户端读写HBase数据库的运行原理

1.HBase的特点 HBase是一个数据库&#xff0c;与RDMS相比&#xff0c;有以下特点&#xff1a; ① 它不支持SQL ② 不支持事务 ③ 没有表关系&#xff0c;不支持JOIN ④ 有列族&#xff0c;列族下可以有上百个列 ⑤ 单元格&#xff0c;即列值&#xff0c;可以存储多个版本的值&…...

不使用VH6501设备,通过VN1630等普通设备使用canConfigureBusOff函数进行busoff干扰测试

** 特别注意一下,使用这个函数需要你的vector驱动在9.6以上以及支持 ISO CAN FD. ** 函数canConfigureBusOff 可以通过脚本的形式产生bus off,而VH6501可以通过干扰bit位来产生bus off(使用CANoe Demo - CANDisturbanceMain进行Bus Off测试)。 对于函数canConfigureBusOf…...

服务器数据恢复-服务器RAID6硬盘故障离线的数据恢复案例

服务器数据恢复环境&#xff1a; 服务器中有一组由6块磁盘组建的RAID6磁盘阵列。服务器作为WEB服务器使用&#xff0c;上面运行了MYSQL数据库以及存放了网站代码和其他数据文件。 服务器故障&#xff1a; 在服务器运行过程中该raid6阵列中有两块磁盘先后离线&#xff0c;但是管…...

DB2 HADR+TSA运维,TSA添加资源组的命令

Tivoli System Automation&#xff08;TSA&#xff09;是一个高可用性集群管理软件,DB2 TSAHADR高可用方案可以实现DB2 hadr主备的自动检测切换。本文详细介绍了TSA的常用命令&#xff0c;如何把CDC或者DSG添加到TSA集群中&#xff0c;以及TSA的错误分析方法 常用命令&#xf…...

LeetCode-135-分发糖果

题目描述&#xff1a;n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。 相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xff0c;计…...

Viva Workplace Analytics Employee Feedback SU Viva Glint部署方案

目录 一、Viva Workplace Analytics & Employee Feedback SU Viva Glint介绍 二、Viva Glint和Viva Pulse特点和优势 1. 简单易用...

ASIC-WORLD Verilog(14)系统任务

写在前面 在自己准备写一些简单的verilog教程之前&#xff0c;参考了许多资料----Asic-World网站的这套verilog教程即是其一。这套教程写得极好&#xff0c;奈何没有中文&#xff0c;在下只好斗胆翻译过来&#xff08;加点自己的理解&#xff09;分享给大家。 这是网站原文&…...

两台电脑共享文件设置

步骤一&#xff1a;确保网络连接正常&#xff0c;可网线直连。 两台电脑IP设置&#xff0c;例&#xff1a; 步骤二&#xff1a;启用共享功能。 1.在【控制面板】中选择【网络和Internet】&#xff1b; 2.点击【网络和共享中心】&#xff0c;在左侧导航栏中&#xff0c;点击【…...

《C和指针》笔记17:sizeof

sizeof操作符判断它的操作数的类型长度&#xff0c;以字节为单位表示。 操作数既可以是个表达式&#xff08;常常是单个变量&#xff09;&#xff0c; sizeof x上面的式子返回变量x所占据的字节数。 也可以是两边加上括号的类型名。 sizeof(int)上面的式子返回整型变量的字…...

说说大表关联小表

分析&回答 Hive 大表和小表的关联 优先选择将小表放在内存中。小表不足以放到内存中&#xff0c;可以通过bucket-map-join(不清楚的话看底部文章)来实现&#xff0c;效果很明显。 两个表join的时候&#xff0c;其方法是两个join表在join key上都做hash bucket&#xff0c…...

Unity 之 方括号[ ] 的用法以及作用

文章目录 在Unity中&#xff0c;方括号 [ ] 通常用于表示属性、特性&#xff08;Attributes&#xff09;或者元数据&#xff08;Metadata&#xff09;。这些标记提供了附加信息&#xff0c;可以用于修改类、方法、字段等的行为或者在编辑器中进行设置。 以下是一些常见的用法&…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)

第一篇&#xff1a;Liunx环境下搭建PaddlePaddle 3.0基础环境&#xff08;Liunx Centos8.5安装Python3.10pip3.10&#xff09; 一&#xff1a;前言二&#xff1a;安装编译依赖二&#xff1a;安装Python3.10三&#xff1a;安装PIP3.10四&#xff1a;安装Paddlepaddle基础框架4.1…...