为了方便调用和维护,将lua中的websocket调用,封装成“Mqtt.lua”类模块。
Mqtt.lua模块实现了以下功能:
1、面向对象的封装方式,使用metatable实现类
2、支持MQTT连接、断开、订阅、取消订阅、发布等基本操作
3、自动管理连接状态和订阅主题
4、提供资源清理功能
5、支持自定义配置参数(可灵活配置端口号、服务器地址、客户端标识等)
实际应用
在懒人精灵里异步连接websocket,可以在EMQX的管理后台看到有多少设备实时在线。
MQTT模块使用
1. 模块概述
MQTT模块提供了完整的MQTT客户端功能,支持连接管理、消息发布订阅、自动重连等特性。
该模块基于golang实现,支持WebSocket和TCP协议。
2. 核心功能
2.1 连接管理
初始化连接:
local MQTT = require("lib/Mqtt")
local mqttClient = MQTT:new()
-- 配置连接参数
local config = {
protocol = "ws://",
broker = "服务器IP地址",
port = 8083,
wsPath = "/mqtt",
clientID = getDeviceId(),
maxReconnectAttempts = 5,
baseReconnectDelay = 1, -- 秒
maxReconnectDelay = 30 -- 秒
}
-- 连接到MQTT服务器
local success = mqttClient:connect(config)
if success then
print("MQTT连接成功")
else
print("MQTT连接失败")
end
2.2 消息发布
-- 发布消息
local topic = "device/data"
local payload = {
timestamp = os.time(),
deviceId = getDeviceId(),
data = "Hello MQTT"
}
local success = mqttClient:publish(topic, payload, "sensor_data")
2.3 消息订阅
-- 订阅主题
local topic = "device/command"
local qos = 1
local success = mqttClient:subscribe(topic, qos)
if success then
print("成功订阅主题: " .. topic)
end
2.4 消息处理
-- 注册MQTT消息处理函数
gobridge.register("onMQTTMessage", function(jsonData)
local data = jsonLib.decode(jsonData)
print("收到MQTT消息,主题:", data.topic, "内容:", data.payload)
-- 根据消息类型处理不同业务逻辑
if data.msgType == "command" then
handleCommand(data.payload)
elseif data.msgType == "data" then
handleData(data.payload)
end
end)
3. 高级特性
3.1 自动重连机制
MQTT客户端内置自动重连功能:
- 连接断开时自动尝试重连
- 支持指数退避算法(从1秒开始,逐渐增加到30秒)
- 可配置最大重连次数
- 重连过程有详细日志输出
3.2 连接状态管理
-- 检查连接状态
local isConnected = mqttClient:isConnection()
if isConnected then
print("MQTT连接正常")
else
print("MQTT连接已断开")
end
3.3 资源清理
-- 断开连接并清理资源
mqttClient:disconnect()
-- 或者使用clear方法完整清理
mqttClient:clear()
4. 使用示例
4.1 基础使用示例
-- 1. 创建MQTT客户端
local MQTT = require("lib/Mqtt")
local mqttClient = MQTT:new()
-- 2. 配置连接参数
local config = {
broker = "IP地址",
port = 8083,
clientID = getDeviceId()
}
-- 3. 建立连接
if mqttClient:connect(config) then
-- 4. 订阅主题
mqttClient:subscribe("device/receive", 1)
-- 5. 发布消息
local message = {
type = "status",
data = "设备在线",
timestamp = os.time()
}
mqttClient:publish("device/status", message)
-- 6. 等待一段时间接收消息
sleep(5000)
-- 7. 断开连接
mqttClient:disconnect()
end
4.2 完整业务场景示例
-- 设备信息上报示例
local function reportDeviceInfo()
local deviceInfo = {
device_id = getDeviceId(),
battery = getBatteryLevel(),
timestamp = os.time()
}
mqttClient:publish("device/info", deviceInfo, "device_info")
end
-- 命令处理示例
local function handleCommand(command)
if command.action == "restart" then
print("收到重启命令")
-- 执行重启逻辑
elseif command.action == "update" then
print("收到更新命令")
-- 执行更新逻辑
end
end
附件
文章的附件,提供了核心的“\libgo\web\emqx.go”文件,类模块“\lib\Mqtt.lua”和lua示例文件。
相关内容
使用golang实现websocket和mqtt连接(1)安装EMQX服务端
使用golang实现websocket和mqtt连接(2)如何安装任意golang类库
1. 官方交流QQ群,添加多个不批。建议使用安卓手机或电脑申请。
飞云脚本圈: 586333520
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » 【懒人精灵】使用golang实现websocket和mqtt连接(4)websocket客户端最佳实践
飞云脚本圈: 586333520

Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » 【懒人精灵】使用golang实现websocket和mqtt连接(4)websocket客户端最佳实践