ubuntu上对接阿里云(基于mqtt协议)
一.准备工作
对接阿里云主要其实非常简单,只有从阿里的物联网平台下载mqtt的c_sdk,修改设备三元组,修改订阅的主题,即可在ubuntu上注册上阿里云平台的mqtt服务。
下载c_sdk:https://help.aliyun.com/document_detail/96623.html?spm=a2c4g.11186623.2.13.36ba5b3e1Y5J5g
将下载的c_sdk放入ubuntu某个目录,解压,得到如下文件
我们到解压后的目录的顶层目录执行make menuconfig可以配置此sdk的功能,如下图
具体每项对应什么意思请查阅阿里云设备接入link kit sdk文档,链接如下:
https://help.aliyun.com/document_detail/97558.html?spm=a2c4g.11186623.6.560.1bd0492bFAudtE
我们这边只是在ubuntu上对接阿里云平台mqtt服务,所以需要打开FEATURE_MQTT_COMM_ENABLED,其他可以保持默认,保存退出。
二.修改源码
1.设备三元组
设备连接阿里云服务代码已经集成在sdk内部,我们设备连接阿里云主要依赖于阿里云的物联网平台提供的设备三元组:ProductKey:产品唯一标识,ProductSecret:产品密钥(可省略),DeviceName:设备唯一标识,DeviceSecret:设备密钥
只需对源码做如下修改(wrappers/os/ubuntu/HAL_OS_linux.c)
#ifdef DYNAMIC_REGISTER
char _product_key[IOTX_PRODUCT_KEY_LEN + 1] = "a1ZETBPbycq";
char _product_secret[IOTX_PRODUCT_SECRET_LEN + 1] = "L68wCVXYUaNg1Ey9";
char _device_name[IOTX_DEVICE_NAME_LEN + 1] = "example1";
char _device_secret[IOTX_DEVICE_SECRET_LEN + 1] = "";
#else
#ifdef DEVICE_MODEL_ENABLED //此宏被定义,下面三元组信息生效,将自己的三元组填写进去
char _product_key[IOTX_PRODUCT_KEY_LEN + 1] = "a1PC1yDIZoi";
char _product_secret[IOTX_PRODUCT_SECRET_LEN + 1] = "";
char _device_name[IOTX_DEVICE_NAME_LEN + 1] = "hMdcyQzFeEa86qEwmOhf";
char _device_secret[IOTX_DEVICE_SECRET_LEN + 1] = "rzPYotNaeWvMJqlBMtT3gabBD3BmCX3V";
#else
char _product_key[IOTX_PRODUCT_KEY_LEN + 1] = "a1PC1yDIZoi";
char _product_secret[IOTX_PRODUCT_SECRET_LEN + 1] = "";
char _device_name[IOTX_DEVICE_NAME_LEN + 1] = "hMdcyQzFeEa86qEwmOhf";
char _device_secret[IOTX_DEVICE_SECRET_LEN + 1] = "rzPYotNaeWvMJqlBMtT3gabBD3BmCX3V";
#endif
#endif
注意:如果不知道如何获取设备的有效三元组,请查看阿里云物联网平台用户指南,学习如何创建产品,设备,物模型等。
2.修改设备订阅
关于物联网mqtt协议,我们设备只有订阅了服务器的topic,服务器才会转发我们需要的消息,所以我们需要根据我们物联网平台中定义自己的topic,同步修改到代码中。(直接使用已经存在的topic也行)。
代码路径:src/mqtt/examples/mqtt_example.c
这个.c主要功能就是连接阿里云平台代码,订阅消息等。
//订阅topic接口
int example_subscribe(void *handle)
{
int res = 0;
const char *fmt = "/%s/%s/user/report"; //订阅的topic
char *topic = NULL;
int topic_len = 0;
topic_len = strlen(fmt) + strlen(DEMO_PRODUCT_KEY) + strlen(DEMO_DEVICE_NAME) + 1;
topic = HAL_Malloc(topic_len);
if (topic == NULL) {
EXAMPLE_TRACE("memory not enough");
return -1;
}
memset(topic, 0, topic_len);
HAL_Snprintf(topic, topic_len, fmt, DEMO_PRODUCT_KEY, DEMO_DEVICE_NAME);
res = IOT_MQTT_Subscribe(handle, topic, IOTX_MQTT_QOS0, example_message_arrive, NULL);
if (res < 0) {
EXAMPLE_TRACE("subscribe failed");
HAL_Free(topic);
return -1;
}
保存代码,到文件根目录执行
1.make distclean //清工程
2.make //编译
编译成功,生成的可执行程序output/release/bin,我们使用mqtt-example
三.测试
执行mqtt-example程序,我们发现如下log,说明连接服务成功
我们从物联网平台查看设备状态,发现设备已经在线。
我们可以使用topic:*/user/report下发测试
我们发现可以在ubuntu上收到下发的消息内容(mqtt_example.c中订阅的回调函数打印),如下
到此处,ubuntu连接阿里云平台(基于mqtt协议),已经完成,测试成功。
注意:我们代码使用了一个iot-as-mqtt.cn-shanghai.aliyuncs.com(对接服务器域名),是默认值,不同地区可能存在差异性,国内应该不需要动。
截至到现在的定义:
“iot-as-mqtt.cn-shanghai.aliyuncs.com”, /* Shanghai /
“iot-as-mqtt.ap-southeast-1.aliyuncs.com”, / Singapore /
“iot-as-mqtt.ap-northeast-1.aliyuncs.com”, / Japan /
“iot-as-mqtt.us-west-1.aliyuncs.com”, / America /
“iot-as-mqtt.eu-central-1.aliyuncs.com”, / Germany */