Monday, April 8, 2013

Introduction to SIP

SIP stands for Session Initiation Protocol a signaling protocol defined by IETF used for controlling communication sessions. SIP is used to create, manage and terminate sessions in an IP based network. SIP is widely used in VOIP (Voice over IP) .

 

The two main entities in a SIP session are

User Agent Client

User Agent Server

There are several types of server

 

Proxy Server

Redirect Server

Registrar

Location Server

 

SIP is similar to HTTP protocol. To understand the differences lets first learn how HTTP Protocol works.

Here is a sample HTTP request

GET /index.html HTTP/1.1

Host: www.w3.org

User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:20.0) Gecko/20100101 Firefox/20.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: en-US,en;q=0.5

The first line is the request line which has the request method (GET), the URI that is being requested (index.html) and the protocol version (HTTP/1.1)

Following the request line is one or more request headers like Host, User-Agent etc.

An empty line break follows the request headers which is followed an options message body.

Once you understand the protocol you can mimic a browser and send a request to web server using telnet or a simple java program that uses plain socket.

TBD

Now lets take a look at SIP protocol and find out the differences between HTTP and SIP

Here is a sample SIP request

REGISTER sip:ss2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=a73kszlfl
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 1 REGISTER
Contact: <sips:bob@client.biloxi.example.com>
Content-Length: 0
 

The first line is the request line which has the request method (REGISTER), the URI that is being requested (index.html) and the protocol version (HTTP/1.1)

Following the request line is one or more request headers like Host, User-Agent etc.

An empty line break follows the request headers which is followed an options message body.

Thursday, April 4, 2013

Capturing Android SIP Logs using TCPDump

Please make sure your device is rooted before following these steps.

1. Start adb in root mode by entering the following command
            adb root

2. Download the tcpdump binary from either http://www.tcpdump.org or here

3. Push tcpdump to the device.
            adb push tcpdump-arm /data/local/

4. Make sure correct permission is set for tcpdump.
            adb shell chmod 777 /data/local/tcpdump-arm

5. Start capturing the network packets. Replace any with your interface name. In my case it was wlan0.
            adb shell /data/local/tcpdump-arm -i any -p -s 0 -w /data/local/captured.pcap

6. Once the network packets are captured we can copy that back to your machine to view it in wireshark.
            adb pull /data/local/captured.pcap

7. View the SIP packets in wireshark using the view filter.



Note: Wireshark can be downloaded from http://www.wireshark.org/download.html

Saturday, February 16, 2013

Setting Firefox location bar search engine

Recently I installed a freeware which came with ask.com plugin for firefox. This plugin after installing became default for lot of features in the browser which was really irritating me so had to remove the plugin.

Even then any search I do by entering the keyword directly in the address bar (location bar) went through ask.com. If you are also facing similar problem here are the steps to set your favorite search engine.

1. Type in about:config in the location bar and press Enter
2. You might see the This might void your warranty! warning screen. Click I'll be careful, I promise! to continue.
about
3. Enter keyword.URL in search field and press Enter.
4. Double click the keyword.URL to modify the value. Here is the list of URL for different search engines.
about1
Google
https://www.google.com/search?q=

Yahoo
http://search.yahoo.com/search?p=

Bing
http://www.bing.com/search?q=

Note
To disable this feature enter keyword.enabled and double click to set the value to true.

Tuesday, February 12, 2013

Declaring java package and method signature in JRuby

We can add the package declaration for the java classes generated by JRubyc by using java_package. Just add the following line before the JRuby class declaration

java_package 'package name'

And also make sure you have included the statement require 'java'.

[ruby]
require 'java'
java_package 'com.vkslabs.example.ruby'
class MyClass
def initialize()
end
def myfunction(msg)
puts msg;
end
end
MyClass.new.myfunction('Hello JRuby!');
[/ruby]

Now once you convert the code using jrubyc you will find that the package structure is automatically created.

Similarly you can declare signatures for java methods using
java_signature 'put method signature here'

[ruby]
require 'java'
java_package 'com.vkslabs.example.ruby'
class MyClass
def initialize()
end
java_signature 'void myJavaMethod(String msg)'
def myfunction(msg)
puts msg;
end
end
MyClass.new.myfunction('Hello JRuby!');
[/ruby]

Now you can call the new method signature from your java code by creating object for MyClass

[java]
import com.vkslabs.example.ruby;
class Test
{
public static void main(String[] a) {
MyClass obj = new MyClass();
obj.myJavaMethod(&quot;Hello Jruby from Java&quot;);
}
}
[/java]


Make sure you include jruby.jar while compiling Test.java

Compiling java code

Converting JRuby to Java

Now that we know how to write a basic JRuby code lets see how to convert the JRuby code in to Java code. JRuby comes with JRubyc a cross compiler that does the magic!

Convert to Java code
Compile JRuby in to Java Source file

Convert JRuby Java class files
Compile JRuby in to Java class file

Okay great! now you have Java source class for your JRuby class but what if you want to declare package and method signature for the generated java class?

Introduction to JRuby

JRuby
JRuby is an implementation of Ruby which runs on top of Java Virtual Machine. JRuby code can be embedded in Java code and your JRuby code can interact with Java Objects and has access to every Java API.

Why to use JRuby?
Ruby being a scripting language is dynamic and much faster than Java. There are lot of things that can be easily accomplished in Ruby for example I found that parsing & scraping HTML is much easier and faster in Ruby using HPricot. As a Java programmer and you can write part of your application in JRuby and then either embed this in your Java code or use JRubyC compiler to convert your JRuby code in to Java.

Your first JRuby program

[ruby]
require 'rubygems'
class MyClass
def initialize()
end
def myfunction(msg)
puts msg;
end
end
MyClass.new.myfunction('Hello JRuby!');
[/ruby]

Executing the above code can be done using the following command
jruby

Monday, February 11, 2013

Handling Home Key in Android

I recently came across "Todler lock" application which had lot of interesting features. One of the most intriguing feature was handling  of Home key event.

1.Create a Activity Alias

We use Activity alias in order to programmatically enable or disable home screen launcher. An alias of an activity acts as an independent entity and intent filters that are not in the original activity can be added.

Declare your activity and declare an alias for your activity with the following intent filters


[xml]
<activity
android:name="com.vkslabs.example.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity-alias
android:name=".MainActivityAlias"
android:targetActivity="com.vkslabs.example.MainActivity"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MONKEY"/>
</intent-filter>
</activity-alias>
[/xml]

2. Enabling and disabling component using setComponentEnabledSetting
[java]
PackageManager manager = getPackageManager();
ComponentName compName = new ComponentName("com.vkslabs.example", "com.vkslabs.example.MainActivityAlias");
//ComponentName compName = new ComponentName("<Package Name>", "<Package Name.Alias Name>");

manager.setComponentEnabledSetting(compName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
[/java]
You can use COMPONENT_ENABLED_STATE_DISABLED for disabling the alias.