ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### 基于php-mqtt/client依赖 > php-mqtt/client是根据 MIT 许可证许可的开源软件 ##### 安装 该软件包在[packagist.org](https://packagist.org/)上下载,可以使用以下命令安装:[composer](https://so.csdn.net/so/search?q=composer&spm=1001.2101.3001.7020) ~~~linux composer require php-mqtt/client ~~~ > 该软件包需要 PHP 版本 7.4 或更高版本。 ##### 发布 使用 QoS 0 的非常基本的发布示例只需要三个步骤:连接、发布和断开连接 ~~~php $server = 'some-broker.example.com';//连接地址 $port = 1883;//连接端口 $clientId = 'test-publisher';//客户端ID,可随意填写,也可使用rand函数生成随机的 $mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId); $mqtt->connect(); $mqtt->publish('php-mqtt/client/test', 'Hello World!', 0); $mqtt->disconnect(); ~~~ > 另外注意,大多数方法都可能引发异常。为简洁起见,上面的示例未添加任何的异常处理。 ##### 订阅 订阅比发布稍微复杂一些,因为它需要运行一个事件循环,该循环读取、解析和处理来自代理的消息 ~~~php $server = 'some-broker.example.com';//连接地址 $port = 1883;//连接端口 $clientId = 'test-subscriber';//客户端ID,可随意填写,也可使用rand函数生成随机的 $mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId); $mqtt->connect(); $mqtt->subscribe('php-mqtt/client/test', function ($topic, $message) { echo sprintf("Received message on topic [%s]: %s\n", $topic, $message); }, 0); $mqtt->loop(true); $mqtt->disconnect(); ~~~ 当环路处于活动状态时,您可以使用它向环路发送中断信号。这将在循环开始下一次迭代之前终止循环。例如,您可以使用以下方法调用此方法: ~~~php $mqtt->interrupt()pcntl_signal(SIGINT, $handler) ~~~ 如下: ~~~php pcntl_async_signals(true); $clientId = 'test-subscriber'; $mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId); pcntl_signal(SIGINT, function (int $signal, $info) use ($mqtt) { $mqtt->interrupt(); }); $mqtt->connect(); $mqtt->subscribe('php-mqtt/client/test', function ($topic, $message) { echo sprintf("Received message on topic [%s]: %s\n", $topic, $message); }, 0); $mqtt->loop(true); $mqtt->disconnect(); ~~~ ##### 客户端设置 如上面的示例所示,将服务器、端口和客户端 ID 作为第一、第二和第三个参数。作为第四个参数,可以传递协议级别。目前支持的是 MQTT v3.1,可作为常量 。第五个参数允许传递存储库(目前,默认情况下只有一个可用)。最后,记录器可以作为第六个参数传递。如果未给出任何记录器,则改用空记录器。 > MqttClientMqttClient::MQTT\_3\_1MemoryRepository 例如: ~~~php $mqtt = new \PhpMqtt\Client\MqttClient( $server, $port, $clientId, \PhpMqtt\Client\MqttClient::MQTT_3_1, new \PhpMqtt\Client\Repositories\MemoryRepository(), new Logger() ); ~~~ > 必须实现 .LoggerPsr\\Log\\LoggerInterface ##### 连接设置 它的方法采用两个可选参数: > connect() MqttClient 1. 实例 Connection Settings 2. 指示是否应请求干净会话的标志(随机客户端 ID 隐式执行此操作)boolean 例如: ~~~php $mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId); $connectionSettings = (new \PhpMqtt\Client\ConnectionSettings) ->setConnectTimeout(3) ->setUseTls(true) ->setTlsSelfSignedAllowed(true); $mqtt->connect($connectionSettings, true); ~~~ 该类通过流畅的界面提供了一些设置。类型本身是不可变的,并且将为每个添加的选项创建一个新实例。这还可以防止在建立连接后更改连接设置。 > ConnectionSettings ConnectionSettings 以下是选项的完整列表及其各自的默认值: ~~~php $connectionSettings = (new \PhpMqtt\Client\ConnectionSettings) // 连接到代理时用于身份验证的用户名。 ->setUsername(null) // 连接到代理时用于身份验证的密码。 ->setPassword(null) // 连接超时定义了客户端尝试与代理建立套接字连接的最大秒数。 // 该值不能小于 1 秒。 ->setConnectTimeout(60) // 套接字超时是套接字连接的最大空闲时间(以秒为单位)。 // 如果在给定的秒数内没有读取或发送数据,则套接字将关闭。 // 该值不能小于 1 秒。 ->setSocketTimeout(5) // 重新发送超时是客户端在发送未确认消息的副本之前等待的秒数。 // 该值不能小于 1 秒。 ->setResendTimeout(10) // 保持活动间隔是客户端在向代理发送保持活动信号(ping)之前将等待而不 //发送消息的秒数。 该值不能小于 1 秒,也不能大于 65535 秒。 一个合理 //的值是 10 秒(默认值)。 ->setKeepAliveInterval(10) // 如果客户端突然断开连接时代理应该以客户端的名义发布最后的遗嘱消息, // 则此设置定义将发布消息的主题。 仅当同时配置了此设置和最后遗嘱消息 // 时,才会发布最后遗嘱消息。 ->setLastWillTopic(null) // 如果客户端突然断开连接时代理应该以客户端的名义发布最后的遗嘱消息, // 此设置定义将要发布的消息。 仅当配置了此设置以及最后遗嘱主题时, // 才会发布遗嘱消息。 ->setLastWillMessage(null) // 如果被触发,客户端的最后一条消息将被发布的服务质量级别。 ->setLastWillQualityOfService(0) // 此标志确定是否保留客户端的最后一条消息(如果它被触发)。 使用此设置 // 可以方便地通过在最后遗嘱中发布保留的离线状态和在线状态作为连接时的 // 第一条消息来发出客户端离线的信号。 ->setRetainLastWill(false) // 此标志确定是否应将 TLS 用于连接。 用于连接代理的端口必须支持 TLS // 连接。 ->setUseTls(false) // This flag determines if the peer certificate is verified, if TLS is used. ->setTlsVerifyPeer(true) // 此标志确定是否验证了对等方名称,是否使用了 TLS。 ->setTlsVerifyPeerName(true) // 此标志确定是否应接受对等方的自签名证书。 将此设置为 TRUE 意味着存在 // 安全风险,应避免用于生产场景和公共服务。 ->setTlsSelfSignedAllowed(false) // 如果使用 TLS,则用于验证对等证书的证书颁发机构证书的路径。 ->setTlsCertificateAuthorityFile(null) // 如果使用 TLS,则包含用于验证对等证书的证书颁发机构证书的目录的路径。 ->setTlsCertificateAuthorityPath(null) // 用于身份验证的客户端证书文件的路径(如果使用 TLS)。客户端证书必须 // 是 PEM 编码的。 它可以选择包含颁发者的证书链。 ->setTlsClientCertificateFile(null) // 用于身份验证的客户端证书密钥文件的路径(如果使用 TLS)。 此选项还需 // 要使用 ConnectionSettings::setTlsClientCertificateFile()。 ->setTlsClientCertificateKeyFile(null) // 用于解密客户端证书私钥的密码短语,如果使用 TLS,则反过来用于身份验 // 证。 此选项还需要使用ConnectionSettings::setTlsClientCertificateFile() // 和 ConnectionSettings::setTlsClientCertificateKeyFile()。 ->setTlsClientCertificateKeyPassphrase(null); ~~~ ##### 特征 > * 支持的 MQTT 版本 > v3(只是不要使用用户名和密码等v3.1功能) > 版本3.1 > 版本3.1.1 > 5.0 版 > * 运输 > TCP(不安全) > TLS(安全,使用证书颁发机构文件验证对等方) > * 连接 > 最后遗嘱 > 邮件保留 > 身份验证(用户名和密码) > TLS 加密连接 > 清理会话(可以设置和发送,但客户端对 QoS 2 消息没有持久性) > * 发布 > QoS 级别 0 > QoS 级别 1(限制:跨会话没有持久状态) > QoS 级别 2(限制:会话之间没有持久状态) > * 订阅 > QoS 级别 0 > QoS 级别 1 > QoS 级别 2(限制:会话之间没有持久状态) > * 支持的消息长度:无限制(没有强制执行限制,尽管MQTT协议仅支持高达256MB的数据,无论如何都不应该远程使用) > * 可以记录(可以传递给客户端)Psr\\Log\\LoggerInterface > * 持久性驱动程序 > 内存中驱动程序 > Redis 驱动程序 ##### 局限性 > QoS 级别高于 0 的消息流不会持久保存,因为缺省实现使用内存中存储库来存储数据。要避免消息流中断的问题,请使用 clean 会话标志来指示您不关心旧数据。它不仅会指示代理将连接视为新连接(没有以前的状态),而且还会重置已注册的存储库。 ##### 开发和测试 ###### 证书 若要运行测试(尤其是 TLS 测试),需要创建证书。为此提供了一个命令: ~~~linux sh create-certificates.sh ~~~ 这将在目录中创建所有必需的证书。相同的脚本也用于持续集成。 ~~~linux .ci/tls/ ~~~ 用于测试的 MQTT 代理 运行测试需要运行 MQTT 代理。运行 MQTT 代理的最简单方法是通过 Docker: ~~~linux docker run --rm -it -p 1883:1883 -p 8883:8883 -p 8884:8884 -v $(pwd)/.ci/tls:/mosquitto-certs -v $(pwd)/.ci/mosquitto.conf:/mosquitto/config/mosquitto.conf eclipse-mosquitto:1.6 ~~~ 从项目目录运行时,这将生成一个 Mosquitto MQTT 代理,该代理使用生成的 TLS 证书和自定义配置进行配置。 如果您打算运行不同的代理或使用不同的方法,或者改用公共代理,则需要相应地调整中定义的环境变量。 > phpunit.xml