Вообщем удалось реализовать задуманное на голом без XMPP и WebSocet.
Вдруг кому понадобится.
Статус отслеживается, BLF работает.
Тестировалось на:
- Asterisk 13.3.2 на CentOS 6.5 - 2 тестовых виртуалки
- софтфон MicroSIP на Windows10
- телефон Grandstream GXP2200 с панелью GXP2200EXT
- софтфон Grandstream Vawe на Android
Делалось на основе
статьи
Собственно там почти все есть, а собственно настройка pjsip.conf:
Из оригинала убрал мониторинга почтовых ящиков и в entpoint добавил transport.
Asterisk 1
[instance2]
type=endpoint
transport=transport-udp
[instance2-devicestate]
type=outbound-publish
server_uri=sip:instance1@172.16.20.4
event=asterisk-devicestate
[instance2]
type=inbound-publication
event_asterisk-devicestate=instance2
[instance2]
type=asterisk-publication
devicestate_publish=instance2-devicestate
device_state=yes
Asterisk 2
[instance1]
type=endpoint
transport=transport-udp
[instance1-devicestate]
type=outbound-publish
server_uri=sip:instance2@172.16.2.13
event=asterisk-devicestate
[instance1]
type=inbound-publication
event_asterisk-devicestate=instance1
[instance1]
type=asterisk-publication
devicestate_publish=instance1-devicestate
device_state=yes
Телефоны тоже через pjsip. На всякий случай моя конфигурация:
Asterisk 1
[transport-udp]
type=transport
protocol=udp
bind=172.16.2.13
[endpoint-local](!)
type=endpoint
transport=transport-udp
context=internal
disallow=all
allow=alaw
[auth-local](!)
type=auth
auth_type=userpass
password=DerPassword
[aors-local](!)
type=aor
max_contacts=2
default_expiration=600
maximum_expiration=600
minimum_expiration=600
;================================ телефоны ============================
[777](endpoint-local)
auth=auth777
aors=777
[auth777](auth-local)
username=777
[777](aors-local)
[778](endpoint-local)
auth=auth778
aors=778
[auth778](auth-local)
username=778
[778](aors-local)
[779](endpoint-local)
auth=auth779
aors=779
[auth779](auth-local)
username=779
[779](aors-local)
Asterisk 2 аналогично, только адрес соответственно 172.16.20.4 и номера внутренние 780, 781, 782.
Собственно проблемой стало(для меня по крайней мере) выяснить как прописывать для мониторинга сами номера другого Asterisk.
Оказалось все просто - точно также как и для локальных номеров:
[default]
extension.conf - для обоих Asterisk одинаково
exten => 777,hint,PJSIP/777
exten => 778,hint,PJSIP/778
exten => 779,hint,PJSIP/779
exten => 780,hint,PJSIP/780
exten => 781,hint,PJSIP/781
exten => 782,hint,PJSIP/782
; Ну собственно? чтобы вызовы бегали локальные
[internal]
exten => _7XX,1,Dial(PJSIP/${EXTEN})
same => n,Hangup()
Также оказалось неожиданностью, что вносимые изменения действуют не сразу, для уверенности приходилось перегружать Asterisk. В конце изысканий столкнулся с ситуацией как в комментариях к указанной статье, когда один Asterisk мониторил состояние абонентов второго, а наоборот нет. После отключения учеток на всех телефонах и перезагрузки виртуалок все заработало.
В итоге Grandstream имел на себе две учетки с обоих Asterisk:
779 с подпиской состояния 780-782
780 с подпиской состояния 777-779
MicroSIP(778 и 781) и GS Vawe(777 и 782) аналогично, за исключением, что одновременно на них активной была только одна учетка.
Показанные состояния:
GXP2200 свободен - горит зеленый, звонит - мигает красный, занят - горит красный, при недоступности - горит зеленый.
MicroSIP свободен - горит зеленый, звонит - горит красный(должен желтый вроде быть), занят - горит красный, при недоступности - горит красный.
GS Vawe свободен - горит зеленый, звонит - горит красный, занят - горит красный, при недоступности - горит зеленый.
Вообщем чего хотел - я добился.
Рабочий Asterisk пока 11, после перехода на 13 будем пробовать на нагруженной системе. Но этот переход не сейчас