V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
mkstring
V2EX  ›  问与答

手机(internet)-webserver-单片机的通信如何设计?

  •  
  •   mkstring · Mar 12, 2018 · 1655 views
    This topic created in 2977 days ago, the information mentioned may be changed or developed.

    现有一批单片机,带有网络模块,可通过 gprs/wifi 等网络模块以 tcp/ip 协议向 tcp server 发送数据,亦可接收 tcp server 的指令进而控制硬件。

    现在需要有一个页面向单片机发送指令,单片机执行指令后返回执行结果,页面需要即时显示,以便确认指令是否发送/执行成功。

    现有的做法是建立一个 webserver,这个 webserver 接收页面上对指定单片机的请求,将请求解析成指令,然后保存在 redis 队列中,tcp server 轮询这个 redis 队列,检测到队列有值时,将指令发送给对应的单片机。这样的流程可以给单片机发送指令,但是不能即时将单片机对指令的执行结果返回值反馈到页面上。

    主要是有多个单片机,单片机只能使用 tcp/ip 发送和接收数据,如果是一台单片机且有固定 ip,那可以在单片机上搭建 webserver 来接收请求并执行。

    请问没有比较好的方法实现这个流程?

    16 replies    2018-03-14 20:40:28 +08:00
    hcymk2
        1
    hcymk2  
       Mar 12, 2018
    pub/sub mqtt
    就不知道单片机那边实现 mqtt 协议 有没有难度。
    mkstring
        2
    mkstring  
    OP
       Mar 12, 2018
    @hcymk2 目前单片机只能简单的收发数据、执行指令。
    pelloz
        3
    pelloz  
       Mar 12, 2018
    你的 tcp server 将接受到返回值带上单片机的识别 ID 一起入到 redis 另外一条队列,然后页面展示这个数据不就好了吗
    BOYPT
        4
    BOYPT  
       Mar 12, 2018
    看你的芯片能烧进去 http 库不,能的话用野狗的库很方便(腾讯云也有物联网套件,不过野狗的成熟点应该)
    mkstring
        5
    mkstring  
    OP
       Mar 12, 2018
    @pelloz 多谢,确实是一种好办法,页面去轮询 webserver 的一个接口,这个接口又去轮询这个新的队列,这样就实现了。
    mkstring
        6
    mkstring  
    OP
       Mar 12, 2018
    @BOYPT 好的,不过下位机不是我开发,所以不太清楚能不能使用 http。我去看下他们的文档
    ycz0926
        7
    ycz0926  
       Mar 12, 2018
    手机 4G 的话,会涉及到外网穿透的问题,得注意下
    panpanpan
        8
    panpanpan  
       Mar 12, 2018 via iPhone
    想知道怎么推送给单片机,gprs 肯定没有公网 ip
    mkstring
        9
    mkstring  
    OP
       Mar 12, 2018
    @panpanpan gprs 用 tcp/ip 连接 tcp server 之后,就可以接收数据了
    yinseyingji
        10
    yinseyingji  
       Mar 13, 2018
    使用 MQTT 协议可能能实现,之前接触过的几个物联网云平台都是这样,可以实现控制反馈
    julyclyde
        11
    julyclyde  
       Mar 13, 2018
    redis list 不合适,因为是按顺序投递的
    你如果有多个单片机需要控制,就不方便了
    julyclyde
        12
    julyclyde  
       Mar 13, 2018
    lz 该不会是我同事吧?哈哈哈哈
    mkstring
        13
    mkstring  
    OP
       Mar 14, 2018
    @julyclyde 确实是有大量的单片机需要控制,redis list 轮询有延时,而且控制完一台才能控制下一台,不能并行控制,单片机返回数据的读取也有问题,页面的 js 调用接口用 pop 取出来,可能取出来的不是当前的单片机的数据,但是已经回不去了,被取出来的这台的数据就没了,前端会以为没有控制成功。
    肯定不是你的同事啦。
    julyclyde
        14
    julyclyde  
       Mar 14, 2018
    @mkstring redis list 不需要轮训啊,客户端就挂在那里 rpop 阻塞读就行了。关键还是顺序的问题
    除非每个客户端有各自的 list
    mkstring
        15
    mkstring  
    OP
       Mar 14, 2018
    @julyclyde 是的,我错了,就是阻塞读取。每个客户端一个 list 看起来也是不太合适。
    julyclyde
        16
    julyclyde  
       Mar 14, 2018
    @mkstring pubsub 模式在这里就不合适。你需要的是“根据收件人进行分发”的系统,而不是 pubsub 这种“根据发件人进行分发”。这是不同的 pattern

    我那个同事就是搞不清这个,居然选了 kafka
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   6316 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 107ms · UTC 02:39 · PVG 10:39 · LAX 19:39 · JFK 22:39
    ♥ Do have faith in what you're doing.