• PHP MQTT 实践


    MQTT介绍:http://mqtt.org

    服务器端
    https://mosquitto.org/download/

    PHP客户端
    https://github.com/bluerhinos/phpMQTT

    MQTT QOS等级订阅和发布的关系
    https://www.jianshu.com/p/ebe4b2c0461d

    qos = 0:仅发一次,不管是否能收到
    qos = 1:没返回一直发,可能有重复接收(接收到消息可能未传递给客户端)
    qos = 2:保证必须收到,并且不重复(使用MSG_ID保证不重复接收)

    也就是服务器只会按pub和sub两者qos等级最小的那个qos规则来发送消息。
    pub时指定的qos是服务器肯定按此规则接收,但是最终订阅者不一定。
    sub时指定的qos表示订阅者可以接收的最高消息等级,也就是可能收到更低等级的消息。

    遇到的问题

    1.  qos=2 一直没有测试成功,mosquitto 已经收到客户端的消息,但订阅端就是接收不到。
    2.  当有多个订阅端时,又是后收到的消息居然会不全,前面会有乱码出现。
    3.  没有HTTP简单直接;感觉没有HTTP可靠通用;

    消息发布

    <?php
    
    require("../phpMQTT.php");
    
    $server    = '127.0.0.1';     // 服务器IP
    $port      = 1883;            // 服务器端口
    $username  = '';              // 用户名
    $password  = '';              // 密码
    $client_id = 'pub_' . uniqid();
    
    $mqtt = new BluerhinosphpMQTT($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!
    ";
    }

    消息订阅

    <?php
    
    require("../phpMQTT.php");
    
    $server    = '127.0.0.1';     // 服务器IP
    $port      = 1883;            // 服务器端口
    $username  = '';              // 用户名
    $password  = '';              // 密码
    $client_id = 'sub_' . uniqid();
    
    $mqtt = new BluerhinosphpMQTT($server, $port, $client_id);
    
    $mqtt->debug = true;
    
    if(!$mqtt->connect(true, NULL, $username, $password))
    {
        echo "连接失败!
    ";
        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;
    }
  • 相关阅读:
    信步漫谈之Struts2—输入校验(编码方式)
    信步拾遗之Java反射机制浅析
    信步漫谈之Log4j—基础介绍
    Log4J基础详解及示例大全(转)
    设计模式之Bridge(桥接)(转)
    设计模式之Adapter(适配器)(转)
    设计模式之Facade(外观)(转)
    设计模式之Factory(工厂)(转)
    设计模式之Flyweight(享元)(转)
    基于CentOS7系统部署cobbler批量安装系统
  • 原文地址:https://www.cnblogs.com/zjfree/p/11428718.html
Copyright © 2020-2023  润新知