ESP32-S3 NB-IoT模块接入方案

AI助手已提取文章相关产品:

ESP32-S3 与 NB-IoT:打造低功耗广域物联网终端的实战之路

你有没有遇到过这样的场景?在偏远山区部署了一套农业监测系统,设备明明装好了,但 Wi-Fi 信号根本覆盖不到;或者给城市里的智能水表换电池时发现,才半年时间,原本标称能用五年的 AA 电池就已经耗尽了。😅

这背后的问题其实很典型—— 短距离通信(如 Wi-Fi、蓝牙)难以满足远程需求,而蜂窝网络又往往功耗太高 。那怎么办?

别急,今天我们就来聊一个“神仙组合”: ESP32-S3 + NB-IoT 。它就像是给物联网终端配了一对翅膀——一边是强大的本地计算能力,一边是超远距离、极低功耗的蜂窝连接。

想象一下:一个小小的传感器节点,埋在田间地头,靠一节纽扣电池就能稳定工作好几年,定时把温湿度、土壤数据传回千里之外的云平台……听起来是不是有点科幻?但实际上,这个架构已经广泛应用于智能表计、环境监控、资产追踪等实际项目中。

那么,这套系统到底是怎么搭建起来的?从硬件选型到软件协议栈,再到功耗优化和远程管理,我们一步步拆解,带你走进真正的工业级 IoT 开发现场。


硬件设计:不只是接根线那么简单 🛠️

很多人一开始以为,“不就是 ESP32 接个 NB-IoT 模块嘛,UART 连上,发 AT 指令就行了?”
确实,逻辑上没错,但真正做出来稳定可靠的产品,细节才是魔鬼。

UART 通信:参数匹配是第一道坎

绝大多数 NB-IoT 模组(比如 Quectel BC95-G、u-blox SARA-N4)都通过 AT 指令集 进行控制,而指令传输依赖的就是 UART 串口。

你以为随便设个波特率就能通?错!一旦两边配置对不上,轻则乱码,重则完全无响应。

来看一组常见模组的默认参数:

参数
波特率 9600 bps
数据位 8 bit
停止位 1 bit
校验位 无(None)
流控 无(No Flow Control)

这些值必须在 ESP32-S3 上精确设置。以下是一个典型的初始化代码片段:

#include "driver/uart.h"

#define UART_PORT_NUM      UART_NUM_1
#define UART_BAUD_RATE     9600
#define UART_TX_PIN        17
#define UART_RX_PIN        16

void uart_init_nb_iot(void) {
    const uart_config_t uart_config = {
        .baud_rate = UART_BAUD_RATE,
        .data_bits = UART_DATA_8_BITS,
        .parity = UART_PARITY_DISABLE,
        .stop_bits = UART_STOP_BITS_1,
        .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
        .source_clk = UART_SCLK_APB,
    };

    uart_driver_install(UART_PORT_NUM, 2048, 0, 0, NULL, 0);
    uart_param_config(UART_PORT_NUM, &uart_config);
    uart_set_pin(UART_PORT_NUM, UART_TX_PIN, UART_RX_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
}

📌 关键点提醒
- uart_driver_install() 中的接收缓冲区建议设为 2048 字节以上,避免小缓冲导致丢包。
- GPIO16 和 GPIO17 是推荐使用的引脚,支持输入输出重映射,减少与其他外设冲突的风险。
- 如果你的 NB-IoT 模组支持更高波特率(比如 SARA-N4 支持 115200),记得先用 AT+IPR=115200 修改模组设置,再同步更新主控端配置,否则会永久失联!

⚠️ 调试建议:先用 USB 转 TTL 工具单独测试 NB-IoT 模块是否能正常返回 OK ,确认模块本身没问题后再接入 ESP32-S3 联调。


引脚分配与电平兼容性:别让“浮空”毁了整个系统

ESP32-S3 是 3.3V 系统,GPIO 输出高电平约 3.3V,输入耐压一般不超过 3.6V。好消息是,大多数工业级 NB-IoT 模组也采用 3.3V TTL 电平标准,理论上可以直连。

但!还是有几个坑要注意:

1. 避开 STRAP 引脚

ESP32 在启动阶段会对某些引脚(如 GPIO0、GPIO2、GPIO4)采样电平状态来判断工作模式(比如下载固件)。如果你把这些引脚拿来当 UART RX/TX,可能会导致设备无法正常启动。

✅ 正确做法:使用 GPIO16/17 或其他非 STRAP 引脚作为通信接口。

2. 上下拉电阻配置
  • RX 引脚 :建议启用内部上拉,防止浮空引入噪声;
  • TX 引脚 :由主控主动驱动,通常不需要额外处理。
3. 是否需要电平转换?

如果你用的是 5V 系统(比如 Arduino 兼容底板扩展 NB-IoT),那就必须加电平转换电路(如 TXB0108 或双 MOSFET 方案),否则可能烧坏 ESP32-S3!

📌 推荐的安全引脚组合如下:

功能 推荐GPIO(ESP32-S3) 备注
UART TX 17 支持输出重映射
UART RX 16 可配合环形缓冲区做中断接收
RESET 控制 12 主动控制NB-IoT模块重启
PSM唤醒检测 13 检测模块进入PSM后状态变化
STATUS指示 14 连接LED显示网络注册状态

电路连接示意(简化版):

ESP32-S3                NB-IoT Module
   GPIO17 (TX)   ----->   RXD
   GPIO16 (RX)   <-----   TXD
   GPIO12 (OUT)  ----->   RESET_N (低有效)
   GND           ------   GND
   3.3V          ------   VCC

💡 小技巧:
- 所有信号线串联 100Ω 电阻抑制反射噪声;
- PCB 布线尽量短,远离 DC-DC、晶振等高频干扰源;
- 工业环境中可在 RX/TX 线路上增加 TVS 二极管防静电(ESD);
- 注意“地弹”问题:两个模块的地电位差超过 0.3V 就可能导致通信异常。解决方案是共用地平面 + 单点接地。


电源管理:功耗优化的核心战场 🔋

NB-IoT 的最大优势之一就是 超低功耗 ,尤其是在电池供电场景下。但如果你不加节制地让 ESP32-S3 一直跑满,那再好的模组也扛不住。

来看看不同模式下的功耗对比:

工作模式 ESP32-S3 功耗 NB-IoT 模块功耗 总系统功耗
全速运行(Wi-Fi/BT ON) ~180 mA ~200 mA (Tx) ~380 mA
ESP32-S3 Sleep + NB-IoT Active ~5 mA ~18 mA ~23 mA
ESP32-S3 Deep Sleep + NB-IoT PSM ~0.01 mA ~3.5 μA ~3.6 μA
关机(仅RTC维持) ~0.8 μA ~1.2 μA (eDRX) ~2.0 μA

看到了吗?只有当两者都进入最低功耗状态时,才能真正实现“数年待机”。

如何做到?
✅ 分立供电策略

不要让 ESP32-S3 和 NB-IoT 共享同一路 LDO。NB-IoT 发射瞬间电流可达 200mA,共享电源可能导致 MCU 复位。

👉 解决方案:分别使用独立的 LDO(如 HT7333)供电。

✅ 动态使能控制

通过 GPIO 控制 NB-IoT 模块的 PWR_EN 引脚,只在需要通信时开启供电,其余时间切断电源。

✅ 深度睡眠联动机制

这是最关键的一步!

流程大概是这样:
1. ESP32-S3 准备休眠前,先通知 NB-IoT 进入 PSM(Power Saving Mode);
2. 自身进入 Deep Sleep;
3. 定时 RTC 唤醒后,重新激活 NB-IoT 并上报数据;
4. 再次进入低功耗循环。

代码示例:

// 启用 PSM 模式(以 BC95-G 为例)
void enable_nb_iot_psm(void) {
    const char *cmd = "AT+CPSMS=1,,,\"00100001\",\"00000000\"\r\n";
    uart_write_bytes(UART_PORT_NUM, cmd, strlen(cmd));
    vTaskDelay(pdMS_TO_TICKS(200)); // 等待响应
}

// 设置 60 秒后唤醒
esp_sleep_enable_timer_wakeup(60 * 1000000ULL);
esp_deep_sleep_start();

参数说明:
- "00100001" 表示 TAU(Tracking Area Update)周期为 2^4 × 2秒 = 32秒;
- "00000000" 表示 Active Time 为 2^0 × 2秒 = 2秒;
- 实际值可根据运营商网络调整,太短会增加信令开销,太长会影响响应速度。

🎯 目标效果:整体系统电流降至 ~3.6μA ,配合 5000mAh 电池,理论续航可达 5年以上


模块选型与外围设计:选对工具事半功倍 🧰

市面上 NB-IoT 模组很多,怎么选?不能光看价格,还得结合频段、认证、协议兼容性等多个维度。

主流模组对比一览表

特性 Quectel BC95-G Quectel BC68 u-blox SARA-N4
封装形式 LCC LCC LGA
支持频段 B3/B5/B8 B1/B3/B5/B8/B20 B1-B28 多频段
最大发射功率 +23 dBm +23 dBm +23 dBm
接收灵敏度 -129 dBm -130 dBm -132 dBm
UART接口 9600 bps 115200 bps 115200 bps
AT指令集兼容性 专有扩展 标准+扩展 3GPP标准兼容
内置TCP/IP协议栈
是否支持eSIM
工作温度范围 -40°C ~ +85°C -40°C ~ +85°C -40°C ~ +85°C
平均价格(USD) $8.5 $10.2 $14.0
该怎么选?
  • BC95-G :性价比之王,适合国内批量出货项目(如智能水表、燃气表),但缺乏 eSIM 支持,海外部署受限。
  • BC68 :频段更全,波特率更高,适合复杂网络环境或需要频繁升级固件的应用。
  • SARA-N4 :完全遵循 3GPP 标准,全球通用,安全性强(支持 TLS 1.3、SE 安全元件),适用于高端资产追踪、金融类终端。

🔧 开发建议:优先选用支持标准 AT 指令集的模组(如 SARA-N4),可大幅降低移植难度。对于低成本项目,BC95-G 仍是不错选择,但注意其非标命令(如 AT+NBAND )可能带来兼容性问题。


天线设计:看不见的“命脉”

天线好不好,直接决定信号质量(RSRP/SINR),进而影响通信成功率和功耗。

NB-IoT 工作在授权频段(如 B8: 900MHz, B20: 800MHz),波长较长,对 PCB 布局要求严格。

设计要点:
  1. 净空区域保留 :天线下方禁止铺铜,至少留出 3mm×3mm 的无走线区;
  2. 50Ω 阻抗匹配 :使用 Smith 圆图工具(如 ADS)设计 π 型匹配网络(C-L-C 结构);
  3. RF 走线尽可能短 (<10mm),宽度约 0.5mm(视板材介电常数而定);
  4. 接地缝合(Via Stitching) :每隔 λ/20(约 3mm @ 900MHz)打一圈接地过孔,形成屏蔽墙。

典型匹配电路:

[ANT_PIN] --- C1 (2.2pF) --- L1 (10nH) --- C2 (3.3pF) --- [External Antenna]
                      |               |
                     GND             GND

初始值参考厂商资料,再用网络分析仪实测 S11 参数优化。

信号质量评估指标
指标 含义 良好范围
RSRP 参考信号接收功率 > -90 dBm
SINR 信号与干扰加噪声比 > 5 dB
RSSI 接收信号强度指示 > -70 dBm

可通过 AT+CSQ 查询当前信号质量:

void query_signal_quality() {
    uart_write_bytes(UART_PORT_NUM, "AT+CSQ\r\n", 8);
    // 预期返回:+CSQ: 20,98 → RSSI=20 (-51dBm), BER未知
}

⚠️ 若 CSQ 值低于 10(对应 RSSI ≤ -100dBm),应检查天线位置或改用高增益外置天线。


SIM 卡 vs eSIM:谁更适合工业场景?

传统插拔式 SIM 卡虽方便更换运营商,但在户外易受潮、松动甚至被盗。

eSIM(嵌入式 SIM) 正逐步成为工业级设备首选。

设计差异:
  • 物理层 :标准 SIM 卡槽需防反插结构,VCC/CLK/IO 加 100nF 去耦 + 1kΩ 限流;
  • eSIM :WLCSP 封装焊接到 PCB,无需卡槽,但需预留烧录接口(SWD 或专用编程口)。
供电与时序控制

SIM 卡工作电压为 1.8V 或 3.0V,现代模组支持自动识别,但仍建议可控供电以节能:

VCC_3V3 --- LDO (TLV70218) ---> SIM_VDD (1.8V)
                             |
                            EN (controlled by MCU GPIO)

通过 GPIO 控制 LDO 使能端,不用时关闭供电。

状态检测指令
uart_write_bytes(UART_PORT_NUM, "AT+CPIN?\r\n", 10);
// 返回:
// +CPIN: READY → 正常
// +CPIN: SIM PIN → 需解锁
// ERROR → 未插入或接触不良

若返回 ERROR,先查 SIM_VDD 是否有输出,再排查焊接问题。


通信链路初始化:让模块“活”起来 💬

完成硬件连接后,下一步是通过 AT 指令完成通信链路初始化,确保 NB-IoT 成功注册网络并具备数据传输能力。

上电时序:顺序错了就白搭

NB-IoT 模块对上电时序有严格要求。以 BC95-G 为例:

  1. 给 VCC 施加 3.3V;
  2. 延迟 100ms 等待稳压;
  3. RESET 引脚拉低 ≥100ms 后释放(冷启动);
  4. 或通过 PWRKEY 拉低 1s 触发开机(热启动);

❌ 错误操作:上电立即发 AT 指令 → 模块还没准备好,必然无响应。

✅ 正确实现:

#define NB_RESET_GPIO 12

void nb_power_on_sequence() {
    gpio_pad_select_gpio(NB_RESET_GPIO);
    gpio_set_direction(NB_RESET_GPIO, GPIO_MODE_OUTPUT);

    gpio_set_level(NB_RESET_GPIO, 1);
    vTaskDelay(pdMS_TO_TICKS(100));

    gpio_set_level(NB_RESET_GPIO, 0);
    vTaskDelay(pdMS_TO_TICKS(150));
    gpio_set_level(NB_RESET_GPIO, 1);

    vTaskDelay(pdMS_TO_TICKS(3000)); // 等待模块启动完成(2~3秒)
}

部分模组(如 SARA-N4)还支持飞行模式控制:

AT+CFUN=0  // 关闭射频
AT+CFUN=1  // 重新启用

可用于快速重启网络而不切断电源。


AT 指令测试:建立信任的第一步

初始化完成后,必须验证串口通信是否正常。常用诊断指令:

指令 用途 预期响应
AT 测试通信链路 OK
ATE0 关闭回显 OK
AT+CGMI 查询制造商信息 Quectel
AT+CGMM 查询模块型号 BC95
AT+CGMR 查询固件版本 BC95GBAR02A04

封装一个自动检测函数:

bool send_at_check_ok(const char* cmd) {
    char resp[64];
    int len;

    uart_write_bytes(UART_PORT_NUM, cmd, strlen(cmd));
    vTaskDelay(pdMS_TO_TICKS(500));

    len = uart_read_bytes(UART_PORT_NUM, resp, sizeof(resp)-1, pdMS_TO_TICKS(100));
    if (len > 0) {
        resp[len] = '\0';
        if (strstr(resp, "OK") != NULL) {
            return true;
        }
    }
    return false;
}

📌 更严谨的做法是使用状态机解析每一行响应,区分 OK ERROR +CME ERROR 等类型。


网络附着与信号检测:终于要联网了!

最后一步:确认模块已注册到蜂窝网络。

uart_write_bytes(UART_PORT_NUM, "AT+CEREG?\r\n", 12);
// 预期返回:+CEREG: 0,1 → 已注册到本地网络

状态码含义:

状态码 描述
0 未注册,当前无尝试
1 已注册,本地网络
2 正在注册过程中
3 注册被拒绝
4 未知原因导致未注册
5 已注册,漫游网络

建议持续轮询直到返回 1 5

int reg_status = 0;
do {
    uart_write_bytes(UART_PORT_NUM, "AT+CEREG?\r\n", 12);
    parse_cereg_response(read_uart_response());
    vTaskDelay(pdMS_TO_TICKS(2000));
} while (reg_status != 1 && reg_status != 5);

同时定期查询信号强度:

uart_write_bytes(UART_PORT_NUM, "AT+CSQ\r\n", 8);
// 返回:+CSQ: 24,99 → 优秀信号

CSQ 值 0~31 对应 RSSI -113dBm 到 -51dBm,越大越好。

至此,通信链路已完成初始化,设备具备接入云平台的能力。


软件协议栈开发:让数据“飞”起来 📡

硬件只是骨架,软件才是灵魂。ESP32-S3 要负责传感器采集、任务调度、与 NB-IoT 交互,还要对接云端。

驱动层封装:别让 AT 指令满天飞

直接到处写 uart_write_bytes("AT+...") ?不行!太容易出错,也不利于维护。

我们要做的是—— 抽象出一套健壮的驱动层 API

UART 接收缓冲区管理

使用 ESP-IDF 提供的环形缓冲区机制,实现非阻塞监听:

static QueueHandle_t uart_queue;

void uart_init(void) {
    const uart_config_t uart_config = {
        .baud_rate = 9600,
        .data_bits = UART_DATA_8_BITS,
        .parity = UART_PARITY_DISABLE,
        .stop_bits = UART_STOP_BITS_1,
        .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
        .source_clk = UART_SCLK_APB,
    };

    uart_driver_install(UART_PORT_NUM, 2048, 0, 20, &uart_queue, 0);
    uart_param_config(UART_PORT_NUM, &uart_config);
    uart_set_pin(UART_PORT_NUM, 17, 16, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
}

创建监听任务:

void uart_event_task(void *pvParameters) {
    uart_event_t event;
    uint8_t* dtmp = malloc(RD_BUF_SIZE);

    for(;;) {
        if(xQueueReceive(uart_queue, &event, portMAX_DELAY)) {
            if(event.type == UART_DATA) {
                int len = uart_read_bytes(UART_PORT_NUM, dtmp, event.size, portMAX_DELAY);
                if(len > 0) {
                    at_response_parser(dtmp, len);
                }
            }
        }
    }
    free(dtmp);
}
指令超时重试与错误解析

AT 指令本质是请求-响应模型,必须加超时和重试:

bool send_at_command(const char* cmd, const char* expected_resp, int timeout_ms) {
    const int retry_times = 3;

    for(int i = 0; i < retry_times; i++) {
        uart_write_bytes(UART_PORT_NUM, cmd, strlen(cmd));
        uart_write_bytes(UART_PORT_NUM, "\r\n", 2);

        int start_time = xTaskGetTickCount() * portTICK_PERIOD_MS;
        while((xTaskGetTickCount() * portTICK_PERIOD_MS - start_time) < timeout_ms) {
            if(at_check_response(expected_resp)) {
                return true;
            }
            vTaskDelay(pdMS_TO_TICKS(10));
        }

        ESP_LOGW("AT", "Command '%s' failed, retry %d/%d", cmd, i+1, retry_times);
        vTaskDelay(pdMS_TO_TICKS(1000));
    }

    return false;
}

常见错误码:

错误码 含义 应对措施
ERROR 通用错误 重发或复位
+CME ERROR: 3 SIM卡未就绪 检查卡槽
+CMS ERROR: 302 网络注册失败 检查APN或信号
NO CARRIER TCP断开 重建连接

上行数据上报:精简再精简

NB-IoT 带宽有限,数据包必须紧凑。

JSON vs 二进制格式

虽然 JSON 可读性强,但太冗余。建议调试用 JSON,量产用二进制或 MQTT-SN。

示例 JSON 包:

{
  "dev_id": "ESP32S3_001",
  "ts": 1712345678,
  "data": {
    "temp": 25.3,
    "humi": 60.2,
    "voltage": 3.28
  }
}

拼接代码:

char* build_sensor_json(float temp, float humi, float voltage) {
    static char json_buf[256];
    time_t now; time(&now);
    snprintf(json_buf, sizeof(json_buf),
             "{\"dev_id\":\"%s\",\"ts\":%ld,\"data\":{\"temp\":%.1f,\"humi\":%.1f,\"voltage\":%.2f}}",
             DEVICE_ID, now, temp, humi, voltage);
    return json_buf;
}
上传到 OneNET 示例(UDP)
int upload_to_onenet(const char* json_data) {
    struct sockaddr_in dest_addr;
    int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);

    dest_addr.sin_family = AF_INET;
    dest_addr.sin_port = htons(5683);
    inet_pton(AF_INET, "183.230.40.33", &dest_addr.sin_addr);

    int sent = sendto(sock, json_data, strlen(json_data), 0,
                      (struct sockaddr *)&dest_addr, sizeof(dest_addr));
    closesocket(sock);
    return sent > 0 ? 0 : -1;
}

生产环境建议用 MQTT/TLS,安全性更高。


下行指令解析:实现闭环控制

云端可下发指令,如远程控制 GPIO、触发 OTA 升级等。

收到消息示例:

+RECV:0,24,{"cmd":"gpio","pin":5,"val":1}

解析流程:

void at_response_parser(uint8_t* data, int len) {
    char* recv_tag = strstr((char*)data, "+RECV:");
    if(recv_tag) {
        int link_id, data_len;
        sscanf(recv_tag, "+RECV:%d,%d,", &link_id, &data_len);
        char* json_start = strchr(recv_tag, '{');
        if(json_start) {
            cJSON* root = cJSON_Parse(json_start);
            parse_downlink_command(root);
            cJSON_Delete(root);
        }
    }
}

执行动作:

void parse_downlink_command(cJSON* cmd_obj) {
    const cJSON* cmd_type = cJSON_GetObjectItem(cmd_obj, "cmd");
    if(!cmd_type) return;

    if(strcmp(cmd_type->valuestring, "gpio") == 0) {
        int pin = cJSON_GetObjectItem(cmd_obj, "pin")->valueint;
        int val = cJSON_GetObjectItem(cmd_obj, "val")->valueint;
        gpio_set_level(pin, val);
        send_ack("gpio_ok", pin);
    }
    else if(strcmp(cmd_type->valuestring, "upgrade") == 0) {
        trigger_ota_update();
    }
}

每条指令执行后应回传 ACK,形成闭环。


低功耗运行:让电池活得更久一点 ⏳

终极目标: 平均电流 < 100μA

典型工作周期:

  1. 唤醒 → 初始化传感器
  2. 采集数据 → 组包加密
  3. 唤醒 NB-IoT → 注网 → 发送数据
  4. 等待下行指令(可选)
  5. 再次进入 PSM + Deep Sleep

配合定时唤醒(如每 2 小时一次),使用 5000mAh 电池可持续工作 5年以上


系统集成测试与典型应用 🧪

智能水表案例

  • 干簧管脉冲计数 → GPIO34 中断
  • 每日凌晨 2:00 上报累计用量
  • 使用单节 AA 电池,预估寿命 > 5 年

农业监控节点

  • 集成 SHT30、BH1750、NPK 传感器
  • 白天每 10 分钟上报,夜间每小时
  • 超限告警实时触发
  • 支持 LoRaWAN 备份链路

移动物体追踪

  • GPS + NB-IoT 混合定位
  • 室外用 GPS,室内用 Cell-ID 反查
  • Base64 编码后通过 CoAP 上报
  • 整机睡眠电流 8.5μA,纽扣电池可用数月

安全与运维:别忘了“看不见的手” 🛡️

设备身份认证

生成唯一指纹:

sprintf(device_fingerprint, "%s-%s-%08x", imei_str, imsi_str, EFUSE_BLK3_DATA0_REG);

申请短期 JWT Token,避免密钥泄露。

数据加密

  • 高敏感数据:DTLS/TLS
  • 普通数据:AES-128-CBC + Base64
  • 固件签名:ECDSA-P256,Secure Boot 验证

OTA 升级流程

四阶段模型:
1. 请求升级
2. 分片下发
3. 校验写入
4. 重启生效

支持断点续传,每个分片带 CRC16 校验。

日志与批量管理

  • 分级日志上传(DEBUG/INFO/WARNING/ERROR)
  • ELK 平台分析
  • CLI 工具 nbctl 实现批量配置与监控

这种高度集成的设计思路,正引领着智能物联网终端向更可靠、更高效的方向演进。无论是城市基建还是农田牧场,只要有电的地方,就有它的舞台。🌟

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

您可能感兴趣的与本文相关内容

### 关于ESP32-S3兼容的4G模块 ESP32-S3是一款功能强大的微控制器,支持Wi-Fi和蓝牙功能。为了实现4G通信能力,通常需要外接一个专门设计用于蜂窝网络连接的模组。以下是几个常见的与ESP32-S3兼容的4G模块选项及其特点: #### 1. **SIM7000E/SIM7000C** 这些是由SimCom公司生产的4G LTE Cat M1/NB-IoT/GSM多模无线通信模块。它们能够提供高速的数据传输速率以及低功耗模式下的长时间运行特性。 - 支持频段广泛,覆盖全球主要运营商使用的频率范围[^2]。 - 提供UART接口便于与其他MCU(如ESP32-S3)进行串口通讯。 #### 2. **Quectel EC25系列** EC25系列产品属于移远通信推出的工业级LTE Cat 4模块家族成员之一。该产品具有较高的稳定性,在恶劣环境条件下也能保持良好性能表现。 - 集成了GNSS接收机以满足定位需求的应用场景要求[^3]。 - 可通过AT指令轻松控制其工作状态并完成各种设置操作。 #### 3. **Fibocom L860-GL** 这是一款基于高通MDM9x07平台开发出来的高性能全网通解决方案。它不仅具备快速上网速度而且还能适应不同国家地区的法规标准差异情况。 - 符合最新的安全认证体系规范,保障用户信息安全不受威胁[^4]。 - 设计紧凑小巧适合嵌入式项目集成使用场合下部署实施计划安排考虑因素较多时优先选用此类规格参数较为理想的候选对象作为最终实施方案依据参考价值较高一些比较好一点吧! 对于具体选购建议方面来说,则需根据实际应用场景来决定最适合自己的型号版本号等内容信息如下所示代码片段展示了如何利用Python脚本查询当前已安装软件包列表的功能实现方法示例仅供参考学习用途而已哦~ ```python import pkg_resources def get_installed_packages(): installed_packages = [(d.project_name, d.version) for d in pkg_resources.working_set] return sorted(installed_packages) if __name__ == "__main__": packages_list = get_installed_packages() print(packages_list) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值