一、使用背景
请看下图:
(1)服务端发布消息给物联网套件。设备从物联网套件订阅消息。
(2)设备发布消息到物联网套件,物联网转发消息到MNS消息服务,防止设备发布消息过多。服务端从MNS队列中获取设备所发送的消息。
二、阿里MNS概述
阿里云消息服务(Message Service)是一种高效、可靠、安全、便捷、可弹性扩展的分布式消息服务。MNS能够帮助应用开发者在他们应用的分布式组件上自由的传递数据、通知消息,构建松耦合系统。
消息服务同时支持各种类型消息推送,其中和短信前后端的无缝整合更高效的为用户提供了大批量短信发送能力。
消息服务提供了两种模型:
队列模型
主题模型
两种功能模型的区别:
队列模型支持一对一发送和接收消息;
主题模型支持一对多发布和订阅消息,并且支持多种消息推送方式。
祥见:
https://help.aliyun.com/document_detail/27414.html?spm=5176.product27412.6.539.V8xbIQ
三、laravel框架集成MNS服务
1、下载phpSDK
地址:
https://help.aliyun.com/document_detail/32381.html?spm=5176.doc27414.6.669.AbIcAg
2、楼主这边使用的laravel5.1框架,使用MNS的队列模型
(1)引入SDK
在app下新建Libs文件夹,用于存放第三方的组件。
(2)在项目中使用
// 获取 阿里云 MNS 对象
public function ali_mns_obj(){
// 先往队列里面发消息试试
$accessId = env('ali_iot_mns_id');
$accessKey = env('ali_iot_mns_key');
$endPoint = "在MNS控制台,点击获取endpoint";
//这里需要先在控制台新建队列
$queueName = '你的队列名称';
//实例化获取MNS对象
$client = new Client($endPoint, $accessId, $accessKey);
$queue = $client->getQueueRef($queueName);
return $queue;
}
这边的accessId和accessKey都需要在控制台获取。endpoint部分需要注意,最好你的项目所在服务器和MNS所在服务器一致,不然的话,拉取队列消息的速度会很慢。
(3)这边用的是批量拉取队列消息接口:BatchReceiveMessageRequest()
public function handle_msg_list(){
for ($i=0; $i < 10; $i++) { // 10 * 16 每次运行处理160条
//先调用上面的方法,获取MNS对象
$queue = $this->ali_mns_obj();
//用MNS对象调用MNS提供的接口。这边是批量拉取活跃数据
//16代表每次最多拉取16条数据
//30代表失效,30秒拉取不到则失败
$obj_receives = $queue->batchReceiveMessage(new BatchReceiveMessageRequest(16,30) );
//拉取到数据之后,循环,使用getMessages()方法获取到消息内容
foreach ($obj_receives->getMessages() as $k) {
// 示例数据
// {"payload":"c3RfZm8=","messagetype":"upload","messageid":307,"topic":"/q5dL8yereAg/ssc-cl-00002/update","timestamp":1510991583}
//使用getMessageBody()方法获取消息的主体部分,注意,需要解密
$msg = $k->getMessageBody(); // payload部分数据,需 base64解码
$obj = json_decode($msg);
$d['str'] = base64_decode($obj->payload);
$d['time'] = date('Y-m-d h:i:s', $obj->timestamp );
//这里是判断消息的类型。其实到这一步,已经成功获取到消息了
if( $obj->messagetype == 'upload' ){
$this->ali_mns_handle($obj); // 如果是机器上传的信息,则处理
}
$str = json_encode($d);
// 给硬件人员看
if( $str!=false ){
Redis::lPush('ali_iot_mns_list', $str);
}
// 删除
$obj_del = $queue->deleteMessage( $k->getReceiptHandle() );
}
}
return MyResponse::success();
}
具体的解释请看注释部分
MNS接口列表:
https://help.aliyun.com/document_detail/35134.html?spm=5176.doc27490.6.709.Q0LmiV
这里成功获取到消息之后,就算是走通了,接下来就可以根据自己的业务进行coding。
end