Laravel使用salmanzafar/laravel-mqtt订阅报Undefined index: qos错如何解决
错误原因
salmanzafar/laravel-mqtt v2.0版本的ConnectAndSubscribe方法对参数的校验逻辑存在缺失,当你直接将回调函数作为第二个参数传入时,方法内部不会自动补充默认的qos参数,导致组装回调数组时缺少qos键,进而抛出数组键不存在的错误。你直接修改vendor目录下的源码无法解决根本问题,一方面composer更新会覆盖修改,另一方面参数传递错误会导致后续订阅逻辑的参数解析依然异常。
正确解决步骤
- 首先回退你对
vendor/salmanzafar/laravel-mqtt/src/MqttClass/MqttService.php文件的所有修改,避免后续依赖更新出现冲突。 - 调整业务调用代码,按照v2.0版本的API要求显式传入qos参数,共有两种合法调用方式:
- 单主题订阅,单独传入qos参数(qos可选值为0、1、2,无特殊需求默认填0即可)
try { $mqtt = new Mqtt(); // 第二参数指定qos,第三个参数传入回调函数 $mqtt->ConnectAndSubscribe('myTopic', 0, function ($topic, $msg) { Log::info("Mqtt Msg Received"); }); } catch (\Exception $e) { dd($e->getMessage()); }- 批量多主题订阅,传入主题配置数组
try { $mqtt = new Mqtt(); $topicConfig = [ 'myTopic' => [ 'qos' => 0, 'callback' => function ($topic, $msg) { Log::info("Mqtt Msg Received"); } ], // 可继续添加更多主题配置 ]; $mqtt->ConnectAndSubscribe($topicConfig); } catch (\Exception $e) { dd($e->getMessage()); } - 若调整代码后订阅依然异常,先确认配置文件已正确发布:运行命令
php artisan vendor:publish --provider="Salman\Mqtt\MqttServiceProvider",再检查config/mqtt.php中的MQTT服务器地址、端口、账号密码等配置是否和实际服务参数匹配。
兜底兼容方案
如果调整后依然存在兼容问题,可以降级安装更稳定的1.x版本,该版本的API和你原有调用方式完全兼容:
composer require salmanzafar/laravel-mqtt:^1.0
内容的提问来源于stack exchange,提问作者K.S.Kumar
相关产品推荐
相关产品推荐

