mqtt如何用php接收消息?附代码

写一个单独的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 终止。
相关推荐
JustHappy4 小时前
古法编程秘籍(七):互联网到底是什么?把两台电脑怎么说话搞懂就够了
前端·后端·网络协议
Hommy884 小时前
【剪映小助手】添加图片接口(Add Images)
后端·github·剪映小助手·视频剪辑自动化
GetcharZp5 小时前
别再盲目用 OpenCV 读图了,这才是 CV 预处理的终极杀手锏!
后端
IT_陈寒9 小时前
Vite热更新失效?可能你在用Windows
前端·人工智能·后端
椰椰椰耶10 小时前
[SpringCloud][14]OpenFeign参数传递方法
后端·spring·spring cloud
onething36510 小时前
Spring Boot + Spring AI 从入门到实战:7天转型计划 Day 3 —— 消息表设计 + 级联删除 + 事务管理
人工智能·后端
荣江10 小时前
Hermes Agent 代码仓库打包工具使用指南(repomix-rs 高性能版)
后端
王某某人10 小时前
LangChain4j 入门:Java 程序员的第一个 AI 对话程序
人工智能·后端
码农刚子10 小时前
从零开始:在 Windows 服务器上部署 Node.js 项目(小白实战教程)
后端·node.js
Cache技术分享10 小时前
435. Java 日期时间 API - Clock 灵活获取当前时间
前端·后端