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 实战组合拳:开机注册的标准流程

好了,四个指令都讲完了。咱们来串一下,一个标准的开机注册流程应该是怎样的:

  1. 上电,等待模组启动(一般2-5秒)
  2. AT+CFUN=1,确保模组处于全功能模式
  3. AT+CGATT=1,发起网络附着
  4. AT+CGREG?,查询注册状态,直到返回1或5
  5. AT+CSQ,确认信号质量,低于10要考虑调整天线位置
  6. 开始业务,发送数据或进入低功耗

这个流程我用了好几年,基本没出过问题。你想想看,每一步都在确认上一个环节是否成功,就像盖楼一样,地基打不牢,后面全是白搭。

最后提醒一句:NB-IoT模组的网络注册,受环境影响很大。地下室、电梯井、金属密闭空间,这些地方信号差是常态。不要指望模组能像手机一样到处都有信号。该加天线放大器就加,该换位置就换,别在软件层面死磕。

好,这一章就到这里。下一章我们讲数据收发,那才是真正干活的时候。