janfish/zhoutian-stomp-client

A PHP WebSocket STOMP client for real-time messaging

Installs: 3

Dependents: 0

Suggesters: 0

Security: 0

Stars: 0

Watchers: 0

Forks: 0

Open Issues: 0

pkg:composer/janfish/zhoutian-stomp-client

dev-main 2025-12-31 06:16 UTC

This package is not auto-updated.

Last update: 2026-01-01 05:00:02 UTC


README

一个基于 PHP 的 WebSocket STOMP 客户端插件,专为实时告警通知系统设计。

主要功能

  • WebSocket 连接管理: 自动重连机制,确保连接稳定
  • STOMP 协议支持: 完整的 STOMP 1.2 协议实现
  • 告警消息处理: 专门针对告警通知的消息格式处理
  • 异步事件驱动: 基于 ReactPHP,支持高并发处理

安装

composer require janfish/websocket-stomp

快速开始 - 接收通知

1. 基础使用(接收告警通知)

<?php
require_once 'vendor/autoload.php';

use Janfish\WebSocketStomp\Client\StompClient;
use Janfish\WebSocketStomp\Handler\AlertMessageHandler;

// 配置参数
$config = [
    'url' => 'wss://your_ws_domain/',  // WebSocket服务器地址
    'headers' => [
        'Authorization' => 'Bearer your-jwt-token-here',  // JWT认证令牌
        'accept-version' => '1.2,1.1,1.0',  // STOMP协议版本
        'heart-beat' => '4000,4000'  // 心跳间隔
    ],
    'reconnect_delay' => 5000,     // 重连延迟(毫秒)
    'heartbeat_incoming' => 4000,  // 心跳接收间隔(毫秒)
    'heartbeat_outgoing' => 4000,  // 心跳发送间隔(毫秒)
    'debug' => true,              // 调试模式
];

// 创建告警处理器
$alertHandler = new AlertMessageHandler([
    'useDefaultSound' => 1,    // 使用默认声音
    'audioFile' => 'default.wav',  // 音频文件
    'playTimes' => 1,          // 播放次数
    'display' => 1,            // 显示通知
    'playInterval' => 3,       // 播放间隔(秒)
    'debug' => true,           // 调试模式
]);

// 添加告警处理回调
$alertHandler->addCallback(function ($alertData) {
    echo "收到告警: " . json_encode($alertData, JSON_UNESCAPED_UNICODE) . "\n";

    // 这里可以添加自定义处理逻辑
    // 例如:写入数据库、发送邮件、调用其他API等

    // 示例:提取关键信息
    if (isset($alertData['warnTime'])) {
        echo "告警时间: " . $alertData['warnTime'] . "\n";
    }
    if (isset($alertData['mac'])) {
        echo "设备MAC: " . $alertData['mac'] . "\n";
    }
    if (isset($alertData['address'])) {
        echo "地址: " . $alertData['address'] . "\n";
    }
    if (isset($alertData['hotelName'])) {
        echo "酒店: " . $alertData['hotelName'] . "\n";
    }
});

try {
    // 创建STOMP客户端
    $client = new StompClient($config);

    echo "正在连接WebSocket服务器...\n";

    // 连接服务器
    $client->connect()->then(function () use ($client, $alertHandler) {
        echo "WebSocket连接成功!\n";

        // 获取用户信息(这里需要根据实际情况获取)
        $deptId = '96'; // 替换为实际的用户部门ID

        // 订阅WiFi告警主题
        $client->subscribe("/topic/warn/wifi/{$deptId}", function ($frame) use ($alertHandler) {
            echo "收到WiFi告警\n";
            $alertHandler->handleWifiAlert($frame);
        });

        // 订阅STA告警主题
        $client->subscribe("/topic/warn/sta/{$deptId}", function ($frame) use ($alertHandler) {
            echo "收到STA告警\n";
            $alertHandler->handleStaAlert($frame);
        });

        // 订阅周天告警频道
        $client->subscribe("/topic/warn/airlock/{$deptId}", function ($frame) use ($alertHandler) {
            echo "收到周天告警\n";
            $alertHandler->handleAirlockAlert($frame);
        });

        echo "已订阅所有告警主题\n";

    }, function ($error) {
        echo "连接失败: " . $error->getMessage() . "\n";
    });

    // 运行事件循环
    $client->getLoop()->run();

} catch (\Exception $e) {
    echo "错误: " . $e->getMessage() . "\n";
}

2. 告警消息格式

接收到的告警消息格式如下:

{
  "type": "alert",
  "data": {
    "warnTime": "2023-12-31 15:30:00",
    "mac": "AA:BB:CC:DD:EE:FF",
    "deviceType": "WiFi设备",
    "address": "北京市朝阳区",
    "hotelName": "测试酒店",
    "rooms": "8301",
    "warnSite": "3楼走廊",
    "warnLocation": "北京市朝阳区测试酒店3楼走廊"
  },
  "settings": {
    "useDefaultSound": 1,
    "audioFile": "default.wav",
    "playTimes": 1,
    "display": 1,
    "playInterval": 3,
    "debug": true
  },
  "timestamp": 1703415000
}

3. 关键配置说明

$config = [
    'url' => 'wss://your_ws_domain/',  // WebSocket服务器地址
    'headers' => [                              // 自定义请求头
        'Authorization' => 'Bearer your-jwt-token',
        'accept-version' => '1.2,1.1,1.0',
        'heart-beat' => '4000,4000'
    ],
    'reconnect_delay' => 5000,                  // 重连延迟(毫秒)
    'heartbeat_incoming' => 4000,               // 心跳接收间隔(毫秒)
    'heartbeat_outgoing' => 4000,             // 心跳发送间隔(毫秒)
    'debug' => true,                            // 调试模式
];

高级功能

自动重连

$client = new StompClient([
    'url' => 'wss://your_ws_domain/',
    'reconnect_delay' => 5000,     // 重连间隔(毫秒)
    'debug' => true
]);

多主题订阅

// 获取部门ID
$deptId = '96'; // 替换为实际部门ID

// 订阅多个告警主题
$client->subscribe("/topic/warn/wifi/{$deptId}", $callback);      // WiFi告警
$client->subscribe("/topic/warn/sta/{$deptId}", $callback);      // STA告警
$client->subscribe("/topic/warn/airlock/{$deptId}", $callback); // 周天告警

错误处理

$client->connect()->then(function () {
    // 连接成功处理
    echo "连接成功!\n";
}, function ($error) {
    // 连接失败处理
    echo "连接失败: " . $error->getMessage() . "\n";
});

Docker 使用

快速启动

# 运行接收通知示例
php examples/client.php

# 运行单元测试
./vendor/bin/phpunit tests/

完整示例

查看 examples/ 目录获取更多示例:

  • examples/client.php - 基础告警接收客户端(推荐)
  • examples/alert-client.php - 告警客户端(简化版)
  • examples/advanced-alert-client.php - 高级功能演示

测试

# 功能测试
php test-functionality.php

# 单元测试
./vendor/bin/phpunit tests/

调试技巧

1. 开启调试模式

$config = [
    'url' => 'wss://your_ws_domain/',
    'debug' => true  // 开启调试输出
];

$alertHandler = new AlertMessageHandler([
    'debug' => true  // 开启告警处理器调试
]);

2. 日志记录

$alertHandler->addCallback(function($alertData) {
    // 记录接收到的告警
    error_log("收到告警: " . json_encode($alertData, JSON_UNESCAPED_UNICODE));

    // 您的处理逻辑...
});

3. 连接状态监控

if (!$client->isConnected()) {
    echo "未连接到服务器\n";
} else {
    echo "已连接到服务器\n";
}

⚠️ 注意事项

  1. 认证令牌: 确保使用有效的 JWT 认证令牌
  2. 部门 ID: 替换为实际的用户部门 ID
  3. 网络稳定性: 建议使用自动重连功能确保连接稳定
  4. 消息处理: 告警消息处理函数中避免长时间阻塞操作
  5. 错误处理: 始终设置错误处理函数
  6. 资源释放: 程序退出时调用 $client->disconnect() 释放资源