Hyperf对接SCADA
SCADA 对接的核心是协议不同 SCADA 系统暴露不同接口。以下是 PHP/Hyperf 生态里各协议最好的库 --- 库推荐总览 ┌────────────┬─────────────────────────┬──────────────────────────────────────────┐ │ 协议 │ 库 │ 适用场景 │ ├────────────┼─────────────────────────┼──────────────────────────────────────────┤ │ MQTT │ simps/mqtt │ Ignition、AVEVA、自研 SCADA 走 MQTT 推送 │ ├────────────┼─────────────────────────┼──────────────────────────────────────────┤ │ Modbus TCP │ aldas/modbus-tcp-client │ 直连 PLC/SCADA Modbus 接口 │ ├────────────┼─────────────────────────┼──────────────────────────────────────────┤ │ OPC UA │ php-opcua/opcua-client │ 西门子 WinCC、Kepware、现代 SCADA │ ├────────────┼─────────────────────────┼──────────────────────────────────────────┤ │ HTTP REST │ Hyperf 内置 Guzzle │ Ignition WebDev、RapidSCADA REST API │ └────────────┴─────────────────────────┴──────────────────────────────────────────┘ --- 方案一MQTT最主流强烈推荐 现代 SCADAIgnition Cirrus Link、AVEVA、自研基本都支持 MQTT Sparkplug B 推送数据。 simps/mqtt — 专为 Swoole/Hyperf 协程设计支持 MQTT3.1/3.1.1/5.0是 PHP 生态最好的 MQTT 库。composerrequire simps/mqtt Hyperf 中订阅 SCADA 数据?php namespace App\Process;use Hyperf\Process\AbstractProcess;use Simps\MQTT\Client;use Simps\MQTT\Config\ClientConfig;class ScadaMqttProcess extends AbstractProcess{public string$namescada-mqtt-subscriber;publicfunctionhandle(): void{$config(new ClientConfig())-setUserName(scada_user)-setPassword(secret)-setKeepAlive(60)-setClientId(hyperf-scada-.uniqid())-setCleanSession(true);$clientnew Client(192.168.1.10,1883,$config);$client-connect();// 订阅 SCADA Tag 主题Sparkplug B 格式$client-subscribe([spBv1.0/factory/DDATA/plc1/#[qos1],scada//temperature[qos0],]);while(true){$data$client-receive();if($data){$this-handleMessage($data[topic],$data[message]);}}}privatefunctionhandleMessage(string$topic, string$payload): void{$datajson_decode($payload,true);// 存入 Redis / 数据库\Hyperf\Support\make(\App\Service\ScadaDataService::class)-store($topic,$data);}}注册进程config/autoload/processes.phpreturn[App\Process\ScadaMqttProcess::class,];发布控制指令回 SCADA?php namespace App\Service;use Simps\MQTT\Client;use Simps\MQTT\Config\ClientConfig;class ScadaControlService{publicfunctionsendCommand(string$tag, mixed$value): void{$config(new ClientConfig())-setClientId(hyperf-cmd-.uniqid());$clientnew Client(192.168.1.10,1883,$config);$client-connect();$client-publish(topic:scada/commands/{$tag}, message: json_encode([value$value,tstime()]), qos:1);$client-close();}}--- 方案二OPC UA西门子 WinCC / Kepware php-opcua/opcua-client — 纯 PHP 实现 OPC UA 二进制协议无需 C 扩展可直接跑在 Swoole 协程里。composerrequire php-opcua/opcua-client?php namespace App\Service;use OpcUa\Client\Client;use OpcUa\Client\NodeId;class WinccScadaService{publicfunctionreadNode(string$nodeId): mixed{$clientnew Client(opc.tcp://192.168.1.20:4840);$client-connect();$client-createSession();$client-activateSession();$result$client-read(new NodeId($nodeId));$client-closeSession();$client-disconnect();return$result-getValue();}}--- 方案三HTTP RESTIgnition / RapidSCADA 直接用 Hyperf 内置的 Guzzle 协程客户端无需额外库?php namespace App\Service;use Hyperf\Guzzle\ClientFactory;class IgnitionScadaService{publicfunction__construct(private ClientFactory$clientFactory){}publicfunctionreadTags(array$tagPaths): array{$client$this-clientFactory-create([base_urihttp://192.168.1.10:8088,auth[admin,password],timeout3.0,]);$resp$client-post(/data/tag/read,[json[paths$tagPaths],]);returnjson_decode($resp-getBody()-getContents(),true);}}--- 选哪个 你的 SCADA 是什么品牌 ├── Ignition(Inductive Automation)→ MQTT(simps/mqtt)或 REST ├── 西门子 WinCC / TIA Portal → OPC UA(php-opcua/opcua-client)├── Kepware / KEPServerEX → OPC UA ├── AVEVA / Wonderware → MQTT 或 OPC UA ├── 自研 / 国产 SCADA → 看它支持什么协议优先 MQTT └── 老系统只有 Modbus → aldas/modbus-tcp-client 通用建议优先选 MQTT它是工业 IoT 的事实标准simps/mqtt 与 Hyperf 协程天然契合性能最好。