За последние 24 часа нас посетили 17833 программиста и 1719 роботов. Сейчас ищут 984 программиста ...

confbridge AMI, объявление переменной на каждую строчку.

Тема в разделе "Прочие вопросы по PHP", создана пользователем zazabalakhashvili, 8 июл 2015.

  1. zazabalakhashvili

    zazabalakhashvili Новичок

    С нами с:
    8 июл 2015
    Сообщения:
    11
    Симпатии:
    0
    здравствуйте.

    пишу скрипт для приложения confbridge входящий в asterisk для мониторинга участников.

    на данный момент информация берется через AMI и отображается примерно так.


    Conference: 1
    CallerIDNum: 202
    CallerIDName: User2
    Channel: SIP/202-00000022
    Admin: No
    MarkedUser: No
    WaitMarked: No
    EndMarked: No
    Waiting: No
    Muted: No
    AnsweredTime: 12
    ListItems: 1

    мне нужно, чтобы все эти строчки сохранить в отдельные переменные и вывести только CallerIDNum.

    помогите пожалуйста как это лучше сделать?


    Код (PHP):
    1. <?php
    2. $ami = fsockopen("127.0.0.1", 5038, $errno, $errstr);
    3. if (!$ami) {
    4. echo "ERROR: $errno - $errstr<br />\n";
    5. } else {
    6. fwrite($ami, "Action: Login\r\nUsername: monast_user\r\nSecret:
    7. asteriskami\r\nEvents: off\r\n\r\n");
    8. fwrite($ami, "Action: ConfbridgeList\r\nConference: 1\r\n\r\n");
    9. sleep(1);
    10. $record = fread($ami,1024);
    11. $record = explode("\r\n", $record);
    12. echo "<META HTTP-EQUIV=Refresh CONTENT=\"20\">";
    13. echo "<table border=\"1\" style='color: black;'>";
    14. foreach($record as $value){
    15.     if(!strlen(stristr($value,'Asterisk'))>0
    16.     && !strlen(stristr($value,'Response'))>0
    17.     && !strlen(stristr($value,'Message'))>0
    18.     && !strlen(stristr($value,'Event'))>0
    19.     && strlen(strpos($value,' '))>0)
    20.     php_table($value);;
    21. }
    22.  
    23. echo "</table>";
    24.  
    25. fclose($ami);
    26. }
    27.  
    28. function php_table($value){
    29.     $row1 = true;
    30.     $value = explode("  ", $value);
    31.     foreach($value as $field){
    32.         if($row1){
    33.             echo "<tr><td>".$field."</td>";
    34.             $row1 = false;
    35.         }
    36.         else{
    37.             echo "<td>".$field."</td></tr>";
    38.  
    39.             $row1 = true;
    40.  
    41.         }
    42.     }
    43. }
    44. ?>
    спасибо.

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    http://sandbox.onlinephpfunctions.com/code/a56b27ea7859a6ea ... af77355aea
    Код (PHP):
    1. $text = <<<TXT
    2. Conference: 1
    3. CallerIDNum: 202
    4. CallerIDName: User2
    5. Channel: SIP/202-00000022
    6. Admin: No
    7. MarkedUser: No
    8. WaitMarked: No
    9. EndMarked: No
    10. Waiting: No
    11. Muted: No
    12. AnsweredTime: 12
    13. ListItems: 1
    14. TXT;
    15. $params = [];
    16. foreach (explode("\n", $text) as $str) {
    17.    $str_parts = explode(":", $str);
    18.    $params[$str_parts[0]] = trim($str_parts[1]);
    19. } 
    20.  
    21. var_export($params);
    22.  
    Результат работы:
    Код (Text):
    1.  
    2. array (
    3.   'Conference' => '1',
    4.   'CallerIDNum' => '202',
    5.   'CallerIDName' => 'User2',
    6.   'Channel' => 'SIP/202-00000022',
    7.   'Admin' => 'No',
    8.   'MarkedUser' => 'No',
    9.   'WaitMarked' => 'No',
    10.   'EndMarked' => 'No',
    11.   'Waiting' => 'No',
    12.   'Muted' => 'No',
    13.   'AnsweredTime' => '12',
    14.   'ListItems' => '1',
    15. )
    Надеюсь дальше разберётесь, что делать
     
  3. zazabalakhashvili

    zazabalakhashvili Новичок

    С нами с:
    8 июл 2015
    Сообщения:
    11
    Симпатии:
    0
    извените, несовсем понял.

    мне нужно, чтобы значение переменной CallerIDNum выводилось на странице, их может быть несколько, взависимости сколько участников на данный момент в конференции.

    вообще максимум мне нужны две переменные, CallerIDNum и Channel.

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


    спасибо
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ууууу как плохо с теорией. Я же разжевал, осталось переварить.
    В конец моего кода вставьте вместо var_export
    Код (PHP):
    1. echo $params["CallerIDNum"], "<br>", $params["Channel"];
    2.  
     
  5. zazabalakhashvili

    zazabalakhashvili Новичок

    С нами с:
    8 июл 2015
    Сообщения:
    11
    Симпатии:
    0
    как это можно связать с этим кодом?

    Код (Text):
    1.  
    2.  
    3. <?php
    4. $ami = fsockopen("127.0.0.1", 5038, $errno, $errstr);
    5. if (!$ami) {
    6. echo "ERROR: $errno - $errstr<br />\n";
    7. } else {
    8. fwrite($ami, "Action: Login\r\nUsername: monast_user\r\nSecret: asteriskami\r\nEvents: off\r\n\r\n");
    9. fwrite($ami, "Action: ConfbridgeList\r\nConference: 1\r\n\r\n");
    10. sleep(1);
    11. $record = fread($ami,1024);
    12. $record = explode("\r\n", $record);
    13. echo "<META HTTP-EQUIV=Refresh CONTENT=\"20\">";
    14. echo "<table border=\"1\" style='color: black;'>";
    15. foreach($record as $value){
    16.     if(!strlen(stristr($value,'Asterisk'))>0
    17.     && !strlen(stristr($value,'Response'))>0
    18.     && !strlen(stristr($value,'Message'))>0
    19.     && !strlen(stristr($value,'Event'))>0
    20.     && strlen(strpos($value,' '))>0)
    21.     php_table($value);;
    22. }
    23.  
    24. echo "</table>";
    25.  
    26. fclose($ami);
    27. }
    28.  
    29. function php_table($value){
    30.     $row1 = true;
    31.     $value = explode("  ", $value);
    32.     foreach($value as $field){
    33.         if($row1){
    34.             echo "<tr><td>".$field."</td>";
    35.             $row1 = false;
    36.         }
    37.         else{
    38.             echo "<td>".$field."</td></tr>";
    39.  
    40.             $row1 = true;
    41.  
    42.         }
    43.     }
    44. }
    45. ?>
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну если вы из своего сокета читаете тот текст, который привели, то используйте тот же метод на нём. Посмотрите, что читается из этого сокета. Я вам решил задачу
     
  7. zazabalakhashvili

    zazabalakhashvili Новичок

    С нами с:
    8 июл 2015
    Сообщения:
    11
    Симпатии:
    0
    при вызове моей функции, на странице отображается тот текст который я писал выше, мне надо чтобы все эти строчки были в переменных
     
  8. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    :D mkramer только не нервничай..
     
  9. zazabalakhashvili

    zazabalakhashvili Новичок

    С нами с:
    8 июл 2015
    Сообщения:
    11
    Симпатии:
    0
    я не понял в чем тут проблема, помогите пожалуйста.

    Код (Text):
    1.  
    2.  
    3. <?php
    4. $ami = fsockopen("127.0.0.1", 5038, $errno, $errstr);
    5. if (!$ami) {
    6. echo "ERROR: $errno - $errstr<br />\n";
    7. } else {
    8. fwrite($ami, "Action: Login\r\nUsername: monast_user\r\nSecret: asteriskami\r\nEvents: off\r\n\r\n");
    9. fwrite($ami, "Action: ConfbridgeList\r\nConference: 1\r\n\r\n");
    10. sleep(1);
    11. $record = fread($ami,1024);
    12. $record = explode("\r\n", $record);
    13. echo "<META HTTP-EQUIV=Refresh CONTENT=\"20\">";
    14. echo "<table border=\"1\" style='color: black;'>";
    15. foreach($record as $value){
    16.     if(!strlen(stristr($value,'Asterisk'))>0
    17.     && !strlen(stristr($value,'Response'))>0
    18.     && !strlen(stristr($value,'Message'))>0
    19.     && !strlen(stristr($value,'Event'))>0
    20.     && strlen(strpos($value,' '))>0)
    21.     //php_table($value);;
    22. }
    23. $text = <<<TXT
    24. Conference
    25. CallerIDNum
    26. CallerIDName
    27. Channel
    28. Admin
    29. MarkedUser
    30. WaitMarked
    31. EndMarked
    32. Waiting
    33. Muted
    34. AnsweredTime
    35. ListItems
    36. TXT;
    37. $params = [];
    38. foreach (explode("\n", $text) as $str) {
    39.    $str_parts = explode(":", $str);
    40.    $params[$str_parts[0]] = trim($str_parts[1]);
    41. echo $params["CallerIDNum"], "<br>", $params["Channel"];
    42. echo "</table>";
    43.  
    44. fclose($ami);
    45. }
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Проблема одна: ваши нулевые знания php, и желание чегой-то там творить. Что возвращается из сокета?
    Код (Text):
    1. $record = explode("\r\n", $record);
    замените на
    Код (Text):
    1.  
    2. $record = explode("\r\n", $record);
    3. var_export($record); die;
    и покажите, чего выведет. А тему, по ходу, надо переносить в "сделайте за меня"
     
  11. zazabalakhashvili

    zazabalakhashvili Новичок

    С нами с:
    8 июл 2015
    Сообщения:
    11
    Симпатии:
    0
    здравствуйте.

    вот вывод что возвращает сокет.

    array ( 0 => 'Asterisk Call Manager/2.7.0', 1 => 'Response: Success', 2 => 'Message: Authentication accepted', 3 => '', 4 => 'Response: Success', 5 => 'EventList: start', 6 => 'Message: Confbridge user list will follow', 7 => '', 8 => 'Event: ConfbridgeList', 9 => 'Conference: 1', 10 => 'CallerIDNum: 202', 11 => 'CallerIDName: User2', 12 => 'Channel: SIP/202-0000002d', 13 => 'Admin: No', 14 => 'MarkedUser: No', 15 => 'WaitMarked: No', 16 => 'EndMarked: No', 17 => 'Waiting: No', 18 => 'Muted: No', 19 => 'AnsweredTime: 16', 20 => '', 21 => 'Event: ConfbridgeListComplete', 22 => 'EventList: Complete', 23 => 'ListItems: 1', 24 => '', 25 => '', )


    как из кода видно, я обнулил все события которые не косаются конференции, и оставил только те которые непосредственно отвечают за конфу.

    эти значения не статические, они все время меняются
     
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Код (PHP):
    1. $params = [];
    2.  
    3. foreach ($record as $r) {
    4.    $str_parts = explode(":", $r);
    5.    // Строки без двоеточия нам не интересны 
    6.    if (count($str_parts) < 2)
    7.        continue;
    8.    $params[$str_parts[0]] = trim($params[$str_parts[1]]);
    9. }
    10. echo $params["CallerIDNum"], "<br>", $params["Channel"];
    11.  
    Как видите, практически тот же код. Учите php, прежде чем возиться с сокетами и прочей фигнёй. А то копипастите код, а потом даже элементарные изменения внести не можете. Если и сейчас не понимаете, то я умываю руки.
     
  13. zazabalakhashvili

    zazabalakhashvili Новичок

    С нами с:
    8 июл 2015
    Сообщения:
    11
    Симпатии:
    0
    вот вродебы сделал как надо, но почемуто не работает.

    Код (Text):
    1.  
    2.  
    3.  
    4. <?php
    5. $ami = fsockopen("127.0.0.1", 5038, $errno, $errstr);
    6. if (!$ami) {
    7. echo "ERROR: $errno - $errstr<br />\n";
    8. } else {
    9. fwrite($ami, "Action: Login\r\nUsername: monast_user\r\nSecret: asteriskami\r\nEvents: off\r\n\r\n");
    10. fwrite($ami, "Action: ConfbridgeList\r\nConference: 1\r\n\r\n");
    11. sleep(1);
    12. $record = fread($ami,1024);
    13. $record = explode("\r\n", $record);
    14. $params = [];
    15.  
    16. foreach ($record as $r) {
    17.     $str_parts = explode(":", $r);
    18.     if (count($str_parts) < 2)
    19.         continue;
    20.     $params[$str_parts[0]] = trim($params[$str_parts[1]]);
    21. }
    22. echo $params["CallerIDNum"], "<br>", $params["Channel"];
    23. fclose($ami);
    24. }
    25.  
    26. ?>
     
  14. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Пишет ли ошибки? Какие? Включены ли ошибки? Какая версия php (мой код на php 5.4 минимум рассчитан, ниже - надо заменить $params = [] на $params = array ())

    Добавлено спустя 18 минут 39 секунд:
    А, я опечатался.
    Код (Text):
    1. $params[$str_parts[0]] = trim($params[$str_parts[1]]);
    замените
    Код (Text):
    1. $params[$str_parts[0]] = trim($str_parts[1]);
     
  15. zazabalakhashvili

    zazabalakhashvili Новичок

    С нами с:
    8 июл 2015
    Сообщения:
    11
    Симпатии:
    0
    Parse error: syntax error, unexpected T_STRING in Z:\home\luwrainn.org\www\confbridge1.php on line 13.

    строка 12 у меня

    Код (Text):
    1.  
    2. foreach ($record as $r) {
     
  16. zazabalakhashvili

    zazabalakhashvili Новичок

    С нами с:
    8 июл 2015
    Сообщения:
    11
    Симпатии:
    0
    все вродебы разобрался, только одна проблемма, если в конференции больше одного участника скрипт показывает только одного последнего.
     
  17. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну блин, напишите уже алгоритм, или заплатите кому-нибудь. Но это вам во фриланс. Я и так за вас пол работы бесплатно сделал.
     
  18. zazabalakhashvili

    zazabalakhashvili Новичок

    С нами с:
    8 июл 2015
    Сообщения:
    11
    Симпатии:
    0
    хорошо, где можно обговорить этот вопрос?
     
  19. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Напишите во фриланс. Я сейчас занят сильно, сам не возьмусь