
iot物联网系统-独立应用版(推荐)
详细介绍
本系统是基于webman开发的一套物联网平台,可以实现物联网设备的联网上线、数据采集、命令下发、被动回复、实时通讯等功能,支持TCP协议、Websocket协议(ws和wss)、Mqtt协议,本系统提供的是TCP协议透传,用户需根据实际情况将设备协议转为TCP协议后接入本系统,一般可使用DTU设备或IO设备,这些设备可以将硬件的各种协议统一转为TCP协议,如电表、仪表、传感器、地磅、IO设备、开关量、模拟量、扫码枪、语音播报、身份证读卡器、各类灯具、门禁开关等都支持,真正实现万物互联。
webman-admin插件版(功能与独立版有些不一致,请以文档为准)
https://www.workerman.net/app/view/iotplug
演示地址
购买前请先在演示地址上测试,确认可以满足您的需求后再购买!
http://47.104.225.241:6767/
账号密码:admin admin
TCP端口:6262
WebSocket端口:6161
Mqtt服务端端口:1883
Text协议端口:6868
MQTT客户端端口:5103
这些端口都要在安全组里放开,PHP版本要求7.X以上,环境要求linux
功能特性
1、数据采集:支持利用TCP协议从设备实时采集数据,数据可以直接存入redis里,支持string类型和list类型,支持数据过滤,支持数据转发给指定url。
2、命令下发:支持服务端秒级给设备下发指令,支持以队列的方式下发。
3、被动回复:根据设备发送的特定指令,针对性的回复命令。
4、实时通讯:可以跟设备实时进行通讯,方便验证命令和调试设备。
5、数据转发:可以实现两个或多个设备之间的相互转发,如:想让设备采集的数据直接发送到网页websocket,用转发即可简单实现。
安装使用
1、下载代码部署到服务器上。由于windows系统上无法使用多进程,所以本系统要求linux环境,不支持windows系统。不会部署的可联系QQ:409703312(限宝塔环境)。
2、修改配置参数:
文件路径:
config/plugin/webman/gateway-worker/app.php
domain:系统的域名,必须是http或https开头,注意域名末尾不加/,修改这个参数后要删除根目录/runtime/views下的所有文件已使配置生效
ip:为所在服务器的公网IP,
server_port:webman的http协议监听端口
tcp_port:TCP协议监听端口
ws_port:WebSocket协议监听端口(ws)
wss_port:WebSocket协议监听端口(wss)
ssl_cert:SSL证书(.crt)
ssl_key:SSL证书密钥(.key)
super_code:超级权限注册包(注意修改),默认所有的设备收到的消息都会转发消息到这个注册包
text_port:text协议端口
mqtt_port:mqtt协议端口
version:版本号
版本v2.2.0新增
mqtt_client_port:5103 // MQTT客户端所在进程的监听端口,用于管理mqtt设备的订阅、发布和销毁
mqtt_client_username:'admin' // MQTT客户端的管理员用户名,需跟emqx的配置保持一致:访问控制-客户端认证
mqtt_client_password:'123456' // MQTT客户端的管理员密码,需跟emqx的配置保持一致:访问控制-客户端认证
mqtt_client_id: 'HiWADmy42NB4' //MQTT客户端的管理员client_id(不能跟其他client_id重复),需跟emqx的配置保持一致:访问控制-客户端认证
mqtt_client_api_url: 'http://127.0.0.1:18083/' //MQTT客户端的管理员api_url,带/结尾.EMQX的api端口默认18083,如果修改了端口,需要修改这里.如果不是本机,需要修改为实际的公网ip地址
mqtt_client_api_key: 'c7ad44cbad762a5d' //MQTT客户端的管理员api_key,在emqx中创建:系统设置-API密钥
mqtt_client_api_secret: 'j7SGdQpKIO3sUnTFJDJjhgVl5eyv2PpWoS2HFSYEdBP' //MQTT客户端的管理员api_secret,在emqx中创建:系统设置-API密钥
//管理员的设置是为了接收所有mqtt设备的上报,为了安全上线前最好进行修改,如果更改(mqtt_client_username、mqtt_client_password、mqtt_client_id)的话,
//需要同步修改emqx的配置的sql语句,路径在访问控制-客户端认证-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重启项目
(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、修改数据库连接配置:文件路径:config/thinkorm.php,数据库文件在根目录,请手动安装。
4、修改redis连接配置:文件路径:config/redis.php和config/plugin/webman/redis-queue/redis.php,redis扩展和redis数据库请自行安装。
5、如果需要mqtt,那么需要安装mqtt服务端。百度安装emqx软件的步骤或者宝塔面板-软件管理-搜索emqx安装。安装完成后进入emqx的后台管理系统,默认的路径是http://xx.xx.xx.xx:18083 首次登录需要设置账号密码。登录进去之后找到客户端认证设置菜单。
5.1配置客户端认证:
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
启动
1、根目录里输入php start.php start即可启动,具体可参考webman手册。
2、网页访问http://xx.xx.xx.xx:6767/index 即可登录,为方便测试使用,登录环节没有验证权限,点击登录即可进入设备管理页面,用户自行设置验权。
3、进入http://xx.xx.xx.xx:6767/iot/index 进行配置。
设备操作
一、添加设备
1、自定义注册包:
(1)必填。自定义注册包是设备与服务端建立连接的唯一凭证,设备在连接服务端时,必须使用自定义注册包,否则服务端会拒绝连接。
(2)自定义注册包可以是任意字符串,但是不能包含英文逗号,否则会导致解析错误。
(3)注册包是设备的唯一ID且不能跟其他设备重复,相当于设备的身份证,用于向服务端验证身份。一般是在使用DTU的时候配置在DTU里,第一次连接服务端的时候,DTU会发送自定义注册包进行身份注册。服务端验证通过后建立连接。
(4)自定义注册包只需在第一次连接服务端时发送,后续连接服务端时,不需要再发送。
2、自定义回复包:非必填,自定义回复包是设备在第一次注册成功时,服务端回复给设备的数据,如果不填写,那么服务端不回复。
3、名称:必填,设备名称。
4、协议类型:
(1)TCP透传:创建一个TCP客户端,设备发送的数据会直接转发给服务端,服务端发送的数据会直接转发给设备。用户可以通过DTU设备,将设备的数据转发给服务端,服务端再转发给设备,这样就实现了设备与服务端的通讯。
(2)WebSocket:创建一个websocket客户端。
(3)Mqtt:创建一个Mqtt设备
5、登录类型:
(1)单点登录:该自定义注册包只允许一个设备登录,当多个设备使用同一个注册包登录时,会将已登录设备踢下去。通常设备与服务端建立的TCP协议都使用单点登录。
(2)多点登录,该自定义注册包只允许多个设备同时登录,通常websocket协议都是多点登录。
6、数据字段:
(1)此字段为配置redis字段,设备返回的数据会存入到这个redis字段里,支持string类型和list类型,如果是list类型,那么设备返回的数据会存入到list的头部,如果是string类型,那么设备返回的数据会覆盖之前的数据。如果想设置list类型,那么请在字段前面加上:list,如:list:valList。如果不设置,默认为string类型,如:val,即表示字段为val的string类型数据。
(2)ASCII:设备返回的数据以ASCII格式存入redis,HEX:以16进制格式存入redis
(3)请注意:即使不设置redis字段,这里的数据类型也要设置,系统是根据这个字段进行数据转化,如一般的设备都是HEX,系统默认
7、设备数据日志:是否开启记录设备数据日志功能。开启的话系统会将设备上报的数据记录到mysql数据库。注意:获取设备数据日志接口依赖此项功能开启。
8、数据转发:
(1)此字段为配置转发设备的注册包,可实现设备间互相通讯,比如设备上报数据的时候同步转发给websocket设备,就实现了页面实时接收设备上报数据。多个注册包用英文逗号分隔。
上图含义:路灯M9NRilOsYETL2接收到的数据会同步转发到vW5FqKGW6G28,B2PeiPfwejdu两个设备里。
(2)转发的数据会进行简单的打包,以json字符串进行转发。格式为:
{"k":"M9NRilOsYETL2","v":"values","t":"xxxx-xx-xx xx:xx:xx"}
解释:k:数据来源的注册包,v:转发的数据,t:转发时间.
9、Http-Client:
(1)此字段为配置数据转发的url,多个url用英文逗号分隔。
上图含义:自来水供水tK8i2JvLJGrf3接收到的数据会同步转发到http://xxx.com,http://yyy.com 这两个域名,
(2)转发会以post请求进行转发,有以下参数:vtype:数据类型:0表示ASCII,1表示HEX16进制,msg:转发的数据,from:转发来源注册包
10、数据过滤
(1)如果启用的话,系统会对设备发来的数据进行简单的过滤,不符合过滤条件的数据会被丢弃。
(2)字节长度:会根据数据的字节长度进行过滤。
(3)前N位字符:会根据数据的前N位字符进行过滤。
(4)忽略心跳包:会根据特定字符串进行过滤。
二、定时下发
1、设备默认不启用定时下发,如果启用的话,需要设备重新连接后生效。
2、系统默认支持频率:1秒1次、1秒2次、30秒1次、1分钟1次、3秒1次、10秒1次。
3、自定义内容:ASCII类型,HEX类型。物联网设备一般以HEX16进制类型下发。
4、支持填写多个指令,用英文逗号,分隔。若设置多个指令,则会按照设置的频率,按照指令从前到后依次发送。
如上图所示,代表第一个30秒的时候,发送010300010001D5CA,第二个30秒发送010300040001C5CB,第三个30秒发送010300010001D5CA,依次类推。这样设计的目的是有些设备会限制请求帧的频率,频率太高或一次性发多条,设备就不会回复。
5、定时下发的原理:当客户端与服务端创建连接成功之后,会根据设备配置参数,启动一个workerman的Timer定时器来进行指令下发,当该客户端断开连接的时候自动销毁。所以如果客户端断开后重连,可能会导致定时器出现应该下发的时候没有下发的情况。举例:某个设备设定的1分钟执行一次,每次都是在1分33秒的时候下发指令。假如设备在1分30秒的时候由于某些情况断开了连接,然后1分31秒的时候重连成功,此时新创建的定时器会在2分31秒的时候才会下发指令。对于时间敏感的业务,建议将定时下发的时间间隔设置的短一些,也可以通过redis或者http-client等方式让业务程序去处理。
三、被动回复
1、系统支持设置两套命令回复。
2、触发指令:设备回复的指令如果与触发指令匹配即触发,服务端会进行回复。
3、回复指令:当触发被动回复后服务端回复的指令。
4、ASCII类型,HEX类型(16进制)
四、数据流
设备发送的数据都会在这个数据流上显示。系统设置了一个超级权限注册包,即config/plugin/webman/gateway-worker/app.php文件中的super_code字段,所有的iot设备发送的数据,都会默认给这个超级权限转发,即实现了数据流的实时数据监控,super_code也可以通过数据流下发指令给设备,即实现与设备的实时通讯。
五、队列下发指令
不支持MQTT设备
1、每一个设备在连接服务端成功之后,都会默认创建一个定时器,这个定时器是按照1秒1次进行下发指令,该定时器使用队列进行依次下发,队列为HFiots-注册包名-Default-Crontab,如果注册包名为xxxx,即:HFiots-xxxx-Default-Crontab。
2、队列的数据格式为:
$data = json_encode(['vtype' => 1, 'val' => 'xxxxxx'], JSON_UNESCAPED_UNICODE);
vtype:数据类型 0ASCII,1HEX16进制
val:下发指令
3、使用方法:
Redis::rpush('HFiots-xxxx-Default-Crontab', $data);
4、服务端会按照下面代码的顺序1秒钟给设备下发一次指令
Redis::lindex('HFiots-xxxx-Default-Crontab', 0)
六、心跳包
1、系统默认要求设备每隔30秒发送一次心跳包,如果设备超过55秒没有发送心跳包,系统会自动断开设备连接。
2、如果想关闭心跳包,可以在config/plugin/webman/gateway-worker/process.php文件中的对应协议的pingNotResponseLimit字段设置为0,即关闭心跳包。
七、指令发送
1、websocket端可以主动给其他客户端发送消息,代码如下:
//创建ws客户端
ws = new WebSocket("ws://47.104.225.241:6161");
//绑定连接事件
ws.onopen = function (evt) {
console.log("Connection open ...");
//发送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:指令末尾加换行(有些设备的协议需要换行来区分)
val: '010600020001e9ca' //指令内容
};
ws.send(JSON.stringify(obj));
2、php端也可以主动给其他客户端发送消息,代码如下:
$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 //发送的内容
];
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串口调试工具网络调试助手
串口调试助手二合一,支持完整的网络调试助手功能和完整的串口调试助手功能,TCP UDP Server Client 模式,16进制发送和显示,文件输入和存储,支持中文英文。
下载链接: https://pan.baidu.com/s/1JSunCNzZicX5Erm6rqR5Ng 提取码: 7w1d
2、MQTT调试工具mqtt.fx
下载链接: https://pan.baidu.com/s/1tOhuZrVPum2txnDDJZIIjA?pwd=gfqi 提取码: gfqi
十、API接口
1、给TCP设备发送消息
文档地址:https://uiimvhhg6c.apifox.cn/api-189698607
2、获取设备数据日志
文档地址:https://uiimvhhg6c.apifox.cn/api-187630866
3、获取设备在线状态
文档地址:https://uiimvhhg6c.apifox.cn/api-239830288
4、给MQTT设备发送消息
文档地址:https://uiimvhhg6c.apifox.cn/api-315242136
十一、使用websocket获取所有设备在线状态
所有的设备在线状态都会推送给超级权限注册包:
config('plugin.webman.gateway-worker.app.super_code')
你可以使用这个注册包创建ws客户端来实时获取所有设备在线状态,代码如下:
//创建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数据结构如下
//{"k":"YS8GSOzeFXd9","v":{"online":0},"t":"2024-12-02 16:15:49"}
//k为设备注册包,v的online表示在线状态,0:离线,1在线,t表示推送时间
};
//绑定关闭或断开连接事件
ws.onclose = function (evt) {
console.log("Connection closed.");
};
十二、 升级日志
版本v2.2.0 2025.07.02
1、qf_iot表添加索引 ALTER TABLE `qf_iot` ADD INDEX( `type`, `del`);
2、将mqtt客户端部分改为workerman/mqtt重写,不再使用emqx的webhook(请登录emqx后台关闭webhook)。
涉及到客户端在线状态、订阅、发布、记录上报数据、转发ws设备、Http-Client转发。
3、config/plugin/webman/gateway-worker/app.php增加配置项
'mqtt_client_port' => 5103, // MQTT客户端所在进程的监听端口,用于管理mqtt设备的订阅、发布和销毁
'mqtt_client_username' => 'admin', // MQTT客户端的管理员用户名,需跟emqx的配置保持一致:访问控制-客户端认证
'mqtt_client_password' => '123456', // MQTT客户端的管理员密码,需跟emqx的配置保持一致:访问控制-客户端认证
'mqtt_client_id' => 'HiWADmy42NB4', //MQTT客户端的管理员client_id(不能跟其他client_id重复),需跟emqx的配置保持一致:访问控制-客户端认证
'mqtt_client_api_url' => 'http://127.0.0.1:18083/', //MQTT客户端的管理员api_url,带/结尾.EMQX的api端口默认18083,
如果修改了端口,需要修改这里.如果不是本机,需要修改为实际的公网ip地址
'mqtt_client_api_key' => 'c7ad44cbad762a5d', //MQTT客户端的管理员api_key,在emqx中创建:系统设置-API密钥
'mqtt_client_api_secret' => 'j7SGdQpKIO3sUnTFJDJjhgVl5eyv2PpWoS2HFSYEdBP', //MQTT客户端的管理员api_secret,在emqx中创建:系统设置-API密钥
//管理员的设置是为了接收所有mqtt设备的上报,为了安全上线前最好进行修改,如果更改(mqtt_client_username、mqtt_client_password、mqtt_client_id)的话,
//需要同步修改emqx的配置的sql语句,路径在访问控制-客户端认证-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重启项目
4、设备添加的时候增加code重复校验
5、日志配置文件log.php里增加MqttClient
6、MQTT设备增加定时下发功能,可以设置发布的主题。增加下线设备功能。
7、TCP设备定时下发功能完善:定时器销毁时清理变量
8、API增加给MQTT发布消息的接口publishMsgMqtt,文档地址:https://uiimvhhg6c.apifox.cn/api-315242136
2、修复某些场景下在线状态显示异常问题:更换在线状态判断机制,TCP和websocket协议不再使用redis保存在线状态,改为使用GatewayWorker官方API判断。
3、增加设备数据日志记录开关
4、设备列表页和数据流页,根据域名配置项domain,自动采用wss或ws协议。
ALTER TABLE `qf_iot` ADD `log` INT(1) NOT NULL DEFAULT '1' COMMENT '是否启用设备数据日志:0不启用1启用';
2、修改定时下发设置的时候,会自动将设备踢下线以使设置生效。注意客户端要有重连机制