Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
SAL
网络
关于检测联网check_netdev_internet_up_work()
发布于 2022-11-24 14:42:51 浏览:778
订阅该版
rtt中,检测网络是否连网的策略是:向link.rt-thread.org发UDP包,在2秒内收到回包,则认为已联网 ```c /* check SAL network interface device internet status */ static void check_netdev_internet_up_work(struct rt_work *work, void *work_data) { #define SAL_INTERNET_VERSION 0x00 #define SAL_INTERNET_BUFF_LEN 12 #define SAL_INTERNET_TIMEOUT (2) #define SAL_INTERNET_HOST "link.rt-thread.org" #define SAL_INTERNET_PORT 8101 #define SAL_INTERNET_MONTH_LEN 4 #define SAL_INTERNET_DATE_LEN 16 int index, sockfd = -1, result = 0; struct sockaddr_in server_addr; struct hostent *host; struct timeval timeout; struct netdev *netdev = (struct netdev *)work_data; socklen_t addr_len = sizeof(struct sockaddr_in); char send_data[SAL_INTERNET_BUFF_LEN], recv_data = 0; struct rt_delayed_work *delay_work = (struct rt_delayed_work *)work; const char month[][SAL_INTERNET_MONTH_LEN] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; char date[SAL_INTERNET_DATE_LEN]; int moth_num = 0; struct sal_proto_family *pf = (struct sal_proto_family *) netdev->sal_user_data; const struct sal_socket_ops *skt_ops; if (work) { rt_free(delay_work); } /* get network interface socket operations */ if (pf == RT_NULL || pf->skt_ops == RT_NULL) { result = -RT_ERROR; goto __exit; } host = (struct hostent *) pf->netdb_ops->gethostbyname(SAL_INTERNET_HOST); if (host == RT_NULL) { result = -RT_ERROR; goto __exit; } skt_ops = pf->skt_ops; if ((sockfd = skt_ops->socket(AF_INET, SOCK_DGRAM, 0)) < 0) { result = -RT_ERROR; goto __exit; } server_addr.sin_family = AF_INET; server_addr.sin_port = htons(SAL_INTERNET_PORT); server_addr.sin_addr = *((struct in_addr *)host->h_addr); rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero)); timeout.tv_sec = SAL_INTERNET_TIMEOUT; timeout.tv_usec = 0; /* set receive and send timeout */ skt_ops->setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (void *) &timeout, sizeof(timeout)); skt_ops->setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, (void *) &timeout, sizeof(timeout)); /* get build moth value*/ rt_memset(date, 0x00, SAL_INTERNET_DATE_LEN); rt_snprintf(date, SAL_INTERNET_DATE_LEN, "%s", __DATE__); for (index = 0; index < sizeof(month) / SAL_INTERNET_MONTH_LEN; index++) { if (rt_memcmp(date, month[index], SAL_INTERNET_MONTH_LEN - 1) == 0) { moth_num = index + 1; break; } } /* not find build month */ if (moth_num == 0 || moth_num > sizeof(month) / SAL_INTERNET_MONTH_LEN) { result = -RT_ERROR; goto __exit; } rt_memset(send_data, 0x00, SAL_INTERNET_BUFF_LEN); send_data[0] = SAL_INTERNET_VERSION; for (index = 0; index < netdev->hwaddr_len; index++) { send_data[index + 1] = netdev->hwaddr[index] + moth_num; } send_data[9] = RT_VERSION; send_data[10] = RT_SUBVERSION; send_data[11] = RT_REVISION; skt_ops->sendto(sockfd, send_data, SAL_INTERNET_BUFF_LEN, 0, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)); result = skt_ops->recvfrom(sockfd, &recv_data, sizeof(recv_data), 0, (struct sockaddr *)&server_addr, &addr_len); if (result < 0) { goto __exit; } if (recv_data == RT_FALSE) { result = -RT_ERROR; goto __exit; } __exit: if (result > 0) { LOG_D("Set network interface device(%s) internet status up.", netdev->name); netdev->flags |= NETDEV_FLAG_INTERNET_UP; } else { LOG_D("Set network interface device(%s) internet status down.", netdev->name); netdev->flags &= ~NETDEV_FLAG_INTERNET_UP; } if (sockfd >= 0) { skt_ops->closesocket(sockfd); } } ``` 疑问: 1. 收包超时时间怎么是2秒?一般网络通讯超时时间都是5秒 2. 随着物联设备增多,会不会出现批量问题?比如,rt-thread.org服务器宕机,导致批量不能上线?或者,换个说法,某事件导致设备批量集中上线,会不会挤爆rt-thread.org服务器?这种问题,本人有遇过。 3. 物联网卡,目前都有白名单机制,建议相关文档说明下,rt-thread.org应加入到sim卡白名单中。
查看更多
3
个回答
默认排序
按发布时间排序
踩姑娘的小蘑菇
2022-11-24
这家伙很懒,什么也没写!
这项判断影响且仅影响NETDEV_FLAG_INTERNET_UP这个标志位,不影响实际连接功能,个人觉得存在不准确的情况比较正常 因为部分卡存在连接目标服务器正常 但连接link.rt-thread.org异常的情况,更准确的状态应由用户代码部分做判断
Assert
2022-11-24
这家伙很懒,什么也没写!
物联网卡白名单遇到过,后来在物联网卡管理平台手动添加白名单解决[笑cry]
aozima
2022-11-30
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
无法连接的场景,感觉可以换个可以用的云端地址进行检测。
撰写答案
登录
注册新账号
关注者
0
被浏览
778
关于作者
reille
这家伙很懒,什么也没写!
提问
5
回答
5
被采纳
1
关注TA
发私信
相关问题
1
SAL 不支持 PF_PACKET,如何修改可以支持?
2
socket(AF_INET, SOCK_RAW, IPPROTO_UDP);
3
SAL组件好像并不支持DTLS
4
添加SAL组件后socket相关函数均提示declared implicitly
5
sal组件socket等函数无法使用
6
SAL关闭自带的一个socket连接
7
wiznet与libmodbus软件包衔接对接SAL层传参问题
8
sal验证link.rt-thread.org:8101失败
9
请问 AT-SAL,recv() 函数在服务端断开之后没有返回,是设计如此吗?
10
多网卡的出现创建socket失败
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
7
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部