如何在tp6框架里 运行mqtt 发布和订阅
已经用mqtt/php-client做了一版,可以运行。但是容易断开连接,不知道什么参数没有配置对。
启动服务
win平台
php think mqttSub
Linux平台
#!/bin/bash
sleep 10
app_dir="/www/wwwroot/hq.maotouying.cc"
pid=${app_dir}/runtime/mqttSub_pid.pid
su - www <<EOF
echo "start mqttSub...."
echo $app_dir
echo $pid
if [ -f "$pid" ]
then
if [ $(cat $pid) ]
then
kill -9 `cat ${app_dir}/runtime/mqttSub_pid.pid`
fi
fi
nohup /usr/bin/php ${app_dir}/think mqttSub > ${app_dir}/runtime/mqttSub`date +'%Y-%m-%d'`.log 2>&1 &
echo $! > ${app_dir}/runtime/mqttSub_pid.pid
echo "mqttSub started"
EOF
指令配置文件
return [
// 指令定义
'commands' => [
'mqttSub' => 'app\command\mqttSubscribe',
],
];
指令定义
mqttSubscribe.php
<?php
declare (strict_types = 1);
namespace app\command;
use app\admin\service\MqttSubService;
use think\console\Command;
use think\console\Input;
use think\console\Output;
class mqttSubscribe extends Command
{
protected function configure()
{
// 指令配置
$this->setName('mqttsubscribe')
->setDescription('the mqttsubscribe command');
}
protected function execute(Input $input, Output $output)
{
// 指令输出
$MqttSubService = new MqttSubService();
$output->writeln($MqttSubService->sub());
}
}
mqttSubService.php核心业务方法
public function sub()
{
ignore_user_abort(true);//后台运行
set_time_limit(0);//取消超时限制
date_default_timezone_set('PRC');//设置为中国时区
// 创建mqtt实例
$this->mqtt = new \PhpMqtt\Client\MqttClient($this->host, $this->port, $this->client);
// 参数定义
$connectionSettings = (new \PhpMqtt\Client\ConnectionSettings)
// 连接到代理时用于身份验证的用户名。
->setUsername($this->username)
// 连接到代理时用于身份验证的密码。
->setPassword($this->password)
// 连接超时定义了客户端将尝试与代理建立
// 套接字连接的最大秒数。该值不能小于 1 秒。
// ->setConnectTimeout(3)
// 套接字超时是套接字连接的最大空闲时间(以秒为单位)。
// 如果在给定的秒数内没有读取或发送数据,套接字将关闭。
// 该值不能小于 1 秒。
// ->setSocketTimeout(30)
// 重新发送超时是客户端在发送重复的待处理消息之前等待的秒数
// 未经确认。该值不能小于 1 秒。
// ->setResendTimeout(10)
// 保持活动间隔是客户端在不发送消息的情况下等待的秒数
// 直到它向代理发送保持活动信号 (ping)。该值不能小于 1 秒
// 并且不能大于 65535 秒。合理的值是 10 秒(默认值)。
// ->setKeepAliveInterval(10)
// 如果代理应该在客户端突然断开连接时以客户端的名义发布最后一条消息,则此设置定义将发布消息的主题。
// 只有在配置此设置和最后一条消息时才会发布最后一条消息。
// ->setLastWillTopic(null)
// 如果代理应该在客户端突然断开连接时以客户端的名义发布最后一条消息,则此设置定义将发布的消息。
// 只有在配置了此设置和最后一个遗嘱
// 主题时才会发布最后一个遗嘱消息。
// ->setLastWillMessage(null)
// 客户端的最后一条消息将发布的服务质量级别,
// 如果它被触发。
// ->setLastWillQualityOfService(0)
// 这个标志决定了客户端的最后一条遗嘱消息是否会被保留,如果它被触发了。使用此设置可以很方便地通过发布
// 最后遗嘱中保留的离线状态和作为连接时的第一条消息的在线状态来指示客户端离线。
// ->setRetainLastWill(false)
// 此标志确定是否应将 TLS 用于连接。
//用于连接代理的端口必须支持 TLS 连接。
// ->setUseTls(false)
// 此标志确定是否验证对等证书,是否使用 TLS。
// ->setTlsVerifyPeer(true)
// 此标志确定是否验证对等名称,是否使用 TLS。
// ->setTlsVerifyPeerName(true)
// 此标志确定是否应接受对等方的自签名证书。
// 将此设置为 TRUE 意味着存在安全风险,应避免用于生产场景和公共服务。
// ->setTlsSelfSignedAllowed(true)
// 用于验证对等方证书的证书颁发机构证书的路径,如果使用 TLS。
// ->setTlsCertificateAuthorityFile(null)
// 包含证书颁发机构证书的目录的路径,用于验证对等证书(如果使用 TLS)。
// ->setTlsCertificateAuthorityPath(null)
// 用于身份验证的客户端证书文件的路径(如果使用 TLS)。
// 客户端证书必须是 PEM 编码的。它可以选择包含颁发者的证书链。
// ->setTlsClientCertificateFile(null)
// 用于身份验证的客户端证书密钥文件的路径(如果使用 TLS)。
// 此选项还需要使用 ConnectionSettings::setTlsClientCertificateFile()。
// ->setTlsClientCertificateKeyFile(null)
// 用于解密客户端证书私钥的密码,如果使用 TLS,则用于身份验证。
// 此选项还需要使用 ConnectionSettings::setTlsClientCertificateFile() 和
// ConnectionSettings::setTlsClientCertificateKeyFile()。
->setTlsClientCertificateKeyPassphrase(null);
// 若mqtt链接失败
$this->mqtt->connect($connectionSettings,true);
if (!$this->mqtt->isConnected()){
echo "mqtt链接失败";
}
$this->mqtt->subscribe($this->topics_name,function($topic,$message){
$this->message($topic,$message);
});
$this->mqtt->loop(true);
$this->mqtt->disconnect();
}
正在使用workerman/mqtt做第二版,目前测试可以。上线稳定运行后,回来上代码!!!