全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 智能硬件
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 更多
阿里云物联网套件

设备端SDK使用问题

更新时间:2018-01-06 10:07:20

1. 基础问题

1.1、设备端SDK支持什么环境?服务端SDK有什么版本?

目前设备端SDK支持Linux,FreeRTOS,Mico,windows等。
服务端提供的有JAVA,PHP,Python,其他的暂时没有提供。

1.2、设备端SDK占用的RAM情况如何?

MQTT协议数据传输通过mbedTLS,消耗35K(RAM)= 8K(stack)+ 27K(heap)。
CCP协议,消耗45K(RAM) = 32K(stack)+ 13k(heap),CCP协议可以通过修改下面的两个宏减小stack的占用:
- #define TOPIC_MAX_NUM 64 // Topic数量最大限制,如果设备订阅的Topic数量较小,可以修改为16等;
- #define TOPIC_MAX_LEN 128 // Topic长度最大限制,如果设备订阅的Topic名称长度较小,可以修改为32等。

1.3、设备端SDK的运行需要哪些条件?

在设备SDK的运行主要有两个条件:
1、支持多任务执行的操作系统;
2、支持TCP/IP协议栈。

2. 移植问题

2.1、FreeRTOS 操作系统移植是否有相关文档可以参考?

FreeRTOS 操作系统连接阿里云很多客户都已经对接成功并且商用, 比如乐鑫的wifi模组,使用的就是FreeRTOS。
请参考开源代码FreeRTOS的移植参考代码 - 乐鑫

2.2、如何ECS上使用freertos系统?

可以通过导入镜像实现。
导入镜像实践可参考https://help.aliyun.com/video_detail/54743.html
导入镜像注意事项可参考https://help.aliyun.com/document_detail/48226.html

2.3、是否支持KEIL?

目前IoT套件不支持KEIL,我们的SDK是在64位linux+GNU make下开发和测试。

3. 编译问题

3.1、如何修改编译选项?

请修改make.settings的设置,然后执行make reconfig修改设置后再执行make进行编译。
如果make.settings里面没有,请查看src/configs/default_settings.mk内是否有相关的定义;如果有定义,可以在make.settings里面添加其具体定义。
执行方式是,优先选择make.settings的定义选项,如果make.settings中没有定义,则使用default_settings.mk中默认设置。

3.2、如何查看目前的编译选项设置?

请使用指令make env可是查看目前的编译选项设置。

3.3、MQTT_ID2_AUTH等宏在哪定义?

编译选项定义在make.settingssrc/configs/default_settings.mk中,make.settings优先于src/configs/default_settings.mk
定于MQTT_ID2_AUTH可以修改make.settings添加FEATURE_MQTT_ID2_AUTH = y定义宏。
一般都在makefile中通过开关打开:
- MQTT_DEVICE_SHADOW 影子设备
- MQTT_DIRECT 直连模式
- MQTT_ID2_AUTH 认证模式
- MQTT_ID2_CRYPTO 消息加密

3.4、SDK使用的libc版本是多少?

版本是:glibc 2.23,可以参考SDK目录下reademe.md。

3.5、SDK编译中提示git command not found?

SDK编译前请先准备好开发环境,安装相关软件,可以参考准备工作

3.6、SDK跨平台移植,实现交叉编译时,需要修改哪些东西?

交叉编译需要更改以下几点:
1.make.settings需要更改PLATFORM_CC 、PLATFORM_AR,适配成为自己的编译器名称;
2. 需要您实现硬件抽象层,实现HAL接口,具体可以参考平台移植手册。

  • 交叉编译不会产生HAL库,需要自行实现生成output/release/lib/libiot_platform.a

3.7、如何生成windows平台可执行的exe或是lib?

目前可以支持在ubuntu环境下使用交叉编译的方式产生windows可执行的exe和lib文件.
1. ubuntu上安装交叉编译工具mingw
2. make reconfig选择相应配置mingw
3. make

  • 产生lib和exe文件后copy到windows平台下即可执行。

3.8、SDK移植后进行交叉编译,先执行make reconfig,再执行make命令,提示错误:bin/bash: 行 2: /opt/arm-hisiv300-linux/bin/arm-hisiv300-linux-uclibcgnueabi-gcc: 没有那个文件或目录? arm-hisiv300-linux-gcc-ar:cannot find plugin liblto_plugin.so

由于用户使用的交叉编译的工具链是32位,而Ubuntu16.04系统不支持32位的。
解决方法:
1) 安装sudo apt install lib32z1-dev
2) 将配置文件config.hisiev200.demo中的OVERRIDE_AR = arm-hisiv300-linux-gcc-ar 改成OVERRIDE_AR = arm-hisiv300-linux-ar

3.9、设备端的C-SDK移植到嵌入式linux平台时要不要重新开发底层的硬件层?

需要修改部分的底层,嵌入式c和linux有很多相似点。请参考平台移植手册

3.10、编译时出现ssl相关的错误?

  1. 原因:用户下载的SDK里已经包含了 src/platform/ssl/mbedtls/mbedtls.o,重新编译时需要删除后再试,或者重新从网站上下载新一份SDK重新编译;
    解决方法:可以尝试执行:find . -name "*.o" -exec rm -vf {};这条命令,清除所有.o。
  2. 原因:解压问题,可以选择以下任一种方法处理:(推荐使用linux命令,不要使用samba windows解压)
    1). 将文件拷贝到linux上,命令行执行unzip iotkit-embedded-RELEASED_V2_01_20171010.zip
    2). linux命令行使用git clone https://github.com/aliyun/iotkit-embedded.git,切换RELEASE_V2_01_20171010 (具体版本号不同,请注意)。

3.11、使用aliot_sdk_v1.0.1_release SDK,然后修改make.setting文件,PLATFORM_SSL = openssl 然后开始make,结果报错,如何修复这个问题?

这样使用1.0.1版本的方式是不支持的, openssl代码只是参考示例代码, 用作示意和参考, 不支持被直接编译使用,目前的版本只能保持 mbedtls 不动。

4. 运行问题

4.1、如何打开 SDK 日志?

请在需要打开日志的地方调用IOT_OpenLog开始打印log,具体说明如下:

  1. 1. IOT_OpenLog 开始打印日志信息(log), 接受一个const char *为入参, 表示模块名字
  2. 2. IOT_SetLogLeve 设置打印的日志等级, 接受入参从15, 数字越大, 打印越详细
  3. 3. IOT_CloseLog 停止打印日志信息(log), 入参为空
  4. 4. IOT_DumpMemoryStats 调试函数, 打印内存的使用统计情况, 入参为1-5, 数字越大, 打印越详细

4.2、IoT套件是否支持多线程?

目前IOT_*()的API都是进程级别, 仅支持单进程单线程使用, 不支持在同一进程的不同线程并发重入。

4.3、IoT套件对消息内容进行处理吗?

IoT套件不会对消息内容做处理,是透传模式。

4.4、采用IoT套件,那么传输的安全性怎么保证?

设备和服务端之间的链路可以通过TLS加密的,并且使用productKey、deviceName、deviceSecret这一组设备相关的信息进行认证,任何一个错误都会导致认证失败。

4.5、使用物联网套件时,设备通过MQTT协议成功连接到阿里云平台后,如何从平台端看到设备上报的数据的内容呢?

由于套件不关注消息的内容,所以没有页面可以查看上下行消息的内容,只能通过日志的形式查看。

4.6、一个设备账号支持多个设备登录吗?

不可以,一个设备信息,同时多个设备登录,只能连接一个。
每次调用connection时都会成功,不过先前建立的链路会被服务器断开的,使同一设备参数只能有一台设备在线。

4.7、在一台设备上执行mqtt的IOT_MQTT_Construct后,再用同一设备参数执行coap的IOT_CoAP_Init可以吗?

可以,coap和mqtt是两个独立的通道。但是,不建议这样使用,未进行相关的测试验证。

4.8、套件是否一有消息就立刻推送给订阅的设备而不做保存?

消息一发到云端,就会分发给不同的设备订阅者,不进行保存,目前不支持will和retain。

4.9、IoT套件从华东2怎么样切换到美西的服务器,是否需要修改sdk库里面的代码?IoT套件美国认证URL地址是多少?

美西的服务器域名部分要替换成:iot-as-mqtt.us-west-1.aliyuncs.com,其余的参考华东2站点即可。
具体请修改src/guider/guider_internal.hGUIDER_DIRECT_DOMAIN的定义即可。

4.10、IoT套件为什么只能创建华东的节点,创建不了杭州节点?

只有在5月底之前在杭州节点创建过产品,才可以继续使用杭州节点,否则新注册的都是华东2节点。
建议注册华东2节点,杭州节点已经开始弱化技术支持。
另外,pubkey.cert目前可以忽略,这个是针对杭州节点的。

4.11、物联网套件,现在使用华东2站点SDK 进行接入,由于设备内存问题,能否关闭SSL加密,直接mqtt连接,我在SDK中没有找到关闭的方法,能否提供关闭方式?

我们的V1.0 SDK这个版本没有MQTT直连, 必须HTTPS认证, SSL是强依赖, 关不掉的。设备端V2.0 SDK,可以TCP链接,就可以不使用SSL加密了。V1.0

4.12、一个topic类有三个topic:get,update,error。
问题1:error是从设备上来的,get和update的方向如何?
问题2:能否增加其他的,比如:put

1.get就是指设备从服务端订阅topic消息,update就是设备向服务端发送消息。
2.topic本身就是允许您自定义使用的。定义的时候需要明白定义这个是用来做什么用的,有什么功能。

4.13、一个产品能创建多少个topic,一个topic最多被多少个设备订阅?

华东2节点下,一个产品能创建50个topic类,设备订阅自己的topic,而且华东2节点有广播topic,这个最多1000个订阅者。
杭州节点下,一个产品能创建50个topic类,一个topic最多被200个设备订阅。

4.14、如果topic订阅设备超过1000怎么处理?

可以对设备进行分组,1000一组。
如果有5000个设备,使用广播topic,用户调5次接口。

4.15、iot套件中的一个设备,查看控制台的log会报以下err log:[error]rate limiter,请问是什么原因?

回答:设备被限流,单个设备数据上报上限QoS0为30条/秒,QoS1为10条/秒,下行接收限制50条/秒。
限流后设备上报的数据就会被丢掉。

5. MQTT连接

5.1、IoT套件云端IP地址和端口号

IP地址:

  1. 218.11.0.64
  2. 116.211.167.65
  3. 118.178.217.16
  4. 106.15.100.2
  5. 139.196.135.135


端口: 1883

5.2、什么是域名直连?如何开启域名直连

设备SDK2.0之后MQTT连接有两种方式,一种是认证再连接,一种是使用域名直连。
认证连接是首先使用HTTPS到iot-auth.cn-shanghai.aliyuncs.com:443获取认证cert后,再使用MQTT连接到/public.iot-as-mqtt.cn-shanghai.aliyuncs.com/1883。 认证连接必须使用TLS加密进行认证。
域名直连连接的是:${productKey}.iot-as-mqtt.cn-shanghai.aliyuncs.com:1883。 [productKey是在控制台申请过,具有权限的。]域名直连减少了HTTPS获取证书cert的过程。
资源受限设备推荐使用域名直连;一些特殊增值服务,比如设备级别的引流则推荐先HTTPS发送授权后再连接MQTT。
修改make.setting,设置’FEATURE_MQTT_DIRECT=y’,然后make reconfig既可。

5.3、MQTT协议版本是多少?

在MQTT connect packet里面会设置MQTT的版本,目前最新的SDK(V2.02)是使用的3.1.1。
可以修改SDK代码中src\mqtt\mqtt_client.h IOTX_MC_MQTT_VERSION的值来修改支持的版本。
3 -> 3.1
4 -> 3.1.1

5.4、MQTT进行设备认证时,server返回”400”(鉴权认证失败)

认证失败,errorcode=400,请检查DeviceName, DeviceSecret是否已经为控制台申请的合法值,具体请参考MQTT连接手册。

5.5、C语言SDK中MQTT是否支持iOS接入?

C语言SDK可以移植到任何能够支持C语言的系统上, 如果是iOS系统建议寻找开源的Object-C实现。

5.6、设备上线是什么状态?

激活状态,使用这个设备信息,已经成功连接到IoT套件服务器。
通过API可以查看设备的状态和设备ID。https://help.aliyun.com/document_detail/47304.html?spm=5176.product30520.6.606.iw6yml

5.7、目前mqtt-example设备上线后会立刻下线,请问如何修改mqtt-example让设备一直处于上线状态?

mqtt-example程序发送一次消息后会自动退出,可以尝试以下任意一种方式实现长期在线。
1.执行mqtt-example时使用命令行./mqtt-example loop,设备会保持长期在线;
2.修改demo代码,example 的代码在最后会调用IOT_MQTT_Destroy,设备最后会变成离线状态。

  1. 如果希望设备一直处于上线状态,请去掉IOT_MQTT_Unregister IOT_MQTT_Destroy的部分,然后使用
  2. while(1)
  3. {
  4. IOT_MQTT_Yield(pclient, 200);
  5. HAL_SleepMs(100);
  6. }

另外,请使用自己的productKey和deviceName,因为官方sdk使用公用设备,有其他人使用会被踢掉线,一台设备信息只能同时在线一个。

5.8、心跳的时间间隔如何设置?

在IOT_MQTT_Construct里面可以设置keepalive_interval_ms的取值,套件通过这个取值来作为心跳间隔时间。
keepalive_interval_ms的取值是60000~300000。

5.9、设备端是如何侦测到需要重连(reconnect)?设备端的重连机制是什么?

设备端会在keepalive_interval_ms时间间隔发送ping request,然后等待ping response。
如果设备端在keepalive_interval_ms时间内无法收到ping response,或是在进行send以及recv时发生error,套件就认为此时网络断开而需要进行重连。
套件的重连机制是套件内部触发,无需使用者接入。重连时会重新进行认证,如果认证成功就会开始再次进行MQTT connect。重连会一直持续直到再次连接成功。

5.10、云端如何侦测到设备离线的?

云端会根据MQTT CONNECT packet里面keepalive的设置,等待ping request,如果在制定的时间内没有收到ping request,则认为设备离线。
云端可以接受的最大时延是5s。

5.11、设备端SDK是否支持MQTT和CCP协议的断线重连?

支持的,测试场景描述:开发板通过WiFi连接上路由器后,把网线拔掉,MQTT和CCP协议都会自动尝试和server重新建立连接,尝试时间间隔是1s、2s、4s、8s、…,最大间隔时间默认是60s,也就是说断网后超过60s时间仍未连接成功,之后会每隔60s尝试和server做重连操作,最大间隔时间是可以设置的。

5.12、发布(Publish QoS1)数据时偶尔会出现MQTT_PUSH_TO_LIST_ERROR(-42),请问如何解决?

Subscribe和Unsubscribe时也会出现相同的问题。
需要等待ACK的packet都会存放起来等待ACK,而存放都是有上限的。当需要等待的packet太多到达上限(V2.03以前是20,V2.03是30),就会触发MQTT_PUSH_TO_LIST_ERROR(-42) error。
出现error有可能是因为当前网络状态不好,或者是发送的频率过高。如果排除上述两个问题,当前的发送的频率是预期的,那么可以适当的调整IOTX_MC_REPUB_NUM_MAXIOTX_MC_SUB_REQUEST_NUM_MAXIOTX_MC_SUB_NUM_MAX的大小。
针对发布(publish),如果业务允许,也可以把publish的QoS调整成0进行测试验证是否会改善。

5.13、IOT_MQTT_Yield的作用?

IOT_MQTT_Yield的作用是尝试接收数据,因此在需要接收数据时(subscribe 和 unsubscribe之后,publish QoS1和QoS2 之后,以及希望收到publish 数据时)都需要主动调用该函数。

5.14、IOT_MQTT_Yield参数timeout的意义?

IOT_MQTT_Yield会block住timeout的时间去尝试接收数据,直到timeout才会退出。

5.15、IOT_MQTT_Yield与HAL_SleepMs的区别

IOT_MQTT_Yield与HAL_SleepMs都是阻塞一段时间,但是IOT_MQTT_Yield实质是去读取数据,而HAL_SleepMs则是系统什么也不做等待timeout。

5.16、如何循坏接收消息?

需要循环调用IOT_MQTT_Yield ,函数内自动维持心跳和接收数据。
具体可以参考mqtt-example.c里面while loop的部分。

5.17、订阅了多个topic,调用一次IOT_MQTT_Yield,如果多个topic都发布了消息,能接收到多个topic的消息吗?


1. 首先需要确定topic的权限,是不是同时满足发布和订阅;
2. 调用一次IOT_MQTT_Yield,可以接收到多个packet。

5.18、MQTT连接方式,对于数据的读取,只能通过不停地调用IOT_MQTT_Yield来轮询获取吗?有没有方法通过事件触发的方式来告知有消息来了?IOT_MQTT_Yield会阻塞(block)当前的工作,请问有没有办法可以让IOT_MQTT_Yield尽量不阻塞其他工作?

如果使用的TCPIP协议栈可以实现TCP主动通知上层有数据到达,就有机会进行改动实现事件触发的方式来触发IOT_MQTT_Yield[但是改动比较大,所以还请自行评估是否需要修改]。

  1. 修改的大致流程是:
  2. utils_net.c里面是socket的对接模块,在这里调整socketAPI变成可以由TCP数据到达时回调的API
  3. TCP主动通知上层有数据到达时一路通知到MQTT,让MQTT内部执行IOT_MQTT_Yield,这样就可以不需要外部调用IOT_MQTT_Yield来读取数据了。
  4. 如果TCP无法做到主动上报数据,但OS支持多线程,也可以在MQTT-example里面再起一个thread,在这个thread里面
  5. while1 {
  6. IOT_MQTT_Yiled(pclient, 200);
  7. HAL_SleepMs(200);
  8. }
  9. 专门用于接收数据,收到数据时触发主线程进行数据处理,而主线程大部分时间可以用于处理其他逻辑。

如果使用的系统也不支持多线程,那就只能把IOT_MQTT_Yield的timeout时间间隔减小,然后提高调用的频率,在每次调用的时间间隔内执行其他操作,从而做到尽量减少对其他操作的阻塞。

5.19、套件目前是否支持QoS 2?

目前套件不支持QoS2。

5.20、什么情况下会发生订阅超时(subscribe timeout)?

2倍request_timeout_ms时间未接收到SUBACK packet时,会触发订阅超时(subscribe timeout)并通过event_handle函数告诉给使用者。
请在subscribe之后立刻执行IOT_MQTT_Yield尝试读取SUBACK,请勿使用HAL_SleepMs。

5.21、mqtt发起订阅subscribe第一条信息时就出现超时;subcribe返回IOTX_MQTT_EVENT_SUBCRIBE_NACK;

请检查topic是否有订阅权限,如果发布报错no authorization请确认是否有发布权限。

5.22、MQTT 发布(publish)的消息体最大是多少?超过会怎么样?

IoT套件内代码上MQTT的协议包受限于IOT_MQTT_Construct里面参数的write_buf和read_buf的大小。
从阿里云的角度看,MQTT协议包大小不能超过256K,可参见产品限制
如果实际上报消息体大于限制,消息会被丢掉。

5.23、MQTT协议pub消息payload格式是怎么样的?

阿里云IoT套件没有制定pub消息payload具体字段有那些,需要客户根据应用场景制定自己的协议,然后以JSON格式放到pub消息载体里面传给服务端。

5.24、OTA over MQTT具体流程是什么?

设备会通过MQTT上报设备当前的版本号,并订阅版本更新的topic(upgrade),然后在云端界面显示是否需要进行版本更新。
如果用户在界面上点击进行版本更新,云端会通过MQTT发送版本更新的指令(upgrade)并携带URI信息到设备,设备获取到URI后使用HTTPS进行固件下载并进行固件升级。

5.25、ota_mqtt升级的时候报错,提示mqtt read buffer is too short?

MQTT设置的buffer过小,mqtt_param的pread_buf和pwrite_buf申请过小造成的,可以根据实际需要修改OTA_MQTT_MSGLEN的大小。

5.26、如果使用MQTT直连的方式进行OTA远程代码的测试是否可行?

OTA必须使用HTTPS(HTTP over TLS)进行固件下载,MQTT只要可以接收版本更新指令即可,与MQTT的连接方式无关。
阿里云不支持HTTP下载固件,因此,如果设备没有SSL通信的能力, 是没办法使用阿里云的OTA服务的。
建议使用其它的OTA方式, 从阿里云之外愿意提供裸HTTP的站点下载固件, 我们SDK中的MQTT部分仍然可以继续使用。

5.27、IoT 套件,关闭MQTT over TLS则可以成功地订阅和发布信息,打开关闭MQTT over TLS则在运行时提示MQTT创建失败,返回错误码0x2700(证书参数有问题,认证失败)

首先确认mbedtls是否做了修改,这些是用于传输层和应用层之间加密的功能;
mbedtls没有修改的前提下,考虑系统时间是不是正确,系统时间不对也会导致证书校验失败。

5.28、如何实现发送程序和接收程序同时在线?

回答:虽然是两个程序,但是设备信息用的是同一套,由于同一时刻,是不允许同一个设备有多个连接的,后面的设备会把前面的设备踢掉。
关于这个问题,有两个解决方案:
1、同一个设备,同一个client,创建不同的线程,有的用于发送,有的用于接收,请做好线程间同步工作;
2、使用两个设备,一个设备发送,另一个设备接收,消息使用规则引擎流转,可以参考数据转发到另一topic-规则引擎

5.29、能不能订阅其他设备topic?怎么实现设备间通信?

目前套件只能订阅和发布自己的topic(productKey/deviceName/),如果是要2个设备之间做通信,建议方式:
1、设备1-topic1-规则引擎-topic2-设备2,使用方式参考数据转发到另一topic-规则引擎
2、或者通过广播的方式,请参考 发布广播消息

5.30、设备1发送QoS1的消息给离线设备2,设备2上线后无法收到消息,这个要怎么处理?

不同设备之间无法发布和订阅消息,需通过规则引擎流转;但是,规则引擎流转之后,消息统一按照QoS0来算的,所以,设备必须在线才可以收到规则引擎流转过来的消息。因此目前阿里云不支持发送消息给离线设备。

5.31、如何把设备状态变化通知订阅到另一个独立的消息队列中?

针对服务端订阅功能,设备上报消息和设备状态变化是同一个队列的,并且队列命名规则是固定的,aliyun-iot-productKey
如果希望将两个消息分开,那么建议针对设备状态的上报,依旧使用服务端订阅;而针对设备上报消息,建议使用规则引擎的流转MNS功能,请参考数据转发到MNS中-规则引擎

2.32、使用MQTT客户端如何连接阿里云?用户名(username)和密码(password)信息怎么填写?

如果使用的是第三方MQTT代码连接阿里云,首先请到阿里云平台创建一个设备和主题,然后参考连接手册中密钥sign的格式生成password。
username理论上没有限制。
签名sign的生成可以参考IoT套件的实现,也可以参考API签名机制

5.33、进行mqtt连接的时候,是否需要root.crt证书验证?

若使用TLS进行MQTT接入,需要下载根证书。
若使用IoT套件提供的demo进行开发,无需再下载根证书,套件已自带;
若不使用IoT套件的代码,使用第三方提供的mqtt开源代码,则需要下载根证书,具体可参考连接手册

6. CoAP连接

6.1、IoT套件的CoAP协议允许 over UDP 接入吗?

目前CoAP只支持DTLS的,不支持CoAP over UDP的。

6.2、CoAP接入时,设备端用三要素去认证,三要素中product key、device name、device secret这些key的长度是固定的吗?

是的。

6.3、CoAP接入连接的云端URI是什么?

回答:在调用 IOT_CoAP_Init 的时候,可以设置其参数iotx_coap_config_t里面的p_url。
如果p_url为NULL,SDK会自动使用IOTX_ONLINE_DTLS_SERVER_URL 这个URL。

  1. #define IOTX_ONLINE_DTLS_SERVER_URL "coaps://%s.iot-as-coap.cn-shanghai.aliyuncs.com:5684"

其中%s是使用p_devinfo里面的product_key的,所以请确保在初始化iotx_coap_config_t的时候一定要对p_devinfo进行赋值。

6.4、IOT_CoAP_DeviceNameAuth认证函数是阻塞等待指定时间吗?认证成功后返回还是立即返回?如果阻塞等待,如何设置最大等待时长?

1.目前这个版本是非阻塞异步的, 在这个接口里面不会阻塞等待结果,而是在IOT_CoAP_Yield里面进行处理。
2.函数IOT_CoAP_Yield 是半阻塞的,调用一次的时候,会等2秒钟,有数据的话会收取数据进行处理,没数据的话2秒超时,等到下次调用。
3.等待的时间默认2000ms,可自行修改COAP_WAIT_TIME_MS 这个宏的定义。

6.5、IOT_CoAP_DeviceNameAuth认证具体流程是什么?

  1. 首先在控制台上申请deviceName及其productKey;
    2. 然后将这些数据加密生成密钥(sign)后通过IOT_CoAP_DeviceNameAuth发送到云端,由云端完成认证过程。

6.6、CoAP的客户端在提交认证时,需要字段IOTX_DEVICE_ID是什么意义?

这个字段是自定义的想要的信息,比如可以填设备自己的设备SN等信息。
凡是想携带到云端的设备信息都可以填这里面。

6.7、IOT_CoAP_SendMessage(p_ctx, path, &message)发送的message必须是JSON格式吗?如果不是JSON会出现什么错误?

目前,除了支持JSON格式外,也可以支持cbor格式。
因为是与云端通信,需要使用指定格式,否则可能会出现无法解析的问题。
发送的message中Topic是根据自己的需求定义的,定义Topic的时候需要明白定义这个是用来做什么用的,有什么功能,然后再使用对应的Topic。具体可以参考阿里云消息通信方式

6.8、如何设置IOT_CoAP_Yield处理结果最大等待时间?

目前默认设置是2000ms,可以修改 COAP_WAIT_TIME_MS这个宏进行修改。

6.9、调用IOT_CoAP_Init方法时里面coap_malloc返回NULL,这是什么原因引起的?

请查看一下coap_malloc函数有没有适配实现。
平台移植后,hal相关的底层函数都需要用户自行实现的。

7. HTTP连接

7.1、HTTPS进行设备认证时,server返回错误代表什么意思?

  1. 1. server 返回 "10000"common error [未知错误]
  2. HTTPS报文是有一定格式要求,必须符合要求server才能支持:
  3. a.ContentType只支持application/json
  4. b.只支持HTTPS
  5. c.支持POST方法
  6. 2. server 返回 "40000": request too many [请求次数过多,流控限制]
  7. 同一个设备在一天内的认证次数是有限制的。
  8. 解决方法:每次认证获得的token是有有效期的(48h),有效期内可以反复使用,无需每次都去认证。
  9. 3. server 返回 "400"
  10. 服务器认为鉴权参数是不合法的,鉴权失败。
  11. 请参考http-example.c 修改。
  12. 检查IOTX_PRODUCT_KEYIOTX_DEVICE_NAMEIOTX_DEVICE_SECRETIOTX_DEVICE_ID是不是控制台合法的参数。

7.2、HTTPS接入认证的时候,body中的sign参数怎么生成?

sign是签名,hmacmd5(deviceSecret,content)。
content = 将所有提交给服务器的参数(version,sign,signmethod除外),按照字母顺序排序,然后将参数值依次拼接(无需拼接符号)。
比如要提交服务器的参数必选的三项clientId”:”1504676xxxx”,”deviceName”:”LzL6lKkFxxxxxxx”,”productKey”:”SFHxxxx”。那么来看这些字段的首字母,按照首字母的顺序排序,就是clientId+ deviceName+ productKey,计算sign的原文就是clientId1504676xxxx deviceName LzL6lKkFxxxxxxx productKey SFHxxxx,然后根据指定方法加密得出sign。

7.3、物联网设备->设备基于HTTP接入->设备认证,HTTP服务器地址https://iot-as-http.cn-shanghai.aliyuncs.com ,采用POST方式,按照帮助文档的测试步骤。服务器返回代码302 Found,The requested resource resides temporarily under a different URI.,未接收到任何业务状态码,设备认证异常,网址转到:http://err.taobao.com/error1.html 页面

不能直接访问根目录路径的,要加上接口名称 https://iot-as-http.cn-shanghai.aliyuncs.com/auth。

7.4、IoT套件设备HTTP接入是否支持跨域问题,用浏览器调用HTTP请求出现跨域错误。

目前阿里云不支持浏览器HTTP跨域接入。

8. OTA 下载 - 固件升级

8.1、OTA 的流程是什么?

设备开机后通过MQTT或是CoAP上报当前设备版本号,然后云端控制台会提示用户是否需要固件升级。
用户点击升级后,云端会通过MQTT或是CoAP携带固件URI通知设备开始进行固件升级,设备通过HTTPS进行固件下载后进行自动升级。
OTA下载固件是使用的HTTPS,因此设备必须要支持TLS。

9. TLS

9.1、 x509_crt_verify_child方法里用到的这四个方法如果返回值不为0,分别表示什么意思? 1 mbedtls_x509_time_is_future(&child->valid_from); 2 x509_profile_check_md_alg(profile, child->sig_md); 3 x509_profile_check_pk_alg(profile, child->sig_pk); 4 x509_profile_check_key(profile, child->sig_pk, &parent->pk);

返回值和所代表的意思分别是:

  1. 1.MBEDTLS_X509_BADCERT_FUTURE /**< The certificate validity starts in the future. */
  2. 2.MBEDTLS_X509_BADCERT_BAD_MD /**< The certificate is signed with an unacceptable hash. */
  3. 3.MBEDTLS_X509_BADCERT_BAD_PK/**< The certificate is signed with an unacceptable PK alg (eg RSA vs ECDSA). */
  4. 4. MBEDTLS_X509_BADCERT_BAD_KEY /**< The certificate is signed with an unacceptable key (eg bad curve, RSA too short). */

这些都是用于传输层和应用层之间的加密的功能,比如你说的X509是权威机构CA颁发的认证,你那边客户端可以联网上CA确认你连的是不是真正的阿里的服务器。有兴趣可以参考http://freeloda.blog.51cto.com/2033581/1216176

物联网套件c语言版本移植到新平台后,运行时出现ssl运行错误,返回错误码“78”或者“30848”等?

如果发送的第一个数据包就出错了,考虑移植的TLS有问题
1.HAL是需要自行移植,请review一下TLS移植对接的部分是不正确
2.可以参见一个厂家的处理方式(仅供参考没验证过) https://github.com/aliyun/iotkit-embedded/issues/2

10. 广播

10.1、IoT套件广播消息Topic如何填写?

广播topic:/broadcast/productKey/xxxx

10.2、广播topic是消息对多个设备,普通topic是消息对一个设备,这个理解是否正确?

是的,广播topic只要是在线的设备都可以接收到,普通的topic则是需要用户自行设置订阅和发布权限。

10.3、广播是否只能针对在线的设备?

针对离线消息这个问题,QoS=0时消息不会存储,QoS=1时IoT套件会存储未被消费的消息,存7天。
但是广播topic 默认是QoS=0,不允许用户另外设置,因此,广播都是针对在线设备。

11. 设备影子(shadow)

11.1、设备影子使用的是固定的两个主题,这两个主题是否可以通过规则引擎实现在不同的产品或设备间进行转发信息?

可以,请参见 数据转发到另一topic-规则引擎

11.2、希望用mqtt的例程例程实现M2M通信的同时也想使用设备影子,怎么样才能不冲突?

目前这个是不支持的,一个设备只能存在一个连接,若同时支持与这个前提矛盾。

参考文档

本文导读目录