<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
php-opcua / opcua-client-ext-reverse-connect example snippets
use PhpOpcua\Client\ClientBuilder;
use PhpOpcua\Client\ExtReverseConnect\ReverseConnectClientFactory;
use PhpOpcua\Client\ExtReverseConnect\ReverseConnectListener;
use PhpOpcua\Client\ExtReverseConnect\ReverseHelloValidator;
use PhpOpcua\Client\Security\SecurityMode;
use PhpOpcua\Client\Security\SecurityPolicy;
$listener = new ReverseConnectListener(
bindHost: '0.0.0.0',
bindPort: 4841,
validator: new ReverseHelloValidator(['urn:my-edge-gateway:server']),
);
$listener->listen();
$session = $listener->accept(timeoutSeconds: 30.0);
$client = (new ReverseConnectClientFactory())->buildClient(
$session,
static fn (ClientBuilder $b) => $b
->setSecurityPolicy(SecurityPolicy::None)
->setSecurityMode(SecurityMode::None),
);
$value = $client->read('ns=2;s=Demo.Counter');
echo $value->getValue() . PHP_EOL;
$client->disconnect();
$listener->close();
use PhpOpcua\Client\ExtReverseConnect\ReverseHelloValidator;
$validator = new ReverseHelloValidator([
'urn:gateway:plc-42',
'urn:gateway:plc-43',
]);
// The listener uses ensureAccepted() internally; you can call it
// yourself on captured frames in tests or audit pipelines.
$validator->ensureAccepted($message); // throws ReverseConnectRejectedException
$validator->isAccepted($message); // bool — non-throwing variant
use PhpOpcua\Client\ExtReverseConnect\Event\ReverseConnectAccepted;
use PhpOpcua\Client\ExtReverseConnect\Event\ReverseConnectRejected;
use PhpOpcua\Client\ExtReverseConnect\Event\ReverseHelloReceived;
$listener = new ReverseConnectListener(
bindHost: '0.0.0.0',
bindPort: 4841,
validator: $validator,
dispatcher: $yourPsr14Dispatcher,
);
// Listeners observe parseable RHEs, accepted sessions, and rejections.
class AuditHandler {
public function onReceived(ReverseHelloReceived $event): void { /* ... */ }
public function onAccepted(ReverseConnectAccepted $event): void { /* ... */ }
public function onRejected(ReverseConnectRejected $event): void {
Log::warning("Rejected {$event->message->serverUri}: {$event->reason}");
}
}
use PhpOpcua\Client\Types\BuiltinType;
use PhpOpcua\Client\Types\NodeId;
use PhpOpcua\Client\Types\Variant;
$trigger = (new ClientBuilder())
->setSecurityPolicy(SecurityPolicy::None)
->setSecurityMode(SecurityMode::None)
->connect('opc.tcp://localhost:4840/UA/TestServer');
$trigger->call(
NodeId::string(2, 'TestServer/ReverseConnect'),
NodeId::string(2, 'TestServer/ReverseConnect/StartReverseConnect'),
[
new Variant(BuiltinType::String, 'host.docker.internal'),
new Variant(BuiltinType::UInt16, $listenerPort),
],
);