<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Art Of Mobile</title>
	<atom:link href="http://www.artofmobile.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.artofmobile.com</link>
	<description>Art of Mobile provides information technology news articles, newsletters, blogs, reviews and conferences covering all aspects of wireless technology.</description>
	<lastBuildDate>Wed, 28 Mar 2012 11:08:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Additional OMA DRM&#8217;s Permission</title>
		<link>http://www.artofmobile.com/2007/12/20/additional-oma-drms-permission/</link>
		<comments>http://www.artofmobile.com/2007/12/20/additional-oma-drms-permission/#comments</comments>
		<pubDate>Thu, 20 Dec 2007 13:13:19 +0000</pubDate>
		<dc:creator>artofmobile</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[WAP]]></category>

		<guid isPermaLink="false">http://www.artofmobile.com/2007/12/20/additional-oma-drms-permission/</guid>
		<description><![CDATA[The perl library in this article &#8212; &#8220;Perl Module to encapsulate OMA DRM format for a media type&#8221; only supports the following permissions: o-dd:display o-dd:play As some readers asked me to include additional permission, and I&#8217;ve included the following permissions: &#8230; <a href="http://www.artofmobile.com/2007/12/20/additional-oma-drms-permission/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>The perl library in this article &#8212; &#8220;<a href="/2007/07/05/perl-module-to-encapsulate-oma-drm-format-for-a-media-type/">Perl Module to encapsulate OMA DRM format for a media type</a>&#8221; only supports the following permissions:</p>
<ul>
<li>o-dd:display</li>
<li>o-dd:play</li>
</ul>
<p>As some readers asked me to include additional permission, and I&#8217;ve included the following permissions:</p>
<ul>
<li>o-dd:print</li>
<li>o-dd:execute</li>
</ul>
<p>You can download the package at <a href="http://www.artofmobile.com/posts/Net-OmaDrm-0.15.tar.gz">Net-OmaDrm-0.10.tar.gz</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.artofmobile.com/2007/12/20/additional-oma-drms-permission/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>EMI UCP protocol</title>
		<link>http://www.artofmobile.com/2007/11/10/emi-ucp-protocol/</link>
		<comments>http://www.artofmobile.com/2007/11/10/emi-ucp-protocol/#comments</comments>
		<pubDate>Sat, 10 Nov 2007 09:51:46 +0000</pubDate>
		<dc:creator>artofmobile</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[SMS]]></category>

		<guid isPermaLink="false">http://www.artofmobile.com/2007/11/10/emi-ucp-protocol/</guid>
		<description><![CDATA[External Machine Interface (EMI), an extension to Universal Computer Protocol (UCP) is a SMSC VAS protocol created by CMG. As one of the major SMSC vendor, EMI and SMPP are two of the widely used SMSC VAS protocol. Even after &#8230; <a href="http://www.artofmobile.com/2007/11/10/emi-ucp-protocol/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>External Machine Interface (EMI), an extension to Universal Computer Protocol (UCP) is a SMSC VAS protocol created by CMG. As one of the major SMSC vendor, EMI and SMPP are two of the widely used SMSC VAS protocol. Even after the merger of Logica and CMG, both protocols are still widely used.</p>
<p>One of the free library that I&#8217;ve using is from Marco Romano. It is a Perl library which can be used to generate EMI/UCP message easily. Please take a look at:</p>
<p><a href="http://search.cpan.org/~nemux/Net-UCP-0.29/">http://search.cpan.org/~nemux/Net-UCP-0.29/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.artofmobile.com/2007/11/10/emi-ucp-protocol/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Transcoding Engine</title>
		<link>http://www.artofmobile.com/2007/10/06/transcoding-engine/</link>
		<comments>http://www.artofmobile.com/2007/10/06/transcoding-engine/#comments</comments>
		<pubDate>Sat, 06 Oct 2007 11:12:45 +0000</pubDate>
		<dc:creator>artofmobile</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.artofmobile.com/2008/01/23/transcoding-engine/</guid>
		<description><![CDATA[Nowadays, anyone that working in the telco space, esp. those who work in the ip mobile space, has to come in touch with transcoding one way or another. Today, topic is about transcoding and how to find information for each &#8230; <a href="http://www.artofmobile.com/2007/10/06/transcoding-engine/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Nowadays, anyone that working in the telco space, esp. those who work in the ip mobile space, has to come in touch with transcoding one way or another. Today, topic is about transcoding and how to find information for each transcoding engine that are free and widely available.</p>
<p><strong>Image Transcoding</strong></p>
<p>The best and free engine that I&#8217;ve come across is ImageMagick. You can take a look at <a href="http://www.imagemagick.org/">www.imagemagick.org</a>. To convert from one format to another is as simple as:</p>
<pre>convert rose.jpg rose.png</pre>
<p><strong>Audio Transcoding</strong></p>
<p>Searching for free audio transcoding is not as simple as I thought initially until I found this web site at<br />
<a href="http://xa.bi/mms/">http://xa.bi/mms/</a>. It describes the difference audio transcoding engine and how they work together to convert different format of audio to/from one another.</p>
<p><strong><a href="http://www.encoding.com/video-transcoding">Video Transcoding</a></strong></p>
<p><a href="http://ffmpeg.mplayerhq.hu/">FFMpeg</a> is always the choice when I ask someone for a free source to transcode video file.</p>
<p>Check out these web site, it should give you a starting point of where to look out for free library and third party software to do transcoding.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.artofmobile.com/2007/10/06/transcoding-engine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perl Module to check OMA DRA support for a mobile device</title>
		<link>http://www.artofmobile.com/2007/09/03/perl-module-to-check-oma-dra-support-for-a-mobile-device/</link>
		<comments>http://www.artofmobile.com/2007/09/03/perl-module-to-check-oma-dra-support-for-a-mobile-device/#comments</comments>
		<pubDate>Sun, 02 Sep 2007 22:52:11 +0000</pubDate>
		<dc:creator>artofmobile</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[WAP]]></category>

		<guid isPermaLink="false">http://www.artofmobile.com/wordpress/2007/05/23/perl-module-to-check-oma-dra-support-for-a-mobile-device/</guid>
		<description><![CDATA[Last Month in one of articles, I covered a topic on how to get the screen size of a mobile device, someone is wondering about how to check the Open Mobile Alliance (OMA) Digital Rights Management (DRM) support. To check &#8230; <a href="http://www.artofmobile.com/2007/09/03/perl-module-to-check-oma-dra-support-for-a-mobile-device/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Last Month in one of articles, I covered a topic on how to <a href="/wordpress/2007/04/29/perl-module-to-get-the-screen-size-of-a-mobile-device/">get the screen size of a mobile device</a>, someone is wondering about how to check the Open Mobile Alliance (OMA) Digital Rights Management (DRM) support.</p>
<p>To check Forward-Lock, you need to ensure that the following content-type is accepted by the device:</p>
<ul>
<li>application/vnd.oma.drm.message</li>
</ul>
<p>To check Combined Delivery, you need to ensure that the following content-type is accepted by the device:</p>
<ul>
<li>application/vnd.oma.drm.message</li>
<li>application/vnd.oma.drm.rights+xml</li>
</ul>
<p>To check Separate Delivery, you need to ensure that the following content-type is accepted by the device:</p>
<ul>
<li>application/vnd.oma.drm.rights+xml</li>
<li>application/vnd.oma.drm.rights+wbxml</li>
<li>application/vnd.oma.drm.content</li>
</ul>
<p>One more thing is that the device may support (for example) Combined Delivery DRM, but you may not be able to use that in MMS. Thus, further check on &#8220;MmsCcppAccept&#8221; tag of the User Agent Profile (UAProf) to ensure that it is supported.</p>
<p>Some may wonder why I don&#8217;t just check the &#8220;DrmClass&#8221; tag instead. Well, you can, however, during my investigation, I found out that some mobile phone manufacturers do not include this in the UAProf. Thus, it is much safer to check the DRM&#8217;s content-types instead.</p>
<p>I have further modified the previous Mobile::UserAgentProfile library and include this checking into that. I have also make changes to the method calling so that I can hold the profile in memory rather than load the profile from file every time I need to check on the UAProf.</p>
<p><strong>INSTALL</strong></p>
<p>To install, do the following:</p>
<pre>
perl Makefile.PL
make
make install
</pre>
<p><span id="more-21"></span><br />
The following a a perldoc of this module:</p>
<p><strong>SYNOPSIS</strong></p>
<pre><code>
 use Mobile::UserAgentProfile;
 my $uaprof= new Mobile::UserAgentProfile();
</code></pre>
<p><strong>DESCRIPTION</strong><br />
This module will retrieve the screen size of the device from the UAProf.</p>
<p><strong>METHODS</strong></p>
<p><strong>new</strong>, this method is used to create the UserAgentProfile object. Initial call will be slow if the DefaultCacheDir directory is not found. If DefaultCacheDir is not found, this module will retrieve a list of UAProf from the Internet. The current list is available at <a href="/uaprof/">here</a> .</p>
<p>Usage:</p>
<pre><code>
my $uaprof= new Mobile::UserAgentProfile();

my $uaprof= new Mobile::UserAgentProfile(
     DefaultUrl=>"http://www.artofmobile.com/uaprof/",
     UserAgent=>"UserAgentProfile Grabber",
     DefaultCacheDir=>"UAGrabber"
);
</code></pre>
<p><strong>setDevice</strong>, this method will retrieve device profile on the UAProf URL. If the UAProf is not found in the DefaultCacheDir directory, this module will retrieve the UAProf from the given url. If the UAProf is found, it will retrieve from DefaultCacheDir directory.</p>
<p>Usage:</p>
<pre><code>
     $uaprof->setSize(HTTP_X_WAP_PROFILE=>$HTTP_X_WAP_PROFILE);
</code></pre>
<p>     Example of accepted value for HTTP_X_WAP_PROFILE:</p>
<pre>

http://nds1.nds.nokia.com/uaprof/N6070r100.xml

"http://wap.sonyericsson.com/UAprof/K700iR201.xml", "1-bgyyJlyTUYSczJUKDdFYyw=="
</pre>
<p><strong>getSize</strong>, this method will retrieve the size of the device.</p>
<p>Usage:</p>
<pre><code>
   my $size= $uaprof->getSize();
</code></pre>
<p><strong>isOmaDrmForwardLock</strong>, this method will retrieve to see whether it supports the following content-type:</p>
<ul>
<li>application/vnd.oma.drm.message</li>
</ul>
<p>Usage:</p>
<pre><code>
   my $support= $uaprof->isOmaDrmForwardLock();
</code></pre>
<p><strong>isOmaDrmCombinedDelivery</strong>, this method will retrieve to see whether it supports the following content-type:</p>
<ul>
<li>application/vnd.oma.drm.message</li>
<li>application/vnd.oma.drm.rights+xml</li>
</ul>
<p>Usage:</p>
<pre><code>
   my $support= $uaprof->isOmaDrmCombinedDelivery();
</code></pre>
<p><strong>isOmaDrmSeparateDelivery</strong>, this method will retrieve to see whether it supports the following content-type:</p>
<ul>
<li>application/vnd.oma.drm.rights+xml</li>
<li>application/vnd.oma.drm.rights+wbxml</li>
<li>application/vnd.oma.drm.content</li>
</ul>
<p>Usage:</p>
<pre><code>
   my $support= $uaprof->isOmaDrmSeparateDelivery();
</code></pre>
<p>You can download the package at <a href="/posts/Mobile-UserAgentProfile-0.10.tgz" title="Mobile::UserAgentProfile Perl Module">Mobile-UserAgentProfile-0.10.tgz</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.artofmobile.com/2007/09/03/perl-module-to-check-oma-dra-support-for-a-mobile-device/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perl Module to get the Screen Size of a mobile device</title>
		<link>http://www.artofmobile.com/2007/08/01/perl-module-to-get-the-screen-size-of-a-mobile-device/</link>
		<comments>http://www.artofmobile.com/2007/08/01/perl-module-to-get-the-screen-size-of-a-mobile-device/#comments</comments>
		<pubDate>Tue, 31 Jul 2007 17:50:42 +0000</pubDate>
		<dc:creator>artofmobile</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[WAP]]></category>

		<guid isPermaLink="false">http://www.artofmobile.com/wordpress/2007/04/29/perl-module-to-get-the-screen-size-of-a-mobile-device/</guid>
		<description><![CDATA[As mobile devices are created differently, there are a lot of different Screen size available in the market. Due to the small screen size, mobile application developers had always find it hard to optimize the WAP portal for different devices. &#8230; <a href="http://www.artofmobile.com/2007/08/01/perl-module-to-get-the-screen-size-of-a-mobile-device/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>As mobile devices are created differently, there are a lot of different Screen size available in the market. Due to the small screen size, mobile application developers had always find it hard to optimize the WAP portal for different devices. Keeping a record of the screen size is also difficult as there isn&#8217;t a standard way for mobile devices manufacturers to communicate to the mobile application developers.</p>
<p>User Agent Profile (UAProf) specification is the answer to this problem. It is used to capture capability and preference information for mobile   devices. This information can be used by content providers to produce content in an appropriate format for the specific device.</p>
<p>In this article, we will discuss the Perl module which use UAProf to get the screen size of the mobile devices. For further information, you can download a copy of UAProf&#8217;s specification at: </p>
<p><a href="http://www.openmobilealliance.org/tech/affiliates/wap/wap-248-uaprof-20011020-a.pdf">Specification of UAProf</a></p>
<p><strong>INSTALL</strong></p>
<p>To install, do the following:</p>
<pre>
perl Makefile.PL
make
make install
</pre>
<p><span id="more-20"></span><br />
The following a a perldoc of this module:</p>
<p><strong>SYNOPSIS</strong></p>
<pre><code>
 use Mobile::UserAgentProfile;
 my $uaprof= new Mobile::UserAgentProfile();
</code></pre>
<p><strong>DESCRIPTION</strong><br />
This module will retrieve the screen size of the device from the UAProf.</p>
<p><strong>METHODS</strong></p>
<p><strong>new</strong>, this method is used to create the UserAgentProfile object. initial call will be slow if the DefaultCacheDir directory is not found. If DefaultCacheDir is not found, this module will retrieve a list of UAProf from the Internet. The current list is available at <a href="/uaprof/">here</a> .</p>
<p>Usage:</p>
<pre><code>
my $uaprof= new Mobile::UserAgentProfile();

my $uaprof= new Mobile::UserAgentProfile(
     DefaultUrl=>"http://www.artofmobile.com/uaprof/",
     UserAgent=>"UserAgentProfile Grabber",
     DefaultCacheDir=>"UAGrabber"
);
</code></pre>
<p><strong>getSize</strong>, this method will retrieve the size of the device based on the UAProf URL. If the UAProf is not found in the DefaultCacheDir directory, this module will retrieve the UAProf from the given url. If the UAProf is found, it will retrieve from DefaultCacheDir directory.</p>
<p>Usage:</p>
<pre><code>
     my $size= $uaprof->getSize(HTTP_X_WAP_PROFILE=>$HTTP_X_WAP_PROFILE);
</code></pre>
<p>     Example of accepted value for HTTP_X_WAP_PROFILE:</p>
<pre>

http://nds1.nds.nokia.com/uaprof/N6070r100.xml

"http://wap.sonyericsson.com/UAprof/K700iR201.xml", "1-bgyyJlyTUYSczJUKDdFYyw=="
</pre>
<p>You can download the package at <a href="/posts/Mobile-UserAgentProfile-0.01.tgz" title="Mobile::UserAgentProfile Perl Module">Mobile-UserAgentProfile-0.01.tgz</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.artofmobile.com/2007/08/01/perl-module-to-get-the-screen-size-of-a-mobile-device/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perl Module to encapsulate OMA DRM format for a media type</title>
		<link>http://www.artofmobile.com/2007/07/05/perl-module-to-encapsulate-oma-drm-format-for-a-media-type/</link>
		<comments>http://www.artofmobile.com/2007/07/05/perl-module-to-encapsulate-oma-drm-format-for-a-media-type/#comments</comments>
		<pubDate>Thu, 05 Jul 2007 13:27:58 +0000</pubDate>
		<dc:creator>artofmobile</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[WAP]]></category>

		<guid isPermaLink="false">http://www.artofmobile.com/wordpress/2007/04/21/perl-module-to-format-the-content-with-oma-drm-content-type/</guid>
		<description><![CDATA[Open Mobile Alliance (OMA) is a standards body founded by telecommunication companies which develops open standards for the mobile phone industry. In order to ensure interoperability across all implementations for Digital Rights Management (DRM), the OMA provides DRM specifications so &#8230; <a href="http://www.artofmobile.com/2007/07/05/perl-module-to-encapsulate-oma-drm-format-for-a-media-type/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Open Mobile Alliance (OMA) is a standards body founded by telecommunication companies which develops open standards for the mobile phone industry. In order to ensure interoperability across all implementations for Digital Rights Management (DRM), the OMA provides DRM specifications so that content providers, operators and mobile phone manufacturers can easily integrate the DRM solution as smoothly as possible.</p>
<p>I have created Net::OmaDrm Perl module so that content providers can format the content-type quickly.</p>
<p>This module support the OMA DRM version 1.0 method of sending content to the handset. A device will declare the support for OMA-DRM by including one of the method which is provided by this module:</p>
<ul>
<li>Forward-lock</li>
<ul>
<li>Content-Type</li>
<ul>
<li>application/vnd.oma.drm.message</li>
</ul>
</ul>
<li>Combined delivery</li>
<ul>
<li>Content-Type</li>
<ul>
<li>application/vnd.oma.drm.message</li>
<li>application/vnd.oma.drm.rights+xml</li>
</ul>
<li>o-ex:permission</li>
<ul>
<li>o-dd:display</li>
<li>o-dd:play</li>
</ul>
<li>o-ex:constraint</li>
<ul>
<li>o-dd:count</li>
<li>o-dd:interval</li>
</ul>
</ul>
</ul>
<p>A detailed document of OMA-DRM can be found at:<br />
  <a href="http://www.openmobilealliance.org/release_program/drm_v1_0.html" title="OMA DRM" target="_blank">http://www.openmobilealliance.org/release_program/drm_v1_0.html</a></p>
<p>I have tested this module on perl v5.8.5.</p>
<p><strong>INSTALL</strong><br />
    To install, do the following:</p>
<pre>
perl Makefile.PL
make
make install
</pre>
<p><span id="more-18"></span><br />
The following is a perldoc of this module:</p>
<p><strong>SYNOPSIS</strong></p>
<pre><code>
use Net::OmaDrm;

my $mydrm = Net::OmaDrm->new($basepath);
my $content= $mydrm->genForwardLock($content_name,$content_type);
</code></pre>
<p><strong>DESCRIPTION</strong><br />
   This module will encapsulate the media type to a multi-type content with OMA DRM standard.</p>
<p><strong>METHODS</strong><br />
   <strong>new</strong>, this method is used to create the OmaDrm object.</p>
<p>     Usage:</p>
<pre><code>
my $mydrm = Net::OmaDrm->new($basepath);
</code></pre>
<p>     The complete list of arguments is:</p>
<ul>
<li>$basepath : This is the base path for the content.</li>
</ul>
<p>   <strong>genForwardLock</strong>, this method will generate the Forward Lock DRM with an input Media Type.</p>
<p>     Usage:</p>
<pre><code>
my $content= $mydrm->genForwardLock($content_name,$content_type);
</code></pre>
<p>     The complete list of arguments is:</p>
<ul>
<li>$content_name : File name of the content.</li>
<li>$content_type : Content Type.</li>
</ul>
<p>   <strong>genCombinedDelivery</strong>, this method will generate multipart content with rights.</p>
<p>     Usage:</p>
<pre><code>
my $content= $mydrm->genCombinedDelivery($content_name,$content_type,$interval,$count);
</code></pre>
<p>Example:</p>
<pre><code>
my $content= $mydrm->genCombinedDelivery("image.gif","image/gif","",3);
my $content= $mydrm->genCombinedDelivery("image.gif","image/gif","P30S","");
</code></pre>
<p>The complete list of arguments is:</p>
<ul>
<li>$content_name : File name of the content.</li>
<li>$content_type : Content Type.</li>
<li>$interval     : Interval that the content can play.</li>
<li>$count    : Number of time that the content can play.</li>
</ul>
<p><b>Sample Source Code</b></p>
<p>The following is a full source code sample for your reference:</p>
<pre><code>
#!/usr/local/bin/perl
use strict;
use Net::OmaDrm;

my $basepath='images';
my $content_name='logo.gif';
my $content_type='image/gif';
my $interval='P60S';
my $count='';

my $mydrm = Net::OmaDrm->new($basepath);
my $content= $mydrm->genCombinedDelivery($content_name,$content_type,$interval,$count);

print "$content\n";
</code></pre>
<p>The above sample source code will input the image file, logo.gif and format the DRM content with display permission of 60 seconds. An example URL for this sample is available at <a href="http://www.artofmobile.com/logo.pl">http://www.artofmobile.com/logo.pl</a>. Enter this URL in your WAP browser in your phone and download the content.</p>
<p>You can download the package at <a href="/posts/Net-OmaDrm-0.10.tar.gz" title="Net::OmaDrm Perl Module">Net-OmaDrm-0.10.tar.gz</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.artofmobile.com/2007/07/05/perl-module-to-encapsulate-oma-drm-format-for-a-media-type/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perl Module to access Clickatell HTTP API</title>
		<link>http://www.artofmobile.com/2007/06/03/perl-module-to-access-to-clickatell-http-api/</link>
		<comments>http://www.artofmobile.com/2007/06/03/perl-module-to-access-to-clickatell-http-api/#comments</comments>
		<pubDate>Sun, 03 Jun 2007 14:43:51 +0000</pubDate>
		<dc:creator>artofmobile</dc:creator>
				<category><![CDATA[MMS]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[SMS]]></category>
		<category><![CDATA[WAP]]></category>

		<guid isPermaLink="false">http://www.artofmobile.com/wordpress/2007/04/17/perl-module-to-access-to-clickatell-http-api/</guid>
		<description><![CDATA[I&#8217;ve written a perl module to access to Clickatell HTTP API. This module supports the API from Clickatell&#8217;s HTTP API Specification v.2.2.7. The following are all the available APIs and whether they are supported or not: Basic Commands http://api.clickatell.com/http/auth Yes &#8230; <a href="http://www.artofmobile.com/2007/06/03/perl-module-to-access-to-clickatell-http-api/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve written a perl module to access to Clickatell HTTP API. This module supports the API from Clickatell&#8217;s HTTP API Specification v.2.2.7.</p>
<p>The following are all the available APIs and whether they are supported or not:</p>
<p><strong>Basic Commands</strong>  </p>
<ul>
<li>http://api.clickatell.com/http/auth                </li>
<ul>
<li>Yes (But session Not support)</li>
</ul>
<li>http://api.clickatell.com/http/ping                </li>
<ul>
<li>Yes (But session Not support)</li>
</ul>
<li>http://api.clickatell.com/http/querymsg            </li>
<ul>
<li>Yes</li>
</ul>
<li>http://api.clickatell.com/http/sendmsg             </li>
<ul>
<li>Yes</li>
</ul>
</ul>
<p><strong>Additional Commands</strong></p>
<ul>
<li>http://api.clickatell.com/http/delmsg              </li>
<ul>
<li>No</li>
</ul>
<li>http://api.clickatell.com/http/getbalance          </li>
<ul>
<li>Yes</li>
</ul>
<li>http://api.clickatell.com/http/routeCoverage.php   </li>
<ul>
<li>Yes</li>
</ul>
<li>http://api.clickatell.com/mms/ind_push.php         </li>
<ul>
<li>Yes</li>
</ul>
<li>http://api.clickatell.com/mms/si_push.php          </li>
<ul>
<li>Yes</li>
</ul>
<li>http://api.clickatell.com/http/getmsgcharge        </li>
<ul>
<li>Yes</li>
</ul>
<li>http://api.clickatell.com/http/token_pay           </li>
<ul>
<li>No</li>
</ul>
</ul>
<p><strong>Batch Messaging</strong></p>
<ul>
<li>http://api.clickatell.com/http_batch/startbatch    </li>
<ul>
<li>No</li>
</ul>
<li>http://api.clickatell.com/http_batch/senditem      </li>
<ul>
<li>No</li>
</ul>
<li>http://api.clickatell.com/http_batch/quicksend     </li>
<ul>
<li>No</li>
</ul>
<li>http://api.clickatell.com/http_batch/endbatch      </li>
<ul>
<li>No</li>
</ul>
</ul>
<p>I tested this module on perl  v5.8.5.</p>
<p><strong>INSTALL</strong></p>
<p>To install the module, perform the usual perl module installation procedures. The following is the steps:</p>
<pre>
        perl Makefile.PL
        make
        make install
</pre>
<p><span id="more-17"></span><br />
The following is a perldoc of this module:</p>
<p><strong>SYNOPSIS</strong><br />
        With SSL</p>
<pre><code>
 use Net::Clickatell;

 my $clickatell = Net::Clickatell->new( API_ID => $api_id,
                                      USERNAME => $username,
                                      PASSWORD => $password );
 my $bal=$clickatell->getBalance;
</code></pre>
<p>        Without SSL</p>
<pre><code>
 use Net::Clickatell;

 my $clickatell = Net::Clickatell->new( UseSSL=> 0,
                                       API_ID => $api_id,
                                     USERNAME => $username,
                                     PASSWORD => $password );
 my $bal=$clickatell->getBalance;
</code></pre>
<p><strong>DESCRIPTION</strong></p>
<p>Clickatell (http://www.clickatell.com) is a commercial service that allows its users to send SMS messages to anyone in the world. This perl module allow users to send SMS, WAP push and MMS through Clickatell HTTP API.</p>
<p>Please take note that neither this software nor the author are related to Clickatell in any way.</p>
<p><strong>METHODS</strong></p>
<p>        <strong>new</strong><br />
   This method is used to create the Clickatell object.</p>
<p>   Usage:</p>
<pre><code>
 my $clickatell = Net::Clickatell->new( API_ID => $api_id,
                                          USERNAME => $user,
                                          PASSWORD => $passwd );
</code></pre>
<p>   The complete list of arguments is:</p>
<pre>
     API_ID    : Unique number received from Clickatell when an account is created.
     UseSSL    : Tell Clickatell module whether to use SSL or not (0 or 1).
     BaseURL   : Default URL used to connect with Clickatell service.
     UserAgent : Name of the user agent you want to display to Clickatell service.
</pre>
<p>        <strong>getBalance</strong><br />
   This method will return the Balance of the account.</p>
<p>   Usage:</p>
<pre><code>
  $clickatell->getBalance;
</code></pre>
<p>   Succesful example of the return is as followed:<br />
    OK: Credit: 100.3</p>
<p>   Failed example of the return is as followed:<br />
    ERR: 001, Authentication failed</p>
<p>        <strong>checkCoverage</strong><br />
   This method will return the Balance of the account.</p>
<p>   Usage:</p>
<pre><code>
  $clickatell->checkCoverage($msisdn);
</code></pre>
<p>   Succesful example of the return is as followed:<br />
    OK: This prefix is currently supported. Messages sent to this prefix will be routed. Charge: 1</p>
<p>   Failed example of the return is as followed:<br />
    ERR: This prefix is not currently supported. Messages sent to this prefix will fail. Please contact support for assistance.</p>
<p>        <strong>getReturnMessageCharge</strong><br />
   This method will return the Message Charge Status.</p>
<p>   Usage:</p>
<pre><code>
 my $messagecharge=$clickatell->getMessageCharge($smsResult);
</code></pre>
<p>   Succesful example of the return is as followed:<br />
    OK: This prefix is currently supported. Messages sent to this prefix will be routed. Charge: 1</p>
<p>   Failed example of the return is as followed:<br />
    ERR: This prefix is not currently supported. Messages sent to this prefix will fail. Please contact support for assistance.</p>
<p>        <strong>sendBasicSMSMessage</strong><br />
   This method is used to send a SMS Message.</p>
<p>   Usage:</p>
<pre><code>
 my $smsResult=$clickatell->sendBasicSMSMessage($from,$to,$msg);
</code></pre>
<p>   Succesful example of the return is as followed:<br />
    OK: ID: dd8f5556c0d3d54bc94a4cd8800f01b4</p>
<p>   Failed example of the return is as followed:<br />
    ERR: 105, Invalid Destination Address</p>
<p>        <strong>sendMMNotification</strong><br />
   This method is used to send a MMS Notification Push Message.</p>
<p>   Usage:</p>
<pre><code>
 my $mmsResult=$clickatell->sendMMNotification($from,$to,$tranid,$expiry,$url);
</code></pre>
<p>   Succesful example of the return is as followed:<br />
    OK: ID: dd8f5556c0d3d54bc94a4cd8800f01b4</p>
<p>   Failed example of the return is as followed:<br />
    ERR: 105, Invalid Destination Address</p>
<p>        <strong>sendWAPPush</strong><br />
   This method is used to send a WAP Push. Currently, only SI WAP Push message is supported.</p>
<p>   Usage:</p>
<pre><code>
 my $wapResult=$clickatell->sendWAPPush($from,$to,$msg,$url);
</code></pre>
<p>   Succesful example of the return is as followed:<br />
    OK: ID: dd8f5556c0d3d54bc94a4cd8800f01b4</p>
<p>   Failed example of the return is as followed:<br />
    ERR: 105, Invalid Destination Address</p>
<p>You can download the package at <a href="/posts/Net-Clickatell-0.10.tgz">Net-Clickatell-0.10.tgz</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.artofmobile.com/2007/06/03/perl-module-to-access-to-clickatell-http-api/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Check Device&#8217;s User-Agent using Perl</title>
		<link>http://www.artofmobile.com/2007/05/20/check-devices-user-agent-using-perl/</link>
		<comments>http://www.artofmobile.com/2007/05/20/check-devices-user-agent-using-perl/#comments</comments>
		<pubDate>Sat, 19 May 2007 16:34:17 +0000</pubDate>
		<dc:creator>artofmobile</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[WAP]]></category>

		<guid isPermaLink="false">http://www.artofmobile.com/wordpress/2007/04/12/check-devices-user-agent-using-perl/</guid>
		<description><![CDATA[There is a CPAN library that helps to parse the User-Agent. You can download the Perl library at: http://search.cpan.org/~cmanley/Mobile-UserAgent-1.05/lib/Mobile/UserAgent.pm After you download the library, perform the usual installation procedures: perl Makefile.PL make make install The following is the source code: &#8230; <a href="http://www.artofmobile.com/2007/05/20/check-devices-user-agent-using-perl/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>There is a CPAN library that helps to parse the User-Agent. You can download the Perl library at:</p>
<p><a href="http://search.cpan.org/~cmanley/Mobile-UserAgent-1.05/lib/Mobile/UserAgent.pm">http://search.cpan.org/~cmanley/Mobile-UserAgent-1.05/lib/Mobile/UserAgent.pm</a></p>
<p>After you download the library, perform the usual installation procedures:</p>
<pre>
perl Makefile.PL
make
make install
</pre>
<p>The following is the source code:</p>
<pre><code>
#!/usr/local/bin/perl
use strict;

use Mobile::UserAgent;
my $uaobj = new Mobile::UserAgent();
</code></pre>
<p>The codes above is the standard declaration so that you can call &#8220;Mobile::UserAgent&#8221; library. The following 3 lines are used for testing purposes. Uncomment the following 3 lines and comment the above 1 line to do some testing.</p>
<pre><code>
#my $useragent = 'Nokia6600/1.0 (4.09.1) SymbianOS/7.0s Series60/2.0 '.
#   'Profile/MIDP-2.0 Configuration/CLDC-1.0';
#my $uaobj = new Mobile::UserAgent($useragent);
</code></pre>
<p>The following lines check the User-Agent string and pass the output to the subroutine &#8220;printWml&#8221; if the device suppose WML or the subroutine &#8220;printHtml&#8221; if the device doesn&#8217;t.</p>
<pre><code>
if ($uaobj->success()) {
   my $out='Vendor: ' . $uaobj->vendor()     . "\n";
   $out.='Model:    ' . $uaobj->model()      . "\n";
   $out.='Version:  ' . $uaobj->version()    . "\n";
   $out.='Series60: ' . $uaobj->isSeries60() . "\n";
   &#038;printWml($out);
} else {
   &#038;printHtml("Connecting Client is not a mobile user-agent \n");
}
</code></pre>
<p><span id="more-15"></span><br />
The subroutine &#8220;printWml&#8221; is used to print the standard WML content on the device.</p>
<pre><code>
sub printWml {
   my $string= shift;
   print "Content-Type: text/vnd.wap.wml\r\n\r\n";
print <<EOFWML;
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
   "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
  <card id="init" newcontext="true" title="Art Of Mobile">
<p align="left">
      <small>
        $string
      </small>
    
<p align="left">
      Test script by Art of Mobile<br/>
    

  </card>
</wml>
EOFWML
}
</code></pre>
<p>The subroutine &#8220;printHtml&#8221; is used to print the standard HTML content on the browser.</p>
<pre><code>
sub printHtml{
   my $string= shift;
   print "Content-Type: text/html\r\n\r\n";
print <<EOFHTML;
<html>
<header>
</header>

<body>


$string


</body>
</html>
EOFHTML
}
</code></pre>
<p>You can download the full source code at <a href="/posts/mobileUserAgent.txt">mobileUserAgent.pl</a>.<br/></p>
<p>You can test the example by pointing your mobile phone&#8217;s WAP broswer to this url: </p>
<p>http://www.artofmobile.com/cgi-bin/mobile.pl</p>
]]></content:encoded>
			<wfw:commentRss>http://www.artofmobile.com/2007/05/20/check-devices-user-agent-using-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to convert SI message to GSM SMS User Data</title>
		<link>http://www.artofmobile.com/2007/05/05/how-to-convert-si-message-to-gsm-sms-user-data/</link>
		<comments>http://www.artofmobile.com/2007/05/05/how-to-convert-si-message-to-gsm-sms-user-data/#comments</comments>
		<pubDate>Sat, 05 May 2007 10:18:59 +0000</pubDate>
		<dc:creator>artofmobile</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[SMS]]></category>
		<category><![CDATA[WAP]]></category>

		<guid isPermaLink="false">http://www.artofmobile.com/wordpress/?p=10</guid>
		<description><![CDATA[After publishing the article on &#8220;How to send WAP Push data through SMPP&#8221;, there is a lot of requests on how to formulate the GSM SMS User Data. Basically, the following is an example in java with remark in the &#8230; <a href="http://www.artofmobile.com/2007/05/05/how-to-convert-si-message-to-gsm-sms-user-data/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>After publishing the article on &ldquo;<a href="/wordpress/?p=9">How to send WAP Push data through SMPP</a>&rdquo;, there is a lot of requests on how to formulate the GSM SMS User Data. </p>
<p>Basically, the following is an example in java with remark in the code to explain how this is done:</p>
<pre><code>
  public String toSmsBinary() {
    /**
     GSM SMS User Data
     06: UDH Length which is 6
     05: 16 bit address
     04: Length(4)
     0B84: Destination Port(2948)
     23F0: Source Port(9200)

     Wireless Session Protocol
     90: Transaction ID
     06: PDU Type(Push)
     01: Headers Length is 1
     AE: Content-Type is application/vnd.wap.sic

     */
    StringBuilder ud = new StringBuilder().append("0605040b8423f0900601ae");
    ud.append(toWBXML());
    return ud.toString();

  }
</code></pre>
<p>The above function creates the GSM SMS User Data and Wireless Session Protocol (WSP) header.<span id="more-10"></span></p>
<pre><code>
  public String toWBXML() {
    /**
     02: Version number - WBXML version 1.2
     05: SI 1.0 Public Identifier
     6A: Charset=UTF-8 (MIBEnum 106)
     00: String table length
     45: si, with content
     */
    StringBuilder wbxml = new StringBuilder().append("02056a0045");
    wbxml.append(indicationToWBXML());
    wbxml.append("01");
    return wbxml.toString();
  }
</code></pre>
<p>The above function creates the WAP Binary XML header and the following function will formulate the rest of the WAP Binary XML body.</p>
<pre><code>
  public String indicationToWBXML() {
    StringBuilder wbxml = new StringBuilder().append("c6");
    if (siId != null &#038;&#038; siId.length() > 0) {
//si-id attribute
      wbxml.append("11");
// string literal
      wbxml.append("03");
// si-id string
      wbxml.append(hexDump(siId.getBytes()));
// end string
      wbxml.append("00");
    }

    if (href != null &#038;&#038; href.length() > 0) {
      if (href.startsWith("http://www.")) {
        wbxml.append("0d");
        href = href.substring(11);
      }
      else if (href.startsWith("https://www.")) {
        wbxml.append("0f");
        href = href.substring(12);
      }
      else if (href.startsWith("http://")) {
        wbxml.append("0c");
        href = href.substring(7);
      }
      else if (href.startsWith("https://")) {
        wbxml.append("0e");
        href = href.substring(8);
      }
//String literal
      wbxml.append("03");
      wbxml.append(hexDump(href.getBytes()));
// end string
      wbxml.append("00");

      wbxml.append(getDecodedAction());

// >
      wbxml.append("01");
// The text value of the URL
      wbxml.append("03");

      byte[] bytes = value.getBytes();
      wbxml.append(hexDump(bytes));
      wbxml.append("00");

    }
    wbxml.append("01");
    return wbxml.toString();
  }

</code></pre>
<p>You can download the full source code at <a href="/posts/SiWapPush.java">SiWapPush.java</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.artofmobile.com/2007/05/05/how-to-convert-si-message-to-gsm-sms-user-data/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to send WAP Push data through SMPP</title>
		<link>http://www.artofmobile.com/2007/04/19/how-to-send-wap-push-data-through-smpp/</link>
		<comments>http://www.artofmobile.com/2007/04/19/how-to-send-wap-push-data-through-smpp/#comments</comments>
		<pubDate>Thu, 19 Apr 2007 08:03:01 +0000</pubDate>
		<dc:creator>artofmobile</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[SMS]]></category>
		<category><![CDATA[WAP]]></category>

		<guid isPermaLink="false">http://www.artofmobile.com/wordpress/?p=9</guid>
		<description><![CDATA[Here we would like to show you how to send a WAP Push message through SMPP using Java. This short tutorial will use the library and example source code from OpenSMPP. You can download the file from SourceForge. The downloadable &#8230; <a href="http://www.artofmobile.com/2007/04/19/how-to-send-wap-push-data-through-smpp/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Here we would like to show you how to send a WAP Push message through SMPP using Java. This short tutorial will use the library and example source code from OpenSMPP. You can download the file from <a href="https://sourceforge.net/project/showfiles.php?group_id=65109">SourceForge</a>.</p>
<p>The downloadable zipped file include source code and jar file libraries, and this article will modify this file SMPPTest.java to demonstrate how to do that.</p>
<p>Modify SMPPTest.java and include the following 2 functions:</p>
<pre><code>
    private static final String HEXINDEX = "0123456789abcdef          ABCDEF";

    public static byte[] hexToByte(String s) {
        int l = s.length() / 2;
        byte data[] = new byte[l];
        int j = 0;

        for (int i = 0; i < l; i++) {
            char c = s.charAt(j++);
            int n, b;

            n = HEXINDEX.indexOf(c);
            b = (n &#038; 0xf) << 4;
            c = s.charAt(j++);
            n = HEXINDEX.indexOf(c);
            b += (n &#038; 0xf);
            data[i] = (byte) b;
        }
        return data;
    }
</code></pre>
<p>The above function is used to convert Hexadecimal to binary data.<br />
<span id="more-9"></span></p>
<pre><code>
    private void wappush() {
        debug.enter(this, "SMPPTest.submit()");

        try {
            SubmitSM request = new SubmitSM();
            SubmitSMResp response;

// input values
            serviceType = getParam("Service type", serviceType);
            sourceAddress = getAddress("Source", sourceAddress);
            destAddress = getAddress("Destination", destAddress);
            replaceIfPresentFlag = getParam("Replace if present flag",
                                            replaceIfPresentFlag);

            payload = getParam("Payload", payload);

            scheduleDeliveryTime = getParam("Schedule delivery time",
                                            scheduleDeliveryTime);
            validityPeriod = getParam("Validity period", validityPeriod);
            esmClass = getParam("Esm class", (byte) 64);
            protocolId = getParam("Protocol id", protocolId);
            priorityFlag = getParam("Priority flag", priorityFlag);
            registeredDelivery = getParam("Registered delivery",
                                          registeredDelivery);
            dataCoding = getParam("Data encoding", (byte) 245);
            smDefaultMsgId = getParam("Sm default msg id", smDefaultMsgId);

// set values
            request.setServiceType(serviceType);
            request.setSourceAddr(sourceAddress);
            request.setDestAddr(destAddress);
            request.setReplaceIfPresentFlag(replaceIfPresentFlag);
            request.setScheduleDeliveryTime(scheduleDeliveryTime);
            request.setValidityPeriod(validityPeriod);
            request.setEsmClass(esmClass);

            request.setProtocolId(protocolId);
            request.setPriorityFlag(priorityFlag);
            request.setRegisteredDelivery(registeredDelivery);
            request.setDataCoding(dataCoding);
            request.setSmDefaultMsgId(smDefaultMsgId);

            request.setShortMessageData(new ByteBuffer(hexToByte(payload)));

// send the request

            int count = 1;
            System.out.println();
            count = getParam(
                    "How many times to submit this message (load test)", count);
            for (int i = 0; i < count; i++) {
                request.assignSequenceNumber(true);
                System.out.print("#" + i + "  ");
                System.out.println("Submit request, wap push");
                if (asynchronous) {
                    session.submit(request);
                    System.out.println();
                } else {
                    response = session.submit(request);
                    System.out.println("Submit response " +
                                       response.debugString());
                    messageId = response.getMessageId();
                }
            }

        } catch (Exception e) {
            event.write(e, "");
            debug.write("Submit operation failed. " + e);
            System.out.println("Submit operation failed. " + e);
        } finally {
            debug.exit(this);
        }
    }
</code></pre>
<p>The above "wappush" function is a modification from "SubmitSM" function.</p>
<p>To run the test client:</p>
<p>java -classpath "log4j-1.2.13.jar:openSMPP.jar:./" SMPPTest</p>
<p>The following is the entry for each setting:</p>
<pre>

-  1 bind
-  2 submit (t/tr)
-  3 wappush (t/tr)
-  4 submit multi (t/tr)
-  5 data (t/tr)
-  6 query (t/tr)
-  7 replace (t/tr)
-  8 cancel (t/tr)
-  9 enquire link (t/tr)
- 10 unbind
- 11 receive message (tr/r)
-  0 exit
> 3

Service type []
Source address TON [1]
Source address NPI [1]
Source address [1111]
Destination address TON [1]
Destination address NPI [1]
Destination address [6591234567]
Replace if present flag [0]
Payload [0605040b8423f0900601ae02056a0045c60d03676f6f676c652e636f6d00070103476f6
f676c652068656c6c6f000101]
Schedule delivery time []
Validity period []
Esm class [64]
Protocol id [0]
Priority flag [0]
Registered delivery [0]
Data encoding [-11]
Sm default msg id [0]

How many times to submit this message (load test) [1]
</pre>
<p>The PDU for this:<br />
<code>0605040b8423f0900601ae02056a0045c60d03676f6f676c652e636f6d00070103476f6f676c652068656c6c6f000101</code><br />
will look like the following in Ethereal:<br />
<a href="http://www.artofmobile.com/big.php?name=/posts/wappush-big.gif"><img src="http://www.artofmobile.com/posts/wappush-small.gif" alt="Wap Push" /></a></p>
<p>You can download the modified "SMPPTest.java" at <a href="http://www.artofmobile.com/posts/SMPPTest.java">http://www.artofmobile.com/posts/SMPPTest.java</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.artofmobile.com/2007/04/19/how-to-send-wap-push-data-through-smpp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

