PHP的mqtt发布和订阅demo:原生、thinkphp、PhalApi

首先简单的介绍一下mqtt协议,MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。

 

MQTT协议运行在TCP/IP或其他网络协议,提供有序、无损、双向连接。其特点包括:

1.使用的发布/订阅消息模式,它提供了一对多消息分发,以实现与应用程序的解耦.

2.对负载内容屏蔽的消息传输机制。

3.对传输消息有三种服务质量(QoS):

    最多一次,这一级别会发生消息丢失或重复,消息发布依赖于底层TCP/IP网络。即:<=1

    至多一次,这一级别会确保消息到达,但消息可能会重复。即:>=1

    只有一次,确保消息只有一次到达。即:=1。在一些要求比较严格的计费系统中,可以使用此级别

4.数据传输和协议交换的最小化(协议头部只有2字节),以减少网络流量通知机制,异常中断时通知传输双方

 

PHP的mqtt发布和订阅demo:原生、thinkphp、PhalApi_第1张图片

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);


    }


}

你可能感兴趣的:(PHP的mqtt发布和订阅demo:原生、thinkphp、PhalApi)