MQTT协议简介
MQTT(Message Queuing Telemetry Transport)是一种轻量级、开放的通信协议,专门设计用于物联网设备之间的通信。它最初由IBM开发,并于1999年发布。MQTT协议具有简单、轻量级、低功耗和高效的特点,适用于各种网络环境和设备。
以下是MQTT协议的一些关键特点:
- 发布/订阅模型:MQTT采用发布/订阅模型,其中设备可以发布(发送)消息到特定的主题(Topic),并且其他设备可以订阅(接收)这些主题上的消息。这种模型使得设备之间可以实现异步通信,不需要直接建立点对点的连接。
- 轻量级:MQTT协议非常轻量级,协议头部开销小,传输数据量少,适合在带宽有限或网络连接较弱的环境中使用。它可以在嵌入式设备、传感器和其他资源受限的设备上运行。
- 低功耗:由于MQTT协议设计用于物联网设备,它非常注重节能。设备可以在空闲状态时进入低功耗模式,并且只有在需要发送或接收消息时才会被唤醒,从而减少能量消耗。
- 可靠性:MQTT支持三个级别的消息传递质量(QoS):QoS 0、QoS 1和QoS 2。QoS 0是最低的级别,消息发送者只发送一次消息,而不保证消息是否被接收。QoS 1和QoS 2提供了更高的可靠性,通过在消息传递过程中进行确认和重传来确保消息的可靠性。
- 安全性:MQTT协议支持基于TLS/SSL的加密通信,可以保护数据传输的安全性。它还支持身份验证和访问控制,以确保只有授权的设备可以发布和订阅特定的主题。
- 灵活性:MQTT协议可以在各种网络环境中使用,包括低带宽、高延迟和不稳定的网络。它可以在TCP/IP、WebSocket和其他传输协议上运行,适应不同的应用场景。
MQTT已经成为物联网领域最常用的通信协议之一,广泛应用于智能家居、工业自动化、车联网、能源管理等领域。它的简单性、灵活性和低功耗特性使得它成为连接各种物联网设备的理想选择。
EMQX
本文以EMQX为mqtt协议中的broker(代理服务器)。
EMQX简介
EMQX(简称 EMQ),是一款完全开源,高度可伸缩,高可用的分布式 MQTT 消息服务器,同时也支持 CoAP/LwM2M 一站式 IoT 协议接入。EMQ 是 5G 时代万物互联的消息引擎,适用于 IoT、M2M 和移动应用程序,可处理千万级别的并发客户端.
EMQX 安装
容器化部署是体验 EMQX 的最快方式,因此本节将以容器化部署为例,带您开始完整的 EMQX 使用旅程。
- 在命令行工具中输入如下命令,下载并运行最新版 EMQX。
运行此命令前,请确保 Docker 已安装且已启动。
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx-enterprise:latest
- 通过浏览器访问 http://localhost:18083/(localhost 可替换为您的实际 IP 地址)以访问 EMQX Dashboard 管理控制台,进行设备连接与相关指标监控管理。
默认用户名及密码:
admin
public
php客户端
此处用laravel框架,php bluerhinos/phpmqtt包来实现具体功能。
首先安装laravel 框架,然后配置运行。
然后下载 bluerhinos/phpmqtt 包。在项目根目录运行以下代码:
composer require bluerhinos/phpmqtt -vvv
php发布
创建一个控制器,来发布对应的内容
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Bluerhinos\phpMQTT;
use Illuminate\Routing\Controller as BaseController;
class TestController extends BaseController
{
public function sendMqtt(Request $request){
$subject=$request->input('subject');//发布主题
$content=$request->input('content');//发布内容,字符串,如果是对象要转成json
$client_id='mqtt_'.$this->getRandStr(10);;//客户端id,自己生成唯一的
$mqtt = new phpMQTT(env('MQTT_SERVER_IP'), env('MQTT_SERVER_PORT'), $client_id);
if ($mqtt->connect(true, NULL, env('MQTT_SERVER_USER_NAME'), env('MQTT_SERVER_PASSWORD'))) {
$mqtt->publish($subject, $content, 0, false);
$mqtt->close();
} else {
echo "Time out!\n";
}
echo $subject."\n";
}
/**
* @param $length
* @return string
* 获取随机字符串
*/
public function getRandStr($length){
//字符组合
$str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$len = strlen($str)-1;
$randstr = '';
for ($i=0;$i<$length;$i++) {
$num=mt_rand(0,$len);
$randstr .= $str[$num];
}
return $randstr;
}
}
php订阅
由于mqtt订阅客户端需要长连接。我们需要借助laravel的console命令行工具。
在app/Console/Commands/目录下面创建一个MqttSubscrlbe.php文件。
书写以下内容:
<?php
namespace App\Console\Commands;
use Bluerhinos\phpMQTT;
use Illuminate\Console\Command;
class MqttSubscribe extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'mqtt:subscribe';
/**
* The console command description.
*
* @var string
*/
protected $description = 'mqtt 订阅客户端';
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$server = env('MQTT_SERVER_IP');
$port = env('MQTT_SERVER_PORT');
$username = env('MQTT_SERVER_USER_NAME');
$password = env('MQTT_SERVER_PASSWORD');
//$client_id = 'mqttjs_f590d7fdb5afaeafc';
$client_id = 'mqttjs_asdfadsfaqerqw';
$subject = 'bimcc/#';//订阅主题,跟发布的主题要保持一致。
$mqtt = new phpMQTT($server, $port, $client_id);
if (!$mqtt->connect(true, NULL, $username, $password)) {
exit(1);
}
$mqtt->debug = true;
$topics[$subject] = array('qos' => 0, 'function' => function($topic, $msg){
echo 'Msg Recieved: ' . date('r') . "\n";
echo "Topic: {$topic}\n\n";
echo "\t $msg \n\n"; //此处是mqtt收到的消息
});
//监听链接,并回调处理
// $topics[$subject] = array('qos' => 0, 'function' => 'procMsg');
$mqtt->subscribe($topics, 0);
while ($mqtt->proc()) {}
$mqtt->close();
}
}
在项目根目录运行以下命令,启动订阅服务。如果是生产环境,最好写个脚本用守护进程的方式执行。
php artisan mqtt:subscribe
然后通过控制起发布消息,可以在订阅客户端命令行里面看到对应的消息内容。