【物联网】阿里云iot物联网平台监控设备 在线离线状态 解决方案 - Go语言中文社区

【物联网】阿里云iot物联网平台监控设备 在线离线状态 解决方案


阿里云iot物联网平台监控设备在线离线状态解决方案

需求

目前使用阿里云的iot作为物联网平台应用,在整个系统内有很多设备,每天都会在固定的时间段内在线和离线。

我们需要监控这些设备的状态,如果设备在线或者离线,给管理员发送通知(短信),以便让相关人员及时处理。

在这里插入图片描述

具体实现

服务端订阅

在产品详情的服务端订阅中,可以通过服务端订阅来接受iot平台的消息。

在这里插入图片描述

其中:

  • 服务端订阅,通过HTTP2通道推送,目前只提供了Java和**.NET**语言的SDK。
  • 服务端订阅 (推送MNS)。将物联网平台的消息推送到队列中,然后服务端基于SDK从队列中获取消息实现通信。

由于语言限制,我们选择MNS的方式进行消息接受,需求是监控状态,所以只选择设备状态变化通知

在这里插入图片描述

同步监控消息

通过上一步之后,阿里云会在MNS上创建一个对应的消息队列,如果设备有在线离线状态的变更,对应的消息就会被推送到对应的队列中。

在这里插入图片描述
列表的操作部分可以直接接收消息,当然这样做消息会被消费,如果队列已经写入系统逻辑,就需要谨慎操作。

在这里插入图片描述

拉取MNS队列并处理消息

从控制台的拉取消息看,主要数据内容在payload中,通过文档可以查看,通过base64可以解析得到消息的详细内容。

{
    "status":"online|offline",
    "productKey":"12345565569",
    "deviceName":"deviceName1234",
    "time":"2018-08-31 15:32:28.205",
    "utcTime":"2018-08-31T07:32:28.205Z",
    "lastTime":"2018-08-31 15:32:28.195",
    "utcLastTime":"2018-08-31T07:32:28.195Z",
    "clientIp":"123.123.123.123"
}

在这里插入图片描述
下面列出PHP作为服务端处理的主要逻辑代码,作为参考。


    /**
     * 拉取状态队列消息
     */
    public function actionIotStatus(){
        $endPoint  = "https://************.mns.cn-shanghai.aliyuncs.com";
        $accessId = Yii::$app->params['aliyun']['accesskeyid'];
        $accessKey = Yii::$app->params['aliyun']['accesssecret'];

        $queueName = Yii::$app->params['iot']['mnskey'];
        $client = new Client($endPoint, $accessId, $accessKey);
        $queue = $client->getQueueRef($queueName);
        $receiptHandle = NULL;
        try
        {
            $res = $queue->receiveMessage(30);
            $receiptHandle = $res->getReceiptHandle();
            //得到消息句柄
           $body =   $res->getMessageBody();
           $bodyArr = json_decode($body,true);
            $payload = json_decode(base64_decode($bodyArr['payload']),true); //解析
            $deviceName = $payload['deviceName'];
            //todo 这里写的逻辑是给管理员发送短信和通知

			//删除消息,避免再次被接收到
            try
            {
                $res = $queue->deleteMessage($receiptHandle);
                echo "DeleteMessage Succeed! n";
            }
            catch (MnsException $e)
            {
                echo "DeleteMessage Failed: " . $e;
                return;
            }

        }
        catch (MnsException $e)
        {
            echo "ReceiveMessage Failed: " . $e;
            return;
        }
    }

总结

  • 详细看文档的好处在于一旦有需求就能找到最合适的实现方式。

参考资料

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/diandianxiyu/article/details/92799426
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-07 15:02:18
  • 阅读 ( 2225 )
  • 分类:职场

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢