本系統(tǒng)是基于webman開發(fā)的一套物聯(lián)網(wǎng)平臺(tái),可以實(shí)現(xiàn)物聯(lián)網(wǎng)設(shè)備的聯(lián)網(wǎng)上線、數(shù)據(jù)采集、命令下發(fā)、被動(dòng)回復(fù)、實(shí)時(shí)通訊等功能,支持TCP協(xié)議、Websocket協(xié)議(ws和wss)、Mqtt協(xié)議,本系統(tǒng)提供的是TCP協(xié)議透?jìng)鳎脩粜韪鶕?jù)實(shí)際情況將設(shè)備協(xié)議轉(zhuǎn)為TCP協(xié)議后接入本系統(tǒng),一般可使用DTU設(shè)備或IO設(shè)備,這些設(shè)備可以將硬件的各種協(xié)議統(tǒng)一轉(zhuǎn)為TCP協(xié)議,如電表、儀表、傳感器、地磅、IO設(shè)備、開關(guān)量、模擬量、掃碼槍、語音播報(bào)、身份證讀卡器、各類燈具、門禁開關(guān)等都支持,真正實(shí)現(xiàn)萬物互聯(lián)。
http://wtbis.cn/app/view/iotplug
http://47.104.225.241:6767/
賬號(hào)密碼:admin admin
TCP端口:6262
WebSocket端口:6161
Mqtt服務(wù)端端口:1883
Text協(xié)議端口:6868
MQTT客戶端端口:5103
這些端口都要在安全組里放開,PHP版本要求7.X以上,環(huán)境要求linux
1、數(shù)據(jù)采集:支持利用TCP協(xié)議從設(shè)備實(shí)時(shí)采集數(shù)據(jù),數(shù)據(jù)可以直接存入redis里,支持string類型和list類型,支持?jǐn)?shù)據(jù)過濾,支持?jǐn)?shù)據(jù)轉(zhuǎn)發(fā)給指定url。
2、命令下發(fā):支持服務(wù)端秒級(jí)給設(shè)備下發(fā)指令,支持以隊(duì)列的方式下發(fā)。
3、被動(dòng)回復(fù):根據(jù)設(shè)備發(fā)送的特定指令,針對(duì)性的回復(fù)命令。
4、實(shí)時(shí)通訊:可以跟設(shè)備實(shí)時(shí)進(jìn)行通訊,方便驗(yàn)證命令和調(diào)試設(shè)備。
5、數(shù)據(jù)轉(zhuǎn)發(fā):可以實(shí)現(xiàn)兩個(gè)或多個(gè)設(shè)備之間的相互轉(zhuǎn)發(fā),如:想讓設(shè)備采集的數(shù)據(jù)直接發(fā)送到網(wǎng)頁websocket,用轉(zhuǎn)發(fā)即可簡(jiǎn)單實(shí)現(xiàn)。
1、下載代碼部署到服務(wù)器上。由于windows系統(tǒng)上無法使用多進(jìn)程,所以本系統(tǒng)要求linux環(huán)境,不支持windows系統(tǒng)。不會(huì)部署的可聯(lián)系QQ:409703312(限寶塔環(huán)境)。
2、修改配置參數(shù):
文件路徑:
config/plugin/webman/gateway-worker/app.php
domain:系統(tǒng)的域名,必須是http或https開頭,注意域名末尾不加/,修改這個(gè)參數(shù)后要?jiǎng)h除根目錄/runtime/views下的所有文件已使配置生效
ip:為所在服務(wù)器的公網(wǎng)IP,
server_port:webman的http協(xié)議監(jiān)聽端口
tcp_port:TCP協(xié)議監(jiān)聽端口
ws_port:WebSocket協(xié)議監(jiān)聽端口(ws)
wss_port:WebSocket協(xié)議監(jiān)聽端口(wss)
ssl_cert:SSL證書(.crt)
ssl_key:SSL證書密鑰(.key)
super_code:超級(jí)權(quán)限注冊(cè)包(注意修改),默認(rèn)所有的設(shè)備收到的消息都會(huì)轉(zhuǎn)發(fā)消息到這個(gè)注冊(cè)包
text_port:text協(xié)議端口
mqtt_port:mqtt協(xié)議端口
version:版本號(hào)
版本v2.2.0新增
mqtt_client_port:5103 // MQTT客戶端所在進(jìn)程的監(jiān)聽端口,用于管理mqtt設(shè)備的訂閱、發(fā)布和銷毀
mqtt_client_username:'admin' // MQTT客戶端的管理員用戶名,需跟emqx的配置保持一致:訪問控制-客戶端認(rèn)證
mqtt_client_password:'123456' // MQTT客戶端的管理員密碼,需跟emqx的配置保持一致:訪問控制-客戶端認(rèn)證
mqtt_client_id: 'HiWADmy42NB4' //MQTT客戶端的管理員client_id(不能跟其他client_id重復(fù)),需跟emqx的配置保持一致:訪問控制-客戶端認(rèn)證
mqtt_client_api_url: 'http://127.0.0.1:18083/' //MQTT客戶端的管理員api_url,帶/結(jié)尾.EMQX的api端口默認(rèn)18083,如果修改了端口,需要修改這里.如果不是本機(jī),需要修改為實(shí)際的公網(wǎng)ip地址
mqtt_client_api_key: 'c7ad44cbad762a5d' //MQTT客戶端的管理員api_key,在emqx中創(chuàng)建:系統(tǒng)設(shè)置-API密鑰
mqtt_client_api_secret: 'j7SGdQpKIO3sUnTFJDJjhgVl5eyv2PpWoS2HFSYEdBP' //MQTT客戶端的管理員api_secret,在emqx中創(chuàng)建:系統(tǒng)設(shè)置-API密鑰
//管理員的設(shè)置是為了接收所有mqtt設(shè)備的上報(bào),為了安全上線前最好進(jìn)行修改,如果更改(mqtt_client_username、mqtt_client_password、mqtt_client_id)的話,
//需要同步修改emqx的配置的sql語句,路徑在訪問控制-客戶端認(rèn)證-mysql里,否則無法連接
//mysql的sql語句如下:
// SELECT
// CASE
// WHEN ${username} = "admin" AND ${clientid} = "HiWADmy42NB4" THEN "123456"
// ELSE password
// END as password
// FROM qf_iot
// WHERE
// (username = ${username} AND code = ${clientid} AND del = 0)
// OR (${username} = "admin" AND ${clientid} = "HiWADmy42NB4")
// LIMIT 1
//更改后需restart重啟項(xiàng)目
(1)設(shè)置的端口要注意開啟放行,如果是用的寶塔,在安全欄目添加,如果是阿里云ECS,注意在ECS控制臺(tái)里添加安全組放行。
(2)wss_port是https的websocket端口,如果需要使用,請(qǐng)配置ssl證書,阿里云騰訊云都可以申請(qǐng)免費(fèi)的證書。注意:如果是鏈接wss的話,websocket不能用ip地址,需要用域名,跟證書保持一致。如WebSocket("wss://iot.xxx.com:6363"),其中iot.xxx.com的證書要跟配置的wss.key和wss.crt一致
3、修改數(shù)據(jù)庫(kù)連接配置:文件路徑:config/thinkorm.php,數(shù)據(jù)庫(kù)文件在根目錄,請(qǐng)手動(dòng)安裝。
4、修改redis連接配置:文件路徑:config/redis.php和config/plugin/webman/redis-queue/redis.php,redis擴(kuò)展和redis數(shù)據(jù)庫(kù)請(qǐng)自行安裝。
5、如果需要mqtt,那么需要安裝mqtt服務(wù)端。百度安裝emqx軟件的步驟或者寶塔面板-軟件管理-搜索emqx安裝。安裝完成后進(jìn)入emqx的后臺(tái)管理系統(tǒng),默認(rèn)的路徑是http://xx.xx.xx.xx:18083 首次登錄需要設(shè)置賬號(hào)密碼。登錄進(jìn)去之后找到客戶端認(rèn)證設(shè)置菜單。
5.1配置客戶端認(rèn)證:
SELECT
CASE
WHEN ${username} = "admin" AND ${clientid} = "HiWADmy42NB4" THEN "123456"
ELSE password
END as password
FROM qf_iot
WHERE
(username = ${username} AND code = ${clientid} AND del = 0)
OR (${username} = "admin" AND ${clientid} = "HiWADmy42NB4")
LIMIT 1
具體配置頁面如下圖,注意密碼加密方式為:plain,加鹽:disable
注意不要啟用客戶端授權(quán)
1、根目錄里輸入php start.php start即可啟動(dòng),具體可參考webman手冊(cè)。
2、網(wǎng)頁訪問http://xx.xx.xx.xx:6767/index 即可登錄,為方便測(cè)試使用,登錄環(huán)節(jié)沒有驗(yàn)證權(quán)限,點(diǎn)擊登錄即可進(jìn)入設(shè)備管理頁面,用戶自行設(shè)置驗(yàn)權(quán)。
3、進(jìn)入http://xx.xx.xx.xx:6767/iot/index 進(jìn)行配置。
1、自定義注冊(cè)包:
(1)必填。自定義注冊(cè)包是設(shè)備與服務(wù)端建立連接的唯一憑證,設(shè)備在連接服務(wù)端時(shí),必須使用自定義注冊(cè)包,否則服務(wù)端會(huì)拒絕連接。
(2)自定義注冊(cè)包可以是任意字符串,但是不能包含英文逗號(hào),否則會(huì)導(dǎo)致解析錯(cuò)誤。
(3)注冊(cè)包是設(shè)備的唯一ID且不能跟其他設(shè)備重復(fù),相當(dāng)于設(shè)備的身份證,用于向服務(wù)端驗(yàn)證身份。一般是在使用DTU的時(shí)候配置在DTU里,第一次連接服務(wù)端的時(shí)候,DTU會(huì)發(fā)送自定義注冊(cè)包進(jìn)行身份注冊(cè)。服務(wù)端驗(yàn)證通過后建立連接。
(4)自定義注冊(cè)包只需在第一次連接服務(wù)端時(shí)發(fā)送,后續(xù)連接服務(wù)端時(shí),不需要再發(fā)送。
2、自定義回復(fù)包:非必填,自定義回復(fù)包是設(shè)備在第一次注冊(cè)成功時(shí),服務(wù)端回復(fù)給設(shè)備的數(shù)據(jù),如果不填寫,那么服務(wù)端不回復(fù)。
3、名稱:必填,設(shè)備名稱。
4、協(xié)議類型:
(1)TCP透?jìng)鳎簞?chuàng)建一個(gè)TCP客戶端,設(shè)備發(fā)送的數(shù)據(jù)會(huì)直接轉(zhuǎn)發(fā)給服務(wù)端,服務(wù)端發(fā)送的數(shù)據(jù)會(huì)直接轉(zhuǎn)發(fā)給設(shè)備。用戶可以通過DTU設(shè)備,將設(shè)備的數(shù)據(jù)轉(zhuǎn)發(fā)給服務(wù)端,服務(wù)端再轉(zhuǎn)發(fā)給設(shè)備,這樣就實(shí)現(xiàn)了設(shè)備與服務(wù)端的通訊。
(2)WebSocket:創(chuàng)建一個(gè)websocket客戶端。
(3)Mqtt:創(chuàng)建一個(gè)Mqtt設(shè)備
5、登錄類型:
(1)單點(diǎn)登錄:該自定義注冊(cè)包只允許一個(gè)設(shè)備登錄,當(dāng)多個(gè)設(shè)備使用同一個(gè)注冊(cè)包登錄時(shí),會(huì)將已登錄設(shè)備踢下去。通常設(shè)備與服務(wù)端建立的TCP協(xié)議都使用單點(diǎn)登錄。
(2)多點(diǎn)登錄,該自定義注冊(cè)包只允許多個(gè)設(shè)備同時(shí)登錄,通常websocket協(xié)議都是多點(diǎn)登錄。
6、數(shù)據(jù)字段:
(1)此字段為配置redis字段,設(shè)備返回的數(shù)據(jù)會(huì)存入到這個(gè)redis字段里,支持string類型和list類型,如果是list類型,那么設(shè)備返回的數(shù)據(jù)會(huì)存入到list的頭部,如果是string類型,那么設(shè)備返回的數(shù)據(jù)會(huì)覆蓋之前的數(shù)據(jù)。如果想設(shè)置list類型,那么請(qǐng)?jiān)谧侄吻懊婕由希簂ist,如:list:valList。如果不設(shè)置,默認(rèn)為string類型,如:val,即表示字段為val的string類型數(shù)據(jù)。
(2)ASCII:設(shè)備返回的數(shù)據(jù)以ASCII格式存入redis,HEX:以16進(jìn)制格式存入redis
(3)請(qǐng)注意:即使不設(shè)置redis字段,這里的數(shù)據(jù)類型也要設(shè)置,系統(tǒng)是根據(jù)這個(gè)字段進(jìn)行數(shù)據(jù)轉(zhuǎn)化,如一般的設(shè)備都是HEX,系統(tǒng)默認(rèn)
7、設(shè)備數(shù)據(jù)日志:是否開啟記錄設(shè)備數(shù)據(jù)日志功能。開啟的話系統(tǒng)會(huì)將設(shè)備上報(bào)的數(shù)據(jù)記錄到mysql數(shù)據(jù)庫(kù)。注意:獲取設(shè)備數(shù)據(jù)日志接口依賴此項(xiàng)功能開啟。
8、數(shù)據(jù)轉(zhuǎn)發(fā):
(1)此字段為配置轉(zhuǎn)發(fā)設(shè)備的注冊(cè)包,可實(shí)現(xiàn)設(shè)備間互相通訊,比如設(shè)備上報(bào)數(shù)據(jù)的時(shí)候同步轉(zhuǎn)發(fā)給websocket設(shè)備,就實(shí)現(xiàn)了頁面實(shí)時(shí)接收設(shè)備上報(bào)數(shù)據(jù)。多個(gè)注冊(cè)包用英文逗號(hào)分隔。
上圖含義:路燈M9NRilOsYETL2接收到的數(shù)據(jù)會(huì)同步轉(zhuǎn)發(fā)到vW5FqKGW6G28,B2PeiPfwejdu兩個(gè)設(shè)備里。
(2)轉(zhuǎn)發(fā)的數(shù)據(jù)會(huì)進(jìn)行簡(jiǎn)單的打包,以json字符串進(jìn)行轉(zhuǎn)發(fā)。格式為:
{"k":"M9NRilOsYETL2","v":"values","t":"xxxx-xx-xx xx:xx:xx"}
解釋:k:數(shù)據(jù)來源的注冊(cè)包,v:轉(zhuǎn)發(fā)的數(shù)據(jù),t:轉(zhuǎn)發(fā)時(shí)間.
9、Http-Client:
(1)此字段為配置數(shù)據(jù)轉(zhuǎn)發(fā)的url,多個(gè)url用英文逗號(hào)分隔。
上圖含義:自來水供水tK8i2JvLJGrf3接收到的數(shù)據(jù)會(huì)同步轉(zhuǎn)發(fā)到http://xxx.com,http://yyy.com 這兩個(gè)域名,
(2)轉(zhuǎn)發(fā)會(huì)以post請(qǐng)求進(jìn)行轉(zhuǎn)發(fā),有以下參數(shù):vtype:數(shù)據(jù)類型:0表示ASCII,1表示HEX16進(jìn)制,msg:轉(zhuǎn)發(fā)的數(shù)據(jù),from:轉(zhuǎn)發(fā)來源注冊(cè)包
10、數(shù)據(jù)過濾
(1)如果啟用的話,系統(tǒng)會(huì)對(duì)設(shè)備發(fā)來的數(shù)據(jù)進(jìn)行簡(jiǎn)單的過濾,不符合過濾條件的數(shù)據(jù)會(huì)被丟棄。
(2)字節(jié)長(zhǎng)度:會(huì)根據(jù)數(shù)據(jù)的字節(jié)長(zhǎng)度進(jìn)行過濾。
(3)前N位字符:會(huì)根據(jù)數(shù)據(jù)的前N位字符進(jìn)行過濾。
(4)忽略心跳包:會(huì)根據(jù)特定字符串進(jìn)行過濾。
1、設(shè)備默認(rèn)不啟用定時(shí)下發(fā),如果啟用的話,需要設(shè)備重新連接后生效。
2、系統(tǒng)默認(rèn)支持頻率:1秒1次、1秒2次、30秒1次、1分鐘1次、3秒1次、10秒1次。
3、自定義內(nèi)容:ASCII類型,HEX類型。物聯(lián)網(wǎng)設(shè)備一般以HEX16進(jìn)制類型下發(fā)。
4、支持填寫多個(gè)指令,用英文逗號(hào),分隔。若設(shè)置多個(gè)指令,則會(huì)按照設(shè)置的頻率,按照指令從前到后依次發(fā)送。
如上圖所示,代表第一個(gè)30秒的時(shí)候,發(fā)送010300010001D5CA,第二個(gè)30秒發(fā)送010300040001C5CB,第三個(gè)30秒發(fā)送010300010001D5CA,依次類推。這樣設(shè)計(jì)的目的是有些設(shè)備會(huì)限制請(qǐng)求幀的頻率,頻率太高或一次性發(fā)多條,設(shè)備就不會(huì)回復(fù)。
5、定時(shí)下發(fā)的原理:當(dāng)客戶端與服務(wù)端創(chuàng)建連接成功之后,會(huì)根據(jù)設(shè)備配置參數(shù),啟動(dòng)一個(gè)workerman的Timer定時(shí)器來進(jìn)行指令下發(fā),當(dāng)該客戶端斷開連接的時(shí)候自動(dòng)銷毀。所以如果客戶端斷開后重連,可能會(huì)導(dǎo)致定時(shí)器出現(xiàn)應(yīng)該下發(fā)的時(shí)候沒有下發(fā)的情況。舉例:某個(gè)設(shè)備設(shè)定的1分鐘執(zhí)行一次,每次都是在1分33秒的時(shí)候下發(fā)指令。假如設(shè)備在1分30秒的時(shí)候由于某些情況斷開了連接,然后1分31秒的時(shí)候重連成功,此時(shí)新創(chuàng)建的定時(shí)器會(huì)在2分31秒的時(shí)候才會(huì)下發(fā)指令。對(duì)于時(shí)間敏感的業(yè)務(wù),建議將定時(shí)下發(fā)的時(shí)間間隔設(shè)置的短一些,也可以通過redis或者h(yuǎn)ttp-client等方式讓業(yè)務(wù)程序去處理。
1、系統(tǒng)支持設(shè)置兩套命令回復(fù)。
2、觸發(fā)指令:設(shè)備回復(fù)的指令如果與觸發(fā)指令匹配即觸發(fā),服務(wù)端會(huì)進(jìn)行回復(fù)。
3、回復(fù)指令:當(dāng)觸發(fā)被動(dòng)回復(fù)后服務(wù)端回復(fù)的指令。
4、ASCII類型,HEX類型(16進(jìn)制)
設(shè)備發(fā)送的數(shù)據(jù)都會(huì)在這個(gè)數(shù)據(jù)流上顯示。系統(tǒng)設(shè)置了一個(gè)超級(jí)權(quán)限注冊(cè)包,即config/plugin/webman/gateway-worker/app.php文件中的super_code字段,所有的iot設(shè)備發(fā)送的數(shù)據(jù),都會(huì)默認(rèn)給這個(gè)超級(jí)權(quán)限轉(zhuǎn)發(fā),即實(shí)現(xiàn)了數(shù)據(jù)流的實(shí)時(shí)數(shù)據(jù)監(jiān)控,super_code也可以通過數(shù)據(jù)流下發(fā)指令給設(shè)備,即實(shí)現(xiàn)與設(shè)備的實(shí)時(shí)通訊。
不支持MQTT設(shè)備
1、每一個(gè)設(shè)備在連接服務(wù)端成功之后,都會(huì)默認(rèn)創(chuàng)建一個(gè)定時(shí)器,這個(gè)定時(shí)器是按照1秒1次進(jìn)行下發(fā)指令,該定時(shí)器使用隊(duì)列進(jìn)行依次下發(fā),隊(duì)列為HFiots-注冊(cè)包名-Default-Crontab,如果注冊(cè)包名為xxxx,即:HFiots-xxxx-Default-Crontab。
2、隊(duì)列的數(shù)據(jù)格式為:
$data = json_encode(['vtype' => 1, 'val' => 'xxxxxx'], JSON_UNESCAPED_UNICODE);
vtype:數(shù)據(jù)類型 0ASCII,1HEX16進(jìn)制
val:下發(fā)指令
3、使用方法:
Redis::rpush('HFiots-xxxx-Default-Crontab', $data);
4、服務(wù)端會(huì)按照下面代碼的順序1秒鐘給設(shè)備下發(fā)一次指令
Redis::lindex('HFiots-xxxx-Default-Crontab', 0)
1、系統(tǒng)默認(rèn)要求設(shè)備每隔30秒發(fā)送一次心跳包,如果設(shè)備超過55秒沒有發(fā)送心跳包,系統(tǒng)會(huì)自動(dòng)斷開設(shè)備連接。
2、如果想關(guān)閉心跳包,可以在config/plugin/webman/gateway-worker/process.php文件中的對(duì)應(yīng)協(xié)議的pingNotResponseLimit字段設(shè)置為0,即關(guān)閉心跳包。
1、websocket端可以主動(dòng)給其他客戶端發(fā)送消息,代碼如下:
//創(chuàng)建ws客戶端
ws = new WebSocket("ws://47.104.225.241:6161");
//綁定連接事件
ws.onopen = function (evt) {
console.log("Connection open ...");
//發(fā)送websocket的注冊(cè)包(wsCode)用于ws客戶端登錄(即身份校驗(yàn))
ws.send(wsCode);
//設(shè)置心跳包定時(shí)器保持客戶端不掉線
setInterval(function () {
ws.send('0000');
}, 30000)
};
//綁定收到消息事件
ws.onmessage = function (evt) {
console.log(evt);
};
//綁定關(guān)閉或斷開連接事件
ws.onclose = function (evt) {
console.log("Connection closed.");
};
//
var obj = {
to: deviceCode, //目標(biāo)客戶端自定義注冊(cè)包
type: 1, //0:ASCII,1:HEX
eol: 0, //0:指令末尾不加換行,1:指令末尾加換行(有些設(shè)備的協(xié)議需要換行來區(qū)分)
val: '010600020001e9ca' //指令內(nèi)容
};
ws.send(JSON.stringify(obj));
2、php端也可以主動(dòng)給其他客戶端發(fā)送消息,代碼如下:
$client = stream_socket_client('tcp://' . config('plugin.webman.gateway-worker.app.ip') . ':' . config('plugin.webman.gateway-worker.app.text_port'));
if (!$client) {
throw new \Exception('連接服務(wù)失敗,請(qǐng)重試');
}
$my = [
'from' => config('plugin.webman.gateway-worker.app.super_code'), //超級(jí)權(quán)限注冊(cè)包
'action' => 'sendMsg',
'to' => 'toCode', //接收方的自定義注冊(cè)包
'type' => '1', //0:ASCII,1:HEX,2:GB2312
'eol' => '0', //不加換行
'val' => $code //發(fā)送的內(nèi)容
];
fwrite($client, json_encode($my, JSON_UNESCAPED_UNICODE) . "\n");
1、語音播報(bào)設(shè)備:https://www.bilibili.com/video/BV13h411V7FK
2、掃碼槍:https://www.bilibili.com/video/BV1f24y1L7fd/
3、紙幣識(shí)別器:https://www.bilibili.com/video/BV1Vs4y1U7Et/
4、電子秤:https://www.bilibili.com/video/BV1xo4y1H7Ro/
1、TCP-COM串口調(diào)試工具網(wǎng)絡(luò)調(diào)試助手
串口調(diào)試助手二合一,支持完整的網(wǎng)絡(luò)調(diào)試助手功能和完整的串口調(diào)試助手功能,TCP UDP Server Client 模式,16進(jìn)制發(fā)送和顯示,文件輸入和存儲(chǔ),支持中文英文。
下載鏈接: https://pan.baidu.com/s/1JSunCNzZicX5Erm6rqR5Ng 提取碼: 7w1d
2、MQTT調(diào)試工具mqtt.fx
下載鏈接: https://pan.baidu.com/s/1tOhuZrVPum2txnDDJZIIjA?pwd=gfqi 提取碼: gfqi
1、給TCP設(shè)備發(fā)送消息
文檔地址:https://uiimvhhg6c.apifox.cn/api-189698607
2、獲取設(shè)備數(shù)據(jù)日志
文檔地址:https://uiimvhhg6c.apifox.cn/api-187630866
3、獲取設(shè)備在線狀態(tài)
文檔地址:https://uiimvhhg6c.apifox.cn/api-239830288
4、給MQTT設(shè)備發(fā)送消息
文檔地址:https://uiimvhhg6c.apifox.cn/api-315242136
所有的設(shè)備在線狀態(tài)都會(huì)推送給超級(jí)權(quán)限注冊(cè)包:
config('plugin.webman.gateway-worker.app.super_code')
你可以使用這個(gè)注冊(cè)包創(chuàng)建ws客戶端來實(shí)時(shí)獲取所有設(shè)備在線狀態(tài),代碼如下:
//創(chuàng)建ws客戶端
ws = new WebSocket("ws://47.104.225.241:6161");
//綁定連接事件
ws.onopen = function (evt) {
console.log("Connection open ...");
//wsCode為超級(jí)權(quán)限注冊(cè)包:config('plugin.webman.gateway-worker.app.super_code')
ws.send(wsCode);
//設(shè)置心跳包定時(shí)器保持客戶端不掉線
setInterval(function () {
ws.send('0000');
}, 30000)
};
//綁定收到消息事件
ws.onmessage = function (evt) {
console.log(evt.data);
//evt.data數(shù)據(jù)結(jié)構(gòu)如下
//{"k":"YS8GSOzeFXd9","v":{"online":0},"t":"2024-12-02 16:15:49"}
//k為設(shè)備注冊(cè)包,v的online表示在線狀態(tài),0:離線,1在線,t表示推送時(shí)間
};
//綁定關(guān)閉或斷開連接事件
ws.onclose = function (evt) {
console.log("Connection closed.");
};
1、qf_iot表添加索引 ALTER TABLE `qf_iot` ADD INDEX( `type`, `del`);
2、將mqtt客戶端部分改為workerman/mqtt重寫,不再使用emqx的webhook(請(qǐng)登錄emqx后臺(tái)關(guān)閉webhook)。
涉及到客戶端在線狀態(tài)、訂閱、發(fā)布、記錄上報(bào)數(shù)據(jù)、轉(zhuǎn)發(fā)ws設(shè)備、Http-Client轉(zhuǎn)發(fā)。
3、config/plugin/webman/gateway-worker/app.php增加配置項(xiàng)
'mqtt_client_port' => 5103, // MQTT客戶端所在進(jìn)程的監(jiān)聽端口,用于管理mqtt設(shè)備的訂閱、發(fā)布和銷毀
'mqtt_client_username' => 'admin', // MQTT客戶端的管理員用戶名,需跟emqx的配置保持一致:訪問控制-客戶端認(rèn)證
'mqtt_client_password' => '123456', // MQTT客戶端的管理員密碼,需跟emqx的配置保持一致:訪問控制-客戶端認(rèn)證
'mqtt_client_id' => 'HiWADmy42NB4', //MQTT客戶端的管理員client_id(不能跟其他client_id重復(fù)),需跟emqx的配置保持一致:訪問控制-客戶端認(rèn)證
'mqtt_client_api_url' => 'http://127.0.0.1:18083/', //MQTT客戶端的管理員api_url,帶/結(jié)尾.EMQX的api端口默認(rèn)18083,
如果修改了端口,需要修改這里.如果不是本機(jī),需要修改為實(shí)際的公網(wǎng)ip地址
'mqtt_client_api_key' => 'c7ad44cbad762a5d', //MQTT客戶端的管理員api_key,在emqx中創(chuàng)建:系統(tǒng)設(shè)置-API密鑰
'mqtt_client_api_secret' => 'j7SGdQpKIO3sUnTFJDJjhgVl5eyv2PpWoS2HFSYEdBP', //MQTT客戶端的管理員api_secret,在emqx中創(chuàng)建:系統(tǒng)設(shè)置-API密鑰
//管理員的設(shè)置是為了接收所有mqtt設(shè)備的上報(bào),為了安全上線前最好進(jìn)行修改,如果更改(mqtt_client_username、mqtt_client_password、mqtt_client_id)的話,
//需要同步修改emqx的配置的sql語句,路徑在訪問控制-客戶端認(rèn)證-mysql里,否則無法連接
//mysql的sql語句如下:
// SELECT
// CASE
// WHEN ${username} = "admin" AND ${clientid} = "HiWADmy42NB4" THEN "123456"
// ELSE password
// END as password
// FROM qf_iot
// WHERE
// (username = ${username} AND code = ${clientid} AND del = 0)
// OR (${username} = "admin" AND ${clientid} = "HiWADmy42NB4")
// LIMIT 1
//更改后需restart重啟項(xiàng)目
4、設(shè)備添加的時(shí)候增加code重復(fù)校驗(yàn)
5、日志配置文件log.php里增加MqttClient
6、MQTT設(shè)備增加定時(shí)下發(fā)功能,可以設(shè)置發(fā)布的主題。增加下線設(shè)備功能。
7、TCP設(shè)備定時(shí)下發(fā)功能完善:定時(shí)器銷毀時(shí)清理變量
8、API增加給MQTT發(fā)布消息的接口publishMsgMqtt,文檔地址:https://uiimvhhg6c.apifox.cn/api-315242136