第1章 架构
Luat GPRS模块的 TCP/IP应用有两种连接模式,可以通过命令AT+CIPMUX=<n>来设置。当AT+CIPMUX=0时,是单链路模式;当AT+CIPMUX=1时,是多链路模式。默认设置是单链路模式。
当在单链路模式下,Luat GPRS模块可以工作在透传模式和非透传模式。在单链接模式下,模块作为一个TCP/UDP连接的客户端。
当在多链路模式下,Luat GPRS模块只工作在非透传模式。在多链接模式下,模块作为一个TCP/UDP连接的客户端,它总共可以建立8路连接。
图表1:Luat GPRS 模块TCP/IP 结构图
当输入TCPIP相关命令以后,模块的状态也会发生相应的迁移。查询状态的命令是AT+CIPSTATUS。
图表2:单链接时的状态机
关于单连接状态机的几点说明:
l 输入AT+CIICR,会马上进入IP CONFIG状态,当返回OK后,会进入到IP GPRSACT状态;
l 输入AT+CIPSTART后,会立马进入IP/UDP CONNECTING状态,如果后续模块上报CONNECT OK这个URC,表明连接服务器成功,此时进入CONNECT OK状态;
l 输入AT+CIPCLOSE后,立马进入TCP/UDP CLOSING状态,此时如果模块上报CLOSE OK,则表明关闭与服务器的连接成功,此时模块进入TCP/UDP CLOSED状态;
l 如果模块上报+PDP DEACT这个URC,则标志着模块释放PDP上下文,并进入了PDP DEACT状态;
l 在IP GPRSACT,IP STATUS,CONNECT OK以及TCP/UDP CLOSED状态下,输入AT+CGATT=0,则也可以使模块释放上下文,进入PDP DEACT状态;
l 模块进入PDP DEACT状态,仍需要输入AT+CIPSHUT,进入IP INITIAL状态;
l 模块在各个状态下均可以输入AT+CIPSHUT,进入IP INITIAL状态。
图表3:多链接时的状态机
AT+CIPMUX=0,可以将模块设置为单链接模式。在单链接模式下,只能同时存在一个TCP或UDP链接。CIPMUX缺省值就是0。
单链接模式下Luat GPRS模块可以工作在透传模式和非透传模式。可以通过命令AT+CIPMODE=<n>用来设置,当AT+CIPMODE=0时,是非透传模式 (普通模式);当AT+CIPMODE=1时,是透传模式。默认设置是非透传模式,
即CIPMODE缺省值为0。
非透传模式下,模块可以作为TCP客户端或UDP客户端与服务器建立链接。
使用TCIPIP命令之前,需要进行一些必要的查询,确定模块是否注册网络。以下命令示例中,黑色的是输入的命令,蓝色的是命令的返回信息。
如果GPRS附着状态为1,则可以继续往下进行APN的设置,PDP的激活,以及建立一个TCP或UDP链接。
透传模式是一种建立在TCP/IP应用任务下的特殊的数据传输模式,用来接收和发送数据。在透传模式下,一旦链接被建立,模块就处于数据模式,所有从串口输入输出的字符皆被认为是有效数据。
透传模式下,所有AT命令不可用。我们提供了在命令模式和透传模式间切换的方法。一旦切换到了命令模式,所有的AT命令又可以被使用了。
需要注意的是:只有单链接模式下,才可以使用透传模式。
AT+CIPMODE=1 开启透传模式。
在输入CIPMODE命令之前可以用AT+CIPCCFG 用来配置透传模式的相关参数:
l NmRetry 用来设置一个IP包的重传次数。缺省值是5。
l WaitTm 发送数据的时间间隔,单位是200ms。缺省值是2。
l SendSz 每次发送数据的字节数。1~1460,缺省值是1024。
l Esc 是否开启转义序列,默认开启。
一般的应用情况下,这个CIPCCFG命令不需要修改参数。
透传模式下,只能在单路链接下建立,在透传模式下,Luat GPRS模块也能工作在2种模式: TCP客户端, UDP 客户端。一旦链路建立,串口会上报 “CONNECT” ,模块处于数据模式,同时,DCD 被拉低。
以下是TCP客户端透传应用的例子:
通过下面的方法可以在透传模式和命令模式间自由切换:
(1) 如果AT+CIPCCFG 的第四个参数是1(默认值就是1),那么支持通过转义序列退出透传模式。默认的转义序列是 +++,为避免+++ 被错误的识别为数据,需要遵循以下步骤:
1. “+++”输入前1秒内无字符输入。
2.在 0.5 秒内连续输入“+++”,中间不能有其他字符。
3. “+++”输入后 0.5 秒内无字符输入。
(2) +++退出透传模式后,如果当前链接是激活的,ATO 命令可以从命令模式切换回数据模式,字符串 “CONNECT”会再次上报。
(3) 可以使用串口的DTR 脚。设置AT&D1(默认值就是1), DTR 脚至少接地 1 秒然后拉高。这个方法可以从数据模式切换到命令模式。上报字串“OK” 表示模块当前处于命令模式。
(4) 对于TCP客户端链接,如果远端服务器断开了链接,模块会自动切换到命令模式。
(5) 在数据传输中,如果模块的PDP场景被去激活(+PDP DEACT) ,模块也会自动切换到命令模式。
数据模式下,如果有来电,串口的RING脚会一直拉低,直到挂断或者接通电话;而来短信的时候,RING脚会有120ms长的低电平。这个RI低电平可以给唤醒MCU并给MCU提示,有电话或短信到来了。
要处理来电或者短信,MCU那边首先要使模块进入命令模式 (用 DTR 或者 +++),然后模块会得到正常的URC上报。
这时候就可以处理电话或者读短信了。
多链接模式下, Luat GPRS模块仅支持非透传模式。因此,在多链路模式下,命令AT+CIPMODE 是无效的。
多链路模式下,模块可以作为 TCP/UDP 客户端 使用。可以有8路链接(id = 0-7)同时共存,每一路链接可以是TCP或UDP类型。
下面是一个多链接应用示例:
Luat GPRS系列模块支持DNS域名自动解析,除了使用AT+CIPSTART=<mode>,<ip_addr>,<port>连接服务器IP地址以外,还可以使用AT+CIPSTART=<mode>,<domain name>,<port>跟远端服务器域名地址建立连接。
用户也可以使用命令 AT+CDNSGIP=<domain name >来查询所给域名的IP地址。
以下是域名解析的应用示例:
下面是一个多链接应用示例:
Luat GPRS系列模块有三种方法来发送数据:变长数据的发送,定长数据的发送和定时发送。用户可以通过命令AT+CIPACK用来查询当前链接的数据传送状态。
在单链接模式下,通过命令”AT+CIPSEND=<length>”可以进行固定长度的数据发送,发送长度是<length>。输入数据达到<length>个字节,不用发送<CTRL-Z>(即0x1A),数据会自动发送出去。
在多链接模式下,该命令的格式是:AT+CIPSEND=<id>,<length>。<id>是链接id,<length>是发送长度。
用 “AT+CIPSEND”直接发送即是不定长度的发送方式。输入“AT+CIPSEND”(如果是多链接模式,则是“AT+CIPSEND=<id>”),出现>后即进入数据输入模式,输入数据,然后发送CRTL-Z(即0X1A)即可发送数据。
不定长度的发送方式有以下情况,需要注意:
当数据中含有0X1A时,会将0X1A当做发送标识,并数据直接发送出去;当数据中含有0X1B时,会将0X1B认定为发送终止符,退出数据发送模式,回到AT命令状态。遇到含有0X1A或0X1B的数据,请用户自己转义。
固定长度发送和不定长度发送两种数据发送方式的示例,请参考: 4.1.1 如何建立一个TCP/UDP链接
还有第三种数据发送的方式:定时发送。首先,通过命令“AT+CIPATS=<mode>,<time>”设置自动发送时间。<mode>设置为1,打开超时自动发送。<time>是自动发送的超时时间,以秒为单位,取值范围为1~100。
不管多链接还是单链接,设置了超时自动发送功能为开,发送数据的时候,时间到了就会自动发送数据,不管数据个数有多少。
示例如下:
l AT+CIPHEAD=1”在数据前加IP头,格式:“+IPD ,<data length>: payload”。
l AT+CIPSHOWTP”在IP头里显示协议类型(TCP/UDP),这只有在CIPHEAD=1时有效。
实例示意如下:
l AT+CIPSRIP=1”显示数据发送方信息,格式:“RECV FROM: <IP ADDRESS>:<PORT >”。
通过这些信息,用户很容易就可以知道数据帧的源,数据大小,协议。这可以让用户把收到的TCP/UDP数据和AT命令区分开来。
在AT模式下,可以通过AT+CIPSTATUS查询当前的TCP/UDP数据链路状态。
透传模式下,DCD 脚用来实现这一功能。如果TCP/UDP 链接存在,DCD 脚被置位(拉低)。一旦链接断开,DCD 脚会被设无效(拉高)。
单链接下用户可以使用命令 AT+CIPCLOSE来关闭 TCP 或者 UDP 链接。
当上报CLOSE OK表示链接关闭成功。
在多链路模式下,链路序号<n>要使用AT+CIPCLOSE=<n>关闭链接。
注意:命令AT+CIPCLOSE 仅关闭当前TCP/UDP链接,但PDP场景仍然激活,此时可以直接AT+CIPSTART重新建立连接。当然,用户也可以用AT+CIPSHUT来关闭,这时候PDP 上下文会被去激活。如果想重新建立连接,需要+CSTT,+CIICR,+CIFSR重新发一遍来激活PDP。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!