使用阿里物联网sdk3.2.0

1.cJson相关坑,修改了cJSON_malloc和cJSON_free的指向以后,忘记修改realloc的指向了,结果csjon创建字符串的时候调用了系统的realloc函数,导致一堆问题,创建几次json字符串就卡死了,因为csjon创建字符串是默认realloc指针不为空的话会优先调用realloc,见下面代码的赋值,解决方法就是把static internal_hooks global_hooks = { HAL_Malloc, HAL_Free ,realloc};改成static internal_hooks global_hooks = { HAL_Malloc, HAL_Free };让json创建时去调用我指定的HAL_Malloc。

extern void *HAL_Malloc(uint32_t size);
extern void HAL_Free(void *ptr);
static internal_hooks global_hooks = { HAL_Malloc, HAL_Free ,realloc};

2.开启SDK的app配网和本地控制功能后,只能在网关上添加34个设备,添加第35个设备会导致sdk陷入死循环。调试发现是下面这段代码在搞怪,位于CoAPResource_register中的判断,如下

if (ctx->resource.count >= ctx->resource.maxcount)
{ HAL_MutexUnlock(ctx->resource.list_mutex); COAP_INFO("The resource count exceeds limit, cur %d, max %d", ctx->resource.count, ctx->resource.maxcount); return COAP_ERROR_DATA_SIZE;
} 

ctx->resource.maxcount设置为255,然后添加第35个设备的时候ctx->resource.count 就已经达到255了,然后返回报错,会导致dm_server_subscribe_all函数陷入无限死循环。目前做法就是直接注释掉,解除限制。

3.使用app本地搜索网关时,如果网关刚启动,能够搜索到设备,如果已经运行一段时间了,则搜不到设备了。 原因是sdk使用udp推送设备信息有次数限制,目前宏定义设置120次,我没有去修改宏定义,而是直接把判断做了修改。

#define BIND_NOTIFY_MAX            120
            if (g_context->notify_cnt > BIND_NOTIFY_MAX) {break;}
            if (g_context->notify_cnt > BIND_NOTIFY_MAX) {g_context->notify_cnt=0;
//                break;}

4.网关在将子设备推送到云平台上线的时候非常卡,每隔几秒都要卡在将近十几秒,最后排查发现是因为我每隔10秒调用了sdk的获取拓扑关系接口,而由于我在网关上挂载了几十个设备,拓扑关系的报文非常长,大概几万个字节,mcu的性能又不好,所有会导致处理起来非常慢,后来改成只在程序启动的时候读取一次就好了。下面是获取拓扑关系的接口。

IOT_Linkkit_Query(user_example_ctx->master_devid, ITM_MSG_QUERY_TOPOLIST, NULL, 0);

5.由于把sdk移植到了mcu中,所以一些hal接口都必须自己实现,偷懒没有实现HAL_Kv_Get、HAL_Kv_Set、HAL_Kv_Del接口,发现程序也能正常的上线,控制,所以就没去管它。但是后来在调试中发现,如果不实现这几个接口,sdk会由于HAL_Kv_Set失败一直不停的发送thing.lan.prefix.get方法给云平台,设备一多的话每秒都会发送好几次,非常影响正常的功能,所以就把发送的函数屏蔽了,反正我也没有用。 因为事先接口太麻烦了,要把数据写入到mcu的flash中去,而且也没大用,不影响我正常功能就不管他了。

把alcs_mqtt_subdev_prefix_get函数中的__alcs_mqtt_publish(topic, 1, msg_pub, strlen(msg_pub));注释掉就可以了,这个函数是用来发送报文给云平台的。

alcs_mqtt_status_e alcs_mqtt_subdev_prefix_get(const char *product_key, const char *device_name)
{/* int ret = 0; */char *msg_pub = NULL;uint16_t msg_len = 0;char topic[ALCS_MQTT_TOPIC_MAX_LEN] = {0};alcs_mqtt_ctx_t *ctx =  __alcs_mqtt_get_ctx();alcs_mqtt_status_e status = ALCS_MQTT_STATUS_SUCCESS;int id = ctx->send_id++;if (product_key == NULL || strlen(product_key) > IOTX_PRODUCT_KEY_LEN ||device_name == NULL || strlen(device_name) > IOTX_DEVICE_NAME_LEN) {return ALCS_MQTT_STATUS_ERROR;}COAP_INFO("Subdevice, PK: %s, DN: %s\n", product_key, device_name);HAL_Snprintf(topic, ALCS_MQTT_TOPIC_MAX_LEN, ALCS_MQTT_PREFIX ALCS_MQTT_THING_LAN_PREFIX_GET_FMT,ctx->product_key, ctx->device_name);msg_len = strlen(ALCS_MQTT_THING_ALCS_SUBDEV_REQUEST) + 10 + strlen(product_key) + strlen(device_name) + 1;if ((msg_pub = ALCS_ADAPTER_malloc(msg_len)) == NULL) {return ALCS_MQTT_STATUS_ERROR;}HAL_Snprintf(msg_pub, msg_len, ALCS_MQTT_THING_ALCS_SUBDEV_REQUEST, id,(int)strlen(product_key), product_key, (int)strlen(device_name), device_name);COAP_ERR("ALCS Prefix Get, Topic: %s, Payload: %s", topic, msg_pub);//zc
//    status = __alcs_mqtt_publish(topic, 1, msg_pub, strlen(msg_pub));ALCS_free(msg_pub);return status;
}

6.本文所说的问题都是在物联网sdk3.2.0中出现的,这里不得不吐槽一下,阿里的技术支持建议如果是接入生活物联网平台(飞燕平台)的话,使用专用的飞燕版本SDK,但是我下载下来试用了一下,简直太不人性化了,超级不好用。make以后生成的库文件和头文件,我用他们自己的试例代码编译,竟然还报错,头文件找不到,一查发现output文件夹中的头文件竟然不是全部,难道要我自己去源代码一个一个把头文件拿过来用嘛,而且这个sdk竟然不支持裁剪功能,像阿里物联网平台sdk支持功能裁剪,然后生成裁剪后的源代码文件夹,使用起来非常方便,直接把源码加入工程就可以了。而飞燕sdk必须交叉编译成静态库再使用,感觉非常不方便。 自己交叉编译可能会遇到一堆问题不说,keil还得改成gcc编译,又是一堆坑。所以果断不考虑飞燕sdk了。虽然阿里技术一直推荐使用,说是飞燕sdk与生活物联网平台对接功能更加完善,但是至少也得sdk好用才行啊!

MCU接入阿里物联网平台遇到的各种坑相关推荐

  1. ESP8266 接入阿里物联网平台实现远程控制LED

    上一篇我们介绍了阿里物联网平台的使用,并使用MQTT.fx软件来模拟实际的硬件设备.这一篇来实际操作如何使用esp8266接入到阿里物联网平台中,并控制一个LED灯.阿里物联网平台实际上是一个一站式的 ...

  2. 阿里物联网平台的使用

    此处我们不使用具体的硬件设备来与物联网平台进行交互,我们可以使用MQTT.fx软件来模拟相关的硬件设备,让该设备与阿里物联网平台进行通信. 下篇我们将介绍如何使用esp8266 实际与阿里物联网平台进 ...

  3. [笔记]阿里云物联网之业务服务端(java、php)接入阿里云平台

    文章目录 前言 准备 相关资料 相关介绍 消息通信 云产品流转 RocketMQ 服务订阅 MNS AMQP Topic通信 创建设备 Mqttfx设备接入(模拟设备) 安装mqtt.fx 1.71版 ...

  4. 阿里物联网平台(一)Windows系统+VS2017 模拟设备端接入

    目录 阿里物联网平台(一)Windows系统+VS2017 模拟设备端接入 阿里物联网平台(二).net 实现移动端(WEB.HTML)与设备端通讯 一.阿里物联网平台 平台地址:https://ac ...

  5. ESP32/ESP8266/ESP32C3系列模组 AT固件MQTT 对接阿里物联网平台

    文章目录 一.前言 二.一机一密接入 三.一型一密接入 四.订阅&发布 4.1 订阅 4.2 发布 五.总结 一.前言 本文介绍如何使用AT指令MQTT接入阿里云物联网平台,包括一机一密.一型 ...

  6. 关于NB-IOT模块链接阿里物联网平台的学习笔记-记录

    关于NB-IOT模块链接阿里物联网平台思路的学习笔记-记录 叙述 调试思路总结 调试过程 AT命令-方式一 AT命令-方式二 AT命令-方式三 软件 关于遇到问题 总结 叙述 前一段是写了一篇&quo ...

  7. 工业智能网关BL110应用之60:如何实现智能楼宇控制BACnet 接入阿里云平台

    COM口采集 楼宇控制BACnet的配置 工业智能网关一共有四个COM 接口, 以COM口采集楼宇控制BACnet MS/TP设备为例,COM口 485接口A+.B-分别对应楼宇控制 BACnet M ...

  8. 将Edgex网关接入Thingsboard物联网平台

    将Edgex网关接入Thingsboard物联网平台 [toc] 系统环境准备 Thingsboard物联网平台 平台概述 ​ 在众多的开源物联网平台项目中,Thingsboard在体系架构先进性.功 ...

  9. 最佳实践 · 有人4G DTU接入 MODBUS 物联网平台

    4G DTU是一种广泛用于工业物联网数据传输的终端设备,各类传感器串口原始数据通过RS485/232传输到DTU转4G网络,双向透明传输,支持Modbus RTU转TCP/MQTT.广泛应用于远程电力 ...

最新文章

  1. 产品经理 - 学习书籍
  2. vue.js初识(一)
  3. 《分布式系统:概念与设计》一2.3.2 体系结构模式
  4. 数据库设计_数据库设计(一)分析及逻辑设计
  5. 发帖回帖功能 java_百度贴吧发贴回贴POST接口
  6. 端到端半监督目标检测框架Instant-Teaching:
  7. mybatis expected at least 1 bean which qualifies as autowire candidate for this dependency
  8. 用JNDI连接数据库
  9. python importlib qpython_Python的import机制
  10. 20170907wdVBA_ImportPicturesBaseOnExcel
  11. 直播教程 || 虚拟直播设备清单分享,建议收藏~
  12. 字迹相似度测试软件,文章相似度检测_文章在线相似度检测_文章相似度检测软件-纸牌屋检测工具...
  13. 【程序员读论文】LeCun, Y., Bengio, Y. Hinton, G. Deep learning. *Nature* **521,** 436–444 (2015).
  14. ecshop后台getshell
  15. it行业se是_计算机行业SSE、SE、BSE、PE、PL各自是什么职位意思?
  16. H5活动之家平台,开启国庆双十一福利,活动全免费
  17. 《面向对话的融入交互信息的实体关系抽取》--中文信息学报
  18. 编译安装oh-my-zsh
  19. 弗洛伊德与他的精神分析学
  20. 金融业信贷风控算法4-python的入门和介绍

热门文章

  1. genymotion-安卓模拟器-修改IMEI
  2. 面试系统设计_如何进行系统设计面试
  3. 假如给我三天光明阅读心得收获
  4. CSS绘制渐变黑白背景栏
  5. codeforces 1438C、Engineer Artem
  6. 巴巴腾机器人视频_巴巴腾机器人,没想到你是这样的机器人!
  7. PHP获取字符串长度之strlen和mb_strlen的区别
  8. 基于MT策略的实战分析
  9. 常用纸张及特性,印刷常用规格尺寸
  10. tkinter模块 视窗设计相关操作