Received subscribe acknowledgement with invalid QoS values from the broker


服务端:emqx

客户端:php-mqtt/client 3.x

PHP≥7.4

  • 需求

    • 项目需要自定义订阅客户端的离线和上线
  • 代码

    $server   = 'emqx server url';
    $port     = 1883;
    $clientId = 'sys_client';
    $username = 'test';
    $password = '12345678';
    $topics='$SYS/brokers/+/clients/#';//订阅客户端上线下线
    $mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
    $connectionSettings = (new \PhpMqtt\Client\ConnectionSettings)
        ->setUsername($username)
        ->setPassword($password);
    
    $mqtt->connect($connectionSettings, true);
    $mqtt->subscribe($topics, function ($topic, $message) {
    			echo sprintf("Received message on topic [%s]: %s\n", $topic, $message);
    		}, 0);
    $mqtt->loop(true);
    $mqtt->disconnect();
    
  • 为什么会出现异常?

    Received subscribe acknowledgement with invalid QoS values from the broker.
    
  • 如何解决?

    • 参考EMQX的ACL文档做规则设置:https://www.emqx.io/docs/zh/v4.3/advanced/acl-file.html

    • 默认的acl.conf

      {allow, {user, "dashboard"}, subscribe, ["$SYS/#"]}.
       
      {allow, {ipaddr, "127.0.0.1"}, pubsub, ["$SYS/#", "#"]}.
       
      {deny, all, subscribe, ["$SYS/#", {eq, "#"}]}.
       
      {allow, all}.
      
    • 修改acl.conf,为了安全起见,我这里做了只允许指定的ip订阅$SYS/brokers/+/clients/#

      {allow, {user, "dashboard"}, subscribe, ["$SYS/#"]}.
       
      {allow, {ipaddr, "127.0.0.1"}, pubsub, ["$SYS/#", "#"]}.
      
      #指定ip订阅
      {allow, {ipaddr, "127.0.0.1"}, subscribe, ["$SYS/brokers/+/clients/#"]}.
      #允许所有客户端订阅
      #{allow, all, subscribe, ["$SYS/brokers/+/clients/#"]}.
      
      {deny, all, subscribe, ["$SYS/#", {eq, "#"}]}.
       
      {allow, all}.
      
    • 然后,通过命令行的方式运行一下,应该就不会报错了