php对接mqtt通讯

MQTT协议简介

MQTT(Message Queuing Telemetry Transport)是一种轻量级、开放的通信协议,专门设计用于物联网设备之间的通信。它最初由IBM开发,并于1999年发布。MQTT协议具有简单、轻量级、低功耗和高效的特点,适用于各种网络环境和设备。

以下是MQTT协议的一些关键特点:

  1. 发布/订阅模型:MQTT采用发布/订阅模型,其中设备可以发布(发送)消息到特定的主题(Topic),并且其他设备可以订阅(接收)这些主题上的消息。这种模型使得设备之间可以实现异步通信,不需要直接建立点对点的连接。
  2. 轻量级:MQTT协议非常轻量级,协议头部开销小,传输数据量少,适合在带宽有限或网络连接较弱的环境中使用。它可以在嵌入式设备、传感器和其他资源受限的设备上运行。
  3. 低功耗:由于MQTT协议设计用于物联网设备,它非常注重节能。设备可以在空闲状态时进入低功耗模式,并且只有在需要发送或接收消息时才会被唤醒,从而减少能量消耗。
  4. 可靠性:MQTT支持三个级别的消息传递质量(QoS):QoS 0、QoS 1和QoS 2。QoS 0是最低的级别,消息发送者只发送一次消息,而不保证消息是否被接收。QoS 1和QoS 2提供了更高的可靠性,通过在消息传递过程中进行确认和重传来确保消息的可靠性。
  5. 安全性:MQTT协议支持基于TLS/SSL的加密通信,可以保护数据传输的安全性。它还支持身份验证和访问控制,以确保只有授权的设备可以发布和订阅特定的主题。
  6. 灵活性:MQTT协议可以在各种网络环境中使用,包括低带宽、高延迟和不稳定的网络。它可以在TCP/IP、WebSocket和其他传输协议上运行,适应不同的应用场景。

MQTT已经成为物联网领域最常用的通信协议之一,广泛应用于智能家居、工业自动化、车联网、能源管理等领域。它的简单性、灵活性和低功耗特性使得它成为连接各种物联网设备的理想选择。

EMQX

本文以EMQX为mqtt协议中的broker(代理服务器)。

EMQX简介

EMQX(简称 EMQ),是一款完全开源,高度可伸缩,高可用的分布式 MQTT 消息服务器,同时也支持 CoAP/LwM2M 一站式 IoT 协议接入。EMQ 是 5G 时代万物互联的消息引擎,适用于 IoT、M2M 和移动应用程序,可处理千万级别的并发客户端.

EMQX 安装

容器化部署是体验 EMQX 的最快方式,因此本节将以容器化部署为例,带您开始完整的 EMQX 使用旅程。

  1. 在命令行工具中输入如下命令,下载并运行最新版 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
  1. 通过浏览器访问 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

然后通过控制起发布消息,可以在订阅客户端命令行里面看到对应的消息内容。

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Java可以使用Paho MQTT客户端库来实现与MQTT服务器的连接和通信。以下是Java对接MQTT的基本步骤: 1. 引入Paho MQTT客户端库的依赖。可以在Maven或Gradle中添加以下依赖: ```xml <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId> <version>1.2.5</version> </dependency> ``` 2. 创建一个MQTT客户端对象,并设置连接参数。例如: ```java String brokerUrl = "tcp://mqtt.eclipse.org:1883"; String clientId = "myClient"; MqttClient client = new MqttClient(brokerUrl, clientId); ``` 3. 创建一个MQTT连接对象,并设置回调函数。例如: ```java MqttConnectOptions options = new MqttConnectOptions(); options.setCleanSession(true); options.setWill(topic, "offline".getBytes(), 2, true); client.setCallback(new MqttCallback() { @Override public void connectionLost(Throwable cause) { // 连接丢失处理 } @Override public void messageArrived(String topic, MqttMessage message) throws Exception { // 消息到达处理 } @Override public void deliveryComplete(IMqttDeliveryToken token) { // 消息发送完成处理 } }); ``` 4. 连接到MQTT服务器。例如: ```java client.connect(options); ``` 5. 订阅一个主题。例如: ```java String topic = "myTopic"; int qos = 0; client.subscribe(topic, qos); ``` 6. 发布一个消息到主题。例如: ```java String messageContent = "Hello, MQTT!"; MqttMessage message = new MqttMessage(messageContent.getBytes()); message.setQos(0); client.publish(topic, message); ``` 以上是Java对接MQTT的基本流程,具体实现可以根据需求进行调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BIMCC筑云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值