電子發(fā)燒友App

硬聲App

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐ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 | 次下載 | 免費(fèi)

資料介紹

描述

先決條件和假設(shè)

作為先決條件,我們應(yīng)該提到這個(gè)項(xiàng)目是為NetBurner 3.x 構(gòu)建的,這是我們工具和庫(kù)的最新版本。這支持 NetBurner 的MOD54415 、MOD54417、NANO54415 、SB800EX上述MODM7AE70。將這個(gè)項(xiàng)目移植回我們工具的早期版本當(dāng)然是可能的,但它不會(huì)像我們?cè)谶@里布置的那么簡(jiǎn)單。

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

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

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

如果您的計(jì)算機(jī)上沒(méi)有串口(現(xiàn)在很多都沒(méi)有)并且缺少 USB 轉(zhuǎn) micro-USB 電纜,您可以使用USB 轉(zhuǎn)串口適配器來(lái)完成工作。這當(dāng)然假設(shè)你有一個(gè) USB 端口。

計(jì)劃概覽

我們的應(yīng)用程序非常簡(jiǎn)單,并實(shí)現(xiàn)了四個(gè)不同的功能:

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

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

設(shè)置 AWS IoT 核心

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

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

poYBAGOS7FCAZvO9AABHGXBlUSg500.png
圖 1:AWS 管理控制臺(tái)
?

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

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

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

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

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

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

單擊標(biāo)有“Create a policy”的按鈕,這將帶您進(jìn)入圖 5 所示的屏幕。

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

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

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

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

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

poYBAGOS7GuAOHm3AAAulnn69tw836.png
圖 7:在 AWS IoT Core 上注冊(cè)一個(gè)事物
?

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

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

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

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

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

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

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

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

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

pYYBAGOS7HWAdaUPAAA11TeT_F4900.png
圖 10:附加策略
?

因?yàn)槲覀冎粍?chuàng)建了一個(gè),所以我們應(yīng)該看到的就是這個(gè)。單擊它旁邊的復(fù)選框以將其選中,然后單擊最后一個(gè)按鈕,“Register Thing”或“Done”(取決于您是否能夠一次性完成注冊(cè))。

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

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

修改、構(gòu)建和加載應(yīng)用程序

在這一點(diǎn)上,我們將遠(yuǎn)離 AWS,并專(zhuān)注于讓?xiě)?yīng)用程序在您的設(shè)備上啟動(dòng)和運(yùn)行。

編譯證書(shū)和私鑰

還記得我們之前創(chuàng)建的證書(shū)和私鑰嗎?是時(shí)候把那些壞孩子趕出去了,因?yàn)槲覀円獙⑺鼈冎苯泳幾g到我們的應(yīng)用程序中。在我們這樣做之前,我們需要將它們變成設(shè)備可以真正理解的東西。

在命令行終端上,導(dǎo)航到您存放這些文件的文件夾(\AwsIotCoreMqttBase對(duì)我們來(lái)說(shuō))并運(yùn)行命令:

compfile privatekey PRIVATE_KEY_LEN privatekey.cpp

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

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

接下來(lái),使用以下命令對(duì)證書(shū)執(zhí)行相同操作:

compfile privatekey PRIVATE_KEY_LEN privatekey.cpp

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

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

此時(shí),讓我們繼續(xù)將新文件移動(dòng)到我們的\AwsIotCoreMqttBase\src目錄,這將使我們?cè)?NBEclipse 項(xiàng)目的道路上少走一步。說(shuō)到這,讓我們繼續(xù)前進(jìn),現(xiàn)在繼續(xù)。

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

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

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

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

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

這應(yīng)該會(huì)打開(kāi) New Project Wizard,如圖 13 所示。

pYYBAGOS7H2ACuJ4AAB4hMNsXn8171.png
圖 13:新建項(xiàng)目向?qū)?/font>
?

確保在“NetBurner”選項(xiàng)下選擇了“NetBurner Project”,然后點(diǎn)擊“Next”。這會(huì)將您帶到下面圖 14 中所示的窗口。

pYYBAGOS7IKAZtYLAAB5jfRa44Y501.png
圖 14:命名您的項(xiàng)目
?

通常,我們?cè)谶@里做的唯一一件事就是為項(xiàng)目命名并繼續(xù)。但是,在這種情況下,我們還將取消選中標(biāo)記為“使用默認(rèn)位置”的框,然后單擊“瀏覽”按鈕導(dǎo)航到您克隆回購(gòu)的文件夾。對(duì)我們來(lái)說(shuō),這是\AwsIotCoreMqttBase。確保在標(biāo)有“工具鏈”的窗口中列出并選擇了“NetBurner 工具鏈”。

從這個(gè)窗口點(diǎn)擊“下一步”將帶我們到我們可以選擇我們想要構(gòu)建的配置的地方。我們希望能夠在“Debug”和“Release”模式下運(yùn)行應(yīng)用程序,因此選中選項(xiàng),然后再次點(diǎn)擊“Next”。

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

pYYBAGOS7IeAPGFwAABhHOdkmPY643.png
圖 15:選擇您的設(shè)備
?

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

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

poYBAGOS7IqASXgmAABZeYr0WH4925.png
圖 16:達(dá)到另一個(gè)里程碑
?

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

做一些改變

為了讓我們的設(shè)備成功連接到 AWS IoT Core 服務(wù),我們需要對(duì)aws_iot_config.h源代碼中的文件進(jìn)行一些更改。在 NBEclipse 中從項(xiàng)目的 src 文件夾中打開(kāi)此文件。在此文件的頂部,定義了兩個(gè)需要修改的宏。這些是AWS_IOT_MQTT_HOSTAWS_IOT_MQTT_CLIENT_ID。

AWS_IOT_MQTT_HOST :這是我們需要連接和驗(yàn)證的端點(diǎn)。要查找此值,請(qǐng)轉(zhuǎn)到您的 AWS IoT Core 管理控制臺(tái),單擊“管理”,然后單擊左側(cè)窗格中的子菜單項(xiàng)“事物”,然后單擊您的“ NBTutorial”注冊(cè)的“事物”。在主窗口的左側(cè),您會(huì)找到菜單選項(xiàng)列表。其中,單擊“Interact”,這會(huì)將您帶到類(lèi)似于圖 17 中的頁(yè)面。

poYBAGOS7IyADsWtAABZuTzAEmk134.png
圖 17:“事物”詳細(xì)信息
?

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

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

當(dāng)您保存 NBEclipse 項(xiàng)目時(shí),它應(yīng)該會(huì)再次自動(dòng)構(gòu)建項(xiàng)目并顯示一條“構(gòu)建完成”消息,如前所述。如果沒(méi)有,您可以通過(guò)從 NBEclipse 菜單中進(jìn)行選擇來(lái)手動(dòng)觸發(fā)構(gòu)建。Project->Build Project

加載您的應(yīng)用程序

此時(shí),我們已準(zhǔn)備好在設(shè)備上加載我們的應(yīng)用程序。您應(yīng)該能夠通過(guò)選擇從 IDE 的頂部菜單自動(dòng)設(shè)置運(yùn)行配置Run->Run As->As Neturner Application有關(guān)運(yùn)行配置的更多詳細(xì)信息,請(qǐng)參閱我們的文檔。

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

pYYBAGOS7JKAaCYeAAB6TfGYmpE036.png
圖 18:為您的項(xiàng)目分配 IP 地址
?

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

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

測(cè)試

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

pYYBAGOS7JmAN4z-AAA-jcg-wZY888.png
圖 20:MQTT 測(cè)試
?

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

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

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

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

poYBAGOS7KKAV665AAA2ag4tmPs010.png
圖 22:在 NetBurner 設(shè)備上測(cè)試訂閱
?

對(duì)于此主題,輸入“ NBTutorial/ToNb”。這很重要,因?yàn)樗俏覀兊膽?yīng)用程序希望接收消息的主題。您可以將消息保留為默認(rèn)值,即“Hello from AWS IoT console”,或者您可以根據(jù)自己的喜好進(jìn)行修改。但請(qǐng)注意,它遵循 JSON 格式。

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

pYYBAGOS7KSALfdoAAA_4IR5LIE620.png
圖 23:勝利的甜蜜滋味。使用 NetBurner 的 MTTTY 串行實(shí)用程序?qū)ζ溥M(jìn)行測(cè)試。
?

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

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

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

源代碼審查

poYBAGOS7KyAdi1xAADRiPqnA8I121.png
圖 25:項(xiàng)目文件
?

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

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

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

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

timer_netburner.cpp– 此文件包含AWS IoT Core MQTT 客戶(hù)端所需的附加功能,并且與用于管理 MQTT 連接的計(jì)時(shí)器功能相關(guān)。

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

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

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

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

最初設(shè)定

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

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

StartHttp()– 這將啟動(dòng)設(shè)備上的網(wǎng)絡(luò)服務(wù)器。再簡(jiǎn)單不過(guò)了。

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

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

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

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

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

如上所述,初始化 AWS SDK for IoT Core 服務(wù)發(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ù)頂部附近,您將看到為調(diào)用 設(shè)置的參數(shù)aws_iot_mqtt_init()堅(jiān)持我們提供的價(jià)值觀應(yīng)該沒(méi)問(wèn)題。但是,對(duì)于特別好奇的人,您可以從官方 AWS API 文檔here.

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

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

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

現(xiàn)在我們已經(jīng)建立了與 AWS IoT Core 服務(wù)的連接,我們已準(zhǔn)備好開(kāi)始使用 MQTT 協(xié)議發(fā)布消息。正如我們之前提到的,我們將每五秒從我們的UserMain()函數(shù)中發(fā)布一條新消息,并調(diào)用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");
    }
}

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

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

接收 MQTT 消息

如前所述,我們aws_iot_mqtt_subscribe()在初始設(shè)置期間致電給我們訂閱了主題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ù)的簽名應(yīng)該是什么,因?yàn)?Amazon 非常友好地在他們的API 文檔中為我們提供了很好的細(xì)分。該函數(shù)本身非常短,因?yàn)槲覀冎皇菑?MQTT 消息中獲取有效負(fù)載數(shù)據(jù),并使用它來(lái)構(gòu)造一個(gè)ParsedJsonDataSet對(duì)象。然后我們將該對(duì)象的內(nèi)容存儲(chǔ)到緩沖區(qū)中,以便我們可以在網(wǎng)頁(yè)上提供它并顯示最后收到的消息是什么。

網(wǎng)頁(yè)界面

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

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

實(shí)施 AWS 開(kāi)發(fā)工具包依賴(lài)項(xiàng)

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

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

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

包起來(lái)

我們希望您覺(jué)得這個(gè)項(xiàng)目既有趣又有教育意義。我們?cè)谥谱鬟^(guò)程中玩得很開(kāi)心,也很想聽(tīng)聽(tīng)您的體驗(yàn)!我們?cè)谶@里提供了堅(jiān)實(shí)的基礎(chǔ),但這真的只是這個(gè)特定項(xiàng)目的開(kāi)始。天空是極限,所以出去開(kāi)始試驗(yàn)吧!

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


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

評(píng)論

查看更多

下載排行

本周

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

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

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