PHPMqtt详解

参考

Documentation - PHP | CloudMQTTHosted message broker for the Internet of Things. Perfectly configured and optimized message queues for IoT, ready in seconds.https://www.cloudmqtt.com/docs-php.html

下载

GitHub - bluerhinos/phpMQTT: a simple php class to connect/publish/subscribe to a MQTT brokera simple php class to connect/publish/subscribe to a MQTT broker - GitHub - bluerhinos/phpMQTT: a simple php class to connect/publish/subscribe to a MQTT brokerhttps://github.com/bluerhinos/phpMQTT

CloudMQTT 概述

Documentation | CloudMQTTHosted message broker for the Internet of Things. Perfectly configured and optimized message queues for IoT, ready in seconds.https://www.cloudmqtt.com/docs.html

客户端发布

/**

 * Created by PhpStorm.

 * Time: 16:47

 */

namespace App\Http\Controllers\Mqtt\v1;


 

use App\Common\Common;

use App\Http\Controllers\Controller;

use App\until\phpMQTT;

use Illuminate\Support\Facades\Config;

use Illuminate\Support\Facades\DB;

use App\Events\Handle;

class Subscript extends Controller

{

    /*

        手动执行监听 MQTT 订阅;

     * php artisan Mqtt

     */

//所有配置放在 配置文件config中

    public function subscript(){

        $server = config('mqtt.host');  // change if necessary 服务器IP

        $port = config('mqtt.port'); // change if necessary    端口 一般是1883

        $username = config('mqtt.username'); // set your username mosquitto设置的用户名

        $password = config('mqtt.password'); // set your password mosquitto设置的密码

        $client_id = config('mqtt.clientId'); //你的连接客户端id

        $keepAlive = config('mqtt.keepAlive');

        $mqtt = new phpMQTT($server, $port, $client_id,'',$keepAlive);    //进行连接

        //cleanSession 设为false,客户端掉线后 服务器端不会清除session,当重连后可以接收之前订阅主题的消息。

        //当客户端上线后会接受到它离线的这段时间的消息

        //但是这个只是进行了重连,重连后还需要再次发起订阅

        //接收遗嘱消息

        if(!$mqtt->connect(true, NULL, $username, $password)) {

            exit('error');   //连接失败

        } else {

            echo "success"; //连接成功

        }

        //topics["topic"]  为接受的主题名  需要和发送的主题名一致  否则会订阅不到

        //订阅信息 Qos为信息登记,需要和发送的等级一致

        //可以订阅多个不同类型通知

        $topics["SERVER/#"] = array("qos" => 0, "function" =>array($this,"onMessage"));

        $topics["IM/#"] = array("qos" => 0, "function" =>array($this,"onImMessage"));

        $mqtt->subscribe($topics, 0);

        //死循环监听

        while($mqtt->proc()){

        }

        $mqtt->close();

    }

    /**

     * 在此处接MQtt的信息 进行业务处理

     * @param $topic

     * @param $msg

     * 设备订阅主题

     * device/xxxxx/硬件号

     * 设备发布的主题

     * server/xxxxx/硬件号

     * 设备遗嘱主题

     * will/xxxxx/硬件号

     * 处理逻辑写到handle文件中

     * 处理逻辑写到handle文件中

     * 处理逻辑写到handle文件中

     */

     function onMessage($topic,$msg){

        echo $topic;

        echo "Msg Recieved: ".$msg;

        //所有逻辑全移到handle

        HandleController::business($topic,$msg);

    }

    /*

     * 消息处理

     */

     function onImMessage($topic,$msg){

//         echo $msg;

        echo $topic;

        echo "Msg Recieved: ".$msg;

        //所有逻辑全移到Im

        ImMessageController::business($topic,$msg);

    }

}

消息发送

namespace App\Http\Controllers\Mqtt\v1;


 

use App\Http\Controllers\Controller;

use App\until\phpMQTT;

use Illuminate\Http\Request;

class Publish extends Controller

{

    /**

     * @return bool

     * 发送信息  第三个参数为Qos服务质量等级

     * Qos0   发送者只发送一次消息,不进行重试,Broker不会返回确认消息。在Qos0情况下,Broker可能没有接受到消息

     * Qos1   发送者最少发送一次消息,确保消息到达Broker,Broker需要返回确认消息PUBACK。在Qos1情况下,Broker可能接受到重复消息

     * Qos2   Qos2使用两阶段确认来保证消息的不丢失和不重复。在Qos2情况下,Broker肯定会收到消息,且只收到一次

     */

    public static function push($topic, $message, $QOS = 0, $will = null)

    {

        if (!$topic || !$message) {

            return false;

        }

        //默认主题都大写。

        //        $topic=strtoupper($topic);

        $host = config('mqtt.host'); //主机

        $port = config('mqtt.port'); //端口

        $username = config('mqtt.username'); //如果没有则为空

        $password = config('mqtt.password'); //如果没有则为空

        //phpMQTT 有四个参数:主机,端口,客户端id,证书。官网这里的案例没写证书,请参考phpMQTT类

        //没有证书的时候只能连接1883端口,不能连接8883端口。

        $mqtt = new phpMQTT($host, $port, "SERVER" . rand());

        //连接

        if ($mqtt->connect(true, $will, $username, $password)) {

            $mqtt->publish($topic, $message, $QOS);

            $mqtt->close(); //关闭

        } else {

            echo "Fail or time out
";

        }

        HandleController::logMqtt($topic, json_decode($message, true));

    }

    public function publish(Request $request)

    {

        $topic = $request->input('theme'); //发送的主题

        $message = $request->input('content'); //要发送的消息

        $QOS = $request->input('qos', 0); //要发送的消息服务质量等级

        //        print_r($topic);die;

        //        $willTopic = input('willTopic');

        //        $willMessage = input('willMessage');

        //        $willQos = input('willQos',0);

        //        $willRetain = input('willRetain',false);//1  true

        if (!$topic) {

            return returnJson(50000, "主题不能为空");

        }

        if (!$message) {

            return returnJson(50000, "消息不能为空");

        }

        $will = null;

        //      if($willMessage && $willTopic){

        //          $will['topic'] = $willTopic;

        //          $will['content'] = $willMessage;

        //          $will['qos'] = $willQos;

        //          $will['retain'] = $willRetain;

        //        }

        self::push($topic, $message, $QOS, $will);

    }

}

Publish::push($theme, json_encode($pushDate,JSON_UNESCAPED_UNICODE), Common::QOS());

你可能感兴趣的:(php,开发语言)