...
The NOTIFY XML body must contain the necessary information for the UAC to perform state translation and visualization.
Requirements
# | Requirement title | Functionality | Importance | Implementation status | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | D8XX:PFK-mapping:BLF-XML:General-Functionality | On D8xx IP phones, any PFK (programmable function key - physical or virtual) can be assigned to a key type called "BLF-XML", and a key number, which corresponds to a SIP extension on another IP phone in the same VoIP environment. The following specific functionality is required:
|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2 | D8XX:PFK-mapping:BLF-XML:Configuration | The assignment shall be configured either manually via web user interface (WUI) and/or phone user interface (PUI), and automatically via auto-provisioning (HTTP/TFTP setting server), SRAPS, or remote management (TR-069). |
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
3 | D8XX:PFK-mapping:BLF-XML:Subscription | The assignment shall initiate the SIP subscription process according to RFC 3265. |
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4 | D8XX:PFK-mapping:BLF-XML:Monitoring:Translation | Dialog states of the configured SIP extension shall be monitored, processed, and translated according to its direction.
|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5 | D8XX:PFK-mapping:BLF-XML:Actions | When the PFK is pressed, the following actions are allowed according to the translated state
|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
6 | D8XX:PFK-mapping:BLF-XML:Monitoring:Visualization | On D8xx series, during an active subscription, state changes of the monitored SIP extension shall be visualized on both, PFK LED and PFK label. |
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7 | D8XX:PFK-mapping:BLF-XML:Monitoring:Visualization:LED | The PFK LED behaviour and colour shall be according to the translated state:
|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
8 | D8XX:PFK-mapping:BLF-XML:Monitoring:Visualization:Label:Areas | The PFK label shall be composed of 3 areas:
|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
9 | D8XX:PFK-mapping:BLF-XML:Monitoring:Visualization:Label:icon-area | The label icon area (A) shall contain an icon and colouraccording to the translated state
|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
10 | D8XX:PFK-mapping:BLF-XML:Monitoring:Visualization:Label:name-area | The label name area (B) shall contain a text derived from display name or number (configurable) according to translated state and direction. Depending on the available space, the text shall be scrolled.
|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
11 | D8XX:PFK-mapping:BLF-XML:Monitoring:Visualization:Label:state-area | The label state area (C) shall contain a text and colour representing the translated state
|
|
|
...
Interactions | SIP NOTIFY XML body | XML definition | Display | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
UAS | UAS => UAC | UAC translation rules | Complete rule set | PFK LED & label (number) | PFK LED & label (display name) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
goes offhook | dialog state => trying
| translate state => offhook
|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
🔴 | 101 > | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
offhook | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
🔴 | Alex > | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
offhook | goes onhook | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Code Block | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| target>
| </local>
| /dialog>
</dialog-info>
|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
goes onhook | dialog state => terminated |
Code Block | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
...
<NotifyParsingRules type="state">
...
<level5 translates_to="idle"/>
</NotifyParsingRules>
...
<action>
<invite target="$(subscr_uri)"
when="on press"
states="idle"/>
<invite target="$(remote_uri)"
when="on press"
state="ringing"
request_uri="$(remote_uri)"
replaces="$(call_id);to-tag=$(remote_tag);from-tag=$(local_tag)"/>
</action> |
dialog state => early/proceeding
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
NOTIFY ... <?xml version="1.0"?> <dialog-info xmlns="urn:ietf:params:xml:ns:dialog-info" version="..." state="full" entity="sip:101@..."> <dialog id="..." direction='recipientinitiator' call-id='...' local-tag="..." remote-tag="..."> <state>early<<state>terminated</state> <local> <identity display="B"> sip>sip:101@... </identity> <target uri="sip:101@...;line=..."> <param pname="x-line-id" pval="0" /> </target> </local> <remote> <identity display="C"> sip:102@... </identity> <target uri="sip:102@..."/> </remote> </dialog> </dialog-info> |
translate state =>
ringingidle
- quick dial not allowed
- pick-up not allowed
Code Block | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
... <NotifyParsingRules type="state"> <level1... <level5 translates_to="ringingidle">/dialog-info/dialog/state[.="early"] </level1> /> </NotifyParsingRules> ... <level2<action> translates_to<invite target="ringing">/dialog-info/dialog/state[.="proceeding"] </level2> ... </NotifyParsingRules> <NotifyParsingRules type="variable" id="call_id" state="ringing"> <level1 fetch_attribute="call-id">/dialog-info/dialog[@call-id]</level1> </NotifyParsingRules> <NotifyParsingRules type="variable" id="remote_tag" state="ringing"> <level1 fetch_attribute="remote-tag">/dialog-info/dialog[@remote-tag]</level1> </NotifyParsingRules> <NotifyParsingRules type="variable" id="local_tag" state="ringing"> <level1 fetch_attribute="local-tag">/dialog-info/dialog[@local-tag]</level1> </NotifyParsingRules> <NotifyParsingRules type="variable" id="remote_uri" state="ringing"> <level1 fetch_attribute="uri">/dialog-info/dialog/remote/target[@uri]</level1> </NotifyParsingRules> <action> <invite target="$(subscr_uri)" when="on press" states="idle"/> <invite target="$(remote_uri)" when="on press" state="ringing" request_uri="$(remote_uri)" replaces="$(call_id);to-tag=$(remote_tag);from-tag=$(local_tag)"/> </action> |
$(subscr_uri)"
when="on press"
states="idle"/>
<invite target="$(remote_uri)"
when="on press"
state="ringing"
request_uri="$(remote_uri)"
replaces="$(call_id);to-tag=$(remote_tag);from-tag=$(local_tag)"/>
</action> |
⚪️ | 101 | |
idle |
⚪️ | Alex | |
idle |
dialog state => early/proceeding
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
NOTIFY
...
<?xml version="1.0"?>
<dialog-info
xmlns="urn:ietf:params:xml:ns:dialog-info"
version="..."
state="full" entity="...">
<dialog
id="..."
direction='recipient'
call-id='...'
local-tag="..."
remote-tag="...">
<state>early</state>
<local>
<identity display="B">
sip:101@...
</identity>
<target uri="sip:101@...;line=...">
<param pname="x-line-id" pval="0" />
</target>
</local>
<remote>
<identity display="C">
sip:102@...
</identity>
<target uri="sip:102@..."/>
</remote>
</dialog>
</dialog-info> |
translate state => ringing
- quick dial not allowed
- pick-up allowed
Code Block | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
...
<NotifyParsingRules type="state">
<level1
translates_to="ringing">/dialog-info/dialog/state[.="early"]
</level1>
...
<level2
translates_to="ringing">/dialog-info/dialog/state[.="proceeding"]
</level2>
...
</NotifyParsingRules>
<NotifyParsingRules
type="variable"
id="call_id"
state="ringing">
<level1 fetch_attribute="call-id">/dialog-info/dialog[@call-id]</level1>
</NotifyParsingRules>
<NotifyParsingRules
type="variable"
id="remote_tag"
state="ringing">
<level1 fetch_attribute="remote-tag">/dialog-info/dialog[@remote-tag]</level1>
</NotifyParsingRules>
<NotifyParsingRules
type="variable"
id="local_tag"
state="ringing">
<level1 fetch_attribute="local-tag">/dialog-info/dialog[@local-tag]</level1>
</NotifyParsingRules>
<NotifyParsingRules
type="variable"
id="remote_uri"
state="ringing">
<level1 fetch_attribute="uri">/dialog-info/dialog/remote/target[@uri]</level1>
</NotifyParsingRules>
|
dialog state => confirmed
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
NOTIFY
...
<?xml version="1.0"?>
<dialog-info
xmlns="urn:ietf:params:xml:ns:dialog-info"
version="..."
state="full"
entity="sip:101@...">
<dialog
id="..."
direction='recipient'
call-id='...'
local-tag="..."
remote-tag="...">
<state>confirmed</state>
<local>
<identity display="B">sip:101@...</identity>
<target uri="sip:101@...;line=...">
<param pname="x-line-id" pval="0" />
<param pname="+sip.rendering" pval='yes' />
</target>
</local>
<remote>
<identity display="C">sip:102@...</identity>
<target uri="sip:102@..."/>
</remote>
</dialog>
</dialog-info> |
translate state => talking
- quick dial not allowed
- pick-up not allowed
Code Block | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
...
<NotifyParsingRules type="state">
...
<level4
translates_to="talking">/dialog-info/dialog/state[.="confirmed"]
</level4>
</NotifyParsingRules>
...
<action>
<invite target="$(subscr_uri)"
when="on press"
states="idle"/>
<invite target="$(remote_uri)"
when="on press"
state="ringing"
request_uri="$(remote_uri)"
replaces="$(call_id);to-tag=$(remote_tag);from-tag=$(local_tag)"/>
</action> |
🔴🟠 | 102 <> > 101 | |
talkingringing |
🔴🟠 | Alice <> > Alex | |
talkingringing |
dialog state => terminatedconfirmed
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
NOTIFY ... <?xml version="1.0"?> <dialog-info xmlns="urn:ietf:params:xml:ns:dialog-info" version="8..." state="full" entity="sip:101@..."> <dialog id="..." direction='recipient' call-id='...' local-tag="..." remote-tag="..."> <state>terminated<<state>confirmed</state> <local> <identity display="B">sip:101@...</identity> <target uri="sip:101@...;line=..."> <param pname="x-line-id" pval="0" /> <param pname="+sip.rendering" pval='yes' /> </target> </local> <remote> <identity display="C">sip:102@...</identity> <target uri="sip:102@..."/> </remote> </dialog> </dialog-info> |
translate state => idletalking
- quick dial not allowed
- pick-up not allowed
Code Block | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
... <NotifyParsingRules type="state"> ... <level5 <level4 translates_to="idle"/>"talking">/dialog-info/dialog/state[.="confirmed"] </level4> </NotifyParsingRules> ... <action> <invite target="$(subscr_uri)" when="on press" states="idle"/> <invite target="$(remote_uri)" when="on press" state="ringing" request_uri="$(remote_uri)" replaces="$(call_id);to-tag=$(remote_tag);from-tag=$(local_tag)"/> </action> |
⚪️🔴 | 102 <> 101 | |
idletalking |
⚪️🔴 | Alice <> Alex | |
idletalking |
dialog state => early/proceedingterminated
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
NOTIFY ... <?xml version="1.0"?> <dialog-info xmlns="urn:ietf:params:xml:ns:dialog-info" version="138" state="full" entity="sip:101@..."> <dialog id="..." direction='initiatorrecipient' call-id='...' local-tag="..." remote-tag="..."> <state>early<<state>terminated</state> <local> <identity display="B">sip:101@...</identity> <target uri="sip:101@...;line=..."> <param pname="x-line-id" pval="0" /> </target> </local> <remote> <identity display="DC">sip:103@102@...;user=phone<</identity> <target uri="sip:103@102@...;user=phone"/> </remote> </dialog> </dialog-info> |
translate state => callingidle
- quick dial not allowed
- pick-up not allowed
Code Block | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
... <NotifyParsingRules type="state"> <level1 ... <level5 translates_to="ringingidle"/>/dialog-info/dialog/state[.="early"] </level1> <level1-1 translates_to="calling">/dialog-info/dialog[@direction="initiator"] </level1-1> <level2 translates_to="ringing">/dialog-info/dialog/state[.="proceeding"] </level2> <level2-1 translates_to="calling">/dialog-info/dialog[@direction="initiator"] </level2-1> </NotifyParsingRules> ... <action> <invite target="$(subscr_uri)" when="on press" states="idle"/> <invite target="$(remote_uri)" when="on press" state="ringing" request_uri="$(remote_uri)" replaces="$(call_id);to-tag=$(remote_tag);from-tag=$(local_tag)"/> </action> |
</NotifyParsingRules>
...
<action>
<invite target="$(subscr_uri)"
when="on press"
states="idle"/>
<invite target="$(remote_uri)"
when="on press"
state="ringing"
request_uri="$(remote_uri)"
replaces="$(call_id);to-tag=$(remote_tag);from-tag=$(local_tag)"/>
</action> |
⚪️ | 101 | |
idle |
⚪️ | Alex | |
idle |
dialog state => early/proceeding
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
NOTIFY
...
<?xml version="1.0"?>
<dialog-info
xmlns="urn:ietf:params:xml:ns:dialog-info"
version="13"
state="full"
entity="sip:101@...">
<dialog
id="..."
direction='initiator'
call-id='...'
local-tag="..."
remote-tag="">
<state>early</state>
<local>
<identity display="B">sip:101@...</identity>
<target uri |
dialog state => confirmed
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
NOTIFY ... <?xml version="1.0"?> <dialog-info xmlns="urn:ietf:params:xml:ns:dialog-info" version="..." state="full" entity="sip:101@...;line=..."> <dialog <param pname="x-line-id" pval="..."0" /> direction='initiator' </target> call-id='...' local-tag="..." remote-tag="..."> <state>confirmed</state> <local></local> <remote> <identity display="BD">sip:101@103@...<;user=phone</identity> <target uri="sip:101@103@...;lineuser=...phone"/> <param pname="x-line-id" pval="0" /> <param pname="+sip.rendering" pval='yes' /> </target> </local> <remote> <identity display="D">sip:103@...</identity> <target uri="sip:103@..."/> </remote> </dialog> </dialog-info></remote> </dialog> </dialog-info> |
translate state => calling
- quick dial not allowed
- pick-up not allowed
Code Block | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
...
<NotifyParsingRules type="state">
<level1
translates_to="ringing">/dialog-info/dialog/state[.="early"]
</level1>
<level1-1
translates_to="calling">/dialog-info/dialog[@direction="initiator"]
</level1-1>
<level2
translates_to="ringing">/dialog-info/dialog/state[.="proceeding"]
</level2>
<level2-1
translates_to="calling">/dialog-info/dialog[@direction="initiator"]
</level2-1> |
translate state => talking
- quick dial not allowed
- pick-up not allowed
Code Block | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
... <NotifyParsingRules type="state"> ... <level4 translates_to="talking">/dialog-info/dialog/state[.="confirmed"] </level4> </NotifyParsingRules> ... <action> <invite target="$(subscr_uri)" when="on press" states="idle"/> <invite target="$(remote_uri)" when="on press" state="ringing" request_uri="$(remote_uri)" replaces="$(call_id);to-tag=$(remote_tag);from-tag=$(local_tag)"/> </action> |
🔴 | 101 <> > 103 | |
talkingcalling |
🔴 | Alex <> > Tita | |
talkingcalling |
dialog state => terminatedconfirmed
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
NOTIFY ... <?xml version="1.0"?> <dialog-info xmlns="urn:ietf:params:xml:ns:dialog-info" version="..." state="full" entity="sip:101@..."> <dialog id="..." direction='initiator' call-id='...' local-tag="..." remote-tag="..."> <state>terminated<<state>confirmed</state> <local> <identity display="B">sip:101@...</identity> <target uri="sip:101@...;line=..."> <param pname="x-line-id" pval="0" /> <param pname="+sip.rendering" pval='yes' /> </target> </local> <remote> <identity display="D">sip:103@...</identity> <target uri="sip:103@..."/> </remote> </dialog> </dialog-info> |
translate state => idletalking
- quick dial not allowed
- pick-up not allowed
Code Block | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
... <NotifyParsingRules type="state"> ... <level5 <level4 translates_to="idletalking"/>>/dialog-info/dialog/state[.="confirmed"] </level4> </NotifyParsingRules> ... <action> <invite target="$(subscr_uri)" when="on press" states="idle"/> <invite target="$(remote_uri)" when="on press" state="ringing" request_uri="$(remote_uri)" replaces="$(call_id);to-tag=$(remote_tag);from-tag=$(local_tag)"/> </action> |
⚪️🔴 | 101 <> 103 | |
idletalking |
⚪️🔴 | Alex <> Tita | |
idletalking |
Questions
Below is a list of questions to be addressed as a result of this requirements document:
Outgoing call terminated | dialog state => terminated
| translate state => idle
|
|
| ||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Questions
Below is a list of questions to be addressed as a result of this requirements document:
Question | Outcome |
---|---|
Shall we visualize all possible translation states? | Alexander Feldt I'd agree, for these reasons:
|
Shall we allow quick dial only in idle state? | Alexander Feldt Technically, we could allow quick dial in any state, except ringing... |
Shall we create new icons or reuse those already existing ones? | Alexander Feldt I really question icons, that are so small, that there is no visible difference to the user, like and , therefore - if we use them at all - I vote for better distinguishable icons. |
How can a specific LED behaviour be addressed using XML definitions? | Alexander Feldt Currently not within XML definitions, it has to be configured via settings. |
How can a specific label be addressed using XML definitions? | Alexander Feldt see label, but I haven't figured out how to define it correctly
|
How can a specific icon be addressed using XML definitions? | Alexander Feldt see icon, but I haven't figured out how to define it correctly |
How shall the Label area be configured to use either number or display name? | Alexander Feldt The topic is even more complex: I assume the PFK label is generally too short to show longer extension number or names, i.e. some kind of scrolling must be used. But is this really helpful for the customer at all? |
From the UX point of view: which visual aid is more important for the customer: LED or PFK label? | |
Question | Outcome |
Shall we visualize all possible translation states? | Alexander Feldt I'd agree, for these reasons:
|
Shall we allow quick dial only in idle state? | Alexander Feldt Technically, we could allow quick dial in any state, except ringing... |
Shall we create new icons or reuse those already existing ones? | Alexander Feldt I really question icons, that are so small, that there is no visible difference to the user, like and , therefore I vote for better distuingishable icons. |
How can a specific icon be addressed using XML definitions? | Alexander Feldt see icon How shall the D8XX:PFK-mapping:BLF-XML:Monitoring:Visualization:Label:name-area be configured to use either number or display name?
|
Tita Petre Is the above list of requirements enough input to create a proper testplan? | |
Clemens Cramer As the decision to move the default blf & extension configuration to a xml definition is based on customer requests to modify the behavior, guides with working examples on how to change the labels, icons, led behavior, and handled dialog states should probably be a requirement (and as such covered by tests). |