应用开发指南

设备端开发问题

最近更新时间:2021-04-26 15:17:07

设备连接物联网开发平台失败有哪几类原因?

设备连接失败有多种原因,例如设备与云端网络连接不通,设备鉴权失败,无线网络信号问题导致超时等,可根据设备连接过程 SDK 的错误日志类型来区分处理,一般处理步骤如下:

  1. 首先需要检查设备端本地网络与物联网开发平台的连接情况,可以按以下步骤检查网络连接情况:
    • ping iotcloud-mqtt.gz.tencentdevices.com 检测主机是否可达情况。
    • telnet iotcloud-mqtt.gz.tencentdevices.com 8883 (TLS) 或 1883 (NOTLS)检测端口连接情况。
    • 如果执行上面命令的结果都是正常的,那可能还需要检查本地防火墙策略。
  2. 在无线网络环境,如果由于信号质量和环境干扰问题,导致连接超时,则可以修改 SDK 的可变参数里面的超时设置,如下是 C-SDK 代码 qcloud_iot_export_variables.h 里的默认配置:
    /* default MQTT/CoAP timeout value when connect/pub/sub (unit: ms) */
    #define QCLOUD_IOT_MQTT_COMMAND_TIMEOUT                             (5 * 1000)
  3. 如果网络连接均无问题,设备鉴权错误也会导致连接失败,需要检查以下设置:
    • 检查使用的设备信息参数是否正确。常见的错误是设备信息或密钥多输了空格,设备信息与密钥信息不一致,或者证书文件名与代码中书写的文件名不一致等细微错误。
    • 证书类连接,如果本地时间错误,也会导致 TLS 连接失败。需要本地安装 ntp client 软件进行对时。
  4. 使用 Android SDK 进行 MQTT 连接时,提示“错误的用户名或者密码”。
    如果确认设备参数(ProductId、DeviceName、DevPsk)都配置正确的话,即可检查一下测试设备的系统时间是否正确,例如,使用 adb shell date 查看 Android 设备的系统时间。

设备端和物联网开发平台是什么通信协议?

设备端和物联网平台通过数据模板的格式实现数据交互,数据通过 MQTT 的 payload 承载,SDK 已完成 Topic 的订阅及回调的处理,用户基于数据模板协议开发业务逻辑即可。

设备为何一直上下线?

物联网接入层有设备互踢的逻辑,如果是用同一个设备 ID 在不同地方登录,会导致其中一方被另一方踢下线。因此发现设备一直上下线时,需要确认是否有不同的人或者多线程在使用同一个设备 ID 执行登录操作。

设备端在连接断开后会进行自动重连吗?

使用设备端 SDK 建立 MQTT 连接时。如果初始化参数开启了自动重连(默认开启),那么会进行自动重连的操作。在 SDK 的 Yield 函数中,会根据报文收发以及心跳包行为是否正常来判断网络连接状况,如果出现连接断开情况,会自动进行重连。同时为了避免在网络故障情况下频繁进行重连,SDK 的重连间隔是动态变化的,从最小值开始:

  • 如果重连失败,重连间隔就会翻倍增长,如果重连间隔达到最大值后仍然还是连接失败则返回重连超时错误。
  • 如果是用户手动断开连接的情况,如主动调用 Destroy 函数,则不会进行自动重连。

qcloud_iot_export_variables.h 里面有重连间隔最大值的默认设置:

/* MAX MQTT reconnect interval (unit: ms) */
#define MAX_RECONNECT_WAIT_INTERVAL                                 (60 * 1000)

Android SDK 集成到工程中编译出错该怎么办?

采用远程依赖的方式编译出错的话,可能会由于远程库更新不及时导致编译出错。可以在 gradle 文件中将依赖方式修改成本地库依赖:

  • compile project(':iot_core')
  • compile project(':iot_service')

嵌入式设备资源比较受限,如何减小 C-SDK 运行内存及库大小?

有如下建议:

  1. 首先可以把不需要使用的功能关闭,例如在 make.setting 中把不需要的功能选项置为 n,将 BUILD_TYPE 设置为 release。
  2. 检查 HAL 层的系统调用函数的内存使用情况,例如在某些系统上发现 getaddrinfo 系统函数会分配了较多的内存用于 IPV6。如果 SDK 只用 IPV4,那么可以考虑优化 getaddrinfo 中这个内存分配操作,可以节省运行 RAM。
  3. 设备接入鉴权的方式中,TLS 证书方式需要最多的存储资源和运行内存,安全性也最高。TLS KEY 方式占用资源会少一些,同时保证了安全性。而 NOTLS KEY 方式占用资源最少,不需要 TLS 库,但安全性最低,数据采用明文传输,有被盗取和篡改的风险。用户需要根据设备的资源做取舍和选择。
  4. 在使用 TLS 库的时候,可以根据使用场景对所需的加密算法和密钥交换算法进行裁剪,如 mbedtls 库可对其 config.h 里面的特性宏进行定制。

设备端 C-SDK 关于 MQTT 连接的心跳包机制是怎么样的?

MQTT 采用 TCP 长连接,需要心跳包机制来保证连接是活跃的,设备端 C-SDK 按照 MQTT 规范的 Keep Alive 机制,在 qcloud_iot_export_variables.h 里面有一个心跳包发送周期的默认设置:

/* default MQTT keep alive interval (unit: ms) */
#define QCLOUD_IOT_MQTT_KEEP_ALIVE_INTERNAL                         (240 * 1000)

在一个心跳发送周期内,如果设备端没有成功发送 MQTT 控制报文(包括 SUB/UNSUB/QoS1 PUB 报文,并收到相应的 ACK),则会发送 MQTT PINGREQ 给云端并等待云端回复 PINGRESP 报文,如果在一定时间内没有收到 PINGRESP 报文,则设备端认为连接已断开,会进行自动重连操作。

MCU SDK 自动代码生成功能是什么?

针对使用支持腾讯 AT 指令的通信模组,平台根据用户定义的数据模板自动生成 MCU 侧的代码,自动生成代码已经完成数据模板的框架,用户只需要适配 MCU hal 层的串口及模组网络注册即可,加快开发速度。

是否可以不使用 MCU SDK 自动代码生成功能?

可以,如果您已熟悉腾讯云 IoT AT 指令协议,则可以基于该协议对接,使用 MCU SDK 自动代码生成可以加快您的开发速度。

模组的固件程序需要怎么烧录到模组?

您从接入到开发平台的模组商购买指定型号的模组后,需要自己使用烧录工具将下载的固件程序烧录到模组中。

是否可以在腾讯云购买模组?

我们暂不销售,设备开发中购买模组都是跳转到合作模组商的官网。

Linux 设备如何接入?

您可以参考 SDK 跨平台移植

目录