Tuesday, May 4, 2010

Use OTA to setup SIP profiles in NOKIA S60 Phones - Part 3

There are plenty information about OTA XML on NOKIA S60 platform in www.forum.nokia.com and there are many templates available.  However, it takes more time than expected to come up a workable one.
 
The result is as below.  It could be provisioned on most NOKIA S60 phones to register at sip-project.our-domain.com.  The AUTOREG parameter in APPID w9010 instructs the phone to register our SIP server automatically whenever possible.  It is quite important because customer will see a visual indicator on his phone.  Without it, customer might mistake a traditional IDD call as VOIP call.
 
<?xml version="1.0"?>
<!DOCTYPE wap-provisioningdoc PUBLIC "-//WAPFORUM//DTD PROV 1.0//EN"
"http://www.wapforum.org/DTD/prov.dtd">
<wap-provisioningdoc version="1.2">
 
<characteristic type="APPLICATION">
<parm name="APPID" value="w9013"/>
<parm name="PROVIDER-ID" value="Who-are-we"/>
<parm name="NAME" value="Who-are-we VoIP settings "/>
<parm name="TO-APPREF" value="SIP_appref"/>
<parm name="TO-NAPID" value="INTERNET"/>
<parm name="SMPORT" value="16384"/>
<parm name="EMPORT" value="32766"/>
<parm name="MEDIAQOS" value="46"/>
<parm name="NODTMFIB"/>
<parm name="NODTMFOOB"/>
<!-- Codec: AMR NB -->
 
    <!-- AMR NB with default values -->
    <characteristic type="CODEC">
      <parm name="MEDIASUBTYPE" value="0"/>
      <parm name="PRIORITYINDEX" value="0"/>
    </characteristic>
   
    <!-- G711 u-law with default values -->
    <characteristic type="CODEC">
      <parm name="MEDIASUBTYPE" value="4"/>
      <parm name="PRIORITYINDEX" value="1"/>
    </characteristic>
   
    <!-- G711 a-law with default values -->
    <characteristic type="CODEC">
      <parm name="MEDIASUBTYPE" value="3"/>
      <parm name="PRIORITYINDEX" value="2"/>
    </characteristic>
   
    <!-- iLBC with default values -->
    <characteristic type="CODEC">
      <parm name="MEDIASUBTYPE" value="1"/>
      <parm name="PRIORITYINDEX" value="3"/>
    </characteristic>
   
    <!-- G.729 with default values -->
    <characteristic type="CODEC">
      <parm name="MEDIASUBTYPE" value="10"/>
      <parm name="PRIORITYINDEX" value="4"/>
    </characteristic>
   
    <!-- CN Comfort noise with default values -->
    <characteristic type="CODEC">
      <parm name="MEDIASUBTYPE" value="9"/>
      <parm name="PRIORITYINDEX" value="5"/>
    </characteristic>
 
 <characteristic type="VOIPURIS">
  <parm name="TO-APPREF" value="SIP_appref"/>
  <parm name="IPVOICEMAILBOXURI" value="login-id@sip-project.our-domain.com"/>
 </characteristic>
</characteristic><!-- APPLICATION VoIP w9013 -->
 

<characteristic type="APPLICATION">
 
 <parm name="APPID" value="w9010"/>
 <parm name="NAME" value="Who-are-we"/>
 <parm name="APPREF" value="SIP_appref"/>
 <parm name="PROVIDER-ID" value="Who-are-we"/>
 <parm name="PTYPE" value="IETF"/>
 <parm name="PUID" value="login-id@sip-project.our-domain.com"/>
 <parm name="TO-NAPID" value="INTERNET"/>
 <parm name="APROTOCOL" value="UDP"/>
 <parm name="AUTOREG" value="ON"/>
 <characteristic type="APPADDR">
  <parm name="ADDR" value="sip-project.our-domain.com"/>
  <characteristic type="PORT">
   <parm name="PORTNBR" value="5060"/>
  </characteristic>
 </characteristic>
 <characteristic type="APPAUTH">
  <parm name="AAUTHNAME" value="login-id"/>
  <parm name="AAUTHSECRET" value="password"/>
  <parm name="AAUTHDATA" value="server-realm"/>
 </characteristic>
 <characteristic type="RESOURCE">
  <parm name="URI" value="sip-project.our-domain.com:5060;transport=UDP"/>
  <parm name="AAUTHNAME" value="login-id"/>
  <parm name="AAUTHSECRET" value="password"/>
  <parm name="AAUTHDATA" value="server-realm"/>
 </characteristic>
</characteristic>
 
<characteristic type="APPLICATION">
 <parm name="APPID" value="w902E"/>
 <parm name="NAME" value="NAT/FW Traversal settings"/>
 <parm name="APPREF" value="SIP_appref"/>
 <characteristic type="NW">
  <parm name="DOMAIN" value="sip-project.our-domain.com"/>
  <parm name="CRLFREFRESH"/>
 </characteristic>
 <characteristic type="NATIAP">
  <parm name="TO-NAPID" value="INTERNET"/>
  <parm name="REFRESHTCP" value="1200"/>
  <parm name="REFRESHUDP" value="28"/>
  <parm name="STUNRETRANSMIT" value="250"/>
 </characteristic>
</characteristic><!-- APPLICATION -->
 
 
</wap-provisioningdoc>
 
We soon notice an interesting thing.  Normally, a SIP client refreshes at interval to keep its registration record alive in the SIP server.  In our case, the refresh does not happen until 20 minutes after the last expiry. 
 
In NOKIA S60 phone, the refreshing logic resends the SIP requests on behalf of the client based on the value of the Expires-header or expires-parameter in the 2XX response to the refreshed SIP request as follows:
 
if (expiresIn2xxResponse > 1200)
    {
    refreshAfter = expiresIn2xxResponse-600;
    }
else
    {
    refreshAfter = expiresIn2xxResponse/2;
    }
By inspecting the server log, we find that the 50-minute TTL in SIP header from NOKIA S60 is not recognized by our SIP server which expires the registration using its default 30-minute timeout value.  The NOKIA S60 considers itself alive not until 20 minutes after its registration was forced to expire.  Once the reason found, the problem is solved easily by changing the server TTL. 
 
In our nokia.aspx, we merge the above XML with appropriate login id and password from database, preparing to send back to customer.

No comments:

Post a Comment