【懒人精灵】使用golang实现websocket和mqtt连接(4)websocket客户端最佳实践

为了方便调用和维护,将lua中的websocket调用,封装成“Mqtt.lua”类模块。

Mqtt.lua模块实现了以下功能:

1、面向对象的封装方式,使用metatable实现类
2、支持MQTT连接、断开、订阅、取消订阅、发布等基本操作
3、自动管理连接状态和订阅主题
4、提供资源清理功能
5、支持自定义配置参数(可灵活配置端口号、服务器地址、客户端标识等)

实际应用

在懒人精灵里异步连接websocket,可以在EMQX的管理后台看到有多少设备实时在线。

file

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类库

使用golang实现websocket和mqtt连接(3)在lua中调用golang的websocket客户端

使用golang实现websocket和mqtt连接(4)websocket客户端最佳实践

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

企业级大数据智能营销管理系统

源码转让