首先简单的介绍一下mqtt协议,MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。
MQTT协议运行在TCP/IP或其他网络协议,提供有序、无损、双向连接。其特点包括:
1.使用的发布/订阅消息模式,它提供了一对多消息分发,以实现与应用程序的解耦.
2.对负载内容屏蔽的消息传输机制。
3.对传输消息有三种服务质量(QoS):
最多一次
,这一级别会发生消息丢失或重复,消息发布依赖于底层TCP/IP网络。即:<=1
至多一次
,这一级别会确保消息到达,但消息可能会重复。即:>=1
只有一次
,确保消息只有一次到达。即:=1。在一些要求比较严格的计费系统中,可以使用此级别
4.数据传输和协议交换的最小化(协议头部只有2字节),以减少网络流量通知机制,异常中断时通知传输双方
MQTT
协议中有三种身份:发布者(Publish)
、代理(Broker)
(服务器)、订阅者(Subscribe)
。其中,消息的发布者
和订阅者
都是客户端,消息代理
是服务器,消息发布者
可以同时是订阅者
。
onMessage('message'); //回调函数 $client->connect(IP, 1883, 5); $client->subscribe('订阅主题', 1); $payload=''; $client->loop(); $client->publish('发布主题', "发布信息", 1, 0); $nowtime=time(); while(true){ $client->loop(); global $payload; if(!empty($payload)){ echo $payload; //订阅到的消息 break; } if($nowtime==(time()-2)){ break; } } $client->unsubscribe('订阅主题');//取消订阅 $client->disconnect();//断开链接 unset($client); function message($message) { //printf("Got a message ID %d on topic %s with payload:\n%s\n\n", $message->mid, $message->topic, $message->payload); global $payload; $payload=$message->payload; } 二、Thinkphp3.2 的Demo Home/Common/function.php mid, $message->topic, $message->payload); session("payload",$message->payload); } function mqtt_mosquitto($phy_addr_gid,$msg,$timeout=2){ $client = new \Mosquitto\Client(); $client->onMessage('mqtt_message'); $client->connect(MQTT_IP, MQTT_PORT, 5); $client->subscribe(MQTT_SUB, 1); $client->loop(); $client->publish($phy_addr_gid, $msg, 1, 0); $nowtime=time(); while(true){ $client->loop(); if(session("payload")){ $payload=session("payload"); session("payload",null); return $payload; break; } if ($nowtime==(time()-$timeout)) { return "timeout"; break; } } $client->unsubscribe(MQTT_SUB); $client->disconnect(); unset($client); } 三、PhalApi框架的订阅demo 对这个框架不太熟,订阅里的回调函数不能直接套用本小白真的很头疼,开发文档里只提了一句需要将自定义的回调函数名加入白名单,看了半天还是不会,有人懂的话希望评论里能指点一二,谢谢 mqtt.php class Api_mqtt extends PhalApi_Api { public function getRules() { return array( ); } function mqtt_sub(){ $client = new \Mosquitto\Client(); $client->onMessage(function($m){ $_SESSION['test']=$m->payload; }); $client->connect('服务器IP', 1883, 5); $client->subscribe('123', 1);//123 订阅主题 $client->loop(); $client->publish('123', '456', 1, 0);//123 发布主题 456发布的消息 订阅自己发布的消息没毛病2333 $nowtime=time(); while(true){ $client->loop(); if ($_SESSION['test']!==null){ $b=$_SESSION['test']; $_SESSION['test']=null; return $b; break; } if ($nowtime==(time()-2)) { return "timeout"; break; } } $client->unsubscribe('123'); //取消订阅 $client->disconnect(); unset($client); } }