主题
websocketserver — WebSocket 服务器
模块名:websocketserver
在设备上启动一个 WebSocket 服务器,供浏览器页面实时连接。Lua 侧的接口只有一个 creat,调用即启动,之后所有协议交互都在固件内部完成,脚本里不能收发消息。
它的主要用途是给设备的内置 Web 页面(云组态、在线调试)提供实时通道。设备在线调试时 print 的输出也会重定向到已连接的 WebSocket。
安全提示:本模块不提供认证。任何能访问该端口的浏览器都能建立连接。部署到公网前请用防火墙或端口映射策略限制来源。
函数总览
库级函数
| 函数 | 作用 |
|---|---|
websocketserver.creat([port]) | 创建并立即启动 WebSocket 服务器 |
对象方法
无。对象只有 __gc,被垃圾回收时自动停止服务器。没有 send / stop / broadcast / reg 之类的方法。
websocketserver.creat
lua
websocketserver.creat([port]) --> server创建并立即启动 WebSocket 服务器。不需要(也没有)额外的 start。
参数
| # | 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|---|
| 1 | port | integer | 否 | 80 | 监听端口 |
返回值
| 类型 | 说明 |
|---|---|
| userdata | 服务器对象。必须用变量长期持有,被 GC 回收时服务器会立即停止 |
示例
lua
-- 用全局变量持有,防止被回收
wss = websocketserver.creat(8000)说明
- 忘记接住返回值(写成
websocketserver.creat(8000))时,对象随时可能被 GC,服务器会莫名停止。这是本模块最常见的问题。 - 默认端口
80可能和设备内置的 HTTP 服务冲突,自建服务建议换一个端口。
注意事项
- 只有
creat一个函数,脚本无法主动推送或接收 WebSocket 消息。需要脚本可控的双向通道请用tcp_server。 - 返回的对象必须长期持有,否则服务器会随 GC 停止。
- 没有认证机制,暴露到公网前请做网络层限制。
例程
本模块只有
creat一个函数:调用即启动,脚本不能主动收发消息(交互由内置 Web 页面完成)。 唯一要点是必须长期持有返回的对象。统一模板「场景 / 完整代码 / 要点 / 验证方法 / 注意事项」。
例程 1:启动调试 WebSocket(让 print 输出可见)
适用:LP3201 / LP3202 / LP3203 / LP3222 / LP3232 / LP3288 / 软PLC模拟器 | 依赖模块:websocketserver | 难度:★☆☆
场景:设备在线调试时,print 的输出会重定向到已连接的 WebSocket;启动一个调试服务,浏览器就能实时看到脚本日志。
完整代码(可直接下载运行):
lua
-- 必须用一个变量接住返回值,否则对象被 GC 后服务器立即停止
wss = websocketserver.creat(8000)
print("WebSocket 调试已起,浏览器连 ws://设备IP:8000 看日志")要点:
creat即启动,没有start/send/reg之类的方法。- 返回对象必须用变量长期持有,被 GC 回收时服务器立即停。
验证方法:
- 浏览器打开
ws://设备IP:8000(或用上位机内置调试页),脚本里的print实时出现。 - 设备其它脚本的日志也能在这里看到。
注意事项:
- 默认端口
80与设备内置 HTTP 服务冲突,自建服务建议换端口(如 8000)。 - 没有认证机制,暴露公网前请用防火墙限制来源。
例程 2:给内置 Web 页面提供实时通道
适用:同上 | 依赖模块:websocketserver | 难度:★☆☆
场景:设备的云组态 / 在线调试页面需要实时数据通道,启动一个 WebSocket 服务即可,具体交互由页面侧完成。
完整代码(可直接下载运行):
lua
wss = websocketserver.creat(8000) -- 内置页面会复用这个通道要点:
- 脚本侧不能收发 WebSocket 消息,双向交互在页面里做。
- 仍要持有
wss,否则通道随 GC 消失。
验证方法:打开内置 Web 页面,数据能实时刷新即说明通道正常。
注意事项:想要"脚本可控的双向通道"请用 tcp_server,本模块做不到。
例程 3:注意事项——忘记持有导致服务器被 GC 停止
适用:同上 | 依赖模块:websocketserver | 难度:★☆☆
场景:最常见的错误写法:调用 creat 不接返回值,服务器运行片刻就停。
完整代码(可直接下载运行):
lua
-- ❌ 错误:返回值没接住,对象随时被回收,服务器莫名停止
websocketserver.creat(8000)
-- ✅ 正确:用全局变量持有
wss = websocketserver.creat(8000)要点:
- 本模块只有
creat,返回对象必须长期持有,GC 时机不可控。 - 表现为"连上一会儿就没了",排查时第一反应检查是不是没接住返回值。
验证方法:正确写法下浏览器能稳定持续连上;错误写法连上几秒后断。
注意事项:别写成 websocketserver.creat(8000) 不赋值;也别用局部变量(脚本跑完就出作用域被回收)。