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