Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
AT
AT Socket 框架的一些疑惑
发布于 2020-05-12 16:08:09 浏览:3602
订阅该版
* 本帖最后由 luckydarcy 于 2020-5-12 16:19 编辑 * 最近在折腾AT模块,在 at_device -> at socket -> SAL 的对接过程中产生了一些疑惑。 (1)at_socket 结构体有一个 socket 成员,但是AT模块实际的socket号却存储在user_data(这么做应该是为了支持多网卡),并且从0开始,可是有些AT模块的可用socket不是从0开始的。 (2)at_device 软件包的 at_device_register 函数中直接分配 AT_DEVICE_XX_SOCKETS_NUM 足额的内存空间,如果用不上那么多会造成浪费,另外对于可用socket不是从0开始的AT模块来说,处理起来也比较麻烦。 ```device->sockets = (struct at_socket *) rt_calloc(class->socket_num, sizeof(struct at_socket));```(3)创建 socket 的接口在对应 AT socket 层的 at_socket 函数,但是 at_socket_ops 操作接口却没有提供对应的接口,使得需要创建 socket 的AT模块只能在 at_connect 接口进行处理,这样有些不合理。 ```struct at_socket_ops { int (*at_connect)(struct at_socket *socket, char *ip, int32_t port, enum at_socket_type type, rt_bool_t is_client); int (*at_closesocket)(struct at_socket *socket); int (*at_send)(struct at_socket *socket, const char *buff, size_t bfsz, enum at_socket_type type); int (*at_domain_resolve)(const char *name, char ip[16]); void (*at_set_event_cb)(at_socket_evt_t event, at_evt_cb_t cb); };```(4)由于 at_socket_ops 只提供一个发送接口 at_send,因此 TCP 和 UDP 都要共用,但是这个接口不接受 ip 和 port 参数,因此 AT Socket 层处理的时候需要借助具体AT模块 at_connect 接口,看起来有点别扭。比如 at_socket.c 中的 at_sendto 函数的大致处理流程如下: ```int at_sendto(int socket, const void *data, size_t size, int flags, const struct sockaddr *to, socklen_t tolen) { /* 根据 socket 号找到对应的 at_socket 对象 */ sock = at_get_socket(socket); /* 区分 TCP 和 UDP 进行处理 */ switch (sock->type) { case AT_SOCKET_TCP: if (sock->state == AT_SOCKET_CLOSED) { /* socket 已关闭,退出 */ } else if (sock->state != AT_SOCKET_CONNECT && sock->state != AT_SOCKET_OPEN) { /* socket 状态不对,退出(为什么 OPEN 状态也可以发送 TCP?) */ } /* 发送数据 */ sock->ops->at_send(sock, (const char *) data, size, sock->type); break; case AT_SOCKET_UDP: /* 当 socket 状态为 OPEN 且存在目标IP地址和端口时才满足条件 */ if (to && sock->state == AT_SOCKET_OPEN) { /* 从 socketaddr 结构体中获取 IP 和端口 */ socketaddr_to_ipaddr_port(to, &remote_addr, &remote_port); ipaddr_to_ipstr(to, ipstr); /* 调用 AT 模块的 xx_socket_connect 接口(以 UDP 方式打开 AT 模块的 socket) */ sock->ops->at_connect(sock, ipstr, remote_port, sock->type, RT_TRUE); /* 将 socket 状态标记为 CONNECT */ sock->state = AT_SOCKET_CONNECT; /* 绑定 recv 和 close 回调函数(每次发送 UDP 都要绑定?) */ sock->ops->at_set_event_cb(AT_SOCKET_EVT_RECV, at_recv_notice_cb); sock->ops->at_set_event_cb(AT_SOCKET_EVT_CLOSED, at_closed_notice_cb); } /* 发送数据 */ sock->ops->at_send(sock, (char *) data, size, sock->type); break; default: /* 不支持除 TCP 和 UDP 外的传输层协议,退出 */ } }```麻烦是麻烦了点,但毕竟大部分AT模块是可以用的,然而,有些 AT 模块的 UDP 功能并没有类似 create 或 connect 的指令,因此模块本身没有记录 UDP socket 将要要发送的目标 ip 和 port,而且 at_socket 对象的 user_data 已经被占用了,也没办法保存 ip 信息。 所以,我觉得 at_socket_ops 是不是应该提供 at_socket 和 at_sendto 接口,让实际的AT设备处理起来更灵活?但是这些改动不仅牵涉到 at_device 软件包,还需要修改 AT 组件。不知道大神有没有遇到上述这些问题,咱们坐下来喝杯茶探讨一下?
查看更多
15
个回答
默认排序
按发布时间排序
阿基米东
认证专家
2020-05-12
https://github.com/luhuadong
:) 再喝一杯茶
阿基米东
认证专家
2020-05-12
https://github.com/luhuadong
:) 又喝了一杯茶
阿基米东
认证专家
2020-05-13
https://github.com/luhuadong
:) 喝个早午茶
403463275
2020-05-13
啥都不懂
:lol我也喝了一杯茶 我觉得你说的挺有道理的。我在弄BC35的时候 也发现这些API调用还是和自己想要达成的功能 有差异。 最后自己写了,反正AT组件也不是很难
阿基米东
认证专家
2020-05-13
https://github.com/luhuadong
>我也喝了一杯茶 >我觉得你说的挺有道理的。我在弄BC35的时候 也发现这些API调用还是和自己想要达成的功 ... --- :) 给大佬倒茶...... 对呀,自己写AT模块功能是更加简便,折腾 AT socket 框架主要是想用 SAL 和 netdev 功能,这样应用程序更好维护,想不到被框架框住了 T_T
阿基米东
认证专家
2020-05-14
https://github.com/luhuadong
茶喝多了,上个厕所
阿基米东
认证专家
2020-05-14
https://github.com/luhuadong
:) 继续喝茶
whj467467222
认证专家
2020-05-15
开源,分享,交流,共同进步
帮大佬顶一下
阿基米东
认证专家
2020-05-16
https://github.com/luhuadong
:) 今天不喝茶,喝可乐
wangyuan
2020-05-16
这家伙很懒,什么也没写!
刚打算搞EC20使用AT组件,发现EC20inti初始化失败。。还在啃官方文档,,
撰写答案
登录
注册新账号
关注者
0
被浏览
3.6k
关于作者
阿基米东
https://github.com/luhuadong
提问
11
回答
52
被采纳
3
关注TA
发私信
相关问题
1
rt-thread 2g/3g/4g通信模块的教程有吗?
2
基于AT指令,用esp8266如何连接mqtt?
3
AT组件使用问题
4
官方AT客户端应用笔记的几个小tip
5
RTT的SAL能够判断使用LWIP或者AT?
6
rt_therad AT组件移植不成功(结贴)
7
AT组件在哪个版本的?
8
AT组件 连接 Onenet 连接失败
9
esp8266 AT指令 MQTT连接问题
10
AT组件使用问题之模块主动上报【已解决】
推荐文章
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
RT-thred的stm32h723对应bsp包CubeMX添加其他外设报错
2
RT-Thread中的time溢出问题,时间戳溢出,解决方法
3
ART-PI使用env驱动ETH网卡,pc和板子可以ping通
4
SystemView线程名字不显示
5
只用网页也能跑RT-Smart 无门槛腾讯Cloud studio + smart-build快速构建
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
UART
ESP8266
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
9
个答案
2
次被采纳
三世执戟
8
个答案
1
次被采纳
KunYi
8
个答案
1
次被采纳
winfeng
2
个答案
1
次被采纳
YZRD
2
个答案
1
次被采纳
本月文章贡献
catcatbing
2
篇文章
5
次点赞
swet123
1
篇文章
4
次点赞
Days
1
篇文章
4
次点赞
YZRD
1
篇文章
2
次点赞
阳光的掌控者
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部