写一个单独的php文件,订阅mqtt的主题,并连接数据库,写入接收到的消息
php
<?php
require_once dirname(__DIR__) . '/vendor/autoload.php';
use PhpMqtt\Client\MqttClient;
use PhpMqtt\Client\ConnectionSettings;
// 数据库配置
$dbConfig = [
'host' => 'localhost',
'user' => '',
'pass' => '',
'dbname' => ''
];
// EMQX连接参数
$server = '';
$port = 1883;
$clientId = 'php_subscriber_' . uniqid();
$username = 'bbbb';
$password = 'aaaa';
$topic = 'UADX001/123456/Pub/';
$qos = 1;
// 创建数据库连接(一次连接多次使用)
function getDbConnection($config) {
static $conn = null;
if ($conn === null) {
$conn = new mysqli($config['host'], $config['user'], $config['pass'], $config['dbname']);
if ($conn->connect_error) {
throw new Exception("数据库连接失败: " . $conn->connect_error);
}
}
return $conn;
}
// 存储消息到数据库
function saveMessage($topic, $message, $dbConfig) {
try {
$conn = getDbConnection($dbConfig);
// 使用预处理语句防止SQL注入
$stmt = $conn->prepare("INSERT INTO cmf_portal_device_log (topic, message, created_at) VALUES (?, ?, NOW())");
$stmt->bind_param("ss", $topic, $message);
if ($stmt->execute()) {
echo "消息已保存,ID: " . $conn->insert_id . "\n";
} else {
echo "保存失败: " . $stmt->error . "\n";
}
$stmt->close();
} catch (Exception $e) {
echo "保存消息时出错: " . $e->getMessage() . "\n";
}
}
// 创建连接设置
$connectionSettings = (new ConnectionSettings)
->setUsername($username)
->setPassword($password)
->setKeepAliveInterval(60);
// 创建MQTT客户端
$client = new MqttClient($server, $port, $clientId);
try {
// 连接到EMQX
$client->connect($connectionSettings, true);
echo "成功连接到EMQX服务器\n";
// 订阅主题
$client->subscribe($topic, function ($topic, $message) use ($dbConfig) {
echo "收到消息 - 主题: {$topic}, 内容: {$message}\n";
saveMessage($topic, $message, $dbConfig);
}, $qos);
echo "已订阅主题: {$topic}\n";
echo "等待接收消息... (按Ctrl+C退出)\n";
// 持续监听消息
$client->loop(true);
} catch (Exception $e) {
echo "发生错误: {$e->getMessage()}\n";
$client->disconnect();
}
?>
命令行运行
php mqtt.php

用mqttx客户端给这个主题发消息,就能接收到消息,并写入数据表
- 停止进程:通过
ps aux | grep mqtt.php
找到进程 ID,再用kill 进程ID
终止。