Здравствуйте.
Пользуемся Asterisk 1.8.6.0(поднят на Centos 5.5). Extensions хранятся в БД mysql, также mysql используется для настройки hints(настраивал используя этот топик: текст ссылки), для звонков используем SIP клиент X-Lite(клиенты сидят за NAT в нескольких разных подсетях).
С presense появилось несколько проблем:
- Иногда при выключении клиента в адресных книгах других клиентов у него остается онлайн статус, при этом core show hints также показывает для него Idle статус
- При добавлении в адресную книгу клиента несуществующего аккаунта этому аккаунту тоже присваивается онлайн статус, при этом в консоли сервера вижу:
-- Added extension '123*1234' priority -1 to status
В sip.conf включено кэширование и автоматически выполняется sip reload. Параметр qualify=yes прописан непосредственно в базе для каждого extensions.
Настройки sip.conf:
[general]
context=phones
allowexternalinvites=no
trustrpid=no
allowsubscribe=yes
subscribecontext=status
useclientcode=yes
notifyringing=yes
notifyhold=yes
limitonpeers=yes
callcounter=yes
disallow=all
allow=ulaw
allow=alaw
allow=gsm
rtcachefriends = yes
rtcache=yes
callevents=yes
srvlookup=yes
nat=yes
externhost=mydomain
externip=mydomainip
fromdomain=mydomain
localnet=0.0.0.0/255.255.255.0
localnet=mydomainip/255.255.255.0
localnet=192.168.1.0/255.255.255.0
recordhistory=yes
allowguest=no
alwaysauthreject=yes
realm=mydomain
limitonpeers=yes
incominglimit=2
progressinband=yes
call-limit=6
bindport=XXXX
bindaddr=0.0.0.0
maxexpirey=240
defaultexpirey=240
allowoverlap=no
udpbindaddr=0.0.0.0
tcpenable=no
tcpbindaddr=0.0.0.0
srvlookup=yes
extensions.conf:
[internal]
exten => _XXX*XXXX,1,ChanIsAvail(SIP/${EXTEN},s)
exten => _XXX*XXXX,n,NoOp(${AVAILSTATUS})
exten => _XXX*XXXX,n,NoOp(SIP/${EXTEN} has state ${DEVICE_STATE(SIP/${EXTEN})})
exten => _XXX*XXXX,n,GotoIf($["${DEVICE_STATE(SIP/${EXTEN})}" = "UNKNOWN"]?100)
exten => _XXX*XXXX,n,GotoIf($["${DEVICE_STATE(SIP/${EXTEN})}" = "UNAVAILABLE"]?100)
exten => _XXX*XXXX,n,Dial(SIP/${EXTEN},30,tTw)
exten => _XXX*XXXX,n,Noop(${DIALSTATUS})
exten => _XXX*XXXX,n,Hangup()
exten => _XXX*XXXX,100,Set(DEVICE_STATE(Custom:SIP/${EXTEN})=UNAVAILABLE)
exten => _XXX*XXXX,hint,Custom:SIP/${EXTEN}
exten => _XXX*XXXX,101,NoOp(${Custom:SIP/${EXTEN}})
exten => _XXX*XXXX,102,NoOp(SIP/${EXTEN} has state ${DEVICE_STATE(SIP/${EXTEN})})
;exten => _XXX*XXXX,100,Set(EXT_STATE="UNAVAILABLE")
exten => _XXX*XXXX,103,Playback(prepaid-dest-unreachable) ;(unavailable)
exten => _XXX*XXXX,104,Hangup()
[status]
exten => _XXX*XXXX,hint,${CUT(REALTIME(hints,exten,${EXTEN},:,:),:,4)}
[phones]
include => internal
include => status
include => parkedcalls
В контексте [internal] пытаюсь при звонке на залипшие или удаленные из базы extensions с помощью DEVICE_STATE проверять состояние и устанавливать принудительно оффлайн статус, перепробовал уже много вариантов но пока безрезультатно.
Если установить
subscribecontext=internal
функция Set отрабатывает и сервер отправляет subscribe notify с новым статусом клиентам, но статусы перестают работать автоматически и всем существующим extensions присваивается Idle статус.
Подскажите как наладить работу presense, а то я уже в тупике, больше не знаю что можно сделать...