pikart / goip
Goip 服务器和客户端
v1.0.5
2022-06-15 14:15 UTC
Requires
- php: >=7.4
- guzzlehttp/guzzle: ^6.5
- react/datagram: ^1.5
Requires (Dev)
- phpmd/phpmd: ^2.10
- phpstan/phpstan: ^0.12.88
- phpstan/phpstan-strict-rules: ^0.12.9
- phpunit/phpunit: ^9
- squizlabs/php_codesniffer: ^3.6
This package is auto-updated.
Last update: 2024-09-20 21:27:22 UTC
README
此软件包允许使用 Hybertone / Dbltek 公司的 GSM / VOIP Goip1、Goip4、Goip8、Goip16 网关发送和接收 SMS 消息。可以通过 UDP 协议使用 php sockets 或 reactphp 接收 SMS。SMS 可以通过 UDP 或 HTTP 发送。该软件包在具有四个 Goip16 网关(64 线路)连接的生产环境中使用。此外,还可以接收有关单个 GSM 网关(线路)状态和状态的基本信息。
要求
PHP >= 7.4
安装
composer require pikart/goip
服务器使用说明
要开始接收来自 Goip 网关的消息,您需要创建并启动一个服务器。
有两种实现方式
\Pikart\Goip\UdpServer::class // php sockets \Pikart\Goip\ReactServer::class // reactphp
使用 php sockets 创建服务器
$server = \Pikart\Goip\ServerFactory::default( \Pikart\Goip\UdpServer::class, '0.0.0.0', 333);
使用 reactphp 创建服务器
$server = \Pikart\Goip\ServerFactory::default( \Pikart\Goip\ReactServer::class, '0.0.0.0', 333);
方法 \Pikart\Goip\ServerFactory::default() : Server 创建新的 Server 实例,它接受四个参数
- $serverClass (string) - 服务器实现 \Pikart\Goip\Server::class
- $host (string) - 服务器主机地址
- $port (int) - 服务器端口
- $args (array) 可选 - 额外参数
服务器允许通过观察者模式监听从 Goip 收到的消息。
注册消息监听器
use Pikart\Goip\ServerFactory; use Pikart\Goip\ReactServer; use Pikart\Goip\Message; use Pikart\Goip\Messages\RequestMessage; use Pikart\Goip\Messages\ReceiveMessage; $server = ServerFactory::default( ReactServer::class, '0.0.0.0', 333); // Listening to all incoming messages $listenerId1 = $server->listenAll(function (Message $message){ // Request message if( $message instanceof RequestMessage) { var_dump( $message ); } // Receive message if( $message instanceof ReceiveMessage) { var_dump( $message ); } // Message var_dump( $message ); }); // Listening to a concrete message $listenerId2 = $server->listen( RequestMessage::class, function (RequestMessage $message){ var_dump( $message ); }); $listenerId3 = $server->listen( ReceiveMessage::class, function (ReceiveMessage $message){ var_dump( $message ); }); // Remove listener 1 $server->off($listenerId1); // Remove listener 2 $server->off($listenerId2); // Remove listener 3 $server->off($listenerId3);
强烈建议使用外部队列系统,如 RabbitMQ 或 Laravel Queues 来处理传入的消息。
服务器启动
use Pikart\Goip\ServerFactory; use Pikart\Goip\ReactServer; use Pikart\Goip\Message; $server = ServerFactory::default( ReactServer::class, '0.0.0.0', 333); // Listening to all incoming messages $server->listenAll(function (Message $message){ // Message var_dump( $message ); }); $server->run();
消息类型
\Pikart\Goip\Messages\RequestMessage::class // Keep Alive packets with gateway (line) information \Pikart\Goip\Messages\DeliverMessage::class // SMS delivery report \Pikart\Goip\Messages\HangupMessage::class // End telephone call \Pikart\Goip\Messages\ReceiveMessage::class // Incoming SMS \Pikart\Goip\Messages\RecordMessage::class // Start a phone call \Pikart\Goip\Messages\StateMessage::class // Change of gate (line) status \Pikart\Goip\Messages\NotSupportedMessage::class // Message not supported by package \Pikart\Goip\Message::class // Main abstract class
消息属性和属性
use Pikart\Goip\ServerFactory; use Pikart\Goip\ReactServer; use Pikart\Goip\Message; use Pikart\Goip\Messages\ReceiveMessage; $server = ServerFactory::default( ReactServer::class, '0.0.0.0', 333); $server->listenAll(function (Message $message){ // Array of all attributes $attributes = $message->attributes(); // Pikart\Goip\Request::class Access to raw request from goip $request = $message->request(); // Show remote host and port $remoteHost = $message->request()->host(); $remotePort = $message->request()->port(); }); // ReceiveMessage $server->listen( ReceiveMessage::class, function ( ReceiveMessage $message ) { // Received text message $smsTextMessage = $message->msg(); // Sender phone number $phoneNumber = $message->srcnum(); // Password from goip $goipPassword = $message->password(); // Show remote host and port $remoteHost = $message->request()->host(); $remotePort = $message->request()->port(); });
发送消息
通过 UDP 套接字发送
use Pikart\Goip\Sms\SocketSms; /** * SocketSms constructor. * * @param string $host Goip host * @param int $port Goip port * @param string $id Unique sending session id * @param string $password Goip password * @param array|null $options */ $sms = new SocketSms( '192.168.0.11', 9991, 123, 'password', ['timeout' => 30] ); /** * Send sms * * @param string $number Phone number * @param string $message Text message * @return array Response from goip * @throws GoipException * @throws SocketException * @throws TimeoutException */ $response = $sms->send('999999999', 'text message'); var_dump( $response ); // response from goip array(4) { ["sendid"]=>string(3) "123" // unique sendid ["telid"]=>string(1) "1" // session id ["sms_no"]=> string(1) "0" // sms count number ["raw"]=>string(12) "OK 123 1 0" // raw response }
通过 HTTP 发送
use Pikart\Goip\Sms\HttpSms; /** * HttpSms constructor. * * @param string $host Goip host for example: http://192.168.0.11 * @param int $line Goip line number, * @param string $login Goip login * @param string $password Goip password */ $sms = new HttpSms('http://192.168.0.11',1, 'admin', 'admin'); /** * Send sms * * @param string $number Phone number * @param string $message Text message * @return array * @throws GoipException */ $response = $sms->send('999999999', 'text message'); var_dump( $response ); array(3) { ["id"]=> string(8) "0000021f" // send id ["raw"]=> string(45) "Sending,L1 Send SMS to:999999999; ID:0000021f" // Raw response ["status"]=> string(4) "send" // send status }