社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
目前使用阿里云的iot作为物联网平台应用,在整个系统内有很多设备,每天都会在固定的时间段内在线和离线。
我们需要监控这些设备的状态,如果设备在线或者离线,给管理员发送通知(短信),以便让相关人员及时处理。
在产品详情的服务端订阅中,可以通过服务端订阅来接受iot平台的消息。
其中:
由于语言限制,我们选择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;
}
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!