本(ben)文介紹卓(zhuo)嵐支(zhi)持MQTT和(he)(he)JSON的(de)(de)設備的(de)(de)用(yong)法,支(zhi)持的(de)(de)設備包括(kuo)ZLAN5143、ZLAN8303-7、ZLAN1043、ZLAN7144等。其(qi)中ZLAN5143、ZLAN8303-7、ZLAN1043的(de)(de)固件版本(ben)要(yao)在(zai)1.577及以(yi)上(shang),ZLAN7144需要(yao)在(zai)1.489及以(yi)上(shang)。需要(yao)和(he)(he)zlvircom的(de)(de)5.09版本(ben)配合使用(yong)。
MQTT和JSON可(ke)以(yi)單獨使(shi)用也可(ke)以(yi)合起來(lai)使(shi)用。其中的JSON支持Modbus RTU格(ge)式轉(zhuan)化為(wei)JSON格(ge)式。
主要特點是:
1.采用(yong)MQTT為基礎的(de)協議(yi)和(he)服務器建立連接,采用(yong)訂閱發布的(de)形式(shi)進行數據通訊。
2.支持Modbus RTU寄存器(qi)的自主設計(ji)和自動采集。
3.支持將(jiang)特定的Modbus寄存(cun)器(qi)內容轉化為JSON格式定時主(zhu)動上發(fa)。
4.支(zhi)持在JSON格式中加入設備ID,方便云端(duan)識別(bie)設備。
5.支(zhi)持(chi)無符號(hao)(hao)數(shu)(shu)據和有符號(hao)(hao)數(shu)(shu)據,支(zhi)持(chi)小(xiao)數(shu)(shu)點表示,支(zhi)持(chi)4字節長(chang)度數(shu)(shu)據。
6.所(suo)有配(pei)置(zhi)都可以界面化配(pei)置(zhi)完成(cheng),用戶(hu)自(zi)主(zhu)配(pei)置(zhi)無需定制。
卓嵐Modbus RTU轉JSON可以實現Modbus RTU表的自動采集(ji),并按照(zhao)JSON格式自動上發給(gei)云端服務器。
這里我們通過(guo)一個(ge)具體的案例來講解這個(ge)用法(fa)。
假設現在有(you)一個(ge)功能碼為(wei)3,地(di)址為(wei)1的(de)Modbus表,其寄(ji)存器(qi)地(di)址和(he)參數名如下。其中字節長度為(wei)4的(de)表示需要連續讀2個(ge)寄(ji)存器(qi)。
寄存器地址 | 參數名 | 字節長度 | 備注 |
0 | 當前總有功電能 | 4 | 無符號,保留2位小數 |
97 | A相電壓 | 2 | 無符號,保留1位小數 |
98 | B相電壓 | 2 | |
99 | C相電壓 | 2 | |
100 | A相電流 | 2 | 無符號,保留2位小數 |
101 | B相電流 | 2 | |
102 | C相電流 | 2 | |
119 | 頻率 | 2 | |
356 | A相有功功率 | 4 | 有符號,保留3位小數 |
358 | B相有功功率 | 4 | |
360 | C相有功功率 | 4 | |
362 | 總有功功率 | 4 |
所(suo)謂有符號(hao)是指(zhi),2字(zi)節或者4字(zi)節最(zui)高bit為符號(hao)位,例如0xFFFF將(jiang)被認為是-1。保留(liu)2位小數是指(zhi)將(jiang)數據當作整型轉化之后,小數點從最(zui)右邊向左(zuo)移動2位。
我們按照設備作為(wei)客戶端的(de)方(fang)式(shi)進(jin)行配(pei)置。
使用SocketDlgTest,在(zai)本地(di)計算機1883端(duan)口監(jian)聽一(yi)個(ge)TCP服務器。
使用(yong)ZLVircom對設(she)備(bei)進行配置。
點擊修(xiu)改配置,可以讓設備連接(jie)上SocketDlgTest工(gong)具(ju)。再(zai)次(ci)進入(ru)設備編輯對話(hua)框。點擊“固(gu)件和配置”按鈕(niu)。
首先點擊(ji)“網頁目錄(lu)(lu)下(xia)(xia)載”進入(ru)配置(zhi)下(xia)(xia)載模式。然后(hou)選擇一(yi)個新的(de)(de)空目錄(lu)(lu),比如MQTTHTTPD目錄(lu)(lu)。防(fang)止之前的(de)(de)設(she)計(ji)有殘(can)留,請先點擊(ji)“清除全部”按鈕,這樣(yang)可(ke)以清空之前的(de)(de)設(she)計(ji)內(nei)容(rong)。設(she)計(ji)文件將會保存(cun)在這個目錄(lu)(lu),等(deng)一(yi)下(xia)(xia)可(ke)以通過點擊(ji)“下(xia)(xia)載”按鈕下(xia)(xia)載到(dao)設(she)備內(nei)部。
點擊“JSON配置”按(an)鈕。
這(zhe)里的參(can)數說明(ming)如下(xia):
1.上(shang)(shang)發(fa)(fa)服(fu)務器時間:默認JSON數據每隔多少(shao)時間上(shang)(shang)發(fa)(fa)到(dao)服(fu)務器,服(fu)務器就是(shi)剛剛在設(she)備配置界面設(she)置的(de)目的(de)IP,單(dan)位是(shi)毫秒。
2.是否上發設(she)備(bei)(bei)ID:如果選擇1則會在每次上發的(de)JSON數據中(zhong)包(bao)含(han)有設(she)備(bei)(bei)的(de)ID,設(she)備(bei)(bei)ID就是在設(she)備(bei)(bei)編輯界面左上角看到(dao)的(de)設(she)備(bei)(bei)的(de)MAC地址。
3.ID的JSON關(guan)鍵(jian)詞(ci)(ci)是自己命名的ID對應的的JSON關(guan)鍵(jian)詞(ci)(ci),這(zhe)(zhe)里寫(xie)MyID,最長為32字節。這(zhe)(zhe)樣以(yi)后JSON格式中會增加”MyID”:”2850002F0EEC”的內容。這(zhe)(zhe)類(lei)似于注冊包,有(you)利于服務器識(shi)別(bie)是哪一臺(tai)設備發來的數據。
4.添加/查(cha)看:點擊后可以進行Modbus寄存器的設計,也可以查(cha)看目前已經(jing)內容。
5.刪除全部:刪除由(you)“添加/查看”按鈕(niu)設(she)計(ji)(ji)的所有的Modbus寄存器,方便重新開(kai)始(shi)設(she)計(ji)(ji)。
6.保(bao)存(cun)JSON設置:設計完成后(hou)只有點擊這(zhe)個按鈕才可以(yi)保(bao)存(cun)數據(ju)到剛才的下載(zai)目錄(lu),之(zhi)后(hou)可以(yi)下載(zai)到設備內部。
現在(zai)點擊“添加/查看(kan)”按鈕。對于(yu)之前的Modbus表(biao)的第一行:
寄存器地址 | 參數名 | 字節長度 | 備注 |
0 | 當前總有功電能 | 4 | 無符號,保留2位小數 |
對應的配置如下:
這里的參(can)數(shu)說明如下:
1.第1個寄存器:這里的(de)1,表(biao)示現在(zai)的(de)設計界(jie)面是(shi)配置(zhi)第一(yi)個寄存器。
2.已經添加(jia)過:如果打勾(gou)說(shuo)明是已經添加(jia)的,查看已經配置的信息的時候會(hui)出現打勾(gou)的情況。
3.從站地址:Modbus的表地址。
4.Modbus功能碼:目前支持03和04功能碼。
5.寄存器地址(zhi):這里(li)對應的(de)0。
6.數據(ju)長度:這里對應是(shi)4字(zi)節。
7.數據格(ge)式(shi):這(zhe)里對應是無符號整型。
8.保(bao)留小數點:這里保(bao)留2位。
9.串口(kou)輪(lun)詢時間:這里設為100ms。是(shi)指這個寄(ji)(ji)存(cun)器和下個寄(ji)(ji)存(cun)器的輪(lun)詢的間隔,而不(bu)是(shi)這條(tiao)指令(ling)的輪(lun)詢間隔。
10.對應的(de)JSON關(guan)鍵詞(ci):對應上發的(de)JSON中的(de)keyword。例如(ru)”CurrentW”:232.12。
11.設計下一(yi)個:點擊(ji)后(hou)進入下一(yi)個寄存器的(de)設置(zhi)。
12.保存設計:完(wan)成設計,之后(hou)點擊上一個界面(mian)的“保存JSON配置”即可。
13.取消設(she)計(ji):取消當前的所有設(she)計(ji),如果(guo)是查看設(she)計(ji)內容,可以點擊這個(ge)按鈕退(tui)出。
這里點擊(ji)(ji)“設(she)計下一個”按鈕繼(ji)續(xu)設(she)計Modbus表中的其它寄存(cun)(cun)器(qi)。全部(bu)設(she)計完(wan)表格中的寄存(cun)(cun)器(qi)后,點擊(ji)(ji)“完(wan)成設(she)計”,然后點擊(ji)(ji)“保存(cun)(cun)JSON配置”后退出。然后點擊(ji)(ji)“下載(zai)web”頁(ye)面(mian)的“下載(zai)按鈕”
然后點擊“確定”,設(she)備會自動(dong)重啟(qi)。如果沒有重啟(qi)請手(shou)動(dong)重啟(qi)。
這(zhe)里使用Modbus Slave來模擬一(yi)個(ge)表
測(ce)試結果顯示,使用(yong)Modbus slave工具模擬(ni)的儀表(biao)能夠(gou)被(bei)網關(guan)所采集。同時(shi)(shi)可以定時(shi)(shi),按照json格式上發到(dao)SocketDlgTest模擬(ni)的服務(wu)器(qi)軟件(jian)端。
MQTT可(ke)以(yi)(yi)單獨(du)使(shi)(shi)用(yong)也(ye)可(ke)以(yi)(yi)和JSON功能配(pei)合使(shi)(shi)用(yong)。當單獨(du)使(shi)(shi)用(yong)的(de)(de)時(shi)候MQTT功能將(jiang)串(chuan)口(kou)(kou)數據透(tou)傳上發(fa)MQTT服務器。也(ye)就是(shi)將(jiang)串(chuan)口(kou)(kou)接收的(de)(de)數據作為MQTT的(de)(de)載(zai)荷。同時(shi)MQTT的(de)(de)載(zai)荷會以(yi)(yi)透(tou)傳的(de)(de)方式從(cong)串(chuan)口(kou)(kou)輸出(chu)。實現串(chuan)口(kou)(kou)轉MQTT。
點擊(ji)“固件與(yu)配置(zhi)(zhi)”,彈(dan)出配置(zhi)(zhi)下載和(he)設計對話框:
這里選(xuan)擇(ze)“網頁(ye)目錄下載”,然(ran)后選(xuan)擇(ze)一(yi)個空(kong)的(de)目錄,比如MQTTHTTPD目錄,然(ran)后先(xian)點擊(ji)“清(qing)除全部(bu)”清(qing)除之前(qian)的(de)設(she)計(注意(yi)如果之前(qian)按有(you)JSON設(she)計的(de),則不要清(qing)除全部(bu),否則會(hui)清(qing)除之前(qian)的(de)JSON設(she)計)。然(ran)后點擊(ji)MQTT配(pei)置。
這里配置說明如下:
1.服(fu)(fu)務器(qi)域名(ming)或IP:這里填寫的是(shi)MQTT服(fu)(fu)務器(qi)的IP,最長為30個字符。
2.用戶(hu)名:是(shi)MQTT服務器的(de)用戶(hu)名。
3.密碼(ma):是這個用戶(hu)的登(deng)錄密碼(ma)。
4.客戶(hu)端ID:是MQTT的client ID。
5.訂閱主題:是這(zhe)(zhe)個(ge)(ge)設(she)備(bei)訂閱的主題,有其它設(she)備(bei)發布這(zhe)(zhe)個(ge)(ge)主題的時候(hou),服務(wu)器(qi)會下發給這(zhe)(zhe)個(ge)(ge)設(she)備(bei)。如果只是發布,一般無(wu)需填寫這(zhe)(zhe)個(ge)(ge)字段。
6.發布主題(ti):這個設(she)備(bei)串口轉(zhuan)MQTT的(de)時(shi)候向服務器(qi)發送(song)的(de)數據的(de)主題(ti)。
7.MQTT高級(ji)參(can)數:用于配置高級(ji)參(can)數。
8.保存(cun)MQTT設置:設計(ji)完畢點擊這個按(an)鈕進行保存(cun),然后點擊網頁下(xia)載目錄的“下(xia)載按(an)鈕”下(xia)載。
現在先點擊“MQTT高級(ji)(ji)參數”(一般(ban)無(wu)需配(pei)置高級(ji)(ji)參數):
說明如下:
1.協議版本(ben)(ben):目前主流的是(shi)3.1.1版本(ben)(ben),如果(guo)需(xu)要(yao)選(xuan)擇3.1版本(ben)(ben),請在這里選(xuan)擇。
2.保(bao)活時間:MQTT的心跳(tiao)時間,最(zui)少為10秒,默認為60秒。
3.服務器清除(chu)訂閱(yue):客戶端斷線后服務器是否清除(chu)訂閱(yue)信息(xi)。
4.是否(fou)啟用遺愿:是否(fou)有遺愿。
5.遺(yi)愿主(zhu)題:遺(yi)愿主(zhu)題。
6.遺(yi)(yi)愿信(xin)息:遺(yi)(yi)愿的信(xin)息。
7.是否(fou)保存遺愿:服務(wu)器是否(fou)需要保持客戶端異(yi)常離線時發送給客戶端的遺愿消息。
8.遺愿質量:服(fu)務器發(fa)送的遺愿消息的交付質量級別(bie)。
9.訂閱質量:訂閱的交付(fu)質量級別。
10.發(fa)布質量:客戶端發(fa)布消息的交付質量級別。
11.是否(fou)保存發布:服務器是否(fou)保持最后一(yi)條消息(如果有新的客戶端訂閱(yue)則發送給客戶端)。
我們這里不修改高級參數(shu)。直接(jie)點擊“保存MQTT設置”。然后(hou)點擊“下載”
下載完畢點擊確(que)定,此時(shi)會(hui)回到(dao)設(she)備管理(li)對話框,看(kan)到(dao)設(she)備的目的IP、工作模式、目的端(duan)口(kou)已經(jing)自動(dong)修改(gai)為MQTT的設(she)置:
如果沒有自動(dong)修改(gai)則需要在設(she)備編輯對話(hua)框下,設(she)置目(mu)的IP、工作模式、目(mu)的端口。然后點擊“修改(gai)設(she)置”。
這樣配置就完成了。
連接完成后設(she)備的LINK燈(deng)(一(yi)般為(wei)中間的藍(lan)色燈(deng))變亮。說明設(she)備正常連接上MQTT服務(wu)器。
現在打開串口工具:
使(shi)用和設備(bei)一樣(yang)的波(bo)特率打開串口(kou),并發送(song)數(shu)據“dev send”,此(ci)后在(zai)接(jie)收(shou)窗口(kou)看到返回的數(shu)據“dev send”。這(zhe)(zhe)(zhe)是由于我(wo)們將(jiang)dev send這(zhe)(zhe)(zhe)個(ge)(ge)信(xin)息以(yi)zlansub的主(zhu)題發布給MQTT服務器。但是同時我(wo)們的設備(bei)也訂閱了(le)zlansub這(zhe)(zhe)(zhe)個(ge)(ge)主(zhu)題,所(suo)以(yi)服務器立刻(ke)會(hui)給我(wo)們發送(song)一個(ge)(ge)訂閱信(xin)息,訂閱信(xin)息的內容就是dev send。這(zhe)(zhe)(zhe)個(ge)(ge)信(xin)息作為MQTT的載(zai)荷發送(song)下載(zai),通過透傳的方式從串口(kou)輸出。
如果其(qi)它設備發布信息過來,這個設備也能夠收(shou)到數據。
一般來說(shuo),用戶可(ke)(ke)以直(zhi)接將串口指令(比如Modbus RTU)指令直(zhi)接透傳給(gei)MQTT服(fu)務器(qi)。另外也(ye)可(ke)(ke)以使用JSON功能,采(cai)用自動(dong)Modbus RTU格(ge)式采(cai)集,定時JSON格(ge)式上(shang)發的形式。另外也(ye)可(ke)(ke)以找上(shang)海卓嵐(lan)定制一些非標(biao)的儀表和(he)上(shang)位機協議(yi)格(ge)式。
將上(shang)述的(de)JSON和MQTT相(xiang)組合可(ke)以(yi)實現如下(xia)的(de)功能:
1.采用(yong)MQTT為(wei)基礎的協議和服務器建立連接,采用(yong)訂閱發布的形式進行(xing)數據通訊。
2.支持Modbus RTU寄存器(qi)的自主設計和(he)自動采(cai)集。
3.支持將特定的Modbus寄存器內容轉化為JSON格式(shi)定時主動上發(fa)。
4.支持在(zai)JSON格式(shi)中(zhong)加入設備ID,方便云(yun)端識別設備。
如果(guo)需要(yao)MQTT+JSON轉Modbus RTU功(gong)能的,可以分別設(she)計(ji)MQTT和(he)JSON,不分先(xian)后次序。設(she)計(ji)完一(yi)種不要(yao)點擊“清除設(she)計(ji)”按(an)鈕,兩個設(she)計(ji)完,一(yi)起點擊“下(xia)載(zai)”按(an)鈕下(xia)載(zai)到(dao)設(she)備(bei)內容。
一般可以(yi)下載后(hou)手動重啟設(she)備,加載設(she)置。