• 请不要在回答技术问题时复制粘贴 AI 生成的内容
majianglin
V2EX  ›  程序员

关于 MQTT 协议有几个问题想请教

  •  1
     
  •   majianglin · Sep 14, 2024 · 7931 views
    This topic created in 782 days ago, the information mentioned may be changed or developed.
    问题 1:
    我们物联网项目想使用 MQTT 作为通讯协议
    方案 1: 使用阿里云 云消息队列 MQTT 版,Java 服务器接入消息队列
    方案 2:Java 服务器自己实现 MQTT 协议
    这两个方案你们怎么选择的?有哪些优劣? 有更好的方案吗?

    问题 2:
    目前市区内的 4G 物联网网络是否稳定?是否需要加上短信通知?

    问题 3:
    Java 有哪些好用的 MQTT 开源框架做应用开发,最好是开箱即用,和业务解耦,业务程序员最好不关心协议实现
    53 replies  •  2024-09-18 17:27:41 +08:00
    me1onsoda
    me1onsoda
    Sep 14, 2024
    1
    Java 自研的话 vertx 挺方便的。如果没有研发能力最好还是买个云服务 emqx 之类的,拿别人开源的不好填坑
    majianglin
    majianglin
    OP
    Sep 14, 2024
    2
    @me1onsoda 多谢了

    vertx 有点小众,还是想用 spring 全家桶。云服务这块我再研究下
    typ1805
    typ1805
    Sep 14, 2024
    3
    我们物联网项目用的是 ActiveMQ 的 MQTT 传输数据,springboot 从 MQ 订阅数据做处理的
    tool2dx
    tool2dx
    Sep 14, 2024
    4
    MQTT 算是相对简单的 TCP 协议了,可以考虑自己写一下,代码量并不多。
    LLaMA2
    LLaMA2
    Sep 14, 2024
    5
    server https://github.com/eclipse/mosquitto

    java client https://github.com/eclipse/paho.mqtt.java

    注意协议的各版本之间的差异.cs 各版本是否匹配.各类服务端实现对 qos 的支持情况

    综合而言,看项目,项目重要那就买买买,不要试图自研,自己玩或者项目甲方对 mqtt 部分功能有一定的容忍度,那就开源跑起来.


    例如一些项目中做某个报表定时推送,使用 mqtt 推送,同时也有主动 http 请求,甲方不是强烈要求送达率的话,仿真各也有 http 兜底,那就开源搞起来

    如果是某些物联网设备使用 mqtt 交互上报关键数据,那还是买买买,出了情况方便把锅顺利的抡起来
    lancelock
    lancelock
    Sep 14, 2024
    6
    为什么除了买就是自己实现,搭个开源的 broker 不行吗
    zzjcool
    zzjcool
    Sep 14, 2024
    7
    你们团队有专人维护,并且技术上有信心解决就自建,不然还是上云

    客户端的话看看 emq 的文档,我感觉 emq 在 mqtt 领域还是领先的
    cJ8SxGOWRH0LSelC
    cJ8SxGOWRH0LSelC
    Sep 14, 2024
    8
    买一台云服务器自己搭建 EMQX , 特别简单好用, 我觉得比阿里云的后台配置 MQTT 好用多了, 而且阿里云的 MQTT 经常出问题。
    zouri
    zouri
    Sep 14, 2024
    9
    问题一:mqtt broker 服务器可以使用开源搭建,目前这两个用户较多 emqx mosquitto
    问题二:我个人经验目前 4G 物联网足够稳定
    问题三:EclipsePaho 是一个开源项目为多种语言实现了 MQTT 客户端库,可以参考使用 https://eclipse.dev/paho/index.php?page=downloads.php
    byteX
    byteX
    Sep 14, 2024
    10
    你的需求和我最近带的项目一样。(我们有大批量的设备走 485 接口,然后通过轮询采集后通过物联网走 mqtt 上报)
    问题一:我们没有考虑自建,因为感觉后期维护成本有点高。在对比下选择了腾讯云的物联网平台原因:比阿里成本低,实现就是设备推送到腾讯云物联网平台,平台在接收消息后通过数据流传到服务器。
    问题二:网络稳定这个问题只要你信号覆盖情况下都没有问题,应该考虑的数据端的数据采集稳定,例如多设备轮询,在遇到报错的时候,是否重新查询。
    问题三:开源平台当时也试过几个还是出现了问题一的情况就是维护成本高。
    flmn
    flmn
    Sep 14, 2024
    11
    有开源的 emqx
    glitter1105
    glitter1105
    Sep 14, 2024
    12
    docker 直接搭建 emqx 就行
    majianglin
    majianglin
    OP
    Sep 14, 2024
    13
    多谢楼上各位的答疑解惑,学到了很多
    3IOhG7M0knRu5UlC
    3IOhG7M0knRu5UlC
    Sep 14, 2024 via Android
    14
    搭起来还是不麻烦的,主要看预算
    halov
    halov
    Sep 14, 2024
    15
    MQTT 还是建议使用 EMQX 搭建 , 我们公司 使用消息中间件 同时 充当 MQTT 服务器 坑挺多的
    fffq
    fffq
    Sep 14, 2024
    16
    直接使用 emqx 吧,
    mosfet
    mosfet
    Sep 14, 2024
    17
    thingsboard+emqx
    开发都省了
    vfs
    vfs
    Sep 14, 2024
    18
    除非你的时间预算很充分, 不然不要自己写 MQTT 服务器端。 我正在实现一个 MQTT Broker (公司项目), 这个协议 RFC 很简单, 真正做起来, 细节很多。
    DonaldY
    DonaldY
    Sep 14, 2024
    19
    netty 里就有,直接使用。
    andyxq
    andyxq
    Sep 14, 2024
    20
    作为从业者,我觉得 MQTT Broker 实现起来难度不算太大,但是做到较好的性能需要投入很多的精力。我测试过一些开源的或商业的 Broker, EMQX 是算是性能比较好的,开放的插件也比较多,如果没有足够的研发能力建议直接用 EMQX.
    市区用 4G 基本没问题,但是远离市区信号不好的地方可能会有频繁上下线的问题。
    gesse
    gesse
    Sep 14, 2024
    21
    问题二:
    MQTT 协议就是为这种情况开发的。
    gesse
    gesse
    Sep 14, 2024
    22
    推荐个 MQTT 本地测试、开发工具
    https://www.redisant.cn/mqtt
    yinft
    yinft
    Sep 14, 2024
    23
    一个有着从 0 到 1 自建 mqtt 服务的过来人来看,emqx 完全没问题,关键的问题是特么多这 4g 模块,我们的机器人经常就因为 4g 物联网卡的网络,跟云端丢失通讯
    yinft
    yinft
    Sep 14, 2024
    24
    @andyxq 频繁上下线真相了
    DreamLu
    DreamLu
    Sep 14, 2024
    25
    java 的话试试 mica-mqtt ,我自己开发的,现在也有很多朋友在用,集成到服务中也非常方便。几小时就能精通。
    ikas
    ikas
    Sep 14, 2024
    26
    不差钱 ->阿里云等云提供的 mqtt server
    有特殊需求->嵌入 netty mqtt
    其它->自己部署 mqtt server
    spartacussoft
    spartacussoft
    Sep 14, 2024
    27
    用 exmqx ,再结合 grpc 来与你的服务进行连接验证、订阅发布验证等交互。
    ZiLong
    ZiLong
    Sep 14, 2024
    28
    emqx 挺强大的,也非常成熟,唯一的问题时 erlang 开发的,不过一般出问题也不会排查到源码层。mqtt 确实在信号不好的地方会有断连,频繁上下线,一是在本地缓存发送失败的数据,二是通过 http 协议补偿
    xsen
    xsen
    Sep 14, 2024
    29
    动不动就说什么实现 mqtt broker 的不知道脑子怎么想的,非要挖个坑跳进去,然后慢慢填坑
    不管是基于开源的、还是商业化的,支持 mqtt broker 的方案都那么多、那么成熟

    对于楼主这样的,找个成熟、稳定的 mqtt client jar 包接入不就可以了
    tubinorg
    tubinorg
    Sep 14, 2024
    30
    emqx
    Greendays
    Greendays
    Sep 14, 2024
    32
    我的项目是用 Springboot3 配合 EMQX 做的,不过目前没上线。测试阶段用着没啥毛病。
    sskycn
    sskycn
    Sep 14, 2024
    34
    不要假定用云服务商的 mqtt 就稳定,基本的维护力量还是需要有的。#5 楼推荐的 mosquitto 还是不错的。
    dbpe
    dbpe
    Sep 14, 2024
    35
    @majianglin 不小众了..而且 2 个又不冲突....
    yazinnnn0
    yazinnnn0
    Sep 14, 2024
    36
    我用 vertx+quarkus 写过 mqtt 协议的 server(不是 broker), 挺好实现的
    不去实现 mqtt broker 的各种 qos 能力的话, 几行代码就可以跑起来
    zhufpy
    zhufpy
    Sep 14, 2024
    37
    直接跟你们的硬件开发用 socket 通信,搞啥协议,哈哈哈,我就这么干的[doge]
    iamtuzi3333
    iamtuzi3333
    Sep 14, 2024
    38
    @zhufpy socket 设备数量多了 就很烦,如果要数据要存文件的情况下,会一直占内存,
    ZZ74
    ZZ74
    Sep 14, 2024
    39
    emqx 或者 netty (已经带了 MQTT 的) 开箱即用
    zhufpy
    zhufpy
    Sep 14, 2024
    40
    @iamtuzi3333 我们上传的数据量不是很大,我都是塞队列,然后存库了,等设备多了,再换别的解决方案,哈哈哈
    sagaxu
    sagaxu
    Sep 14, 2024
    41
    @zhufpy 好多 RTU 都这么干,上报的都是 TLV 报文(tag-length-value),协议简单好实现。

    @iamtuzi3333 现在都是 NIO ,几万个设备小意思,接收性能肯定不是瓶颈,丢队列批量入库。
    nomytwins
    nomytwins
    Sep 14, 2024
    42
    我们用的 emqx docker 就行了
    Eds1995
    Eds1995
    Sep 15, 2024 via iPhone
    43
    当然 EMQX 了,干嘛要自己开发,或者 EMQX Cloud serverless 有超高的免费额度。
    Hyvi
    Hyvi
    Sep 16, 2024
    44
    问题 1:
    我们物联网项目想使用 MQTT 作为通讯协议
    方案 1: 使用阿里云 云消息队列 MQTT 版,Java 服务器接入消息队列
    方案 2:Java 服务器自己实现 MQTT 协议
    这两个方案你们怎么选择的?有哪些优劣? 有更好的方案吗?

    ------- 有人就选择方案 2 ,等其他自建或者用开源的方案。 有钱就选择方案 1 。把它理解为普通的网关一样的对待。现在还有哪个公司自建负载均衡、API-gateway 呢。

    问题 2:
    目前市区内的 4G 物联网网络是否稳定?是否需要加上短信通知?
    ------------重连肯定是要的
    问题 3:
    Java 有哪些好用的 MQTT 开源框架做应用开发,最好是开箱即用,和业务解耦,业务程序员最好不关心协议实现

    -------EclipsePaho 。
    chuunshii
    chuunshii
    Sep 16, 2024
    45
    EMQX ,搭建非常容易
    iamtuzi3333
    iamtuzi3333
    Sep 18, 2024
    46
    @zhufpy 唉,我们数据量很多,我现在是塞到队列,然后存库,写文件,设备也多,但是占用内存巨多,这个问题还得排查。
    iamtuzi3333
    iamtuzi3333
    Sep 18, 2024
    47
    @sagaxu nio 我不是很清楚这个,但是看了上个项目,用 nodejs 写的,然后有 600 个传感器,然后传感器都是主动连接服务器的 socket 丢数据上来,每次一启动就迅速把可用内存占满了,100 多 G ,现在丢给我排查,我也不懂 nodejs ,服务器只负责监听,现在搞的很烦,项目不敢起,起了就把其他项目干了,大佬,你懂这个方面的内容吗,能不能指教一下。
    iamtuzi3333
    iamtuzi3333
    Sep 18, 2024
    49
    @sagaxu 这个 debug 我试过了,nodejs 写的 koa 框架,接口层面是没有问题,就是接收数据这个模块有问题,他原本写的是开了一个端口,然后就是监听设备连接,连接了之后就接收数据,数据入库 and 写文件;问题就是它是把物理内存中的备用内存持续占满,导致可用内存持续下降,用的是 Window Server 服务器,我初步怀疑是因为连接了众多传感器,开启了非常多的异步事件连接,同时又要入库写文件,写文件数据全部积累在内存中,持续增长,它是一天凌晨时候才开启第二天的数据写入到新文件中,数据量高频且多,这个问题好难排查,之前想过用单个设备连接接收数据来测试性能,但是现在没有办法改,因为项目一启动,600 多个传感器就自动连上来发数据了;搞的我头大了,之前写这个代码的人也早就离职跑路了,留下烂摊子让我接。。。
    sagaxu
    sagaxu
    Sep 18, 2024
    50
    @iamtuzi3333 600 个 websocket 不会超过 1G 内存,你得先找出是什么数据占用了内存。

    比较有可能的情况,
    1. 接收太快来不及写入,挤压造成高内存占用,那就要提升入库性能,比如批量写。
    2. 接收到的数据入库之后,没有释放内存,这是内存泄露。
    3. 数据缓存在队列中,定期才写入(文件/DB),这种要缩短写入间隔时间。

    这种马上占满内存的,反而是最好排查的,长期慢慢爬升的比较麻烦,重现一次都要好久。
    iamtuzi3333
    iamtuzi3333
    Sep 18, 2024
    51
    @sagaxu 不是 websocket ,就是普通的 socket 通信; 1 有可能,因为数据是每秒发送一条过来,600 多个可能就有 600 多条同一时间发送过来; 2 的话内存泄漏应该不会,除了入库,它还会一直写入到文件中,此时文件应该一直持续在内存中,很大概率是这个问题; 3 这个项目写的人完全没考虑用缓存去处理数据,来一条数据就入库并且写入文件,这个问题似乎也不存在;现在不是马上占满,就是慢慢爬上,一直让可用内存变少,备用内存持续上涨,最后只剩下十几 M ,服务器运行内存是有 192GB 的,复现就只能 run 项目慢慢等,其中也不会有什么报错消息出来,这个很头疼,谢谢大佬的解答。
    coderxy
    coderxy
    Sep 18, 2024
    52
    @iamtuzi3333 大概率内存泄漏。 对服务做一下内存分析即可
    huifer
    huifer
    Sep 18, 2024
    53
    借楼发个基于 Go 语言开发的物联网开发平台。

    Go IoT 开发平台 是一个使用 Go 语言开发的免费、高效、可扩展的物联网解决方案。 该平台支持 MQTT 、HTTP 、WebSocket 、COAP 、TCP/IP 协议传输,提供轻量化的配置工具完成数据的报警功能,提供基于 JavaScript 的数据统计服务。

    Git 仓库地址: https://gitee.com/pychfarm_admin/go-iot-platform
    官网首页: http://iot-dev-egi.pages.dev/
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2721 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 98ms · UTC 14:02 · PVG 22:02 · LAX 06:02 · JFK 09:02
    ♥ Do have faith in what you're doing.