【一文入門,帶你進入AWS IoT Core ! - 基礎(chǔ)入門篇】

簡介

AWS IoT Core是什么?

先看下官方描述以及圖示,

  • AWS IoT 提供將您的物聯(lián)網(wǎng)設(shè)備連接到其他設(shè)備和 AWS 云服務(wù)的云服務(wù)。
AWS IoT - 圖示

由上述可知,AWS IoT,Internet of Things,讓設(shè)備接入網(wǎng)絡(luò)后,即可進行與云端服務(wù)的通信,實現(xiàn)設(shè)備與云端服務(wù)的通信,或設(shè)備與設(shè)備之間的通信。那么其實現(xiàn)是基于什么的呢?答案是MQTT協(xié)議。

為什么用MQTT?

包括AWS IoT Core,阿里云等各大廠商(1分鐘速覽!ioT服務(wù)廠商) 大體都是基于MQTT協(xié)議進行的IoT服務(wù)實現(xiàn)。

為什么這些廠商會選擇MQTT協(xié)議?(Hello, ioT! 車企巨頭在ioT中的實踐),

總結(jié)來講,有2點

  • 質(zhì)量保障:MQTT協(xié)議中有明確的服務(wù)質(zhì)量定義,基于此實現(xiàn)的服務(wù),可以讓不穩(wěn)定網(wǎng)絡(luò)環(huán)境下的數(shù)據(jù)傳輸,變的更加可靠。
  • 場景符合:基于MQTT協(xié)議實現(xiàn)的IoT服務(wù),不僅提供高可靠的通信服務(wù),還有心跳機制、遺囑消息、離線消息和安全管理等功能,非常契合物聯(lián)網(wǎng),數(shù)據(jù)回傳指令下發(fā)的場景。

典型圖示

示例

MQTT的基本模式是 發(fā)布/訂閱模式,如上圖,

  • publish: 發(fā)布者指定消息發(fā)布的主題,將消息publish到MQTT Broker上(AWS等廠商提供的服務(wù))。
  • subscrib: 訂閱者通過訂閱相應(yīng)的主題,向MQTT Broker注冊對該主題的訂閱,當(dāng)有新的消息發(fā)布到該主題時,MQTT Broker會將消息發(fā)送給所有訂閱了該主題的訂閱者。

重要概念

由于IoT服務(wù)是基于MQTT協(xié)議的,在開始演示示例之前,先介紹下MQTT里面一些重要概念,以及在AWS IoT Core里面的一些細節(jié)。

服務(wù)質(zhì)量保障QoS

MQTT設(shè)計了一套保證消息穩(wěn)定傳輸?shù)臋C制,包括消息應(yīng)答、存儲和重傳。

在這套機制下,提供了三種不同層次QoS(Quality of Service):

  • QoS0,At most once,至多一次;發(fā)送端只傳一次,不保證消息一定送達到接收端。
  • QoS1,At least once,至少一次;發(fā)送端至少發(fā)一次,確保接收端收到。
  • QoS2,Exactly once,確保只有一次;確保接收端收到且只收到一次。

注意很多服務(wù)廠商,包括AWS IoT Core都沒有支持QoS2。但是我們可以使用QoS1 ,然后在業(yè)務(wù)接收端接收的時候,通過業(yè)務(wù)id去重,實現(xiàn)冪等性,以此達到和QoS2相同的效果。

持久性會話 - Persistent Session

持久性會話存儲客戶端尚未確認的服務(wù)質(zhì)量(QoS)為 1 的客戶端的訂閱和消息,當(dāng)設(shè)備重新連接到持久性會話時,該會話恢復(fù),訂閱恢復(fù),并將在重新連接之前接收和存儲的未確認的訂閱消息發(fā)送到客戶端。

再繼續(xù)介紹之前,讓我們再仔細想下這個session有什么用 或者 怎么起作用的?

假設(shè)我們有個場景是 ,車上有數(shù)據(jù)需要傳給手機,但是手機因為網(wǎng)絡(luò)不穩(wěn)定,中間網(wǎng)絡(luò)斷了一會兒,恰好斷開到恢復(fù)之間,車上有數(shù)據(jù)發(fā)出。此時依靠持久性會話Persistent Session,手機網(wǎng)絡(luò)恢復(fù)重新連接后,可收到剛剛斷網(wǎng)期間沒有收到的消息。

圖示 :

Persistent Session

上圖所示3個階段,
1,手機端以mqtt client身份(clientId - iphone01 )連到mqtt broker,產(chǎn)生一個persistent session。
2,手機端斷網(wǎng),斷網(wǎng)期間,車上有數(shù)據(jù)傳回,先傳到mqtt broker的隊列里,但此時由于手機端斷網(wǎng)無法接收。
3,手機端網(wǎng)絡(luò)恢復(fù),繼續(xù)以mqtt client(clientId - iphone01 )連到mqtt broker,此時broker會判斷persistent session是否還在,如果還在的話 (沒有過期 并且 客戶端重連時沒主動清除),則可把剛剛沒傳到的消息,繼續(xù)推給 clientId - iphone01的設(shè)備。

由此,對于使用移動端網(wǎng)絡(luò)在室外不斷活動的情況,拿著手機移動,網(wǎng)絡(luò)不穩(wěn)定,一會斷一會兒恢復(fù),依靠persistent session,斷開這段時間內(nèi)的數(shù)據(jù)并不會丟棄,先存在隊列里,當(dāng)網(wǎng)絡(luò)恢復(fù)時,可在通過persistent session找到之前設(shè)備的訂閱情況,再進行推送。

相關(guān)的2個重要的相關(guān)參數(shù) ,
Clean Session

  • 當(dāng)其為false時,表示創(chuàng)建一個持久會話,客戶端斷開連接后,broker仍會保持session(直到會話超時注銷),如果在未過期時間內(nèi),相同client id的設(shè)備再次上線,broker還是會將斷開時間內(nèi)的信息發(fā)給這個設(shè)備。
  • 當(dāng)其為true時,代表相同client id的設(shè)備再次上線后,會主動和server說 ,重新創(chuàng)建一個session,這樣之前的session就會清空,這段時間內(nèi)尚未發(fā)給客戶端的消息也會直接清空,不再發(fā)給這個設(shè)備。

Session Expiry Interval
指定客戶端斷開后多久,服務(wù)端認為session過期。 如果設(shè)置為 0,則 session 會在 client 離線時被立刻刪除,最大可以設(shè)置為 UINT_MAX(4,294,967,295)。

注意: 除了上述MQTT協(xié)議的定義,實際各個廠商在實現(xiàn)上,超過限制數(shù)量的消息也將被刪除,畢竟存儲空間有成本,不能無限提供,以aws IoT core舉例,其一些具體規(guī)則如下,

  • 根據(jù)賬戶限制存儲消息。超過限制的消息將被刪除。有關(guān)持久消息限制的更多信息,請參閱 AWS IoT Core 終端節(jié)點和配額。

  • 當(dāng)客戶端重新連接到其持久性會話時,將恢復(fù)所有訂閱,并以每秒 10 條消息的最大速率將所有已存儲消息發(fā)送到客戶端。

  • 結(jié)束持久性會話

    • 在 MQTT 3 中,持久性會話過期時間的默認值為一小時,此設(shè)置適用于賬戶中的所有會話。
    • 在 MQTT 5 中,您可以為 CONNECT 和 DISCONNECT 數(shù)據(jù)包上的每個會話設(shè)置會話過期間隔。

主題 - Topic

自定義主題

MQTT中 ,數(shù)據(jù)傳遞都是通過pub/sub 不同主題topic進行的。使用者可以自定義主題topic,以此來進行數(shù)據(jù)傳遞。此外,在各個廠商實現(xiàn)的時候,會對預(yù)留一些特殊的topic。以下拿aws IoT core舉例,

aws 預(yù)設(shè)的主題

包括事件,規(guī)則等,以此來用于監(jiān)控 一些設(shè)備情況(訂閱情況等)。
還有些是為了aws IoT core上的其它功能比如任務(wù), 影子等預(yù)留的主題,方便這些功能的使用和監(jiān)控。
具體:https://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/reserved-topics.html

保留消息

介紹:客戶端訂閱主題后,MQTT 保留消息會被發(fā)送給客戶端。如果希望所有訂閱主題的客戶端在訂閱后立即收到 MQTT 保留的消息,則可以發(fā)布設(shè)置了 RETAIN 標(biāo)志的配置消息。只要發(fā)布新的配置消息,訂閱客戶端也會收到該配置更新。
AWS IoT Core上的實踐:保存設(shè)置了 RETAIN 標(biāo)志的 MQTT 消息。這些 保留消息 被作為普通的 MQTT 消息發(fā)送給已訂閱該主題的所有客戶端,同時也被存儲起來發(fā)送給該主題的新訂閱者。
更新保留消息:每個主題名稱只保留一條消息。發(fā)布到主題的帶有 RETAIN 標(biāo)志設(shè)置的新消息將替換先前發(fā)送到該主題的任何現(xiàn)有保留消息。

典型示例:

作為初始配置消息
客戶端訂閱主題后,MQTT 保留消息會被發(fā)送給客戶端。如果您希望所有訂閱主題的客戶端在訂閱后立即收到 MQTT 保留的消息,則可以發(fā)布設(shè)置了 RETAIN 標(biāo)志的配置消息。只要發(fā)布新的配置消息,訂閱客戶端也會收到該配置更新。

作為狀態(tài)消息
設(shè)備可以在當(dāng)前狀態(tài)消息上設(shè)置 REATIN 標(biāo)志,以便 AWS IoT Core 保存它們。當(dāng)應(yīng)用程序連接或重新連接時,它們可以訂閱此主題,并在訂閱保留的消息主題后立即獲得上次報告的狀態(tài)。這樣,它們就不必等到設(shè)備發(fā)出下一條消息才能看到當(dāng)前狀態(tài)。

遺囑 Will , MQTT Last Will and Testament(LWT)消息

MQTT協(xié)議里這個概念,很形象的比喻 ,大意就是如果MQTT client意外斷開連接,掛了,broker會代替它發(fā)最后一條消息給訂閱者。
broker將存儲 Will 消息,直到出現(xiàn)斷開連接。發(fā)生這種情況時,broker將向所有訂閱 Will 主題的客戶端發(fā)布消息以通知斷開連接。如果客戶端使用 MQTT DISCONNECT 消息通過客戶端啟動的斷開連接來斷開與代理的連接,則代理不會發(fā)布存儲的 LWT 消息。在所有其它情況下,將分派 LWT 消息。
簡單總結(jié)一下:客戶端被動斷開時(意外)會發(fā)Will,客戶端主動斷開時 ,不會發(fā)Will。

共享訂閱

AWS IoT Core 支持 MQTT 3 和 MQTT 5 的共享訂閱。共享訂閱允許多個客戶端共享對某個主題的訂閱,并且只有一個客戶端會收到使用隨機分布發(fā)布到該主題的消息,從而實現(xiàn)負載均衡,可參考圖示:

共享訂閱流程

共享訂閱流程 - 示例

對比普通訂閱,非共享訂閱流程,圖示:

非共享訂閱流程

普通訂閱 - 示例

客戶端連接鑒權(quán)

AWS IoT支持3種,分別是 證書,IAM用戶角色,Amazon Cognito身份。這里大致總結(jié)下這三種的特點,

證書

  • 可以直接在AWS上生成 ,默認由AWS上的CA生成,也可以向AWS上注冊自己的證書頒發(fā)機構(gòu) (CA),簽署自定義證書。
  • 證書生成時選擇對應(yīng)的權(quán)限角色 。
  • 證書有有效期。

IAM用戶角色:選擇權(quán)限角色后,會生成固定的access key和secret key,然后客戶端使用access key加secret key進行服務(wù)端的連接鑒權(quán)。

Amazon Cognito身份: 這個的靈活度就很大了,支持自定義賬戶密碼,或者還可以外接其他賬戶進行鑒權(quán)(例如 Login with Amazon、Facebook 和 Google)

演示

這里我們客戶端連接服務(wù)broker時,采用證書進行服務(wù)連接時的鑒權(quán)。

在AWS上生成一個物品(Thing)

1)進入到AWS IoT Core控制臺,創(chuàng)建一個物品,

創(chuàng)建物品
創(chuàng)建物品

這里先只填物品名稱即可,設(shè)備影子可以先不選,這個功能后續(xù)會單獨講解,此處不展開。

創(chuàng)建物品
  1. 這里我們先選自動生成新證書,讓AWS幫我們生成證書。
配置證書

3)添加策略到證書,也就是賦予這個證書什么樣的權(quán)限,從而讓使用這個證書的設(shè)備端獲得什么樣的權(quán)限,這里如果沒有策略可以先創(chuàng)建一個策略。

創(chuàng)建策略

進入到創(chuàng)建策略頁面后,可以細分權(quán)限, 比如發(fā)布端只賦予發(fā)布權(quán)限,接收端只賦予接收權(quán)限,如果不嚴(yán)格或者測試使用,可以直接選*全部。

創(chuàng)建策略

使用創(chuàng)建好的策略 ,添加到證書上。我這里有個之前創(chuàng)建好的策略,trusted_device 信任設(shè)備,擁有發(fā)布訂閱權(quán)限。

附近策略到證書

隨后會進入到這個頁面,生成證書和密鑰 ,這里都要下載,紅框中的三個是在下文demo中用到的文件。

.pem.crt是客戶端證書(里面也含有客戶端公鑰), -private.pem.key是客戶端私鑰,然后是根CA 。

保存證書和密鑰

演示Pub - Sub

按上述操作,我們可以分別生成2個物品Thing,進行Pub - Sub的演示,這里使用Python SDK進行演示,

Pub - Sub 命令

發(fā)送端:


發(fā)送端

接收端:


接收端

代碼地址:https://github.com/Wunan777/aws_iot_demo/tree/main

結(jié)語

至此我們完成了 對于 AWS IoT Core重要概念的講解,以及Demo實踐。

相較于其它廠商,AWS IoT Core 除了實現(xiàn)了基礎(chǔ)的MQTT功能,還有額外的比如影子,任務(wù)等功能,其對于IoT的實現(xiàn)是豐富,成熟的,推薦大家了解,這也對深入理解IoT設(shè)計有一定啟發(fā)和幫助!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容