OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11615|回复: 13

LWIP如何得知网线被拔掉或者路由器断电?

[复制链接]

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11924
金钱
11924
注册时间
2015-11-5
在线时间
2087 小时
发表于 2016-12-20 08:44:08 | 显示全部楼层 |阅读模式
1金钱
RT
使用LWIP与远程服务器连接,可以通过心跳包来判断是否与远程服务器连接正常,但请问MCU如何得知路由器突然断电或者网线突然被拔掉呢?
如果LWIP提供了掉网的通知,请问该调用哪个API,请各路大神不吝赐教!@zuozhongkai @八度空间 @正点原子 @aozima

最佳答案

查看完整内容[请看2#楼]

网卡PHY芯片有个寄存器用来标记连接是否正正常。这个可以用来检测网线是否断开。至于路由器断电的话因为你和远程服务器连接着,调用API函数发送数据貌似时候返回值的,返回值指示数据发送是否成功,如果不成功的话可以多试几次,如果还不行的话就可以任务连接断开了。然后在尝试重新连接服务器,如果一直都连接不上服务器那就说明服务器端出问题了。
拿来长岛冰茶换我半晚安睡
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-12-20 08:44:09 | 显示全部楼层
网卡PHY芯片有个寄存器用来标记连接是否正正常。这个可以用来检测网线是否断开。至于路由器断电的话因为你和远程服务器连接着,调用API函数发送数据貌似时候返回值的,返回值指示数据发送是否成功,如果不成功的话可以多试几次,如果还不行的话就可以任务连接断开了。然后在尝试重新连接服务器,如果一直都连接不上服务器那就说明服务器端出问题了。
回复

使用道具 举报

11

主题

1041

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3696
金钱
3696
注册时间
2011-5-23
在线时间
2008 小时
发表于 2016-12-20 09:57:16 | 显示全部楼层
一些常用的选项,供参考

[mw_shl_code=c,true]rt_err_t socket_config(void)
{
    int keepalive = 1;      //Enable keepalive.
    int keepidle = 60;      //idle time is 60s.
    int keepinterval = 5;   //sending interval of detective packet
    int keepcount = 3;      //detective count.
       
        int flag = 1;

    if (setsockopt(socket_fd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive, sizeof(keepalive)) < 0)
    {
        LOG("set Keep-Alive attribute failed\n");
        return -RT_ERROR;
    }
    setsockopt(socket_fd, IPPROTO_TCP, TCP_KEEPIDLE, (void*)&keepidle , sizeof(keepidle));
    setsockopt(socket_fd, IPPROTO_TCP, TCP_KEEPINTVL, (void *)&keepinterval , sizeof(keepinterval));
    setsockopt(socket_fd, IPPROTO_TCP, TCP_KEEPCNT, (void *)&keepcount , sizeof(keepcount));
       
    setsockopt(socket_fd, IPPROTO_TCP, TCP_NODELAY, (void *)&flag , sizeof(flag));

    return RT_EOK;
}
[/mw_shl_code]

RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11924
金钱
11924
注册时间
2015-11-5
在线时间
2087 小时
 楼主| 发表于 2016-12-20 10:49:22 | 显示全部楼层
zuozhongkai 发表于 2016-12-20 09:59
网卡PHY芯片有个寄存器用来标记连接是否正正常。这个可以用来检测网线是否断开。至于路由器断电的话因为你 ...

远程服务器的连接我是通过心跳包来判断的,MCU发完心跳包服务器会立刻响应
目前最大的问题就是不知道如何知道路由器突然断电,我用的是ENC28J60,不知道是否有你所说的寄存器可以查询网线是否断开,我晚点查查芯片手册
还有一个问题,假如得知网线拔掉了或者路由器断电了,LWIP的DHCP貌似会有一个重连机制,但我百度查了下这个机制的重连间隔是越来越长的,而我必须要在路由器重新上电之后立马重连,请问是否需要把LWIP的DHCP关闭掉然后重新启动?
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

9

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
228
金钱
228
注册时间
2016-7-4
在线时间
47 小时
发表于 2016-12-20 14:20:02 | 显示全部楼层
FreeRTOS 发表于 2016-12-20 10:49
远程服务器的连接我是通过心跳包来判断的,MCU发完心跳包服务器会立刻响应
目前最大的问题就是不知道如 ...

楼主enc28j60用的是中断处理还是轮询的方式?把源码贴出来看看呗
我也正在弄enc28j60,但INT中断一直不能用
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11924
金钱
11924
注册时间
2015-11-5
在线时间
2087 小时
 楼主| 发表于 2016-12-21 09:43:19 | 显示全部楼层
本帖最后由 FreeRTOS 于 2016-12-21 09:46 编辑

谢谢大神的回复@aozima !请教下一定要用socket么?
还有我发现有一个很诡异的问题,我新建了一个UDP连接来监听8000端口的广播包和单播包,但最后发现跟MAC地址有点关系,
设置某部分MAC地址可以成功接收广播包和单播包,但设置了其他部分的MAC地址就只能接收广播包而不能接收单播包!
例如设置 00-72-06-00-00-1D 只能接收广播包而不能接收单播包,而设置 00-72-06-00-00-08 就可以同时接收广播包和单播包
昨天搞了一天,貌似是ENC28J60的问题,我是这样分析的:
在 low_level_input(struct netif *netif) 函数里面获取完数据包之后就立马抓取数据包是否有特定的内容,
其中 src_data[] 就是PC端发送过来的特定9字节的内容:
[mw_shl_code=applescript,true]/* 从ENC28J60获取数据包 */
len = enc28j60_packet_receive(MAX_FRAMELEN, lwip_buf);

/* 匹配特定的9字节数据 */
index = DataMatch(src_data, 9, lwip_buf, len);
if(index != MATCH_FAIL)
{
    //while(1);
    len++;
    len--;
}[/mw_shl_code]
最后发现设置了 00-72-06-00-00-1D 这个MAC地址之后,PC端只有以广播包形式发送数据包,DataMatch()函数才能匹配到特定的数据,
如果PC端只有以单播包形式发送,则DataMatch()函数无法匹配到特定的数据!
到这里还没结束,更诡异的是,假如我设置了 00-72-06-00-00-08 这个MAC地址,那么不管PC端以单播还是广播形式发送,DataMatch()函数一样可以匹配到!!!
百度了下MAC地址的规则,上面两个MAC地址的最高字节都是0x00,意味着设备不是多播设备,其他字节应该随便填不要紧吧?
我初步估计是ENC28J60的问题,因为MCU根本获取不到单播数据包,LWIP根本没法接着处理
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11924
金钱
11924
注册时间
2015-11-5
在线时间
2087 小时
 楼主| 发表于 2016-12-21 09:48:54 | 显示全部楼层
Randy.zhang 发表于 2016-12-20 14:20
楼主enc28j60用的是中断处理还是轮询的方式?把源码贴出来看看呗
我也正在弄enc28j60,但INT中断一直不 ...

我是用轮询的方式,听一个朋友说ENC28J60用中断会比较麻烦,所以就不想搞中断,而且我数据量不大,没必要用中断
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11924
金钱
11924
注册时间
2015-11-5
在线时间
2087 小时
 楼主| 发表于 2016-12-21 13:35:53 | 显示全部楼层
FreeRTOS 发表于 2016-12-21 09:43
谢谢大神的回复@aozima !请教下一定要用socket么?
还有我发现有一个很诡异的问题,我新建了 ...

终于弄好了,用wireshark抓包时无意中才发现,原来是我前段时间把PC端的IP扩展到了4个,导致了PC的发送和接收都有问题,现在把PC多于的的IP删除了就好了
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-9-26
在线时间
7 小时
发表于 2017-12-5 20:16:21 | 显示全部楼层
有硬件ACK
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11924
金钱
11924
注册时间
2015-11-5
在线时间
2087 小时
 楼主| 发表于 2017-12-6 09:29:34 | 显示全部楼层

我没了解过硬件ACK,尤其是中间隔着交换机的情况,硬件上跟交换机是完好连接的
只不过交换机到路由器可能断开了,这个到目前为止我只想到软件的方法去检测
一般通过TCP/IP发送消息的时候,如果对方没应答,那么路由器会返回一个ICMP包(目标无法到达)
但是如果路由器突然掉电了,这时候设备发出去的任何数据包都不可能有返回的
最后我是用ARP包来检测路由器跟设备的连接是否正常,如果连接正常肯定会有ARP应答的
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2019-5-30
在线时间
15 小时
发表于 2019-8-20 12:44:52 | 显示全部楼层
FreeRTOS 发表于 2017-12-6 09:29
我没了解过硬件ACK,尤其是中间隔着交换机的情况,硬件上跟交换机是完好连接的
只不过交换机到路由器可 ...

楼主:怎么用ARP包检测
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11924
金钱
11924
注册时间
2015-11-5
在线时间
2087 小时
 楼主| 发表于 2019-8-20 14:41:50 | 显示全部楼层
zhengdian190530 发表于 2019-8-20 12:44
楼主:怎么用ARP包检测

LWIP没有ARP的API,必须自己构造
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2019-5-30
在线时间
15 小时
发表于 2019-8-21 10:00:21 | 显示全部楼层
FreeRTOS 发表于 2019-8-20 14:41
LWIP没有ARP的API,必须自己构造

不明白,可以讲得详细些吗,可以发个例程参考下吗?
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11924
金钱
11924
注册时间
2015-11-5
在线时间
2087 小时
 楼主| 发表于 2019-8-21 13:24:18 | 显示全部楼层
zhengdian190530 发表于 2019-8-21 10:00
不明白,可以讲得详细些吗,可以发个例程参考下吗?

ARP功能跟PING功能一样,如果是其他设备发ARP或者PING你的开发板,LWIP有自动回复。
但是如果你想要主动PING其他设备,很抱歉,LWIP不支持这个功能!同理ARP也是。
如果实在要主动PING或者发ARP,可以自己构造一个PING包或者ARP包,PING的例子你可以参考以下链接:
https://blog.csdn.net/u014471291/article/details/72179547
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 16:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表