admin管理员组

文章数量:1663034

概述

上一篇文章介绍了如何在阿里云物联网平台创建产品和设备,那么今天就来看看如何用MQTT连接到阿里云IOT,本文主要介绍基于TCP的MQTT连接,客户端直连。

官方介绍文档在这里

正文

我们先来看看官方提供的MQTT连接说明,如下:

根据该文档,我们大致了解了各个参数的封装方式,那么接下来我们就通过QtMqtt的接口来传入这些参数并连接到阿里云IOT。

代码片段

来看一些基本的参数初始化:

	m_strProductKey="xxxxx";  //需要跟阿里云Iot平台一致;
    m_strDeviceName="xxxxx";   //需要跟阿里云Iot平台一致;
    m_strDeviceSecret="xxxxx";   //需要跟阿里云平台一致
    m_strRegionId="cn-shanghai";  

    m_strPubTopic = "/sys/" + m_strProductKey + "/" + m_strDeviceName + "/thing/event/property/post";//发布topic
    m_strSubTopic = "/sys/" + m_strProductKey + "/" + m_strDeviceName + "/thing/service/property/set";//订阅topic
    m_strTargetServer = m_strProductKey + ".iot-as-mqtt." + m_strRegionId + ".aliyuncs";//域名

    m_client->setHostname(m_strTargetServer);
    m_client->setPort(1883);

参数说明:

  • m_strProductKey:产品密钥
  • m_strDeviceName:设备名
  • m_strDeviceSecret:设备密码
  • m_strRegionId:地域和可用区,具体查看

以上这三个参数是在我们创建设备(创建设备介绍)后可以直接查看到的,所以这里必须要和阿里云上创建的设备信息保持一致。

连接iot:

	QString clientId="abcdefg";         //表示客户端ID,建议使用设备的MAC地址或SN码,64字符内。
    QString signmethod = "hmacsha1";    //加密方式
    QString message ="clientId"+clientId+"deviceName"+m_strDeviceName+"productKey"+m_strProductKey;

    m_client->setUsername(m_strDeviceName + "&" + m_strProductKey);
    m_client->setClientId(clientId + "|securemode=3,signmethod=" + signmethod + "|");
    m_client->setPassword(QMessageAuthenticationCode::hash(message.toLocal8Bit(),
                                                           m_strDeviceSecret.toLocal8Bit(),
                                                           QCryptographicHash::Sha1).toHex());
    m_client->connectToHost();//连接阿里云

在文档中还提到timestamp参数,表示时间毫秒值,但是可以不用填,我们这里就不写了。

  • signmethod:表示签名算法类型。支持hmacmd5,hmacsha1和hmacsha256,默认为hmacmd5,我们这里用的是hmacsha1。
  • clientId:表示客户端ID,建议使用设备的MAC地址或SN码,64字符内。
  • securemode:表示目前安全模式,可选值有2 (TLS直连模式)和3(TCP直连模式)。

注意,这里加密方式,由于Qt自带了接口可以进行加密,使用QMessageAuthenticationCode类,所以我们直接用现成的,否则需要把加密算法提供进来,这算法C语言实现的。 有现成的我们就直接用了,省了好多事。

这样我们就可以直接连接到服务器啦。

接下来看看如何发送消息:

	QString payload2="{\"method\":\"thing.event.property.post\",\"params\":{\"Version\":\"2.0.13\"}}";;

    //发布消息
    if (m_client->publish(m_strPubTopic, payload2.toLocal8Bit(),0,true) == -1)
        QMessageBox::critical(this, QLatin1String("Error"), QLatin1String("Could not publish message"));

在前一篇文章中我们创建了一个设备,并添加了自定义功能“Version”,所以这里将版本号发送给服务器。

结果

所有工作准备完毕,看看运行效果:
点连接connect,然后再点击发布消息 Publish

可以看到,已经正常连接到服务器,并且正常发布了消息。

然后我们在阿里云终端打开设备详情,可以看到设备已经是在线状态,找到运行状态,就可以查看到上传的信息了

文中demo下载

本文标签: 阿里MQTTIoT