利用模组+MCU的方式接入阿里云物联网有两种选择:1.选择模组内集成了阿里云SDK的模组厂商,这样就能够经过简单的AT指令实现接入阿里云及消息通信;2.使用模组内部未集成阿里云SDK的模组,而是在MCU上集成阿里云SDK,再经过调用相关API实现上云和通信。
因手头上暂时没有集成了阿里云SDK的模组,且使用集成了SDK的模组的话实现上云并无什么道道,故选择了从将SDK移植到MCU上的方式,如下上云过程的几个关键点,看不懂先不要慌,后边会细说:
关键点一(阿里云平台须要注意的):
1.嵌入式作多了固然但愿以透传的方式上云,而不是用JSON方式,故产品建立时要选择透传模式;
2.为物联网产品添加合适的属性;
3.根据示例文档,照葫芦画瓢用Javascript写出数据解析程序,缘由是选择了透传数据的方式,而云平台的标准接口时JSON,故须要对透传上来的二进制数据作一个简单的解析,使它变成JSON格式。
关键点二(MCU上移植SDK须要注意的):
1.SDK配置选对;
2.耐心填充wapper.c中须要填充的函数;
3.根据不一样的模组的AT指令进行模组驱动;
4.可靠的重试机制和稳妥的内存操做。app
下面简单介绍如下云平台->SDK移植的完整步骤函数
放上连接阿里云物联网产品建立,建立产品时按下图选择主要就是选自定义品类和连网方式、数据格式。post
产品建立好后进入功能定义,添加一些属性。好比添加一个名为“当前电流”的属性,必定要认真命名标识符,觉得这个标识符将是你上传数据到当前电流的重要接口,以下图所示。ui
经过阅读官方文档可知,当数据上传时,会调用rawDataToProtocol(bytes)函数,它传入一组二进制数据,并以你编写的规则返回JSON。好比我规定数据透传中,第一个字节为功能呢干码,0x00为上传、0x01为下发;第2-5个字节是设备ID;以后的4字节是当前电流的数值。那么在数据解析中,填充rawDataToProtocol函数以下阿里云
/** * 将设备的自定义格式数据转换为Alink协议的数据,设备上报数据到物联网平台时调用 * 入参:rawData byte[]数组 不能为空 * 出参:jsonObj Alink JSON对象 不能为空 */function rawDataToProtocol(bytes) { var uint8Array = new Uint8Array(bytes.length); for (var i = 0; i < bytes.length; i++) { uint8Array[i] = bytes[i] & 0xff; } var dataView = new DataView(uint8Array.buffer, 0); var jsonMap = {}; var fHead = uint8Array[0]; // command if (fHead == 0x00) { jsonMap['method'] = 'thing.event.property.post'; //ALink JSON格式 - 属性上报topic jsonMap['version'] = '1.0'; //ALink JSON格式 - 协议版本号固定字段 jsonMap['id'] = '' + dataView.getInt32(1); //ALink JSON格式 - 标示该次请求id值 var params = {}; params['Current'] = dataView.getInt16(5); //对应产品属性中 prop_int16 jsonMap['params'] = params; } return jsonMap;}
这段代码是根据官方文档照葫芦画瓢而来,编写完成后,能够在下边的模拟输入中输入一串十六进制数据,看是程序是否正常输出,以下图所示。
自此,一个简单的云端就布置好了,而后再去添加设备,接下来就是移植SDK让你的设备上云了。上云后,只须要经过发送透传上行的topic :/sys/a18rm0j1Ow4/${deviceName}/thing/model/up_raw,而后紧跟着一串二进制数据,好比上图所示的0x00000000010042,就能够根据你编写的数据解析程序,更新当前电流数值到你的云平台了。spa
从官网下载SDK
而后运行目录下的config.bat,根听说明进行配置config.bat说明,以后运行extract.bat抽取代码到output文件夹中。.net
这一步不用多说了,就是把output文件夹下的全部.h .c添加到你的工程中。
咱们所须要作的就是把wapper.c中的函数填满,整个步骤最难的就是这一部分。大大小小十几二十个函数,须要根据咱们本身的板子状况填充,看上去很复杂,其实关键函数就几个:
1.HAL_Free和HAL_Malloc必填,若是你没有内存池机制,能够用free和malloc这俩函数代替;
2.HAL_GetDeviceName、HAL_GetDeviceSecret、HAL_GetProductKey这三个必填,就是得到你的设备的“三要素”,也就是设备名、设备密钥、产品密钥,在你的设备页能够查看,以下图所示。
这是你接入阿里云物联网的关键。这三个函数具体填充方法很简单,你能够在mqtt_example.c中看到以下:
char DEMO_PRODUCT_KEY[IOTX_PRODUCT_KEY_LEN + 1] = "";char DEMO_DEVICE_NAME[IOTX_DEVICE_NAME_LEN + 1] = "";char DEMO_DEVICE_SECRET[IOTX_DEVICE_SECRET_LEN + 1] = "";
分别复制到对应的数组里就行了,而后在三个函数中来个memcpy就能够了。
3.HAL_Snprintf必填,填写方法能够参考例程,以下:
int HAL_Snprintf(char *str, const int len, const char *fmt, ...){ va_list args; int rc; va_start(args, fmt); rc = vsnprintf(str, len, fmt, args); va_end(args); return rc; }
4.HAL_UptimeMs和HAL_SleepMs要填,具体要看你的程序,是怎么过的毫秒级更新的,是怎么进行毫秒级延时的。
5.最重要的就是TCP四个相关的函数了:HAL_TCP_Destroy、HAL_TCP_Establish、HAL_TCP_Read、HAL_TCP_Write
填充这几个函数的前提是,你有一套好用的模组驱动程序,好比向模组发送AT指令,而后根据模组的返回值进行处理。
若是有一套好使的模组驱动,那么以上四个函数也不难填充,无非根据模组的AT指令手册进行TCP链接的创建、销毁、读、写。固然,在进行这些以前,你还要肯定你的模组正常,好比发AT能反OK,已注网、有信号等等。
修改mqtt_example.c中的main函数,好比改为mqtt_example(),而后进入到里边的example_publish函数,修改const char *fmt为 “/sys/%s/%s/thing/model/up_raw”,这样的意思就是将topic设置成系统默认的透明上传的topic。而后将payload指针指向你想要发送的原始数据,好比一个0x00,0x00,0x00,0x00,0x01,0x00,0x42的数组(1.3节阿里云数据解析中实验的数据),而后将IOT_MQTT_Publish_Simple函数中的最后一个参数改成你要发送的数据的长度,好比此处咱们就是发送了7个字节,原函数中用的strlen,在数据透传中不适用,由于遇0x00就strlen结束了,长度不对。而后在你的系统任务或者while(1)大循环前调用mqtt_example就好了(由于mqtt_example中已有while(1)循环了)。
以上步骤无误进行后,首先将会看到云平台上你的设备由未激活变成上线,而后当前电流也开始刷新,以下图所示
这一整套下来绝非易事,须要的就是认真阅读文档+一遍遍的调试,把存在的问题逐个攻破。阿里云的官方文档已经描述的比较清楚,但整个移植过程仍是须要有必定功底的。实在不行,能够联系阿里云技术支持,提交工单以求帮助。