之前的是TCP 示例,这里再继续是TCP 使用 SSL 示例,下面的开机等之前多次介绍,这里因为用到,所以就再次贴出来。
**开机:**这个之前也讲过怎么开机,这里再列出来:通过拉低 powerkey2 秒进行开机,开机以后通过串口循环发送 AT 直到收到 OK,如果 90 秒没有收到 OK 请拉低 RESET_IN_N 引脚 150ms 以上。
查询卡状态**AT+CPIN?**查询卡状态,直到收到+CPIN: READY,如果 10s 内没有收到建议重启模块。
查询网络注册情况:**AT+CGATT?**查询是否注册网络收到+CGATT: 1 值是 1 即为注册成功,正常情况下注册时间不会超过两分钟,如果超过两分钟没有注册可以进入飞行模式五秒后退出再查询,或者直接重启模块。这个就是还是附着分离的情况了,也就不在贴出来,毕竟实际上也没太大难度,就是知道代码就好了。
配置连接:****AT+CIPMUX=0设置为单链接模式 ;AT+CIPQSEND=1设置为快发 注意:这两条一定要在启用网络之前配置,不然会失败。
12.1 启动多 IP 连接:AT+CIPMUX
之前在嵌入式TCPIP中也研究过了,这里再贴出一下,便于应用到实际中去。


这个看起来还是比较重要呢,毕竟TCP例子里面没强调这个呢。
激活网络 :
AT+CSTT配置网络,非私有 APN 以外 Cat1 的固件支持根据卡自动配置 APN,直接输入 AT+CSTT 即可,模块会按照自动获取的 APN 设置 CSTT 的APN。 AT+CIICR激活网络,在 IP START 的状态使用 AT+CIICR 激活网络,激活以后通过 AT+CIFSR查询是否获取 IP,如果成功就可以开始配置 TCP 连接了,如果不成功使用 AT+CIPSHUT 关闭移动网络,从 AT+CSTT 重新进行。
配置连接:
AT+CIPSSL=1开启 SSL 功能开关为开
**AT+FSCREATE="server.crt"**创建 CA 证书文件
**AT+FSCREATE="client.crt"**创建客户端证书文件
**AT+FSCREATE="client.key"**创建客户端密钥文件
AT+FSWRITE="server.crt",0,2080,15文件长度 2080 只是举例,要根据实际填写。下同。
AT+FSWRITE="client.crt", 0,128,10输入客户端证书文件
AT+FSWRITE="client.key",0,188,10输入客户端密钥文件
**AT+SSLCFG="cacert",0, "server.crt"**设置服务器 CA 证书 SSL 上下文 id,在单链接的情况 下缺省为 0
**AT+SSLCFG="clientcert",0, "client.crt"**设置客户端证书
**AT+SSLCFG="clientkey", 0,"client.key"**设置客户端 KEY
AT+SSLCFG="seclevel",0,2设置安全等级
AT+SSLCFG="ciphersuite",0,0X0035设置加密套件
AT+SSLCFG="clientrandom",0,101B12C3141516171F19202122232425262728293031
323334353637设置随机数
这个之前的TCP例子里面确实没有,不过这里却加上了,这就是区别吧。
连接服务器
AT+CIPSTART=TCP,tcplab.openluat.com,57513连接服务器,请使用自己服务器测试
AT+CIPSEND=10发送数据(确定长度)
AT+CIPSHUT关闭连接
AT+CIPSSL=0关闭 SSL
这里也是需要连接服务器了,可能以后用到的应该是这种模式了。
举例说明:指令报错的异常处理及示例说明(这些直接贴的例子呢,我还没模块,也没研究透,就是作为一个参考)
^MODE: 17,17
+E_UTRAN Service
+CGEV: ME PDN ACT 1
+NITZ: 22/10/26,07:37:55+32,0
//以上是模块开机后主动上报的数据
16:25:26.408\]发→◇AT \[16:25:26.410\]收←◆AT OK \[16:25:29.710\]发→◇ATI \[16:25:29.715\]收←◆ATI AirM2M_780E_V1021_LTE_AT OK \[16:25:30.205\]发→◇AT+CPIN? \[16:25:31.205\]收←◆AT+CPIN? +CME ERROR: 10 //未检测到 SIM 卡,重新安装 sim 卡后,需要给模块复位重启才能识别到 卡 \[16:25:33.202\]发→◇AT+CPIN? \[16:25:33.205\]收←◆AT+CPIN? +CPIN: READY OK \[16:25:35.646\]发→◇AT+CSQ \[16:25:35.650\]收←◆AT+CSQ +CSQ: 23,0 OK \[16:25:38.032\]发→◇AT+CGATT? \[16:25:38.034\]收←◆AT+CGATT? +CGATT: 1 OK \[16:25:39.490\]发→◇AT+CEREG? \[16:25:39.492\]收←◆AT+CEREG? +CEREG: 0,1 OK //以上为主动查询模块的联网情况, 模块已经附着网络成功 \[16:25:55.169\]发→◇AT+CIPMODE=0 \[16:25:55.176\]收←◆AT+CIPMODE=0 OK //设置 TCPIP 应用模式为非透明传输模式 \[16:25:55.908\]发→◇AT+CIPMUX=0 \[16:25:55.911\]收←◆AT+CIPMUX=0 OK //设置为单链接模式(默认是单路链接) \[16:25:56.610\]发→◇AT+CIPQSEND=1 \[16:25:56.612\]收←◆AT+CIPQSEND=1 OK //设置非透传数据为快发送模式 \[16:26:00.198\]发→◇AT+CSTT \[16:26:00.201\]收←◆AT+CSTT OK //启动任务并设置接入点 APN、用户名、密码(cat1 模块内部有写 APN,可以不需要设置, 默认为空,专网卡、定向卡除外) \[16:26:04.469\]发→◇AT+CSTT \[16:26:04.472\]收←◆AT+CSTT +CME ERROR: 3 //提示操作错误,相同的指令连续输入 2 次,会报这个错误,可以通过发 AT+CIPSHUT 关闭移动场景后,在输入此命令 \[16:26:04.479\]发→◇AT+CIICRR \[16:26:04.621\]收←◆AT+CIICRR ERROR //激活移动场景 (出现这个指令错误,一般都是模块内部没有写这条指令或者指令 输入错误) \[17:27:53.099\]发→◇AT+CIICR \[17:27:53.100\]收←◆AT+CIICR +PDP: DEACT +CME ERROR: 65535 //查询本地 IP 地址 (在模块附着网络失败后会出现此错误,可以通 过 AT+CGATT? 来查询,可以走断网异常流程来处理 \[16:26:07.030\]发→◇AT+CIFSR \[16:26:07.034\]收←◆AT+CIFSR 10.17.70.180 \[16:26:08.509\]发→◇AT+CIPSTART=1,"TCP","112.125.89.8",37076 \[16:26:08.516\]收←◆AT+CIPSTART=1,"TCP","112.125.89.8",37076 +CME ERROR: 3 //在单路链接的情况下,使用多路链接的指令会出现此错误 \[16:26:30.509\]发→◇AT+CIPSTART="TCP","112.125.89.8",37076 \[16:26:30.516\]收←◆AT+CIPSTART="TCP","112.125.89.8",37076 OK STATE: IP STATUS CONNECT FAIL //在联网正常的情况下,一直无法链接服务器,可以检查一下指令的符号是 否有输入错误,使用中文的符号会导致异常 \[16:41:31.516\]发→◇AT+CIPSTART="TCP","112.125.89.8",37076 \[16:26:31.980\]收←◆AT+CIPSTART="TCP","112.125.89.8",37076 OK \[18:00:01.142\]收←◆ CONNECT OK //链接成功 \[16:26:38.667\]发→◇AT+CIPSEND \[16:26:38.675\]收←◆AT+CIPSEND \> //出现此符号后才能发送数据,没有出现时发送数据会异常 \[16:26:43.648\]发→◇666888 \[16:26:43.651\]收←◆666888 \[16:26:46.292\]发→◇□ //HEX 格式的大写 1A \[16:26:46.306\]收←◆ DATA ACCEPT:8 \[16:26:48.597\]发→◇AT+CIPSTATUS \[16:26:48.604\]收←◆AT+CIPSTATUS OK STATE: CONNECT OK //查询链路状态 \[18:07:05.517\]发→◇AT+CIPSHUT \[18:07:05.521\]收←◆AT+CIPSHUT \[18:07:07.521\]收←◆ SHUT OK //关闭移动场景 常见问题 (1) **连接服务器失败** 1. 服务器必须是公网地址 2. 使用 PC 上的 TCP UDP 测试工具客户端、或者 mqtt.fx,连接服务器确认一下是否可以连接成功,排除服务器故障 3. 检查下模块信号、网络注册、网络附着、PDP 激活状态 4. 检查下 SIM 卡是否欠费【4G 模块有一种欠费表现:无法注册 4G 网络,可以注册 2G 网络】 (2)**最多同时支持多少个连接** AT 版本最多 8 个连接 (3) 关于"TCP 单/多链接时,刚开始发送数据成功,服务器能收到,**间隔十几分钟,模****块端****AT+CIPSTATUS****查询链接存在,****AT+CIPSEND****数据发送成功,但服务器却没****收到数据**"问题 用保活探针(CIPTKA)的方法或者心跳包(HEARTCONFIG)来解决,我直接把链接那面的文章贴过来了,就不给网址了。 ****①、问题点**** 在测试合宙CAT1模块AT版本固件的时候,经常会遇到这样的问题: CIPSTART,命令建立了TCP单链接或多链接了, 开始发送数据正常,十几分钟不发任何数据,再发数据的时候提示SEND OK,但是服务器侧未收到任何数据. ②****、问题原因**** cat1模块不是直接跟服务器连接的,而是通过NAT(即网络地址转换)与服务器连接,NAT就是网络地址转换。NAT会维护一个映射表,这个映射表会定时检查,如果10分钟内这路socket跟服务器没任何数据往来,就会回收这路的地址,10分钟后应用上再发数据就找不到路由地址了;如果10分钟内有数据更新,计时器会重新置为10分钟。 如果10分钟内这路socket跟服务器没任何数据往来,就会回收这路的地址,10分钟后应用上再发数据就找不到路由地址了------ 这个就是发送数据提示SEND OK,服务器却收不到任何数据的原因。 ③****、解决之道**** ****a、********用保活探针(CIPTKA)的方法来解决**** 以多链接示例如下: ****AT+CIPTKA=1,180,75,6**** // 打开保活探针,时间间隔为180秒 OK AT+CIPMUX=1 OK AT+CIPSTART=1,TCP,domain.aaa.bbb,12345 OK 1, CONNECT OK AT+CIPSTART=5,TCP,domain.aaa.bbb,12345 OK 5, CONNECT OK \[13:55:49.974\]发→◇AT+CIPSEND=1,10 \[13:55:49.983\]收←◆ \> \[13:55:53.599\]发→◇0123456789 \[13:55:53.604\]收←◆ 1, SEND OK // 此时服务器收到数据 \[13:56:22.742\]发→◇AT+CIPSEND=5,10 \[13:56:22.748\]收←◆ \> \[13:56:24.646\]发→◇9876543210 \[13:56:24.653\]收←◆ 5, SEND OK // 此时服务器收到数据 \[14:17:59.969\]发→◇AT+CIPSEND=1,10 // 1,5 这两个链接时隔21分钟再次发送数据,仍然能收到数据. \[14:17:59.975\]收←◆ \> \[14:18:01.410\]发→◇0123456789 \[14:18:01.416\]收←◆ 1, SEND OK // 此时服务器收到数据 \[14:18:08.897\]发→◇AT+CIPSEND=5,10 \[14:18:08.903\]收←◆ \> \[14:18:11.138\]发→◇9876543210 \[14:18:11.146\]收←◆ 5, SEND OK // 此时服务器收到数据 ****注:保活探针在模块休眠(AT+CSCLK=2)情况下同样有效**** ****b、********用心跳包(**** ****HEARTCONFIG**** ****)来解决**** \[15:30:02.477\]发→◇AT\^HEARTCONFIG=1,0,180 \[15:30:02.484\]收←◆ OK \[15:30:26.720\]发→◇AT\^HEARTBEAT=0,tcp---test \[15:30:26.727\]收←◆ OK \[15:30:45.196\]发→◇AT+CIPMUX=1 \[15:30:45.201\]收←◆ OK \[15:30:52.571\]发→◇AT+CIPSTART=0,TCP,domain.aaa.bbb,12345 //此服务器是个回环服务器,收到数据原样回送到对端 \[15:30:52.579\]收←◆ OK \[15:30:52.735\]收←◆ 0, CONNECT OK \[15:33:02.643\]收←◆ //3分钟后收到数据,说明服务器收到了模块发的心跳数据 +RECEIVE,0,10: (4)**780E****模块****tcp****联网成功 每次开机都需要重新下发****AT****指令连接吗?** 是的,模块不保存已输入 AT 指令 (5)**模块上报****PDP: DEACT****, 这个要怎么处理** 4G 模块会产生一个+PDP: DEACT 的 URC 提示,出现此提示说明已经激活的 PDP 承 载被网络端去激活了,此时仍然需要向4G模块发送AT+CIPSHUT命令主动关闭PDP,然后再重新激活,再重新连接 TCP 服务器。 (6)**重试多次****PDP****一直激活失败** 如果重试多次,PDP 一直激活失败,则尝试使用如下手段恢复: 1、使用 RESET 引脚复位模块 2、极端情况下,直接给模块断电,再上电,POWER KEY 引脚拉低开机 (7) **如何发送心跳包** cat1 模块如何发送心跳包 cat1 模块如何发送心跳包 (8) **由数据透传状态转向命令状态,发****+++****切换不了** 发送时不要勾选回车换行 (9) **TCP****调试网址** https://netlab.luatos.com/ (10) **当我连续发送几百个字节的数据的时候,在里面会夹杂****0x0a0x0d****这种,如何** **避免这个呢** 通过 AT+CIPRXF 设置接收的数据末尾是否自动添加回车换行(网络连接前设置) 12.12 设置接收的数据末尾是否自动添加回车换行:AT+CIPRXF    这个根据需要设置,如果防止会出现这种数据可以考虑选择1不添加这个后缀。当然根据需求来看,开始可以尝试添加,测试时候遇到问题再去掉防止使用之中出现丢失数据的意外。当然因为是收到的数据,可以考虑加CRC等校验,进而去掉回车换行,这个需要正式使用过程的问题。 (11) **支持什么加密证书** 支持证书配置,支持单向认证和双向认证 支持如下六种加密套件: 0X0035 TLS_RSA_WITH_AES_256_CBC_SHA 0X002F TLS_RSA_WITH_AES_128_CBC_SHA 0X0005 TLS_RSA_WITH_RC4_128_SHA 0X0004 TLS_RSA_WITH_RC4_128_MD5 0X000A TLS_RSA_WITH_3DES_EDE_CBC_SHA 0X003D TLS_RSA_WITH_AES_256_CBC_SHA256 (12) **数据发送接收缓存问题** 使用 CIPSTART 建立的 socket 连接,接收数据没有缓存机制,收到数据后,立即通过AT 口输出,每包最多 1460 字节;例如服务器下发一个 70KB 的文件,模块会连续收到多个包,通过 AT 口连续多次输出,发送每包最多也为 1460 字节。 补:现在找到工作了,之前的清闲也就没了,加上最近工作有些忙,有时候晚上加班,不过还好可以调休,所以只有在空闲时间继续研究呢。