forked from alexeevdv/react-smpp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.php
84 lines (70 loc) · 3.42 KB
/
server.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<?php
use Carbon\Carbon;
use level23\React\Smpp\Connection;
use level23\React\Smpp\Pdu\BindTransceiver;
use level23\React\Smpp\Pdu\BindTransceiverResp;
use level23\React\Smpp\Pdu\DeliverSm;
use level23\React\Smpp\Pdu\SubmitSm;
use level23\React\Smpp\Pdu\SubmitSmResp;
use level23\React\Smpp\Proto\CommandStatus;
use level23\React\Smpp\Proto\MessageState;
use level23\React\Smpp\Server;
use Firehed\SimpleLogger\Stdout;
use React\EventLoop\Loop;
use React\Socket\SocketServer;
require_once dirname(__DIR__) . '/vendor/autoload.php';
$logger = new Stdout();
$socketServer = new SocketServer('tcp://0.0.0.0:2775');
$smppServer = new Server($socketServer, $logger);
$smppServer->on(Connection::class, static function (Connection $connection) use ($logger) {
$connection->on(BindTransceiver::class, static function (BindTransceiver $pdu) use ($connection, $logger) {
$logger->info('bind_transceiver 1. system_id: {systemId}, password: {password}', [
'systemId' => $pdu->getSystemId(),
'password' => $pdu->getPassword(),
]);
$response = new BindTransceiverResp();
$response->setCommandStatus(CommandStatus::ESME_ROK);
$response->setSystemId($pdu->getSystemId());
$connection->replyWith($response);
});
$connection->on(SubmitSm::class, static function (SubmitSm $pdu) use ($connection, $logger) {
$logger->info('sumbit_sm. source: {source}, destination: {destination}, short_message: {shortMessage}', [
'source' => $pdu->getSourceAddress() !== null ? $pdu->getSourceAddress()->getValue() : null,
'destination' => $pdu->getDestinationAddress()->getValue(),
'shortMessage' => $pdu->getShortMessage(),
]);
$messageId = uniqid('', true);
$submitDate = Carbon::now();
$response = new SubmitSmResp();
$response->setSequenceNumber($pdu->getSequenceNumber());
$response->setCommandStatus(CommandStatus::ESME_ROK);
$response->setMessageId($messageId);
$connection->replyWith($response);
if ($pdu->getRegisteredDelivery()) {
$logger->info('Queuing delivery response.');
// Simulate delivery
Loop::addTimer(2, function () use ($submitDate, $connection, $pdu, $messageId) {
$response = new DeliverSm();
$response->setIsDeliveryReceipt(true);
$response->setServiceType('OMV4');
$response->setSourceAddress($pdu->getDestinationAddress());
$response->setDestinationAddress($pdu->getSourceAddress());
$response->setEsmClass(0x04);
$response->setDeliveryReceiptMessageId($messageId);
$response->setDeliveryReceiptSubmitted(1);
$response->setDeliveryReceiptDelivered(1);
$response->setDeliveryReceiptSubmitDate($submitDate);
$response->setDeliveryReceiptDoneDate($submitDate->addSeconds(2));
$response->setDeliveryReceiptStat(MessageState::DELIVERED);
$response->setDeliveryReceiptErr('000');
$response->setDeliveryReceiptText($pdu->getShortMessage());
$connection->replyWith($response);
});
}
});
$connection->on('error', static function (Throwable $e) use ($connection, $logger) {
$logger->error($e->getMessage(), ['exception' => $e]);
$connection->close();
});
});
Loop::run();