MQTT連接阿里雲IoT(二)

概述

上一篇文章介紹瞭如何在阿里雲物聯網平臺創建產品和設備,那麼今天就來看看如何用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.com";//域名

    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下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章