資料介紹
描述
先決條件和假設
作為先決條件,我們應該提到這個項目是為NetBurner 3.x 構建的,這是我們工具和庫的最新版本。這支持 NetBurner 的MOD54415 、MOD54417、NANO54415 、SB800EX和上述MODM7AE70。將這個項目移植回我們工具的早期版本當然是可能的,但它不會像我們在這里布置的那么簡單。
我們假設在開始之前,您已經下載并安裝了我們工具的最新版本 (NNDK 3.x),并且您的模塊已經啟動并連接到您的網絡。我們還假設您已從此處的存儲庫下載或克隆源代碼。
如果您不熟悉使用 GitHub,您可以下載 .zip 文件中的存儲庫,或使用此處列出的步驟克隆它。無論您是克隆它還是將 .zip 文件的內容提取到您的計算機,您最終都應該得到一個包含兩個名為src
和的子文件夾的文件夾html
。這些文件夾包含應用程序的代碼。包含它們的文件夾將是我們應用程序的根文件夾。對于我們來說,這個文件夾將是\AwsIotCoreMqttBase
,并且它將在本教程的其余部分中用作參考點。
最后,我們建議有一種方法可以通過開發板查看直接來自您的模塊的串行數據。有兩種簡單的方法可以做到這一點。首先,如果您有開發套件隨附的 USB 轉 micro-USB 電纜,您可以在開發板上設置跳線配置,以便它既可以向 micro-USB 插孔發送串行輸出,也可以從 micro-USB 插孔接收電源。或者,您可以將開發板上的跳線設置為使用 DB9 端口(UART0)進行串行輸出。有關如何在開發板上配置跳線的更多信息,請參閱開發板隨附的“快速入門指南”。
如果您的計算機上沒有串口(現在很多都沒有)并且缺少 USB 轉 micro-USB 電纜,您可以使用USB 轉串口適配器來完成工作。這當然假設你有一個 USB 端口。
計劃概覽
我們的應用程序非常簡單,并實現了四個不同的功能:
- 最初設定
- 每 5 秒發布一次 MQTT 消息
- 訂閱 MQTT 主題以接收傳入消息
- 提供web界面查看最近發送和接收的消息
我們希望以JSON 格式發布和接收消息,并在處理 MQTT 負載數據時廣泛使用該類。ParsedJsonDataSet
設置 AWS IoT 核心
在設置 AWS IoT“事物”之前,正如他們親切地稱呼的那樣,您需要創建一個 AWS 管理控制臺帳戶。該帳戶本身是免費的(盡管服務定價各不相同,請查看此鏈接以了解有關 IoT Core 的詳細信息),并將為大量不同的 AWS 云服務打開網關。如果您還沒有這樣做,您可以在這里處理。去吧,我們等著。
現在您已經正式加入俱樂部,如果您還沒有,請繼續并登錄您的帳戶。作為旁注,我們將使用我們的根帳戶來避免在教程過程中遇到權限問題。如果您想按照 AWS 推薦的方式執行此操作,則必須創建一個輔助用戶帳戶,然后您需要通過 IAM 向該帳戶授予所需的 IoT Core 權限。登錄后,您應該會看到“AWS 管理控制臺”頁面,如圖 1 所示。
從這里您需要導航到 IoT Core 服務。您可以通過使用頁面上的“查找服務”搜索字段來完成此操作,就像我們上面所做的那樣,或者單擊頁面頂部橫幅中的“服務”下拉菜單。
從這里,您將點擊 AWS IoT 登陸屏幕,如上圖 2 所示。這里有一些很棒的信息,我們鼓勵大家在可能的時候四處看看。不過,我們正在執行任務,因此我們將繞過它并直接添加設備。單擊“Get Started”按鈕,您應該會看到一個歡迎屏幕,如下圖 3 所示。
在我們可以將我們的設備注冊為“事物”之前,我們需要為它設置一個“策略”。該策略將在注冊過程中分配給我們的“事物”,并將授予它訪問我們將用于發送和接收消息的 MQTT 主題所需的權限。從左側菜單中,選擇“Secure”,然后選擇“Policies”的子菜單,如下圖 4 所示。這會將您帶到顯示的控制臺,通知我們當前沒有任何策略。
單擊標有“Create a policy”的按鈕,這將帶您進入圖 5 所示的屏幕。
在策略創建頁面中,我們將添加聲明,這些聲明將指示允許連接的設備執行的操作。我們將我們的策略命名為“ NBTutorial
”,并添加四個聲明,其中包含以下信息。請注意,當您輸入操作時,將自動填充標記為“Resource ARN”的字段。選中“效果”字段下的“允許”,并將每個資源 ARN 的最后一部分“ replaceWithA
”替換為星號 (*)。完成后,您應該有以下語句:
請注意,在生產環境中,您將希望對策略創建更具選擇性(例如,不要在資源 ARN 末尾使用星號)。我們在這里保持非常簡單的方式來啟動球,但我們絕不認可在現場生產環境中使用這些漫不經心的政策設置。
輸入后,單擊“創建”。現在是時候注冊我們的“東西”了。
返回左窗格的主菜單,單擊“管理”菜單選項,然后單擊“事物”子菜單。Amazon 友善地提醒我們,我們實際上還沒有任何“東西”,所以現在讓我們通過單擊標記為“Register a thing”的按鈕來處理它,如上圖 7 所示。
這會將我們帶到一個窗口,允許我們注冊一個“事物”或多個“事物”。對于本教程,我們將堅持使用一個,所以請繼續并單擊標有“創建一個東西”的按鈕。這會將我們帶到圖 8 中所示的屏幕,我們將在其中提供設備的詳細信息。
我們唯一要在這里添加的是“名稱”,我們將其設置為“ NBTutorial
”。點擊“下一步”,您將被帶到一個屏幕,您可以在其中選擇如何將您的“事物”與證書相關聯,這些證書將用于通過 AWS IoT Core 服務對其進行身份驗證。我們將讓亞馬遜在這里為我們做骯臟的工作,所以繼續并單擊頂部標有“創建證書”的按鈕。
在撰寫本文時,推薦使用他們的證書創建過程,在完成本教程中的所有步驟后,我們可以了解原因。生成證書后,您將進入類似于下面圖 9 所示的屏幕。
旁白:點擊“下一步”后,您可能會收到以下消息:“我們正在為您的帳戶配置設備網關端點。端點準備就緒可能需要幾分鐘時間,之后您可以將設備連接到 AWS IoT、發布/訂閱主題以及訪問設備影子。在這種情況下,導航回儀表板并單擊“管理”,然后單擊左側窗格中的子菜單項“事物”。你應該看到你注冊的“ NBTutorial
”東西在那里等著你。單擊它,然后是將在屏幕左側列出的“安全”菜單項。最后,單擊標有“創建證書”的按鈕繼續。
在我們繼續之前,我們需要在這里做一些事情。首先,我們要下載證書和私鑰。我們實際上建議下載所有三個文件(證書文件以及公鑰和私鑰文件)并將它們藏在安全的地方,但您只需要證書和私鑰就可以使用我們的應用程序連接您的設備。現在,我們將把它們放在項目的根目錄中,\AwsIotCoreMqttBase
. 適當移動這些后,單擊標有“激活”的按鈕。
最后但同樣重要的是,我們將把我們之前創建的策略附加到我們的設備上。單擊標有“附加策略”的按鈕。這會將您帶到一個屏幕,您可以在該屏幕上將您之前創建的任何策略附加到證書,如下面的圖 10 所示。
因為我們只創建了一個,所以我們應該看到的就是這個。單擊它旁邊的復選框以將其選中,然后單擊最后一個按鈕,“Register Thing”或“Done”(取決于您是否能夠一次性完成注冊)。
成功!如果一切按計劃進行,您應該會回到當前活動“事物”的列表,其中包括我們剛剛創建的事物,如圖 11 所示。
修改、構建和加載應用程序
在這一點上,我們將遠離 AWS,并專注于讓應用程序在您的設備上啟動和運行。
編譯證書和私鑰
還記得我們之前創建的證書和私鑰嗎?是時候把那些壞孩子趕出去了,因為我們要將它們直接編譯到我們的應用程序中。在我們這樣做之前,我們需要將它們變成設備可以真正理解的東西。
在命令行終端上,導航到您存放這些文件的文件夾(\AwsIotCoreMqttBase
對我們來說)并運行命令:
compfile privatekey PRIVATE_KEY_LEN privatekey.cpp
替換為您之前下載的私鑰文件的名稱。該文件的格式通常為 - private.pem.key
. 如果您在運行時遇到問題compfile
,請確保所有 NetBurner 工具的安裝目錄都在您的路徑中。這通常是 \nburn\pcbin
.
運行上面的命令創建文件privatekey.cpp
,其中包含以數組形式存儲的私鑰的全部內容。該數組的長度也作為常量存儲在文件中PRIVATE_KEY_LEN
。
接下來,使用以下命令對證書執行相同操作:
compfile privatekey PRIVATE_KEY_LEN privatekey.cpp
替換為您在上一節中下載的包含證書的文件。該文件的格式通常為 - certificate.pem.crt
. 與上面的命令類似,它生成文件certificate.cpp
,該文件定義了一個包含證書數據的數組以及該數組的長度,該數組的長度存儲在變量 中CERTIFICATE_LEN
。
如果一切順利,您現在將看到兩個新的 C++ 源文件,privatekey.cpp
并且certificate.cpp
在我們的根目錄中\AwsIotCoreMqttBase
,每個文件的大小都大于0
. 如果不是,您可能需要重復上述步驟并進行一些故障排除。
此時,讓我們繼續將新文件移動到我們的\AwsIotCoreMqttBase\src
目錄,這將使我們在 NBEclipse 項目的道路上少走一步。說到這,讓我們繼續前進,現在繼續。
在 NBEclipse 中創建一個項目
NBEclipse 是 NetBurner 基于 Eclipse 的 IDE,它提供了開發、構建和部署應用程序到 NetBurner 設備所需的一切。它可以在nburn
子文件夾下的 NNDK 安裝目錄(默認情況下)中找到NBEclipse
。繼續并立即啟動該應用程序,并在出現對話框時隨時接受工作空間的默認目錄。
有關在 NBEclipse 中創建項目和開發應用程序的詳細信息,請參見此處的文檔。但是,我們將繼續進行簡要概述,以幫助您盡快入門。
我們將使用 Project Wizard 開始并創建我們的項目,使其實際指向我們的根文件夾\AwsIotCoreMqttBase
,這將避免我們必須導入任何代碼。為此, File->New->Project
從窗口頂部的工具欄導航到 ,如圖 12 所示。
這應該會打開 New Project Wizard,如圖 13 所示。
確保在“NetBurner”選項下選擇了“NetBurner Project”,然后點擊“Next”。這會將您帶到下面圖 14 中所示的窗口。
通常,我們在這里做的唯一一件事就是為項目命名并繼續。但是,在這種情況下,我們還將取消選中標記為“使用默認位置”的框,然后單擊“瀏覽”按鈕導航到您克隆回購的文件夾。對我們來說,這是\AwsIotCoreMqttBase
。確保在標有“工具鏈”的窗口中列出并選擇了“NetBurner 工具鏈”。
從這個窗口點擊“下一步”將帶我們到我們可以選擇我們想要構建的配置的地方。我們希望能夠在“Debug”和“Release”模式下運行應用程序,因此選中選項,然后再次點擊“Next”。
在下一個窗口中,如圖 15 所示,我們可以指定要為哪個平臺構建此應用程序。我們將選擇 MODM7AE70。如果您使用我們的其他平臺之一,請相應地選擇它。如果您的設備已經插入并連接到您的網絡,您可以通過點擊標有“搜索”的按鈕繼續查找它的 IP 地址,然后從屏幕上彈出的列表中選擇它。
如果您的設備未連接,您可以暫時忽略此字段,然后點擊“下一步”按鈕。下一個窗口顯示了一些可以自動添加到應用程序的基本組件,但由于我們使用的是 repo 文件夾中的代碼,我們可以跳過所有這些,只需點擊“完成”。
完成此操作后,您應該會看到您的項目已創建并列在 NBEclipse 左側的“項目資源管理器”選項卡中。您可能會注意到您的項目會自動從右下角的控制臺輸出開始構建。如果我們在項目設置中正確地完成了所有操作并記得移動certificate.cpp
和privatekey.cpp
到\AwsIotCoreMqttBase\src
,那么它應該會成功構建。如果您在 NBEclipse 控制臺窗口的底部看到以下內容,您就知道您已準備就緒:
相反,如果您看到錯誤,請\AwsIotCoreMqttBase\src
通過驗證所有源文件是否顯示在 src 文件夾下的“項目資源管理器”選項卡中,確保正確映射到項目中列出的 src 文件夾。還要仔細檢查是否也列出了前面部分中生成的證書和私鑰文件。
做一些改變
為了讓我們的設備成功連接到 AWS IoT Core 服務,我們需要對aws_iot_config.h
源代碼中的文件進行一些更改。在 NBEclipse 中從項目的 src 文件夾中打開此文件。在此文件的頂部,定義了兩個需要修改的宏。這些是AWS_IOT_MQTT_HOST
和AWS_IOT_MQTT_CLIENT_ID
。
AWS_IOT_MQTT_HOST :這是我們需要連接和驗證的端點。要查找此值,請轉到您的 AWS IoT Core 管理控制臺,單擊“管理”,然后單擊左側窗格中的子菜單項“事物”,然后單擊您的“ NBTutorial
”注冊的“事物”。在主窗口的左側,您會找到菜單選項列表。其中,單擊“Interact”,這會將您帶到類似于圖 17 中的頁面。
我們正在尋找的值是“HTTPS”標題下列出的令人討厭的長值。復制該值并將其粘貼到您的 aws_iot_config.h 文件中以代替文本。
AWS_IOT_MQTT_CLIENT_ID :這是您設備的唯一客戶端 ID,對于連接到此端點的每個設備都應該是唯一的。我們選擇無聊并使用我們的 MAC 地址,但您可以隨意想出您喜歡的創意和有趣的東西(只要它是獨一無二的)。如果您也想使用 MAC 地址,可以在模塊條形碼標簽的底部找到它,或者訪問https://discover.netburner.com。無論您選擇什么,將該值復制到aws_iot_config.h
文件中的文本上。
當您保存 NBEclipse 項目時,它應該會再次自動構建項目并顯示一條“構建完成”消息,如前所述。如果沒有,您可以通過從 NBEclipse 菜單中進行選擇來手動觸發構建。Project->Build Project
加載您的應用程序
此時,我們已準備好在設備上加載我們的應用程序。您應該能夠通過選擇從 IDE 的頂部菜單自動設置運行配置Run->Run As->As Neturner Application
。有關運行配置的更多詳細信息,請參閱我們的文檔。
如果由于某種原因您的設備在創建過程中未與項目相關聯,您可以將設備的 IP 地址添加到項目中。通過右鍵單擊“Project Explorer”選項卡中的項目,然后選擇列表最底部的“Properties”選項來執行此操作。從那里,從顯示的窗口左側的列表中選擇“NetBurner 選項”,然后在“設備選項”部分下的相應字段中輸入您的設備 IP 地址,如下面的圖 18 所示。同樣,您可以通過以下網址找到您的設備 IP:https://discover.netburner.com/。
可選(和推薦)步驟:當程序成功加載后,您可以通過MTTTY 終端監視應用程序的串行輸出。通過將您的開發板直接連接到您的計算機來執行此操作。根據您的電路板的跳線配置,這將通過 UART0 DB9 端口或微型 USB 插孔完成。如果一切順利,在一些初始初始化和連接信息之后,您應該看到“Publish Success”消息定期滾動,如下圖 19 所示:
測試
現在到了你一直在等待的時刻。是時候使用帶有 NetBurner 模塊的 MQTT 協議向 AWS IoT Core 服務發送和接收消息了。對于下一組步驟,我們將需要返回到 AWS IoT Core 管理控制臺。然而,這一次,我們將從左側菜單中選擇“測試”,這會將您帶到類似于圖 20 中所示的控制臺。
我們自稱為天才,巧妙地將用于從 NetBurner 模塊發布到 AWS 的 MQTT 主題命名為“ NBTutorial/ToAws
”。繼續在“訂閱主題”字段中輸入這個(不帶引號),然后點擊標有“訂閱主題”的按鈕。
如果一切順利并且您的設備正在運行,您應該會看到 MQTT 消息開始顯示在窗口的底部,如圖 21 所示。如果沒有,請返回并查看“可選(和推薦)步驟” ”,并驗證您的設備是否在串行終端中正確初始化 AWS SDK。還要確認端口 8883 未在您的防火墻上被阻止,因為這是 MQTT 的默認端口,限制它會阻止您的 NetBurner 設備與 AWS 通信。最后,驗證我們上面創建的策略中的資源 ARN 是否正確以 (*) 結尾。
接下來我們想看看我們的設備是否已經成功訂閱了一個頻道。在同一個 AWS 控制臺中,單擊位于“訂閱”標題下的二級左側菜單中的鏈接“發布到主題”。我們看到 NetBurner 設備消息傳入的控制臺底部應該被一個名為“Publish”的小框替換。它應該包含主題的文本字段,以及要發送的消息的文本字段,最后是一個標記為“發布到主題”的按鈕。這可以在下面的圖 22 中看到。
對于此主題,輸入“ NBTutorial/ToNb
”。這很重要,因為它是我們的應用程序希望接收消息的主題。您可以將消息保留為默認值,即“Hello from AWS IoT console”,或者您可以根據自己的喜好進行修改。但請注意,它遵循 JSON 格式。
填寫完這些字段后,繼續點擊旁邊的魔法按鈕(“發布到主題”)。如果您碰巧通過 UART0 直接連接到您的設備,請查找您的消息以顯示在串行終端中,如下面的圖 23 所示。
如果您不喜歡串行終端或沒有串行轉 USB 適配器,您還可以通過 Web 瀏覽器查看設備上發送和接收的最后一條消息。為此,請打開您選擇的瀏覽器并在頂部的 URL 欄中輸入您設備的 IP 地址。同樣,您可以使用 URL https://discover.netburner.com/ 獲取 IP 地址。將此 IP 地址放入您的瀏覽器將引導您進入一個由 NetBurner 模塊托管的簡單網頁,該網頁顯示最近發送和接收的消息,如下面的圖 24 所示。
到目前為止,我們已經逐步了解了如何開始使用 Amazon 的 AWS IoT Core 托管云服務。為此,我們使用輕量級MQTT消息傳遞協議和 NetBurner開發工具包作為物聯網設備。雖然我們從頭到尾涵蓋了所有基本要求,但我們也忽略了很多關于在 NetBurner 模塊上運行的實際應用程序的內容。現在,我們將查看整個應用程序的功能,查看源代碼并近距離接觸執行骯臟工作的各個部分。我們已經包含了該應用程序的重要部分,但如果您想要真正身臨其境的體驗,您可以在此處找到該項目的 GitHub 存儲庫。
源代碼審查
我們的項目包含幾個源文件、AWS SDK 和一個包含index.html
我們在 Web 界面中使用的 html 文件夾。我們將主要關注.cpp
直接位于src
文件夾中的六個文件(如上圖 25 所示)、它們關聯的頭文件和一個配置頭文件。以下是對其中每一項的簡要說明:
main.cpp
– 這是應用程序的起點。它定義了應用程序名稱AWS IoT Core Base ,并為我們的程序提供了入口點UserMain()
。稍后會詳細介紹這一點。
post-record-data.cpp
– 此文件包含初始化AWS SDK 的函數,并處理傳入和傳出 MQTT 消息的處理。
network_netburner.cpp
– 此文件包含實現AWS SDK API的網絡接口所需的函數,并將其綁定到我們的網絡堆棧。這些都與 TLS 網絡連接有關。
timer_netburner.cpp
– 此文件包含AWS IoT Core MQTT 客戶端所需的附加功能,并且與用于管理 MQTT 連接的計時器功能相關。
record-data.cpp
– 這包含一個小函數,用于序列化MQTT 消息中使用的 JSON 數據。
html-control.cpp
– 此文件包含兩個函數,用于構建顯示最近發送和接收的 MQTT 消息的 HTML 頁面,如下所示。
aws_iot_config.h
– 該文件包含我們連接到服務和發布/接收消息所需的所有配置常量值。如前所述,您需要將 和 更改AWS_IOT_MQTT_HOST
為AWS_IOT_MQTT_CLIENT_ID
特定于您的帳戶和環境的值。
最初設定
讓我們將注意力轉移到應用程序的入口點UserMain()
,位于 中main.cpp
。在 內部,您將看到在我們進入主循環UserMain()
之前或多或少按給定順序調用以下函數:while()
init()
– 此函數為應用程序設置網絡堆棧,啟動配置服務器,賦予UserMain()
正確的任務優先級,并設置一些調試細節。如果您碰巧在申請中忘記了這一點,您很快就會知道。
StartHttp()
– 這將啟動設備上的網絡服務器。再簡單不過了。
InitializeAWSSDK()
– 這幾乎完全符合您的預期。它設置 AWS SDK 并負責初始 MQTT 設置。我們將在下面更深入地探討這一點。
一切都初始化后,我們將進入我們的主要 while 循環,您將在其中看到以下代碼:
while (1)
{
// Post our record data
PostRecordData();
// Wait 5 seconds before doing it again
OSTimeDly(TICKS_PER_SECOND * 5);
}
在真正的嵌入式系統中,我們將無限期地繼續運行我們的 while() 循環。每五秒鐘我們將調用PostRecordData()
,這將向我們訂閱的 MQTT 主題發布一條消息,定義如下gTopicNameSend
。post-record-data.cpp
初始化適用于 MQTT 的 AWS IoT Core 開發工具包
如上所述,初始化 AWS SDK for IoT Core 服務發生在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;
}
在函數頂部附近,您將看到為調用 設置的參數aws_iot_mqtt_init()
。堅持我們提供的價值觀應該沒問題。但是,對于特別好奇的人,您可以從官方 AWS API 文檔here
.
假設 MQTT 初始化函數成功,然后我們將設置我們的連接參數并將它們傳遞給函數,aws_iot_mqtt_connet()
。您可能猜到了,建立與 AWS IoT Core 服務的連接。同樣,您應該接受我們設置的值,但您可以在此處找到有關這些值代表什么的更多信息。如果我們能夠成功建立一個連接,我們將通過一個aws_iot_mqtt_autoreconnect_set_status()
包含 true 參數的調用來跟進它。如果由于某種原因連接失敗,這將確保我們自動重新連接。
最后,我們通過調用訂閱我們的主題aws_iot_mqtt_subscribe()
。我們將訂閱的主題是gTopicNameRec
,它定義在 的頂部post-record-data.cpp
。我們還傳遞了一個指向接收消息時調用的函數的指針IoTSubscribeCallbackHandler()
。
發布 MQTT 數據
現在我們已經建立了與 AWS IoT Core 服務的連接,我們已準備好開始使用 MQTT 協議發布消息。正如我們之前提到的,我們將每五秒從我們的UserMain()
函數中發布一條新消息,并調用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
對象。我們將其保存在全局,以便可以通過我們的模塊提供的網頁來引用和顯示它。記錄的內容是消息創建時間的時間戳和每當調用函數時遞增的靜態 ID。記錄由類定義,并與設備 ID 一起PostRecord
序列化。gJsonOut
AWS_IOT_MQTT_CLIENT_ID
在我們的有效載荷結構正確的情況下,我們將其轉儲到緩沖區中,然后再設置我們的 IoT 發布參數。
接收 MQTT 消息
如前所述,我們aws_iot_mqtt_subscribe()
在初始設置期間致電給我們訂閱了主題gTopicNameRec
. 該函數的參數之一 為IoTSubscribeCallbackHandler
將用于處理傳入消息的函數提供了處理程序。
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);
}
我們知道函數的簽名應該是什么,因為 Amazon 非常友好地在他們的API 文檔中為我們提供了很好的細分。該函數本身非常短,因為我們只是從 MQTT 消息中獲取有效負載數據,并使用它來構造一個ParsedJsonDataSet
對象。然后我們將該對象的內容存儲到緩沖區中,以便我們可以在網頁上提供它并顯示最后收到的消息是什么。
網頁界面
我們利用 NetBurner 生成動態 Web 內容的能力來顯示最近接收和發布的 MQTT 消息。為此,我們定義了兩個函數,html-control.cpp
它們會在數據從設備提供給請求瀏覽器之前將數據打印到網頁。這些是PrintOutData()
和PrintInData()
。
index.html 中特殊格式的注釋會觸發這些函數,并且它們具有結構,。這使得通過 Web 界面顯示任何類型的應用程序級數據變得非常容易。我們有關于該系統的大量文檔,并包括幾個功能齊全的示例以及我們的 NNDK。
實施 AWS 開發工具包依賴項
當然,AWS SDK 必須有一種方法可以綁定到 NetBurner 平臺和網絡堆棧中。我們這里使用的SDK提供了兩個接口:網絡接口和定時器接口。如上所述,這些接口的功能分別定義在network_netburner.cpp
和timer_netburner.cpp
中。
網絡接口提供所有 TLS 功能,用于啟動和關閉安全連接,以及通過這些連接讀取和寫入數據。計時器接口提供保持 MQTT 連接活動和啟動所需的超時功能。
在我們連接到 AWS IoT Core 服務并開始發送和接收 MQTT 消息之前,需要這兩個接口的功能。如果您從一開始就按照說明生成和編譯證書和私鑰,那么應該不需要修改這里實現的功能。
包起來
我們希望您覺得這個項目既有趣又有教育意義。我們在制作過程中玩得很開心,也很想聽聽您的體驗!我們在這里提供了堅實的基礎,但這真的只是這個特定項目的開始。天空是極限,所以出去開始試驗吧!
- 連接到AWS IoT的RIOT-OS應用程序
- 如何安全地將Arduino MKR GSM 1400板與GCP IoT Core結合使用
- 通過AWS IoT控制連接到Intel Galileo Gen 2的事物
- 使用ESP32以簡單且不安全的方式連接到AWS IoT
- 適用于嵌入式C的AWS IoT設備開發工具包 5次下載
- Modbus轉MQTT網關金鴿BL101如何實現將Modbus串口設備的數據上傳至亞馬遜AWS
- 嵌入式系統系列叢書-時間觸發嵌入式系統設計模式 0次下載
- 嵌入式系統定義
- 嵌入式系統與嵌入式PLC
- 嵌入式系統與嵌入式PLC 27次下載
- 調整AVR-IoT WG的用途以連接到AWS 10次下載
- 嵌入式系統是如何組成的
- 學習嵌入式系統有哪些方向?
- 嵌入式Internet設計 2次下載
- Qtopia Core在嵌入式Linux上的移植及應用
- 嵌入式fpga是什么意思 994次閱讀
- 什么是嵌入式系統?嵌入式系統的具體應用 2102次閱讀
- 嵌入式系統應用實例的詳細資料介紹 4604次閱讀
- 嵌入式系統的全面解析 3146次閱讀
- 如何實現嵌入式系統遠程調試 5080次閱讀
- 關于嵌入式系統以及嵌入式平臺下的學科分工詳解 1855次閱讀
- 嵌入式系統的特點大匯總 5743次閱讀
- PSoC嵌入式系統設計的三大優勢 3222次閱讀
- 嵌入式系統有哪些部分組成_嵌入式系統的應用領域 3.3w次閱讀
- 嵌入式行業發展狀況_嵌入式行業人才需求_嵌入式系統就業前景分析 2.3w次閱讀
- 什么是嵌入式操作系統 常見的嵌入式系統有哪些 4w次閱讀
- 嵌入式操作系統是什么_嵌入式操作系統有哪些 2w次閱讀
- 典型的嵌入式系統設計 2650次閱讀
- IoT時代嵌入式系統有你想的那么安全嗎? 1048次閱讀
- 基于嵌入式Linux的家居監控系統設計 2023次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多