pikart/goip

Goip 服务器和客户端

v1.0.5 2022-06-15 14:15 UTC

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 实例,它接受四个参数

  1. $serverClass (string) - 服务器实现 \Pikart\Goip\Server::class
  2. $host (string) - 服务器主机地址
  3. $port (int) - 服务器端口
  4. $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
}