BLF : subscribe & notify dialog event (rfc 4235)
Busy Lamp Fields is de techniek om vanaf een IP-telefoontoestel de toestand van een bepaalde SIP-account te monitoren aan de hand van lichtjes die groen, rood of rood flikkerend oplichten.
In RFC 4235 wordt deze functionaliteit van het SIP protocol beschreven. In deze post wil ik een begrijpbaar overzicht maken van wat in RFC 4235 wordt beschreven.
Dit is een technische benadering van hoe SIP subscribe en notify pakketten vloeien tussen de OpenSource PBX Asterisk en een Grandstream GXP 2010 IP-phone.
Opvolgen:
Het IP-telefoontoestel die een bepaalde extensie wil monitoren, zal dus een subscribe sturen naar de Asterisk PBX :
SUBSCRIBE sip:60@asterisk.yocan.local SIP/2.0 Via: SIP/2.0/UDP 192.168.1.102:5066;branch=z9hG4bK58d402271a47b5a3 From: <sip:gebruikerA@asterisk.yocan.local>;tag=b991c6fa5c280ec0 To: <sip:60@asterisk.yocan.local> Contact: <sip:gebruikerA@192.168.1.102:5066;transport=udp> Supported: eventlist, path Call-ID: 84b402c4d0691f40@192.168.1.102 CSeq: 19801 SUBSCRIBE User-Agent: Grandstream GXP2010 1.2.4.3 Max-Forwards: 70 Allow: INVITE,ACK,CANCEL,BYE,NOTIFY,REFER,OPTIONS,INFO,SUBSCRIBE,UPDATE,PRACK,MESSAGE Event: dialog Expires: 3600 Accept: application/dialog-info+xml, multipart/related, application/rlmi+xml Content-Length: 0 |
Bovenstaand is een SIP subscribe boodschap van gebruiker A naar Asterisk.
SUBSCRIBE sip:60@asterisk.yocan.local SIP/2.0: de duidelijke subscribe en de te monitoren extensie
Via: SIP/2.0/UDP 192.168.1.102:5066;branch=z9hG4bK58d402271a47b5a3: ieder SIP bewust netwerkelement die in het communicatiepad wil blijven zal een Via-header toevoegen. Hier heeft enkel het Grandstream IP-telefoontoestel een Via-header toegevoegd.
From: <sip:gebruikerA@asterisk.yocan.local>;tag=b991c6fa5c280ec0: de FROM-tag vertelt van welke SIP account het SIP pakketje afkomstig is, en waar dus een antwoord (eventueel via via-headers) mag naartoe gestuurd worden.
To: <sip:60@asterisk.yocan.local>: hier duidt de To-header aan welke account/extensie we willen monitoren
Contact: <sip:gebruikerA@192.168.1.102:5066;transport=udp>: op welke SIP URI is de initiërende partij graag wil gecontacteerd worden
CSeq: 19801 SUBSCRIBE: sequentie nummer om verschillende requests van elkaar te scheiden + methode (hier subscribe natuurlijk)
Event: dialog: de SIP Events Architecture, hier dialog.
De Grandstream IP-phone zal een 200 OK ontvangen als antwoord op zijn subscribe.
SIP/2.0 200 OK Via: SIP/2.0/UDP 192.168.1.102:5066;branch=z9hG4bKe8c34a7a942a3f45;received=192.168.1.102 From: <sip:gebruikerA@asterisk.yocan.local>;tag=b991c6fa5c280ec0 To: <sip:60@asterisk.yocan.local>;tag=as2d052fc2 Call-ID: 84b402c4d0691f40@192.168.1.102 CSeq: 19802 SUBSCRIBE Server: Asterisk PBX 1.6.2.10 Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO Supported: replaces, timer Expires: 60 Contact: <sip:60@asterisk.yocan.local>;expires=60 Content-Length: 0 |
Contact: <sip:60@asterisk.yocan.local>;expires=60: in het antwoord de SIP URI waarnaar een nieuwe subscribe moet gestuurd worden. Dit zal moeten gebeuren vóór het verstrijken van de Expires-tag.
De Grandstream IP-phone zal voortaan een notify ontvangen bij elke status wijziging. Een eerste notify wordt alvast ontvangen meteen na de subscribe :
NOTIFY sip:gebruikerA@192.168.1.102:5066;transport=udp SIP/2.0 Via: SIP/2.0/UDP 192.168.1.150:5060;branch=z9hG4bK648f87c9;rport Max-Forwards: 70 From: <sip:60@asterisk.yocan.local>;tag=as2d052fc2 To: <sip:gebruikerA@asterisk.yocan.local>;tag=b991c6fa5c280ec0 Contact: <sip:60@asterisk.yocan.local> Call-ID: 84b402c4d0691f40@192.168.1.102 CSeq: 102 NOTIFY User-Agent: Asterisk PBX 1.6.2.10 Event: dialog Content-Type: application/dialog-info+xml Subscription-State: active Content-Length: 202 |
NOTIFY sip:testcorp5@192.168.1.102:5066;transport=udp SIP/2.0: een notify wordt gestuurd naar de SIP URI zoals opgenomen in de Contact-header van de SIP subscribe.
Via: SIP/2.0/UDP asterisk.yocan.local:5060;branch=z9hG4bK648f87c9;rport: een Via-header wordt toegevoegd door de Asterisk PBX
From: <sip:60@asterisk.yocan.local>;tag=as2d052fc2: zelfde als To-header in subscribe, met toegevoegde tag
To: <sip:gebruikerA@asterisk.yocan.local>;tag=b991c6fa5c280ec0: zelfde als FROM-header in subscribe, met bijpassende tag
Contact: <sip:60@asterisk.yocan.local>: de SIP URI waarnaar alle communicatie mag gestuurd worden
Call-ID: 84b402c4d0691f40@192.168.1.102: nog steeds hetzelfde unieke Call-ID aangezien het hier nog steeds gaat om dezelfde communicatie (subscribe - notify)
CSeq: 102 NOTIFY: sequentie nummer om verschillende boodschappen van elkaar te scheiden + methode (hier notify natuurlijk)
Content-Type: application/dialog-info+xml: de status van de gemonitorde extensie (60) wordt meegegeven in de dialog-info en ook in de body van een aangehechte xml-code.
Zo ziet de xml-body er uit wanneer de extensie niet in gebruik is (maw de gebruiker is niet aan het bellen en wordt ook niet gebeld) :
<?xml version="1.0"?> <dialog-info xmlns="urn:ietf:params:xml:ns:dialog-info" version="194" state="full" entity="sip:60@asterisk.yocan.local"> <dialog id="60"> <state>terminated</state> </dialog> </dialog-info> |
Zo ziet de xml-body er uit wanneer de extensie gebeld wordt :
<?xml version="1.0"?> <dialog-info xmlns="urn:ietf:params:xml:ns:dialog-info" version="199" state="full" entity="sip:60@asterisk.yocan.local"> <dialog id="60"> <state>early</state> </dialog> </dialog-info> |
Zo ziet de xml-body er uit wanneer de extensie in gesprek is :
<?xml version="1.0"?> <dialog-info xmlns="urn:ietf:params:xml:ns:dialog-info" version="202" state="full" entity="sip:60@asterisk.yocan.local"> <dialog id="60"> <state>confirmed</state> </dialog> </dialog-info> |
Door de SIP subscribe en notify met deze xml-informatie kunnen we dus de status van een extensie en/of SIP account monitoren.