ВидеоКонф(ВКС)  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

quivr cagi other libs не из main()

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

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

quivr cagi other libs не из main()

Сообщение zoleg » 07 янв 2012, 14:43

Просмотрел готовые библиотеки 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 Ват) разработанные специально для диспетчерских служб такси.
zoleg
 
Сообщений: 49
Зарегистрирован: 25 ноя 2011, 12:33
Откуда: UA

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

Сообщение Sfinx » 07 янв 2012, 20:28

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

-----------
SfinxSoft
http://sfinxsoft.com
Аватар пользователя
Sfinx
 
Сообщений: 672
Зарегистрирован: 21 июн 2011, 23:40
Откуда: Odessa

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

Сообщение zoleg » 07 янв 2012, 20:42

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

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

Сообщение kasper » 08 янв 2012, 01:09

лано вопрос кажется по моей теме (с cagi не работал и видя пхп куски в коде, как то появляются сомнения в этой библиотеке но ближе к теме )
В исходнике почти ничего не менял
[Показать] Спойлер:
#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
kasper
 
Сообщений: 199
Зарегистрирован: 03 авг 2011, 11:00

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

Сообщение zoleg » 08 янв 2012, 03:14

Спасибо выручили. Я действительно юзал 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 » 08 янв 2012, 12:21

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


Код: выделить все
#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 Ват) разработанные специально для диспетчерских служб такси.
zoleg
 
Сообщений: 49
Зарегистрирован: 25 ноя 2011, 12:33
Откуда: UA

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

Сообщение kasper » 08 янв 2012, 15:49

Не "Не! Всё равно не получается" а "У меня не получается". А то как будто я что то не правильно написал.
Ближе в вашему вопросу.
Код: выделить все
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
kasper
 
Сообщений: 199
Зарегистрирован: 03 авг 2011, 11:00

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

Сообщение zoleg » 08 янв 2012, 16:29

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

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

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

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


Вернуться в Разработка

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14

© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH