вопрос про php, получение переменной из ответа "сервиса" [РЕШЕНО]

Автор zCirill, 25 июня 2014, 16:19:29

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

zCirill

добрый день, подскажите пожалуйста.
есть вот такой "код" ))


$sconn = fsockopen ($strhost, $strport, &$errno, &$errstr, $timeout) or die("Connection to $strhost:$strport failed");

if (!$sconn) { echo "$errstr ($errno)<br>\n"; }

  else {

  fputs ($sconn, "Action: DBGet\r\n");
  usleep(50000);
  fputs ($sconn, "Family: AMPUSER/250\r\n");
  fputs ($sconn, "Callerid: $cid\r\n");
  fputs ($sconn, "Key: device\r\n");
  usleep (500);


.......


  fclose ($sconn);

  }



прицепляется к сервису, отдает команды action лалала
в ответ ему должно прилететь что то вроде

Event: DBGetResponse
Family: AMPUSER/250
Key: device
Val: 105

и мне нужно дальше в коде использовать значение Val:
как это значение получить в переменную?


Defman

#1
Вся эта многострочная строка в какую-нибудь переменную записывается? Можно регуляркой вытащить Val да и вообще любое значение с помощью preg_replace_callback.
Прим:

$keys_all = [];
function callback_1($input) {
$keys_all[$input[1]] = $input[2];
}
preg_replace_callback("/^([^:]+):\s(.+)\n$/isu","callback_1",$ответ_сервиса);

Соответственно если прочитать ман по preg_replace_callback, то в $input[1] - первые скобки, $input[2] - вторые. $input[0] - все вхождение.
По теории работать должно)
Тогда в $keys_all['Val'] будет нужное тебе значение.
Ну или:

$val = preg_replace("/^Val:\s([0-9]+)$/isu", "$1", $ответ_сервиса);
:)

zCirill

Цитата: Defman от 25 июня 2014, 16:27:44
Вся эта многострочная строка в какую-нибудь переменную записывается?

нет )
поскажите плз как записать.

Defman

:)

zCirill

никак видимо.

в php я мало что понимаю )

нужно звонить clic2call с сайта через астериск.
менеджер тыркает на карточку клиента и жмет позвонить клиенту.
в php передается внутренний номер менеджера и номер куда нужно совершить звонок.

положение осложняется тем, что менеджер приходя на работу регистрируется на любом телефонном аппарате, и совершает звонки и принимает звонки на свой телефонный номер, а не на номер аппарата.

нашел кусок кода который мне позволяет присоединится к сервису.

понимаю как отправить запрос в сервис.
не понимаю как получить ответ на обработку.

собственно скрипт

дергается так http://domain.com/callback.php?p=1&c=OUT_EXT2&cid=250&num=84951234567

внутренний номер пользователя 250
номер куда звонит  84951234567

перед тем как позвонить, нужно определить на каком аппарате пользователь зарегистрирован и подставить его в совершаемый звонок


<?php

# --- define globals ---
$strhost "192.168.0.10";
$strport "5038";
$timeout "10";
$num=$_REQUEST['num'];
$cid=$_REQUEST['cid'];
$c=$_REQUEST['c'];
$p=$_REQUEST['p'];

$errno=;
$errstr=;


#присоединяемся к сервису
$sconn fsockopen ($strhost$strport, &$errno, &$errstr$timeout) or die("Connection to $strhost:$strport failed");

if (!
$sconn) { echo "$errstr ($errno)<br>\n"; } 

  else {

#авторизация, аутенфикация

  
fputs ($sconn"Action: login\r\n");
  
fputs ($sconn"Username: c2call\r\n");
  
fputs ($sconn"Secret: FrUyHn6FSaX\r\n");
  
fputs ($sconn"Events: off\r\n\r\n");
  
usleep(500);

#в устанновленном соединении астериск шлет ответ, мол все ок, проверку прошел. это видно если подключатся к астериск ami через телнет.

#вот здесь идет вызов для определения номера аппарата - не понятно куда получить ответ и как обработать, чтобы получить Val  
  
fputs ($sconn"Action: DBGet\r\n");
  
usleep(50000);
  
fputs ($sconn"Family: AMPUSER/$cid\r\n");
  
fputs ($sconn"Key: device\r\n\r\n");  
  
usleep (500);

#в ответ, в установленном соединении астериск шлет что то типа 
#Event: DBGetResponse
#Family: AMPUSER/250
#Key: device
#Val: 105

#и надо как то выковырять  Val и подставить его в $val 
  
#собственно сам звонок. если явно подставлять значения звонки совершаются.
  
  
fputs ($sconn"Action: Originate\r\n");
  
fputs ($sconn"Channel: SIP/$val\r\n");
  
fputs ($sconn"Callerid: $val\r\n");
  
fputs ($sconn"Timeout: 15000\r\n");
  
fputs ($sconn"Context: $c\r\n");
  
fputs ($sconn"Exten: $num\r\n");
  
fputs ($sconn"Priority: $p\r\n\r\n");
  
fputs ($sconn"Async: yes\r\n\r\n" );
  
fputs ($sconn"Action: Logoff\r\n\r\n");
  
usleep (500);

  
fclose ($sconn);

  } 

?>


zCirill

подсказали вот

  while (!feof($sconn)) {
         $data = fgets($sconn);
         $line = explode(" ",$data);
         if(trim($line[0]) == 'Val:') break;
         }

  $val = trim($line[1]);