本文的前提是单片机的LWIP已经跑起来了,能够被外部设备ping通,在此基础上,新增让单片机ping外部设备的功能。

首先,我们需要创建ICMP控制块,在主循环前创建一次即可。

struct raw_pcb *ping_pcb;
uint8_t icmp_pcb_init(void)
{ping_pcb = raw_new(IP_PROTO_ICMP);//创建ICMP控制块if(!ping_pcb)return 1;return 0;
}

然后,我们需要构建ping包,用于ping外部设备。

uint8_t ping_send(void)
{struct pbuf *p;struct ip_addr ipaddr;struct icmp_echo_hdr *iecho;err_t err;IP4_ADDR(&ipaddr, 192, 168,  0, 1);//在这里改成你单片机的IP地址,我这里假设本机IP是192.168.0.1ip_addr_set(&ping_pcb->local_ip, &ipaddr);//本机IPIP4_ADDR(&ipaddr, 192, 168, 0, 2);//在这里改成你想ping的IP地址,我这里假设想ping的IP地址是192.168.0.2ip_addr_set(&ping_pcb->remote_ip, &ipaddr);//远端IPp = pbuf_alloc(PBUF_IP, sizeof(struct icmp_echo_hdr), PBUF_RAM);if(!p){return 1;}iecho = (struct icmp_echo_hdr *)p->payload;iecho->type = 8;iecho->code = 0;iecho->id =htons(0x0200);iecho->seqno =htons(0x5800); iecho->chksum = 0;//iecho->chksum = inet_chksum(p->payload, sizeof(struct icmp_echo_hdr));//这里需要注释掉,否则会ping失败err = raw_sendto(ping_pcb, p, &ping_pcb->remote_ip);//发送ping包if( err != ERR_OK ){return 1;}pbuf_free(p);return 0;
}

其次,当我们的ping包发送出去以后,如何接收ping的应答包呢?因此,需要在LWIP的icmp.c文件中修改一下代码。
void icmp_input(struct pbuf *p, struct netif *inp)函数前面创建一个全局变量,用于标记接收到了ping的应答包。

volatile unsigned char pingEchoReply = 0;

void icmp_input(struct pbuf *p, struct netif *inp)函数里面的switch语句中,手动添加一个“case ICMP_ER”(ICMP Echo Reply)的判断条件,让设备能够接受处理icmp的回复消息。如下:

  case ICMP_ER:  pingEchoReply = 1;//这里只做一个标记,简答地表示接收到了ping的应答包break;

最后,就可以让单片机ping外部设备了。

#include "lwip/raw.h"
#include "lwip/icmp.h"
#include "lwip/arch.h"
#include "lwip/ip_addr.h"
extern unsigned char pingEchoReply;
int main(void)
{/*...各种你需要的初始化...*/icmp_pcb_init();//创建ICMP控制块while(1){ping_send();//发送ping包while(pingEchoReply==0);//等待ping应答if(pingEchoReply==1){pingEchoReply = 0;//说明ping成功,可以做你想做的事}}
}

【LwIP】让LwIP拥有PING其他设备的能力相关推荐

  1. 让LwIP拥有PING其他设备的能力

    LwIP是个很不错的协议栈,但是由于其体积过于小巧,使其只能支持ICMP的ECHO类型. 因为在"icmp.c"中的"void icmp_input(struct pbu ...

  2. 【LWIP】LWIP协议|相关知识汇总|LWIP学习笔记

    这里作为一个汇总帖把,把以前写过的LWIP相关的博客文章汇总到一起,方便自己这边查找一些资料. 收录于: [LWIP]LWIP协议|相关知识汇总|LWIP学习笔记 LWIP协议 [LWIP]LWIP网 ...

  3. kodi mysql_家庭影音必备系统Kodi虽然好用但总少了些什么?或许你需要一台群晖为 Kodi 注入多设备同步能力...

    家庭影音必备系统Kodi虽然好用但总少了些什么?或许你需要一台群晖为 Kodi 注入多设备同步能力 2018-08-06 13:57:20 179点赞 2165收藏 148评论 值友们大家好!最近有些 ...

  4. STM32F207,LWIP,DM9000,网口驱动,ping不通

    问题: 网口调试,使用仿真器单步调试.刚开始全速运行的时候可以ping通,但是停止全速运行,停在断点,等待时间超过ping命令的超时时间,就再也ping不通了.这个时候网口的收发中断都正常. 原因:网 ...

  5. STM32F207,LWIP,DM9000,netif_set_up()与ping

    问题:网口的数据接收由任务接收改为中断接收,结果ping不通了. 解决:改程序的时候漏了一个地方.网口link上的时候需要调用netif_set_up()告知协议栈网口link up了,否则协议栈不管 ...

  6. 计算机无法ping其他设备,局域网ping不到其他设备怎么办

    电脑无法连接到网络打印机,ping了一下发现能找到路由器但是找不到局域网中的其他设备.下面是小编给大家整理的一些有关局域网ping不到其他设备的解决方法,希望对大家有帮助! 局域网ping不到其他设备 ...

  7. Teams App 如何使用设备的能力

    我们以前讲到过,Teams有很多中可以扩展的方面,其中有一种是Tab,开发者可以开发一个web page/app,然后以tab的方式嵌入到teams里面. 除了基本的功能,这种tab也可以使用team ...

  8. 即时系统和非即时系统的区别?_企业即时通讯系统拥有哪些二次开发能力?

    一.企业即时通讯常见的二次开发能力 日常工作中,沟通如空气般必不可少,因此即时通讯软件是常驻在企业桌面的应用,在操作系统右侧状态栏中的托盘图标闪动能即时的提醒用户有新的消息等待阅读. 随着办公需求的多 ...

  9. 宝元系统通讯软件recon_企业即时通讯系统拥有哪些二次开发能力?

    一.企业即时通讯常见的二次开发能力 日常工作中,沟通如空气般必不可少,因此即时通讯软件是常驻在企业桌面的应用,在操作系统右侧状态栏中的托盘图标闪动能即时的提醒用户有新的消息等待阅读. 随着办公需求的多 ...

最新文章

  1. 再见,卷积神经网络!
  2. 推荐一些顶级的Android开发书籍(转)
  3. P2924 [USACO08DEC]大栅栏Largest Fence
  4. 5.4 matllab数据插值案例(机动车刹车距离问题、)
  5. IAR6.1的工程迁移到IAR6.5不能用的解决方法
  6. ”Can't connect to MySQL server on localhost (10061)”
  7. Google Mesa概览
  8. Win10 系统直接在目录下打开cmd
  9. React Native使用指南-原生模块
  10. 小熊的人生回忆(五)
  11. MySql 时间戳存char还是存int?
  12. 一张图学会python应用到excel-Python应用之------Excel操作
  13. 高性能MySQL(第2版)中文版pdf
  14. Jdbc数据库的连接工具类
  15. webstorm破解
  16. Task 03:python与word和pdf
  17. 微信小程序开发上线注意事项
  18. 大恒水晶相机_大恒工业相机多实例使用
  19. 用华为手机拍照!要学会这4个功能,随手一拍都是单反大片
  20. F5负载均衡配置一例 (型号:BIG-LTM-1600-4G-R)

热门文章

  1. Codeforces 623B Array GCD 数论,dp
  2. c语言树莓派串口通信_树莓派串口通信
  3. 响应速度不给力?解锁正确缓存姿势
  4. 高通SDX12平台PCIe驱动dtsi解析
  5. 关于输入法的弹出与关闭
  6. ubuntu(1.18.04)上使用kubeadm安装k8s(1.22.4)
  7. 人工智能AI未来趋势
  8. php改文字字体,php 怎么设置 字体
  9. 数码摄影入门之七 用光的艺术
  10. c语言编程 生理周期的程序,C语言程序设计100例之(9):生理周期