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

PHP 服务端如何接受阿里云物联网平台的事件?

  •  
  •   lvjiefly · 2020-06-29 14:18:17 +08:00 · 3024 次点击
    这是一个创建于 1389 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家好,最近做 php 对接阿里云物联网平台,需要接收设备发送的事件,不知道从哪入手,有没有人做过类似的需求? 需求是这样的,设备获取芯片号码后发送一个事件,这个是硬件工程师来做的,我这边需在再服务器上接受这个事件,然后判断,返回给设备一个结果。 项目是 TP5 搭建的,SDK 装好了,API 都可以访问到,但是不知道怎么做一个服务来处理事件

    23 条回复    2020-07-10 16:04:40 +08:00
    Reflection
        1
    Reflection  
       2020-06-29 14:26:13 +08:00   ❤️ 1
    看你是否需要维持链接,我这边因为涉及到摄像头,数据用的 ws 传,然后如果是定时或者时效性不高的数据,做了一个独立的设备服务,专门用于接受事件处理数据然后入库,设备服务和项目本身只使用同一组数据,我不知道你问的是不是这个意思
    lvjiefly
        2
    lvjiefly  
    OP
       2020-06-29 14:34:40 +08:00
    @Reflection 你好,感谢你的回复
    我这边需求对时效性要求比较高,要求在事件触发后,我这边就要及时处理并返回处理结果,硬件等待结果决定是否进行下一步操作,连续性比较强。
    在看官方文档,但还不是很明白。
    没做过类似的,什么建议都可以,请多指教
    chinvo
        3
    chinvo  
       2020-06-29 14:41:37 +08:00
    一般思路是写个 cli command, 里面死循环, 然后 php cli 去跑
    batyu
        4
    batyu  
       2020-06-29 14:43:01 +08:00
    此时不上 swoole 更待何时
    AngryPanda
        5
    AngryPanda  
       2020-06-29 14:43:57 +08:00
    没搞过,看一下这种发布订阅模式可以吗?

    https://help.aliyun.com/document_detail/120986.html
    qiayue
        6
    qiayue  
       2020-06-29 14:47:30 +08:00
    楼主你用了阿里云的物联网平台,说明设备是连接到阿里云的,所以楼上几位说的自建 socket 服务应该是不符合你的使用场景的。

    那么你只需要去搞懂,阿里云接收到设备的消息后,怎么转发到你的服务,是 socket 请求,还是 http 请求?
    lvjiefly
        7
    lvjiefly  
    OP
       2020-06-29 14:58:55 +08:00
    @AngryPanda 订阅以后接受消息(或者是队列)根据设备 ID 和传给我的值进行处理,处理完了以服务的方式发给设备(根据设备 ID 找到这个设备),现在大概是这样想的
    lvjiefly
        8
    lvjiefly  
    OP
       2020-06-29 15:01:05 +08:00
    @qiayue 目前看是需要订阅的,官方文档这样描述 [服务器通过 AMQP 客户端接收消息,需配置 AMQP 客户端接入物联网平台,监听设备消息] ,但是没有 PHP 的接入示例,查了下可能需要"rabbit mq"
    xnode
        9
    xnode  
       2020-06-29 15:01:23 +08:00
    cli command 启动一个长进程 拉取队列消息
    AngryPanda
        10
    AngryPanda  
       2020-06-29 15:10:35 +08:00   ❤️ 1
    @lvjiefly #7 我看了文档介绍,也就是如此啊。所以没啥问题啊。由于不能直接和设备通信,所以你只用管如何跟 IoT 平台通信即可。

    把问题拆解一下:

    1. 接收设备消息。推荐使用 swoole / workerman 之类的扩展,写一个常驻进程应用,订阅 IoT 消息。收到设备消息后,将需要返回给设备的消息写入本地消息队列 Q,供步骤 2 消费(如果量不大也可以同步调用 API 返回,这样就无需步骤 2 )。

    2. 发送消息给设备。推荐使用 swoole / workerman 之类的扩展,写一个常驻进程应用,消费 Q 队列中的消息,调用 IoT API 发送消息。
    davidyanxw
        11
    davidyanxw  
       2020-06-29 15:12:17 +08:00
    @lvjiefly 那就是 php 作为消费者,去消费 rabbitmq 数据就行。
    php 主要处理和 rabbitmq 的关系就行
    Oktfolio
        12
    Oktfolio  
       2020-06-29 15:21:06 +08:00
    @lvjiefly php-amqplib
    Reflection
        13
    Reflection  
       2020-06-29 15:59:44 +08:00
    @lvjiefly 如同楼上 davidyanxw 所说的方式,我目前所单独建立的设备服务就是消费 rabbitmq 内的数据
    caola
        14
    caola  
       2020-06-29 16:00:45 +08:00
    此时不上 swoole 更待何时 +1
    l0wkey
        15
    l0wkey  
       2020-06-29 16:05:35 +08:00
    yc8332
        16
    yc8332  
       2020-06-29 16:19:27 +08:00
    要看是什么交互方式。。如果请求接口的那就按接口写就行了。如果长连接的那就自己写个 socket 或者用 workerman,swoole 框架。
    gabezhao
        17
    gabezhao  
       2020-06-29 17:06:46 +08:00
    此时不上 swoole 更待何时 +2
    xingjue
        18
    xingjue  
       2020-06-29 18:02:41 +08:00
    php 就 swoole 或者 workerman
    nocrush
        19
    nocrush  
       2020-06-29 19:29:13 +08:00
    阿里云 物联网平台需要写一个 php 服务循环拉去里面的消息
    shellic
        20
    shellic  
       2020-06-30 07:45:01 +08:00 via Android
    赞同 10 楼讲的
    dyyhobby
        21
    dyyhobby  
       2020-06-30 09:01:08 +08:00
    阿里有个 MQTT 让设备连接 MQTT 数据通过 MQTT 协议传输 PHP 可以开几个进程消费 RocketMQ 的数据就行。
    to2false
        22
    to2false  
       2020-06-30 13:04:16 +08:00
    此时不上 swoole 更待何时 +3
    lvjiefly
        23
    lvjiefly  
    OP
       2020-07-10 16:04:40 +08:00
    @AngryPanda
    问题解决了,感谢大家的思路
    最后是这样做的:
    因为阿里云文档关于订阅消息的通信没有 php 的示例,但是有 nodejs 的示例
    就使用了 nodejs 来消费消息,同时做一个请求到 TP5 的控制器来处理业务
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3514 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 10:50 · PVG 18:50 · LAX 03:50 · JFK 06:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.