全部产品
阿里云办公

C-SDK使用(GPRS)

更新时间:2017-09-04 19:13:09

GPRS使用场景1

mqtt_at

  • 目前我们和中兴物联、深圳有方、深圳广和通合作,把IoT SDK集成到蜂窝模组芯片里面,对MCU提供MQTT AT指令。
  • 这种方式好处是:一方面协议运行更稳定,另一方面对MCU资源要求更低。
  • 使用GPRS/LTE的场景,建议采用这种方式,MCU只需要发送3条命令给模组就可以接入IoT套件,降低了开发成本。

MQTT AT指令使用说明:

  • 设备认证命令 AT+CLOUDAUTH
  1. AT+CLOUDAUTH=<pkey>,<psrt>,<dname>,<dsrt>,<host>
  2. <pkey>:产品key,字符串类型,最大长度64Byte
  3. <psrt>:产品秘钥,字符串类型,最大长度64Byte
  4. <dname>:设备名字,字符串类型,最大长度64Byte
  5. <dsrt>:设备秘钥,字符串类型,最大长度64Byte
  6. <host>:鉴权主机名,字符串类型,最大长度64Byte
  • MQTT连接命令:AT+CLOUDCONN,连接成功后,设备端默认订阅topic /${pkey}/${dname}/get的消息
  1. AT+CLOUDCONN=<keepAlive>,<clean>,<version>
  2. <keepAlive>:keepAlive时间设置,必需指定,范围60~180
  3. <clean>:是否清除session,数字类型,0-不清除 1-清除
  4. <version>:mqtt版本3 = 3.1 4 = 3.1.1
  • MQTT订阅topic消息: AT+CLOUDSUB
  1. AT+CLOUDSUB=<topic>,<qos>
  2. <topic>:申请订阅的topic,字符串类型
  3. <qos>:该topic对应的qos等级,数字类型,目前支持QoS级别是01
  • MQTT pub消息到topic命令:AT+CLOUDPUB, 参数topic是可选的,不指定的话,默认往topic /${pkey}/${dname}/update发送消息
  1. AT+CLOUDPUB=<topic>,<qos>,<message>
  2. <topic>:发布的主题
  3. <qos>:发布消息的QoS等级
  4. <msg>:消息体或消息长度(每次发布消息长度需小于1024
  • MQTT 收到pub消息命令:+CLOUDPUBLISH
  1. +CLOUDPUBLISH:<packId>,<topic>,<msg_len>,<msg>
  2. <packId>:数据包id
  3. <topic>:接收到的topic名字
  4. <msg_len>:接收到的消息长度
  5. <msg>:接收到的消息内容
  • 取消对topic的消息订阅命令:AT+CLOUDUNSUB
  1. AT+CLOUDUNSUB=<topic>
  2. <topic>:取消对topic的订阅消息
  • 断开MQTT连接释放资源命令:AT+CLOUDDISCONN
  1. AT+CLOUDDISCONN
  2. 终端主动断开和服务端的连接,然后做mqtt资源释放。
  3. 断开连接后,如果需要pub消息,需要重新的做设备认证和设备连接操作。

完整例子:

  1. /*
  2. *最小执行的指令集,包括设备认证、连接、默认pub消息到/pk/${deviceName}/update
  3. */
  4. AT+CLOUDAUTH=${pkey},${psrt},${dname},${dsrt},iot-auth.aliyun.com
  5. AT+CLOUDCONN=80,0,4
  6. AT+CLOUDPUB=1,{"message":"hello world"}

说明

  • 目前中兴物联的4G模组ME3630、ME3610和深圳有方的N10 GPRS模组已经调通,可以使用该MQTT AT指令。
  • 深圳广和通的GPRS模组正在开发中,预计3月初可以调通。

GPRS使用场景2

gprs_at

  • 设备端IoT SDK支持串口AT指令,运行在MCU上面。
  • 目前暂时不支持TLS传输MQTT数据。
准备工具
  • MCU:选用的是micokit-3165,当然可以选用STM32系列。
  • GPRS/LTE模组:选用的是SIM900A GPRS模组
  • IAR 或 Keil IDE工具
创建IAR工程
  • 串口AT指令的方式,目前只支持MQTT协议,并且不支持TLS来传输MQTT数据。
  • 以mico平台为例,需要添加MQTT协议的源文件路径有:
  1. sdk/common/src
  2. sdk/examples/mico/mqtt
  3. sdk/platform/mico/src
  4. sdk/platform/hardware/src
  5. sdk/src/mqtt/MQTTClient-C/src
  6. sdk/src/mqtt/MQTTPacket/src
设定IAR工程的头文件路径

at_include

移植说明
  • 不同的MCU平台,需要修改文件aliyun_iot_platform_uart.c,并重写uart相关的函数,接口如下:
  1. /*
  2. send uart data
  3. */
  4. INT32 aliyun_iot_uart_send(INT8 *pSendBuffer, INT32 bufferLen);
  5. /*
  6. receive uart data
  7. */
  8. INT32 aliyun_iot_uart_recv(INT8 *pRecvBuffer, INT32 bufferLen, UINT32 timeOutMs);
  9. /*
  10. initialize the baud rate of the uart
  11. */
  12. INT32 aliyun_iot_uart_init();
  13. /*
  14. the length of the data readable inside uart buffer
  15. */
  16. INT32 aliyun_iot_uart_buffer_len();
  • 不同的GPRS/LTE模组,如果AT命令格式不同,需要修改文件sdk/platform/hardware/src/aliyun_iot_mqtt_nettype.c,并修改对应AT命令宏定义。
  • GPRS/LTE模组注册网络相关AT命令,MQTT初始化之前需要先调用aliyun_iot_phy_net_connect()做注册物理网络初始化。
  1. //AT+CPIN? 检查SIM卡是否正常
  2. #define AT_GPRS_CHECK_SIM_CARD_FMT "AT+CPIN?\r\n"
  3. //AT+CREG?
  4. #define AT_GPRS_CHECK_REG_NET_FMT "AT+CREG?\r\n"
  5. //AT+CGATT?
  6. #define AT_GPRS_CHECK_GPRS_NET_NORMAL_FMT "AT+CGATT?\r\n"
  7. //AT+CFUN=1,1
  8. #define AT_GPRS_RESTART_RF_MODULE_FMT "AT+CFUN=1,1\r\n"
  9. //ATE0 close echo function
  10. #define AT_GPRS_CLOSE_ECHO_FUNC_FMT "ATE0\r\n"
  11. //AT+CSTT set apn
  12. #define AT_GPRS_SET_APN_FUNC_FMT "AT+CSTT=\"%s\"\r\n"
  13. //AT+CIICR,激活网络
  14. #define AT_GPRS_ACTIVATE_FMT "AT+CIICR\r\n"
  15. //AT+CIFSR get local ip address,获取到IP地址才认为注册网络成功
  16. #define AT_GPRS_LOOPUP_IP_ADDR_FMT "AT+CIFSR\r\n"
  • GPRS/LTE模组TCP相关AT命令
  1. // tcp connect
  2. // AT+CIPSTART= <type>,<addr>,<port>
  3. #define AT_TCP_SOCKET_CONNECT_FMT "AT+CIPSTART=\"TCP\",\"%s\",%d\r\n"
  4. // tcp fast close
  5. // AT+CIPCLOSE=<Socket id>
  6. #define AT_TCP_SOCKET_CLOSE_FMT "AT+CIPCLOSE=1\r\n"
  7. //AT+CIPSHUT
  8. #define AT_TCP_SOCKET_SHUTDOWN_FMT "AT+CIPSHUT\r\n"
  9. // tcp send data
  10. // AT+CIPSEND=<link id>,<length>
  11. #define AT_TCP_SOCKET_SEND_DATA_FMT "AT+CIPSEND=%d\r\n"
  12. // tcp recv data
  13. // +IPD,<id>,<len>:<data>
  14. // 目前代码里面是按照此格式做的MQTT数据解析
  15. #define AT_TCP_SOCKET_RECV_DATA_FMT "+IPD,%d,%d:%s"
  16. //set ip header AT+CIPHEAD=1,设置MCU接收TCP的数据格式为 +IPD,<id>,<len>:<data>
  17. #define AT_TCP_SOCKET_IP_HEADER_SET_FMT "AT+CIPHEAD=1\r\n"