4. 开机与网络注册:AT+CFUN、AT+CGATT、AT+CGREG、AT+CSQ
各位工程师朋友,咱们接着往下聊。上一章我们把模组的基本通信链路搞定了,这一章要解决一个更核心的问题——模组怎么连上基站,怎么注册到网络。
说白了,你手里的NB-IoT模组,如果连不上网,那它就是一块废铁。我见过不少新手,上来就发AT指令发数据,结果模组根本没注册上,折腾半天才发现是网络附着的问题。嗯,咱们今天就把这几个关键指令彻底讲透。
4.1 AT+CFUN:功能模式设置——让模组“醒着”还是“睡着”
先问大家一个问题:你拿到一个新模组,上电之后第一件事是什么?
我个人习惯,先查一下当前的功能模式。AT+CFUN这个指令,说白了就是控制模组的工作状态。它有几个关键参数:
| 参数值 | 功能描述 | 典型场景 |
|---|---|---|
| 0 | 最小功能模式(休眠) | 低功耗场景,比如电池供电的设备待机 |
| 1 | 全功能模式(正常) | 正常工作,收发数据 |
| 4 | 飞行模式(关闭射频) | 需要关闭无线信号,但保留AT指令交互 |
我在项目中遇到过一个问题:有个水表终端,上报完数据后进入休眠,结果下次唤醒时死活连不上网。查了半天,发现是休眠前把CFUN设成了0,但唤醒后忘了切回1。你想想看,模组都睡着了,怎么可能响应你?
重点来了:AT+CFUN=0 之后,模组会关闭射频和协议栈,此时大部分AT指令都不响应。只有AT+CFUN=1才能把它叫醒。
实际调试时,我建议你这样操作:
// 查询当前功能模式
AT+CFUN?
+CFUN: 1
// 设置为全功能模式(正常)
AT+CFUN=1
OK
// 设置为飞行模式(调试用)
AT+CFUN=4
OK
小技巧:调试阶段,我习惯先用AT+CFUN=4进入飞行模式,等所有参数配置好了,再切回AT+CFUN=1。这样可以避免模组在配置过程中频繁搜网,省电又省心。
4.2 AT+CGATT:网络附着与分离——模组的“入网许可证”
好,模组醒了,接下来要干什么?附着到网络。
AT+CGATT这个指令,就是让模组去跟基站说“我要上网”。你可以把它理解成手机开机后搜索运营商网络的过程。只不过NB-IoT的附着过程更轻量,速度也更快。
我曾经调试一个智能烟感项目,发现模组发完AT+CGATT=1后,等了十几秒都没返回OK。当时我以为是模组坏了,后来用抓包工具一看,原来是基站侧没开NB-IoT的附着功能。嗯,这里要注意,模组附着的成功率,很大程度上取决于基站配置。
常用的指令组合:
// 查询附着状态
AT+CGATT?
+CGATT: 1 // 1表示已附着,0表示未附着
// 手动附着网络
AT+CGATT=1
OK
// 手动分离网络
AT+CGATT=0
OK
警告:AT+CGATT=0 会强制模组与网络断开。如果你正在传输数据,突然执行这个指令,数据包会丢失。我建议在业务空闲时再做分离操作。
这里有个坑,我踩过好几次:有些模组在附着成功后,会主动上报URC消息(比如+CGATT: 1)。但如果你用的是老款模组或者固件版本太低,它可能不会上报。所以,不要依赖URC,养成主动查询的习惯。
4.3 AT+CGREG:网络注册状态查询——模组到底“注册”了没?
附着成功不等于注册成功。你想想看,附着只是让基站知道“我来了”,但注册才是真正拿到网络的身份认证。
AT+CGREG就是干这个的。它返回的状态码,能告诉你模组当前在网络中的注册情况:
| 状态码 | 含义 | 我的解读 |
|---|---|---|
| 0 | 未注册 | 模组还没找到网络,或者被拒绝了 |
| 1 | 已注册,归属地网络 | 正常状态,可以收发数据 |
| 2 | 正在搜索网络 | 模组在努力找网,稍等片刻 |
| 3 | 注册被拒绝 | 大概率是SIM卡问题或网络限制 |
| 5 | 已注册,漫游状态 | 跨运营商了,注意资费 |
我个人习惯,每次调试新模组,第一步就是查CGREG。如果返回0或3,那后面的所有操作都是白费功夫。
实际调试命令:
// 查询当前注册状态
AT+CGREG?
+CGREG: 0,1
// 第一个参数0表示不启用网络注册URC上报
// 第二个参数1表示已注册(归属地网络)
// 启用URC上报(推荐)
AT+CGREG=1
OK
// 之后注册状态变化时,模组会自动上报:
// +CGREG: 1
避坑指南:我曾经遇到一个案例,模组返回CGREG状态为1,但就是发不出数据。后来发现是核心网侧把该IMSI加入了黑名单。所以,CGREG=1只代表无线侧注册成功,不代表核心网允许你发数据。遇到这种情况,找运营商查一下。
4.4 AT+CSQ:信号质量查询——信号好不好,一查便知
最后一个指令,也是最常用的一个——查信号。
AT+CSQ返回两个值:信号强度和误码率。格式是:+CSQ: <rssi>,<ber>
其中rssi的范围是0-31,数值越大信号越强。31表示信号满格,99表示检测不到信号。ber是误码率,一般99表示无法测量,0-7表示不同等级的误码率。
我给大家一个经验值:
| RSSI值 | 信号强度 | 实际体验 |
|---|---|---|
| 0-9 | 极差 | 基本没法用,经常掉线 |
| 10-19 | 一般 | 能注册,但数据传输不稳定 |
| 20-25 | 良好 | 正常使用,偶尔重传 |
| 26-31 | 优秀 | 信号满格,通信顺畅 |
我在现场调试时,经常遇到客户说“模组连不上网”。我第一件事就是发AT+CSQ。如果返回99,99,那基本可以断定是天线没接好或者环境信号太差。有一次,客户把模组放在金属机箱里,信号直接被屏蔽了,CSQ永远返回99。把天线引出来,信号立马变成25。
// 查询信号质量
AT+CSQ
+CSQ: 22,99
// 22表示信号良好,99表示误码率无法测量(NB-IoT常见)
我的调试习惯:在代码里,我会每隔30秒查一次CSQ,如果连续3次低于10,就触发一次网络重附着(AT+CGATT=0 再 AT+CGATT=1)。这个策略帮我解决了不少信号波动导致掉线的问题。
4.5 实战组合拳:开机注册的标准流程
好了,四个指令都讲完了。咱们来串一下,一个标准的开机注册流程应该是怎样的:
- 上电,等待模组启动(一般2-5秒)
- AT+CFUN=1,确保模组处于全功能模式
- AT+CGATT=1,发起网络附着
- AT+CGREG?,查询注册状态,直到返回1或5
- AT+CSQ,确认信号质量,低于10要考虑调整天线位置
- 开始业务,发送数据或进入低功耗
这个流程我用了好几年,基本没出过问题。你想想看,每一步都在确认上一个环节是否成功,就像盖楼一样,地基打不牢,后面全是白搭。
最后提醒一句:NB-IoT模组的网络注册,受环境影响很大。地下室、电梯井、金属密闭空间,这些地方信号差是常态。不要指望模组能像手机一样到处都有信号。该加天线放大器就加,该换位置就换,别在软件层面死磕。
好,这一章就到这里。下一章我们讲数据收发,那才是真正干活的时候。