完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
RT
使用LWIP与远程服务器连接,可以通过心跳包来判断是否与远程服务器连接正常,但请问MCU如何得知路由器突然断电或者网线突然被拔掉呢? 如果LWIP提供了掉网的通知,请问该调用哪个API,请各路大神不吝赐教!@zuozhongkai @八度空间 @发烧友 @aozima |
|
相关推荐
9个回答
|
|
网卡PHY芯片有个寄存器用来标记连接是否正正常。这个可以用来检测网线是否断开。至于路由器断电的话因为你和远程服务器连接着,调用API函数发送数据貌似时候返回值的,返回值指示数据发送是否成功,如果不成功的话可以多试几次,如果还不行的话就可以任务连接断开了。然后在尝试重新连接服务器,如果一直都连接不上服务器那就说明服务器端出问题了。
|
|
|
|
一些常用的选项,供参考
[C] 纯文本查看 复制代码 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 failedn"); 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;} |
|
|
|
远程服务器的连接我是通过心跳包来判断的,MCU发完心跳包服务器会立刻响应
目前最大的问题就是不知道如何知道路由器突然断电,我用的是ENC28J60,不知道是否有你所说的寄存器可以查询网线是否断开,我晚点查查芯片手册 还有一个问题,假如得知网线拔掉了或者路由器断电了,LWIP的DHCP貌似会有一个重连机制,但我百度查了下这个机制的重连间隔是越来越长的,而我必须要在路由器重新上电之后立马重连,请问是否需要把LWIP的DHCP关闭掉然后重新启动? |
|
|
|
|
|
|
|
谢谢大神的回复@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字节的内容: [AppleScript] 纯文本查看 复制代码 /* 从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--;} 最后发现设置了 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根本没法接着处理 |
|
|
|
我是用轮询的方式,听一个朋友说ENC28J60用中断会比较麻烦,所以就不想搞中断,而且我数据量不大,没必要用中断
|
|
|
|
终于弄好了,用wireshark抓包时无意中才发现,原来是我前段时间把PC端的IP扩展到了4个,导致了PC的发送和接收都有问题,现在把PC多于的的IP删除了就好了
|
|
|
|
有硬件ACK
|
|
|
|
我没了解过硬件ACK,尤其是中间隔着交换机的情况,硬件上跟交换机是完好连接的
只不过交换机到路由器可能断开了,这个到目前为止我只想到软件的方法去检测 一般通过TCP/IP发送消息的时候,如果对方没应答,那么路由器会返回一个ICMP包(目标无法到达) 但是如果路由器突然掉电了,这时候设备发出去的任何数据包都不可能有返回的 最后我是用ARP包来检测路由器跟设备的连接是否正常,如果连接正常肯定会有ARP应答的 |
|
|
|
只有小组成员才能发言,加入小组>>
如何使用STM32+nrf24l01架构把有线USB设备无线化?
2547 浏览 7 评论
请问能利用51单片机和nRF24L01模块实现实时语音无线传输吗?
2332 浏览 5 评论
3161 浏览 3 评论
2804 浏览 8 评论
为什么ucosii上移植lwip后系统进入了HardFault_Handler?
2762 浏览 4 评论
请教各位大咖:有没有接收频率32M左右的芯片推荐的?先感谢啦!
611浏览 1评论
857浏览 0评论
971浏览 0评论
625浏览 0评论
452浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 08:01 , Processed in 1.245570 second(s), Total 62, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号