Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
at_device
webnet
at_socket
使用AT Device(ESP8266)软件包实现webnet(理论上实现其他TCP服务器也可以)
发布于 2024-07-12 05:04:27 浏览:574
订阅该版
[tocm] 1. RTThread setting里需要打开AT命令-使能AT命令客户端-通过AT Command使能BSD套接字API-使能AT server BSD套接字支持 2. 使能AT server BSD套接字支持后,at_socket.c里会增加对accept和listen接口的支持,然而目前accept里没有进行事件更新,导致在使用select函数获取listen套接字状态时,无论有没有accept都会返回可读状态,同时accept到的套接字永远为不可写状态,webnet无法正常使用 # 修改 ## at_socket.c 原 ```c int at_accept(int socket, struct sockaddr *name, socklen_t *namelen) { struct at_socket *sock = RT_NULL; struct at_socket *new_sock = RT_NULL; char receive_buff[AT_SOCKET_INFO_LEN]; ip_addr_t remote_addr; uint16_t remote_port = 0; int new_socket = -1; int result = 0; sock = at_get_socket(socket); if (sock == RT_NULL) { result = -1; goto __exit; } if (sock->state != AT_SOCKET_LISTEN) { LOG_E("Socket(%d) connect state is %d.", sock->socket, sock->state); result = -1; goto __exit; } /* wait the receive semaphore, waiting for info */ if (rt_sem_take(sock->recv_notice, RT_WAITING_FOREVER) < 0) { errno = EAGAIN; result = -1; goto __exit; } else { /* get receive buffer to receiver ring buffer */ rt_mutex_take(sock->recv_lock, RT_WAITING_FOREVER); at_recvpkt_get(&(sock->recvpkt_list), (char *) &receive_buff, AT_SOCKET_INFO_LEN); rt_mutex_release(sock->recv_lock); } sscanf(&receive_buff[0], "SOCKET:%d", &new_socket); new_sock = at_get_socket(new_socket); if (sock == RT_NULL) { result = -1; goto __exit; } new_sock->state = AT_SOCKET_CONNECT; ip4_addr_set_any(&remote_addr); ipaddr_port_to_socketaddr(name, &remote_addr, &remote_port); LOG_D("Accept: [socket :%d, base_socket:%d]", new_socket, (int)new_sock->user_data); __exit: if (result < 0) { if (sock != RT_NULL) { at_do_event_changes(sock, AT_EVENT_ERROR, RT_TRUE); } } return new_sock->socket; } ``` 改为 ```c int at_accept(int socket, struct sockaddr *name, socklen_t *namelen) { struct at_socket *sock = RT_NULL; struct at_socket *new_sock = RT_NULL; char receive_buff[AT_SOCKET_INFO_LEN]; ip_addr_t remote_addr; uint16_t remote_port = 0; int new_socket = -1; int result = 0; sock = at_get_socket(socket); if (sock == RT_NULL) { result = -1; goto __exit; } if (sock->state != AT_SOCKET_LISTEN) { LOG_E("Socket(%d) connect state is %d.", sock->socket, sock->state); result = -1; goto __exit; } /* wait the receive semaphore, waiting for info */ if (rt_sem_take(sock->recv_notice, RT_WAITING_FOREVER) < 0) { errno = EAGAIN; result = -1; goto __exit; } else { /* get receive buffer to receiver ring buffer */ rt_mutex_take(sock->recv_lock, RT_WAITING_FOREVER); at_recvpkt_get(&(sock->recvpkt_list), (char *) &receive_buff, AT_SOCKET_INFO_LEN); rt_mutex_release(sock->recv_lock); /* 如果仍存在待接收数据,继续通知,否则清空接收状态 */ if (!rt_slist_isempty(&sock->recvpkt_list)) { at_do_event_changes(sock, AT_EVENT_RECV, RT_TRUE); } else { at_do_event_clean(sock, AT_EVENT_RECV); } } sscanf(&receive_buff[0], "SOCKET:%d", &new_socket); new_sock = at_get_socket(new_socket); if (sock == RT_NULL) { result = -1; goto __exit; } new_sock->state = AT_SOCKET_CONNECT; ip4_addr_set_any(&remote_addr); ipaddr_port_to_socketaddr(name, &remote_addr, &remote_port); LOG_D("Accept: [socket :%d, base_socket:%d]", new_socket, (int)new_sock->user_data); /* 置accept到的套接字为可写状态 */ at_do_event_changes(new_sock, AT_EVENT_SEND, RT_TRUE); __exit: if (result < 0) { if (sock != RT_NULL) { at_do_event_changes(sock, AT_EVENT_ERROR, RT_TRUE); } } return new_sock->socket; } ``` 修改后正常使用webnet软件包即可
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
起个id这么难
这家伙很懒,什么也没写!
文章
1
回答
0
被采纳
0
关注TA
发私信
相关文章
1
【结贴】at_device软件包中对串口接收数据缺少判断导致数据接收异常
2
at client总是出现hardfault?
3
AT组件连接BC26并使用Webclient软件包解析数据错误。URC问题
4
sim800c 为什么最后不用释放rt_free(recv_buf);
5
at_device sim7600ce 为什么可以自动识别运营商的类型
6
调试bc26 ,断言错误failed at rt_thread_timeout
7
AT 组件无法正确解析数据
8
有没有大神成功基于AT_Device移植ATK-GM510到RT-thread
9
ntp服务器无法同步问题
10
柿饼M3用at_device来驱动EC200通讯时rt_free断言
推荐文章
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组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
SFUD
msh
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1518
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
549
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
3
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部