![](http://openluat-luatcommunity.oss-cn-hangzhou.aliyuncs.com/images/20200815112907421_Air724UG CSDK网络连接流程.png)
一、通信前的准备
1.1,初始化网络跟踪
用来设置网络状态主动上报,设置后当网络发生变更会主动上报状态,这样就可以及时获取当前网络状态了。AT+CREG=2
1.2,等待网络注册成功
网络注册成功表示模块成功注册到2G或者4G网络,对于2G网络来说还存在CS域的注册和PS域的分别注册,而4G网络因为没有CS域,所以注册成功就表示PS域可用了。而真正使用socket建立连接又要等PS域注册成功后才能正常使用。所以为了简化这个流程,我们只需要判断主动上报信息中包含如下信息中的其中一个,就认为网络注册成功
- +CREG:1(2G/4G正常网络)
- +CREG:5(2G/4G漫游网络)
- +E_UTRAN Service (表示注册的是4G网络)
- +GSM Service(表示注册的是2G网络)
- ^MODE: 17,17(表示注册的是4G网络)
- ^MODE: 3,1(表示注册的是2G网络)
1.3,判断是否为4G网络
4G网络因为所有的交互都是基于数据域的,所以网络注册成功后,核心网默认会分配一个承载(默认PDP),这个承载就可以直接用来进行socket通信。如果注册的是2G网络,那就需要向网络发起建立PDP承载的请求,再由网络分配PDP链路来进行socket通信。判断是否为4G网络,可以通过2,等待网络注册成功
中的主动上报来判断,也可以通过AT+CREG?
指令来查询当前注册的网络
1 | AT+CREG? |
act值为7的时候表示的是4G网络,0/1/3表示的是2G网络。
1.4,等待PDP激活
承载激活成功后会主动上报*CGEV: ACT
开头的URC信息
1 | *CGEV: ACT,<cid>,<apn>,<ip> |
1.5,获取激活PDP的IP地址
PDP激活后,可以根据*CGEV
的上报来获取IP地址,也可以通过AT+CGDCONT?
指令查询IP地址
1 | AT+CGDCONT? |
其中PDP_addr
字段表示的是当前IP地址
1.6,绑定IP地址
调用socket接口中的bind
接口来绑定当前PDP的IP地址,来进行socket通信
1.7,建立socket连接
这步就不去赘述了,不是本文的重点。
二、被动掉网问题
在处理掉网问题之前首先要搞清楚掉网这个概念,掉网其实对于模块来说分好几种情况:
- 1,断网:信号差或者基站繁忙而造成的掉网,也就是彻底失去了无线网络连接,也无法进行任何数据业务了,包括语音业务
- 2,PDP去激活:这种情况下其实模块和基站之间还是能保证无线通信的,只不过无法上网了。
- 3,PS无法附着:这种情况只出现在非4G网络下,这个时候只能打电话,而无法上网。
- 4,被服务器断开,这种断开只是TCP/IP应用协议断开,和模块无线通信其实没任何关系,断开只要重新进行socket连接就可以了。
2.1,断网
断网后,模块会尝试自动恢复,如果长时间未能恢复可以尝试重启设备或者进出飞行模式来恢复。
2.2,PDP去激活
pdp去激活,一般是由核心网主动发起的,可能是因为网络繁忙或者2G网络下长时间未进行数据通信。这种情况下,要想恢复,需要区分当前的网络是4G网还是2G网:
- 1,4G网络下由于PDP是由网络主动分配的,所以一般发生这种情况可以通过进出飞行模式来恢复
- 2,2G网络下可以通过重新激活PDP来恢复网络