Обычные операции ввода / вывода файлов в звездочке - PullRequest
1 голос
/ 22 ноября 2010

Я использую звездочку для реализации голосового сервера. У меня есть следующие два вопроса:

  1. Я хочу иметь возможность читать / записывать файлы для придания дополнительной функциональности. Есть ли способ сделать это в звездочке? Я заметил, что обычные функции, такие как cout и т. Д. Для записи вывода, подавлены.

  2. Есть ли способ отладки приложений, написанных на звездочке? Я имею в виду что-то вроде GDB для звездочки?

Любая помощь по вышеуказанным вопросам приветствуется.
Спасибо,
Шриры.

Ответы [ 3 ]

3 голосов
/ 04 декабря 2010

Я заметил, что в своем комментарии к ответу Майкла вы сказали, что используете C / C ++.

Вы, безусловно, можете выполнять файловый ввод / вывод в Asterisk, используя C или C ++ (или любой другой язык). Asterisk поддерживает четыре основных типа приложений:

Схема набора: язык сценариев Asterisk по умолчанию. Любой код в extensions.conf является абонентской группой. Вы можете использовать этот язык, чтобы контролировать входящие звонки и делать вещи. Для файлового ввода / вывода абонентская группа предоставляет команду System, а также команду AGI, которая позволяет вам запускать другое программное обеспечение (например, скрипт bash, двоичный файл C, что угодно). Затем в вашем bash-скрипте, C-программе и т. Д. Вы можете просто выполнять обычный файловый ввод-вывод, как если бы вы запускали программу из командной строки самостоятельно. EX:

[some_context]
exten => s,1,System(/bin/echo "hello, world" >> /tmp/test.txt)
exten => s,n,Return()

[launch_an_agi]
exten => s,1,AGI(/var/lib/asterisk/agi-bin/my_c_program,optional_cmd_line_arguments,to,pass)
exten => s,n,Hangup()

AGI: Asterisk AGI (запускается из кода абонентской группы) позволяет вам запускать внешние программы (программу на C или что-то еще) и передает вашей программе на C некоторые переменные Asterisk о вызове, который в данный момент обрабатывается, который ваша программа может использовать , Вы можете использовать свои обычные инструменты кодирования здесь, чтобы выполнить любой ввод / вывод файла, например:

/* some_c_agi_program */
include <stdio.h>
int main(void) {
    FILE *f = fopen("/tmp/test.txt", "w");
    (void)fprintf(f, "MY FILE IO WORKS! THANKS STACKOVERFLOW!\n");
    fclose(f);
    return 0;
}

AMI: AMI - это сетевой API, предоставляемый Asterisk. Вы можете использовать это для написания программ, запускаемых на другом сервере, которые могут создавать, контролировать и отображать состояние вызовов на сервере Asterisk. Идея состоит в том, что вы подключаетесь через сокет TCP к серверу звездочки в вашей программе, затем отправляете команды и считываете ответы. Я не собираюсь показывать пример, потому что это была бы огромная программа на C. Но вы поняли.

Теперь на отладку!

В зависимости от типа приложения, которое вы пишете, существуют различные способы отладки. Если вы знакомы с концепцией модульного тестирования, вы можете написать модульные тесты и убедиться, что они выполняются для любого из методов, которые я собираюсь описать. Для отладки общего назначения (если вы пишете программу AGI или AMI) можно использовать обычный отладчик C (GDB).

2 голосов
/ 16 ноября 2015

Возможно, я что-то упускаю, но разве это должно быть более сложным, чем встроенная в Asterisk функция FILE ?

Примеры:

читает полностьюсодержимое файла.

Set(foo=${FILE(/tmp/test.txt)})

читает 3-ю строку файла.

Set(foo=${FILE(/tmp/test.txt,3,1,l)})

Заменить последнюю строку файла на "cat"

Set(FILE(/tmp/foo.txt,-1,,l)=cat)

Добавить "собаку" в файл с новой строкой

Set(FILE(/tmp/foo.txt,,,al)=dog)

Пример набора номеров:

exten => 800,n,Set(FILE(/tmp/cid.txt,,,al)=${CALLERID(num)})
0 голосов
/ 22 ноября 2010
  1. Вы используете AGI? Конечно, с AGI вы можете читать / писать файлы.

  2. Вы можете использовать параметр командной строки -vvvvvvv, чтобы сделать звездочку многословной. Более v делает звездочку более многословной. Для меня этого было достаточно для отладки диалпланов. Если я хотел отладить AGI, то я использовал ведение журнала в некотором файле журнала или для более простых задач я использовал fake agi_lib (хорошо для модульных тестов, где истинный AGI недоступен).

...