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

物联网设备与 Web 应用服务器通信,用什么通信协议比较合适?

  •  
  •   tctc4869 · 2020-09-30 15:37:43 +08:00 · 5581 次点击
    这是一个创建于 1275 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想让物联网设备与 Web 服务器的应用端进行通信,常用的通信协议,除了 mqtt,http 还有哪些比较合适的?

    应用层协议有一个 WebSocket,WebSocket 协议用在物联网设备与 Web 服务器之间的实现通信合适么?

    61 条回复    2020-11-23 16:12:18 +08:00
    Unmurphy
        1
    Unmurphy  
       2020-09-30 15:40:35 +08:00
    xmpp
    wysnylc
        2
    wysnylc  
       2020-09-30 15:42:16 +08:00
    mqtt http2/http3 websocket
    qiayue
        3
    qiayue  
       2020-09-30 15:43:30 +08:00
    查查资料,看看摩拜单车用啥协议,我不觉得你的设备会比摩拜单车多
    tctc4869
        4
    tctc4869  
    OP
       2020-09-30 15:43:54 +08:00
    @wysnylc http3 ?
    tctc4869
        5
    tctc4869  
    OP
       2020-09-30 15:44:46 +08:00
    @Unmurphy 这个 xmpp 协议,一般不都是用在 Im 聊天应用中么,消耗挺大的把?
    lewis89
        6
    lewis89  
       2020-09-30 15:45:33 +08:00
    websocket 你确定要在物联网这种低功耗的玩意上 保持长连接?
    tctc4869
        7
    tctc4869  
    OP
       2020-09-30 15:50:17 +08:00
    @lewis89 这样啊
    12101111
        8
    12101111  
       2020-09-30 15:50:38 +08:00
    mqtt over Websocket
    tctc4869
        9
    tctc4869  
    OP
       2020-09-30 15:50:52 +08:00
    @qiayue 谢谢,我去看看
    tctc4869
        10
    tctc4869  
    OP
       2020-09-30 15:51:41 +08:00
    mqtt over Websocket ? mqtt 与 WebSocket 的融合?
    crasa
        11
    crasa  
       2020-09-30 15:56:41 +08:00
    mqtt +1
    server
        12
    server  
       2020-09-30 16:01:27 +08:00
    看 lz 描述, 还是直接上方案 自建基于 emqx 吧 ,走平台阿里 腾讯 都行. lorawan nb-iot 看钱下单
    Bijiabo
        13
    Bijiabo  
       2020-09-30 16:01:51 +08:00   ❤️ 1
    看设备量,我认为原则上不应该让设备和 Web 应用服务器直接通讯。

    设备 MQTT 协议到 IoT Hub,分发数据或者做处理。然后 Web 服务器再从处理好的数据中拿结果,或者通过 IoT Hub 提供的能力与设备通讯。

    不是直接通讯不行,要考虑安全、量产一系列问题。
    Gitizen
        14
    Gitizen  
       2020-09-30 16:01:54 +08:00
    感觉 Mqtt over Websocket 可以吧,我最近也是想这样整,参考 Adafruit IO 的 Web 端,就是一个 JavaScript mqtt 客户端,就是 Mqtt over Websocket 。
    tctc4869
        15
    tctc4869  
    OP
       2020-09-30 16:04:00 +08:00
    @crasa 问一下,如果两个设备要通过服务器进行一对一中转数据话,排除 WebSocket,什么协议是比较适合?
    tctc4869
        16
    tctc4869  
    OP
       2020-09-30 16:05:32 +08:00
    @Bijiabo

    如果两个物联网设备要通过服务器进行一对一中转数据通信的话,排除 WebSocket 与 MQtt ?,还有什么协议是比较适合?
    kra
        17
    kra  
       2020-09-30 16:05:54 +08:00
    mqtt
    tctc4869
        18
    tctc4869  
    OP
       2020-09-30 16:11:11 +08:00
    @Bijiabo 安全?别人 tcp 接口进行黑客入侵么?
    lzyliangzheyu
        19
    lzyliangzheyu  
       2020-09-30 16:13:33 +08:00
    MQTT 算是用的比较多的吧,基于 TOPIC 的消息订阅机制,控制好 KEEPLIVE,性能开销也不大
    crasa
        20
    crasa  
       2020-09-30 16:23:54 +08:00
    @tctc4869 两个设备相互订阅。数据量小的话,可以直接传输数据;数据量大的话可以只传输消息 key,设备拿到 key 之后用你所说的 web 应用服务器对消息的 key 进行数据处理,返回到指定设备。

    鄙人拙见而已,可以再参考下面大佬的回复
    tctc4869
        21
    tctc4869  
    OP
       2020-09-30 16:26:46 +08:00
    @crasa 按你这样说的话,为了使在 mqtt 中两个设备之间能相互一对一通信,就得自己定义一下 mqtt 服务端中中某些 TOPIC 的消息处理流程
    soulzz
        22
    soulzz  
       2020-09-30 16:49:33 +08:00
    自定义协议完全可以
    设备直接发送字节流
    后端 netty 解完全可以
    dndx
        23
    dndx  
       2020-09-30 16:50:34 +08:00
    MQTT 非常方便,还可以用阿里云的 MQTT 服务,量小的话免费额度就够了,非常稳定。
    clf
        24
    clf  
       2020-09-30 16:51:20 +08:00
    MQTT 比较方便,现成的平台:EMQ
    stranger75
        25
    stranger75  
       2020-09-30 17:03:59 +08:00
    物联网内系统交互的话无脑推荐阿里云的 MQTT -doge
    manhere
        26
    manhere  
       2020-09-30 17:08:25 +08:00
    coap
    ihidchaos
        27
    ihidchaos  
       2020-09-30 17:16:37 +08:00 via Android
    mqtt-sn,coap,lwm2m
    opengps
        28
    opengps  
       2020-09-30 17:24:03 +08:00 via Android
    实际上物联网并非直接跟 web 通信,而是跟 socket 服务端通信,转发一层消息实现的物联网设备跟 web 通信
    youla
        29
    youla  
       2020-09-30 17:26:35 +08:00
    我正在做一个这样一个项目,用的是 websocket 。
    janxin
        30
    janxin  
       2020-09-30 17:28:40 +08:00
    可以
    LLaMA2
        31
    LLaMA2  
       2020-09-30 17:46:45 +08:00
    如果设备不用在意功耗问题,直接 socket 就好,不过建议你吧 socket server 剥离出来,设备和 web 服务都作为 client 端连接到 server 。这样是为了以后拓展 socket server,例如更换实现,集群,HA 能特性,而不用更改已有的 web 服务

    如果设备在意功耗,MQTT 就好,套路和上面一样。设备和 web 都作为 mqtt client,中间架 mqtt broker
    kerro1990
        32
    kerro1990  
       2020-09-30 18:19:16 +08:00
    摩拜用的微软 azure 的 IOT 服务
    ungrown
        33
    ungrown  
       2020-09-30 19:22:17 +08:00
    @Gitizen 不理解,mqtt 再套一层 ws 是图个啥
    Bijiabo
        34
    Bijiabo  
       2020-09-30 19:49:53 +08:00
    @tctc4869 这种场景,使用 MQTT,配合云平台的规则引擎,直接把一个设备的数据转到另一个设备的 topic 中,我看一些业务场景的实现是这样做的。

    这些能力,云平台普遍会提供。

    置于安全,主要是设备 MQTT 链接时候的鉴权,认证 key 怎么来的,是需要注意的
    geekvcn
        35
    geekvcn  
       2020-09-30 19:55:03 +08:00
    我觉得 QUIC 挺适合,因为物联网设备流量很小,也不怕运营商的 UDP Qos
    chihiro2014
        36
    chihiro2014  
       2020-09-30 20:09:24 +08:00
    RSocket
    a22271001
        37
    a22271001  
       2020-09-30 20:15:59 +08:00 via Android
    @geekvcn quic 不是 over udp 的吗
    geekvcn
        38
    geekvcn  
       2020-09-30 20:27:56 +08:00
    @a22271001 就是 udp 才有优势啊
    rbe
        39
    rbe  
       2020-09-30 20:46:35 +08:00
    mqtt 足够轻量,且能发又能收,基本能近似达到长连接的效果了。用阿里云的 mqtt 服务或者自建 emqx broker,qos 1 就能保证不丢消息。lz 应该说明一下为啥不愿意用 mqtt 啊?
    rockyou12
        40
    rockyou12  
       2020-09-30 20:49:17 +08:00
    mqtt 功能强又够轻量,生态还非常成熟,不是很特别的业务想不到不用的理由
    maitiantuzi
        41
    maitiantuzi  
       2020-09-30 22:08:24 +08:00
    可以开发个自己的网关,采集到设备数据后做持久化或者分发出去,比如通过 Kafka
    hotsymbol
        42
    hotsymbol  
       2020-10-01 00:06:48 +08:00
    kafka, socket, mqtt, grpc over http
    tctc4869
        43
    tctc4869  
    OP
       2020-10-01 00:32:07 +08:00
    @Bijiabo 那有 N 对设备要通过 mqtt 服务端进行一对一通信怎么办,在同一个 Topi 内 c 的发布消息话,一个设备发布消息不就成了广播了,本来就是要一对一通信的
    adek06
        44
    adek06  
       2020-10-01 00:50:49 +08:00
    MQTT +1

    用 EMQX 自建
    des
        45
    des  
       2020-10-01 01:22:28 +08:00
    mqtt 、nats 、sqs 、nsq
    另外你是觉得 mqtt 不合适吗?
    Bijiabo
        46
    Bijiabo  
       2020-10-01 01:26:47 +08:00 via iPhone
    @tctc4869 每个设备都有自己的 N 个 topic,每个 topic 对应不同用途。云端规则引擎根据消息内容标识,以及业务逻辑指定的规则,进行消息的转发,可能是 A 设备的消息转到 B 设备的特定 topic,也可能是直接转到队列进行消息处理,也可能直接存储到数据库。
    Gitizen
        47
    Gitizen  
       2020-10-01 03:01:03 +08:00
    @ungrown 这样可以方便通过防火墙,一般在网页用比较多。
    物联网硬件用原生 MQTT 连接服务器 MQTT Broker,Web 应用的前端用 Websocket MQTT 连接 Broker
    TCP MQTT Client <----> MQTT Broker <----> Websocket MQTT Client
    设备通过 MQTT 传来的数据实时在 Web 页面更新。
    aguesuka
        48
    aguesuka  
       2020-10-01 09:53:54 +08:00 via Android
    我司是国内最大的电表厂。用的是 socket 透传=> 采集器 => 主站。 没有做过的人最好不要对不熟悉的领域发表意见。
    tctc4869
        49
    tctc4869  
    OP
       2020-10-01 10:26:33 +08:00
    @des 没有这种想法
    tctc4869
        50
    tctc4869  
    OP
       2020-10-01 10:29:32 +08:00
    @Bijiabo 这样的话,就得定制一下 mqtt 服务端的某些特定 topic 下的通信处理规则,似乎这是要写代码进行配置处理的情况啊,不知道有没有无编程代码的配置方式、
    interim
        51
    interim  
       2020-10-01 10:36:31 +08:00
    @tctc4869 EMQ X 的功能足够多,ACL 配置规则很容易的...
    Bijiabo
        52
    Bijiabo  
       2020-10-01 10:46:57 +08:00
    @tctc4869 平台会有操作界面,我记得看同事处理过。
    tctc4869
        53
    tctc4869  
    OP
       2020-10-01 12:47:16 +08:00
    @Bijiabo
    @chnyuwen

    问一下,用 mqtt 做通信协议的话,为客户端进行消息推送,以及负责客户端 IM 聊天消息中转方面,能代替 WebSocket 么?
    way2explore2
        54
    way2explore2  
       2020-10-01 12:50:17 +08:00
    相信我。用最成熟的协议 mqtt




    mqtt 完全可以做轻量 im,
    Bijiabo
        55
    Bijiabo  
       2020-10-01 13:23:58 +08:00 via iPhone
    @tctc4869 如果是基于 Websocket 实现的 MQTT,是可以的。
    wudaye
        56
    wudaye  
       2020-10-02 02:04:12 +08:00 via Android
    我们当时毫无经验,用的最简单粗暴可能也是最蠢的方式,直接 netty 和设备互相编解码 tcp 上的字节流,二进制协议用的交通部的一套部标协议
    ungrown
        57
    ungrown  
       2020-10-02 10:28:34 +08:00
    @Gitizen #47 啊这样,我还以为你说 iot 设备也套 ws 呢
    interim
        58
    interim  
       2020-10-07 10:39:25 +08:00
    @tctc4869 直接去看 EMQ X 的文档就好了,查下 消息订阅模型。
    tctc4869
        59
    tctc4869  
    OP
       2020-11-23 16:00:04 +08:00
    @crasa
    @12101111
    @kra
    @dndx
    @lychs1998
    @adek06
    @des

    用 mqtt 的话,不知这样一个场景合适不?有 n 个物联网设备与服务端建立 mqtt 的长连接,物联网设备不断向 mqtt 服务端发送数据,服务端频繁地不断接收数据。这个场景用 mqtt 合适吗
    clf
        60
    clf  
       2020-11-23 16:11:52 +08:00
    @tctc4869 #59 EMQ(一个 mqtt service)就是处理这个场景的。其实就是一个消息队列的模式。
    dndx
        61
    dndx  
       2020-11-23 16:12:18 +08:00
    @tctc4869 合适,MQTT 本身就是可以双向通信的,而且还帮你处理了分包,消息分类,加密等等功能。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1462 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 17:24 · PVG 01:24 · LAX 10:24 · JFK 13:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.