一、ESP12S(WIFI)
ESP12S是一款由Espressif Systems生产的Wi-Fi模块,可将其集成到物联网设备中,以实现无线通信和控制,它是ESP8266模块的升级版(基于 ESP8266 芯片),加入了更多的硬件资源和接口,适用于广泛的物联网应用; 以下是ESP12S的主要特点和功能:
除了以上特性,ESP12S还具有可编程固件和软件支持,易于定制和调试,以满足各种物联网应用的需求。它可应用于各种物联网应用,包括智能家居、安防、汽车和医疗设备等领域。 |
https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/application-note/components/at/an0014-at-client |
1、AT客户端流程
初始化与检查: AT: 测试模块是否正常工作 ATE0: 关闭命令回显 Wi-Fi 配置与连接: AT+CWRECONNCFG=1,100:设置WIFI重连(连接间隔/次数) AT+CWAUTOCONN=1: 启用Wi-Fi自动连接功能 AT+CWMODE=3: 设置Wi-Fi模式为站点模式 AT+CWJAP="SSID","PASSWORD": 连接到指定Wi-Fi网络 AT+CWJAP?: 查询当前Wi-Fi连接信息 TCP客户端操作: AT+CIPMUX=1: 启用多连接模式 AT+CIPSTART=<id>,"TCP","<url>",<port>: 建立TCP连接 AT+CIPCLOSE=<id>: 关闭TCP连接 AT+CIPSEND=<id>,<length>: 发送数据前的准备指令,之后会回复“>” 发送数据: 实际要发送的数据内容 状态和错误检查: "OK": 命令成功 "WIFI CONNECTED": Wi-Fi连接成功 "WIFI GOT IP": 获取IP地址成功 |
2、使能AT命令/软件包
使能AT组件: |
在开发、调试、故障排查、故障复现时开启【使能打印通信数据的RAW格式】,正式发布版本关闭。 |
使用UART设备驱动程序: |
参考STM32片上驱动 - USART驱动 注意:串口内存必须分配大于等于256,否则会出现分配内存失败,网口初始化就会失败(测试512)。 |
AT软件包: |
默认会将套接字抽象层和网络接口设备使能: 【使能在线程中初始化】: 关闭:AT初始化将在RT-Thread的main函数前,系统初始化中进行,这种情况下AT初始化将非常耗时(初始化失败还会重试5次),从设备上电到程序正常运行约需要2分钟; 开启:AT初始化需要自己创建线程进行,从设备上电到程序正常运行耗时短,但是这样会与应用程序中判断离线的逻辑存在一定的冲突。 |
![]() |
3、示例代码
修改wifi信息(socket参阅STM32片上驱动 - ETH驱动): |
#include <rtthread.h> #include <rtdevice.h> #include <drv_common.h> #include <arpa/inet.h> #include <netdev.h> #include <at.h> #include <at_device_esp8266.h> #define DBG_TAG "main" #define DBG_LVL DBG_LOG #include <rtdbg.h> #define ESP8266_DEVICE_NAME "esp0" int esp8266_info_set() { // 设置WIFI为默认网卡 struct netdev *netdev; netdev = netdev_get_by_name(ESP8266_DEVICE_NAME); if (netdev == RT_NULL) { rt_kprintf("network interface device %s not found!\n", ESP8266_DEVICE_NAME); return -1; } netdev_set_default(netdev); // 设置WIFI信息并连接 netdev_set_down(netdev); struct at_device *device; device = at_device_get_by_name(AT_DEVICE_NAMETYPE_DEVICE, ESP8266_DEVICE_NAME); if (device == RT_NULL) { rt_kprintf("get at_device faild!\n"); return -RT_ERROR; } struct at_device_ssid_pwd wifi_info; wifi_info.ssid = "FM_DXF"; wifi_info.password = "dxf124213"; if (at_device_control(device, AT_DEVICE_CTRL_SET_WIFI_INFO, &wifi_info) != RT_EOK) { rt_kprintf("set wifi info faild!\n"); return -RT_ERROR; } netdev_set_up(netdev); return 0; } MSH_CMD_EXPORT(esp8266_info_set, esp8266_info_set); #define ESP_RESET_IO GET_PIN(C, 0) int main(void) { // 使能WIFI网卡 rt_pin_mode(ESP_RESET_IO, PIN_MODE_OUTPUT); rt_pin_write(ESP_RESET_IO, PIN_LOW); rt_thread_mdelay(200); rt_pin_write(ESP_RESET_IO, PIN_HIGH); rt_thread_mdelay(2000); while (1) { //LOG_D("Hello RT-Thread!"); rt_thread_mdelay(1000); } return RT_EOK; } |
二、EC20(4G)
EC20是一款由Quectel(奇智尔)生产的多模LTE模块。它支持4G LTE网络,适用于广泛的物联网(IoT)应用,提供高速数据传输和可靠的通信能力; 以下是EC20的主要特点和功能:
|
1、AT客户端流程
设备检查与基础功能: AT: 检查设备是否响应 ATE0: 关闭命令回显 SIM卡相关: AT+CPIN?: 检查SIM卡插入状态,回复READY为已插入 AT+QCCID: 获取SIM卡ICCID 配置与设置: AT+CTZU=3: 启用自动时区更新 信号与网络状态: AT+CSQ: 获取信号强度 AT+CREG?: 获取CS域是否注册(语音业务) AT+CGREG?: 获取PS域是否注册(上网业务) AT+QCFG=\"NWSCANMODE\"":查询驻网模式(切换到2G AT+QCFG="NWSCANMODE",1 切换到3G AT+QCFG="NWSCANMODE",4 切换到4G AT+QCFG="NWSCANMODE",3 切换到全网 AT+QCFG="NWSCANMODE",0) AT+COPS?:查询运营商信息 PDP上下文: AT+QIACT=1: 激活PDP上下文服务 AT+QIACT?: 获取PDP是否注册(IP地址) TCP连接: AT+QICFG="qisend/timeout",1000: 设置TCP数据发送超时时间 AT+QIOPEN=1,%d,"TCP","%s",%d,0,1: 建立TCP链接 AT+QICLOSE=%d: 断开TCP链接 AT+QISEND=%d,%d: TCP客户端数据发送,回复“>”后发送数据,发送状态SEND OK为发送成功 查询时间: AT+QGDCNT?: 查询流量统计 AT+CCLK?: 查询时间 发送短信/拨打电话: AT+CMGF=1:设置短信为文本模式 AT+CMGS="+8613712345678":设置接收电话号码,输入短信内容后0x1A发送 AT^DSCI=1:启用打电话发短信返回值,2 拨号中 7 振铃中 3 接通 6 挂断 4 电话接入 ATD电话号码:拨打电话 |
2、使能AT命令/软件包
使能AT组件: |
【使能打印通信数据的RAW格式】:在开发、调试、故障排查、故障复现时开启,正式发布版本关闭。 |
使用UART设备驱动程序: |
参考STM32片上驱动 - USART驱动 注意:串口内存必须分配大于等于256,否则会出现分配内存失败,网口初始化就会失败(测试512)。 |
AT软件包: |
【使能在线程中初始化】: 关闭:AT初始化将在RT-Thread的main函数前,系统初始化中进行,这种情况下AT初始化将非常耗时(初始化失败还会重试5次),从设备上电到程序正常运行约需要2分钟; 开启:AT初始化需要自己创建线程进行,从设备上电到程序正常运行耗时短,但是这样会与应用程序中判断离线的逻辑存在一定的冲突。 【电源引脚、电源状态引脚】:-1表示不配置,建议不使用软件包控制引脚,最好是在在应用程序中配合应用层联网逻辑控制4G模组得电断电。 |
修改设备名称: |
packages/at_device-latest/samples/at_sample_ec20.c #define NETDEV_NAME "ec20" |
![]() |
3、示例代码
#include <rtthread.h> #include <rtdevice.h> #include <drv_common.h> #include <arpa/inet.h> #include <netdev.h> #define DBG_TAG "main" #define DBG_LVL DBG_LOG #include <rtdbg.h> #define NETDEV_NAME "ec20" #define EC20_ENABLE_IO GET_PIN(F, 6) #define EC20_PWR_IO GET_PIN(F, 7) #define EC20_RST_IO GET_PIN(F, 8) int main(void) { // 使能EC20网卡 rt_pin_mode(EC20_ENABLE_IO, PIN_MODE_OUTPUT); rt_pin_mode(EC20_PWR_IO, PIN_MODE_OUTPUT); rt_pin_mode(EC20_RST_IO, PIN_MODE_OUTPUT); rt_pin_write(EC20_ENABLE_IO, PIN_LOW); rt_pin_write(EC20_PWR_IO, PIN_LOW); rt_pin_write(EC20_RST_IO, PIN_LOW); rt_thread_mdelay(1500); rt_pin_write(EC20_ENABLE_IO, PIN_HIGH); rt_thread_mdelay(1000); rt_pin_write(EC20_PWR_IO, PIN_HIGH); rt_thread_mdelay(1000); rt_pin_write(EC20_PWR_IO, PIN_LOW); struct netdev *netdev; netdev = netdev_get_by_name(NETDEV_NAME); if (netdev == RT_NULL) { rt_kprintf("network interface device %s not found!\n", NETDEV_NAME); return -1; } while(1) { rt_thread_delay(1000); } return RT_EOK; } |