電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>如何使用MQTT將嵌入式系統(tǒng)連接到AWS IoT Core

如何使用MQTT將嵌入式系統(tǒng)連接到AWS IoT Core

2022-12-12 | zip | 1.01 MB | 次下載 | 免費

資料介紹

描述

先決條件和假設

作為先決條件,我們應該提到這個項目是為NetBurner 3.x 構建的,這是我們工具和庫的最新版本。這支持 NetBurner 的MOD54415 MOD54417、NANO54415 SB800EX上述MODM7AE70。將這個項目移植回我們工具的早期版本當然是可能的,但它不會像我們在這里布置的那么簡單。

我們假設在開始之前,您已經(jīng)下載并安裝了我們工具的最新版本 (NNDK 3.x),并且您的模塊已經(jīng)啟動并連接到您的網(wǎng)絡我們還假設您已從此處的存儲庫下載或克隆源代碼。

如果您不熟悉使用 GitHub,您可以下載 .zip 文件中的存儲庫,或使用此處列出的步驟克隆它。無論您是克隆它還是將 .zip 文件的內(nèi)容提取到您的計算機,您最終都應該得到一個包含兩個名為src和的子文件夾的文件夾html。這些文件夾包含應用程序的代碼。包含它們的文件夾將是我們應用程序的根文件夾。對于我們來說,這個文件夾將是\AwsIotCoreMqttBase,并且它將在本教程的其余部分中用作參考點。

最后,我們建議有一種方法可以通過開發(fā)板查看直接來自您的模塊的串行數(shù)據(jù)。有兩種簡單的方法可以做到這一點。首先,如果您有開發(fā)套件隨附的 USB 轉 micro-USB 電纜,您可以在開發(fā)板上設置跳線配置,以便它既可以向 micro-USB 插孔發(fā)送串行輸出,也可以從 micro-USB 插孔接收電源或者,您可以將開發(fā)板上的跳線設置為使用 DB9 端口UART0)進行串行輸出。有關如何在開發(fā)板上配置跳線的更多信息,請參閱開發(fā)板隨附的“快速入門指南”。

如果您的計算機上沒有串口(現(xiàn)在很多都沒有)并且缺少 USB 轉 micro-USB 電纜,您可以使用USB 轉串口適配器來完成工作。這當然假設你有一個 USB 端口。

計劃概覽

我們的應用程序非常簡單,并實現(xiàn)了四個不同的功能:

  • 最初設定
  • 每 5 秒發(fā)布一次 MQTT 消息
  • 訂閱 MQTT 主題以接收傳入消息
  • 提供web界面查看最近發(fā)送和接收的消息

我們希望以JSON 格式發(fā)布和接收消息,并在處理 MQTT 負載數(shù)據(jù)時廣泛使用該類。ParsedJsonDataSet

設置 AWS IoT 核心

在設置 AWS IoT“事物”之前,正如他們親切地稱呼的那樣,您需要創(chuàng)建一個 AWS 管理控制臺帳戶。該帳戶本身是免費的(盡管服務定價各不相同,請查看此鏈接以了解有關 IoT Core 的詳細信息),并將為大量不同的 AWS 云服務打開網(wǎng)關。如果您還沒有這樣做,您可以在這里處理。去吧,我們等著。

現(xiàn)在您已經(jīng)正式加入俱樂部,如果您還沒有,請繼續(xù)并登錄您的帳戶。作為旁注,我們將使用我們的根帳戶來避免在教程過程中遇到權限問題。如果您想按照 AWS 推薦的方式執(zhí)行此操作,則必須創(chuàng)建一個輔助用戶帳戶,然后您需要通過 IAM 向該帳戶授予所需的 IoT Core 權限。登錄后,您應該會看到“AWS 管理控制臺”頁面,如圖 1 所示。

poYBAGOS7FCAZvO9AABHGXBlUSg500.png
圖 1:AWS 管理控制臺
?

從這里您需要導航到 IoT Core 服務。您可以通過使用頁面上的“查找服務”搜索字段來完成此操作,就像我們上面所做的那樣,或者單擊頁面頂部橫幅中的“服務”下拉菜單。

pYYBAGOS7FaAWreiAABO2i-7OTo602.png
圖 2:物聯(lián)網(wǎng)登陸屏幕
?

從這里,您將點擊 AWS IoT 登陸屏幕,如上圖 2 所示。這里有一些很棒的信息,我們鼓勵大家在可能的時候四處看看。不過,我們正在執(zhí)行任務,因此我們將繞過它并直接添加設備。單擊“Get Started”按鈕,您應該會看到一個歡迎屏幕,如下圖 3 所示。

poYBAGOS7FqAHh0HAABMEFdWL7I995.png
圖 3:IoT Core 歡迎屏幕
?

在我們可以將我們的設備注冊為“事物”之前,我們需要為它設置一個“策略”。該策略將在注冊過程中分配給我們的“事物”,并將授予它訪問我們將用于發(fā)送和接收消息的 MQTT 主題所需的權限。從左側菜單中,選擇“Secure”,然后選擇“Policies”的子菜單,如下圖 4 所示。這會將您帶到顯示的控制臺,通知我們當前沒有任何策略。

pYYBAGOS7F-APp9pAAAusH7G_-Q730.png
圖 4:創(chuàng)建策略
?

單擊標有“Create a policy”的按鈕,這將帶您進入圖 5 所示的屏幕。

poYBAGOS7GKAVwriAABAJmHvVDo785.png
圖 5:初始策略創(chuàng)建屏幕
?

在策略創(chuàng)建頁面中,我們將添加聲明,這些聲明將指示允許連接的設備執(zhí)行的操作。我們將我們的策略命名為“ NBTutorial”,并添加四個聲明,其中包含以下信息。請注意,當您輸入操作時,將自動填充標記為“Resource ARN”的字段。選中“效果”字段下的“允許”,并將每個資源 ARN 的最后一部分“ replaceWithA”替換為星號 (*)。完成后,您應該有以下語句:

pYYBAGOS7GSAU-IBAACEy2xSvto884.png
上表提供了一些有關如何配置 AWS IoT Core 策略以供您使用的指南。
?
pYYBAGOS7GmAF4E1AAA0eh6pWOE679.png
圖 6:完成的 AWS IoT 核心策略
?

請注意,在生產(chǎn)環(huán)境中,您將希望對策略創(chuàng)建更具選擇性(例如,不要在資源 ARN 末尾使用星號)。我們在這里保持非常簡單的方式來啟動球,但我們絕不認可在現(xiàn)場生產(chǎn)環(huán)境中使用這些漫不經(jīng)心的政策設置。

輸入后,單擊“創(chuàng)建”。現(xiàn)在是時候注冊我們的“東西”了。

poYBAGOS7GuAOHm3AAAulnn69tw836.png
圖 7:在 AWS IoT Core 上注冊一個事物
?

返回左窗格的主菜單,單擊“管理”菜單選項,然后單擊“事物”子菜單。Amazon 友善地提醒我們,我們實際上還沒有任何“東西”,所以現(xiàn)在讓我們通過單擊標記為“Register a thing”的按鈕來處理它,如上圖 7 所示。

這會將我們帶到一個窗口,允許我們注冊一個“事物”或多個“事物”。對于本教程,我們將堅持使用一個,所以請繼續(xù)并單擊標有“創(chuàng)建一個東西”的按鈕。這會將我們帶到圖 8 中所示的屏幕,我們將在其中提供設備的詳細信息。

pYYBAGOS7G2Abi14AAA_tmzAYGI187.png
圖 8:添加您的物聯(lián)網(wǎng)設備
?

我們唯一要在這里添加的是“名稱”,我們將其設置為“ NBTutorial”。點擊“下一步”,您將被帶到一個屏幕,您可以在其中選擇如何將您的“事物”與證書相關聯(lián),這些證書將用于通過 AWS IoT Core 服務對其進行身份驗證。我們將讓亞馬遜在這里為我們做骯臟的工作,所以繼續(xù)并單擊頂部標有“創(chuàng)建證書”的按鈕。

在撰寫本文時,推薦使用他們的證書創(chuàng)建過程,在完成本教程中的所有步驟后,我們可以了解原因。生成證書后,您將進入類似于下面圖 9 所示的屏幕。

旁白:點擊“下一步”后,您可能會收到以下消息:“我們正在為您的帳戶配置設備網(wǎng)關端點。端點準備就緒可能需要幾分鐘時間,之后您可以將設備連接到 AWS IoT、發(fā)布/訂閱主題以及訪問設備影子。在這種情況下,導航回儀表板并單擊“管理”,然后單擊左側窗格中的子菜單項“事物”。你應該看到你注冊的“ NBTutorial”東西在那里等著你。單擊它,然后是將在屏幕左側列出的“安全”菜單項。最后,單擊標有“創(chuàng)建證書”的按鈕繼續(xù)。

poYBAGOS7HGAGQRIAAAw9jj3WjQ827.png
圖 9:證書已創(chuàng)建!
?

在我們繼續(xù)之前,我們需要在這里做一些事情。首先,我們要下載證書和私鑰。我們實際上建議下載所有三個文件(證書文件以及公鑰和私鑰文件)并將它們藏在安全的地方,但您只需要證書和私鑰就可以使用我們的應用程序連接您的設備。現(xiàn)在,我們將把它們放在項目的根目錄中,\AwsIotCoreMqttBase. 適當移動這些后,單擊標有“激活”的按鈕。

最后但同樣重要的是,我們將把我們之前創(chuàng)建的策略附加到我們的設備上。單擊標有“附加策略”的按鈕。這會將您帶到一個屏幕,您可以在該屏幕上將您之前創(chuàng)建的任何策略附加到證書,如下面的圖 10 所示。

pYYBAGOS7HWAdaUPAAA11TeT_F4900.png
圖 10:附加策略
?

因為我們只創(chuàng)建了一個,所以我們應該看到的就是這個。單擊它旁邊的復選框以將其選中,然后單擊最后一個按鈕,“Register Thing”或“Done”(取決于您是否能夠一次性完成注冊)。

成功!如果一切按計劃進行,您應該會回到當前活動“事物”的列表,其中包括我們剛剛創(chuàng)建的事物,如圖 11 所示。

pYYBAGOS7HeAEdqzAAAwlImnYPk595.png
圖 11:Huzzah!使用 AWS IoT Core 成功添加事物
?

修改、構建和加載應用程序

在這一點上,我們將遠離 AWS,并專注于讓應用程序在您的設備上啟動和運行。

編譯證書和私鑰

還記得我們之前創(chuàng)建的證書和私鑰嗎?是時候把那些壞孩子趕出去了,因為我們要將它們直接編譯到我們的應用程序中。在我們這樣做之前,我們需要將它們變成設備可以真正理解的東西。

在命令行終端上,導航到您存放這些文件的文件夾(\AwsIotCoreMqttBase對我們來說)并運行命令:

compfile privatekey PRIVATE_KEY_LEN privatekey.cpp

替換為您之前下載的私鑰文件的名稱。該文件的格式通常為 - private.pem.key. 如果您在運行時遇到問題compfile,請確保所有 NetBurner 工具的安裝目錄都在您的路徑中。這通常是 \nburn\pcbin.

運行上面的命令創(chuàng)建文件privatekey.cpp,其中包含以數(shù)組形式存儲的私鑰的全部內(nèi)容。該數(shù)組的長度也作為常量存儲在文件中PRIVATE_KEY_LEN

接下來,使用以下命令對證書執(zhí)行相同操作:

compfile privatekey PRIVATE_KEY_LEN privatekey.cpp

替換為您在上一節(jié)中下載的包含證書的文件。該文件的格式通常為 - certificate.pem.crt. 與上面的命令類似,它生成文件certificate.cpp,該文件定義了一個包含證書數(shù)據(jù)的數(shù)組以及該數(shù)組的長度,該數(shù)組的長度存儲在變量 中CERTIFICATE_LEN。

如果一切順利,您現(xiàn)在將看到兩個新的 C++ 源文件,privatekey.cpp并且certificate.cpp在我們的根目錄中\AwsIotCoreMqttBase,每個文件的大小都大于0. 如果不是,您可能需要重復上述步驟并進行一些故障排除。

此時,讓我們繼續(xù)將新文件移動到我們的\AwsIotCoreMqttBase\src目錄,這將使我們在 NBEclipse 項目的道路上少走一步。說到這,讓我們繼續(xù)前進,現(xiàn)在繼續(xù)。

在 NBEclipse 中創(chuàng)建一個項目

NBEclipse 是 NetBurner 基于 Eclipse 的 IDE,它提供了開發(fā)、構建和部署應用程序到 NetBurner 設備所需的一切。它可以在nburn子文件夾下的 NNDK 安裝目錄(默認情況下)中找到NBEclipse繼續(xù)并立即啟動該應用程序,并在出現(xiàn)對話框時隨時接受工作空間的默認目錄。

有關在 NBEclipse 中創(chuàng)建項目和開發(fā)應用程序的詳細信息,請參見此處的文檔。但是,我們將繼續(xù)進行簡要概述,以幫助您盡快入門。

我們將使用 Project Wizard 開始并創(chuàng)建我們的項目,使其實際指向我們的根文件夾\AwsIotCoreMqttBase,這將避免我們必須導入任何代碼。為此, File->New->Project從窗口頂部的工具欄導航到 ,如圖 12 所示。

poYBAGOS7HqABjubAAAy6dwYtCk052.png
圖 12:在 NBEclipse IDE 中創(chuàng)建一個新項目
?

這應該會打開 New Project Wizard,如圖 13 所示。

pYYBAGOS7H2ACuJ4AAB4hMNsXn8171.png
圖 13:新建項目向導
?

確保在“NetBurner”選項下選擇了“NetBurner Project”,然后點擊“Next”。這會將您帶到下面圖 14 中所示的窗口。

pYYBAGOS7IKAZtYLAAB5jfRa44Y501.png
圖 14:命名您的項目
?

通常,我們在這里做的唯一一件事就是為項目命名并繼續(xù)。但是,在這種情況下,我們還將取消選中標記為“使用默認位置”的框,然后單擊“瀏覽”按鈕導航到您克隆回購的文件夾。對我們來說,這是\AwsIotCoreMqttBase。確保在標有“工具鏈”的窗口中列出并選擇了“NetBurner 工具鏈”。

從這個窗口點擊“下一步”將帶我們到我們可以選擇我們想要構建的配置的地方。我們希望能夠在“Debug”和“Release”模式下運行應用程序,因此選中選項,然后再次點擊“Next”。

在下一個窗口中,如圖 15 所示,我們可以指定要為哪個平臺構建此應用程序。我們將選擇 MODM7AE70。如果您使用我們的其他平臺之一,請相應地選擇它。如果您的設備已經(jīng)插入并連接到您的網(wǎng)絡,您可以通過點擊標有“搜索”的按鈕繼續(xù)查找它的 IP 地址,然后從屏幕上彈出的列表中選擇它。

pYYBAGOS7IeAPGFwAABhHOdkmPY643.png
圖 15:選擇您的設備
?

如果您的設備未連接,您可以暫時忽略此字段,然后點擊“下一步”按鈕。下一個窗口顯示了一些可以自動添加到應用程序的基本組件,但由于我們使用的是 repo 文件夾中的代碼,我們可以跳過所有這些,只需點擊“完成”。

完成此操作后,您應該會看到您的項目已創(chuàng)建并列在 NBEclipse 左側的“項目資源管理器”選項卡中。您可能會注意到您的項目會自動從右下角的控制臺輸出開始構建。如果我們在項目設置中正確地完成了所有操作并記得移動certificate.cppprivatekey.cpp\AwsIotCoreMqttBase\src,那么它應該會成功構建。如果您在 NBEclipse 控制臺窗口的底部看到以下內(nèi)容,您就知道您已準備就緒:

poYBAGOS7IqASXgmAABZeYr0WH4925.png
圖 16:達到另一個里程碑
?

相反,如果您看到錯誤,請\AwsIotCoreMqttBase\src通過驗證所有源文件是否顯示在 src 文件夾下的“項目資源管理器”選項卡中,確保正確映射到項目中列出的 src 文件夾。還要仔細檢查是否也列出了前面部分中生成的證書和私鑰文件。

做一些改變

為了讓我們的設備成功連接到 AWS IoT Core 服務,我們需要對aws_iot_config.h源代碼中的文件進行一些更改。在 NBEclipse 中從項目的 src 文件夾中打開此文件。在此文件的頂部,定義了兩個需要修改的宏。這些是AWS_IOT_MQTT_HOSTAWS_IOT_MQTT_CLIENT_ID

AWS_IOT_MQTT_HOST :這是我們需要連接和驗證的端點。要查找此值,請轉到您的 AWS IoT Core 管理控制臺,單擊“管理”,然后單擊左側窗格中的子菜單項“事物”,然后單擊您的“ NBTutorial”注冊的“事物”。在主窗口的左側,您會找到菜單選項列表。其中,單擊“Interact”,這會將您帶到類似于圖 17 中的頁面。

poYBAGOS7IyADsWtAABZuTzAEmk134.png
圖 17:“事物”詳細信息
?

我們正在尋找的值是“HTTPS”標題下列出的令人討厭的長值。復制該值并將其粘貼到您的 aws_iot_config.h 文件中以代替文本。

AWS_IOT_MQTT_CLIENT_ID :這是您設備的唯一客戶端 ID,對于連接到此端點的每個設備都應該是唯一的。我們選擇無聊并使用我們的 MAC 地址,但您可以隨意想出您喜歡的創(chuàng)意和有趣的東西(只要它是獨一無二的)。如果您也想使用 MAC 地址,可以在模塊條形碼標簽的底部找到它,或者訪問https://discover.netburner.com。無論您選擇什么,將該值復制到aws_iot_config.h文件中的文本上。

當您保存 NBEclipse 項目時,它應該會再次自動構建項目并顯示一條“構建完成”消息,如前所述。如果沒有,您可以通過從 NBEclipse 菜單中進行選擇來手動觸發(fā)構建。Project->Build Project

加載您的應用程序

此時,我們已準備好在設備上加載我們的應用程序。您應該能夠通過選擇從 IDE 的頂部菜單自動設置運行配置Run->Run As->As Neturner Application。有關運行配置的更多詳細信息,請參閱我們的文檔。

如果由于某種原因您的設備在創(chuàng)建過程中未與項目相關聯(lián),您可以將設備的 IP 地址添加到項目中。通過右鍵單擊“Project Explorer”選項卡中的項目,然后選擇列表最底部的“Properties”選項來執(zhí)行此操作。從那里,從顯示的窗口左側的列表中選擇“NetBurner 選項”,然后在“設備選項”部分下的相應字段中輸入您的設備 IP 地址,如下面的圖 18 所示。同樣,您可以通過以下網(wǎng)址找到您的設備 IP:https://discover.netburner.com/。

pYYBAGOS7JKAaCYeAAB6TfGYmpE036.png
圖 18:為您的項目分配 IP 地址
?

可選(和推薦)步驟:當程序成功加載后,您可以通過MTTTY 終端監(jiān)視應用程序的串行輸出。通過將您的開發(fā)板直接連接到您的計算機來執(zhí)行此操作。根據(jù)您的電路板的跳線配置,這將通過 UART0 DB9 端口或微型 USB 插孔完成。如果一切順利,在一些初始初始化和連接信息之后,您應該看到“Publish Success”消息定期滾動,如下圖 19 所示:

poYBAGOS7JaAQ-YzAAEXLXZykow537.png
圖 19:發(fā)布的成功消息
?

測試

現(xiàn)在到了你一直在等待的時刻。是時候使用帶有 NetBurner 模塊的 MQTT 協(xié)議向 AWS IoT Core 服務發(fā)送和接收消息了。對于下一組步驟,我們將需要返回到 AWS IoT Core 管理控制臺。然而,這一次,我們將從左側菜單中選擇“測試”,這會將您帶到類似于圖 20 中所示的控制臺。

pYYBAGOS7JmAN4z-AAA-jcg-wZY888.png
圖 20:MQTT 測試
?

我們自稱為天才,巧妙地將用于從 NetBurner 模塊發(fā)布到 AWS 的 MQTT 主題命名為“ NBTutorial/ToAws”。繼續(xù)在“訂閱主題”字段中輸入這個(不帶引號),然后點擊標有“訂閱主題”的按鈕。

如果一切順利并且您的設備正在運行,您應該會看到 MQTT 消息開始顯示在窗口的底部,如圖 21 所示。如果沒有,請返回并查看“可選(和推薦)步驟” ”,并驗證您的設備是否在串行終端中正確初始化 AWS SDK。還要確認端口 8883 未在您的防火墻上被阻止,因為這是 MQTT 的默認端口,限制它會阻止您的 NetBurner 設備與 AWS 通信。最后,驗證我們上面創(chuàng)建的策略中的資源 ARN 是否正確以 (*) 結尾。

pYYBAGOS7J6AUm47AAA_jMSBGGY924.png
圖 21:測試 NetBurner 設備發(fā)布
?

接下來我們想看看我們的設備是否已經(jīng)成功訂閱了一個頻道。在同一個 AWS 控制臺中,單擊位于“訂閱”標題下的二級左側菜單中的鏈接“發(fā)布到主題”。我們看到 NetBurner 設備消息傳入的控制臺底部應該被一個名為“Publish”的小框替換。它應該包含主題的文本字段,以及要發(fā)送的消息的文本字段,最后是一個標記為“發(fā)布到主題”的按鈕。這可以在下面的圖 22 中看到。

poYBAGOS7KKAV665AAA2ag4tmPs010.png
圖 22:在 NetBurner 設備上測試訂閱
?

對于此主題,輸入“ NBTutorial/ToNb”。這很重要,因為它是我們的應用程序希望接收消息的主題。您可以將消息保留為默認值,即“Hello from AWS IoT console”,或者您可以根據(jù)自己的喜好進行修改。但請注意,它遵循 JSON 格式。

填寫完這些字段后,繼續(xù)點擊旁邊的魔法按鈕(“發(fā)布到主題”)。如果您碰巧通過 UART0 直接連接到您的設備,請查找您的消息以顯示在串行終端中,如下面的圖 23 所示。

pYYBAGOS7KSALfdoAAA_4IR5LIE620.png
圖 23:勝利的甜蜜滋味。使用 NetBurner 的 MTTTY 串行實用程序對其進行測試。
?

如果您不喜歡串行終端或沒有串行轉 USB 適配器,您還可以通過 Web 瀏覽器查看設備上發(fā)送和接收的最后一條消息。為此,請打開您選擇的瀏覽器并在頂部的 URL 欄中輸入您設備的 IP 地址。同樣,您可以使用 URL https://discover.netburner.com/ 獲取 IP 地址。將此 IP 地址放入您的瀏覽器將引導您進入一個由 NetBurner 模塊托管的簡單網(wǎng)頁,該網(wǎng)頁顯示最近發(fā)送和接收的消息,如下面的圖 24 所示。

pYYBAGOS7KeAQvK2AAAikUvBa1U412.png
圖 24:更好看的勝利。使用 discover.netburner.com 測試一切
?

到目前為止,我們已經(jīng)逐步了解了如何開始使用 Amazon 的 AWS IoT Core 托管云服務。為此,我們使用輕量級MQTT消息傳遞協(xié)議和 NetBurner開發(fā)工具包作為物聯(lián)網(wǎng)設備。雖然我們從頭到尾涵蓋了所有基本要求,但我們也忽略了很多關于在 NetBurner 模塊上運行的實際應用程序的內(nèi)容。現(xiàn)在,我們將查看整個應用程序的功能,查看源代碼并近距離接觸執(zhí)行骯臟工作的各個部分。我們已經(jīng)包含了該應用程序的重要部分,但如果您想要真正身臨其境的體驗,您可以在此處找到該項目的 GitHub 存儲庫。

源代碼審查

poYBAGOS7KyAdi1xAADRiPqnA8I121.png
圖 25:項目文件
?

我們的項目包含幾個源文件、AWS SDK 和一個包含index.html我們在 Web 界面中使用的 html 文件夾。我們將主要關注.cpp直接位于src文件夾中的六個文件(如上圖 25 所示)、它們關聯(lián)的頭文件和一個配置頭文件。以下是對其中每一項的簡要說明:

main.cpp– 這是應用程序的起點。它定義了應用程序名稱AWS IoT Core Base ,并為我們的程序提供了入口點UserMain()。稍后會詳細介紹這一點。

post-record-data.cpp– 此文件包含初始化AWS SDK 的函數(shù),并處理傳入和傳出 MQTT 消息的處理。

network_netburner.cpp– 此文件包含實現(xiàn)AWS SDK API的網(wǎng)絡接口所需的函數(shù),并將其綁定到我們的網(wǎng)絡堆棧。這些都與 TLS 網(wǎng)絡連接有關。

timer_netburner.cpp– 此文件包含AWS IoT Core MQTT 客戶端所需的附加功能,并且與用于管理 MQTT 連接的計時器功能相關。

record-data.cpp– 這包含一個小函數(shù),用于序列化MQTT 消息中使用的 JSON 數(shù)據(jù)。

html-control.cpp– 此文件包含兩個函數(shù),用于構建顯示最近發(fā)送和接收的 MQTT 消息的 HTML 頁面,如下所示。

aws_iot_config.h– 該文件包含我們連接到服務和發(fā)布/接收消息所需的所有配置常量值。如前所述,您需要將 和 更改AWS_IOT_MQTT_HOSTAWS_IOT_MQTT_CLIENT_ID特定于您的帳戶和環(huán)境的值。

poYBAGOS7K6AbPHRAACdMesWx78806.png
圖 26:Web 界面顯示最后接收和發(fā)送的消息
?

最初設定

讓我們將注意力轉移到應用程序的入口點UserMain(),位于 中main.cpp在 內(nèi)部,您將看到在我們進入主循環(huán)UserMain()之前或多或少按給定順序調用以下函數(shù):while()

init()– 此函數(shù)為應用程序設置網(wǎng)絡堆棧,啟動配置服務器,賦予UserMain()正確的任務優(yōu)先級,并設置一些調試細節(jié)。如果您碰巧在申請中忘記了這一點,您很快就會知道。

StartHttp()– 這將啟動設備上的網(wǎng)絡服務器。再簡單不過了。

InitializeAWSSDK()– 這幾乎完全符合您的預期。它設置 AWS SDK 并負責初始 MQTT 設置。我們將在下面更深入地探討這一點。

一切都初始化后,我們將進入我們的主要 while 循環(huán),您將在其中看到以下代碼:

while (1)
{
    // Post our record data
    PostRecordData();
    // Wait 5 seconds before doing it again
    OSTimeDly(TICKS_PER_SECOND * 5);
}

在真正的嵌入式系統(tǒng)中,我們將無限期地繼續(xù)運行我們的 while() 循環(huán)。每五秒鐘我們將調用PostRecordData(),這將向我們訂閱的 MQTT 主題發(fā)布一條消息,定義如下gTopicNameSendpost-record-data.cpp

初始化適用于 MQTT 的 AWS IoT Core 開發(fā)工具包

如上所述,初始化 AWS SDK for IoT Core 服務發(fā)生在InitializeAWSSDK(),位于post-record-data.cpp.

InitializeAWSSDK()
{
    IoT_Error_t rc = FAILURE;
    IoT_Client_Init_Params mqttInitParams = iotClientInitParamsDefault;
    IoT_Client_Connect_Params connectParams = iotClientConnectParamsDefault;

    iprintf("\nAWS IoT SDK Version %d.%d.%d-%s\n", VERSION_MAJOR, VERSION_MINOR,
    VERSION_PATCH, VERSION_TAG);

    // Set required MQTT parameters
    mqttInitParams.enableAutoReconnect = false;
    mqttInitParams.pHostURL = AWS_IOT_MQTT_HOST;
    mqttInitParams.port = AWS_IOT_MQTT_PORT;
    mqttInitParams.pRootCALocation = "";
    mqttInitParams.pDeviceCertLocation = (char *) certificate;
    mqttInitParams.pDevicePrivateKeyLocation = (char *) privatekey;
    mqttInitParams.mqttCommandTimeout_ms = 30000;
    mqttInitParams.tlsHandshakeTimeout_ms = 10000;
    mqttInitParams.isSSLHostnameVerify = true;
    mqttInitParams.disconnectHandler = nullptr;
    mqttInitParams.disconnectHandlerData = nullptr;

    rc = aws_iot_mqtt_init(&client, &mqttInitParams);
    if (SUCCESS != rc)
    {
        iprintf("aws_iot_mqtt_init returned error : %d ", rc);
        return false;
    }

    connectParams.keepAliveIntervalInSec = 600;
    connectParams.isCleanSession = true;
    connectParams.MQTTVersion = MQTT_3_1_1;
    connectParams.pClientID = AWS_IOT_MQTT_CLIENT_ID;
    connectParams.clientIDLen = (uint16_t) strlen(AWS_IOT_MQTT_CLIENT_ID);
    connectParams.isWillMsgPresent = false;

    iprintf("Connecting...\n");
    rc = aws_iot_mqtt_connect(&client, &connectParams);
    if (SUCCESS != rc)
    {
        iprintf("Error(%d) connecting to %s:%d\n", rc, mqttInitParams.pHostURL, mqttInitParams.port);
        return false;
    }

    rc = aws_iot_mqtt_autoreconnect_set_status(&client, true);
    if (SUCCESS != rc)
    {
        iprintf("Unable to set Auto Reconnect to true - %d\n", rc);
        return false;
    }

    iprintf("Subscribing to topic: %s, %d\n", gTopicNameRec, strlen(gTopicNameRec));
    rc = aws_iot_mqtt_subscribe(&client, (char *) gTopicNameRec, strlen(gTopicNameRec), QOS1, IoTSubscribeCallbackHandler, nullptr);

    if (SUCCESS != rc)
    {
        iprintf("Error subscribing : %d\n", rc);
        return false;
    }

    return true;
}

在函數(shù)頂部附近,您將看到為調用 設置的參數(shù)aws_iot_mqtt_init()。堅持我們提供的價值觀應該沒問題。但是,對于特別好奇的人,您可以從官方 AWS API 文檔here.

假設 MQTT 初始化函數(shù)成功,然后我們將設置我們的連接參數(shù)并將它們傳遞給函數(shù),aws_iot_mqtt_connet()。您可能猜到了,建立與 AWS IoT Core 服務的連接。同樣,您應該接受我們設置的值,但您可以在此處找到有關這些值代表什么的更多信息如果我們能夠成功建立一個連接,我們將通過一個aws_iot_mqtt_autoreconnect_set_status()包含 true 參數(shù)的調用來跟進它。如果由于某種原因連接失敗,這將確保我們自動重新連接。

最后,我們通過調用訂閱我們的主題aws_iot_mqtt_subscribe()。我們將訂閱的主題是gTopicNameRec,它定義在 的頂部post-record-data.cpp。我們還傳遞了一個指向接收消息時調用的函數(shù)的指針IoTSubscribeCallbackHandler()。

發(fā)布 MQTT 數(shù)據(jù)

現(xiàn)在我們已經(jīng)建立了與 AWS IoT Core 服務的連接,我們已準備好開始使用 MQTT 協(xié)議發(fā)布消息。正如我們之前提到的,我們將每五秒從我們的UserMain()函數(shù)中發(fā)布一條新消息,并調用PostRecordData()中定義的post-record-data.cpp

void PostRecordData()
{
    char buffer[200] = { 0 };
    CreateOutMessage(gJsonOut);
    gJsonOut.PrintObjectToBuffer(buffer, 199, false);

    IoT_Publish_Message_Params paramsQOS1;
    paramsQOS1.qos = QOS1;
    paramsQOS1.payload = (void *) buffer;
    paramsQOS1.payloadLen = strlen(buffer);
    paramsQOS1.isRetained = 0;

    IoT_Error_t rc = aws_iot_mqtt_publish(&client, gTopicNameSend, strlen(gTopicNameSend), ?msQOS1);
    if (SUCCESS != rc)
    {
        iprintf("Error publishing : %d\n", rc);
    }
    else
    {
        iprintf("Publish success:\r\n");
        gJsonOut.PrintObject(true);
        iprintf("\r\n");
    }
}

您會注意到我們做的第一件事就是打電話CreateOutMessage()這將構建我們的 MQTT 有效負載并將其存儲在 中gJsonOut,這是一個ParsedJsonDataSet對象。我們將其保存在全局,以便可以通過我們的模塊提供的網(wǎng)頁來引用和顯示它。記錄的內(nèi)容是消息創(chuàng)建時間的時間戳和每當調用函數(shù)時遞增的靜態(tài) ID。記錄由類定義,并與設備 ID 一起PostRecord序列化。gJsonOutAWS_IOT_MQTT_CLIENT_ID

在我們的有效載荷結構正確的情況下,我們將其轉儲到緩沖區(qū)中,然后再設置我們的 IoT 發(fā)布參數(shù)。

接收 MQTT 消息

如前所述,我們aws_iot_mqtt_subscribe()在初始設置期間致電給我們訂閱了主題gTopicNameRec. 該函數(shù)的參數(shù)之一 為IoTSubscribeCallbackHandler將用于處理傳入消息的函數(shù)提供了處理程序。

void IoTSubscribeCallbackHandler(AWS_IoT_Client *pClient, char *topicName, uint16_t topicNameLen, IoT_Publish_Message_Params *params, void *pData)
{
    iprintf("Received Message:\r\n");
    ParsedJsonDataSet jsonIn = ParsedJsonDataSet((char *) params->payload, (int) params->payloadLen);
    jsonIn.PrintObject(true);
    iprintf("\r\n");

    jsonIn.PrintObjectToBuffer( recJson, 256, true);
}

我們知道函數(shù)的簽名應該是什么,因為 Amazon 非常友好地在他們的API 文檔中為我們提供了很好的細分。該函數(shù)本身非常短,因為我們只是從 MQTT 消息中獲取有效負載數(shù)據(jù),并使用它來構造一個ParsedJsonDataSet對象。然后我們將該對象的內(nèi)容存儲到緩沖區(qū)中,以便我們可以在網(wǎng)頁上提供它并顯示最后收到的消息是什么。

網(wǎng)頁界面

我們利用 NetBurner 生成動態(tài) Web 內(nèi)容的能力來顯示最近接收和發(fā)布的 MQTT 消息。為此,我們定義了兩個函數(shù),html-control.cpp它們會在數(shù)據(jù)從設備提供給請求瀏覽器之前將數(shù)據(jù)打印到網(wǎng)頁。這些是PrintOutData()PrintInData()

index.html 中特殊格式的注釋會觸發(fā)這些函數(shù),并且它們具有結構,。這使得通過 Web 界面顯示任何類型的應用程序級數(shù)據(jù)變得非常容易。我們有關于該系統(tǒng)的大量文檔,并包括幾個功能齊全的示例以及我們的 NNDK。

實施 AWS 開發(fā)工具包依賴項

當然,AWS SDK 必須有一種方法可以綁定到 NetBurner 平臺和網(wǎng)絡堆棧中。我們這里使用的SDK提供了兩個接口:網(wǎng)絡接口定時器接口。如上所述,這些接口的功能分別定義在network_netburner.cpptimer_netburner.cpp中。

網(wǎng)絡接口提供所有 TLS 功能,用于啟動和關閉安全連接,以及通過這些連接讀取和寫入數(shù)據(jù)。計時器接口提供保持 MQTT 連接活動和啟動所需的超時功能。

在我們連接到 AWS IoT Core 服務并開始發(fā)送和接收 MQTT 消息之前,需要這兩個接口的功能。如果您從一開始就按照說明生成和編譯證書和私鑰,那么應該不需要修改這里實現(xiàn)的功能。

包起來

我們希望您覺得這個項目既有趣又有教育意義。我們在制作過程中玩得很開心,也很想聽聽您的體驗!我們在這里提供了堅實的基礎,但這真的只是這個特定項目的開始。天空是極限,所以出去開始試驗吧!

如果您對深入解釋感興趣,兩篇Netburner 文章提供了更多信息。


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
  2. 1.06 MB  |  532次下載  |  免費
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費
  9. 5元宇宙深度解析—未來的未來-風口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費
  13. 7元宇宙底層硬件系列報告
  14. 13.42 MB  |  182次下載  |  免費
  15. 8FP5207XR-G1中文應用手冊
  16. 1.09 MB  |  178次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關電源設計實例指南
  8. 未知  |  21549次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數(shù)字電路基礎pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅動電路設計》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537798次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191187次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費