php安装mqtt mosquitto及发送消费消息代码示例
一、什么是mqtt?
MQTT(message queuing telemetry transport)是IBM开发的即时通讯协议,是一种发布/订阅极其轻量级的消息传输协议,专门为网络受限设备、低宽带以及高延迟和不可靠的网络而设计的。由于以上轻量级的特点,是实现智能家居的首选传输协议,相比于XMPP,更加轻量级而且占用宽带低。
特点
a.由于采用发布/订阅的消息模式,可以提供一对多的消息发布
b.轻量级,网络开销小
c.对负载内容会有屏蔽的消息传输
d.有三种消息发布质量(Qos):
qos=0:“至多一次”,这一级别会发生消息丢失或重复,消息发布依赖于TCP/IP网络
qos=1:“至少一次”,确保消息到达,但消息重复可能会发生
qos=2:“只有一次”,确保消息到达一次
e.通知机制,异常中断时会通知双方
原理
MQTT协议有三种身份:发布者、代理、订阅者,发布者和订阅者都为客户端,代理为服务器,同时消息的发布者也可以是订阅者(为了节约内存和流量发布者和订阅者一般都会定义在一起)。
MQTT传输的消息分为主题(Topic,可理解为消息的类型,订阅者订阅后,就会收到该主题的消息内容(payload))和负载(payload,可以理解为消息的内容)两部分。
二、mqtt服务安装
mosquitto是一个开源broker,并且支持MQTTv3.1,支持客户端的验证。mosquitto包括服务端和客户端,官网:https://mosquitto.org/download/今天我们讲讲在centos中如何搭建mqtt服务,在centos中执行:
yum install mosquitto安装完后启动mqtt服务
mosquitto -c /etc/mosquitto/mosquitto.conf -d设置开机自启动
chkconfig mosquitto on可以通过service mosquitto start|restart|stop对mosquitto进行管理
三、php客户端
下载地址phpMQTT-master.zip1、发送消息
<?php require("/data/wwwroot/default/lib/php/phpMQTT/phpMQTT.php"); $server = '127.0.0.1'; // 服务器IP $port = 1883; // 服务器端口 $username = ''; // 用户名 $password = ''; // 密码 $client_id = 'pub_' . uniqid(); $mqtt = new Bluerhinos\phpMQTT($server, $port, $client_id); if ($mqtt->connect(true, NULL, $username, $password)) { for ($i = 0; $i < 100; $i++) { $topic = 'topic01'; $msg = 'Hello World! at (' . $i . ') ' . date('Y-m-d H:i:s'); echo date('Y-m-d H:i:s') . ' SEND [' . $topic . '] ' . $msg . PHP_EOL; // qos = 0:仅发一次,不管是否能收到 // qos = 1:没返回一直发,可能有重复接收 // qos = 2:保证必须收到,并且不重复 $mqtt->publish($topic, $msg, 0); usleep(100000); } $mqtt->close(); } else { echo "Time out!\n"; }订阅消费消息
<?php require("/data/wwwroot/default/lib/php/phpMQTT/phpMQTT.php"); $server = '127.0.0.1'; // 服务器IP $port = 1883; // 服务器端口 $username = ''; // 用户名 $password = ''; // 密码 $client_id = 'sub_' . uniqid(); $mqtt = new Bluerhinos\phpMQTT($server, $port, $client_id); $mqtt->debug = true; if(!$mqtt->connect(true, NULL, $username, $password)) { echo "连接失败!\n"; exit(1); } // 订阅列表 $topics = [ 'topic01' => ['qos' => 0, 'function' => 'procmsg'], ]; $mqtt->subscribe($topics, 0); while ($mqtt->proc()){} $mqtt->close(); // 消息处理函数 function procmsg($topic, $msg) { echo date('Y-m-d H:i:s') . ' [' . $topic . '] ' . $msg . PHP_EOL; }
网友评论0