随笔 - 317, 文章 - 0, 评论 - 453, 阅读 - 114万
  博客园  :: 首页  :: 新随笔  :: 订阅 订阅  :: 管理

PHP MQTT 实践

Posted on   PHP-张工  阅读(17059)  评论(1编辑  收藏  举报

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 Bluerhinos\phpMQTT($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!\n";
}
复制代码

消息订阅

复制代码
<?php

require("../phpMQTT.php");

$server    = '127.0.0.1';     // 服务器IP
$port      = 1883;            // 服务器端口
$username  = '';              // 用户名
$password  = '';              // 密码
$client_id = 'sub_' . uniqid();

$mqtt = new Bluerhinos\phpMQTT($server, $port, $client_id);

$mqtt->debug = true;

if(!$mqtt->connect(true, NULL, $username, $password))
{
    echo "连接失败!\n";
    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;
}
复制代码

 

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示