一、GMQT物联网MQTT插件|GoFlyGen框架原生商用级IoT能力

GMQT是GoFlyGen官方原生适配的高性能MQTT物联网消息服务插件,源自落地商用3年、历经海量真实项目打磨的独立GMQT物联网消息平台,性能稳定、实战性极强。插件深度适配GoFlyGen框架生态,完成数据存储、权限体系、运维体系的无缝打通,摒弃传统第三方MQTT服务的适配繁琐、兼容性差、运维割裂等痛点,是框架专属的一体化物联网消息解决方案。

插件全面兼容MQTT 3.0.0、3.1.1、5.0全协议规范,一站式搭载企业级全套IoT核心能力,涵盖设备上下线智能管理、主题精准订阅发布、保留消息、遗嘱消息、QOS0/1/2分级消息传输、设备权限隔离、消息持久化存储等核心功能,完美适配智能家居、工业设备传感采集、IoT网关通信、设备远程管控、实时数据推送、政企内网物联网等全场景业务需求。

二、核心核心优势|重新定义轻量化高性能IoT服务

1. 纯Go高并发内核,超低资源超高承载

依托Go语言原生协程调度优势,GMQT插件具备低内存占用、高吞吐、毫秒级消息转发的硬核性能,远超传统脚本式、代理式MQTT服务。无需高配服务器,可在低配云主机、虚拟主机、内网离线环境、ARM信创设备上稳定运行,单机支持海量物联网设备长连接并发接入,最大化提升服务器资源利用率,大幅降低企业部署运维成本。

2. 全平台极简部署,私有化离线无忧

拥有极致跨平台适配能力,全面兼容Windows、Mac、Linux、ARM全架构系统。跟随GoFlyGen框架实现单二进制一体打包,零复杂环境依赖、零第三方数据库依赖,支持一键安装、快速升级,完美适配政企私有化部署、内网离线项目、工控封闭场景,彻底解决传统IoT服务部署繁琐、外网依赖强的难题。

3. 深度融合框架生态,一体化商用运维

作为GoFlyGen原生插件,GMQT与框架权限管理、日志审计、菜单体系、插件生态、集群能力深度打通,实现统一后台管理、统一权限管控、统一运维监控,告别多系统割裂运维的繁琐,适配企业级标准化运维流程,可直接商用落地。

4. 灵活二次开发,拓展无限业务场景

内置完整开放API接口与WebHook回调体系,开发者可快速实现设备状态监听、自定义消息转发、设备数据对接、第三方系统联动等个性化开发,灵活拓展物联网业务形态,适配各类定制化IoT项目需求。

三、插件核心亮点汇总

  • 原生高性能:纯Go内核、协程模型驱动,低功耗、高并发、高吞吐,海量设备稳定在线

  • 全协议兼容:完整适配MQTT v3、v3.1.1、v5.0全版本协议,覆盖行业全部标准能力

  • 全场景适配:支持公网在线、内网离线、信创ARM、私有化部署等各类环境

  • 完善消息机制:全覆盖QOS分级传输、遗嘱/保留消息、消息持久化、主题ACL权限控制

  • 极简运维体系:框架一体化管控,安装、启动、关闭、卸载全流程标准化,上手零门槛

  • 高可拓展性:开放全量API与WebHook,轻松对接各类业务系统,支持个性化二次开发

四、精准适用场景

广泛适配工业物联网设备管控、智能硬件消息推送、传感器实时数据采集、设备远程通信、IoT数据大屏、政企私有化IoT系统、内网离线设备运维、小程序/APP实时消息交互等各类物联网业务场景,兼顾民用轻量化项目与工业级严苛项目。

五、极速安装部署|开箱即用,一键落地

GMQT插件功能完整、无需二次开发,安装后即可直接投入使用,搭配GoFlyGen框架标准化部署流程,快速搭建商用级MQTT Broker物联网服务器。

1. 插件安装

登录GoFlyGen框架后台,进入「开发者工具-代码仓库」,找到「MQTT Broker 物联网服务器」插件,点击一键安装即可完成插件部署。

2.启动MQTT服务

由于Gin 和 MQTT 两套独立信号,无法联动优雅关闭,所以我们需要再框架统一处理初始化和关闭操作,所以在安装好GMQTT代码后需要手动添加GMQTT启动和关闭底代码,添加操作如下:

2.1 找到代码位置

代码在:utils\router\router.go中,修改RunServer()// 优雅重启/停止服务器函数。

启动代码为:

    // =============== 异步启动MQTT服务 =====================
    go func() {
        if err := mqservice.StartMqtt(); err != nil {
            glogger.Error(fmt.Sprintf("MQTT服务启动失败:%v", err))
        }
    }()
    // =========================

关闭服务代码:

// ===广播全局关闭信号,通知MQTT服务优雅退出=====
    close(mqglobal.ShutdownChan)
    mqglobal.BadgerHook.DB().Close()
    // 短暂等待MQTT执行关闭逻辑
    time.Sleep(1 * time.Second)
    // =========================

下面是往哪走RunServer()完整代码,可以看到添加启动和关闭代码位置,在你添加时参考。

引入的package:

    "gofly/utils/extend/gmqtt/mqglobal"
    "gofly/utils/extend/gmqtt/mqservice"

调用代码:

// 优雅重启/停止服务器
func RunServer() {
    //启动定时清除日志文件功能
    if appcfg.OpenLogger.Bool() {
        glogger.StartCleanCron()
    }

    //设置cpu个数
    cpu_num := gconv.Int(appcfg.AppConf_arr["cpunum"])
    if cpu_num > 0 {
        mycpu := runtime.NumCPU()
        if cpu_num > mycpu { //如果配置cpu核数大于当前计算机核数,则等当前计算机核数
            cpu_num = mycpu
        }
        runtime.GOMAXPROCS(cpu_num)
    }
    //加载gin路由
    path, _ := os.Getwd()
    R := InitRouter(path)
    //把路由推保存文件中
    routerfilePath := "runtime/app/routers.txt"
    routerfileFullPath := filepath.Join(path, routerfilePath)
    routes := ""
    for _, route := range R.Routes() {
        if !strings.Contains(route.Path, "filename") && route.Path != "/" && !strings.Contains(route.Path, "/*filepath") {
            routes = routes + fmt.Sprintf("%v:%v\n", route.Method, route.Path)
        }
    }
    gfile.PutBytes(routerfileFullPath, []byte(routes))
    //默认禁止ip直接访问
    addrStr := "127.0.0.1:" + gconv.String(appcfg.AppConf_arr["port"])
    if gconv.Bool(appcfg.AppConf_arr["ipAccess"]) {
        addrStr = ":" + gconv.String(appcfg.AppConf_arr["port"])
    }
    srv := &http.Server{
        Addr:           addrStr,
        Handler:        R,
        MaxHeaderBytes: 1024 * 20,        // 最大请求头20KB
        ReadTimeout:    10 * time.Second, // 读超时,防慢速攻击
    }
    //启动服务
    go func() {
        if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
            log.Fatalf("listen serve err: %s\n", err)
        }
    }()

    // =============== 异步启动MQTT服务 =====================
    go func() {
        if err := mqservice.StartMqtt(); err != nil {
            glogger.Error(fmt.Sprintf("MQTT服务启动失败:%v", err))
        }
    }()
    // =========================

    // 启动pprof服务
    if gf.Bool(appcfg.AppConf_arr["runpprof"]) {
        R.GET("/debug/pprof/*any", gin.WrapH(http.DefaultServeMux))
        go func() {
            if err := http.ListenAndServe("127.0.0.1:8081", nil); err != nil {
                log.Fatalf("pprof server failed: %s\n", err)
            }
        }()
        fmt.Printf("%c[1;40;33m%s%c[0m\n", 0x1B, "已开启pprof性能分析工具-浏览器访问:​​http://127.0.0.1:8081/debug/pprof/ ​进行查看​", 0x1B)
    }
    //开发环境
    if gconv.String(appcfg.AppConf_arr["runEnv"]) == "debug" {
        fmt.Printf("%c[1;40;32m%s%c[0m\n", 0x1B, "如果还没有安装-请在浏览器访问​进行​安装​:​​http://127.0.0.1:"+gconv.String(appcfg.AppConf_arr["port"])+"/install", 0x1B)
        fmt.Println("Listening and serving HTTP on :" + gconv.String(appcfg.AppConf_arr["port"]))
    }

    // 等待中断信号以优雅地关闭服务器(设置 5 秒的超时时间)
    // Wait for interrupt signal to gracefully shutdown the server with a timeout of 5 seconds.
    quit := make(chan os.Signal, 1)
    signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
    <-quit
    glogger.Error("Shutdown Server ...")

    // ===广播全局关闭信号,通知MQTT服务优雅退出=====
    close(mqglobal.ShutdownChan)
    mqglobal.BadgerHook.DB().Close()
    // 短暂等待MQTT执行关闭逻辑
    time.Sleep(1 * time.Second)
    // =========================

    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()
    if err := srv.Shutdown(ctx); err != nil {
        glogger.Error(fmt.Sprintf("Server Shutdown err:%v", err))
    }
    // catching ctx.Done(). timeout of 5 seconds.
    select {
    case <-ctx.Done():
        glogger.Error("timeout of 5 seconds.")
    }
    glogger.Error("Server exiting/服务已经优雅退出")
}

3.卸载GMQTT插件

如果需要卸载安装的GMQTT插件,需要删除手动添加到utils\router\router.go下面RunServer()中代码。

删除启动代码为:

// =============== 异步启动MQTT服务 =====================
    go func() {
        if err := mqservice.StartMqtt(); err != nil {
            glogger.Error(fmt.Sprintf("MQTT服务启动失败:%v", err))
        }
    }()
    // =========================

删除关闭服务代码:

// ===广播全局关闭信号,通知MQTT服务优雅退出=====
    close(mqglobal.ShutdownChan)
    mqglobal.BadgerHook.DB().Close()
    // 短暂等待MQTT执行关闭逻辑
    time.Sleep(1 * time.Second)
    // =========================

最后再到“开发者工具-代码仓库”点击“卸载”即可完成卸载全部代码。

4. 端口部署说明

服务部署后,按需开放1883、8083、8084等对应端口,即可实现外部设备正常连接与数据传输。

六、官方体验与技术支持

GMQT插件功能、使用规范、开发文档与官方《GMQT物联网MQTT消息平台》完全同步,开发者可免费体验、快速上手:

  • 在线体验地址:https://gmqt.goflys.cn/ (账号:admin,密码:admin)

  • 官方开发&使用文档:https://doc.goflys.cn/docview?id=50

结语

GoFlyGen框架依托AI驱动全栈开发能力、轻量化部署、高可用、强拓展的核心优势,搭配原生GMQT物联网MQTT插件,为开发者与企业提供零门槛、高性能、可商用、可私有化的一站式物联网服务器搭建方案。无需复杂开发、无需冗余运维,快速落地各类IoT业务,大幅缩短项目周期、降低研发运维成本,是物联网项目开发部署的优选框架!

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐