[AsteriskBrasil] Receber SMS Goip e enviar para e-mail

Fernando - NextBilling IP Solutions asterisk em nextbilling.com.br
Domingo Abril 12 08:58:20 BRT 2015


  Caio.

Estou enviando em anexo um daemon em perl, que eu mesmo escrevi e faz 
"quase" a mesma coisa que o deles, rsrs.
O meu é para minhas necessidades, então não tem todas as funcionalidades 
implantadas, mas analisando os logs das requisições que o GoIP vai fazer 
a esse daemon, você consegue pegar os SMS recebidos no CHIP.

Você vai precisar instalar algumas libs adicionais no perl para 
conseguir rodar ele, só olhar os imports.

Aqui tem um exemplo em PHP, de como enviar um SMS pelo goip, enviando a 
solicitação para o daemon em anexo. Peguei o código de uma classe que 
criei e o editor "bagunçou" a identação do código então você vai ter que 
alterar ai para funcionar com seu ambiente.

         $rs = DB::select('name','host','port','password', array(DB::expr('ROUND(RAND() * id)'),'rander'))
             ->from('goip_gw_ports')
             ->where('provider', '=', $id_provedor)
             ->and_where('alive', '=', 1)
             ->order_by('rander') //ORDENANDO POR PORTAS DO GW, ALEATORIO
             ->as_object()
             ->execute();
if(!count($rs)){
$this->sent_ok = FALSE;
$this->debug_text = $this->return_error.";PROVIDER_NOT_FOUND_ROW";
$this->setServerResponse($this->debug_text);
     return FALSE;
}
ignore_user_abort(true);
set_time_limit(0);

$socket = FALSE;
$sms_sent = FALSE;

try{

if (($socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP)) <= 0) {
$this->debug_text = "FAIL Reason: " . socket_strerror($socket);
$this->setServerResponse($this->return_error.";$this->debug_text");
         return FALSE;
}
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => 6, 'usec' => 0));
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array('sec' => 3, 'usec' => 0));

     foreach($rs as $row){
$host = $row->host;
$port = $row->port;
$name = $row->name." $host:$port";
$password = $row->password;
$is_response = FALSE;

$mid = $id_provedor.rand(0,300000);
$msg = str_replace(array("\n","\\n")," ", $this->gw_msg);
$len = strlen($msg);
$number = $this->getNumber();

$this->debug_text = "";
$this->setServerResponse($this->debug_text);

$buf = "MSG $mid $len $msg\n";
         if (@socket_sendto($socket, $buf, strlen($buf), 0, $host, $port) === FALSE){
if (@socket_sendto($socket, $buf, strlen($buf), 0, $host, $port) === FALSE){
$this->setServerResponse($this->return_error.";GOIP [$name] ". socket_strerror(socket_last_error($socket)));
usleep(100000);
                 continue;
}
         }
for ($i = 0; $i < 3; $i++) {
if (($recv_bytes = @socket_recvfrom($socket, $buf, 512, 0, $recv_host, $recv_port)) == FALSE) {
$is_response = FALSE;
                 continue;
} else {
$is_response = TRUE;
                 break;
}
         }
if($is_response === FALSE){
$this->setServerResponse($this->return_error.";UNABLE TO CONNECT GOIP [$name]");
             continue;
}

//EXPECT PASSWORD $mid
if(substr($buf, 0, strlen("PASSWORD $mid")) != "PASSWORD $mid"){
$buf = "DONE $mid\n";
             @socket_sendto($socket, $buf, strlen($buf), 0, $host, $port);
$this->setServerResponse("$buf");
             continue;
}

$buf = "PASSWORD $mid $password\n";
         if (@socket_sendto($socket, $buf, strlen($buf), 0, $host, $port) === FALSE){
if (@socket_sendto($socket, $buf, strlen($buf), 0, $host, $port) === FALSE){
usleep(100000);
$buf = "DONE $mid\n";
                 @socket_sendto($socket, $buf, strlen($buf), 0, $host, $port);
$this->setServerResponse($this->return_error.";GOIP [$name] ". socket_strerror(socket_last_error($socket)));
                 continue;
}
         }

$is_response = FALSE;
         for ($i = 0; $i < 3; $i++) {
if (($recv_bytes = @socket_recvfrom($socket, $buf, 512, 0, $recv_host, $recv_port)) == FALSE) {
$is_response = FALSE;
                 continue;
} else {
$is_response = TRUE;
                 break;
}
         }
if($is_response === FALSE){
$buf = "DONE $mid\n";
             @socket_sendto($socket, $buf, strlen($buf), 0, $host, $port);
$this->setServerResponse($this->return_error.";UNABLE TO GET PASS GOIP [$name]");
             continue;
}
//EXPECT SEND $mid
if(substr($buf, 0, strlen("SEND $mid")) != "SEND $mid"){
$buf2 = "DONE $mid\n";
             @socket_sendto($socket, $buf2, strlen($buf2), 0, $host, $port);
$this->setServerResponse($this->return_error.";INVALID RESPONSE GOIP [$name] $buf");
             continue;
}

send:
$buf2 = "SEND $mid 1 $number\n";
         if (@socket_sendto($socket, $buf2, strlen($buf2), 0, $host, $port) === FALSE){
if (@socket_sendto($socket, $buf2, strlen($buf2), 0, $host, $port) === FALSE){
usleep(100000);
$buf2 = "DONE $mid\n";
                 @socket_sendto($socket, $buf2, strlen($buf2), 0, $host, $port);
$this->setServerResponse($this->return_error.";GOIP [$name] ". socket_strerror(socket_last_error($socket)));
                 continue;
}
         }

$is_response = FALSE;
         for ($i = 0; $i < 3; $i++) {
if (($recv_bytes = @socket_recvfrom($socket, $buf, 512, 0, $recv_host, $recv_port)) == FALSE) {
$is_response = FALSE;
                 continue;
} else {
$is_response = TRUE;
                 break;
}
         }
if($is_response === FALSE){
$buf2 = "DONE $mid\n";
             @socket_sendto($socket, $buf2, strlen($buf2), 0, $host, $port);
$this->setServerResponse($this->return_error.";UNABLE TO RESPONSE GOIP [$name] $buf");
             continue;
}

//EXPECT OK $mid | WAIT $mid D
if(substr($buf, 0, strlen("OK")) == "OK"){
$sms_sent = TRUE;
$this->setServerResponse($buf);
$this->debug_text = $this->getServerResponse();
$this->sent_ok = TRUE;
}elseif(substr($buf, 0, strlen("WAIT")) == "WAIT"){
$time = intval(str_replace("WAIT $mid","",$buf));
             if($time < 0){
$time = 1;
}elseif($time > 5){
$time = 5;
}
usleep($time*1000000);
             goto send;
}else{
$this->setServerResponse($buf);
$this->debug_text = $this->getServerResponse();
$this->sent_ok = FALSE;
}

$buf2 = "DONE $mid\n";
         if (@socket_sendto($socket, $buf2, strlen($buf2), 0, $host, $port) === FALSE){
if (@socket_sendto($socket, $buf2, strlen($buf2), 0, $host, $port) === FALSE){
@socket_sendto($socket, $buf2, strlen($buf2), 0, $host, $port);
}
         }
if($this->sent_ok === FALSE){
continue;
}else{
$this->sent_ok = TRUE;
$sms_sent = TRUE;
             break;
}
     }
if($socket){
@socket_close($socket);
}
return $this->sent_ok;
}catch(Exception $e){
if($socket){
socket_close($socket);
}
if($sms_sent === TRUE){
$this->sent_ok = TRUE;
         return TRUE;
}else{
$this->sent_ok = FALSE;
$this->debug_text = "Send Error [".$e->getLine()."]: " . $e->getMessage();
$this->setServerResponse($this->return_error.";".$this->debug_text);
         return FALSE;
}
}

Atenciosamente / Best regards / Saludos,


P Antes de imprimir pense em sua responsabilidade e  compromisso com o 
Meio Ambiente!



------ Mensagem original ------
De: "Caio Pato" <caiopato em gmail.com>
Para: "Fernando - NextBilling IP Solutions" 
<asterisk em nextbilling.com.br>; "asteriskbrasil" 
<asteriskbrasil em listas.asteriskbrasil.org>
Enviado(s): 12/04/2015 08:41:39
Assunto: Re: [AsteriskBrasil] Receber SMS Goip e enviar para e-mail

>2015-04-12 1:02 GMT-03:00 Fernando - NextBilling IP Solutions
><asterisk em nextbilling.com.br>:
>>  Da uma olhadinha no link 
>>http://www.dbltek.com/pdf/GOIP_SMS_Server_English_Manual.pdf
>>
>>  Nele você vai ver como instalar o goip sms server, ou seja, a 
>>interface que vai vai numa vhost e permite o gerenciamento de SMS.
>>  Imagino que para fazer o que você precisa, você terá que utilizar o 
>>goip_daemon, um app "muito mal" desenvolvido por eles que integra API 
>>do GW com a interface web deles.
>>  Esse daemon fala diretamente com o GoIP, via UDP, e a parte boa, é 
>>que você configura o seu GW para falar com esse daemon e a partir dai 
>>você consegue informações como sinal de cada chip, chamadas recebidas 
>>e efetuadas em tempo real, pode enviar SMS para uma porta em 
>>especifico, e claro receber SMS dessas portas.
>>
>>  Imagino que seja o que você está procurando.
>
>Obrigado! Se funcionasse, seria isso mesmo! Mas o software deles é
>realmente muito mal desenvolvido - e traduzido porcamente. Qualquer
>tentativa está retornando "Cannot get response from process named
>"goipcron""
>
>Agora vou tentar descobrir o que está acontecendo de errado (sem
>contar que na última versão do software não tem como colocar o
>IP/porta - tive que alterar o registro no mySQL na mão).
>
>Apenas para fins de histórico na lista, o link para a versão mais
>atualizada do manual está em:
>http://www.hybertone.com/uploadfile/download/20110412230627598.pdf
>obtido via
>http://www.hybertone.com/en/download3.asp?TId=72
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://asteriskbrasil.org/pipermail/asteriskbrasil/attachments/20150412/19d721c7/attachment-0001.html>
-------------- Próxima Parte ----------
Um anexo não-texto foi limpo...
Nome: assinatura_fernando.jpg
Tipo: image/jpeg
Tamanho: 14513 bytes
Descrição: não disponível
URL: <http://asteriskbrasil.org/pipermail/asteriskbrasil/attachments/20150412/19d721c7/attachment-0001.jpg>
-------------- Próxima Parte ----------
Um anexo não-texto foi limpo...
Nome: goip_daemon
Tipo: application/octet-stream
Tamanho: 5747 bytes
Descrição: não disponível
URL: <http://asteriskbrasil.org/pipermail/asteriskbrasil/attachments/20150412/19d721c7/attachment-0001.obj>


Mais detalhes sobre a lista de discussão AsteriskBrasil