資料介紹
描述
先決條件和假設(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 所示。
從這里您需要導(dǎo)航到 IoT Core 服務(wù)。您可以通過(guò)使用頁(yè)面上的“查找服務(wù)”搜索字段來(lái)完成此操作,就像我們上面所做的那樣,或者單擊頁(yè)面頂部橫幅中的“服務(wù)”下拉菜單。
從這里,您將點(diǎn)擊 AWS IoT 登陸屏幕,如上圖 2 所示。這里有一些很棒的信息,我們鼓勵(lì)大家在可能的時(shí)候四處看看。不過(guò),我們正在執(zhí)行任務(wù),因此我們將繞過(guò)它并直接添加設(shè)備。單擊“Get Started”按鈕,您應(yīng)該會(huì)看到一個(gè)歡迎屏幕,如下圖 3 所示。
在我們可以將我們的設(shè)備注冊(cè)為“事物”之前,我們需要為它設(shè)置一個(gè)“策略”。該策略將在注冊(cè)過(guò)程中分配給我們的“事物”,并將授予它訪問(wèn)我們將用于發(fā)送和接收消息的 MQTT 主題所需的權(quán)限。從左側(cè)菜單中,選擇“Secure”,然后選擇“Policies”的子菜單,如下圖 4 所示。這會(huì)將您帶到顯示的控制臺(tái),通知我們當(dāng)前沒(méi)有任何策略。
單擊標(biāo)有“Create a policy”的按鈕,這將帶您進(jìn)入圖 5 所示的屏幕。
在策略創(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ǔ)句:
請(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è)我們的“東西”了。
返回左窗格的主菜單,單擊“管理”菜單選項(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ì)信息。
我們唯一要在這里添加的是“名稱(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ù)。
在我們繼續(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 所示。
因?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 所示。
修改、構(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 所示。
這應(yīng)該會(huì)打開(kāi) New Project Wizard,如圖 13 所示。
確保在“NetBurner”選項(xiàng)下選擇了“NetBurner Project”,然后點(diǎn)擊“Next”。這會(huì)將您帶到下面圖 14 中所示的窗口。
通常,我們?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 地址,然后從屏幕上彈出的列表中選擇它。
如果您的設(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.cpp
和privatekey.cpp
到\AwsIotCoreMqttBase\src
,那么它應(yīng)該會(huì)成功構(gòu)建。如果您在 NBEclipse 控制臺(tái)窗口的底部看到以下內(nèi)容,您就知道您已準(zhǔn)備就緒:
相反,如果您看到錯(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_HOST
和AWS_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è)面。
我們正在尋找的值是“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/。
可選(和推薦)步驟:當(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 所示:
測(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)。
我們自稱(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é)尾。
接下來(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 中看到。
對(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 所示。
如果您不喜歡串行終端或沒(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 所示。
到目前為止,我們已經(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ù)。
源代碼審查
我們的項(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_HOST
為AWS_IOT_MQTT_CLIENT_ID
特定于您的帳戶(hù)和環(huán)境的值。
最初設(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ā)布一條消息,定義如下gTopicNameSend
。post-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
序列化。gJsonOut
AWS_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.cpp
和timer_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)吧!
- 連接到AWS IoT的RIOT-OS應(yīng)用程序
- 如何安全地將Arduino MKR GSM 1400板與GCP IoT Core結(jié)合使用
- 通過(guò)AWS IoT控制連接到Intel Galileo Gen 2的事物
- 使用ESP32以簡(jiǎn)單且不安全的方式連接到AWS IoT
- 適用于嵌入式C的AWS IoT設(shè)備開(kāi)發(fā)工具包 5次下載
- Modbus轉(zhuǎn)MQTT網(wǎng)關(guān)金鴿BL101如何實(shí)現(xiàn)將Modbus串口設(shè)備的數(shù)據(jù)上傳至亞馬遜AWS
- 嵌入式系統(tǒng)系列叢書(shū)-時(shí)間觸發(fā)嵌入式系統(tǒng)設(shè)計(jì)模式 0次下載
- 嵌入式系統(tǒng)定義
- 嵌入式系統(tǒng)與嵌入式PLC
- 嵌入式系統(tǒng)與嵌入式PLC 27次下載
- 調(diào)整AVR-IoT WG的用途以連接到AWS 10次下載
- 嵌入式系統(tǒng)是如何組成的
- 學(xué)習(xí)嵌入式系統(tǒng)有哪些方向?
- 嵌入式Internet設(shè)計(jì) 2次下載
- Qtopia Core在嵌入式Linux上的移植及應(yīng)用
- 嵌入式fpga是什么意思 994次閱讀
- 什么是嵌入式系統(tǒng)?嵌入式系統(tǒng)的具體應(yīng)用 2102次閱讀
- 嵌入式系統(tǒng)應(yīng)用實(shí)例的詳細(xì)資料介紹 4604次閱讀
- 嵌入式系統(tǒng)的全面解析 3146次閱讀
- 如何實(shí)現(xiàn)嵌入式系統(tǒng)遠(yuǎn)程調(diào)試 5080次閱讀
- 關(guān)于嵌入式系統(tǒng)以及嵌入式平臺(tái)下的學(xué)科分工詳解 1855次閱讀
- 嵌入式系統(tǒng)的特點(diǎn)大匯總 5743次閱讀
- PSoC嵌入式系統(tǒng)設(shè)計(jì)的三大優(yōu)勢(shì) 3222次閱讀
- 嵌入式系統(tǒng)有哪些部分組成_嵌入式系統(tǒng)的應(yīng)用領(lǐng)域 3.3w次閱讀
- 嵌入式行業(yè)發(fā)展?fàn)顩r_嵌入式行業(yè)人才需求_嵌入式系統(tǒng)就業(yè)前景分析 2.3w次閱讀
- 什么是嵌入式操作系統(tǒng) 常見(jiàn)的嵌入式系統(tǒng)有哪些 4w次閱讀
- 嵌入式操作系統(tǒng)是什么_嵌入式操作系統(tǒng)有哪些 2w次閱讀
- 典型的嵌入式系統(tǒng)設(shè)計(jì) 2650次閱讀
- IoT時(shí)代嵌入式系統(tǒng)有你想的那么安全嗎? 1048次閱讀
- 基于嵌入式Linux的家居監(jiān)控系統(tǒng)設(shè)計(jì) 2023次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開(kāi)發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊(cè)
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多