报错信息:
0 [1]ErrorException in Client.php line 66
Swoole\Coroutine\Client::connect(): async-io must be used in PHP CLI mode
已安装composer require simps/mqtt
已安装swoole
代码如下(thinkphp6):
//simps
use Simps\MQTT\Client;
use Simps\MQTT\Config\ClientConfig;
use function Swoole\Coroutine\run;
class Index extends BaseController
{
public function test(){
$config = [
'access_key' => '1', // 阿里云帐号 AccessKey
'secret_key' => '2', // 阿里云帐号 SecretKey
'end_point' => '3', // 接入点地址,购买实例后从控制台获取
'instance_id' => '4', // 实例 ID,购买后从控制台获取
'topic' => 'test_mqtt_topic', // MQTT Topic,其中第一级 Topic 需要在 MQTT 控制台提前申请
'group_id' => 'GID_tt1', // MQTT 客户端ID 前缀, GroupID,需要在 MQTT 控制台申请
];
// MQTT 客户端ID 后缀,DeviceId,业务方自由指定,需要保证全局唯一,禁止 2 个客户端连接使用同一个 ID
$deviceId = Client::genClientID();
$qos = 0;
$port = 1883;
$keepalive = 90;
$cleanSession = true;
$clientId = $config['group_id'] . '@@@' . $deviceId;
echo "ClientId: {$clientId}", PHP_EOL;
// 设置鉴权参数,参考 MQTT 客户端鉴权代码计算 username 和 password
$username = 'Signature|' . $config['access_key'] . '|' . $config['instance_id'];
$sigStr = hash_hmac("sha1", $clientId, $config['secret_key'], true);
$password = base64_encode($sigStr);
echo "UserName: {$username} \r\nPassword: {$password}", PHP_EOL;
// 初始化客户端配置
$clientConfig = new ClientConfig();
$clientConfig->setUserName($username)
->setPassword($password)
->setClientId($clientId)
->setKeepAlive($keepalive)
->setMaxAttempts(0)
->setSwooleConfig([
'open_mqtt_protocol' => true,
'package_max_length' => 2 * 1024 * 1024,
]);
try {
// 初始化客户端
$client = new Client($config['end_point'], $port, $clientConfig);
$connect = $client->connect($cleanSession);
// 连接状态
var_dump($connect);
$topics[$config['topic']] = $qos;
$subStatus = $client->subscribe($topics);
// 订阅状态
var_dump($subStatus);
$publishStatus = $client->publish($config['topic'], "Hello MQTT PHP Demo", $qos);
// 发布状态
var_dump($publishStatus);
$buffer = $client->recv();
// 订阅消息接收
var_dump($buffer);
echo 'Finished';
} catch (\Throwable $e) {
echo $e->getMessage();
}
}
swoole 只能在 CLI 下运行,不能运行在 FPM。
即你可以写成 Command 然后再命令行用
php think <command>
的形式运行。