ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ESP32-S3+4G Cat.1随身WiFi开发实战:PPP拨号与AP共享全流程

ESP32-S3+4G Cat.1随身WiFi开发实战:PPP拨号与AP共享全流程 ESP32-S34G Cat.1随身WiFi开发实战PPP拨号与AP共享全流程做随身WiFi项目这两年我踩过不少坑。ESP32-S3配4G Cat.1模组搭建热点看似简单——一个MCU加一个通信模组跑通PPP拨号再开AP就完事了。实际做下来从AT指令初始化到PPP协商再到NAT转发每一步都有暗礁。这篇文章把整个开发链路从头到尾拆开讲不是概念科普是工程实操。适合正在做便携WiFi设备或物联网网关的嵌入式工程师参考。硬件方案与连接核心器件就两颗ESP32-S3做主控4G Cat.1模组做通信。市面上Cat.1模组选型不少常见的有中兴微、ASR、展锐三大阵营。硬件连接比较简单ESP32-S3通过UART和Cat.1模组通信ESP32-S3 4G Cat.1模组 GPIO43 (TXD) --- RXD GPIO44 (RXD) --- TXD GPIO4 (EN) --- PWRKEY (开机控制) GND --- GND供电是第一个坑。Cat.1模组突发电流峰值能到2A以上如果直接从ESP32-S3的3.3V LDO取电一拨号就重启。必须用独立DC-DC给模组供电建议留3A余量。选模组时要注意频段支持。国内 Cat.1模组主要跑在LTE B3/B5/B8频段确认你买的模组这几个频段都支持。有些便宜的模组阉割了B5电信低频段在偏远地区信号会差很多。AT指令初始化与网络注册模组上电后不是直接就能拨号得先走一遍AT指令初始化流程。这个流程的作用是确认模组活着、检查SIM卡、配置工作模式、等待网络注册。// AT指令初始化序列constchar*at_cmds[]{AT\r\n,// 握手确认ATE0\r\n,// 关回显ATCPIN?\r\n,// 检查SIM卡状态ATCSQ\r\n,// 查信号质量ATCREG?\r\n,// 查网络注册状态ATCGDCONT1,\IP\,\CMNET\\r\n,// 设置APNATCGACT1,1\r\n,// 激活PDP上下文};每条指令发送后要等响应不能一股脑全发出去。正常的响应处理逻辑// 简化的AT指令发送与等待响应intsend_at_cmd(uart_port_tport,constchar*cmd,constchar*expect,inttimeout_ms){uart_write_bytes(port,cmd,strlen(cmd));returnwait_for_response(port,expect,timeout_ms);}// 网络注册等待循环最多30秒intretry0;while(retry30){send_at_cmd(UART_NUM,ATCREG?\r\n,OK,1000);if(check_creg_registered())break;vTaskDelay(pdMS_TO_TICKS(1000));retry;}if(retry30){ESP_LOGE(TAG,Network registration failed);returnESP_ERR_TIMEOUT;}信号质量这个参数很关键。CSQ值低于15的话拨号成功率极低这时候应该先排查天线和射频匹配而不是反复重试拨号。不同芯片厂商的AT指令有差异。中兴微模组需要额外的ATZDOPN设置运营商ASR模组的PDP激活参数顺序不同。这个在开发中需要查对应芯片的AT指令手册。PPP拨号实现ESP-IDF自带PPP组件但配置容易出错。PPP拨号的核心是让ESP32-S3通过AT指令触发模组拨号然后接管模组串口的数据通道做PPP协商。ESP-IDF的pppos配置sdkconfig中需要开启CONFIG_PPP_SUPPORTy CONFIG_PPP_PAP_SUPPORTy CONFIG_PPP_CHAP_SUPPORTy拨号触发命令因模组而异。展锐Cat.1模组通常用ATD*99#或ATD*99***1#ASR模组可能用AT$QCRMCALL1,1。发送拨号命令后模组会进入数据模式串口不再响应AT指令。// PPP拨号流程简化版voidppp_connect_task(void*arg){// 发送拨号命令uart_write_bytes(UART_NUM,ATD*99#\r\n,9);// 等待CONNECT响应if(wait_for_response(UART_NUM,CONNECT,5000)!ESP_OK){ESP_LOGE(TAG,Dial failed);return;}// 创建PPP网络接口ppp_netifesp_netif_create_ppp(dial_ppp);if(!ppp_netif){ESP_LOGE(TAG,Failed to create PPP netif);return;}// 启动PPPesp_ppp_set_auth(ppp,PPP_AUTHTYPE_PAP,,);esp_ppp_start(ppp);}PPP协商过程中最常见的失败原因是LCP阶段超时。如果模组没有正确进入数据模式串口上全是乱码PPP根本无法握手。排查方法是先抓串口原始数据确认 CONNECT 响应后有正常的PPP帧0x7E开头。DNS配置容易被忽略。ESP-IDF的PPP组件默认不自动获取DNS需要手动从CGCONTRDP指令的响应中解析DNS地址并设置// 从AT指令响应中解析DNS// 响应格式: CGCONTRDP: 1,5,CMNET,10.x.x.x,255.255.255.255,// 100.64.x.x,100.64.x.x,,,,voidparse_dns_from_response(char*response){charprimary_dns[16]{0};charsecondary_dns[16]{0};// 跳过前5个字段提取第6和第7个字段if(extract_dns_fields(response,primary_dns,secondary_dns)){esp_netif_set_dns_info(ppp_netif,ESP_NETIF_DNS_MAIN,ip_addr_from_str(primary_dns));esp_netif_set_dns_info(ppp_netif,ESP_NETIF_DNS_BACKUP,ip_addr_from_str(secondary_dns));}}WiFi AP共享与NAT转发PPP拨号成功后ESP32-S3拿到了一个WAN侧IP。接下来要做的是开WiFi AP让设备接入然后做NAT把PPP的流量转发到AP侧。ESP-IDF的WiFi AP配置voidwifi_init_softap(void){esp_netif_create_default_wifi_ap();wifi_config_twifi_ap_config{.ap{.ssidESP32-WiFi,.ssid_lenstrlen(ESP32-WiFi),.password12345678,.max_connection8,.authmodeWIFI_AUTH_WPA2_PSK,},};esp_wifi_set_mode(WIFI_MODE_AP);esp_wifi_set_config(WIFI_IF_AP,wifi_ap_config);esp_wifi_start();}NAT转发是整个方案的技术核心。ESP-IDF从v5.0开始支持esp_netif_napt组件但默认没编译进去需要手动修改组件配置开启NAPT功能。开启NAPT后把PPP接口的流量NAT到AP接口// 在PPP连接成功的回调中启动NATvoidon_ppp_got_ip(void*arg,esp_event_base_tevent_base,int32_tevent_id,void*event_data){ip_event_got_ip_t*event(ip_event_got_ip_t*)event_data;ESP_LOGI(TAG,Got IP: IPSTR,IP2STR(event-ip_info.ip));// 启动NATesp_netif_napt_enable(wifi_ap_netif);}实测下行约6Mbps8台设备稳定运行72小时没断线。但要注意ESP32-S3的内存有限同时维持8个NAT连接是上限再往上加设备会出现连接超时。调试工具推荐做随身WiFi开发串口调试是家常便饭。不同芯片的AT指令差异大手动敲AT指令验证流程很费时间。虎王科技开源了一个随身WiFi硬件调试工具gitee.com/zesso/hardware_tool支持中兴微、ASR、展锐多芯片的串口调试内置常用AT指令模板。我在开发中经常用它快速验证模组状态和信号参数比裸用minicom省事不少。常见问题排查现象可能原因排查方法拨号失败无CONNECTPDP未激活或信号差查CSQ值重发CGACTPPP协商超时模组未进入数据模式抓串口原始数据确认0x7E帧连接后无法上网DNS未配置手动设置PPP接口DNS多设备时连接超时NAT表内存不足限制最大连接数到8运行几小时后断线模组过热或供电不足检查DC-DC输出稳定性随身WiFi项目看着小涉及的知识面却横跨嵌入式、通信协议和网络栈。从AT指令到PPP再到NAT每一环都有文档没写清楚的坑。这篇文章记录的是我在实际项目中验证过的方案希望能帮做同类项目的工程师少走弯路。如果你在调试4G模组AT指令时遇到奇怪的问题欢迎在评论区把现象贴出来我大概率踩过同样的坑觉得有用就收藏一下后续会继续更新随身WiFi开发中遇到的更多实战细节关注不漏下一期。
返回列表