ubuntu上对接阿里云(基于mqtt协议)

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 */

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值