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

请问保存 MQTT 的数据应该如何设计数据库结构

  •  
  •   Lexgni · 12 天前 · 1506 次点击

    第一次使用这个协议,服务器使用的 emqx ,具体流程是 [多个传感器->网关->emqx ] ,问题主要是出在了数据是网关把所有传感器数据一起发布,但是这个网关下又不能保证每个项目的传感器数量是一致的

    目前的消息结构大概是这样:

    {
        "data": [
            -0.06106870248913765,
            5.2061066627502441
        ],
        "time": "2024-05-22T06:47:24.391927"
    }
    
    

    只发送了传感器的数据,具体是哪个设备根据 0,1,2 去对应,但是可以预见的问题是这个数据设备端全靠手写配置去对应,万一手抖就对应不上了,也考虑过给每个传感器一个唯一的编号,但是问了硬件的小伙伴说拿不到一个唯一的值,如果要靠手动分发可能会有些复杂

    绕了一圈后还是想着回到上面的消息结构,毕竟出厂后增减传感器的几率不大,但是现在出现了一个问题就是这个数据不好存,因为每个项目的传感器数量不一致,如果不分配一个传感器的唯一值,就不好把传感器的值单独放在一个表,如果放在一条里有没法确定要加几个传感器的键,如果把数据放在一起,又怕影响查询效率

    希望有大佬可以指点一二,谢谢

    24 条回复    2024-05-23 09:55:05 +08:00
    ipoh
        1
    ipoh  
       12 天前   ❤️ 1
    | 网关 ID | 设备索引(0,1,2...) | Data |
    如果是我会这样设计
    IvanLi127
        2
    IvanLi127  
       12 天前   ❤️ 1
    看起来这情况只能把网关 id 加传感器索引作为传感器的 id 了,问题就变成网关去转还是 mqtt 之后的程序去转了。
    Lexgni
        3
    Lexgni  
    OP
       12 天前
    @ipoh 这样就怕索引有变动
    Lexgni
        4
    Lexgni  
    OP
       12 天前
    @IvanLi127 感觉比较好的方式是这样,但是一个个去对应这些设备可能会比较麻烦
    wssy001
        5
    wssy001  
       12 天前   ❤️ 1
    时序数据库了解一下
    Eiden
        6
    Eiden  
       12 天前   ❤️ 3
    硬件的偷懒吧, 传感器里有单片机吧, 有单片机就有唯一编号, 这种场景肯定传感器要编号的
    KongLiu
        7
    KongLiu  
       12 天前   ❤️ 1
    硬件怎么可能拿不到,最起码的 MAC 地址有吧,不过我们的做法是硬件第一次上传数据都是 000000 ,然后服务器这边看到是 000000 ,就会给他下发一个唯一编码
    Lexgni
        8
    Lexgni  
    OP
       12 天前
    @Eiden 这个还得再去问问,我感觉也不太可能拿不到
    @KongLiu 这个不太适用于下发,主要是没法知道那个是什么传感器
    Lexgni
        9
    Lexgni  
    OP
       12 天前
    @wssy001 还在设计数据库的阶段
    cnuser002
        10
    cnuser002  
       12 天前   ❤️ 1
    传感器脱钩的话,那你就只能以网关+索引去关联了吧,你看配置文件在哪写吧。
    至于数据库,时序数据没有特别要设计的吧, 时间戳 ,数字,然后就是索引啦。
    Lexgni
        11
    Lexgni  
    OP
       12 天前
    @cnuser002 看样子需要分发一个唯一 id ,数据库里靠 0,1,2 索引感觉会出问题
    opengps
        12
    opengps  
       12 天前   ❤️ 1
    最好的存储结构是跟你数据使用方式有直接关系。
    你这只列出了数据结构,目前最多可以知道怎么设计可以保证写入快。还没有读取场景来决策怎么兼顾读取快
    sunjiayao
        13
    sunjiayao  
       12 天前   ❤️ 1
    硬件忽悠你,问下他环境。肯定能获取到 uid
    cxsz
        14
    cxsz  
       12 天前   ❤️ 1
    我司也是类似的,有一个终端来收集各个传感器信息,统一 mqtt 发送到服务端

    传感器大部分都是串口协议给终端的,解决方案是,把串口接入的线序,按顺序编号编好,然后硬件终端要维护个点表,按顺序获取数据,就能对应到具体的传感器了,给服务端的时候,不光要上送数据,点表也要同步上送
    Lexgni
        15
    Lexgni  
    OP
       12 天前
    @cxsz 也是个好办法
    Lexgni
        16
    Lexgni  
    OP
       12 天前
    @opengps 没有更好办法就设备参数里加 uuid ,直接保存
    Curtion
        17
    Curtion  
       12 天前   ❤️ 1
    硬件设备一定有唯一值, 你问问传感器和网关是什么协议通信, 就算传感器没有上报自身唯一信息, 也可以从通信协议中找一个唯一值.
    xylophone21
        18
    xylophone21  
       12 天前   ❤️ 1
    > 毕竟出厂后增减传感器的几率不大
    看起来像深坑
    opengps
        19
    opengps  
       11 天前
    @Lexgni uuid 不合适,你这种叫做 iot,最好的办法是类似于时序数据库的方式来存储,最佳的类主键设计应当是 time
    0xsui
        20
    0xsui  
       11 天前   ❤️ 1
    有这么一个国家标准《水文监测数据通信规约》,可以参考。
    Lexgni
        21
    Lexgni  
    OP
       11 天前
    @opengps #19 不加的话也可以区分是哪个传感器产生的数据吗
    Lexgni
        22
    Lexgni  
    OP
       11 天前
    @0xsui 看了下有很多格式,确实有比较适合的格式
    opengps
        23
    opengps  
       11 天前
    @Lexgni 区分来自哪个设备:如果原始数据包不带,那就需要你自己增加识别,要么改造消息队列加入传感器自身 id (首推),要么根据实际配置能通过客户端来源 IP 识别(适用场景较少,不推荐这种)
    jimrok
        24
    jimrok  
       11 天前
    不需要考虑这么紧凑的数据格式吧,数据错了造成的损失比网络开销要大很多。如果网关丢掉了设备的信息,还是让网关把格式改一下,增加传感器的 id 数据到后端。一般都是设备直接对接 mqtt 的 server ,mqtt 的协议里面应该有设备的 session 数据结构,应该是能将数据合并在一起的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1779 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:34 · PVG 00:34 · LAX 09:34 · JFK 12:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.