针对组件中的at功能的一点疑问,at_client
的response
结果判断:
判断逻辑:
但是针对这种期待的应答:
“CONNECT”
代码中没有定义和处理,这种情况怎么使用at_response_t的结果进行判断?需要改组件代码吗?有没有兼容这种情况的使用demo?
谢谢
AT应答消息可以分为三种。
第一种返回 “OK” 或者 “ERROR”,可以按照下面的方式进行解析
第二种返回的除了 “OK” 之外还有其他信息,并且其他信息也需要进行判断,比如说检查SIM卡状态,AT+CPIN? (查看SIM卡的状态)回车,返回:+CPIN:READY OK(正常),这种的处理逻辑如下
第三种是服务器主动下发的消息,比如说服务器主动下发的控制信息或者断开连接的消息。这种的处理方法是注册 URC 表,然后收到该类型的消息后就对调用设置的 URC 表的回调函数。
AT组建的核心逻辑是将收到的 AT 模组的应答信息放到一个环形缓冲区中,然后从这个环形缓冲区中每次读一行数据进行处理,然后判断属于哪一类的消息,调用不同的函数。
不知道你用的什么模组,常见的模组 rtt 已经写好了驱动代码和 demo,可以直接使用 socket 进行通讯,而不需要关心是怎么执行 AT 指令与模组进行交互的。
EC20,使用http和mqtt应该没办法使用socket吧?
我的实现:
这条命令定义:
on_qhttpurl_response定义:
原理是一样的,http 和 mqtt 的发送和接收最终还是调用的TCP中的 send 和 recv,http 和 mqtt 协议是应用层的协议,定义了 TCP 传输的数据帧格式,如果分析源码的话,应该也是这样的调用过程。我也写了一篇 AT 组件的源码解析,有需要可以看看https://club.rt-thread.org/ask/article/3394.html
mqtt_send -> tcp_send -> at_send(这种是代码实现的 mqtt 协议)
mqtt_send -> at_send(这种是 AT 模组已经移植好了 mqtt 协议,留出了 MQTT 通信的指令)
不过我看 rtt 的源码,AT框架也只是把 socket 接口给包了一层,TCP/IP 协议栈都是依赖于你AT模组的。
你使用的是 EC20 模组吗?进行 mqtt 和 http 的开发?可以考虑移植好 AT 组件后,再移植 mqtt 和 http 软件包进行开发,不使用 EC20 模组自带的 mqtt 相关指令,使用现有的软件包可以节省时间,rtt 的 AT 组件我看到的只有封装了 socket 接口,没有封装通过 AT 指令直接和模组的 mqtt 和 http 指令交互的接口,我认为是因为各家的模组在 mqtt 和 http 指令的封装上定义的不同,之前看ESP8266和EC20的mqtt相关指令不一样,这样就增加了封装的难度。
之前在 Linux 下移植了 pahomqtt,移植时就是把收发换成了 send() 和 recv(),你可以移植一下试试,每一个软件包也有文档指南。
@crystal266 👍