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

очереди при использовании call файлов

Проблемы Asterisk без вэб-оболочек и их решения

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

mapt
Сообщения: 62
Зарегистрирован: 25 июл 2012, 11:50
Откуда: Россия, Волгоград

Re: очереди при использовании call файлов

Сообщение mapt »

это не очень прозрачно.
создали мы 5 файлов. астериск сразу их "скушал".
что делать?
создавать новые 5 - астериск вполне возможно еще не обработал старые...
ждать - чего ждать...

конечно можно по статусам отрабатывать, т.к. отправка факса возвращает резиденту создающему call файлы статусы их исполнения, но хочется без резидентов в принципе...
mapt
Сообщения: 62
Зарегистрирован: 25 июл 2012, 11:50
Откуда: Россия, Волгоград

Re: очереди при использовании call файлов

Сообщение mapt »

ded писал(а):Можно.
Изучите синтаксис команды originate, а call файлы устроены также.
Его плечо может иметь форму Local/faxout@faxsend-t38
Если Вы поищите по ключевым словамм Asteisk call files channel Local то увидите примеры и комментарии.
спасибо за наводку. сделал примерно так:

в call файле

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

Channel:Local/send@fax_with_threads
В диалплане:

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

[fax_with_threads]
exten => send,1,NoOp()
exten => send,n,Dial(SIP/ertelecom002526594/${RECEIVER}&SIP/ertelecom003526594/${RECEIVER}&SIP/ertelecom004526594/${RECEIVER}&SIP/ertelecom005526594/${RECEIV$
exten => send,n,Hangup()
Теперь задействованы все каналы и это хорошо.
Что плохо - все каналы задействуются сразу, а надо имхо по очереди (1й занят - второй, второй занят - третий и т.п.).

А вот что не получается реализовать, так это собственно пул. Идея такая: если все наши каналы заняты, делаем Goto к началу через определенный таймаут, т.к. считаем что наш пул занят и надо попробовать позже.
Если же один из каналов начал дозвон - но на той стороне занято или не берут - делаем hangup и соответственно asterisk засчитает это за попытку и продолжит при условии Maxretries через RetryTime.

Не укажите ли как это сделать?

Собственно весь вопрос сводится к тому как отличать статусы dial (занят наш канал другой работой или нам неотвечают/занято у вызываемого)
gosha
Сообщения: 375
Зарегистрирован: 06 сен 2010, 17:41
Контактная информация:

Re: очереди при использовании call файлов

Сообщение gosha »

считать либо через GROUP в паре с local, либо тупо количество файлов ( астериск не удалит файл пока есть тот звонок ), неудачные статусы ловить в экстене failed.
mapt
Сообщения: 62
Зарегистрирован: 25 июл 2012, 11:50
Откуда: Россия, Волгоград

Re: очереди при использовании call файлов

Сообщение mapt »

решил немного схитрить.
для канала в sip.conf прописываем call-limit=1, далее в локальном канале делаем ChanIsAvail и при успехе звоним, в противном случае ждем таймаут и пробуем повторно.

Но проблема пришла откуда не ждали: он делает первый звонок, но потом вылитает, якобы канал "занят"...
Складывается впечатление, что он пытается сделать dial 2 раза вместо одного...

Вот запись в extensions:

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

exten => send,1,ChanIsAvail(SIP/ertelecom001526594);
exten => send,2,Dial(SIP/ertelecom001526594/${RECEIVER},30)
exten => send,3,Hangup();
и лог:

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

    -- Attempting call on Local/send@fax_with_threads for faxout@faxsend-t38:1 (Retry 1)
    -- Executing [send@fax_with_threads:1] ChanIsAvail("Local/send@fax_with_threads-00000028;2", "SIP/ertelecom001526594") in new stack
  == Using SIP RTP TOS bits 184
  == Using SIP RTP CoS mark 5
    -- Executing [send@fax_with_threads:2] Dial("Local/send@fax_with_threads-00000028;2", "SIP/ertelecom001526594/78442526660,30") in new stack
  == Using SIP RTP TOS bits 184
  == Using SIP RTP CoS mark 5
    -- Called SIP/ertelecom001526594/78442526660
  == Using SIP RTP TOS bits 184
  == Using SIP RTP CoS mark 5
[Jun 19 17:09:53] NOTICE[19803][C-00000145]: chan_sip.c:6753 update_call_counter: Call from peer 'ertelecom001526594' rejected due to usage limit of 1
[Jun 19 17:09:53] NOTICE[19803][C-00000145]: chan_sip.c:25151 handle_request_invite: Failed to place call for device 00178442526594, too many calls
    -- SIP/ertelecom001526594-000002fb is ringing
    -- SIP/ertelecom001526594-000002fb is making progress passing it to Local/send@fax_with_threads-00000028;2
    -- Got SIP response 480 "Temporarily Unavailable" back from 188.187.253.3:5060
    -- SIP/ertelecom001526594-000002fb is circuit-busy
  == Everyone is busy/congested at this time (1:0/1/0)
    -- Executing [send@fax_with_threads:3] Hangup("Local/send@fax_with_threads-00000028;2", "") in new stack
  == Spawn extension (fax_with_threads, send, 3) exited non-zero on 'Local/send@fax_with_threads-00000028;2'
[Jun 19 17:09:56] NOTICE[23039]: pbx_spool.c:389 attempt_thread: Call failed to go through, reason (1) Hangup
[Jun 19 17:09:56] NOTICE[23039]: pbx_spool.c:392 attempt_thread: Queued call to Local/send@fax_with_threads expired without completion after 0 attempts
Есть ли идеи?
bako
Сообщения: 10
Зарегистрирован: 26 мар 2012, 13:55
Контактная информация:

Re: очереди при использовании call файлов

Сообщение bako »

Ну такой вот алгоритм на псевдобейсике не проканает?:


10 Вбросить в спул 5 файлов
20 подождать 30 секунд
30 проверить через asterisk -rx "core show channels" состояние нужных каналов
40 вбросить в спул файлов в количестве 5 минус количество занятых
50 если не кончились факсы идем на 20

и усложнять
ded
Сообщения: 15625
Зарегистрирован: 26 авг 2010, 19:00

Re: очереди при использовании call файлов

Сообщение ded »

Если бы Вы не строили орбитальную станцию из спичечных коробков, то юзали бы t38modem с Астериском, который приклеили бы в Hylafax, где все эти многоствольные алгоритмы рассылки факсов придуманы, реализованы и отполированы ещё в ХХ веке. И до сих пор работают.
mapt
Сообщения: 62
Зарегистрирован: 25 июл 2012, 11:50
Откуда: Россия, Волгоград

Re: очереди при использовании call файлов

Сообщение mapt »

На мой взгляд это не однозначный вопрос. Hylafax мы пробовали. Работает через раз, тяжело получать обратную связь. В связке был iaxmodem, но это просто ужас. t38modem нет в портейжах нашей генты и это печально. А здесь повилось вот такое решение. Согласен, не фонтан, но работает и удовлетворяет все наши потребности.

Вот описание для тех, кто возможно столкнется в будущем (у нас таки завелось):
1. Формируем call-файлы

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

Channel:Local/send@fax_with_threads
Callerid:"FaxSender"<1111>
Maxretries:{maxRetries}
Waittime:300
RetryTime:60
Context:faxsend-t38
Extension:faxout
Priority:1
SetVar: T38CALL=1
Set:RETURNURL={returnUrl}
Set:TAGLINE=company
Set:LOCALSTATIONID=phone
Set:RECEIVER={fax}
Set:FAX_ID={faxId}
Set:TIFF_2_SEND={faxId}.tif
2. помещаем в спул, далее два контекста:

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

[fax_with_threads]
; здесь наш канал (или несколько, при необходимости)
exten => send,1,Dial(SIP/канал/${RECEIVER},30)
exten => send,n,Goto(send-${DIALSTATUS},1)
exten => send-CANCEL,1,Hangup()
exten => send-ANSWER,1,Hangup()
exten => send-NOANSWER,1,Hangup()
exten => send-BUSY,1,Hangup()
exten => send-CONGESTION,1,Wait(10)
exten => send-CONGESTION,n,GoTo(send,1)
exten => send-CHANUNAVAIL,1,Wait(10)
exten => send-CHANUNAVAIL,n,GoTo(send,1)

[faxsend-t38]
exten => faxout,1,Set(STARTTIME=${SHELL(date +%s)} )
exten => faxout,n,Wait(2)
exten => faxout,n,Playback(/mnt/asterisk_call_records/fax,skip)
exten => faxout,n,Hangup()
exten => faxout,n,NoOp(**** SENDING FAX ****)
; Set FAXOPTs
exten => faxout,n,NoOp(**** SETTING FAXOPT ****)
exten => faxout,n,Set(FAXFILE=${TIFF_2_SEND})
exten => faxout,n,Set(FAXOPT(ecm)=yes)
exten => faxout,n,Set(FAXOPT(headerinfo)=${TAGLINE})
exten => faxout,n,Set(FAXOPT(maxrate)=14400)
exten => faxout,n,Set(FAXOPT(minrate)=4800)
exten => faxout,n,Set(FAXOPT(localstationid)=${LOCALSTATIONID})
; Send the fax
exten => faxout,n,NoOp(**** SENDING FAX : ${FAXFILE} ****)
exten => faxout,n,SendFAX(/mnt/asterisk_call_records/faxes/${FAXFILE},dfzs)

;Calculating Time of Sending
exten => faxout,n,Set(ENDTIME=${SHELL(date +%s)} )
exten => faxout,n,Set(TRANSFERTIME=${MATH(${ENDTIME}-${STARTTIME},int)})
;Actions after sending fax
exten => faxout,n,Set(NORMURL=${FAXOPT(error)})
exten => faxout,n,Set(STATUSMESSAGE=${REPLACE(NORMURL, ,+)})
exten => faxout,n,Set(FAXOPTRATE=${FAXOPT(rate)})
exten => faxout,n,Hangup

;Actions if no answer or busy
exten => failed,1,Set(FAXSTATUS=FAILED)
exten => failed,2,Set(STATUSMESSAGE=number+no+answer+or+busy)
exten => failed,3,Set(FAXOPTRATE=none)
;
exten => h,1,NoOP(------------------- FAX to ${EXTEN} with ${FAXSTATUS} -----------------)
exten => h,2,Set(CURLRESULT=${CURL(${RETURNURL}?fax=${RECEIVER}&faxId=${FAX_ID}&status=${FAXSTATUS}&message=${STATUSMESSAGE})})
exten => h,4,Set(LOGFAXOUT=${SHELL(echo "${STRFTIME(${EPOCH},,%d%m%Y-%H:%M:%S)} : ${FAX_ID} : ${RECEIVER} : ${FAXSTATUS} : ${STATUSMESSAGE} : ${TRANSFERTIME}$
exten => h,3,NoOp(${RECEIVER}:${FAX_ID}:${FAXSTATUS}:${STATUSMESSAGE}:${FAXOPTRATE})
3. в настройках наших каналов надо выставить лимит по ним call-limit=1

И все успешно работает.
N call файлов помещается в spool, далее астериск их забирает и начинает работу по тем которые можно (исходя из возможностей своих каналов). Если все каналы заняты - таймаут 10 секунд и повторная попытка. Если на удаленной стороне не отвечают/занято - hangup и повторно через RetryTime в количестве Maxretries. Результат убегает скрипту по адресу RETURNURL.

------------------

и теперь оффтоп: предыдущая проблема имеет интересный характер.
при звонке с любого телефона на наш sip номер провайдер кидает такое сообщение

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

INVITE sip:s@192.168.0.65:5060 SIP/2.0
Via: SIP/2.0/UDP 188.187.253.3:5060;rport;branch=z9hG4bK-109865469-3792765912-4082920356-10123420121
Via: SIP/2.0/UDP 188.187.253.1:5161;rport=5161;branch=z9hG4bK-109865469-3792765912-4082920356-1012342012;received=188.187.253.1
From: "79370822551" <sip:79370822551@188.187.253.1:5161;user=phone>;tag=3565251069-3792765912-4082920356-1012342012
To: <sip:78442526660@188.187.253.1;user=phone>
Call-ID: fd6981fcd80311e2a46b5cf3fc1c573c@188.187.253.1
CSeq: 1 INVITE
Contact: <sip:79370822551@188.187.253.3:5060>
Content-Type: application/sdp
Allow: ACK, BYE, CANCEL, INFO, INVITE, OPTIONS, REFER, REGISTER, SUBSCRIBE, UPDATE
Max-Forwards: 70
User-Agent: MERA MVTS3G v.4.3.0-38t
Cisco-Guid: 4236016284-3624079842-2758499571-4229715772
Content-Length: 415
Все бы ничего, но в поле From в качестве идентификатора сервера есть только IP.
И опять же все бы ничего, но на данного провайдера и на этот сервер есть несколько разных записей разных телефонов в sip.conf.

Соответственно получалась такая ситуация: т.к. тестировали мы на своем собственном факсе, то при попытке вызова с первого канала приходил входящий на первый канал, который по лимиту отклонялся - и собственно эпик фейл.

Вопрос в следующем:
в документации на sip.conf сказано что для friend определение сервера происходит по полю From любым возможным методом.
Каким образом указать asterisk'у на то, что ему надо идентифицировать канал другим способом, например с помощью поля To?
Ответить
© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH