【嵌入式】4G模组+MCU成功接入阿里云物联网步骤备忘


利用模组+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.可靠的重试机制和稳妥的内存操作。

下面简单介绍以下云平台->SDK移植的完整步骤

1 云平台准备

1.1 创建产品

放上链接阿里云物联网产品创建,创建产品时按下图选择主要就是选自定义品类和连网方式、数据格式。在这里插入图片描述

1.2 功能定义

产品创建好后进入功能定义,添加一些属性。比如添加一个名为“当前电流”的属性,一定要认真命名标识符,以为这个标识符将是你上传数据到当前电流的重要接口,如下图所示。在这里插入图片描述

1.3 编写数据解析函数

通过阅读官方文档可知,当数据上传时,会调用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,就可以根据你编写的数据解析程序,更新当前电流数值到你的云平台了。

2.SDK移植

2.1 SDK获取及配置

从官网下载SDK
然后运行目录下的config.bat,根据说明进行配置config.bat说明,之后运行extract.bat抽取代码到output文件夹中。

2.2 添加SDK代码到你的工程

这一步不用多说了,就是把output文件夹下的所有.h .c添加到你的工程中。

2.3 填充wapper.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,已注网、有信号等等。

2.3 修改mqtt_example.c中的main函数

修改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)循环了)。

3 实验

以上步骤无误进行后,首先将会看到云平台上你的设备由未激活变成上线,然后当前电流也开始刷新,如下图所示
在这里插入图片描述

4 总结

这一整套下来绝非易事,需要的就是认真阅读文档+一遍遍的调试,把存在的问题逐个攻破。阿里云的官方文档已经描述的比较清楚,但整个移植过程还是需要有一定功底的。实在不行,可以联系阿里云技术支持,提交工单以求帮助。

猜你喜欢

转载自blog.csdn.net/spiremoon/article/details/104754432
今日推荐