硬件设备连不上Workerman主因是监听地址写死为127.0.0.1,应改为0.0.0.0;其次需检查防火墙(如firewalld)、云安全组、协议匹配(TCP/WS/WSS)及低端口权限问题,并完整重启服务验证。

硬件设备能连网络调试助手但连不上 Workerman,通常是监听地址写死了
网络调试助手(如 TCP/UDP 调试工具)一般在本机发起连接,只要服务端监听 127.0.0.1 或 localhost 就能通;而硬件设备(比如单片机、嵌入式模块)走的是局域网或外网,必须访问服务器的真实 IP,此时若 Workerman 还在监听 127.0.0.1,连接会直接被拒绝。
检查你的启动代码里是否出现类似这些写法:
new Worker('tcp://127.0.0.1:5678')new Worker('websocket://127.0.0.1:8080')$worker->listen('text://127.0.0.1:2345')
全部换成 0.0.0.0,例如:
$worker = new Worker('tcp://0.0.0.0:5678');
改完务必执行完整重启:php start.php stop && php start.php start,热重载不生效。
硬件设备用固定 IP 连接,但 Workerman 绑定的端口被系统防火墙拦了
Linux 系统(尤其是 CentOS 7+/AlmaLinux)默认启用 firewalld,即使 Workerman 监听了 0.0.0.0,端口不通也是常态。网络调试助手在本机跑,走的是 loopback,不经过防火墙规则;硬件设备走的是 eth0,会被拦截。
快速验证和放行方法:
- 查当前开放端口:
sudo firewall-cmd --list-ports - 临时加端口(测试用):
sudo firewall-cmd --add-port=5678/tcp --permanent - 重载规则:
sudo firewall-cmd --reload - 云服务器还要进安全组页面,手动添加对应 TCP 端口(别只信本地防火墙)
硬件设备发的是裸 TCP 包,但 Workerman 启动协议不匹配
很多硬件模块(如 ESP32、STM32+LWIP)默认建的是纯 TCP 连接,不是 WebSocket、HTTP 或 SSL 加密流。如果你的 Workerman 是用 websocket:// 或 ssl:// 协议启动的,硬件一发原始字节就握手失败,表现就是“连上又断”或完全无响应。
确认协议一致性:
- 硬件连的是
tcp://ip:port→ Workerman 必须用tcp://0.0.0.0:port - 硬件连的是
ws://ip:port→ Workerman 必须用websocket://0.0.0.0:port - 硬件连的是
wss://→ Workerman 必须用ssl://0.0.0.0:port且配好ssl_context
别把协议当装饰——onMessage 回调只对匹配协议的数据触发,协议错,回调根本不会进。
Workerman 启动用户没权限,低端口绑定静默失败
如果硬件设备要连 :80 或 :443,而你用普通用户(比如宝塔面板里的 www 用户)执行 php start.php start,Workerman 会因权限不足无法绑定,进程看似运行,实则监听失败。网络调试助手连 127.0.0.1:80 失败时可能报错明显,但硬件连公网 IP 时只显示 timeout 或 refused,容易误判。
解决路径很直接:
- 开发阶段:改用高端口,如
9501、5678,避开权限限制 - 生产环境要用 80/443:别让 Workerman 直绑,前面挂 Nginx 反代,Nginx 以 root 跑,转发到
0.0.0.0:9501 - 检查是否真在监听:
sudo lsof -i :80或sudo netstat -tuln | grep :80,没输出就说明没绑上
硬件通信不像浏览器有控制台可查 handshake 错误,它只认“连得上 / 连不上”,所以每一步都得验证到底层是否真实生效,不能只看 PHP 进程在不在。

















