實做說明
如前一篇所說(NBIoT是什麼?),NBIoT可以大幅降低企業佈署設備的WiFi需求,也可避免因為場域WiFi不穩定所造成的問題,那麼NBIoT要如何實做?
本文將會以NBIoT傳輸MQTT,並以電腦的MQTTLens進行接收為例,說明整個傳輸接收流程。
首先我們必須準備NBIoT的模組,以筆者所開發的ESP32開發整合版就有留NBIoT接口,我們的NBIoT使用的晶片是基於聯發科(MTK-2526)的BC26模組,雖然他是USB外型,但並非USB傳輸格式,只是我們帥氣的黃董認為做成USB外型比較堅固耐用,並且可以後續進行串接。
關於上面的擴充版,詳細規格資料可以參考附件:https://twgo.io/lvaal,使用範例可以參考以下四篇文章
說明一 燈號:ESP32 x NBIoT 模組 i2c燈號測試程式
說明二 USB Power:ESP32 x NBIoT模組 USB Power Port測試
說明三 I2C LCD:ESP32 x NBIoT 輔助版 背面I2C LCD
說明四 SPI TF卡:ESP32-CAM 使用內建的SD card及測試
一、NBIoT基礎設定
目前NBIoT大多採用ATCommand通訊,若讀者已經取得上面的擴充版及任何的NBIoT SIM卡,那就可以開始下面的流程。
- 在ESP32上安裝ATCommand溝通程式:https://twgo.io/hhdgs,此程式會將ESP32的序列通訊輸入轉至NBIoT(Serial2 RX:16、TX:17)中,這樣我們就可以手動來下達AT命令
- ATI:ATI是查詢系統版本,不過我們會用來測試BC26是否正常,輸入ATI後,會得到BC26的回覆如下圖。若無回應,那就必須檢查模組是否有插好。另外就是ESP32 1.0.6的版本也會造成無法回應,因此先選擇1.0.4。
- AT+QCCID :此指令用於檢查SIM卡狀態,一般來說,會列出該SIM卡的卡號,如下圖,若SIM卡未安裝,則會顯示ERROR
- AT+QCGDEFCONT?:詢問APN設定方式,由於不同系統商會有不同的APN(APN, Access Point Name)設定,例如下圖就是以中華電信或遠傳電信為例,兩者都採用”IPV4V6″,”internet.iot”為APN,當我們利用這個指令查詢時,就會得到這個結果,下一步就是利用這個指令來設定這張NBIoT模組的APN。要注意的是這裡的「?」一定要使用半形「?」不可使用全形「?」。
- AT+QCGDEFCONT=<>:上一步詢問SIM卡的APN後,我們將APN名稱放到指令最後,例如以遠傳NBIoT為例,其指令如下「AT+QCGDEFCONT=”IPV4V6″,”internet.iot” 」
到此為止,就完成NBIoT的設定工作,以上五個步驟只須做一次,以後NBIoT模組只要開機會就自動以APN尋找當地有服務的基地頭,並完成網路註冊(上網)。
二、NBIoT資料傳輸
當NBIoT完成APN設定後,就可以準備傳輸資料了,請依照以下步驟。
- AT+CEREG? :詢問基地台註冊狀態,也就是否有找到服務的基地台,若回應為「+CEREG: 0,1 」代表註冊完成,可以準備傳輸資料,若是「+CEREG: 0, 0」或「+CEREG: 0,2 」都是代表無法上網,可能是訊號不佳,或者當地無服務等問題。
- AT+CESQ:詢問網路狀態,也就是詢問網路訊號強弱,以下圖而言,第一個數字為39,代表網路訊號還不錯,數字為0~63之間,越大代表網路訊號越好,10以下就必須注意傳輸可能會很不穩定,建議更換布置地點或增加天線強度,還有就是「99」則是故障的意思。
到這裡我們已經確認NBIoT已經完成連線,下一步我們以MQTT連線到免註冊的Broker:mqtt.eclipseprojects.io,進行一次的推播為例。
也歡迎大家試用本公司最新的MQTT Broker喔,網址:mqttgo.io
- AT+QMTOPEN=0,”<>”,<>:NBIoT開啟MQTT伺服器,若是使用「eclipseprojects」的話,指令全部為「AT+QMTOPEN=0,”mqtt.eclipseprojects.io”,1883」,此時回應除了OK之外,再等候幾秒就會得到伺服器的回應「+QMTOPEN: 0,0」,代表伺服器已經收到要求,正在等候連線。
- AT+QMTCONN=0,”<>”:連線到MQTT伺服器,這裡的ClientID用亂數即可,例如本例為「AT+QMTCONN=0,”ESP32-1234567890″」,如果兩個裝置使用相同的ClientID就會無法連線,不過這裡要注意,從步驟3的AT+QMTOPEN到 AT+QMTCONN,時間不可超過60秒(沒有詳細計算),若時間太久,伺服器會關閉,連線就會失敗。若伺服器的回應是「+QMTCONN: 0,0,0 」代表連線成功,可以推播主題了。
- AT+QMTPUB=0,0,<>,<>,”<<你的主題>>”,”<<內容>>”:將內容推播到你的主題內,例如我要將溫度「28」推播到主題「yourTopic/class205/temp」時,我的指令為「AT+QMTPUB=0,0,0,0,”yourTopic/class205/temp”,”28″」,代表我要用qos=0,不要retain傳送28到主題「yourTopic/class205/temp」內,若伺服器回覆為「+QMTPUB: 0,0,0」就代表伺服器已經收到資料。
- 到MQTTLens查看訂閱主題:此時到電腦的MQTTLens(或手機MQTTDash等APP)查看是否有收到訂閱的資料
如果你有使用NodeRed的話,也可接收並用Dashboard的Gauge呈現
- AT+QMTCLOSE=0:關閉MQTT伺服器連線,當傳輸完畢後,若短期內不會再使用,可以關閉與MQTT的連線,節省電源。
到此為止,我們就完成一次的MQTT推播,當然啦,這次我們是手動傳輸,目的是讓讀者了解MQTT的傳輸流程,未來系統要實際使用時,要寫一個自動傳輸的程式,這部份後續再分享。
除了用MQTTLens來接收之外,也可以利用NodeRed來接收並儲存資料,並可以利用Dashboard來呈現,Nodered可以說是搭配MQTT最好用的工具了。
對於NBIoT有興趣的夥伴,可以參考本課程喔:https://www.accupass.com/event/2108191504441162446390
-ESP32及擴充版模組簡介
-NBIoT傳輸測試
-MQTT推播與訂閱
-ESP32藍芽BLE掃描及MQTT
-Nodered資料流設計
-Dashboard介面設計