V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
unt
V2EX  ›  程序员

IOT 系统 MQTT 协议有必要将设备 id 放在 topic 里吗

  •  
  •   unt · 223 天前 · 2324 次点击
    这是一个创建于 223 天前的主题,其中的信息可能已经有所发展或是发生改变。

    放:1W 台设备的话可能就有 1~3 万个 topic 在 broker 运行,一般 4H16G 的 linux 服务器撑不撑得住?

    不放:只设两个 topic ,down 和 up, 设备 id 放在载荷里,但是每次单点发布时,其实会给所有设备都发送一遍,pps 撑不撑得住,通讯模块是否会接受到很多无用信息,影响处理性能?

    还有一个群发的应用场景,请问如何实现最好。(无网关,目前采用的是遍历发送)

    22 条回复    2024-04-23 16:43:10 +08:00
    pigspy
        1
    pigspy  
       223 天前
    有必要,设备上行的消息可以发给同一个或多个 topic ,但是设备最好自己订阅自己特有的 topic
    cnhongwei
        2
    cnhongwei  
       223 天前
    没有设备 ID 在 topic 中,server 可能会保存 topic 数据,严重影响性能。所以使用设备 ID 做为 topic 好。群发的话,看 QOS 和 cleanSession 如何设置的,和前面的问题一样,导致 server 要保存 topic 的数据的话,最好使用设备相差的 topic ,程序遍历发送,如果不用 server 保存 topic 数据的话,可以使用设备无关的同一 topic 。
    darkengine
        3
    darkengine  
       223 天前
    "每次单点发布时,其实会给所有设备都发送一遍"
    ----

    设备的网络流量抗得住吗?
    unt
        4
    unt  
    OP
       223 天前 via iPhone
    @darkengine 撑得住,现在流量费很便宜
    unt
        5
    unt  
    OP
       223 天前 via iPhone
    @cnhongwei broker 运行 2W 个 topic 会有性能问题吗
    ma836323493
        6
    ma836323493  
       223 天前
    mqtt 在线和离线,不是统一监听系统级别 Topic ,message 里面有设备 id 吗, 另外我们开锁, 也是根据设备 id 建 topic
    unt
        7
    unt  
    OP
       223 天前 via iPhone
    @ma836323493 啥意思,为什么既说 message 里设备 is ,又说根据 id 建 topic
    slowhand
        8
    slowhand  
       223 天前
    小项目,只有几百个设备。
    设备上传主题,包含分组和设备 id 。
    主要是测试时方便,可以只订阅一类(/指定)的设备,以便分析数据。
    如:{前缀}/{车间}/{机型}/#
    消息都是非驻留的,服务只能通过超时未收到消息,来判断设备离线。
    下发给设备的主题,都是统一的,最多包含分类,因为用到的频次低。
    如校时和计数清零,设备 id 只在消息里面。
    反正也不用测试,只要后续的数据变化了,就表示命令生效了。
    cat1879
        9
    cat1879  
       223 天前
    个人觉得是有必要的,另外顺便问一下楼主 MQTT 服务器是用什么搭建的。持久化这块处理吗?
    superychen
        10
    superychen  
       223 天前
    你用的是哪个 mqtt ,我们之前用的 emqx ,topic 的数量多少只是内存占用多少的问题,并且一个 topic 内存占用很少,反而 topic 的层级对性能影响较大
    nothingistrue
        11
    nothingistrue  
       223 天前
    MQTT 协议是发布订阅模式,你要向指定设备发送下行消息,那就只能让每个设备都订阅各自的主题。群发压根没啥特殊的,让一个群下的设备,订阅一个主题即可。

    别搞什么大聪明技巧,在协议框架下,支持海量 topic ,是很简单的事。MQTT 的 topic 其实就是一个 tcp 通道地址列表或者映射图,跟消息中间件的 topic 概念上相同但性能上完全是两码事。
    sztink
        12
    sztink  
       223 天前
    有必要。每台设备只订阅带自己设备 ID 的 topic ,能够很方便做访问控制,保证安全。举个例子,如果你设备 ID 都泄露了,如果此时 hacker 只需拿到它当前设备里面的 mqtt 账号信息,就可以模拟给其他设备发生消息了。如果设备只订阅带自己设备 ID 的 topic ,服务器侧可以很容易设置 ACL 规则,只允许每台设备只能访问和发送消息到它自己的 topic ,hacker 就很难攻击了
    me1onsoda
        13
    me1onsoda  
       223 天前
    。。。。
    ashuai
        14
    ashuai  
       223 天前
    mqtt 本来就支持路径的泛订阅,像#8 那样用就好,机型/设备 id
    EasyProgramming
        15
    EasyProgramming  
       223 天前
    如果你想做到点对点发消息,client 订阅的 topicFilter 路径带 id 也不是不行;但你即使不这样做,很多 mqtt broker 也都是支持点对点发消息的
    vfs
        16
    vfs  
       223 天前
    为什么要将设备 id 放在 topic 里面? 特别好奇你这里的需求是什么样的。 放在消息载荷里面肯定是对的。
    muooOOO
        17
    muooOOO  
       223 天前
    你服务器下发给 A 终端的操作,所有的终端也都会接收到。有些设备处于省电状态,不希望频繁的唤醒,
    cnhongwei
        18
    cnhongwei  
       223 天前
    @unt 2W 个 topic 很轻松的。
    thinkwei2012
        19
    thinkwei2012  
       223 天前
    看自己需求吧,都可。
    比如想方便以后一对一下发指令,那就要考虑加到 topic 里了。
    jimrok
        20
    jimrok  
       223 天前
    可以不放,但是 mqtt 的服务你的做调整吧,如果 mqtt 是自己定制的,可以做。因为每个 client 有自己的 session ,如果你能用 payload 的 id 关联到 sessionid 上,那就可以让 mqtt 给特定 session 的设备推消息。
    xiyou007
        21
    xiyou007  
       222 天前
    搜索一下,topic 怎么设计比较合理, 个人认为设备唯一标识( ID 等) 在 topic 层级中越靠前越好,这样方便订阅同一个设备所有消息,以及同一个 topic 的所有设备消息
    unt
        22
    unt  
    OP
       222 天前 via iPhone
    @EasyProgramming 不放在 topic 里的话如何实现点对点发送
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2835 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 12:26 · PVG 20:26 · LAX 04:26 · JFK 07:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.