51单片机简单Ping的实现

来源:网络时间:2022-02-07 14:19:05

Ping(Packet Internet Gopher分组网间网探测器)利用了ICMP(Internet Control Message Protocol互联网控制报文协议)协议的“回响”功能来实现主机/服务器是否有应答的测试。ICMP为路由器和主机提供了正常情况以外的通信,它是IP的一个完整的组成部分。ICMP包括降低传送速率的源站抑制报文、请求主机改变选路表的重定向报文以及主机可用来决定目的站是否可达的回送请求/回答报文。ICMP报文在IP数据报的数据区中传送。当主机/服务器接收到具有回响类型的ICMP报文时,就响应1个“回响应答”报文。本地机器收到该报文并确认之后即可认为该主机/服务器处于活动状态,从而本机与远程主机/服务器之间能够连通,也可以互相通信。 仿照DOS下的ping命令并根据51单片机资源现状,我实现了一个简单的ping功能。它的使用方法如下: (1)单片机-->PC机 在Shell里使用“ping XXX.XXX.XXX.XXXcr>”,如果连通,显示“Reply from XXX.XXX.XXX.XXX: bytes=32 TTL=XXX”,否则,显示“Request timed out.(XXX.XXX.XXX.XXX)”。 (2)PC机-->单片机 按照DOS里的常规操作即可 每个ping命令重复测试8次,即显示8次信息。 注意到显示内容与PC机上稍有不同,这是由于此处ping工作在多任务单窗口环境下,为了区分响应发送源,有必要增加源IP地址信息。另外,由于51资源限制,取消了time参数(time是本机与对方主机往返一次所用时间)显示。具体简化内容如下: (1)只支持“ping+IP地址”命令格式,域名方式和其他可选项均不可用 (2)固定32字节测试包 (3)不计算本机与对方主机往返一次所用时间,测试用时为1到2秒 总之,经过简化的ping能够完成最基本的连通测试功能。 0 8 16 31 ------------------------------------------------ | 类型(8或0) | 代码(0) | 校验和 | ------------------------------------------------ | 标识符 | 序号 | ------------------------------------------------ | 可选数据 | ------------------------------------------------ | 。。。 | ------------------------------------------------ 图1 ICMP回送请求或回答报文格式 PingCycle | 定时操作 V PingCmd ---------------- -------------- -------->| PingRequest|----------->| | 命令 | | 请求 | | | | | | | A | | B | | | | | --------|PingEcho |-----------|PingAnswer | 回显 ---------------- 应答 -------------- 图2 A Ping B 过程(全双工操作,反过来亦可,未画出反向过程) 图1所示为ICMP回送请求/回答报文格式(即Ping包格式),在实现网卡驱动程序后,Ping的实现简化为填写报文(详见伪代码清单)。如图2所示,完整ping过程我主要用4个函数实现。Ping请求(PingRequest)、Ping应答(PingAnswer)、收到应答后回显(PingEcho)、定时操作(PingCycle)。 PingRequest完成Ping请求。当输入Ping命令后,调用此函数,发出请求包。 PingAnswer完成Ping应答。它工作在后台,每当收到发给自己IP的请求包就自动应答。 PingEcho显示应答信息。每当收到应答就立即显示相关信息。 PingCycle定时操作pingbuf记录缓冲区。每秒钟扫描一次,并根据当前情况和状态进行状态变迁。

- ---------------------------------------------------- | | 状态(status) | 次数(times) | 内存句柄(memhandle) | | ---------------------------------------------------- N个| 。。。 | | ---------------------------------------------------- | | 状态(status) | 次数(times) | 内存句柄(memhandle) | - ---------------------------------------------------- N=MaxLenPingBuf 图3 pingbuf记录缓冲区格式

IP地址要先转换成MAC地址才能在以太网上传输,如果ARP缓存里没有对应项,则需要较长时间查找(网络传输时间相对于CPU时间)。为了不阻塞进程,我设计了一个pingbuf记录缓冲区,如图3所示。此表1秒钟被查询一次,根据当前情况改变状态。它包括状态、次数、内存句柄三个域。“次数”字段指示测试剩余数,为0表示测完,同时改变状态为0以表明此记录项现在空闲。“内存句柄”字段保存ICMP报文缓冲区首址指针。“状态”字段记录状态号,含义如下: 0---空闲 1---已发出但无应答 2---已发出且应答 3---等ARP 4---第一次准备发(用于同步1秒时钟) 状态变迁图如图4所示。 图4略,详见伪代码清单PingCycle,请自行画出状态图。 这个实现里还使用了ping命令处理、IP地址转换、校验和计算等辅助程序,详见伪代码清单。IP协议使用统一的CheckSum算法计算和验证数据报的首部校验和。将首部视为一个16位的整数序列,并定义校验和是首部中所有16位整数的和的二进制反码。同样和数及补码也被定义使用二进制反码算法。所有TCP/IP协议的校验和计算和数据包的校验均由CheckSum子程序完成。不过需要注意的是TCP和UDP的校验需要加上伪头部。需要首部校验和计算及验证的包为:IP、ICMP、UDP、TCP。相互间的差别仅在于求和数据不同,算法都采用CheckSum。详见源程序清单。(提示:IP包头从版本号、首部长度、服务类型到目的站IP地址(如果不含IP选项)共20字节;ICMP校验和只覆盖ICMP报文。对比UDP、TCP伪首部和IP首部相似点,可以不必单独分配伪首部缓冲区,而直接利用IP缓冲区计算校验和。观察知IP头邻接数据,采取一定措施可实现直接计算。即先将IP寿命字段清0,协议字段赋相应值,校验和赋UDP/TCP包长度值,并加上12,表示伪首部的3长字长度,完成计算后向IP包首部添入正确寿命、校验和值,见图5。)

0 8 16 31 0 8 16 31 ---------------------------- --------------------------- | 寿命 | 协议 | 首部校验和 | | 源站IP地址 | ---------------------------- --------------------------- | 源站IP地址 | | 目的站IP地址 | ---------------------------- --------------------------- | 目的站IP地址 | | 零 | 协议 | UDP/TCP长度 | ---------------------------- --------------------------- | 数据 | | UDP/TCP包数据 | ---------------------------- --------------------------- IP包格式(局部) UDP、TCP伪首部+数据格式 图5 IP包格式(局部)和UDP、TCP伪首部格式对比图

伪代码清单:

PingRequest(IP地址) //Ping请求{ //申请小号内存 pICMP=OSMemGet(); //填写以太网帧 目的MAC地址=ping命令传入的IP地址解析后得到的物理地址 源MAC地址=本节点MAC地址 类型=0x0800 //IP包 //填写IP帧 版本号首部长度=0x45 服务类型=0 总长度=60 标识符=GlobalID++ //全局变量16位GlobalID加1 标志分片偏移量=0x0000 寿命=0x80 协议=0x0001 //icmp 首部校验和=0x0000 源IP地址=本节点IP地址 目的IP地址=ping命令传入的IP地址 首部校验和=CheckSum(IP首部和长度) //计算IP包首部校验和 //填写ICMP帧 类型=8 //8 请求 0 应答 代码=0 校验和=0x0 标识符=0x0300 序号=GlobalID 校验和=CheckSum(ICMP首部和长度) //计算ICMP包首部校验和 //将ICMP包登记在PingBuf中 for(i=0;iMaxLenPingBuf;i++){ if(PingBuf[i].status==0){ PingBuf[i].times=0x8; //测试8次 PingBuf[i].ip=ping命令传入的IP地址; PingBuf[i].memhandle=内存句柄; PingBuf[i].status=4; //第一次准备发(用于同步1秒时钟) break; } } if(i==MaxLenPingBuf) 释放内存;}

PingAnswer(*输入包缓冲区首址pBUF) //Ping应答{ //改写以太网帧 目的MAC地址=源MAC地址 源MAC地址=本节点MAC地址 //改写IP帧 寿命=寿命-1 目的IP地址=源IP地址 源IP地址=本节点IP地址 首部校验和=0x0000 首部校验和=CheckSum(IP首部和长度) //计算IP包首部校验和 //改写ICMP帧 类型=0 //8 请求 0 应答 校验和=0x0 校验和=CheckSum(ICMP首部和长度) //计算ICMP包首部校验和 //直接发送ICMP包至TxQFIFO缓存 OSQSend(QID,*pBUF);}

标签: 51单片机 Ping DOS

相关阅读

推荐阅读

江苏省养老方式及服务需求研究报告发布

江苏省养老方式及服务需求研究报告发布

当你老了,如何养老?10月11日,江苏省消保委发布《江苏省养老方式及服务需求研究报告》(简称《报告》),本次研究采用线上问卷和线下问卷调 更多

2021-10-12 07:55:20
电影票房狂吸金超40亿元  上市公司表现如何呢?

电影票房狂吸金超40亿元 上市公司表现如何呢?

在刚刚过去的国庆长假里,电影票房成绩优秀。据灯塔专业版数据,2021年国庆档总票房43 86亿元,这是国庆档票房历史第二次破40亿,仅次于201 更多

2021-10-09 07:54:06
国庆假期你去露营了吗?我国目前有3.2万家露营相关企业

国庆假期你去露营了吗?我国目前有3.2万家露营相

相约露营,现如今变得新潮又时尚。把客厅、厨房和卧室,都搬到野外去,食于山野,宿于山野,每一帧画面都透露出一种岁月静好的美好。扬子晚 更多

2021-10-08 08:27:04
我国现存眼镜企业超132万家  南京居全国第四

我国现存眼镜企业超132万家 南京居全国第四

日前,在第三届国民视觉健康高峰论坛上分享了一组数据,2020年,我国儿童青少年总体近视率为52 7%,其中6岁儿童为14 3%,小学生为35 6%,初 更多

2021-10-08 07:54:47
兴昌塑胶拟减持不超1%股份  大股东减持曾重挫股价

兴昌塑胶拟减持不超1%股份 大股东减持曾重挫股价

股东减持出现新理由,要借给上市公司无偿使用。9月29日晚间,高乐股份(002348)披露称,公司实控人之一兴昌塑胶五金厂有限公司(以下简称兴昌 更多

2021-09-30 08:43:16
”酱油三剑客“股价都在涨  股价再度突破百元大关

”酱油三剑客“股价都在涨 股价再度突破百元大关

9月26日晚间,海天味业公告:由于今年以来各主要原材物料、运输、能源等成本持续大幅上涨,给经营带来了一定的挑战,近期正在评估是否对产 更多

2021-09-28 07:50:33
“丝绸文创第一股”来了!万事利发行价格为5.24元/股

“丝绸文创第一股”来了!万事利发行价格为5.24元

9月22日,以丝绸文化创意领先的杭州丝绸品牌万事利登陆A股创业板。万事利(301066)发行价格为5 24元 股,截至9月24日,最新股价为24 18元, 更多

2021-09-26 07:51:26
组团减持后股价大跌  百亚股份跌逾8%

组团减持后股价大跌 百亚股份跌逾8%

卫生巾第一股百亚股份(003006)股东组团减持不超过公司10%股份的消息果然影响了公司9月22日的股价。截至9月22日收盘,百亚股份股价大跌8 02% 更多

2021-09-23 08:07:23
+ 点击查看更多精彩
不一样的天猫“6·18”新指标  每笔订单减碳17.6%
    今年的6·18有些不一样:没有公布总成交额,而是改用碳排放量做衡...
上市公司海外收入哪家强? 化工、采掘、电子行业的海外收入最高
      中建迪拜山庄基础设施升级改造施工现场。  中国建筑供图 ...
“新电商人才发展计划”发布 四位一体布局 培养急需人才
    今年是决胜全面小康、决战脱贫攻坚的最后一年,数字经济持续快速...
各地侨企铆足干劲 释放着攒了数月的能量
    近期,侨企益海嘉里(哈尔滨)粮油食品工业有限公司面粉车间日夜...
2小时带货6100万元湖北商品!快手直播带货助力湖北重启
    夏丹喊你下单了,一起为湖北拼单、立马‘夏丹’,无法&...
商业银行正式进入金融期货市场
    谢卫群 摄商业银行今天(4月10日)正式进入中国金融期货市场。首批...