一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

電子發(fā)燒友App

硬聲App

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

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

資料介紹

描述

先決條件和假設(shè)

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

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

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

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

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

計劃概覽

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

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

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

設(shè)置 AWS IoT 核心

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pYYBAGOS7HWAdaUPAAA11TeT_F4900.png
圖 10:附加策略
?

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

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

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

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

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

編譯證書和私鑰

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

在命令行終端上,導(dǎo)航到您存放這些文件的文件夾(\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. 如果不是,您可能需要重復(fù)上述步驟并進行一些故障排除。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

做一些改變

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

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

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

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

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

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

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

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

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

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

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

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

測試

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

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

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

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

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

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

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

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

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

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

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

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

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

源代碼審查

poYBAGOS7KyAdi1xAADRiPqnA8I121.png
圖 25:項目文件
?

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

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

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

network_netburner.cpp– 此文件包含實現(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 客戶端所需的附加功能,并且與用于管理 MQTT 連接的計時器功能相關(guān)。

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

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

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

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

最初設(shè)定

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

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

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

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

一切都初始化后,我們將進入我們的主要 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)。每五秒鐘我們將調(diào)用PostRecordData(),這將向我們訂閱的 MQTT 主題發(fā)布一條消息,定義如下gTopicNameSend。post-record-data.cpp

初始化適用于 MQTT 的 AWS IoT Core 開發(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()。堅持我們提供的價值觀應(yīng)該沒問題。但是,對于特別好奇的人,您可以從官方 AWS API 文檔here.

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

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

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

現(xiàn)在我們已經(jīng)建立了與 AWS IoT Core 服務(wù)的連接,我們已準(zhǔn)備好開始使用 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");
    }
}

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

在我們的有效載荷結(jié)構(gòu)正確的情況下,我們將其轉(zhuǎn)儲到緩沖區(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)該是什么,因為 Amazon 非常友好地在他們的API 文檔中為我們提供了很好的細分。該函數(shù)本身非常短,因為我們只是從 MQTT 消息中獲取有效負(fù)載數(shù)據(jù),并使用它來構(gòu)造一個ParsedJsonDataSet對象。然后我們將該對象的內(nèi)容存儲到緩沖區(qū)中,以便我們可以在網(wǎng)頁上提供它并顯示最后收到的消息是什么。

網(wǎng)頁界面

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

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

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

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

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

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

包起來

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

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


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

評論

查看更多

下載排行

本周

  1. 1DD3118電路圖紙資料
  2. 0.08 MB   |  1次下載  |  免費
  3. 2AD庫封裝庫安裝教程
  4. 0.49 MB   |  1次下載  |  免費
  5. 3PC6206 300mA低功耗低壓差線性穩(wěn)壓器中文資料
  6. 1.12 MB   |  1次下載  |  免費
  7. 4網(wǎng)絡(luò)安全從業(yè)者入門指南
  8. 2.91 MB   |  1次下載  |  免費
  9. 5DS-CS3A P00-CN-V3
  10. 618.05 KB  |  1次下載  |  免費
  11. 6海川SM5701規(guī)格書
  12. 1.48 MB  |  次下載  |  免費
  13. 7H20PR5電磁爐IGBT功率管規(guī)格書
  14. 1.68 MB   |  次下載  |  1 積分
  15. 8IP防護等級說明
  16. 0.08 MB   |  次下載  |  免費

本月

  1. 1貼片三極管上的印字與真實名稱的對照表詳細說明
  2. 0.50 MB   |  103次下載  |  1 積分
  3. 2涂鴉各WiFi模塊原理圖加PCB封裝
  4. 11.75 MB   |  89次下載  |  1 積分
  5. 3錦銳科技CA51F2 SDK開發(fā)包
  6. 24.06 MB   |  43次下載  |  1 積分
  7. 4錦銳CA51F005 SDK開發(fā)包
  8. 19.47 MB   |  19次下載  |  1 積分
  9. 5PCB的EMC設(shè)計指南
  10. 2.47 MB   |  16次下載  |  1 積分
  11. 6HC05藍牙原理圖加PCB
  12. 15.76 MB   |  13次下載  |  1 積分
  13. 7802.11_Wireless_Networks
  14. 4.17 MB   |  12次下載  |  免費
  15. 8蘋果iphone 11電路原理圖
  16. 4.98 MB   |  6次下載  |  2 積分

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935127次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
  4. 1.48MB  |  420064次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233089次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費下載
  8. 340992  |  191390次下載  |  10 積分
  9. 5十天學(xué)會AVR單片機與C語言視頻教程 下載
  10. 158M  |  183342次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81588次下載  |  10 積分
  13. 7Keil工具MDK-Arm免費下載
  14. 0.02 MB  |  73815次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65989次下載  |  10 積分