MQTT服务端的配置项统一存放在/config/mqtt.php
文件中。
具体内容如下:
return [
// +-----------------------------
// | 服务端
// +-----------------------------
// 是否启用密码器,启用时配置文件中得账号密码无效,改为下方密码器输出
'auth_status' => false,
// 密码器地址
'cipher' => '\box\config\MqttCipher',
// 账号
'user_name' => 'swoolex',
// 密码
'password' => 'swoolex',
// 版本
'protocol_level' => 3, // 支持传入3 | 5
// 设备最大同时在线数
'device_max_num' => 100000,
// 判断设备心跳过期时间(S)
'ping_max_time' => 120,
// 设备在线状态定时检测间隔时间(S)
'ping_crontab_time' => 20,
// 客户端消息发布事件,是否允许使用 # + 通配符
'publish_wildcard_status' => true,
];
其中publish_wildcard_status
参数需要注意,当设置为false
时,发布消息中的topic
订阅主题内容不允许带有#
、+
通配符,否则服务端将直接中断连接。
注意:密码器的设置,从v2.5.1
版本起才支持。
警告:v2.5.6
版本起,protocol_level
参数已被移除。
在v2.5.1
版本起,支持开发者自定义MQTT连接鉴权服务,只需要在配置文件中,将auth_status
参数改为true
即可。
对应的鉴权逻辑在\box\config\MqttCipher
类中进行修改。
该类默认代码如下:
namespace box\config;
use design\AbstractMqttCipher;
class MqttCipher extends AbstractMqttCipher {
/**
* 必须实现的密码器入口方法
* @todo 无
* @author 小黄牛
* @version v2.5.1 + 2021.08.20
* @deprecated 暂不启用
* @global 无
* @param array $data 连接请求参数
* @return bool true.鉴权通过 false.鉴权失败
*/
public function run($data) {
/**
* $data["client_id"] 设备ID
* $data["user_name"] 连接账号
* $data["password"]连接密码
*/
// 下方IF为系统密码器逻辑,你可以改成读取DB或Redis存储器做校验
if ($data['user_name'] != \x\Config::get('mqtt.user_name') || $data['password'] != \x\Config::get('mqtt.password')) {
return false;
}
return true;
}
}