VIDEOCHAT  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

quivr cagi other libs не из main()

Раздел для разработчиков для обсуждения программных и аппаратных продуктов и их реализации.

Модераторы: april22, Zavr2008

Ответить
zoleg
Сообщения: 49
Зарегистрирован: 25 ноя 2011, 12:33
Откуда: UA

quivr cagi other libs не из main()

Сообщение zoleg »

Просмотрел готовые библиотеки qivr и cagi обе работают только в main(), при вызове из других функций ничего не происходит, но ошибок не дает.

Подскажите как, а еще лучше ткните в пример, в котором есть как обратиться к agi из любого места программы. И выполнить примерно такую схему

Код: Выделить всё

int main(int argc, char * argv[]){      
     int ret = EXIT_SUCCESS;
     if (argc <= 1){  
                printf("Не переданы аргументы", 0);
                ret = -1;
                }
      else if (!strcmp(argv[2], "нечто")){           
           opsos_separator(argc, argv);    // Функция которая дергается (она указана в нижней вставке кода)                                                                                             
       } else if (in == "eer"){
            еще_чего(argc, argv);
        }
          
 return (ret);
} 
А opsos_separator(argc, argv); чтоб нормально отработал с agi

Код: Выделить всё

int opsos_separator( int argc, char *argv[]) {

    int ret = EXIT_SUCCESS;
    char ind[4],num[8];
    int n,i;
    
        AGI_TOOLS agi;
	AGI_CMD_RESULT res;
	char dest[100];
        
	AGITool_Init(&agi);
        AGITool_verbose(&agi, &res, AGITool_ListGetVal(agi.agi_vars, "agi_request"), 0);
        
    sscanf(argv[1],"%3s%7s",(char *)&ind,(char *)&num);
    sscanf(argv[1],"%3d%7d",&i,&n);
    //printf("string to string parse - %s %s %s\n",argv[1],ind,num);
    //printf("string to integer parse - %s %d %d\n",argv[1],i,n);
         
  if (argc <= 1){  
                AGITool_verbose(&agi, &res, "Не переданы аргументы", 0);
                //AGITool_Destroy(&agi);
                //ret = -1;
                }
   else
/*--Определяем оператора связи opsos-separator -- */
switch (i){
        case 99: 
                AGITool_set_variable(&agi, &res, "OPSOS", "MTS");
                AGITool_set_variable(&agi, &res, "opsosvoice", "mts");
                break; 
        default:
                    sscanf(argv[1],"%5s%7s",(char *)&ind,(char *)&num);
                    sscanf(argv[1],"%5d%7d",&i,&n);
                    printf("string to integer parse - %s %d %d\n",argv[1],i,n);
                    if (i == 4122){
                                AGITool_set_variable(&agi, &res, "OPSOS", "ZHITOMIR");
                                AGITool_set_variable(&agi, &res, "opsosvoice", "gts");
       // break; 
        } 

AGITool_Destroy(&agi);       
return ret;
}

Пробовал инициализировать в мэйн, а затем передать типа

Код: Выделить всё

opsos_separator(AGI_TOOLS agi, int argc, char *argv[])
Ничего не помогае.

Есть мысли?
Уникальные решения:
- Диспетчерская такси без диспетчеров.
- CDMA модем ZTE AC7810/AC5710+либа к chan_dongle+Астериск = канал ГТС.
- Бесшумные АТС и серверы (1U-3U 19" 12 Вольт, 35 Ват) разработанные специально для диспетчерских служб такси.
Аватара пользователя
Sfinx
Сообщения: 672
Зарегистрирован: 21 июн 2011, 23:40
Откуда: Odessa
Контактная информация:

Re: quivr cagi other libs не из main()

Сообщение Sfinx »

Если нет желания/времени писать свое, то можно рассмотреть использование грамотных оберток поверх astxx. Свои классы для IVR там можно сделать минут за 5, одна проблема - каличная make система (pm), которую я нигде еще не встречал
Rus

-----------
SfinxSoft
http://sfinxsoft.com
zoleg
Сообщения: 49
Зарегистрирован: 25 ноя 2011, 12:33
Откуда: UA

Re: quivr cagi other libs не из main()

Сообщение zoleg »

Рисовать собственную библиотеку конечно не хочется, но с косяками бороться тоже нет желания. Хотя .......... еще не известно что быстрее получиться :?
Уникальные решения:
- Диспетчерская такси без диспетчеров.
- CDMA модем ZTE AC7810/AC5710+либа к chan_dongle+Астериск = канал ГТС.
- Бесшумные АТС и серверы (1U-3U 19" 12 Вольт, 35 Ват) разработанные специально для диспетчерских служб такси.
kasper
Сообщения: 199
Зарегистрирован: 03 авг 2011, 11:00

Re: quivr cagi other libs не из main()

Сообщение kasper »

лано вопрос кажется по моей теме (с cagi не работал и видя пхп куски в коде, как то появляются сомнения в этой библиотеке но ближе к теме )
В исходнике почти ничего не менял
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER:
#include <stdio.h>
#include <stdarg.h>

#include "cagi.h"
FILE * pFile;

int opsos_separator( int argc, char *argv[]);

int main(int argc, char * argv[])
{


int n;
char name [100];
pFile = fopen ("/tmp/govnokod.txt","w");
int ret = 0;
fprintf(pFile,"started\n", 0);
fprintf(pFile,"argv 0=%s;1=%s;2=%s\n",argv[0],argv[1],argv[2]);
if (argc <= 1)
{
fprintf(pFile,"arguments error", 0);
ret = -1;
}
else if (!strcmp(argv[2], "2"))
{
fprintf(pFile,"func called\n", 0);
opsos_separator(argc, argv); // Функция которая дергается (она указана в нижней вставке кода)
}
fprintf(pFile,"closed\n", 0);
fclose(pFile);
return (ret);
}

int opsos_separator( int argc, char *argv[]) {

int ret = 0;
char ind[4],num[8];
int n,i;

AGI_TOOLS agi;
AGI_CMD_RESULT res;
char dest[100];
AGITool_Init(&agi);
AGITool_verbose(&agi, &res, AGITool_ListGetVal(agi.agi_vars, "agi_request"), 0);
sscanf(argv[1],"%3s%7s",(char *)&ind,(char *)&num);
sscanf(argv[1],"%3d%7d",&i,&n);
fprintf(pFile,"prefix = %d;num=%d\n",i,n);

//printf("string to string parse - %s %s %s\n",argv[1],ind,num);
//printf("string to integer parse - %s %d %d\n",argv[1],i,n);
if (argc <= 1)
{
AGITool_verbose(&agi, &res, "Не переданы аргументы", 0);
//AGITool_Destroy(&agi);
//ret = -1;
}
else
/*--Определяем оператора связи opsos-separator -- */
switch (i)
{
case 99:
AGITool_set_variable(&agi, &res, "OPSOS", "MTS");
AGITool_set_variable(&agi, &res, "opsosvoice", "mts");
break;
default:
sscanf(argv[1],"%5s%7s",(char *)&ind,(char *)&num);
sscanf(argv[1],"%5d%7d",&i,&n);
fprintf(pFile,"string to integer parse - %s %d %d\n",argv[1],i,n);
if (i == 4122)
{
AGITool_set_variable(&agi, &res, "OPSOS", "ZHITOMIR");
AGITool_set_variable(&agi, &res, "opsosvoice", "gts");
}
// break;
}

AGITool_Destroy(&agi);
return ret;
}
И всё работает. Незнаю используете ли вы printf в оригинале или только на форум так выложили но если всё настроить по документации по cagi, то через stdin/stdout происходит обмен с сокетом т.е. ваше printf попадает на астериск. Поэтому заменил на fprintf. Однако такое должно было происходить как в main так и в opsos_separator. Ну вроде и больше ничего существенного.

Код: Выделить всё

    -- Executing [100@test-context2:1] NoOp("SIP/704-0000000d", "test agi") in new stack
    -- Executing [100@test-context2:2] AGI("SIP/704-0000000d", "agi://127.0.0.1/govnokod?+99291234567=2") in new stack
agi://127.0.0.1/govnokod?+99291234567=2: agi://127.0.0.1/govnokod?+99291234567=2
    -- <SIP/704-0000000d>AGI Script agi://127.0.0.1/govnokod?+99291234567=2 completed, returning 0
    -- Executing [100@test-context2:3] NoOp("SIP/704-0000000d", "OPSOS=MTS") in new stack
    -- Executing [100@test-context2:4] NoOp("SIP/704-0000000d", "opsosvoice=mts") in new stack
Как видите переменные получили нужные значения
The asterisk is my hero
zoleg
Сообщения: 49
Зарегистрирован: 25 ноя 2011, 12:33
Откуда: UA

Re: quivr cagi other libs не из main()

Сообщение zoleg »

Спасибо выручили. Я действительно юзал printf.
А вообще я с Си не знаком. Так, случай прижал - время отпусков, и глухомань, обратиться не к кому. Чел потерялся ()уехал на лыжах кататься, а тут жизнь заставила четыре похожих функций на Си написать и в исходники программы диспетчеризации такси засунуть. Разнятся в них только аргументы. Если opsos-sepsrstor обозвать main то все работает, а так не хочет.
Спасибо за совет еще раз. Завтра (уже сегодня) попробую.
Уникальные решения:
- Диспетчерская такси без диспетчеров.
- CDMA модем ZTE AC7810/AC5710+либа к chan_dongle+Астериск = канал ГТС.
- Бесшумные АТС и серверы (1U-3U 19" 12 Вольт, 35 Ват) разработанные специально для диспетчерских служб такси.
zoleg
Сообщения: 49
Зарегистрирован: 25 ноя 2011, 12:33
Откуда: UA

Re: quivr cagi other libs не из main()

Сообщение zoleg »

Не! Все равно не получается. Выкладываю оригинал в том виде какой он есть на данный момент.

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include "cagi.h"
 /* 
 */

int main(int argc, char *argv[]) {
//!!!!!!!!!!!!!!!! int opsos_separator(int argc, char *argv[]) {

    int ret = EXIT_SUCCESS;
    char ind[4],num[8];
    int n,i;
    
        AGI_TOOLS agi;
	AGI_CMD_RESULT res;
	char dest[100];
        
	AGITool_Init(&agi);
        AGITool_verbose(&agi, &res, AGITool_ListGetVal(agi.agi_vars, "agi_request"), 0);
        
    sscanf(argv[1],"%3s%7s",(char *)&ind,(char *)&num);
    sscanf(argv[1],"%3d%7d",&i,&n);
    //printf("string to string parse - %s %s %s\n",argv[1],ind,num);
    printf("string to integer parse - %s %d %d\n",argv[1],i,n);
      

        
  if (argc <= 1){  
                AGITool_verbose(&agi, &res, "Не переданы аргументы", 0);
                //AGITool_Destroy(&agi);
                //ret = -1;
                }
   else
/*--Определяем оператора связи opsos-separator -- */
switch (i){
        case 99: 
                AGITool_set_variable(&agi, &res, "OPSOS", "MTS");
                AGITool_set_variable(&agi, &res, "opsosvoice", "mts");
                break; 
        case 50: 
                AGITool_set_variable(&agi, &res, "OPSOS", "MTS");
                AGITool_set_variable(&agi, &res, "opsosvoice", "mts");       
                break;
        case 98: 
                AGITool_set_variable(&agi, &res, "OPSOS", "KIEVSTAR");
                AGITool_set_variable(&agi, &res, "opsosvoice", "djkyevstar");       
                break;
        case 97: 
                AGITool_set_variable(&agi, &res, "OPSOS", "KIEVSTAR");
                AGITool_set_variable(&agi, &res, "opsosvoice", "djkyevstar");       
                break;
        case 96: 
                AGITool_set_variable(&agi, &res, "OPSOS", "KIEVSTAR");
                AGITool_set_variable(&agi, &res, "opsosvoice", "djkyevstar");       
                break;
        case 67: 
                AGITool_set_variable(&agi, &res, "OPSOS", "KIEVSTAR");
                AGITool_set_variable(&agi, &res, "opsosvoice", "djkyevstar");       
                break;
        case 63: 
                AGITool_set_variable(&agi, &res, "OPSOS", "LIFE");
                AGITool_set_variable(&agi, &res, "opsosvoice", "life");       
                break; 
        case 93: 
                AGITool_set_variable(&agi, &res, "OPSOS", "LIFE");
                AGITool_set_variable(&agi, &res, "opsosvoice", "life");       
                break;
        case 68: 
                AGITool_set_variable(&agi, &res, "OPSOS", "BILINE");
                AGITool_set_variable(&agi, &res, "opsosvoice", "biline");       
                break; 
        default:
                    sscanf(argv[1],"%5s%7s",(char *)&ind,(char *)&num);
                    sscanf(argv[1],"%5d%7d",&i,&n);
                    printf("string to integer parse - %s %d %d\n",argv[1],i,n);
                    if (i == 4122){
                                AGITool_set_variable(&agi, &res, "OPSOS", "ZHITOMIR");
                                AGITool_set_variable(&agi, &res, "opsosvoice", "gts");
                                //push_front_connection(&(_cdata_._connections_), &_connection_, i);
                                }
                    else if (i == 4143){
                                 AGITool_set_variable(&agi, &res, "OPSOS", "BERDICHEV");
                                 AGITool_set_variable(&agi, &res, "opsosvoice", "gts");
                                 //push_front_connection(&(_cdata_._connections_), &_connection_, i);
                                 }
                     else if (i == 4142){
                                 AGITool_set_variable(&agi, &res, "OPSOS", "ZHITOMIR");
                                 AGITool_set_variable(&agi, &res, "opsosvoice", "gts");
                                 //push_front_connection(&(_cdata_._connections_), &_connection_, i);
                                 }
                     else if (i == 4146){
                                 AGITool_set_variable(&agi, &res, "OPSOS", "ZHITOMIR");
                                 AGITool_set_variable(&agi, &res, "opsosvoice", "gts");
                                 //push_front_connection(&(_cdata_._connections_), &_connection_, i);
                                 }
                     else if (i == 4148){
                                 AGITool_set_variable(&agi, &res, "OPSOS", "ZHITOMIR");
                                 AGITool_set_variable(&agi, &res, "opsosvoice", "gts");
                                 //push_front_connection(&(_cdata_._connections_), &_connection_, i);
                                 }
                     else if (i == 4150){
                                 AGITool_set_variable(&agi, &res, "OPSOS", "ZHITOMIR");
                                 AGITool_set_variable(&agi, &res, "opsosvoice", "gts");
                                 //push_front_connection(&(_cdata_._connections_), &_connection_, i);
                                 }
                     else if (i == 4149){
                                 AGITool_set_variable(&agi, &res, "OPSOS", "ZHITOMIR");
                                 AGITool_set_variable(&agi, &res, "opsosvoice", "gts");
                                 //push_front_connection(&(_cdata_._connections_), &_connection_, i);
                                 } 
                      else {
                                 AGITool_set_variable(&agi, &res, "OPSOS", "-------");
                                 AGITool_set_variable(&agi, &res, "opsosvoice", "fail");
                                 i =-1;
                                 ret =-1;
                            }
                break;
       // break; 
        } 

AGITool_Destroy(&agi);       
return ret;
}

/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
 
 int main(int argc, char * argv[]){
      
     int ret = EXIT_SUCCESS;
     char *in, *numb;       
      sscanf(argv[2],"%s",(char *)&in,(char *)&numb);
     if (argc <= 1){  
                printf("Не переданы аргументы", 0);
                ret = -1;
                }
      else if (!strcmp(argv[2], "errer")){
           printf("string to string parse - %s\n",argv[2],in,numb);
           printf("Int run");
           
           opsos_sseparator(argc, argv);                                 
                 
                                                
       } else if (in == "eer"){}
     
 return (ret);
}
 
 
 
 
 */!!!!!!!!!!!!!!!! 

Код: Выделить всё

   -- Executing [s@incoming-gsm:4] GotoIf("SIP/200-00000001", "1?:lbl_incoming-gsm_2") in new stack
    -- Executing [s@incoming-gsm:5] Verbose("SIP/200-00000001", "Control transit as "Set CALLERID(num):-10" to SID = 0414366240") in new stack
Control transit as Set CALLERID(num):-10 to SID = 0414366240
    -- Executing [s@incoming-gsm:6] AGI("SIP/200-00000001", "/usr/share/call-taxi/call-taxi, 0414366240, errer") in new stack
    -- Launched AGI Script /usr/share/call-taxi/call-taxi
/usr/share/call-taxi/call-taxi, 0414366240, errer: /usr/share/call-taxi/call-taxi
    -- <SIP/200-00000001>AGI Script /usr/share/call-taxi/call-taxi completed, returning 0
    -- Executing [s@incoming-gsm:7] Verbose("SIP/200-00000001", "4,OPSOS of звонящего BERDICHEV") in new stack
       > OPSOS of звонящего BERDICHEV
    -- Executing [s@incoming-gsm:8] GotoIf("SIP/200-00000001", "0?:lbl_incoming-gsm_3") in new stack
    -- Goto (incoming-gsm,s,21)
Но стоит только раскоментить в местах обозначеных "!!!!!!!!!!!!!!!!" agi не работает

Код: Выделить всё

    -- Executing [s@incoming-gsm:5] Verbose("SIP/200-00000002", "Control transit as "Set CALLERID(num):-10" to SID = 0414366240") in new stack
Control transit as Set CALLERID(num):-10 to SID = 0414366240
    -- Executing [s@incoming-gsm:6] AGI("SIP/200-00000002", "/usr/share/call-taxi/call-taxi, 0414366240, errer") in new stack
    -- Launched AGI Script /usr/share/call-taxi/call-taxi
    -- <SIP/200-00000002>AGI Script /usr/share/call-taxi/call-taxi completed, returning 0
    -- Executing [s@incoming-gsm:7] Verbose("SIP/200-00000002", "4,OPSOS of звонящего ") in new stack
       > OPSOS of звонящего 
    -- Executing [s@incoming-gsm:8] GotoIf("SIP/200-00000002", "0?:lbl_incoming-gsm_3") in new stack
    -- Goto (incoming-gsm,s,21)
Уникальные решения:
- Диспетчерская такси без диспетчеров.
- CDMA модем ZTE AC7810/AC5710+либа к chan_dongle+Астериск = канал ГТС.
- Бесшумные АТС и серверы (1U-3U 19" 12 Вольт, 35 Ват) разработанные специально для диспетчерских служб такси.
kasper
Сообщения: 199
Зарегистрирован: 03 авг 2011, 11:00

Re: quivr cagi other libs не из main()

Сообщение kasper »

Не "Не! Всё равно не получается" а "У меня не получается". А то как будто я что то не правильно написал.
Ближе в вашему вопросу.

Код: Выделить всё

Executing [s@incoming-gsm:6] AGI("SIP/200-00000001", "/usr/share/call-taxi/call-taxi, 0414366240, errer")
У вас argv[2]будет не "errer" а " errer"

Код: Выделить всё

else if (!strcmp(argv[2], "errer")){
И естественно это условие не выполняется и следовательно ваша ф-я opsos_separator даже не выполняется.
З.Ы. Похоже вы делаете первые шаги в "С" подобная конструкция хоть и компилится но доставит сюрпризы ;)

Код: Выделить всё

if (in == "eer")
З.З.Ы Насчёт printf эксперемент показал что оно не мешает выполнению аги но тем не менее это не хорошо.
The asterisk is my hero
zoleg
Сообщения: 49
Зарегистрирован: 25 ноя 2011, 12:33
Откуда: UA

Re: quivr cagi other libs не из main()

Сообщение zoleg »

Спасибо огромное, за потраченное Вами время.

Все работает и даже легло в БД как ожидалось. :D
Просто в диалплане удалил пробел, который был после запятой :oops:

А по поводу "первых шагов в Си", так я этих шагов вообще не делал ;) - случай заставил. (Чуть выше в топике я написал причину). С чем едят PHP - еще помню, а кто такой Си - до сих пор не знаю. :oops:, а в мои годы уже не учиться нужно, а внуков на рыбалку водить ;) .

Спасибо за помощь!!!
Уникальные решения:
- Диспетчерская такси без диспетчеров.
- CDMA модем ZTE AC7810/AC5710+либа к chan_dongle+Астериск = канал ГТС.
- Бесшумные АТС и серверы (1U-3U 19" 12 Вольт, 35 Ват) разработанные специально для диспетчерских служб такси.
Ответить
© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH