ESP32 联网与模块 AT 调试:SNTP 对时 · M100M-C2 短信 · DX-CT511N MQTT
把三份「联网」相关的记录放在一起:ESP32 自己的网络对时、4G DTU 用 AT 指令发短信、以及带 GNSS 的 4G 模块连 MQTT。都用 AT 指令或 ESP-IDF 原生 API 直接跑通,可以当手册查。
一、在 ESP32 中使用 SNTP 同步网络时间(IDF v5.5.1)
1. 前提要求
SNTP 需要网络连接,首次启动需等待网络就绪,因此必须先配置连接 WIFI。
需要的头文件:#include "esp_netif.h" 和 #include "esp_log.h",其他按需添加。
在 main/CMakeLists.txt 中的 PRIV_REQUIRES 里加入额外的 esp_timer esp_netif。
2. 配置 SNTP
Component config → LWIP → SNTP:
[*] Enable SNTP module
Maximum number of NTP servers: 3
Request interval (ms): 60000 (1分钟)
3. SNTP 服务初始化
static void set_timezone(void)
{
// 设置中国标准时间(北京时间)
setenv("TZ", "CST-8", 1);
tzset();
ESP_LOGI(TAG, "时区设置为北京时间 (CST-8)");
}
static time_t get_current_time(void)
{
// 使用POSIX函数获取时间
return time(NULL);
}
static void print_current_time(void)
{
time_t now = get_current_time();
struct tm timeinfo;
char buffer[64];
localtime_r(&now, &timeinfo);
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S %A", &timeinfo);
ESP_LOGI(TAG, "当前时间: %s", buffer);
}
static void initialize_sntp(void)
{
ESP_LOGI(TAG, "初始化SNTP服务");
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
// 设置时间服务器(默认使用 pool.ntp.org)
esp_sntp_setoperatingmode(SNTP_OPMODE_POLL);
// 添加 NTP 服务器
// esp_sntp_setservername(0, "pool.ntp.org"); // 默认服务器
esp_sntp_setservername(0, "cn.pool.ntp.org"); // 中国 NTP 服务器
esp_sntp_setservername(1, "ntp1.aliyun.com"); // 阿里云 NTP 服务器
// 初始化 SNTP
esp_sntp_init();
#else
sntp_setoperatingmode(SNTP_OPMODE_POLL);
// esp_sntp_setservername(0, "pool.ntp.org"); // 默认服务器
esp_sntp_setservername(0, "cn.pool.ntp.org"); // 中国 NTP 服务器
esp_sntp_setservername(1, "ntp1.aliyun.com"); // 阿里云 NTP 服务器
sntp_init(); // 初始化 SNTP
#endif
set_timezone();// 设置时区
print_current_time(); 打印时间
}
之后将这个初始化放在 WIFI 连接函数之后、主循环之前,执行 initialize_sntp(); // 初始化 SNTP。
4. 运行结果
构建编译烧录下载至目标芯片,串口显示:
I (586) main: 初始化SNTP服务
I (586) main: 时区设置为北京时间 (CST-8)
I (596) main: 当前时间: 2026-01-24 21:40:18 Saturday二、银尔达 M100M-C2(AT 固件)发送短信
M100M-C 系列 DTU 是由银尔达(yinerda)推出的工业级单 TTL 串口 DTU,小巧、稳定、可靠,适合设备控制、状态检测、传感器数据采集等通过 4G 网络与服务器通讯的场景。
1. 测试发短信

进入对应的手册查看教程:

参考教程:合宙官方 AT 指令文档(短信)
要注意:
AT 固件不支持 RS485 发送,支持 TTL、RS232 等发送。 短信需要手机卡才支持,普通物联网卡不支持发短信。 Air724 支持移动、联通、电信卡;Air780 支持移动和联通卡,==不支持电信==。
AT\r 测试
ATE0\r 关闭回显
AT+ICCID\r 确认SIM卡插好了
AT+CGATT? 查看网络连接, +CGATT: 1 是正常
AT+CSMS=1 设置短信服务, +CSMS: 1,1,1
如果需要中文内容,可以用在线 Unicode 编码转换。但实际测试发中文手机会收到乱码,所以还是发英文短信。
AT+CMGF=1 //设置为TEXT模式
OK
AT+CSMP=17,167,0,0 //配置当前TEXT模式参数,17,短信首字节167,短信有效期,12小时 + ( (vp – 143 )×30分钟即24小时
OK
AT+CSCS? //查询使用的字符集
+CSCS: “IRA” //使用IRA字符集
OK
AT+CMGS="180xxxx1447" //给180xxxx1447发英文短信注:180xxxx1447是发送目的号码,请按照实际填写,不要照抄
>HELLO! //出现>号后,输入要发送的短信内容(长度限制最大为180)
0X1A(hex发送) //十六进制方式发送 0x1A(注:此命令后面不跟回车换行)
+CMGS: 73 //73为序号,非固定,短消息发送成功
OK
2. 在单片机中使用
参考教程:air780e 发送中文短信 STM32 HAL库
2.1 实际使用
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "cmsis_os2.h"
#include "usart.h"
/**
* @brief 通过AIR780E 4G模块发送短信
*
* 此函数用于向指定的电话号码发送一条文本短信。它会依次配置短信模式、字符集、短信参数,
* 然后输入目标号码和短信内容,并以 Ctrl+Z 结束发送流程。
*
* @param number 目标手机号码字符串(例如:"13800138000")
* @param note 要发送的短信内容字符串
*/
void air780e_4g_send_note(char *number, char *note)
{
char cmd[128] = {0};
uint8_t ctrl_z = 0x1A;
// 设置短信模式
HAL_UART_Transmit(&huart1, "AT+CMGF=1\r\n", strlen("AT+CMGF=1\r\n"), 1000);
osDelay(1000);
// 设置字符集
HAL_UART_Transmit(&huart1, "AT+CSCS=\"GSM\"\r\n", strlen("AT+CSCS=\"GSM\"\r\n"), 1000);
osDelay(1000);
// 设置短信参数
HAL_UART_Transmit(&huart1, "AT+CSMP=17,167,0,0\r\n", strlen("AT+CSMP=17,167,0,0\r\n"), 1000);
osDelay(1000);
// 设置接收号码
snprintf(cmd, sizeof(cmd), "AT+CMGS=\"%s\"\r\n", number);
HAL_UART_Transmit(&huart1, cmd, strlen(cmd), 1000);
osDelay(2000); // 需要等待模块返回 "> "
// 发送短信内容
HAL_UART_Transmit(&huart1, note, strlen(note), 1000);
// 发送Ctrl+Z结束
HAL_UART_Transmit(&huart1, &ctrl_z, 1, 1000);
osDelay(5000); // 发送后需要足够时间等待响应
}
在需要的地方调用,用于发送英文短信:
// 发送短信给紧急联系人
elog_info("SMS", "Sending manual emergency SMS to xxxxxxxxxx");
air780e_4g_send_note(phone_number, alarm_report);
elog_info("SMS", "Manual emergency SMS sent successfully");
三、DX-CT511N 的 MQTT 调试记录

这个模块是 4G 和定位一起存在的,也就是支持 GNSS 功能。
可以参考这两篇(不过我更喜欢自己看手册,这样更直接):
1. 基本参数
- 波特率:115200bps/8/n/1(波特率/数据位/无校验/停止位)
- 三种模式:AT 指令模式;数据传输模式;休眠模式
- 默认是:AT 指令模式
2. 调试步骤
使用配套的串口调试助手进行配置,给模块填写参数信息,实现对 MQTT 服务器的订阅。
2.1 连接 MQTT 服务器的命令输入顺序
- 设置 APN
AT+QICSGP=1,1,"","",""
- 开启移动网络
AT+NETOPEN
- 配置 MQTT 客户端信息

AT+MCONFIG=<clientid>[,<username>,<password>][,<will_flag>,<will_qos>,<will_retain>,<will_topic>,<will_message>]
参数解释:
<clientid>:客户端 ID
<username>:用户名
<password>:密码
最大长度为 256
<will_flag>:遗嘱开关
0:关闭遗嘱
1:启用遗嘱
<will_qos>:遗嘱 Qos
0:最多一次
1:至少一次
2:只有一次
<will_retain>:保留标志
0:不保留
1:保留
<will_topic>:遗嘱主题
最大长度 256
<will_message>:遗嘱内容
最大长度 1024
所以配置可以写成:
AT+MCONFIG="4G_GNSS","user","password",1,0,0,"topic/lost","kill"
OK
- 配置 MQTT 服务器信息(我的地址是真实的所以不展示)
AT+MIPSTART=127.0.0.1,1883,4
- 连接 MQTT 服务器
AT+MCONNECT=0,60
- 订阅主题
AT+MSUB="topic/cmd",0
- 查询 MQTT 连接状态
AT+MQTTSTATU
返回的连接状态里,1 就是已经建立连接。
- 发布消息
AT+MPUB=<topic>,<qos>,<retain>,<message>
AT+MPUB="topic/upload",0,0,"hello boy"
实际测试一下,前提是要配置好服务器。

微光录