IOT 系统 MQTT 协议有必要将设备 id 放在 topic 里吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
unt
V2EX    程序员

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

  •  
  •   unt 2024-04-21 22:01:54 +08:00 3277 次点击
    这是一个创建于 627 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    别搞什么大聪明技巧,在协议框架下,支持海量 topic ,是很简单的事。MQTT 的 topic 其实就是一个 tcp 通道地址列表或者映射图,跟消息中间件的 topic 概念上相同但性能上完全是两码事。
    sztink
        12
    sztink  
       2024-04-22 10:16:21 +08:00
    有必要。每台设备只订阅带自己设备 ID 的 topic ,能够很方便做访问控制,保证安全。举个例子,如果你设备 ID 都泄露了,如果此时 hacker 只需拿到它当前设备里面的 mqtt 账号信息,就可以模拟给其他设备发生消息了。如果设备只订阅带自己设备 ID 的 topic ,服务器侧可以很容易设置 ACL 规则,只允许每台设备只能访问和发送消息到它自己的 topic ,hacker 就很难攻击了
    me1onsoda
        13
    me1onsoda  
       2024-04-22 11:27:25 +08:00
    。。。。
    ashuai
        14
    ashuai  
       2024-04-22 11:41:33 +08:00
    mqtt 本来就支持路径的泛订阅,像#8 那样用就好,机型/设备 id
    EasyProgramming
        15
    EasyProgramming  
       2024-04-22 13:58:59 +08:00
    如果你想做到点对点发消息,client 订阅的 topicFilter 路径带 id 也不是不行;但你即使不这样做,很多 mqtt broker 也都是支持点对点发消息的
    vfs
        16
    vfs  
       2024-04-22 14:27:46 +08:00
    为什么要将设备 id 放在 topic 里面? 特别好奇你这里的需求是什么样的。 放在消息载荷里面肯定是对的。
    muooOOO
        17
    muooOOO  
       2024-04-22 14:38:08 +08:00
    你服务器下发给 A 终端的操作,所有的终端也都会接收到。有些设备处于省电状态,不希望频繁的唤醒,
    cnhongwei
        18
    cnhongwei  
       2024-04-22 15:42:12 +08:00
    @unt 2W 个 topic 很轻松的。
    thinkwei2012
        19
    thinkwei2012  
       2024-04-22 17:19:57 +08:00
    看自己需求吧,都可。
    比如想方便以后一对一下发指令,那就要考虑加到 topic 里了。
    jimrok
        20
    jimrok  
       2024-04-22 17:46:56 +08:00
    可以不放,但是 mqtt 的服务你的做调整吧,如果 mqtt 是自己定制的,可以做。因为每个 client 有自己的 session ,如果你能用 payload 的 id 关联到 sessionid 上,那就可以让 mqtt 给特定 session 的设备推消息。
    xiyou007
        21
    xiyou007  
       2024-04-23 10:17:06 +08:00
    搜索一下,topic 怎么设计比较合理, 个人认为设备唯一标识( ID 等) 在 topic 层级中越靠前越好,这样方便订阅同一个设备所有消息,以及同一个 topic 的所有设备消息
    unt
        22
    unt  
    OP
       2024-04-23 16:43:10 +08:00 via iPhone
    @EasyProgramming 不放在 topic 里的话如何实现点对点发送
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3360 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 04:48 PVG 12:48 LAX 20:48 JFK 23:48
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86