<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6730068706524524033</id><updated>2012-01-12T22:53:18.122-08:00</updated><category term='BitTorrent'/><category term='facebook'/><category term='bluetooth'/><category term='asterisk'/><category term='android'/><category term='python'/><category term='Taipei App Engine Sprint 2009'/><category term='sikuli'/><category term='CTS'/><category term='0xlab'/><category term='QR code'/><category term='gsm'/><category term='qt'/><category term='WebKit'/><category term='app-engine'/><title type='text'>Reading, Writing and Arithmetic</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>51</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-595233347944784913</id><published>2011-09-02T01:07:00.000-07:00</published><updated>2011-09-02T07:51:16.557-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bluetooth'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><title type='text'>BT LE FindMe profile in Bluez</title><content type='html'>There is a &lt;a href="http://www.spinics.net/lists/linux-bluetooth/msg14969.html"&gt;post&lt;/a&gt; in Bluez mailing list "Current status on BLE development". It tells us current BT LE status in Bluez and also shows some git repositories with their development. I try to build their kernel and the latest bluez. I made some experiments and understood more about FindMe profile in Bluez.&lt;br /&gt;&lt;br /&gt;* Unstable kernel with Interleaved Discovery, RSSI Threshold monitor,&lt;br /&gt;LE scanning and remaining SM patches&lt;br /&gt;[1] http://git.infradead.org/users/vcgomes/linux-2.6.git (branch&lt;br /&gt;proximity-integration)&lt;br /&gt;&lt;br /&gt;* BlueZ Userspace&lt;br /&gt;[2] git://git.infradead.org/users/cktakahasi/bluez.git proximity-devel&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Experiment I:&lt;/span&gt; prepare one LE device only(Key Fob/Reporter/GATT Server) and one dual mode LE/BR/EDR device (Monitor/GATT Client) in Ubuntu machine. Key Fob runs immediate alert service. Bluez register the monitor service and it can write Alert Level to reporter. If Alert Level is mild or high, the Key Fob would ring. Then user can find where is the Key Fob. Reference to &lt;a href="https://developer.bluetooth.org/gatt/services/Pages/ServiceViewerOrig.aspx?u=org.bluetooth.service.immediate_alert.xml"&gt;Immediate Alert Service&lt;/a&gt; (UUID: 0x1802) page and &lt;a href="https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.alert_level.xml"&gt;Alert Level&lt;/a&gt;(UUID:0x2a06) page.&lt;br /&gt;&lt;br /&gt;Reference from Bluetooth.org site:&lt;br /&gt;The Immediate Alert service is instantiated as a Primary Service. There is only one instance of the Immediate Alert service on a device. There is only one instance of the Alert Level characteristic in an Immediate Alert service. This alert continues until one of following conditions occurs: &lt;br /&gt;•	An implementation specific timeout &lt;br /&gt;•	User interaction on this device &lt;br /&gt;•	A new alert level is written &lt;br /&gt;•	The physical link is disconnected&lt;br /&gt;&lt;br /&gt;Examples:&lt;br /&gt;If the written alert level is “No Alert”, no alerting is done on this device.&lt;br /&gt;If the written alert level is “Mild Alert”, the device alerts.&lt;br /&gt;If the written alert level is “High Alert”, the device alerts in the strongest possible way.&lt;br /&gt;&lt;br /&gt;How to demo it:&lt;br /&gt;1. set Key Fob to advertising mode&lt;br /&gt;2. try LE scan from Ubuntu&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;erin@sundays:/project/upstream/bluez$ sudo hcitool -i hci0 lescan&lt;br /&gt;LE Scan ...&lt;br /&gt;C0:FF:EE:C0:AA:06&lt;br /&gt;C0:FF:EE:C0:AA:06&lt;br /&gt;C0:FF:EE:C0:AA:06&lt;br /&gt;C0:FF:EE:C0:AA:06&lt;br /&gt;C0:FF:EE:C0:AA:06&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;3. create LE connection&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;erin@sundays:/project/upstream/bluez$ sudo hcitool -i hci0 lecc C0:FF:EE:C0:AA:06&lt;br /&gt;Connection handle 32&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;4. use gatttool to browse the service of LE device &lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;erin@sundays:/project/upstream/bluez$ sudo gatttool -i hci0 -b C0:FF:EE:C0:AA:06 -m 48 --interactive&lt;br /&gt;[   ][C0:FF:EE:C0:AA:06][LE]&gt; connect&lt;br /&gt;[CON][C0:FF:EE:C0:AA:06][LE]&gt; primary&lt;br /&gt;[CON][C0:FF:EE:C0:AA:06][LE]&gt; &lt;br /&gt;attr handle: 0x0001, end grp handle: 0x000b uuid: 00001800-0000-1000-8000-00805f9b34fb&lt;br /&gt;attr handle: 0x000c, end grp handle: 0x000e uuid: 00001801-0000-1000-8000-00805f9b34fb&lt;br /&gt;attr handle: 0x000f, end grp handle: 0x0011 uuid: 00001803-0000-1000-8000-00805f9b34fb&lt;br /&gt;attr handle: 0x0012, end grp handle: 0x0014 uuid: 00001802-0000-1000-8000-00805f9b34fb&lt;br /&gt;attr handle: 0x0015, end grp handle: 0x0017 uuid: 00001804-0000-1000-8000-00805f9b34fb&lt;br /&gt;attr handle: 0x0018, end grp handle: 0x001e uuid: 0000ffb0-0000-1000-8000-00805f9b34fb&lt;br /&gt;attr handle: 0x001f, end grp handle: 0x0031 uuid: 0000ffa0-0000-1000-8000-00805f9b34fb&lt;br /&gt;attr handle: 0x0032, end grp handle: 0x0036 uuid: 0000ffe0-0000-1000-8000-00805f9b34fb&lt;br /&gt;[CON][C0:FF:EE:C0:AA:06][LE]&gt; characteristics 0x0012 0x0014&lt;br /&gt;[CON][C0:FF:EE:C0:AA:06][LE]&gt; &lt;br /&gt;handle: 0x0013, char properties: 0x08, char value handle: 0x0014, uuid: 00002a06-0000-1000-8000-00805f9b34fb&lt;br /&gt;[CON][C0:FF:EE:C0:AA:06][LE]&gt; char-desc 0x0012 0x00014&lt;br /&gt;[CON][C0:FF:EE:C0:AA:06][LE]&gt; &lt;br /&gt;handle: 0x0012, uuid: 2800&lt;br /&gt;handle: 0x0013, uuid: 2803&lt;br /&gt;handle: 0x0014, uuid: 2a06&lt;br /&gt;[CON][C0:FF:EE:C0:AA:06][LE]&gt; char-read-uuid 2a06&lt;br /&gt;[CON][C0:FF:EE:C0:AA:06][LE]&gt; &lt;br /&gt;handle: 0x0011 	 value: 00 &lt;br /&gt;[CON][C0:FF:EE:C0:AA:06][LE]&gt; char-write-cmd 0x0011 02&lt;br /&gt;[CON][C0:FF:EE:C0:AA:06][LE]&gt; char-read-uuid 2a06&lt;br /&gt;[CON][C0:FF:EE:C0:AA:06][LE]&gt; &lt;br /&gt;handle: 0x0011 	 value: 02 &lt;br /&gt;[CON][C0:FF:EE:C0:AA:06][LE]&gt; disconnect&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;5. Key Fob would start to ring&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Experiment II:&lt;/span&gt; prepare two BT BR/EDR devices. One is my Ubuntu laptop (daydreamer) and the other is my Ubuntu Desktop (Sundays). Daydreamer is a Key Fob (Client) and Sundays is a Monitor (Server).&lt;br /&gt;&lt;br /&gt;1. Fake Immediate Alert profile and Link Loss profile in local data files. &lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;erin@sundays:/project/vcgomes/linux-2.6$ cat /var/lib/bluetooth/00\:13\:EF\:F0\:C4\:46/profiles &lt;br /&gt;78:DD:08:A3:A7:52 0000110a-0000-1000-8000-00805f9b34fb 0000110c-0000-1000-8000-00805f9b34fb 0000110e-0000-1000-8000-00805f9b34fb 00001112-0000-1000-8000-00805f9b34fb 0000111f-0000-1000-8000-00805f9b34fb 00001800-0000-1000-8000-00805f9b34fb 00001801-0000-1000-8000-00805f9b34fb 00001802-0000-1000-8000-00805f9b34fb 00001803-0000-1000-8000-00805f9b34fb&lt;br /&gt;erin@sundays:/project/vcgomes/linux-2.6$ cat /var/lib/bluetooth/00\:13\:EF\:F0\:C4\:46/primary &lt;br /&gt;78:DD:08:A3:A7:52 0011#0013#00001802-0000-1000-8000-00805f9b34fb 0009#000b#00001803-0000-1000-8000-00805f9b34fb&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;2. use dbus-send to change Alert Service value&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;erin@sundays:~$ dbus-send --system --type=method_call --print-reply --dest=org.bluez /org/bluez/2617/hci1/dev_78_DD_08_A3_A7_52 org.bluez.Proximity.GetProperties&lt;br /&gt;method return sender=:1.62 -&gt; dest=:1.91 reply_serial=2&lt;br /&gt;   array [&lt;br /&gt;      dict entry(&lt;br /&gt;         string "LinkLossAlertLevel"&lt;br /&gt;         variant             string "none"&lt;br /&gt;      )&lt;br /&gt;      dict entry(&lt;br /&gt;         string "ImmediateAlertLevel"&lt;br /&gt;         variant             string "none"&lt;br /&gt;      )&lt;br /&gt;   ]&lt;br /&gt;&lt;br /&gt;erin@sundays:~$ dbus-send --system --type=method_call --print-reply --dest=org.bluez /org/bluez/2617/hci1/dev_78_DD_08_A3_A7_52 org.bluez.Proximity.SetProperty string:ImmediateAlertLevel variant:string:high&lt;br /&gt;method return sender=:1.62 -&gt; dest=:1.92 reply_serial=2&lt;br /&gt;&lt;br /&gt;erin@sundays:~$ dbus-send --system --type=method_call --print-reply --dest=org.bluez /org/bluez/2617/hci1/dev_78_DD_08_A3_A7_52 org.bluez.Proximity.GetProperties&lt;br /&gt;method return sender=:1.62 -&gt; dest=:1.93 reply_serial=2&lt;br /&gt;   array [&lt;br /&gt;      dict entry(&lt;br /&gt;         string "LinkLossAlertLevel"&lt;br /&gt;         variant             string "none"&lt;br /&gt;      )&lt;br /&gt;      dict entry(&lt;br /&gt;         string "ImmediateAlertLevel"&lt;br /&gt;         variant             string "high"&lt;br /&gt;      )&lt;br /&gt;   ]&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;3. use gatttool to check the Alert Level value&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;erin@sundays:~$ dbus-send --system --type=method_call --print-reply --dest=org.bluez /org/bluez/2617/hci1/dev_78_DD_08_A3_A7_52 org.bluez.Proximity.SetProperty string:LinkLossAlertLevel variant:string:mild&lt;br /&gt;method return sender=:1.62 -&gt; dest=:1.96 reply_serial=2&lt;br /&gt;&lt;br /&gt;erin@sundays:/project/upstream/bluez$ sudo gatttool -i hci0 -b 78:DD:08:A3:A7:52 -p 31 -m 48 --interactive&lt;br /&gt;[   ][78:DD:08:A3:A7:52][BR]&gt; connect&lt;br /&gt;[CON][78:DD:08:A3:A7:52][BR]&gt; char-read-uuid 2a06&lt;br /&gt;[CON][78:DD:08:A3:A7:52][BR]&gt; &lt;br /&gt;handle: 0x000b 	 value: 01 &lt;br /&gt;handle: 0x0013 	 value: 00 &lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-595233347944784913?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/595233347944784913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2011/09/bt-le-findme-profile-in-bluez.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/595233347944784913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/595233347944784913'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2011/09/bt-le-findme-profile-in-bluez.html' title='BT LE FindMe profile in Bluez'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-601259890149752317</id><published>2011-04-19T02:24:00.000-07:00</published><updated>2011-05-06T04:03:04.777-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bluetooth'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>OBEX Message Access Profile introduction</title><content type='html'>Have you ever tried to push a SMS message from a laptop to an Android phone via Bluetooth? It's very similar to OPP (object push profile) and it is to use OBEX to exchange data too. I found some patches in &lt;a href="https://www.codeaurora.org/contribute/projects/qaep"&gt;Aurora&lt;/a&gt; about supporting MAP (message access profile) in Android two months ago. Finally, I got some time to play with it.&lt;br /&gt;&lt;br /&gt;What is &lt;a href="http://www.bluetomorrow.com/bluetooth-glossary/message-access-profile-map.html"&gt;MAP&lt;/a&gt;? MAP defines a set of features and procedures to exchange messages between devices. It is especially tailored for the automotive Hands-Free use case where an onboard terminal device (typically a Car-Kit installed in the car) takes advantage of the messaging capability of a communication device (typically a mobile phone). This profile can however also be used for other use cases that require the exchange of messages between two devices. &lt;br /&gt;&lt;br /&gt;I have no Car-Kit to verify this profile and I cannot find any platform to support it either. Therefore, I use python lightblue and  write few lines to verify this function. I have one samsung smdkv210 platform and one ubuntu laptop. Below is the list about MAP profile from &lt;a href="https://www.codeaurora.org/gitweb/quic/la/"&gt;Aurora git repository&lt;/a&gt;. If you are using gingerbread, you could apply their patches easily. Also, it's just a simple list and we should review git log to retrieve more patches related to MAP profile.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;native bluez&lt;/span&gt;&lt;br /&gt;Bluetooth : Add MAP service records into SDP tool&lt;br /&gt;https://www.codeaurora.org/gitweb/quic/la/?p=platform/external/bluetooth/bluez.git;a=commit;h=7f52e048879c74a35a212ed4a0ce2f14133e2806&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;android frameworks&lt;/span&gt;&lt;br /&gt;frameworks/bluetooth: Changes for enabling Bluetooth MAP profile&lt;br /&gt;https://www.codeaurora.org/gitweb/quic/la/?p=platform/frameworks/base.git;a=commit;h=a7d9bf26766e420be997d2858fc7b73b42868860&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Bluetooth UI application&lt;/span&gt;&lt;br /&gt;Bluetooth: Adding MAP Profile implementation&lt;br /&gt;https://www.codeaurora.org/gitweb/quic/la/?p=platform/packages/apps/Bluetooth.git;a=commit;h=e900ed4897561fbb317a8c1488ac84c0fb051068&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Email UI application&lt;/span&gt;&lt;br /&gt;Email: Changes to trigger Email app to update its mailbox from Bluetooth MAP Profile&lt;br /&gt;https://www.codeaurora.org/gitweb/quic/la/?p=platform/packages/apps/Email.git;a=commit;h=e11f384228e44cb8b718247436fc0501bb81673a&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;MMS UI application&lt;/span&gt;&lt;br /&gt;Mms: Enable MMS app to push a MMS added to outbox by Bluetooth MAP profile&lt;br /&gt;https://www.codeaurora.org/gitweb/quic/la/?p=platform/packages/apps/Mms.git;a=commit;h=703e2c2ae82f973954c539cd8e55470e4d6c3873&lt;br /&gt;&lt;br /&gt;Add MAS service from init.rc file and then we can see MAP record from sdptool.&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;#cat /root/init.rc&lt;br /&gt;service map /system/bin/sdptool add --channel=16 MAS&lt;br /&gt;    user bluetooth&lt;br /&gt;    group bluetooth net_bt_admin&lt;br /&gt;    disabled&lt;br /&gt;    oneshot&lt;br /&gt;&lt;br /&gt;# sdptool browse local&lt;br /&gt;Service Name: OBEX Message Access&lt;br /&gt;Service RecHandle: 0x10008&lt;br /&gt;Service Class ID List:&lt;br /&gt;  "" (0x1132)&lt;br /&gt;Protocol Descriptor List:&lt;br /&gt;  "L2CAP" (0x0100)&lt;br /&gt;  "RFCOMM" (0x0003)&lt;br /&gt;    Channel: 16&lt;br /&gt;  "OBEX" (0x0008)&lt;br /&gt;Profile Descriptor List:&lt;br /&gt;  "" (0x1134)&lt;br /&gt;    Version: 0x0100&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I use ipython to write my scripts to demo MAP function. I create an OBEX Client from my Ubuntu machine and use it to connect with Android device. It send a 'get' request to retrieve the first slot of SMS.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;import lightblue&lt;br /&gt;host="12:60:41:7F:03:11"&lt;br /&gt;port=16&lt;br /&gt;client = lightblue.obex.OBEXClient(host,port)&lt;br /&gt;client.connect()&lt;br /&gt;f=file('/home/erin/Desktop/temp','w+')&lt;br /&gt;client.get({'type':"x-bt/message",'name':'1'},f)&lt;br /&gt;f.seek(0)&lt;br /&gt;f.read()&lt;br /&gt;f.close()&lt;br /&gt;client.disconnect()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;table boarder='0'&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-FDQuogiepDM/TcPUz2uw1UI/AAAAAAAAHM4/vQKD5QM-TTE/s1600/device003.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 240px;" src="http://1.bp.blogspot.com/-FDQuogiepDM/TcPUz2uw1UI/AAAAAAAAHM4/vQKD5QM-TTE/s400/device003.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5603556348709098818" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-E3G-xgGs8L4/TcPUzyqAqhI/AAAAAAAAHMw/B-JN1y0rvHg/s1600/Screenshot-2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 216px;" src="http://1.bp.blogspot.com/-E3G-xgGs8L4/TcPUzyqAqhI/AAAAAAAAHMw/B-JN1y0rvHg/s400/Screenshot-2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5603556347615422994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-601259890149752317?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/601259890149752317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2011/04/obex-message-access-profile.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/601259890149752317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/601259890149752317'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2011/04/obex-message-access-profile.html' title='OBEX Message Access Profile introduction'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-FDQuogiepDM/TcPUz2uw1UI/AAAAAAAAHM4/vQKD5QM-TTE/s72-c/device003.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-8098450206097305524</id><published>2010-12-27T23:18:00.000-08:00</published><updated>2010-12-27T23:48:08.888-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bluetooth'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><title type='text'>GATT related dbus API</title><content type='html'>After trying &lt;a href="http://i-miss-erin.blogspot.com/2010/12/gatttool-in-bluez-over-bredr.html"&gt;gatttool&lt;/a&gt;, I am trying how to use this new &lt;a href="http://git.kernel.org/?p=bluetooth/bluez.git;a=blob;f=doc/attribute-api.txt;h=23808e6aaccd575f1571ac23e5d85d9279210ade;hb=HEAD"&gt;attribute&lt;/a&gt; dbus api in bluez. I find there is an "&lt;a href="http://git.kernel.org/?p=bluetooth/bluez.git;a=blob;f=attrib/example.c;h=6987facc1f629f3740ddebbdf6035fc893e98bd4;hb=HEAD"&gt;attrib/example.c&lt;/a&gt;" and it would create some service records to demo GATT. When we create a device to bluez, it would detect the device type. If it's a LE device, it would run to "attrib_client_register", then register Primary and Characteristics services. We can use &lt;a href="http://live.gnome.org/DFeet/"&gt;d-feet&lt;/a&gt; to see these interfaces. Also, bluez will write some data files to "/var/lib/bluetooth/". When we restart bluez, it can create these interfaces without discovering the remote device again.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/TRmVbCtdB_I/AAAAAAAAG84/quMbGy2_Niw/s1600/Screenshot.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 325px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/TRmVbCtdB_I/AAAAAAAAG84/quMbGy2_Niw/s400/Screenshot.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5555635907154741234" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Primary Service&lt;/span&gt;&lt;br /&gt;We can know what kind of services this remote BT device has from 'UUIDs' value. For example, "0x1801" is GENERIC_ATTRIB_SVCLASS_ID and "0x1800" is GENERIC_ACCESS_PROFILE_ID. 'Services' value is the object path of all primary services.&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;erin@sundays:~$ dbus-send --system --type=method_call --print-reply --dest=org.bluez /org/bluez/5444/hci0/dev_78_DD_08_A3_A7_52 org.bluez.Device.GetProperties&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;method return sender=:1.93 -&gt; dest=:1.96 reply_serial=2&lt;br /&gt;   array [&lt;br /&gt;      dict entry(&lt;br /&gt;         string "Address"&lt;br /&gt;         variant             string "78:DD:08:A3:A7:52"&lt;br /&gt;      )&lt;br /&gt;      dict entry(&lt;br /&gt;         string "Name"&lt;br /&gt;         variant             string ""&lt;br /&gt;      )&lt;br /&gt;      dict entry(&lt;br /&gt;         string "Alias"&lt;br /&gt;         variant             string "78-DD-08-A3-A7-52"&lt;br /&gt;      )&lt;br /&gt;      dict entry(&lt;br /&gt;         string "Paired"&lt;br /&gt;         variant             boolean true&lt;br /&gt;      )&lt;br /&gt;      dict entry(&lt;br /&gt;         string "Trusted"&lt;br /&gt;         variant             boolean false&lt;br /&gt;      )&lt;br /&gt;      dict entry(&lt;br /&gt;         string "Blocked"&lt;br /&gt;         variant             boolean false&lt;br /&gt;      )&lt;br /&gt;      dict entry(&lt;br /&gt;         string "Connected"&lt;br /&gt;         variant             boolean false&lt;br /&gt;      )&lt;br /&gt;      dict entry(&lt;br /&gt;         string "UUIDs"&lt;br /&gt;         variant             array [&lt;br /&gt;               string "00001105-0000-1000-8000-00805f9b34fb"&lt;br /&gt;               string "00001106-0000-1000-8000-00805f9b34fb"&lt;br /&gt;               string "0000110a-0000-1000-8000-00805f9b34fb"&lt;br /&gt;               string "0000110c-0000-1000-8000-00805f9b34fb"&lt;br /&gt;               string "0000110e-0000-1000-8000-00805f9b34fb"&lt;br /&gt;               string "00001112-0000-1000-8000-00805f9b34fb"&lt;br /&gt;               string "0000111f-0000-1000-8000-00805f9b34fb"&lt;br /&gt;               string "00001800-0000-1000-8000-00805f9b34fb"&lt;br /&gt;               string "00001801-0000-1000-8000-00805f9b34fb"&lt;br /&gt;               string "0000a002-0000-1000-8000-00805f9b34fb"&lt;br /&gt;               string "0000a004-0000-1000-8000-00805f9b34fb"&lt;br /&gt;               string "4f0ac096-35d4-4911-9631-dea8dc74eefe"&lt;br /&gt;            ]&lt;br /&gt;      )&lt;br /&gt;      dict entry(&lt;br /&gt;         string "Services"&lt;br /&gt;         variant             array [&lt;br /&gt;               object path "/org/bluez/5444/hci0/dev_78_DD_08_A3_A7_52/service0001"&lt;br /&gt;               object path "/org/bluez/5444/hci0/dev_78_DD_08_A3_A7_52/service0010"&lt;br /&gt;               object path "/org/bluez/5444/hci0/dev_78_DD_08_A3_A7_52/service0100"&lt;br /&gt;               object path "/org/bluez/5444/hci0/dev_78_DD_08_A3_A7_52/service0200"&lt;br /&gt;               object path "/org/bluez/5444/hci0/dev_78_DD_08_A3_A7_52/service0680"&lt;br /&gt;            ]&lt;br /&gt;      )&lt;br /&gt;      dict entry(&lt;br /&gt;         string "Adapter"&lt;br /&gt;         variant             object path "/org/bluez/5444/hci0"&lt;br /&gt;      )&lt;br /&gt;   ]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Characteristics Service&lt;/span&gt;&lt;br /&gt;We can also discover what kind of characteristics service this BT device has. It would like use gatttool to run "--characteristics" and it would register related interfaces like below:&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;erin@sundays:~$ dbus-send --system --type=method_call --print-reply --dest=org.bluez /org/bluez/5612/hci0/dev_78_DD_08_A3_A7_52/service0200 org.bluez.Characteristic.Discover&lt;br /&gt;method return sender=:1.107 -&gt; dest=:1.112 reply_serial=2&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;erin@sundays:~$ dbus-send --system --type=method_call --print-reply --dest=org.bluez /org/bluez/5612/hci0/dev_78_DD_08_A3_A7_52/service0200 org.bluez.Characteristic.GetProperties &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;method return sender=:1.107 -&gt; dest=:1.117 reply_serial=2&lt;br /&gt;   array [&lt;br /&gt;      dict entry(&lt;br /&gt;         string "Characteristics"&lt;br /&gt;         variant             array [&lt;br /&gt;               object path "/org/bluez/5612/hci0/dev_78_DD_08_A3_A7_52/service0200/characteristic0204"&lt;br /&gt;               object path "/org/bluez/5612/hci0/dev_78_DD_08_A3_A7_52/service0200/characteristic0212"&lt;br /&gt;            ]&lt;br /&gt;      )&lt;br /&gt;   ]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Attribute Value - READ&lt;/span&gt;&lt;br /&gt;From example.c, we know "0xA006" is TEMPERATURE_UUID. We can call below dbus method to retrieve its properties. This "Value" property is an array of bytes and it could have format, value and representation to describe the exact value meaning.&lt;br /&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;erin@sundays:~$ dbus-send --system --type=method_call --print-reply --dest=org.bluez /org/bluez/5612/hci0/dev_78_DD_08_A3_A7_52/service0200/characteristic0204 org.bluez.Characteristic.GetProperties&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;method return sender=:1.107 -&gt; dest=:1.118 reply_serial=2&lt;br /&gt;   array [&lt;br /&gt;      dict entry(&lt;br /&gt;         string "UUID"&lt;br /&gt;         variant             string "0000a006-0000-1000-8000-00805f9b34fb"&lt;br /&gt;      )&lt;br /&gt;      dict entry(&lt;br /&gt;         string "Name"&lt;br /&gt;         variant             string ""&lt;br /&gt;      )&lt;br /&gt;      dict entry(&lt;br /&gt;         string "Description"&lt;br /&gt;         variant             string "Outside Temperature"&lt;br /&gt;      )&lt;br /&gt;      dict entry(&lt;br /&gt;         string "Value"&lt;br /&gt;         variant             array of bytes [&lt;br /&gt;               8a 02&lt;br /&gt;            ]&lt;br /&gt;      )&lt;br /&gt;   ]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Bluez Data Files&lt;/span&gt;&lt;br /&gt;GATT related files in /var/lib/bluetooth&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;erin@sundays:~$ cat /var/lib/bluetooth/00\:1B\:DC\:02\:86\:C5/primary &lt;br /&gt;78:DD:08:A3:A7:52 0001#0006#00001800-0000-1000-8000-00805f9b34fb 0010#0012#00001801-0000-1000-8000-00805f9b34fb 0100#0111#0000a002-0000-1000-8000-00805f9b34fb 0200#0214#0000a004-0000-1000-8000-00805f9b34fb 0680#0685#4f0ac096-35d4-4911-9631-dea8dc74eefe &lt;br /&gt;&lt;br /&gt;erin@sundays:~$ cat /var/lib/bluetooth/00\:1B\:DC\:02\:86\:C5/characteristic &lt;br /&gt;78:DD:08:A3:A7:52#0001 0006#02#0006#00002a00-0000-1000-8000-00805f9b34fb 0006#02#0006#00002a00-0000-1000-8000-00805f9b34fb &lt;br /&gt;78:DD:08:A3:A7:52#0010 0012#02#0012#0000a001-0000-1000-8000-00805f9b34fb &lt;br /&gt;78:DD:08:A3:A7:52#0200 0204#02#0210#0000a006-0000-1000-8000-00805f9b34fb 0212#02#0214#0000a009-0000-1000-8000-00805f9b34fb &lt;br /&gt;&lt;br /&gt;erin@sundays:~$ cat /var/lib/bluetooth/00\:1B\:DC\:02\:86\:C5/attributes &lt;br /&gt;78:DD:08:A3:A7:52#0205 00002904-0000-1000-8000-00805f9b34fb#0EFE07A00108A0&lt;br /&gt;78:DD:08:A3:A7:52#0206 00002901-0000-1000-8000-00805f9b34fb#4F7574736964652054656D706572617475726500&lt;br /&gt;78:DD:08:A3:A7:52#0213 00002904-0000-1000-8000-00805f9b34fb#04000AA00BA008&lt;br /&gt;78:DD:08:A3:A7:52#0214 00002901-0000-1000-8000-00805f9b34fb#4F7574736964652052656C61746976652048756D696400&lt;br /&gt;&lt;br /&gt;erin@sundays:~$ cat /var/lib/bluetooth/00\:1B\:DC\:02\:86\:C5/profiles &lt;br /&gt;78:DD:08:A3:A7:52 00001105-0000-1000-8000-00805f9b34fb 00001106-0000-1000-8000-00805f9b34fb 0000110a-0000-1000-8000-00805f9b34fb 0000110c-0000-1000-8000-00805f9b34fb 0000110e-0000-1000-8000-00805f9b34fb 00001112-0000-1000-8000-00805f9b34fb 0000111f-0000-1000-8000-00805f9b34fb 00001801-0000-1000-8000-00805f9b34fb&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Attribute Value - WRITE&lt;/span&gt;&lt;br /&gt;How to change a characteristic value? I really don't know how to send a value like "variant array of bytes [8a 02]". Then, I use &lt;a href="http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html#bus-object"&gt;ipython&lt;/a&gt; to send this dbus method, then I can rewrite its value.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;In [1]: import dbus&lt;br /&gt;In [2]: bus_name="org.bluez"&lt;br /&gt;In [3]: obj_path="/org/bluez/5612/hci0/dev_78_DD_08_A3_A7_52/service0200/characteristic0204"&lt;br /&gt;In [4]: bus = dbus.SystemBus()&lt;br /&gt;In [5]: proxy = bus.get_object(bus_name,obj_path)&lt;br /&gt;In [6]: char = dbus.Interface(proxy, dbus_interface="org.bluez.Characteristic")&lt;br /&gt;In [7]: properties = char.GetProperties()&lt;br /&gt;In [8]: print properties&lt;br /&gt;dbus.Dictionary({dbus.String(u'Description'): dbus.String(u'Outside Temperature', variant_level=1), dbus.String(u'UUID'): dbus.String(u'0000a006-0000-1000-8000-00805f9b34fb', variant_level=1), dbus.String(u'Value'): dbus.Array([dbus.Byte(128), dbus.Byte(110)], signature=dbus.Signature('y'), variant_level=1), dbus.String(u'Name'): dbus.String(u'', variant_level=1)}, signature=dbus.Signature('sv'))&lt;br /&gt;In [9]: result = char.SetProperty("Value", dbus.Array([dbus.Byte(77), dbus.Byte(22)]))&lt;br /&gt;In [10]: properties = char.GetProperties()&lt;br /&gt;In [11]: print properties&lt;br /&gt;dbus.Dictionary({dbus.String(u'Description'): dbus.String(u'Outside Temperature', variant_level=1), dbus.String(u'UUID'): dbus.String(u'0000a006-0000-1000-8000-00805f9b34fb', variant_level=1), dbus.String(u'Value'): dbus.Array([dbus.Byte(77), dbus.Byte(22)], signature=dbus.Signature('y'), variant_level=1), dbus.String(u'Name'): dbus.String(u'', variant_level=1)}, signature=dbus.Signature('sv'))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/TRmVvfH_99I/AAAAAAAAG9A/81jyhNJVTtQ/s1600/Screenshot-1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 389px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/TRmVvfH_99I/AAAAAAAAG9A/81jyhNJVTtQ/s400/Screenshot-1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5555636258379659218" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-8098450206097305524?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/8098450206097305524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2010/12/gatt-related-dbus-api.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/8098450206097305524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/8098450206097305524'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2010/12/gatt-related-dbus-api.html' title='GATT related dbus API'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_fB3UGiuVTOI/TRmVbCtdB_I/AAAAAAAAG84/quMbGy2_Niw/s72-c/Screenshot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-3494537184124708882</id><published>2010-12-21T23:10:00.000-08:00</published><updated>2010-12-22T01:02:10.966-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bluetooth'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><title type='text'>gatttool in bluez over BR/EDR</title><content type='html'>Recently, I am studying Bluetooth 4.0 (&lt;a href="http://en.wikipedia.org/wiki/Bluetooth_low_energy"&gt;Low Energy&lt;/a&gt;) core spec and checking the latest bluez code about LE stuff. Here is my working notes and how I use 'gatttool' to verify Generic Attribute Profile (GATT) features. We can check this feature over BR/EDR first, not use real LE device yet. My working machine is Ubuntu 10.10.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span class="Apple-style-span"&gt;&lt;i&gt;Set up Bluez part&lt;/i&gt;&lt;/span&gt;&lt;span style="font-style:italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;retrieve latest bluez code, configure it with enable-attrib, and compile it&lt;span style="font-weight:bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;# git clone git://git.kernel.org/pub/scm/bluetooth/bluez.git&lt;br /&gt;# cd bluez&lt;br /&gt;# autoreconf -vifs&lt;br /&gt;# ./configure --prefix=/usr --mandir=/usr/share/man \&lt;br /&gt; --sysconfdir=/etc --localstatedir=/var --libexecdir=/lib --enable-attrib&lt;br /&gt;# make &amp;amp;&amp;amp; sudo make install&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;modify main.conf, enable LE and attribute-server&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;diff --git a/src/main.conf b/src/main.conf&lt;br /&gt;index c03f135..121ee9b 100644&lt;br /&gt;--- a/src/main.conf&lt;br /&gt;+++ b/src/main.conf&lt;br /&gt;@@ -58,9 +58,9 @@ DebugKeys = false&lt;br /&gt;&lt;br /&gt;# Enable Low Energy support if the dongle supports. Default is false.&lt;br /&gt;# Enable/Disable interleave discovery and attribute server over LE.&lt;br /&gt;-EnableLE = false&lt;br /&gt;+EnableLE = true&lt;br /&gt;&lt;br /&gt;# Enable the GATT Attribute Server. Default is false, because it is only&lt;br /&gt;# useful for testing. Attribute server is not enabled over LE if EnableLE&lt;br /&gt;# is false.&lt;br /&gt;-AttributeServer = false&lt;br /&gt;+AttributeServer = true&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;start bluetooth daemon in foreground with debug information&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;# sudo /usr/sbin/bluetoothd -n -d&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span class="Apple-style-span"&gt;&lt;i&gt;Play with gatttool&lt;/i&gt;&lt;/span&gt;&lt;span style="font-style:italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Since we configured Bluez with enable-attrib, we will start an attribute-server from running bluetooth daemon. It would add some attribute records for GATT service, and it's created from attrib/example.c file. Also, we will add a GAP service like below. &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;erin@sundays:~/project/bluez$ sdptool browse local&lt;br /&gt;Browsing FF:FF:FF:00:00:00 ...&lt;br /&gt;Service Name: Generic Attribute Profile&lt;br /&gt;Service Provider: BlueZ&lt;br /&gt;Service RecHandle: 0x10000&lt;br /&gt;Service Class ID List:&lt;br /&gt;  "Generic Attribute" (0x1801)&lt;br /&gt;Protocol Descriptor List:&lt;br /&gt;  "L2CAP" (0x0100)&lt;br /&gt;    PSM: 31&lt;br /&gt;  "ATT" (0x1801)&lt;br /&gt;    uint16: 0x1&lt;br /&gt;    uint16: 0xffff&lt;br /&gt;Profile Descriptor List:&lt;br /&gt;  "Generic Attribute" (0x1801)&lt;br /&gt;    Version: 0x0100&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Below GATT features are from &lt;a href="http://www.bluetooth.com/Specification%20Documents/Core_V40.zip"&gt;BT 4.0 core spec&lt;/a&gt; Volume 3 Part G.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/TRG-blgDpEI/AAAAAAAAG8o/rJSpFcER068/s1600/gatt.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 204px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/TRG-blgDpEI/AAAAAAAAG8o/rJSpFcER068/s400/gatt.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5553429196656845890" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Primary Service Discovery&lt;/span&gt;&lt;br /&gt;This procedure is used by a client to discover primary services on a server. Once the primary services are discovered, additional information about the primary services can be accessed using other procedures, including characteristic discovery and relationship discovery to find other related primary and secondary services.&lt;br /&gt;&lt;br /&gt; a. Discover all primary services ==&gt; "Read By Group Type Request"&lt;br /&gt; b. Discover primary service by service UUID ==&gt; "Find By Type Value Request"&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/TRGxzqa1shI/AAAAAAAAG7Q/dfgxlzd7e6E/s1600/discover_all_primary_service.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 270px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/TRGxzqa1shI/AAAAAAAAG7Q/dfgxlzd7e6E/s320/discover_all_primary_service.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5553415316642837010" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/TRGxzV4aPbI/AAAAAAAAG7I/mbA1eFU6-Nw/s1600/discover_primary_by_uuid.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 205px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/TRGxzV4aPbI/AAAAAAAAG7I/mbA1eFU6-Nw/s320/discover_primary_by_uuid.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5553415311129722290" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;gatt_discover_primary(attrib, opt_start, opt_end, opt_uuid, primary_by_uuid_cb, attrib);&lt;br /&gt;&lt;br /&gt;erin@sundays:~$ sudo gatttool -b 78:DD:08:A3:A7:52 --primary --psm=31 --mtu=48&lt;br /&gt;attr handle = 0x0001, end grp handle = 0x0006, attr value (UUID) = 1800&lt;br /&gt;attr handle = 0x0010, end grp handle = 0x0012, attr value (UUID) = 1801&lt;br /&gt;attr handle = 0x0100, end grp handle = 0x0111, attr value (UUID) = a002&lt;br /&gt;attr handle = 0x0200, end grp handle = 0x0214, attr value (UUID) = a004&lt;br /&gt;attr handle = 0x0680, end grp handle = 0x0685, attr value (UUID) = 4f0ac096-35d4-4911-9631-dea8dc74eefe&lt;br /&gt;&lt;br /&gt;erin@autumn:~/project/bluez$ gatttool -b 78:DD:08:A3:A7:52 --primary --uuid=1801&lt;br /&gt;Starting handle: 0010 Ending handle: 0012&lt;br /&gt;&lt;br /&gt;erin@autumn:~/project/bluez$ gatttool -b 78:DD:08:A3:A7:52 --primary --uuid=1800&lt;br /&gt;Starting handle: 0001 Ending handle: 0006&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Characteristic Discovery&lt;/span&gt;&lt;br /&gt;This procedure is used by a client to discover service characteristics on a server. Once the characteristics are discovered additional information about the characteristics can be discovered or accessed using other procedures.&lt;br /&gt;&lt;br /&gt; a. Discover all characteristics of a Service ==&gt; "Read By Type Request"&lt;br /&gt; b. Discover characteristics by UUID ==&gt; "Read By Type Request"&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/TRGzkuGn9oI/AAAAAAAAG7g/iLJzGMQYgZc/s1600/discover_all_characteristics.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 205px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/TRGzkuGn9oI/AAAAAAAAG7g/iLJzGMQYgZc/s320/discover_all_characteristics.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5553417258957010562" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/TRGzkVzJTZI/AAAAAAAAG7Y/taENI8hABxc/s1600/discover_characteristics_by_uuid.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/TRGzkVzJTZI/AAAAAAAAG7Y/taENI8hABxc/s320/discover_characteristics_by_uuid.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5553417252432858514" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;gatt_discover_char(attrib, opt_start, opt_end, char_discovered_cb, char_data);&lt;br /&gt;gatt_read_char_by_uuid(attrib, start, end, &amp;amp;uuid, func, user_data);&lt;br /&gt;&lt;br /&gt;erin@sundays:~$ sudo gatttool -b 78:DD:08:A3:A7:52 --characteristics --psm=31 --mtu=48&lt;br /&gt;handle = 0x0004, char properties = 0x02, char value handle = 0x0006, uuid = 2a00&lt;br /&gt;handle = 0x0011, char properties = 0x02, char value handle = 0x0012, uuid = a001&lt;br /&gt;handle = 0x0106, char properties = 0x02, char value handle = 0x0110, uuid = a003&lt;br /&gt;handle = 0x0203, char properties = 0x02, char value handle = 0x0204, uuid = a006&lt;br /&gt;handle = 0x0210, char properties = 0x02, char value handle = 0x0212, uuid = a009&lt;br /&gt;handle = 0x0501, char properties = 0x02, char value handle = 0x0502, uuid = a00c&lt;br /&gt;handle = 0x0503, char properties = 0x02, char value handle = 0x0504, uuid = a00d&lt;br /&gt;handle = 0x0506, char properties = 0x02, char value handle = 0x0507, uuid = a00c&lt;br /&gt;handle = 0x0508, char properties = 0x02, char value handle = 0x0509, uuid = a00d&lt;br /&gt;handle = 0x0560, char properties = 0x02, char value handle = 0x0568, uuid = a00f&lt;br /&gt;handle = 0x0682, char properties = 0x02, char value handle = 0x0683, uuid = 8088f218-902c-450b-b6c4-62891e8c25e9&lt;br /&gt;&lt;br /&gt;erin@autumn:~/project/bluez$ gatttool -b 78:DD:08:A3:A7:52 --characteristics --start=0x0001 --end=0x0100&lt;br /&gt;handle = 0x0004, char properties = 0x02, char value handle = 0x0006, uuid = 2a00&lt;br /&gt;handle = 0x0011, char properties = 0x02, char value handle = 0x0012, uuid = a001&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Characteristic Descriptor Discovery&lt;/span&gt;&lt;br /&gt;This procedure is used by a client to discover characteristic descriptors of a characteristic. Once the characteristic descriptors are discovered additional information about the characteristic descriptors can be accessed using other procedures.&lt;br /&gt;&lt;br /&gt; a. Discover All Characteristic Descriptors ==&gt;  "Find Information Request"&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/TRG0iAS3xAI/AAAAAAAAG7o/u798ckSJ23g/s1600/discover_all_characteristics_descriptors.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 197px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/TRG0iAS3xAI/AAAAAAAAG7o/u798ckSJ23g/s320/discover_all_characteristics_descriptors.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5553418311812236290" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;gatt_find_info(attrib, opt_start, opt_end, char_desc_cb, NULL);&lt;br /&gt;erin@sundays:~$ sudo gatttool -b 78:DD:08:A3:A7:52 --char-desc --psm=31&lt;br /&gt;handle = 0x0001, uuid = 2800&lt;br /&gt;handle = 0x0004, uuid = 2803&lt;br /&gt;handle = 0x0006, uuid = 2a00&lt;br /&gt;handle = 0x0010, uuid = 2800&lt;br /&gt;handle = 0x0011, uuid = 2803&lt;br /&gt;&lt;br /&gt;erin@autumn:~/project/bluez$ gatttool -b 78:DD:08:A3:A7:52 --char-desc --start=0x0001 --end=0x0010&lt;br /&gt;handle = 0x0001, uuid = 2800&lt;br /&gt;handle = 0x0004, uuid = 2803&lt;br /&gt;handle = 0x0006, uuid = 2a00&lt;br /&gt;handle = 0x0010, uuid = 2800&lt;br /&gt;erin@autumn:~/project/bluez$ gatttool -b 78:DD:08:A3:A7:52 --char-desc --start=0x0001 --end=0x0005&lt;br /&gt;handle = 0x0001, uuid = 2800&lt;br /&gt;handle = 0x0004, uuid = 2803&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Characteristic Value Read&lt;/span&gt;&lt;br /&gt;This procedure is used to read a Characteristic Value from a server. &lt;br /&gt;&lt;br /&gt; a. Read characteristic value&lt;br /&gt; b. Read using characteristic UUID&lt;br /&gt; c. Read long characteristic values (not implement)&lt;br /&gt; d. Read multiple characteristic values (not implement)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/TRG1VkQEgyI/AAAAAAAAG8I/TlvpaJsZ52M/s1600/read_char_value.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 152px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/TRG1VkQEgyI/AAAAAAAAG8I/TlvpaJsZ52M/s320/read_char_value.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5553419197637493538" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/TRG1VdnV0lI/AAAAAAAAG8A/qu-gs3zNA8Q/s1600/read_using_char_uuid.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 160px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/TRG1VdnV0lI/AAAAAAAAG8A/qu-gs3zNA8Q/s320/read_using_char_uuid.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5553419195856048722" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/TRG1VLPIrUI/AAAAAAAAG74/9gt9ZR31GyU/s1600/read_long_char_values.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 258px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/TRG1VLPIrUI/AAAAAAAAG74/9gt9ZR31GyU/s320/read_long_char_values.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5553419190922685762" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/TRG1U1MUblI/AAAAAAAAG7w/rTlcRpmAdmM/s1600/read_multiple_char_values.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 161px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/TRG1U1MUblI/AAAAAAAAG7w/rTlcRpmAdmM/s320/read_multiple_char_values.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5553419185005293138" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;gatt_read_char(attrib, opt_handle, char_read_cb, attrib);&lt;br /&gt;==&gt; g_attrib_send(attrib, ATT_OP_READ_REQ, pdu, plen, func, user_data, NULL);&lt;br /&gt;&lt;br /&gt;gatt_read_char_by_uuid(attrib, opt_start, opt_end, opt_uuid, char_read_by_uuid_cb, char_data);&lt;br /&gt;==&gt; g_attrib_send(attrib, ATT_OP_READ_BY_TYPE_REQ, pdu, plen, func, user_data, NULL);&lt;br /&gt;&lt;br /&gt;erin@sundays:~$ sudo gatttool -b 78:DD:08:A3:A7:52  --char-read --uuid=2800&lt;br /&gt;handle: 0x0001   value: 00 18&lt;br /&gt;handle: 0x0010   value: 01 18&lt;br /&gt;handle: 0x0100   value: 02 a0&lt;br /&gt;handle: 0x0200   value: 04 a0&lt;br /&gt;handle: 0x0680   value: 4f 0a c0 96 35 d4 49 11 96 31 de a8 dc 74 ee fe&lt;br /&gt;&lt;br /&gt;erin@sundays:~$ sudo gatttool -b 78:DD:08:A3:A7:52  --char-read --handle=0x0001&lt;br /&gt;Characteristic value/descriptor: 00 18&lt;br /&gt;&lt;br /&gt;erin@autumn:~/project/bluez$ gatttool -b 78:DD:08:A3:A7:52 --char-read --uuid=a00d&lt;br /&gt;handle: 0x0504   value: 32 33 37 34 39 35 2d 33 32 38 32 2d 41&lt;br /&gt;handle: 0x0509   value: 31 31 32 36 37 2d 32 33 32 37 41 30 30 32 33 39&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Characteristic value write&lt;/span&gt;&lt;br /&gt;This procedure is used to write a Characteristic Value to a server.&lt;br /&gt;&lt;br /&gt; a. Write without response&lt;br /&gt; b. Signed write without response (not check yet)&lt;br /&gt; c. Write characteristic value &lt;br /&gt; d. Write long charcharacteristic values  (not check yet)&lt;br /&gt; e. Reliable writes (not check yet)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/TRG2IlNxzsI/AAAAAAAAG8Y/wDhwhUAz9BE/s1600/write_without_response.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 132px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/TRG2IlNxzsI/AAAAAAAAG8Y/wDhwhUAz9BE/s320/write_without_response.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5553420074069642946" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/TRG2Iid_yNI/AAAAAAAAG8Q/Hpu1GPgxj88/s1600/write_char_value.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 159px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/TRG2Iid_yNI/AAAAAAAAG8Q/Hpu1GPgxj88/s320/write_char_value.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5553420073332361426" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;erin@sundays:~$ gatttool -b 78:DD:08:A3:A7:52 --char-write --psm=31 --mtu=48 --handle=0x0001 --value=0x0011&lt;br /&gt;erin@sundays:~$ gatttool -b 78:DD:08:A3:A7:52 --char-read --psm=31 --mtu=48 --handle=0x0001&lt;br /&gt;Characteristic value/descriptor: 00 00 11&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-3494537184124708882?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/3494537184124708882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2010/12/gatttool-in-bluez-over-bredr.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/3494537184124708882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/3494537184124708882'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2010/12/gatttool-in-bluez-over-bredr.html' title='gatttool in bluez over BR/EDR'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_fB3UGiuVTOI/TRG-blgDpEI/AAAAAAAAG8o/rJSpFcER068/s72-c/gatt.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-1079426568926940625</id><published>2010-10-24T23:38:00.000-07:00</published><updated>2010-10-25T01:39:52.685-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='BitTorrent'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Tips for Transmission in Android</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/TMVAYcyJ8hI/AAAAAAAAGi0/BKHs-Htx_GM/s1600/device02.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/TMVAYcyJ8hI/AAAAAAAAGi0/BKHs-Htx_GM/s320/device02.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5531898506082120210" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;use &lt;a href="https://trac.transmissionbt.com/wiki/WebInterface"&gt;Transmission Web UI&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;1. set &lt;a href="https://trac.transmissionbt.com/wiki/EnvironmentVariables"&gt;environment variable&lt;/a&gt; TRANSMISSION_WEB_HOME to "/etc/transmission/web"&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;diff --git a/external/transmission/libtransmission/platform.c b/external/transmission/libtransmission/platform.c&lt;br /&gt;index d3493ae..e7d6ab8 100644&lt;br /&gt;--- a/external/transmission/libtransmission/platform.c&lt;br /&gt;+++ b/external/transmission/libtransmission/platform.c&lt;br /&gt;@@ -27,6 +27,10 @@&lt;br /&gt;  #include &lt;pthread.h&gt;&lt;br /&gt; #endif&lt;br /&gt; &lt;br /&gt;+#ifndef TRANSMISSION_WEB_HOME&lt;br /&gt;+ #define TRANSMISSION_WEB_HOME "/etc/transmission/web"&lt;br /&gt;+#endif&lt;br /&gt;+&lt;br /&gt; #include &lt;assert.h&gt;&lt;br /&gt; #include &lt;stdio.h&gt;&lt;br /&gt; #include &lt;stdlib.h&gt;&lt;br /&gt;@@ -615,7 +619,10 @@ tr_getWebClientDir( const tr_session * session UNUSED )&lt;br /&gt;                     s = NULL;&lt;br /&gt;                 }&lt;br /&gt;             }&lt;br /&gt;-&lt;br /&gt;+#elif defined( TRANSMISSION_WEB_HOME )&lt;br /&gt;+                       {&lt;br /&gt;+                               s = tr_strdup( TRANSMISSION_WEB_HOME );&lt;br /&gt;+                       }&lt;br /&gt; #else /* everyone else, follow the XDG spec */&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;2. copy its Web UI to rootdir&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;diff --git a/rootdir/Android.mk b/rootdir/Android.mk&lt;br /&gt;index e91bad2..2f0ff12 100644&lt;br /&gt;--- a/rootdir/Android.mk&lt;br /&gt;+++ b/rootdir/Android.mk&lt;br /&gt;@@ -5,6 +5,43 @@ include $(CLEAR_VARS)&lt;br /&gt; &lt;br /&gt; copy_from := \&lt;br /&gt;        etc/dbus.conf \&lt;br /&gt;+        etc/transmission/web/stylesheets/common.css \&lt;br /&gt;+        etc/transmission/web/stylesheets/iphone.css \&lt;br /&gt;+        etc/transmission/web/stylesheets/ie7.css \&lt;br /&gt;+        etc/transmission/web/stylesheets/ie6.css \&lt;br /&gt;+        etc/transmission/web/javascript/menu.js \&lt;br /&gt;+        etc/transmission/web/javascript/common.js \&lt;br /&gt;+        etc/transmission/web/javascript/torrent.js \&lt;br /&gt;+        etc/transmission/web/javascript/transmission.remote.js \&lt;br /&gt;+        etc/transmission/web/javascript/jquery \&lt;br /&gt;+        etc/transmission/web/javascript/jquery/jquery.form.min.js \&lt;br /&gt;+        etc/transmission/web/javascript/jquery/jquery.contextmenu.min.js \&lt;br /&gt;+        etc/transmission/web/javascript/jquery/json.min.js \&lt;br /&gt;+        etc/transmission/web/javascript/jquery/jquery.min.js \&lt;br /&gt;+        etc/transmission/web/javascript/jquery/jquery.transmenu.min.js \&lt;br /&gt;+        etc/transmission/web/javascript/dialog.js \&lt;br /&gt;+        etc/transmission/web/javascript/transmission.js \&lt;br /&gt;+        etc/transmission/web/index.html \&lt;br /&gt;+        etc/transmission/web/images/favicon.ico \&lt;br /&gt;+        etc/transmission/web/images/favicon.png \&lt;br /&gt;+        etc/transmission/web/images/graphics/logo.png \&lt;br /&gt;+        etc/transmission/web/images/graphics/filter_icon.png \&lt;br /&gt;+        etc/transmission/web/images/graphics/chrome.png \&lt;br /&gt;+        etc/transmission/web/images/graphics/iphone_chrome.png \&lt;br /&gt;+        etc/transmission/web/images/graphics/transfer_arrows.png \&lt;br /&gt;+        etc/transmission/web/images/graphics/filter_bar.png \&lt;br /&gt;+        etc/transmission/web/images/progress/progress.png \&lt;br /&gt;+        etc/transmission/web/images/buttons/cancel.png \&lt;br /&gt;+        etc/transmission/web/images/buttons/info_activity.png \&lt;br /&gt;+        etc/transmission/web/images/buttons/info_files.png \&lt;br /&gt;+        etc/transmission/web/images/buttons/tab_backgrounds.png \&lt;br /&gt;+        etc/transmission/web/images/buttons/torrent_buttons.png \&lt;br /&gt;+        etc/transmission/web/images/buttons/toolbar_buttons.png \&lt;br /&gt;+        etc/transmission/web/images/buttons/file_wanted_buttons.png \&lt;br /&gt;+        etc/transmission/web/images/buttons/info_trackers.png \&lt;br /&gt;+        etc/transmission/web/images/buttons/file_priority_buttons.png \&lt;br /&gt;+        etc/transmission/web/images/buttons/info_general.png \&lt;br /&gt;+        etc/transmission/web/images/webclip-icon.png \&lt;br /&gt;        etc/hosts &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;3. write transmission-daemon as a service in init.rc&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;diff --git a/rootdir/init.rc b/rootdir/init.rc&lt;br /&gt;index 3011bf6..a3c45f8 100644&lt;br /&gt;--- a/rootdir/init.rc&lt;br /&gt;+++ b/rootdir/init.rc&lt;br /&gt;@@ -361,6 +361,12 @@ service dbus /system/bin/dbus-daemon --system --nofork&lt;br /&gt;     user bluetooth&lt;br /&gt;     group bluetooth net_bt_admin&lt;br /&gt; &lt;br /&gt;+service tr-daemon /system/bin/transmission-daemon -g /data/transmission -w /data/transmission/ -c /data/transmission/&lt;br /&gt;+    user root&lt;br /&gt;+    group net_admin system&lt;br /&gt;+    disabled&lt;br /&gt;+    oneshot&lt;br /&gt;+&lt;br /&gt; service bluetoothd /system/bin/bluetoothd -n&lt;br /&gt;     socket bluetooth stream 660 bluetooth bluetooth&lt;br /&gt;     socket dbus_bluetooth stream 660 bluetooth bluetooth&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;4. Some important arguments for &lt;a href="https://trac.transmissionbt.com/wiki/man/transmission-daemon"&gt;transmission-daemon&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;     -g --config-dir directory&lt;br /&gt;             Where to look for configuration files. When it stars to run, it would &lt;br /&gt;             write a settings.json file to this folder. It stores all config values.&lt;br /&gt;&lt;br /&gt;     -c directory&lt;br /&gt;             Directory to watch for new .torrent files to be added. If you push&lt;br /&gt;             torrent files to this directory, the daemon will load them into&lt;br /&gt;             Transmission automatically.&lt;br /&gt;&lt;br /&gt;     -w --download-dir&lt;br /&gt;             Where to store downloaded data.&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;5. add Transmission site "http://localhost:9091" to default Bookmark list in Browser&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;diff --git a/packages/apps/Browser/res/values/strings.xml b/packages/apps/Browser/res/values/strings.xml&lt;br /&gt;index 18a2144..1824664 100644&lt;br /&gt;--- a/packages/apps/Browser/res/values/strings.xml&lt;br /&gt;+++ b/packages/apps/Browser/res/values/strings.xml&lt;br /&gt;@@ -675,6 +675,8 @@&lt;br /&gt;         &lt;item&gt;http://www.weather.com/&lt;/item&gt;&lt;br /&gt;         &lt;item&gt;BBC&lt;/item&gt;&lt;br /&gt;         &lt;item&gt;http://www.bbc.co.uk/&lt;/item&gt;&lt;br /&gt;+        &lt;item&gt;Transmission&lt;/item&gt;&lt;br /&gt;+        &lt;item&gt;http://localhost:9091/&lt;/item&gt;&lt;br /&gt;     &lt;/string-array&gt;&lt;br /&gt; &lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-1079426568926940625?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/1079426568926940625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2010/10/tips-for-transmission-in-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/1079426568926940625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/1079426568926940625'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2010/10/tips-for-transmission-in-android.html' title='Tips for Transmission in Android'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_fB3UGiuVTOI/TMVAYcyJ8hI/AAAAAAAAGi0/BKHs-Htx_GM/s72-c/device02.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-6041250763382204894</id><published>2010-09-10T16:57:00.000-07:00</published><updated>2010-09-12T20:49:26.762-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='BitTorrent'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>use Transmission in Android</title><content type='html'>Recently, I am checking how to use &lt;a href="http://en.wikipedia.org/wiki/BitTorrent_(protocol)"&gt;BitTorrent&lt;/a&gt; function in Android. There are lots of BitTorrent tools in Internet. Based on my common user experiences, I was using &lt;a href="http://www.bitcomet.com/"&gt;BitComet&lt;/a&gt; in Windows machine, &lt;a href="http://www.transmissionbt.com/"&gt;Transmission&lt;/a&gt; in Ubuntu laptop, &lt;a href="http://www.vuze.com/"&gt;Vuze&lt;/a&gt; in Mac mini, and &lt;a href="http://libtorrent.rakshasa.no/"&gt;rTorrent&lt;/a&gt; in Debian server. I also found there are some BitTorrent remote management applications in Android market, but it's for controlling remote torrents, not directly download files via BT.&lt;br /&gt;&lt;br /&gt;After making a survey of these BitTorrent tools, I choose &lt;a href="https://trac.transmissionbt.com/"&gt;Transmission&lt;/a&gt;, since I think porting it in Android is with less effort and more simple. I didn't build related GTK or QT code for Transmission. I'd like to use it without its own GUI. It has '&lt;a href="https://trac.transmissionbt.com/wiki/man/transmission-daemon"&gt;transmission-daemon&lt;/a&gt;' and '&lt;a href="https://trac.transmissionbt.com/wiki/man/transmission-remote"&gt;transmission-remote&lt;/a&gt;' command line tools. I can use both of them to use Transmission without a GUI. Furthermore, it comes with a &lt;a href="https://trac.transmissionbt.com/wiki/WebInterface"&gt;WEB UI&lt;/a&gt;. It means I can control BitTorrent from a browser. Therefore, I don't need to write Java UI application for it.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;# export TRANSMISSION_WEB_HOME=/etc/web/transmission                                         &lt;br /&gt;# transmission-daemon -f -g /sdcard/transmission -w /sdcard/transmission --incomplete-dir /sdcard/transmission&lt;br /&gt;[11:48:07.715] Transmission 2.04 (11151) started (external/transmission/libtransmission/session.c:622)&lt;br /&gt;[11:48:07.727] RPC Server Adding address to whitelist: 127.0.0.1 (external/transmission/libtransmission/rpc-server.c:767)&lt;br /&gt;[11:48:07.727] RPC Server Serving RPC and Web requests on port 9091 (external/transmission/libtransmission/rpc-server.c:940)&lt;br /&gt;[11:48:07.727] RPC Server Whitelist enabled (external/transmission/libtransmission/rpc-server.c:944)&lt;br /&gt;[11:48:07.728] DHT Generating new id (external/transmission/libtransmission/tr-dht.c:378)&lt;br /&gt;[11:48:07.728] Using settings from "/sdcard/transmission" (external/transmission/daemon/daemon.c:443)&lt;br /&gt;[11:48:07.728] disable save setting here! (external/transmission/daemon/daemon.c:444)&lt;br /&gt;[11:48:07.728] Loaded 2 torrents (external/transmission/libtransmission/session.c:1743)&lt;br /&gt;[11:48:07.728] Port Forwarding (NAT-PMP) initnatpmp succeeded (0) (external/transmission/libtransmission/natpmp.c:67)&lt;br /&gt;[11:48:07.729] Port Forwarding (NAT-PMP) sendpublicaddressrequest succeeded (2) (external/transmission/libtransmission/natpmp.c:67)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I verified it in Android emulator (froyo), coz it can use local machine network. I run Transmission-daemon from the terminal. Then, I open Android Web browser and type this URL &lt;span style="font-weight:bold;"&gt;http://localhost:9091&lt;/span&gt;. It would go to Transmission Web UI. I can control torrent from it. Like add a BT torrent, delete torrent, pause it, check current status. The Web UI looks nice and easy to use.&lt;br /&gt;&lt;table border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/TI2bkKWdQ7I/AAAAAAAAGck/xFpsMTdc4xY/s1600/device01.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/TI2bkKWdQ7I/AAAAAAAAGck/xFpsMTdc4xY/s320/device01.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5516236164154868658" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/TI2bj8pdmrI/AAAAAAAAGcc/RTXoCAbXwcc/s1600/device02.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/TI2bj8pdmrI/AAAAAAAAGcc/RTXoCAbXwcc/s320/device02.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5516236160476486322" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/TI2bjteSWeI/AAAAAAAAGcU/hCNI22Az8lE/s1600/device03.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/TI2bjteSWeI/AAAAAAAAGcU/hCNI22Az8lE/s320/device03.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5516236156403079650" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;How about make it more straight? I would like to search BitTorrent from application UI, not from Web browser. Then I can save some time on typing. I find a very comprehensive BitTorrent tool &lt;a href="http://code.google.com/p/transdroid/"&gt;Transdroid&lt;/a&gt; in Android market . It can control remote BitTorrent and it supports Transmission too. I use it to connect my local one. It has a search function and you can also set the BitTorrent searching engine from the menu. It makes thing easier, search something, pick up a torrent, download it, and see it. There is a &lt;a href="http://www.transdroid.org/download/using-transmission-on-ubuntu/"&gt;help guide&lt;/a&gt; in their web site.&lt;br /&gt;&lt;br /&gt;&lt;table border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/TI2ckK0XQyI/AAAAAAAAGc8/RDdEczgwDvA/s1600/device04.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/TI2ckK0XQyI/AAAAAAAAGc8/RDdEczgwDvA/s320/device04.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5516237263791932194" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/TI2cjnVVRdI/AAAAAAAAGc0/ElAjWLf9rS8/s1600/device05.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/TI2cjnVVRdI/AAAAAAAAGc0/ElAjWLf9rS8/s320/device05.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5516237254266537426" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/TI2cjOIXg_I/AAAAAAAAGcs/Hev_jHUDqS0/s1600/device06.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/TI2cjOIXg_I/AAAAAAAAGcs/Hev_jHUDqS0/s320/device06.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5516237247501272050" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;These screenshots are copied from my office machine. The network environment here is bad. I cannot see good downloading speed. But I verified few torrents at my home machine, the downloading speed was over 500 KB. Also, the download speed depends on the content you are downloading too. If you search some very hot or popular things, the download speed would be very high!&lt;br /&gt;&lt;br /&gt;I created a project &lt;a href="http://gitorious.org/android-transmission"&gt;android-transmission&lt;/a&gt; in gitoriou. If you have interests, you could use my works there.&lt;br /&gt;&lt;br /&gt;&lt;table border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/TI2dFsIatpI/AAAAAAAAGdU/L_IfJ1DCkXQ/s1600/device07.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/TI2dFsIatpI/AAAAAAAAGdU/L_IfJ1DCkXQ/s320/device07.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5516237839670097554" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/TI2dFN8GwsI/AAAAAAAAGdM/PMTU4e9p82k/s1600/device08.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/TI2dFN8GwsI/AAAAAAAAGdM/PMTU4e9p82k/s320/device08.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5516237831565394626" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/TI2dE6TVTEI/AAAAAAAAGdE/sf1jKu3F0cI/s1600/device09.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/TI2dE6TVTEI/AAAAAAAAGdE/sf1jKu3F0cI/s320/device09.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5516237826294107202" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-6041250763382204894?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/6041250763382204894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2010/09/use-transmission-in-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/6041250763382204894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/6041250763382204894'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2010/09/use-transmission-in-android.html' title='use Transmission in Android'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_fB3UGiuVTOI/TI2bkKWdQ7I/AAAAAAAAGck/xFpsMTdc4xY/s72-c/device01.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-2907505069115326595</id><published>2010-08-02T01:00:00.000-07:00</published><updated>2010-08-02T01:21:02.509-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>0xdroid release beagle-eclair-0x5, devkit8k-eclair-0x5 (with/without SGX)</title><content type='html'>0xlab team is glad to announce the fifth release of 0xdroid. 0xdroid is community-developed Android distribution by 0xlab, runs on omap3 based boards include beagleboard and devkit8000.&lt;br /&gt;&lt;br /&gt;Version: &lt;span style="font-weight:bold;"&gt;beagle-eclair-0x5-sgx, beagle-eclair-0x5-no-sgx, devkit8k-eclair-0x5-sgx, devkit8k-eclair-0x5-no-sgx&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Version: beagle-eclair-0x5&lt;br /&gt;Date: July 30, 2010&lt;br /&gt;Release Image:&lt;br /&gt;&lt;a href="http://downloads.0xlab.org/release/beagle-eclair-0x5-no-sgx/beagle-eclair-0x5_no_sgx.zip"&gt;beagle-eclair-0x5_no_sgx.zip&lt;/a&gt;&lt;br /&gt;&lt;a href="http://downloads.0xlab.org/release/beagle-eclair-0x5-sgx/beagle-eclair-0x5_sgx.zip"&gt;beagle-eclair-0x5_sgx.zip&lt;/a&gt;&lt;br /&gt;&lt;a href="http://downloads.0xlab.org/release/devkit8k-eclair-0x5-no-sgx/devkit8k-eclair-0x5_no_sgx.zip"&gt;devkit8k-eclair-0x5_no_sgx.zip&lt;/a&gt;&lt;br /&gt;&lt;a href="http://downloads.0xlab.org/release/devkit8k-eclair-0x5-sgx/devkit8k-eclair-0x5_sgx.zip"&gt;devkit8k-eclair-0x5_sgx.zip&lt;/a&gt;&lt;br /&gt;MD5 sum:&lt;br /&gt;&lt;a href="http://downloads.0xlab.org/release/beagle-eclair-0x5-no-sgx/md5sum.txt"&gt;beagle-eclair-0x5_no_sgx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://downloads.0xlab.org/release/beagle-eclair-0x5-sgx/md5sum.txt"&gt;beagle-eclair-0x5_sgx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://downloads.0xlab.org/release/devkit8k-eclair-0x5-no-sgx/md5sum.txt"&gt;devkit8k-eclair-0x5_no_sgx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://downloads.0xlab.org/release/devkit8k-eclair-0x5-sgx/md5sum.txt"&gt;devkit8k-eclair-0x5_sgx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;b&gt;Release Details&lt;/b&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;Eclair codebase&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;Feature: Major Linux kernel upgrade: from 2.6.29 to &lt;a href="http://gitorious.org/0xlab-kernel/kernel/commits/omap3-2.6.32"&gt;2.6.32&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;Feature: Support TI's &lt;a href="http://code.google.com/p/0xdroid/wiki/How_to_Integrate_with_SGX"&gt;Android PowerVR SGX&lt;/a&gt; (hardware 2D/3D engine)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;Feature: Support Android USB gadget: adb and mass-storage (issue &lt;a href="http://code.google.com/p/0xdroid/issues/detail?id=95"&gt;#95&lt;/a&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;Note: 0xdroid no longer support usbnet gadget driver. Use adb or USB Ethernet instead.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;Feature: new Bluetooth Extensions -- HID (issue &lt;a href="http://code.google.com/p/0xdroid/issues/detail?id=102"&gt;#102&lt;/a&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;Feature: Make Launcher2 really usable (issue &lt;a href="http://code.google.com/p/0xdroid/issues/detail?id=76"&gt;#76&lt;/a&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;Feature: Make Gallery3D workable by fixing PixelFlinger regressions (issue &lt;a href="http://code.google.com/p/0xdroid/issues/detail?id=107"&gt;#107&lt;/a&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;Feature: Touchscreen Calibration shouldn't require reboot (issue &lt;a href="http://code.google.com/p/0xdroid/issues/detail?id=94"&gt;#94&lt;/a&gt;, issue&lt;a href="http://code.google.com/p/0xdroid/issues/detail?id=99"&gt; #99&lt;/a&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;Feature: Robocat i2c port support (issue &lt;a href="http://code.google.com/p/0xdroid/issues/detail?id=134"&gt;#134&lt;/a&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;Feature: Improved libgralloc for non HW accelerated target (issue&lt;a href="http://code.google.com/p/0xdroid/issues/detail?id=108"&gt; #108&lt;/a&gt;, issue &lt;a href="http://code.google.com/p/0xdroid/issues/detail?id=133"&gt;#133&lt;/a&gt;)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:130%;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;For more detail, please reference our &lt;a href="http://code.google.com/p/0xdroid/wiki/Roadmap"&gt;roadmap and issues tracking&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;Where to download images&lt;/b&gt;&lt;br /&gt;You can grab the image from &lt;a href="http://downloads.0xlab.org/release/"&gt;here&lt;/a&gt; and following the steps described on the &lt;a href="http://code.google.com/p/0xdroid/wiki/UsingPreBuiltImages"&gt;wiki page&lt;/a&gt; to test the image.&lt;br /&gt;&lt;br /&gt;This release comes with &lt;a href="http://processors.wiki.ti.com/index.php/Render_to_Texture_with_OpenGL_ES#Introduction"&gt;PowerVR SGX&lt;/a&gt; from Texas Instruments. If you try both two images with SGX and without SGX, you would tell how amazing it displays photos in Gallery 3D application. Like ususal, it also comes with a happy Installer and it would bring you an Android Eclair system in few seconds. If you are looking for more details about the integration, you could reference to this wiki page.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How to build from scratch&lt;/b&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt; $ repo init -u git://gitorious.org/0xdroid/manifest.git -b beagle-eclair&lt;br /&gt; $ echo "TARGET_PRODUCT := beagleboard" &gt; buildspec.mk&lt;br /&gt; $ echo "TARGET_PRODUCT := devkit8000" &gt; buildspec.mk ( if build for devkit8000 )&lt;br /&gt; $ echo "INSTALL_PREBUILT_DEMO_APKS := true" &gt;&gt; buildspec.mk ( optional for adding prebuilt demo apks )&lt;br /&gt; $ cd .repo/manifests/&lt;br /&gt; $ git checkout -b beagle-eclair-0x5-release beagle-eclair-0x5&lt;br /&gt; $ repo sync&lt;br /&gt; $ repo forall -c "git checkout -b beagle-eclair-0x5-release beagle-eclair-0x5"&lt;br /&gt; $ make (or make -j4 if there are 4 cores)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Give us feedback&lt;/b&gt;&lt;br /&gt;Join the &lt;a href="http://groups.google.com/group/0xlab-devel"&gt;0xlab Development mailing-list&lt;/a&gt;&lt;br /&gt;Join the &lt;a href="http://groups.google.com/group/0xlab-discuss"&gt;0xlab General discussion mailing-list&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/0xdroid/issues"&gt;Issue tracking&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-2907505069115326595?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/2907505069115326595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2010/08/0xdroid-release-beagle-eclair-0x5.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/2907505069115326595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/2907505069115326595'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2010/08/0xdroid-release-beagle-eclair-0x5.html' title='0xdroid release beagle-eclair-0x5, devkit8k-eclair-0x5 (with/without SGX)'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-3893492588603199007</id><published>2010-07-05T02:54:00.000-07:00</published><updated>2010-07-05T03:09:48.056-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bluetooth'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Connect with Bluetooth keyboard and mice in Android Eclair</title><content type='html'>In Nexus one without HID profile:&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/TDGsXUBPEcI/AAAAAAAAGZY/tbOzjZLVnK4/s1600/device06.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 192px; height: 320px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/TDGsXUBPEcI/AAAAAAAAGZY/tbOzjZLVnK4/s320/device06.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5490358937252204994" /&gt;&lt;/a&gt;  &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/TDGsXP8AyPI/AAAAAAAAGZQ/-gp7C8LKZ1k/s1600/device07.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 192px; height: 320px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/TDGsXP8AyPI/AAAAAAAAGZQ/-gp7C8LKZ1k/s320/device07.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5490358936156555506" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In Qualcomm MSM72xx platform with HID profile support:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_fB3UGiuVTOI/TDGtL7D_GoI/AAAAAAAAGZw/DSTYorX7H4E/s1600/device01.png"&gt;&lt;img src="http://2.bp.blogspot.com/_fB3UGiuVTOI/TDGtL7D_GoI/AAAAAAAAGZw/DSTYorX7H4E/s320/device01.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5490359841085921922" style="cursor: pointer; width: 240px; height: 320px; " /&gt;&lt;/a&gt; &lt;a href="http://4.bp.blogspot.com/_fB3UGiuVTOI/TDGtLjLWYlI/AAAAAAAAGZo/8cKRsZnUdNg/s1600/device02.png"&gt;&lt;img src="http://4.bp.blogspot.com/_fB3UGiuVTOI/TDGtLjLWYlI/AAAAAAAAGZo/8cKRsZnUdNg/s320/device02.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5490359834674356818" style="cursor: pointer; width: 240px; height: 320px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_fB3UGiuVTOI/TDGtLjLWYlI/AAAAAAAAGZo/8cKRsZnUdNg/s1600/device02.png"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_fB3UGiuVTOI/TDGtKoZUKWI/AAAAAAAAGZg/G9zkIKZS5bg/s1600/device03.png"&gt;&lt;img src="http://2.bp.blogspot.com/_fB3UGiuVTOI/TDGtKoZUKWI/AAAAAAAAGZg/G9zkIKZS5bg/s320/device03.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5490359818895239522" style="cursor: pointer; width: 240px; height: 320px; " /&gt;&lt;/a&gt;  &lt;a href="http://4.bp.blogspot.com/_fB3UGiuVTOI/TDGtMXkTfgI/AAAAAAAAGZ4/5h9zIi6mSLI/s1600/device04.png"&gt;&lt;img src="http://4.bp.blogspot.com/_fB3UGiuVTOI/TDGtMXkTfgI/AAAAAAAAGZ4/5h9zIi6mSLI/s320/device04.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5490359848737668610" style="cursor: pointer; width: 240px; height: 320px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Apparently, it is more friendly and user can connect with bluetooth keyboard from Setting UI application. Use can type words from a real keyboard, not from a tiny touch screen. All code are in &lt;a href="http://gitorious.org/0xdroid"&gt;0xdroid project&lt;/a&gt; based on Eclair.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-3893492588603199007?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/3893492588603199007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2010/07/connect-with-bluetooth-keyboard-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/3893492588603199007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/3893492588603199007'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2010/07/connect-with-bluetooth-keyboard-and.html' title='Connect with Bluetooth keyboard and mice in Android Eclair'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_fB3UGiuVTOI/TDGsXUBPEcI/AAAAAAAAGZY/tbOzjZLVnK4/s72-c/device06.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-8268474278230014550</id><published>2010-06-21T22:57:00.000-07:00</published><updated>2010-06-21T23:35:43.288-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bluetooth'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Add Bluetooth HID profile in Android</title><content type='html'>The &lt;a href="http://www.bluetooth.com/English/Technology/Works/pages/hid.aspx"&gt;HID profile&lt;/a&gt; defines the protocols, procedures and features to be used by Bluetooth HID such as keyboards, pointing devices, gaming devices and remote monitoring devices. When I tried bluetooth function in &lt;a href="http://i-miss-erin.blogspot.com/2009/09/connect-bluetooth-keyboard-in-android.html"&gt;Android Dev Phone (G1)&lt;/a&gt; last year, I use a utility tool 'hidd' which is from native bluez. It is a command tool. After I can pair with Apple Wireless keyboard sucessfully, I type 'hidd &lt;apple device="" address=""&gt;' from terminal, then I can start to use it. But it's not automatically, I cannot connect it from Setting UI application either. Therefore, we should add a new Bluetooth HID profile in Android, to make it be connectable, like a BT headset or speaker.&lt;br /&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;# hidd --connect 00:1D:4F:A7:9A:49&lt;br /&gt;&lt;br /&gt;# hidd --show&lt;br /&gt;00:1D:4F:A7:9A:49 Apple Inc. Keyboard [05ac:022c] connected&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;table border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/TCBWxHInDJI/AAAAAAAAGVM/Xrd5RAESMOI/s1600/device.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/TCBWxHInDJI/AAAAAAAAGVM/Xrd5RAESMOI/s320/device.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5485479747866004626" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/TCBWw84PEsI/AAAAAAAAGVE/wclFFHM-xtw/s1600/device02.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/TCBWw84PEsI/AAAAAAAAGVE/wclFFHM-xtw/s320/device02.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5485479745112969922" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.0xlab.org/"&gt;0xlab&lt;/a&gt; is a member of &lt;a href="http://www.oesf.org/forum/"&gt;OESF (Oopen Embedded Software Foundation)&lt;/a&gt; and they have some very useful bluetooth extensions in their '&lt;a href="http://www.oesf.jp/modules/developer/index.php?content_id=2"&gt;Embedded Master 1&lt;/a&gt;' project. Althought these features are based on Android Donuts, they are still a very good reference. Therefore, I use &lt;a href="http://github.com/OESF/Embedded-Master-ARM"&gt;their code&lt;/a&gt; and modify few parts of code for newer Android Eclair version. The difference of Eclair from Donuts in Bluetooth is bluez dbus API changes and some java API changes in frameworks. I've committed my patches to 0xdroid project in gitouris. If you'd like to use my work, you could apply patches in &lt;a href="http://gitorious.org/0xdroid/frameworks_base/commits/beagle-eclair"&gt;Frameworks&lt;/a&gt; and &lt;a href="http://gitorious.org/0xdroid/packages_apps_settings/commits/beagle-eclair"&gt;Setting application&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;table border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/TCBWwN4lbJI/AAAAAAAAGU0/Knhqc7BcKQo/s1600/device04.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/TCBWwN4lbJI/AAAAAAAAGU0/Knhqc7BcKQo/s320/device04.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5485479732497968274" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/TCBWvx-fa1I/AAAAAAAAGUs/3NhKIyyj6XI/s1600/device05.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/TCBWvx-fa1I/AAAAAAAAGUs/3NhKIyyj6XI/s320/device05.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5485479725006547794" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Beside the code in Frameworks and Settings UI application, I have to enable some features in &lt;a href="http://gitorious.org/0xlab-kernel"&gt;kernel&lt;/a&gt;, since I use Apple Wireless Keyboard for this experiment. If I don't enable them, I can't never create an input device for Apple keyboard in Android. It took me few days to debug this issue. I cannot tell why I can use hidd to connect with it without any problem, but cannot use Dbus method to connect with it correctly. It's very weird. It's said 'Connected', but I cannot receive any key events or cannot see a virtual input device in Android system. Furthermore, there is no problem on connecting with a BT mice at all. Both methods are fine.&lt;br /&gt;&lt;br /&gt;When I tried to implement any features in Android, I would try it in my Ubuntu machine first. They have linux kenel and many native code are the same. Based on the experiences in Ubuntu, I can know how it works and the normal flow what it looks like. In Ubuntu, when I connect with an Apple Wireless Keyboard, I can see the device name from dmesg. But I cannot see the device name in Android at all, I can see BT mouse device name in Android. Therefore, I check menuconfig on building kernel, and then I see some HID special drivers. I just enable features like &lt;span style="font-style:italic;"&gt;CONFIG_HID_APPLE=y, CONFIG_HID_DEBUG=y, CONFIG_HIDRAW=y, CONFIG_USB_HIDDEV=y&lt;/span&gt;. After using the new kenel image, I can connect/disconnect with a BT keyboard from Setting UI application normally. I've verified my work in Beagle board and Qualcomm MSM72xx platform.&lt;br /&gt;&lt;br /&gt;&lt;table boarder="0"&gt;&lt;tr&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/TCBYdhwfyQI/AAAAAAAAGVc/6pZMBY-lskE/s1600/screen02.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 218px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/TCBYdhwfyQI/AAAAAAAAGVc/6pZMBY-lskE/s320/screen02.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5485481610438494466" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/TCBYdK9x8kI/AAAAAAAAGVU/eu--uEAK_kU/s1600/screen01.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 218px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/TCBYdK9x8kI/AAAAAAAAGVU/eu--uEAK_kU/s320/screen01.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5485481604320195138" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-8268474278230014550?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/8268474278230014550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2010/06/add-bluetooth-hid-profile-in-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/8268474278230014550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/8268474278230014550'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2010/06/add-bluetooth-hid-profile-in-android.html' title='Add Bluetooth HID profile in Android'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_fB3UGiuVTOI/TCBWxHInDJI/AAAAAAAAGVM/Xrd5RAESMOI/s72-c/device.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-370288371768652186</id><published>2010-05-03T21:56:00.000-07:00</published><updated>2010-05-03T22:42:49.098-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='CTS'/><title type='text'>How to add a test plan, package to Android CTS?</title><content type='html'>If we check Android source code, we can find some test packages in Android applications. We can either run these test packages in Android device or we can combine them with Android CTS from host machine. Here is an example from Music application. I will create a test plan &lt;span style="font-style:italic;"&gt;MusicTests&lt;/span&gt; and test package &lt;span style="font-style:italic;"&gt;MusicTestCases&lt;/span&gt; in CTS.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Add test package source code to cts folder&lt;/span&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;$ cp -a $MYDROID/packages/apps/Music/tests $MYDROID/cts/tests/tests/MusicTests&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Modify test package name in Android.mk to avoid redundant name&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;$ cat $MYDROID/cts/tests/tests/MusicTests/Android.mk&lt;br /&gt;LOCAL_PATH:= $(call my-dir)&lt;br /&gt;include $(CLEAR_VARS)&lt;br /&gt;&lt;br /&gt;# We only want this apk build for tests.&lt;br /&gt;LOCAL_MODULE_TAGS := tests&lt;br /&gt;&lt;br /&gt;LOCAL_JAVA_LIBRARIES := android.test.runner&lt;br /&gt;&lt;br /&gt;# Include all test java files.&lt;br /&gt;LOCAL_SRC_FILES := $(call all-java-files-under, src)&lt;br /&gt;&lt;br /&gt;LOCAL_PACKAGE_NAME := MusicTestsCases&lt;br /&gt;&lt;br /&gt;LOCAL_INSTRUMENTATION_FOR := Music&lt;br /&gt;&lt;br /&gt;include $(BUILD_PACKAGE)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Add one test case to CTS_CASE_LIST in build/core/tasks/cts.mk&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;erin@midnight:~/eclair/build/core$ git diff&lt;br /&gt;diff --git a/core/tasks/cts.mk b/core/tasks/cts.mk&lt;br /&gt;index 917c5dc..17f6dbc 100644&lt;br /&gt;--- a/core/tasks/cts.mk&lt;br /&gt;+++ b/core/tasks/cts.mk&lt;br /&gt;@@ -97,6 +97,7 @@ CTS_CASE_LIST := \&lt;br /&gt;        CtsPerformance3TestCases \&lt;br /&gt;        CtsPerformance4TestCases \&lt;br /&gt;        CtsPerformance5TestCases \&lt;br /&gt;+       MusicTestsCases \&lt;br /&gt;        ApiDemos \&lt;br /&gt;        ApiDemosReferenceTest \&lt;br /&gt;        $(CTS_CORE_CASE_LIST) \&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Add test plan 'MusicTests' in cts/tools/utils/buildCts.py&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;  def GenerateTestPlans(self):&lt;br /&gt;    .....&lt;br /&gt;    plan = tools.TestPlan(packages)&lt;br /&gt;    plan.Include(r'android\.MusicTests')&lt;br /&gt;    self.__WritePlan(plan, 'MusicTests')&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;make cts again&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;$ cd $MYDROID&lt;br /&gt;$ . build/envsetup.sh&lt;br /&gt;$ make cts&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;run MusicTestCases&lt;/span&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;$ cd $mydroid/out/host/linux-x86/bin/&lt;br /&gt;$ ./cts&lt;br /&gt;&lt;br /&gt;cts_host &gt; start --plan MusicTests&lt;br /&gt;start test plan MusicTests&lt;br /&gt;==============================================================&lt;br /&gt;Test package: android.MusicTests&lt;br /&gt;install met failure [install_failed_insufficient_storage]&lt;br /&gt;com.android.music.tests.stress.AlbumsPlaybackStress#testAlbumPlay.....(pass)&lt;br /&gt;com.android.music.tests.stress.AlbumsPlaybackStress#testActivityTestCaseSetUpProperly....(pass)&lt;br /&gt;com.android.music.tests.stress.MusicPlaybackStress#testPlayAllSongs....(pass)&lt;br /&gt;com.android.music.tests.stress.MusicPlaybackStress#testActivityTestCaseSetUpProperly....(pass)&lt;br /&gt;com.android.music.tests.functional.TestPlaylist#testDeletePlaylist....(pass)&lt;br /&gt;com.android.music.tests.functional.TestPlaylist#testRenamePlaylist....(pass)&lt;br /&gt;com.android.music.tests.functional.TestPlaylist#testActivityTestCaseSetUpProperly....(pass)&lt;br /&gt;com.android.music.tests.functional.TestSongs#testAddPlaylist.....(pass)&lt;br /&gt;com.android.music.tests.functional.TestSongs#testSetRingtone.....(pass)&lt;br /&gt;com.android.music.tests.functional.TestSongs#testDeleteSong.....(pass)&lt;br /&gt;com.android.music.tests.functional.TestSongs#testActivityTestCaseSetUpProperly....(pass)&lt;br /&gt;com.android.music.tests.MusicPlayerStability#testPlay30sMP3....(pass)&lt;br /&gt;com.android.music.tests.MusicPlayerStability#testLaunchMusicPlayer....(pass)&lt;br /&gt;==============================================================&lt;br /&gt;Test summary:   pass=13   fail=0   timeOut=0   notExecuted=0   Total=13&lt;br /&gt;Time: 100.780s&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Here is a video I run this MusicTestCases in Android emulator!&lt;br /&gt;&lt;object width="445" height="364"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/NrclOWY8MjY&amp;hl=en_US&amp;fs=1&amp;hd=1&amp;border=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/NrclOWY8MjY&amp;hl=en_US&amp;fs=1&amp;hd=1&amp;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="445" height="364"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-370288371768652186?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/370288371768652186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2010/05/how-to-add-test-plan-package-to-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/370288371768652186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/370288371768652186'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2010/05/how-to-add-test-plan-package-to-android.html' title='How to add a test plan, package to Android CTS?'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-2511184697277232749</id><published>2010-04-27T03:36:00.000-07:00</published><updated>2010-04-27T03:38:29.451-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gsm'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>[video] Use 3G modem card in Android (devkit8000)</title><content type='html'>&lt;object width="660" height="525"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/F2B83qiCc2Y&amp;hl=en_US&amp;fs=1&amp;color1=0x3a3a3a&amp;color2=0x999999&amp;hd=1&amp;border=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/F2B83qiCc2Y&amp;hl=en_US&amp;fs=1&amp;color1=0x3a3a3a&amp;color2=0x999999&amp;hd=1&amp;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="660" height="525"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-2511184697277232749?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/2511184697277232749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2010/04/video-use-3g-modem-card-in-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/2511184697277232749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/2511184697277232749'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2010/04/video-use-3g-modem-card-in-android.html' title='[video] Use 3G modem card in Android (devkit8000)'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-1495551011635276935</id><published>2010-04-27T02:21:00.000-07:00</published><updated>2010-04-27T03:09:45.091-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gsm'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Use 3G modem data card in Android</title><content type='html'>We found &lt;a href="http://cwhuang.info/2010/03/android-x86-3g-support"&gt;Android-x86&lt;/a&gt; had a new feature about telephony. It's about to use a 3G modem data card in EeePC and it can use 3G network to browse Internet. Therefore, I followed up this &lt;a href="http://code.google.com/p/0xdroid/issues/detail?id=80"&gt;issue&lt;/a&gt; and verified it in Devkit8000 device. Now, it's one of our new released features and it comes with &lt;a href="http://code.google.com/p/0xdroid/wiki/beagle_eclair_0x4"&gt;0xdroid 0x4&lt;/a&gt; release pre-built image too. In the beginning, I was trying to use a Quanta Q101 data card in Android emulator. How to run this experiment in my Ubuntu 9.10 manchine?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/S9a2Dw55GWI/AAAAAAAAGBA/BGMye21e2OM/s1600/0427.jpg"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/S9a2Dw55GWI/AAAAAAAAGBA/BGMye21e2OM/s400/0427.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5464755373644257634" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Set up Quanta Q101&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Check this long &lt;a href="http://www.ubuntu-tw.org/modules/newbb/viewtopic.php?post_id=66350"&gt;discussion&lt;/a&gt;, I added a new rule file as below. When I plug-in q101 card, it can auto-mount to GSM modem mode with 4 ports.&lt;br /&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;erin@midnight:~$ cat /etc/udev/rules.d/30-q101.rules&lt;br /&gt;#&lt;br /&gt;# first, q101 will be detected as usb_storage of 0408:1000&lt;br /&gt;# you have to force it suspend to change running mode from&lt;br /&gt;# storage to 3.5g card&lt;br /&gt;&lt;br /&gt;SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", ACTION=="add", ATTRS{idVendor}=="0408", ATTRS{idProduct}=="1000", RUN+="/bin/sh -c 'cd /sys$env{DEVPATH};until test -f power/level;do cd ..;done;if [ -f power/level ];then echo suspend &gt; power/level;fi'"&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Wait about 10 seconds, then you can check these devices. RIL is /dev/ttyUSB3, PPP is /dev/ttyUSB1. When you use in Android emulator, it would become /dev/ttyS2 and /dev/ttyS3.&lt;br /&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;erin@midnight:~$ ls -l /dev/ttyUSB*&lt;br /&gt;crw-rw---- 1 root dialout 188, 1 2010-04-27 16:34 /dev/ttyUSB1&lt;br /&gt;crw-rw---- 1 root dialout 188, 2 2010-04-27 15:55 /dev/ttyUSB2&lt;br /&gt;crw-rw---- 1 root dialout 188, 3 2010-04-27 17:16 /dev/ttyUSB3&lt;br /&gt;crw-rw---- 1 root dialout 188, 4 2010-04-27 15:50 /dev/ttyUSB4&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Need Kernel support PPP&lt;/span&gt;&lt;br /&gt;I read this &lt;a href="http://groups.google.com/group/android-platform/browse_thread/thread/e24eb299383e9103/c8f7b9bdba69e999"&gt;discussion&lt;/a&gt; and download Android kernel source code to rebuild kernel.&lt;br /&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;# git clone git://android.git.kernel.org/kernel/common.git&lt;br /&gt;# cd kernel&lt;br /&gt;# git checkout -b android-goldfish korg/android-goldfish-2.6.29&lt;br /&gt;# cd $MYDROID/out&lt;br /&gt;# ./host/linux-x86/bin/emulator -system ./target/product/generic/system.img -sysdir ./target/product/generic/system -data ./target/product/generic/userdata.img -kernel ../prebuilt/android-arm/kernel/kernel-qemu -ramdisk ./target/product/generic/ramdisk.img&lt;br /&gt;# adb pull /proc/config.gz $MYDROID/kernel/&lt;br /&gt;# cd $MYDROID/kernel/&lt;br /&gt;# gunzip config.gz&lt;br /&gt;# mv config .config&lt;br /&gt;# make ARCH=arm menuconfig&lt;br /&gt;(Add PPP in)&lt;br /&gt;# make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- zImage&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Start the emulator again with new kernel image and then check /dev/ppp device!&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;# cd $MYDROID/out&lt;br /&gt;# ./host/linux-x86/bin/emulator -system ./target/product/generic/system.img -sysdir ./target/product/generic/system -data ./target/product/generic/userdata.img -kernel ../kernel/arch/arm/boot/zImage -ramdisk ./target/product/generic/ramdisk.img&lt;br /&gt;# adb shell ls -l /dev/ppp&lt;br /&gt;crw-rw---- radio    vpn      108,   0 2010-04-27 15:36 ppp&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Modify Android source code&lt;/span&gt;&lt;br /&gt;I applied the patches from Android-x86 and re-modified some code for Quanta q101 card. Also modify gprs script, since I am using Taiwan GSM netowork.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;external ppp&lt;/span&gt;&lt;br /&gt;http://gitorious.org/0xdroid/external_ppp/commit/6624b6760d8fde02993f3a3f02df3ec9db739e41&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;hardware ril&lt;/span&gt;&lt;br /&gt;http://git.android-x86.org/?p=platform/hardware/ril.git;a=commit;h=b499fabc3459930a42f0ecc62257caef6aa216dc&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;system core&lt;/span&gt;&lt;br /&gt;http://gitorious.org/0xdroid/system_core/commit/81b121623c3f05298b5166d03714655d1ab2ddf8&lt;br /&gt;&lt;br /&gt;Since I am using Android emulator, the device names are different from Devkit8000.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Change the device permissions:&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;diff --git a/init/devices.c b/init/devices.c&lt;br /&gt;index 4d93b44..0023cc3 100644&lt;br /&gt;--- a/init/devices.c&lt;br /&gt;+++ b/init/devices.c&lt;br /&gt;@@ -108,6 +108,8 @@ static struct perms_ devperms[] = {&lt;br /&gt;     { "/dev/android_adb_enable",   0660,   AID_ADB,        AID_ADB,        0 },&lt;br /&gt;     { "/dev/ttyMSM0",       0600,   AID_BLUETOOTH,  AID_BLUETOOTH,  0 },&lt;br /&gt;     { "/dev/ttyHS0",        0600,   AID_BLUETOOTH,  AID_BLUETOOTH,  0 },&lt;br /&gt;+    { "/dev/ttyS2",         0660,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;+    { "/dev/ttyS3",         0660,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;     { "/dev/uinput",        0660,   AID_SYSTEM,     AID_BLUETOOTH,  0 },&lt;br /&gt;     { "/dev/alarm",         0664,   AID_SYSTEM,     AID_RADIO,      0 },&lt;br /&gt;     { "/dev/tty0",          0660,   AID_ROOT,       AID_SYSTEM,     0 },&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Modify RIL argument and add ppp service from init:&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;erin@midnight:~/eclair/mydroid/build/target/board/generic$ cat system.prop&lt;br /&gt;#&lt;br /&gt;# system.prop for generic sdk&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;rild.libpath=/system/lib/libreference-ril.so&lt;br /&gt;rild.libargs=-d /dev/ttyS2&lt;br /&gt;&lt;br /&gt;# add these lines in system/core/rootdir/init.rc&lt;br /&gt;service ppp /system/bin/pppd call gprs&lt;br /&gt; user root&lt;br /&gt; group system radio&lt;br /&gt; disabled&lt;br /&gt; oneshot&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Run Android Emulator&lt;/span&gt;&lt;br /&gt;After changing these code, rebuilt Android again. Then we can run Android emulator from below command:&lt;br /&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;erin@midnight:~/eclair/mydroid/out$ ./host/linux-x86/bin/emulator -system ./target/product/generic/system.img -sysdir ./target/product/generic/system -data ./target/product/generic/userdata.img -kernel ../kernel/arch/arm/boot/zImage -ramdisk ./target/product/generic/ramdisk.img -sdcard ./target/product/generic/sdcard.img -qemu -serial /dev/ttyUSB3 -serial /dev/ttyUSB1&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Run ppp manually &lt;/span&gt;&lt;br /&gt;After starting ppp service, it would appear one network connection called 'ppp'.&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;# adb shell&lt;br /&gt;# start ppp&lt;br /&gt;# netcfg&lt;br /&gt;lo       UP    127.0.0.1       255.0.0.0       0x00000049&lt;br /&gt;eth0     UP    10.0.2.15       255.255.255.0   0x00001043&lt;br /&gt;tunl0    DOWN  0.0.0.0         0.0.0.0         0x00000080&lt;br /&gt;gre0     DOWN  0.0.0.0         0.0.0.0         0x00000080&lt;br /&gt;ppp0     UP    115.82.23.238   255.255.255.255 0x000010d1&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Add APN for Taiwan GSM network&lt;/span&gt;&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/S9a2uzXpezI/AAAAAAAAGBo/nOOAtQ5n5W0/s1600/device13.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/S9a2uzXpezI/AAAAAAAAGBo/nOOAtQ5n5W0/s200/device13.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5464756113040309042" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/S9a2ucRMT5I/AAAAAAAAGBg/GT_KLeUuw2M/s1600/device14.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/S9a2ucRMT5I/AAAAAAAAGBg/GT_KLeUuw2M/s200/device14.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5464756106839216018" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/S9a2tpKZGjI/AAAAAAAAGBY/RnUGJGNq3nk/s1600/device15.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/S9a2tpKZGjI/AAAAAAAAGBY/RnUGJGNq3nk/s200/device15.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5464756093120485938" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/S9a2tYInvoI/AAAAAAAAGBQ/N1fMe3Kig0o/s1600/device16.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/S9a2tYInvoI/AAAAAAAAGBQ/N1fMe3Kig0o/s200/device16.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5464756088549654146" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/S9a2s7pUZFI/AAAAAAAAGBI/ATUMY2k_1Pk/s1600/device17.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/S9a2s7pUZFI/AAAAAAAAGBI/ATUMY2k_1Pk/s200/device17.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5464756080902169682" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-1495551011635276935?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/1495551011635276935/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2010/04/use-3g-modem-data-card-in-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/1495551011635276935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/1495551011635276935'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2010/04/use-3g-modem-data-card-in-android.html' title='Use 3G modem data card in Android'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_fB3UGiuVTOI/S9a2Dw55GWI/AAAAAAAAGBA/BGMye21e2OM/s72-c/0427.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-2916933595312633477</id><published>2010-04-25T23:13:00.000-07:00</published><updated>2010-04-26T03:11:37.266-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='CTS'/><title type='text'>Android CTS (Compatibility Test Suite) introduction</title><content type='html'>&lt;span style="font-weight: bold;"&gt;What is CTS?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Compatibility Test Suite is a command mode tool to run a series of test cases in Android. They published all &lt;a href="http://android.git.kernel.org/?p=platform/cts.git;a=summary"&gt;CTS source codes&lt;/a&gt; from Eclair branch on January 2010.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;git repository &lt;/span&gt;&lt;br /&gt;http://android.git.kernel.org/?p=platform/cts.git;a=summary&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How to run CTS in host machine?&lt;/span&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;$ cd $MYDROID&lt;br /&gt;$  . build/envsetup.sh&lt;br /&gt;$ make cts&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;(it would generate all test plans, packages, cases, result report format and then zip to a android-cts.zip file)&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Package CTS&lt;/span&gt;: out/host/linux-x86/cts/android-cts.zip&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;cts make file&lt;/span&gt;: mydroid/build/core/tasks/cts.mk&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;run cts program&lt;/span&gt;: mydroid/out/host/linux-x86/bin/cts&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;test plans&lt;/span&gt;: mydroid/out/host/linux-x86/cts/android-cts/repository/plans&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;test packages&lt;/span&gt;: mydroid/out/host/linux-x86/cts/android-cts/repository/testcases&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;test results&lt;/span&gt;: mydroid/out/host/linux-x86/cts/android-cts/repository/results&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;CTS program settings value&lt;/span&gt;: mydroid/cts/tools/utils/host_config.xml    &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;run cts&lt;br /&gt;$ cd $mydroid/out/host/linux-x86/bin/&lt;br /&gt;$ ./cts&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Screen would like this: &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;erin@midnight:~/eclair/mydroid/out/host/linux-x86/bin$ ./cts&lt;br /&gt;Android CTS version 2.1_r1&lt;br /&gt;cts_host &gt; help&lt;br /&gt;Usage: command options&lt;br /&gt;Avaiable commands and options:&lt;br /&gt;Host:&lt;br /&gt;help: show this message&lt;br /&gt;exit: exit cts command line&lt;br /&gt;Plan:&lt;br /&gt;ls --plan: list available plans&lt;br /&gt;ls --plan plan_name: list contents of the plan with specified name&lt;br /&gt;add --plan plan_name: add a new plan with specified name&lt;br /&gt;add --derivedplan plan_name -s/--session session_id -r/--result result_type: derive a plan from the given session&lt;br /&gt;rm --plan plan_name/all: remove a plan or all plans from repository&lt;br /&gt;start --plan test_plan_name: run a test plan&lt;br /&gt;start --plan test_plan_name -d/--device device_ID: run a test plan using the specified device&lt;br /&gt;start --plan test_plan_name -t/--test test_name: run a specific test&lt;br /&gt;start --plan test_plan_name -p/--package java_package_name: run a specific java package&lt;br /&gt;start --plan test_plan_name -t/--test test_name -d/--device device_ID: run a specific test using the specified device&lt;br /&gt;start --plan test_plan_name -p/--package java_package_name -d/--device device_ID: run a specific java package using the specified device&lt;br /&gt;Package:&lt;br /&gt;ls -p/--package: list available packages&lt;br /&gt;ls -p/--package package_name: list contents of the package with specified name&lt;br /&gt;add -p/--package root: add packages from root to repository&lt;br /&gt;rm -p/--package package_name/all: remove a package or all packages from repository&lt;br /&gt;Result:&lt;br /&gt;ls -r/--result: list all result of sessions&lt;br /&gt;ls -r/--result -s/--session session_id: list detail case result of a specified session&lt;br /&gt;ls -r/--result [pass/fail/notExecuted/timeout] -s/--session session_id: list detail cases of a specified session by the specified result.&lt;br /&gt;History:&lt;br /&gt;history/h: list all commands in command history&lt;br /&gt;history/h count: list the latest count records in command history&lt;br /&gt;history/h -e num: run the command designated by 'num' in command history&lt;br /&gt;Device:&lt;br /&gt;ls -d/--device: list available devices&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/S9Vk0te3oPI/AAAAAAAAF_Q/BtbStNDCH-A/s1600/cts.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 400px; height: 286px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/S9Vk0te3oPI/AAAAAAAAF_Q/BtbStNDCH-A/s400/cts.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5464384579609010418" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How to add test plan, test packages to CTS?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Add test package name to cts.mk, it would generate apk file when we build cts.&lt;/li&gt;&lt;li&gt;Add all source folder (includes src java files, Android.mk and its Manifest file) to mydroid/cts/tests/tests&lt;/li&gt;&lt;li&gt;If you'd like to create a test plan for this test package. Modify this python script: mydroid/cts/tools/utils/buildCts.py&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Adjust CTS program settings?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Modify $mydroid/cts/tools/utils/host_config.xml&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Number of tests executed between reboots. A value &lt;= 0 disables reboots.  &lt;span style="font-style: italic;"&gt;(maxTestCount)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Max size [tests] for a package to be run in batch mode.&lt;span style="font-style: italic;"&gt; (maxTestInBatchMode)    &lt;/span&gt;&lt;/li&gt;&lt;li&gt;Max time [ms] between test status updates.&lt;span style="font-style: italic;"&gt; (testStatusTimeoutMs)    &lt;/span&gt;&lt;/li&gt;&lt;li&gt;Max time [ms] from start of package in batch mode and the first test status update. &lt;span style="font-style: italic;"&gt;(batchStartTimeoutMs)    &lt;/span&gt;&lt;/li&gt;&lt;li&gt;Max time [ms] from start of test in individual mode to the first test status update. &lt;span style="font-style: italic;"&gt;(individualStartTimeoutMs)    &lt;/span&gt;&lt;/li&gt;&lt;li&gt;Timeout [ms] for the signature check.&lt;span style="font-style: italic;"&gt; (signatureTestTimeoutMs)    &lt;/span&gt;&lt;/li&gt;&lt;li&gt;Timeout [ms] for package installations. &lt;span style="font-style: italic;"&gt;(packageInstallTimeoutMs)    &lt;/span&gt;&lt;/li&gt;&lt;li&gt;Time to wait [ms] after a package installation or removal. &lt;span style="font-style: italic;"&gt;(postInstallWaitMs)  &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Write your own testing package?&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;If you would like to write your own testing package, you may reference the&lt;a href="http://www.netmite.com/android/mydroid/development/pdk/docs/instrumentation_framework.html"&gt; Instrumentation Testing document&lt;/a&gt; from Android porting guide. Also, you could reference the source code from few Android application, like Browser, Messages, Gallery, Email, Camera, Calculator....etc. You can build its test apk file and upload it to device.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;How to write test cases?&lt;/span&gt;&lt;br /&gt;Each instrumentation test case is similar to an Android application with the distinction that it starts another application. For example, have a look in the $MYDROID/packages/apps/Music directory.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;There should be a Makefile and an Android Manifest file&lt;/li&gt;&lt;li&gt;Tests are located in $MYDROID/packages/apps/Music/tests.&lt;/li&gt;&lt;li&gt;The Instrumentation Test Runner is located at packages/apps/Music/tests/src/com/android/music/MusicPlayerFunctionalTestRunner.java.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Build package apk file&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;erin@midnight:~/eclair/mydroid/packages/apps/Music/tests$ mm&lt;br /&gt;Install: out/target/product/generic/data/app/MusicTests.apk&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Install it to the device&lt;/span&gt;&lt;br /&gt;erin@midnight:~/eclair/mydroid/packages/apps/Music/tests$ adb install ../../../../out/target/product/generic/data/app/MusicTests.apk&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;How to run test cases in device?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Running Tests&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;erin@midnight:~/$ adb shell pm list instrumentation&lt;br /&gt;instrumentation:com.android.music.tests/.MusicPlayerStressTestRunner (target=com.android.music)&lt;br /&gt;instrumentation:com.android.music.tests/.MusicPlayerFunctionalTestRunner (target=com.android.music)&lt;br /&gt;instrumentation:com.android.music.tests/.MusicPlayerLaunchPerformance (target=com.android.music)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The am command is a command-line interface to the ActivityManager. 'am' is used to start and instrument activities using the adb shell command, as shown in the snippet below:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettify"&gt;&lt;br /&gt;&amp;gt; adb shell am&lt;br /&gt;usage: am [start|instrument]&lt;br /&gt;      am start [-a &amp;lt;ACTION&amp;gt;] [-d &amp;lt;DATA_URI&amp;gt;] [-t &amp;lt;MIME_TYPE&amp;gt;]&lt;br /&gt;               [-c &amp;lt;CATEGORY&amp;gt; [-c &amp;lt;CATEGORY&amp;gt;] ...]&lt;br /&gt;               [-e &amp;lt;EXTRA_KEY&amp;gt; &amp;lt;EXTRA_VALUE&amp;gt; [-e &amp;lt;EXTRA_KEY&amp;gt; &amp;lt;EXTRA_VALUE&amp;gt; ...]&lt;br /&gt;               [-n &amp;lt;COMPONENT&amp;gt;] [-D] [&amp;lt;URI&amp;gt;]&lt;br /&gt;      am instrument [-e &amp;lt;ARG_NAME&amp;gt; &amp;lt;ARG_VALUE&amp;gt;] [-p &amp;lt;PROF_FILE&amp;gt;]&lt;br /&gt;               [-w] &amp;lt;COMPONENT&amp;gt;&lt;br /&gt;&lt;br /&gt;For example, to start the Contacts application you can use&lt;br /&gt;&amp;gt; adb shell am start -n com.google.android.contacts/.ContactsActivity&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Eg. verify&lt;span style="font-style: italic;"&gt; Music player launcher performance&lt;/span&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;erin@midnight:~/$ adb shell am instrument -w -r com.android.music.tests/.MusicPlayerLaunchPerformance&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Eg. verify &lt;span style="font-style: italic;"&gt;Music player stress test&lt;/span&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;erin@midnight:~/$ adb shell am instrument -w -r com.android.music.tests/.MusicPlayerStressTestRunner&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Here is a &lt;a href="http://www.youtube.com/watch?v=qRdGOouAg_c"&gt;video&lt;/a&gt; about running a cts test case by Android emulator!&lt;br /&gt;&lt;object width="660" height="405"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/qRdGOouAg_c&amp;hl=en_US&amp;fs=1&amp;color1=0x3a3a3a&amp;color2=0x999999&amp;hd=1&amp;border=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/qRdGOouAg_c&amp;hl=en_US&amp;fs=1&amp;color1=0x3a3a3a&amp;color2=0x999999&amp;hd=1&amp;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="660" height="405"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-2916933595312633477?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/2916933595312633477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2010/04/android-cts-compatibility-test-suite.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/2916933595312633477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/2916933595312633477'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2010/04/android-cts-compatibility-test-suite.html' title='Android CTS (Compatibility Test Suite) introduction'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_fB3UGiuVTOI/S9Vk0te3oPI/AAAAAAAAF_Q/BtbStNDCH-A/s72-c/cts.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-6179883240715450099</id><published>2010-02-01T23:41:00.000-08:00</published><updated>2010-02-02T01:08:20.207-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bluetooth'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>New Bluetooth Object Push Profile in Android 2.0 (Eclair)</title><content type='html'>From Android developer website, they said &lt;a href="http://developer.android.com/sdk/android-2.0-highlights.html"&gt;Android 2.0&lt;/a&gt; provides two new Bluetooth profiles: Object Push Profile (OPP) and Phone Book Access Profile (PBAP). Seeing is believing. Where is the meat? ha, I found they finally released their &lt;a href="http://android.git.kernel.org/?p=platform/packages/apps/Bluetooth.git;a=shortlog;h=refs/heads/eclair"&gt;Bluetooth application&lt;/a&gt; source code. Therefore, I tried to verify OPP in Beagle board. :D&lt;br /&gt;&lt;br /&gt;As usual, I read &lt;a href="http://gitorious.org/0xdroid/pages/Build-from-Scratch"&gt;Build-from-Scratch&lt;/a&gt; wiki page and download code from &lt;a href="http://gitorious.org/0xdroid"&gt;0xdroid&lt;/a&gt; project with beagle-eclair branch. LIke beagle-donut, I can use USB mouse, keyboard, mount a SD sdcard, use USB networking, and then I turn Bluetooth on. It's very easy to set up the working environment with 0xdroid.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;Check Bluetooth application source code and install it in Beagleboard&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cd packages/apps&lt;br /&gt;git clone git://android.git.kernel.org/platform/packages/apps/Bluetooth.git&lt;br /&gt;cd Bluetooth&lt;br /&gt;git checkout -b eclair remotes/origin/eclair&lt;br /&gt;git pull&lt;br /&gt;source ../../../build/envsetup.sh&lt;br /&gt;mm&lt;br /&gt;adb install ../../../out/target/product/beagleboard/system/app/Bluetooth.apk&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;Trace related log&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;When we saw the log like below, it means it provides OPP service in RFCOMM channel 12 and PBAP service in RFCOMM channel 19.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;I/bluedroid(  736): Starting hciattach daemon&lt;br /&gt;I/bluedroid(  736): Starting bluetoothd deamon&lt;br /&gt;&lt;br /&gt;I/bluetooth_ScoSocket.cpp(  797): Listening SCO socket...&lt;br /&gt;V/BtOpp Service(  933): Service onCreate&lt;br /&gt;&lt;br /&gt;V/BtOpp Service(  933): Starting RfcommListener in 9 seconds&lt;br /&gt;V/BtOpp Service(  933): Service onStartCommand&lt;br /&gt;&lt;br /&gt;V/BluetoothPbapService(  933): Pbap Service onCreate&lt;br /&gt;V/BluetoothPbapService(  933): Starting PBAP service&lt;br /&gt;V/BluetoothPbapService(  933): Pbap Service onStartCommand&lt;br /&gt;&lt;br /&gt;D/BluetoothService(  736): Registering hfag record&lt;br /&gt;D/BluetoothService(  736): Registering opush record&lt;br /&gt;D/BluetoothService(  736): Registering pbap record&lt;br /&gt;&lt;br /&gt;V/BluetoothPbapService(  933): Handler(): got msg=1&lt;br /&gt;V/BluetoothPbapService(  933): Pbap Service startRfcommSocketListener&lt;br /&gt;V/BluetoothPbapService(  933): Pbap Service initSocket&lt;br /&gt;V/BluetoothPbapService(  933): Succeed to create listening socket on channel 19&lt;br /&gt;&lt;br /&gt;V/BtOpp Service(  933): start RfcommListener&lt;br /&gt;V/BtOpp Service(  933): RfcommListener started&lt;br /&gt;I/BtOppRfcommListener(  933): Accept thread started on channel 12&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;Receiving and sending out data via Bluetooth&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Currently, it only accepts few media types, like image, video, audio, text/plain and text/html and it should have the extension name. It cannot accept vcard and vcalendar. But we can modify few lines in 'Bluetooth/src/com/android/bluetooth/opp/Constants.java  ', then it can store vcard files. One more problem, there is no matched application can view *.vcf file. I guess I can reference with previous &lt;a href="http://gitorious.org/0xdroid/packages_apps_bluetooth/commits/beagle-donut"&gt;beagle-donut&lt;/a&gt; code to fix it. All incoming files are stored in /sdcard/bluetooth folder. Also, there is a db file to record all Bluetooth application  actions. &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# cd /sdcard/bluetooth&lt;br /&gt;# ls&lt;br /&gt;08042009068.jpg&lt;br /&gt;08042009068-1.jpg&lt;br /&gt;&lt;br /&gt;# cd /data/data/com.android.bluetooth/databases&lt;br /&gt;# ls&lt;br /&gt;btopp.db&lt;br /&gt;# sqlite3 btopp.db&lt;br /&gt;SQLite version 3.5.9&lt;br /&gt;Enter ".help" for instructions&lt;br /&gt;sqlite&gt; .tables&lt;br /&gt;android_metadata  btopp           &lt;br /&gt;sqlite&gt; select * from btopp;&lt;br /&gt;1||08042009068.jpg||image/jpeg|1|00:18:C5:42:18:78|1|1|493|394450||946685154325|0&lt;br /&gt;2|content://media/external/images/media/1|08042009068.jpg|/sdcard/bluetooth/08042009068.jpg|image/jpeg|1|00:18:C5:42:18:78|1|1|200|394450|394450|946685200379|1&lt;br /&gt;3||olv.vcf|/sdcard/bluetooth/olv.vcf|text/x-vcard|1|00:18:C5:42:18:78|1|1|200|68|68|946685305125|2&lt;br /&gt;4|file:///sdcard/bluetooth/08042009068.jpg|08042009068.jpg||image/jpeg|0|00:18:C5:42:18:78|1|2|200|394450|394450|946685368037|0&lt;br /&gt;5||btopp_vcard.vcf|/sdcard/bluetooth/btopp_vcard.vcf|text/x-vcard|1|00:22:A5:B8:AD:65|1|1|496|168||946685701894|0&lt;br /&gt;6||btopp_vcard.vcf|/sdcard/bluetooth/btopp_vcard.vcf|text/x-vcard|1|00:22:A5:B8:AD:65|1|1|200|168|168|946685806848|2&lt;br /&gt;7||08042009068.jpg||image/jpeg|1|00:18:C5:42:18:78|1|4|490|394450||946698435289|0&lt;br /&gt;8||08042009068.jpg||image/jpeg|1|00:18:C5:42:18:78|1|4|490|394450||946698501841|0&lt;br /&gt;9|content://media/external/images/media/1|08042009068.jpg|/sdcard/bluetooth/08042009068.jpg|image/jpeg|1|00:18:C5:42:18:78|1|1|200|394450|394450|946698554454|1&lt;br /&gt;10|content://media/external/images/media/2|08042009068-1.jpg|/sdcard/bluetooth/08042009068-1.jpg|image/jpeg|1|00:18:C5:42:18:78|1|1|200|394450|394450|946698717592|1&lt;br /&gt;11|file:///sdcard/bluetooth/08042009068-1.jpg|08042009068-1.jpg||image/jpeg|0|00:22:A5:B8:AD:65|1|2|495|394450|0|946698901473|0&lt;br /&gt;12|content://media/external/images/media/2|08042009068-1.jpg||image/jpeg|0|00:18:C5:42:18:78|1|2|200|394450|394450|946699019695|0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;Screenshots from beagle-eclair&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;* Turn Bluetooth On&lt;br /&gt;* Pair with Nokia N73 phone&lt;br /&gt;* Receive an image from N73 to Beagle board via BT&lt;br /&gt;* Send an image from Beagle board to N73 via BT&lt;br /&gt;&lt;br /&gt;&lt;div style="width:600px;font-family:arial,sans-serif;font-size:13px;"&gt;&lt;div&gt;&lt;embed type="application/x-shockwave-flash" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" width="600" height="400" flashvars="host=picasaweb.google.com&amp;amp;captions=1&amp;amp;hl=en_US&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2Fimisserin%2Falbumid%2F5433565891498835217%3Falt%3Drss%26kind%3Dphoto%26hl%3Den_US" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;span style="float:left;"&gt;&lt;a href="http://picasaweb.google.com/imisserin/AndroidBluetoothOPPInEclair?feat=flashalbum" style="color:#3964c2"&gt;View all&lt;/a&gt;&lt;/span&gt;&lt;div style="text-align:right;"&gt;&lt;a href="http://picasaweb.google.com/lh/getEmbed?feat=flashalbum" style="color:#3964c2"&gt;Get your own&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-6179883240715450099?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/6179883240715450099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2010/02/new-bluetooth-object-push-profile-opp.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/6179883240715450099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/6179883240715450099'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2010/02/new-bluetooth-object-push-profile-opp.html' title='New Bluetooth Object Push Profile in Android 2.0 (Eclair)'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-26731605756652977</id><published>2010-01-25T01:56:00.000-08:00</published><updated>2010-01-28T01:29:32.957-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='sikuli'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Automated test in Android by Sikuli</title><content type='html'>There is a very friendly and pretty cool project called '&lt;a href="http://sikuli.org/"&gt;Sikuli&lt;/a&gt;' and the authors are from Taiwan too. What is Sikuli? I copy these texts from its website. Sikuli is a visual technology to search and automate graphical user interfaces (GUI) using images (screenshots). The first release of Sikuli contains Sikuli Script, a visual scripting API for Jython, and Sikuli IDE, an integrated development environment for writing visual scripts with screenshots easily. Sikuli Script automates anything you see on the screen without internal API's support. You can programmatically control a web page, a desktop application running on Windows/Linux/Mac OS X, or even an iphone application running in an emulator.&lt;br /&gt;&lt;br /&gt;How I use Sikuli for Android? Since we can catch things from screenshots, it means we can run Android emulator in my Ubuntu machine. Furthermore, I can run a vnc server in Android device, then run a vnc viewer in Ubuntu. Therefore, I can see Android HOME screen in my Desktop. What it can do for me? ha, it can run automated tests and then we don't need SQA to verify phone basic functionalities. Like detect GSM signal, dial out a phone call, enable Bluetooth, connect to WiFi hotspot....etc.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Launch Sikuli IDE editor in Ubuntu&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;wget http://sikuli.org/dl/Sikuli-IDE-linux-20100104.zip&lt;br /&gt;unzip Sikuli-IDE-linux-20100104.zip&lt;br /&gt;sh Sikuli-IDE/sikuli-ide.sh&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/S11yU9i53lI/AAAAAAAAFqc/gsD9XWvSQRM/s1600-h/Screenshot-Sikuli+-+testDialer.sikuli.png"&gt;&lt;img style="cursor: pointer; width: 391px; height: 400px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/S11yU9i53lI/AAAAAAAAFqc/gsD9XWvSQRM/s400/Screenshot-Sikuli+-+testDialer.sikuli.png" alt="" id="BLOGGER_PHOTO_ID_5430622430122597970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Launch Android in Ubuntu&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There is another tool "&lt;a href="http://code.google.com/p/androidscreencast/"&gt;androidscreencast&lt;/a&gt;" I am using for this automated test. It can allow me to control my Android Dev phone remotely. We can have keyboard and mouse input! This is very important for Sikuli scripts, coz I can say "Click" something or "type" something. :)&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;wget http://androidscreencast.googlecode.com/svn/trunk/AndroidScreencast/dist/androidscreencast.jnlp&lt;br /&gt;javaws androidscreencast.jnlp&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/S11z4LHKdqI/AAAAAAAAFqk/SrWHw3VLmrE/s1600-h/Screenshot-HT93MLZ00561.png"&gt;&lt;img style="cursor: pointer; width: 240px; height: 400px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/S11z4LHKdqI/AAAAAAAAFqk/SrWHw3VLmrE/s400/Screenshot-HT93MLZ00561.png" alt="" id="BLOGGER_PHOTO_ID_5430624134571390626" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Let's write some examples! Please check these draft videos!&lt;br /&gt;&lt;object height="364" width="445"&gt;&lt;param name="movie" value="http://www.youtube.com/v/QbKqlh-zcDA&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;color1=0x006699&amp;amp;color2=0x54abd6&amp;amp;border=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/QbKqlh-zcDA&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;color1=0x006699&amp;amp;color2=0x54abd6&amp;amp;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="364" width="445"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="364" width="445"&gt;&lt;param name="movie" value="http://www.youtube.com/v/xCEYNOfr99s&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;color1=0x006699&amp;amp;color2=0x54abd6&amp;amp;border=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/xCEYNOfr99s&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;color1=0x006699&amp;amp;color2=0x54abd6&amp;amp;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="364" width="445"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-weight:bold;"&gt;Build Sikuli in Ubuntu 9.10 (64 bit)&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;1. &lt;span style="font-style:italic;"&gt;download the source code&lt;/span&gt; (you'll need to install bzr, if you don't have it)&lt;br /&gt;&gt; bzr branch lp:sikuli&lt;br /&gt;&lt;br /&gt;2. &lt;span style="font-style:italic;"&gt;check java version&lt;/span&gt; (use java-6-sun)&lt;br /&gt;erin@midnight:~/code/sikuli$ file /etc/alternatives/java&lt;br /&gt;/etc/alternatives/java: symbolic link to `/usr/lib/jvm/java-6-sun/jre/bin/java'&lt;br /&gt;erin@midnight:~/code/sikuli$ file /etc/alternatives/javac&lt;br /&gt;/etc/alternatives/javac: symbolic link to `/usr/lib/jvm/java-1.5.0-sun/bin/javac'&lt;br /&gt;&lt;br /&gt;3. &lt;span style="font-style:italic;"&gt;install some libraries&lt;/span&gt; &lt;br /&gt;tesseract-ocr                   - Command line OCR tool&lt;br /&gt;tesseract-ocr-dev               - Development files for the tesseract command line OCR tool&lt;br /&gt;maven2                          - Java software project management and comprehension tool&lt;br /&gt;libcv1                          - computer vision library&lt;br /&gt;libcvaux1                       - computer vision extension library&lt;br /&gt;libhighgui1                     - computer vision GUI library&lt;br /&gt;&lt;br /&gt;4. &lt;span style="font-style:italic;"&gt;build code&lt;/span&gt;&lt;br /&gt;&gt;cd sikuli-script&lt;br /&gt;&gt;make&lt;br /&gt;&lt;br /&gt;g++ ScreenMatchProxy.o ocr-matcher.o template-matcher.o myocr.o screendiff.o  -o ../../../target/lib/libScreenMatchProxy.so    `pkg-config --libs opencv`  -shared -L/usr/local/lib -I/usr/lib/jvm/java-6-sun/lib -ltesseract_full -ltiff  &lt;br /&gt;/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/4.4.1/../../../../lib/libtesseract_full.a(libtesseract_full.o): relocation R_X86_64_32 against `BLOCK_zapper(ELIST_LINK*)' can not be used when making a shared object; recompile with -fPIC&lt;br /&gt;/usr/lib/gcc/x86_64-linux-gnu/4.4.1/../../../../lib/libtesseract_full.a: could not read symbols: Bad value&lt;br /&gt;collect2: ld returned 1 exit status&lt;br /&gt;make[1]: *** [../../../target/lib/libScreenMatchProxy.so] Error 1&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;how i solved&lt;/span&gt;: i removed -ltesseract_full, then rebuilt it!&lt;br /&gt;&gt;cd src/main/native/&lt;br /&gt;&gt;g++ ScreenMatchProxy.o ocr-matcher.o template-matcher.o myocr.o screendiff.o  -o ../../../target/lib/libScreenMatchProxy.so    `pkg-config --libs opencv`  -shared -L/usr/local/lib -I/usr/lib/jvm/java-6-sun/lib  -ltiff&lt;br /&gt;&lt;br /&gt;&gt;make install-jar (it would build sikuli-script.jar, that is what we need!)&lt;br /&gt;&gt;make release (it would build for all platforms, then zip to a file.)&lt;br /&gt;&lt;br /&gt;erin@midnight:~/project/sikuli/sikuli-script$ make release&lt;br /&gt;mkdir -p target/sikuli-script&lt;br /&gt;rm -rf target/sikuli-script/*&lt;br /&gt;cp target/sikuli-script.{bat,sh} target/sikuli-script&lt;br /&gt;cp: cannot stat `target/sikuli-script.{bat,sh}': No such file or directory&lt;br /&gt;make: *** [release] Error 1&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;how i solved&lt;/span&gt;: modify two lines in sikuli-script/Makefile and mkdir ../release&lt;br /&gt; cp target/sikuli-script.bat target/sikuli-script.sh $(RELEASE_TMP_PATH)&lt;br /&gt; cp -r $(LIB_PATH)/win32 $(LIB_PATH)/tmplib $(RELEASE_TMP_PATH)&lt;br /&gt;&lt;br /&gt;Done! you will find a zip file 'Sikuli-Script-all-20100128.zip' in release directory.&lt;br /&gt;&lt;br /&gt;&gt;cd sikuli-ide&lt;br /&gt;&gt;make install-jar&lt;br /&gt;&gt;make major-release&lt;br /&gt;&lt;br /&gt;Done! you will find a zip file 'Sikuli-IDE-linux-20100128.zip' in release directory. This one is like we download from Sikuli website for linux version.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-26731605756652977?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/26731605756652977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2010/01/automated-test-in-android-by-sikuli.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/26731605756652977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/26731605756652977'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2010/01/automated-test-in-android-by-sikuli.html' title='Automated test in Android by Sikuli'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_fB3UGiuVTOI/S11yU9i53lI/AAAAAAAAFqc/gsD9XWvSQRM/s72-c/Screenshot-Sikuli+-+testDialer.sikuli.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-4018799428472599584</id><published>2009-12-27T23:46:00.000-08:00</published><updated>2009-12-28T03:43:10.972-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bluetooth'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android Bluetooth in Eclair</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/SziZuwSVF5I/AAAAAAAAEsA/e0Bxycw4qr4/s1600-h/device.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/SziZuwSVF5I/AAAAAAAAEsA/e0Bxycw4qr4/s200/device.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5420251180055205778" /&gt;&lt;/a&gt;&lt;br /&gt;If you noticed the source code in Eclair branch, you will find few differences in Bluetooth function. There are three new git repositories for bluetooth. "bluez", "glib" and "hcidump", all of them are located in /external/bluetooth folder, not /external/bluez anymore.&lt;div&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;i&gt;bluez&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;android source: git://android.git.kernel.org/platform/external/bluetooth/bluez.git&lt;br /&gt;Eclair is using &lt;a href="http://www.kernel.org/pub/linux/bluetooth/bluez-4.47.tar.gz"&gt;bluez version 4.47&lt;/a&gt; and the big difference would be &lt;a href="http://wiki.bluez.org/"&gt;bluez API&lt;/a&gt;. Since it has a lot of changes between bluez3 (android 1.6) and bluez4 (Android 2.0), we can tell from the documents in &lt;a href="http://android.git.kernel.org/?p=platform/external/bluetooth/bluez.git;a=tree;f=doc;h=934cf29670cc7f99b5b2dae2270f5727d1a78a42;hb=eclair"&gt;doc&lt;/a&gt; folder. Or we can use dbus-send to get the detailed information.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: 13px; white-space: pre; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;# dbus-send --system --type=method_call --print-reply --dest=org.bluez / org.bluez.Manager.DefaultAdapter&lt;br /&gt;method return sender=:1.2 -&gt; dest=:1.3&lt;br /&gt;   object path "/org/bluez/932/hci0"&lt;br /&gt;&lt;br /&gt;# dbus-send --system --type=method_call --print-reply --dest=org.bluez /org/bluez/932/hci0 org.freedesktop.DBus.Introspectable.Introspect&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:monospace;font-size:100%;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Also, bluetooth service name is changed in Eclair. It's "bluetoothd" now. Check &lt;a href="http://android.git.kernel.org/?p=platform/system/core.git;a=blob_plain;f=rootdir/init.rc;hb=refs/heads/eclair"&gt;init.rc&lt;/a&gt; in /system/core/rootdir.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;service bluetoothd /system/bin/bluetoothd -d -n&lt;br /&gt;    socket bluetooth stream 660 bluetooth bluetooth&lt;br /&gt;    socket dbus_bluetooth stream 660 bluetooth bluetooth&lt;br /&gt;    # init.rc does not yet support applying capabilities, so run as root and&lt;br /&gt;    # let bluetoothd drop uid to bluetooth with the right linux capabilities&lt;br /&gt;    group bluetooth net_bt_admin misc&lt;br /&gt;    disabled&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;i&gt;glib&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;android source: git://android.git.kernel.org/platform/external/bluetooth/glib.git&lt;div&gt;When we build bluez library, it would build &lt;a href="http://library.gnome.org/devel/glib/"&gt;glib&lt;/a&gt; as a static library.&lt;br /&gt;GLib provides the core application building blocks for libraries and applications written in C. It provides the core object system used in GNOME, the main loop implementation, and a large set of utility functions for strings and common data structures. If you are interested in how bluez use glib, you can trace bluez source code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;new Bluetooth API &lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;http://developer.android.com/guide/topics/wireless/bluetooth.html&lt;/div&gt;&lt;div&gt;About Bluetooth, Android website has a very good &lt;a href="http://developer.android.com/guide/topics/wireless/bluetooth.html"&gt;document&lt;/a&gt;. It lists the functions and example code.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Bluetooth&lt;br /&gt;    * Turn on/off Bluetooth&lt;br /&gt;    * Device and service discovery&lt;br /&gt;    * Connect to a remote device using RFCOMM and send/receive data&lt;br /&gt;    * Advertise RFCOMM services and listen for incoming RFCOMM connection&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Bluetooth Chat application&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;What I am curious? It's related to using RFCOMM and send/receive data. In the beginning, I am not quite understand and I thought it's OBEX. After running Bluetooth Chat application, I know what it means now. I installed 0xlab experimental eclair image in Beagle board and installed &lt;a href="http://developer.android.com/resources/samples/BluetoothChat/index.html"&gt;Bluetooth chat example&lt;/a&gt; from Android. I also run a python script in my ubuntu machine and it's from &lt;a href="http://org.csail.mit.edu/pybluez/examples-0.6/rfcomm-client.txt"&gt;pybluez&lt;/a&gt;. Then, I can chat between Beagle board and my laptop via Bluetooth. When we start to run Bluetooth Chat application, it would create a RFCOMM socket and set it to listen mode. We can retrieve the information from sdptool. Then other BT devices can connect to Android using RFCOMM protocol and set channel to the same one.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;# sdptool browse local&lt;br /&gt;Browsing FF:FF:FF:00:00:00 ...&lt;br /&gt;Service Name: BluetoothChat&lt;br /&gt;Service RecHandle: 0x10005&lt;br /&gt;Service Class ID List:&lt;br /&gt;  UUID 128: fa87c0d0-afac-11de-8a39-0800200c9a66&lt;br /&gt;Protocol Descriptor List:&lt;br /&gt;  "L2CAP" (0x0100)&lt;br /&gt;  "RFCOMM" (0x0003)&lt;br /&gt;    Channel: 30&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; white-space: normal;"&gt;&lt;span class="Apple-style-span"   style="font-family:monospace;font-size:100%;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;table style="width:auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/zmAToQrndfxxk-nOHeCWHg?authkey=Gv1sRgCIyU-fSy-braFg&amp;amp;feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_fB3UGiuVTOI/SziRUx2wRqI/AAAAAAAAErg/wRRjvkfS6q8/s800/chat.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/imisserin/Collages?authkey=Gv1sRgCIyU-fSy-braFg&amp;amp;feat=embedwebsite"&gt;Collages&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-4018799428472599584?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/4018799428472599584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/12/android-bluetooth-in-eclair.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/4018799428472599584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/4018799428472599584'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/12/android-bluetooth-in-eclair.html' title='Android Bluetooth in Eclair'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_fB3UGiuVTOI/SziZuwSVF5I/AAAAAAAAEsA/e0Bxycw4qr4/s72-c/device.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-2124755287518353893</id><published>2009-12-18T08:12:00.000-08:00</published><updated>2009-12-18T20:01:06.368-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>0xdroid beagle-donut-0x3 is released now!</title><content type='html'>So exciting is our brand new release called '&lt;a href="http://code.google.com/p/0xdroid/wiki/beagle_donut_0x3"&gt;0xdroid beagle donut-0x3&lt;/a&gt;' that we forgot all about the coming bad weather in Taipei (raining, humid, and chill). This is our third released image for Beagle board in Android and it's based on Donut branch. If you have a beagle board on hand, you may give it a try. We provide a '&lt;a href="http://code.google.com/p/0xdroid/wiki/UsingPreBuiltImages"&gt;Happy installer&lt;/a&gt;' tool and it could give you a 'no pain no tears' good experiences on installing Android. Here is a 2 minutes &lt;a href="http://www.youtube.com/watch?v=6E8aS6wxZV0"&gt;video&lt;/a&gt; in youtube based on real booting time! If you don't have any beagle board to see our work, you could take it a look from our released videos in youtube.&lt;br /&gt;&lt;object width="320" height="265"&gt;&lt;param name="movie" value="http://www.youtube.com/v/v6wdTOHrwQw&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/v6wdTOHrwQw&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="320" height="265"&gt;&lt;/embed&gt;&lt;/object&gt; &lt;object width="320" height="265"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ol9LWBKXXwQ&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/ol9LWBKXXwQ&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="320" height="265"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;What kind of meat we have this time?&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Easy access to Internet through USB OTG network routed via host&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ethernet support + USB OTG network with default static IP configurations &lt;a href="http://code.google.com/p/0xdroid/wiki/USB_Networking"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;...&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;i&gt;Performance improvements&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Dalvik VM + JIT compiler for ARMv7 &lt;a href="http://code.google.com/p/0xdroid/wiki/Benchmarks"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;...&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;ARM NEON optimizations for PixelFlinger &lt;a href="http://code.google.com/p/0xdroid/issues/detail?id=57"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;...&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;i&gt;Theme Flexibility&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Theme selector introduced &lt;a href="http://code.google.com/p/0xdroid/wiki/LauncherTheme"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;...&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Flexible resolution support for Launcher &lt;a href="http://code.google.com/p/0xdroid/issues/detail?id=29"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;...&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;i&gt;More and better peripheral support&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;External GSM modem for functional Android Telephony/RIL &lt;a href="http://i-miss-erin.blogspot.com/2009/11/pick-up-phone-in-beagle-board.html"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;...&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Bluetooth OBEX OPush and FTP support &lt;a href="http://i-miss-erin.blogspot.com/2009/12/provide-bluetooth-ftp-profile-in.html"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;...&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Motion sensor support &lt;a href="http://matthsu-abacus.blogspot.com/2009/12/motion-sensor-demo-on-beagleboard.html"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;...&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Camera capture / recording &lt;a href="http://code.google.com/p/0xdroid/issues/detail?id=35"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;...&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;i&gt;Stability improvements with several issues fixed&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Dalvik stability fix &lt;a href="http://code.google.com/p/0xdroid/issues/detail?id=25"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;...&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Wifi signal strength with Linux Wireless Extension fix &lt;a href="http://code.google.com/p/0xdroid/issues/detail?id=28"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;...&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Mouse stability fix &lt;a href="http://code.google.com/p/0xdroid/issues/detail?id=26"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;...&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Here is our &lt;a href="http://code.google.com/p/0xdroid/wiki/Roadmap"&gt;Roadmap&lt;/a&gt; about all these releases. If you have interest on particular item, you could get more information from our &lt;a href="http://code.google.com/p/0xdroid/issues/list"&gt;issue tracker&lt;/a&gt;. Furthermore, we welcome your feedback or any suggestion on &lt;a href="http://groups.google.com/group/0xlab-devel"&gt;0xlab-devel&lt;/a&gt; mailing list!&lt;br /&gt;&lt;br /&gt;Frankly speaking, my favorite feature in this released image is neither Bluetooth Obex nor GSM modem, what I like most is our &lt;a href="http://code.google.com/p/0xdroid/wiki/LauncherTheme"&gt;theme launcher&lt;/a&gt;. It has a Christmas theme inside. This theme is our best wishes. Wish everyone have a Merry Christmas and a Happy New Year!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/Syu3pRYT3_I/AAAAAAAAEpw/8BlgsDtT_JM/s1600-h/0xdroid_xmas_1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/Syu3pRYT3_I/AAAAAAAAEpw/8BlgsDtT_JM/s400/0xdroid_xmas_1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5416624896511041522" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/Syu3pRYT3_I/AAAAAAAAEpw/8BlgsDtT_JM/s1600-h/0xdroid_xmas_1.png"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/Syu3o2RmdYI/AAAAAAAAEpo/vWf4gENUtxw/s1600-h/0xdroid_xmas_2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/Syu3o2RmdYI/AAAAAAAAEpo/vWf4gENUtxw/s400/0xdroid_xmas_2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5416624889235142018" /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-2124755287518353893?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/2124755287518353893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/12/0xdroid-beagle-donut-0x3-is-released.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/2124755287518353893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/2124755287518353893'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/12/0xdroid-beagle-donut-0x3-is-released.html' title='0xdroid beagle-donut-0x3 is released now!'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_fB3UGiuVTOI/Syu3pRYT3_I/AAAAAAAAEpw/8BlgsDtT_JM/s72-c/0xdroid_xmas_1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-3168539966104850163</id><published>2009-12-01T23:57:00.000-08:00</published><updated>2009-12-02T02:54:29.195-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bluetooth'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Provide Bluetooth FTP profile in Android</title><content type='html'>About providing Bluetooth FTP &amp;amp; OPP profile &lt;a href="http://code.google.com/p/0xdroid/issues/detail?id=49"&gt;issue&lt;/a&gt;, I've merged all related source code to &lt;a href="http://gitorious.org/0xdroid/pages/Home"&gt;0xdroid&lt;/a&gt; begle-donut branch. I verified these two services in both Beagle board and Android Dev phone. It looks good now.&lt;br /&gt;&lt;br /&gt;When we turn BT on, we start '&lt;a href="http://gitorious.org/0xdroid/system_bluetooth/commit/96177c3d7789168856b755b4ba8f8b633c4c5be5"&gt;obex-client&lt;/a&gt;' service in the background. It would register a record to &lt;a href="http://wiki.bluez.org/wiki/Database"&gt;SDP server&lt;/a&gt; in &lt;a href="http://wiki.bluez.org/"&gt;bluez&lt;/a&gt; and then other BT devices can find we provide this service. How it looks like? We provide channel 7 for FTP. Other BT device can browse our file system using rfcomm. They can pull data from us, modify file name, delete file, or push data to us. Below it's FTP record in SDP database:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Service Name: File Transfer server&lt;br /&gt;Service RecHandle: 0x10003&lt;br /&gt;Service Class ID List:&lt;br /&gt;"OBEX File Transfer" (0x1106)&lt;br /&gt;Protocol Descriptor List:&lt;br /&gt;"L2CAP" (0x0100)&lt;br /&gt;"RFCOMM" (0x0003)&lt;br /&gt;Channel: 7&lt;br /&gt;"OBEX" (0x0008)&lt;br /&gt;Profile Descriptor List:&lt;br /&gt;"OBEX File Transfer" (0x1106)&lt;br /&gt;Version: 0x0100&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/SxY72aN4fRI/AAAAAAAAEZs/FJyxqpEJw0s/s1600-h/device0.png"&gt;&lt;img style="cursor: pointer; width: 200px; height: 150px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/SxY72aN4fRI/AAAAAAAAEZs/FJyxqpEJw0s/s200/device0.png" alt="" id="BLOGGER_PHOTO_ID_5410577808268754194" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/SxY72GItEHI/AAAAAAAAEZk/NF2pvaBMh2k/s1600-h/device12.png"&gt; &lt;img style="cursor: pointer; width: 200px; height: 150px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/SxY72GItEHI/AAAAAAAAEZk/NF2pvaBMh2k/s200/device12.png" alt="" id="BLOGGER_PHOTO_ID_5410577802878324850" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/SxY71yS5vJI/AAAAAAAAEZc/gr-LJRlR8G4/s1600-h/device11.png"&gt; &lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/SxY71yS5vJI/AAAAAAAAEZc/gr-LJRlR8G4/s1600-h/device11.png"&gt;&lt;img style="cursor: pointer; width: 200px; height: 150px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/SxY71yS5vJI/AAAAAAAAEZc/gr-LJRlR8G4/s200/device11.png" alt="" id="BLOGGER_PHOTO_ID_5410577797552389266" border="0" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/SxY71qRVueI/AAAAAAAAEZU/KrWAvglnjjU/s1600-h/device1.png"&gt;&lt;img style="cursor: pointer; width: 200px; height: 150px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/SxY71qRVueI/AAAAAAAAEZU/KrWAvglnjjU/s200/device1.png" alt="" id="BLOGGER_PHOTO_ID_5410577795398351330" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Let's explain it and trace the source code.&lt;br /&gt;Eg. &lt;span style="font-weight: bold;"&gt;CreateSession&lt;/span&gt; method call in &lt;a href="http://gitorious.org/0xdroid/external_obexd/blobs/beagle-donut/doc/client-api.txt"&gt;obex-client dbus API&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;How we connect obex-client with Bluetooth UI? [using &lt;a href="http://en.wikipedia.org/wiki/Java_Native_Interface"&gt;JNI&lt;/a&gt;, &lt;a href="http://developer.android.com/guide/developing/tools/aidl.html#implementing"&gt;aidl&lt;/a&gt;, and &lt;a href="http://www.freedesktop.org/wiki/Software/dbus"&gt;d-bus&lt;/a&gt;]&lt;br /&gt;We register a FTP service from AndroidRuntime. We also create few methods and it's based on obex client &lt;a href="http://gitorious.org/0xdroid/external_obexd/blobs/beagle-donut/doc/client-api.txt"&gt;API&lt;/a&gt; document. Below texts are related source code:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://gitorious.org/0xdroid/frameworks_base/blobs/beagle-donut/core/jni/AndroidRuntime.cpp"&gt;AndroidRuntime.cpp&lt;/a&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;REG_JNI(register_android_server_BluetoothFtpService),&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://gitorious.org/0xdroid/frameworks_base/blobs/beagle-donut/core/jni/android_server_BluetoothFtpService.cpp"&gt;android_server_BluetoothFtpService.cpp&lt;/a&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;int register_android_server_BluetoothFtpService(JNIEnv *env)&lt;br /&gt;{&lt;br /&gt;  jclass clazz = env-&gt;FindClass("android/server/BluetoothFtpService");&lt;br /&gt;&lt;br /&gt;  method_onCreateSessionComplete = env-&gt;GetMethodID( clazz, "onCreateSessionComplete", "(Ljava/lang/String;Ljava/lang/String;Z)V" );&lt;br /&gt;  method_onChangeFolderComplete = env-&gt;GetMethodID( clazz, "onChangeFolderComplete", "(Ljava/lang/String;Ljava/lang/String;Z)V" );&lt;br /&gt;  &lt;br /&gt;  return AndroidRuntime::registerNativeMethods(env,&lt;br /&gt;         "android/server/BluetoothFtpService", sMethods, NELEM(sMethods));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Below text is the &lt;span style="font-weight: bold;"&gt;sequence&lt;/span&gt; from UI to native code and then back to UI.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://gitorious.org/0xdroid/packages_apps_bluetooth/blobs/beagle-donut/src/com/quicinc/bluetooth/RemoteFileManagerActivity.java"&gt;RemoteFileManagerActivity.java&lt;/a&gt; &lt;span style="font-style:italic;"&gt;(Pick up one device from remote tab in Bluetooth UI)&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;public boolean onOptionsItemSelected(MenuItem item) {&lt;br /&gt;  // Intent intent;&lt;br /&gt;  switch (item.getItemId()) {&lt;br /&gt;  case MENU_SELECT_SERVER:&lt;br /&gt;       if (mFTPClient.isConnectionActive()) {&lt;br /&gt;           Toast.makeText(this, R.string.error_ftp_connect_timeout, Toast.LENGTH_LONG).show();&lt;br /&gt;       } else {&lt;br /&gt;          /* Connect to Server */&lt;br /&gt;           handleServerSelect();&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;public void handleServerSelect() {&lt;br /&gt;  mDirectoryButtons.removeAllViews();&lt;br /&gt;  currentDirectory = "/";&lt;br /&gt;  if (mContext.isBluetoothEnabled()) {&lt;br /&gt;      Intent intent = new Intent(getApplicationContext(), BluetoothDevicePicker.class);&lt;br /&gt;      intent.setAction(BluetoothAppIntent.ACTION_SELECT_BLUETOOTH_DEVICE);&lt;br /&gt;      intent.putExtra(BluetoothAppIntent.PROFILE, BluetoothAppIntent.PROFILE_FTP);&lt;br /&gt;      intent.setData(Uri.parse("file://" + currentDirectory));&lt;br /&gt;      try {&lt;br /&gt;          startActivityForResult(intent, SUBACTIVITY_PICK_BT_DEVICE);&lt;br /&gt;      } catch (ActivityNotFoundException e) {&lt;br /&gt;          Log.e(TAG, "No Activity for : " + BluetoothAppIntent.ACTION_SELECT_BLUETOOTH_DEVICE, e);&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected void onActivityResult(int requestCode, int resultCode, Intent data) {&lt;br /&gt;  super.onActivityResult(requestCode, resultCode, data);&lt;br /&gt;&lt;br /&gt;  switch (requestCode) {&lt;br /&gt;  case SUBACTIVITY_PICK_BT_DEVICE:&lt;br /&gt;      if (resultCode == RESULT_OK &amp;amp;&amp;amp; data != null) {&lt;br /&gt;          /* Obtain the Server name and Address */&lt;br /&gt;          String serverAddress = data.getStringExtra(BluetoothDevicePicker.ADDRESS);&lt;br /&gt;          String serverName = data.getStringExtra(BluetoothDevicePicker.NAME);&lt;br /&gt;          if (mFTPClient != null) {&lt;br /&gt;              mFTPClient.setAddress(serverAddress);&lt;br /&gt;              mFTPClient.setName(serverName);&lt;br /&gt;                  mServerConnectButtonLayout.setVisibility(View.GONE);&lt;br /&gt;              if(mFTPClient.createSession() != true) {&lt;br /&gt;                   String szStr = getResources().getString(R.string.ftp_connect_failed, mFTPClient.getName());&lt;br /&gt;                   Toast.makeText(this, szStr, Toast.LENGTH_LONG).show();&lt;br /&gt;                   updateServerStatus();&lt;br /&gt;              } else {&lt;br /&gt;                   String szStr = getResources().getString(R.string.ftp_connect_device, mFTPClient.getName());&lt;br /&gt;                   showBusy(mFTPClient.getName(), szStr);&lt;br /&gt;              }&lt;br /&gt;          }&lt;br /&gt;      }&lt;br /&gt;      break;&lt;br /&gt;  }&lt;br /&gt;} /* onActivityResult */&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://gitorious.org/0xdroid/frameworks_base/blobs/beagle-donut/core/java/android/server/BluetoothFtpService.java"&gt;BluetoothFtpService.java&lt;/a&gt; &lt;span style="font-style:italic;"&gt;(handle from Android Frameworks)&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;public synchronized boolean createSession(String address, IBluetoothFtpCallback callback) {&lt;br /&gt;  /*&lt;br /&gt;   * Need to register callback before calling native code&lt;br /&gt;   * (which could potentially call callback)&lt;br /&gt;   */&lt;br /&gt;  BluetoothObexDatabase.SessionDbItem dbItem =&lt;br /&gt;          mSessionDb.new SessionDbItem(address,null,callback);&lt;br /&gt;  mSessionDb.insert(dbItem);&lt;br /&gt;&lt;br /&gt;  boolean ret = createSessionNative(address);&lt;br /&gt;&lt;br /&gt;  if (!ret) {&lt;br /&gt;      mSessionDb.deleteByAddress(address);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return ret;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://gitorious.org/0xdroid/frameworks_base/blobs/beagle-donut/core/jni/android_server_BluetoothFtpService.cpp"&gt;android_server_BluetoothFtpService.cpp&lt;/a&gt; &lt;span style="font-style:italic;"&gt;(use JNI and send a dbus method call to obex-client)&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt; &lt;br /&gt;static jboolean createSessionNative(JNIEnv* env, jobject object, jstring address  )&lt;br /&gt;{&lt;br /&gt;DBusMessage *msg = dbus_message_new_method_call(OBEXD_DBUS_CLIENT_SVC,&lt;br /&gt;                                              OBEXD_DBUS_CLIENT_PATH,&lt;br /&gt;                                              OBEXD_DBUS_CLIENT_IFC,&lt;br /&gt;                                              OBEXD_DBUS_CLIENT_CREATE);&lt;br /&gt;&lt;br /&gt;pending = (dbus_async_call_t *) malloc(sizeof(dbus_async_call_t));&lt;br /&gt;if (pending)&lt;br /&gt;{&lt;br /&gt;DBusPendingCall *call;&lt;br /&gt;char *context_address =  (char *) calloc(BTADDR_SIZE,&lt;br /&gt;                                         sizeof(char));&lt;br /&gt;strlcpy(context_address, c_address, BTADDR_SIZE);  // for callback&lt;br /&gt;pending-&gt;env = env;&lt;br /&gt;pending-&gt;user_cb = onCreateSessionComplete;&lt;br /&gt;pending-&gt;user = context_address;&lt;br /&gt;pending-&gt;nat = nat;&lt;br /&gt;dbus_bool_t reply = dbus_connection_send_with_reply(nat-&gt;conn,&lt;br /&gt;                                                    msg,&lt;br /&gt;                                                    &amp;amp;call,&lt;br /&gt;                                                    10*1000);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://gitorious.org/0xdroid/external_obexd/blobs/beagle-donut/client/main.c"&gt;/external/obexd/client/main.c&lt;/a&gt; &lt;span style="font-style:italic;"&gt;(handle from obex-client)&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;static DBusMessage *create_session(DBusConnection *connection,&lt;br /&gt;     DBusMessage *message, void *user_data)&lt;br /&gt;{&lt;br /&gt; if (session_create(source, dest, target, create_callback, data) == 0)&lt;br /&gt;  return NULL;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://gitorious.org/0xdroid/external_obexd/blobs/beagle-donut/client/session.c"&gt;/external/obexd/client/session.c&lt;/a&gt; &lt;span style="font-style:italic;"&gt;(use rfcomm to connect with specific channel )&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;int session_create(const char *source,&lt;br /&gt;   const char *destination, const char *target,&lt;br /&gt;    session_callback_t function, void *user_data)&lt;br /&gt;{&lt;br /&gt; if (session-&gt;channel &gt; 0) {&lt;br /&gt;  err = rfcomm_connect(&amp;amp;session-&gt;src, &amp;amp;session-&gt;dst,&lt;br /&gt;    session-&gt;channel, rfcomm_callback, callback);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://gitorious.org/0xdroid/frameworks_base/blobs/beagle-donut/core/jni/android_server_BluetoothFtpService.cpp"&gt;android_server_BluetoothFtpService.cpp&lt;/a&gt; &lt;span style="font-style:italic;"&gt;(we get the callback!)&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt; &lt;br /&gt;static void onCreateSessionComplete(DBusMessage *msg, void *user, void *nat_cb)&lt;br /&gt;{&lt;br /&gt;char* c_address = (char *)user;&lt;br /&gt;JNIEnv *env = NULL;&lt;br /&gt;nat-&gt;vm-&gt;GetEnv((void**)&amp;amp;env, nat-&gt;envVer);&lt;br /&gt;jstring address = env-&gt;NewStringUTF(c_address);&lt;br /&gt;&lt;br /&gt;env-&gt;CallVoidMethod(nat-&gt;me,&lt;br /&gt;                    method_onCreateSessionComplete,&lt;br /&gt;                    obj_path,&lt;br /&gt;                    address,&lt;br /&gt;                    is_error);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://gitorious.org/0xdroid/packages_apps_bluetooth/blobs/beagle-donut/src/com/quicinc/bluetooth/BluetoothFTPClient.java"&gt;BluetoothFTPClient.java&lt;/a&gt; &lt;span style="font-style:italic;"&gt;(handle from Bluetooth UI)&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;public void onCreateSessionComplete(boolean isError) {&lt;br /&gt;   Message msg = Message.obtain();&lt;br /&gt;   msg.what = TYPE_CREATE_SESSION_COMPLETE;&lt;br /&gt;   Bundle b = new Bundle();&lt;br /&gt;   b.putBoolean("isError", isError);&lt;br /&gt;   msg.obj = b;&lt;br /&gt;   mHandler.sendMessage(msg);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://gitorious.org/0xdroid/packages_apps_bluetooth/blobs/beagle-donut/src/com/quicinc/bluetooth/RemoteFileManagerActivity.java"&gt;RemoteFileManagerActivity.java&lt;/a&gt; &lt;span style="font-style:italic;"&gt;(device is connected, going to refresh panel to display Remote file system)&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;public void onCreateSessionComplete(boolean isError) {&lt;br /&gt;mSessionCreated = !isError;&lt;br /&gt;hideBusy();&lt;br /&gt;if (mFTPClient != null) {&lt;br /&gt;    if (isError == false) {&lt;br /&gt;        mContext.onServerConnected();&lt;br /&gt;        goHomeDir();&lt;br /&gt;    } else {&lt;br /&gt;        String szStr = getResources().getString(R.string.ftp_connect_failed, mFTPClient.getName());&lt;br /&gt;        Toast.makeText(this, szStr, Toast.LENGTH_LONG).show();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;updateServerStatus();&lt;br /&gt;refreshDirectoryPanel();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh4.ggpht.com/_fB3UGiuVTOI/SxZG9PLtLAI/AAAAAAAAEaM/tsdzT4FE-Bs/s912/FTP.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 912px; height: 570px;" src="http://lh4.ggpht.com/_fB3UGiuVTOI/SxZG9PLtLAI/AAAAAAAAEaM/tsdzT4FE-Bs/s912/FTP.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-3168539966104850163?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/3168539966104850163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/12/provide-bluetooth-ftp-profile-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/3168539966104850163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/3168539966104850163'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/12/provide-bluetooth-ftp-profile-in.html' title='Provide Bluetooth FTP profile in Android'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_fB3UGiuVTOI/SxY72aN4fRI/AAAAAAAAEZs/FJyxqpEJw0s/s72-c/device0.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-8455291775031894885</id><published>2009-11-24T02:24:00.000-08:00</published><updated>2009-12-01T20:57:41.513-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gsm'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Radio Layer Interface in Android</title><content type='html'>There is a Radio Layer Interface in Android and it is about telephony service. Like my previous article, I was working on using an external GSM modem in Beagle board. Currently, I am using it to verify telephony service and I can trace the whole log between framework (Telephony service) and ril-daemon. It is the real GSM network and then I can trace the traffic between modem and GSM base station.&lt;br /&gt;&lt;br /&gt;Here is some RIL information from &lt;a href="http://www.netmite.com/android/mydroid/development/pdk/docs/telephony.html"&gt;Android Platform Development Kit&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/SxXlMJALgZI/AAAAAAAAEYU/6dwSo2xqTB0/s1600-h/Screenshot-OpenOffice.org+3.1.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 180px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/SxXlMJALgZI/AAAAAAAAEYU/6dwSo2xqTB0/s320/Screenshot-OpenOffice.org+3.1.png" alt="" id="BLOGGER_PHOTO_ID_5410482524093383058" border="0" /&gt;&lt;/a&gt;   &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/SxXlLnnjLKI/AAAAAAAAEYM/U0LS79smYEk/s1600-h/Screenshot-OpenOffice.org+3.1-3.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 180px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/SxXlLnnjLKI/AAAAAAAAEYM/U0LS79smYEk/s320/Screenshot-OpenOffice.org+3.1-3.png" alt="" id="BLOGGER_PHOTO_ID_5410482515131706530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;RIL Initialization&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Android initializes the telephony stack and the Vendor RIL at startup as described in the sequence below:&lt;br /&gt;&lt;br /&gt;RIL daemon reads &lt;span style="font-weight: bold;"&gt;rild.lib&lt;/span&gt; path and &lt;span style="font-weight: bold;"&gt;rild.libargs&lt;/span&gt; system properties to determine the Vendor RIL library to use and any initialization arguments to provide to the Vendor RIL&lt;br /&gt;- these arguments are from &lt;span style="font-weight: bold;"&gt;/system/build.prop&lt;/span&gt;&lt;br /&gt;eg.&lt;br /&gt;rild.libpath=/system/lib/libreference-ril.so&lt;br /&gt;rild.libargs=-d /dev/pts/0&lt;br /&gt;&lt;br /&gt;RIL daemon loads the Vendor RIL library and calls &lt;span style="font-weight: bold;"&gt;RIL_Init&lt;/span&gt; to initialize the RIL and obtain a reference to RIL functions&lt;br /&gt;- open modem device&lt;br /&gt;- connect with telephony service (Android Frameworks)&lt;br /&gt;&lt;br /&gt;RIL daemon calls &lt;span style="font-weight: bold;"&gt;RIL_register&lt;/span&gt; on the Android telephony stack, providing a reference to the Vendor RIL functions&lt;br /&gt;- start listen socket (SOCKET_NAME_RIL = rild)&lt;br /&gt;- set ril event to listenCallback function&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/SxXjiuh9TaI/AAAAAAAAEYE/pT1m5ZRuB0s/s1600-h/Screenshot-OpenOffice.org+3.1-1.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 180px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/SxXjiuh9TaI/AAAAAAAAEYE/pT1m5ZRuB0s/s320/Screenshot-OpenOffice.org+3.1-1.png" alt="" id="BLOGGER_PHOTO_ID_5410480713101036962" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/SxXjiIHyDyI/AAAAAAAAEX8/c9z5gShyyno/s1600-h/Screenshot-OpenOffice.org+3.1-2.png"&gt;   &lt;img style="cursor: pointer; width: 320px; height: 180px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/SxXjiIHyDyI/AAAAAAAAEX8/c9z5gShyyno/s320/Screenshot-OpenOffice.org+3.1-2.png" alt="" id="BLOGGER_PHOTO_ID_5410480702790700834" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Below text is from radio log and we can see the sequence:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;I/RIL     (  954): Opening tty device /dev/pts/0&lt;br /&gt;D/AT      (  954): entering mainLoop()&lt;br /&gt;I/RILJ    (  820): Connected to 'rild' socket&lt;br /&gt;I/RILC    (  954): libril: new connection&lt;br /&gt;D/RILC    (  954): [UNSL]&lt; UNSOL_RESPONSE_RADIO_STATE_CHANGED  {RADIO_UNAVAILABLE}&lt;br /&gt;D/RILJ    (  820): Radio OFF @ init&lt;br /&gt;D/RILJ    (  820): [UNSL]&lt; UNSOL_RESPONSE_RADIO_STATE_CHANGED RADIO_UNAVAILABLE&lt;br /&gt;I/RILC    (  954): RIL Daemon version: android reference-ril 1.0&lt;br /&gt;D/AT      (  954): AT&lt; AT-Command Interpreter ready&lt;br /&gt;D/RILC    (  954): [UNSL]&lt; UNSOL_RESPONSE_RADIO_STATE_CHANGED  {RADIO_OFF}&lt;br /&gt;D/AT      (  954): AT&gt; ATE0Q0V1&lt;br /&gt;D/AT      (  954): ATE0Q0V1&lt;br /&gt;D/RILB    (  820): Notifying: radio available&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-style: italic;"&gt;RIL Interaction&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;There are two forms of communication that the RIL handles:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/SxXmkPZr3-I/AAAAAAAAEYk/_oA75wpOk-I/s1600-h/Screenshot-OpenOffice.org+3.1-4.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 180px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/SxXmkPZr3-I/AAAAAAAAEYk/_oA75wpOk-I/s320/Screenshot-OpenOffice.org+3.1-4.png" alt="" id="BLOGGER_PHOTO_ID_5410484037639462882" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/SxXmjh7ZvqI/AAAAAAAAEYc/7D425O9maBY/s1600-h/Screenshot-OpenOffice.org+3.1-5.png"&gt; &lt;img style="cursor: pointer; width: 320px; height: 180px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/SxXmjh7ZvqI/AAAAAAAAEYc/7D425O9maBY/s320/Screenshot-OpenOffice.org+3.1-5.png" alt="" id="BLOGGER_PHOTO_ID_5410484025432850082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Solicited commands:&lt;/b&gt; Solicited commands originated by RIL lib, such as DIAL and HANGUP.&lt;br /&gt;&lt;br /&gt;The vendor RIL must provide the functions described in the table below to handle solicited commands. The RIL solicited command request types are defined in ril.h with the RIL_REQUEST_ prefix. Check the header file for details.&lt;br /&gt;&lt;br /&gt;eg. ask GSM network signal strength&lt;br /&gt;&lt;br /&gt;Send a request from framework (telephony service) to GSM modem (ril-daemon)&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;D/GSM     (  791): EVENT_POLL_SIGNAL_STRENGTH&lt;br /&gt;D/RILJ    (  791): [0048]&gt; SIGNAL_STRENGTH&lt;br /&gt;D/RILJ    (  791): send rr to ril-daemon...&lt;br /&gt;D/RILJ    (  791): [0048]&gt; SIGNAL_STRENGTH&lt;br /&gt;D/RILJ    (  791): EVENT_SEND 001&lt;br /&gt;V/RILJ    (  791): writing packet: 8 bytes&lt;br /&gt;D/RILC    (  943): [0048]&gt; SIGNAL_STRENGTH &lt;br /&gt;D/RIL     (  943): onRequest: SIGNAL_STRENGTH&lt;br /&gt;D/AT      (  943): AT&gt; AT+CSQ&lt;br /&gt;D/AT      (  943): AT+CSQ&lt;br /&gt;D/AT      (  943): +CSQ: 20,99 &lt;br /&gt;D/AT      (  943): OK&lt;br /&gt;D/AT      (  943): AT&lt; +CSQ: 20,99 &lt;br /&gt;D/AT      (  943): AT&lt; OK&lt;br /&gt;D/RILC    (  943): [0048]&lt; SIGNAL_STRENGTH {[ 20 99]}&lt;br /&gt;V/RILJ    (  791): Read packet: 40 bytes&lt;br /&gt;D/RILJ    (  791): [0048]&lt; SIGNAL_STRENGTH {20, 99, 0, 0, 0, 0, 0}&lt;br /&gt;D/GSM     (  791): EVENT_GET_SIGNAL_STRENGTH&lt;br /&gt;D/GSM     (  791): [PhoneNotifier] notifySignalStrength&lt;br /&gt;D/GSM     (  791): GSMPhone getSignalStrength&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Unsolicited responses:&lt;/b&gt; Unsolicited responses that originate from the baseband, such as CALL_STATE_CHANGED and NEW_SMS.&lt;br /&gt;&lt;br /&gt;eg. Receive an incoming call (from ril-daemon to telephony service)&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;D/AT      (  943): RING&lt;br /&gt;D/AT      (  943): AT&lt; RING&lt;br /&gt;D/RILC    (  943): [UNSL]&lt; UNSOL_RESPONSE_CALL_STATE_CHANGED &lt;br /&gt;V/RILJ    (  791): Read packet: 8 bytes&lt;br /&gt;D/RILJ    (  791): [UNSL]&lt; UNSOL_RESPONSE_CALL_STATE_CHANGED&lt;br /&gt;D/GSM     (  791): [GsmCallTracker] checkNoOperationsPending: pendingOperations=0&lt;br /&gt;D/RILJ    (  791): [0283]&gt; GET_CURRENT_CALLS&lt;br /&gt;D/RILJ    (  791): send rr to ril-daemon...&lt;br /&gt;D/RILJ    (  791): [0283]&gt; GET_CURRENT_CALLS&lt;br /&gt;D/RILJ    (  791): EVENT_SEND 001&lt;br /&gt;V/RILJ    (  791): writing packet: 8 bytes&lt;br /&gt;D/RILC    (  943): [0283]&gt; GET_CURRENT_CALLS &lt;br /&gt;D/RIL     (  943): onRequest: GET_CURRENT_CALLS&lt;br /&gt;D/AT      (  943): AT&gt; AT+CLCC&lt;br /&gt;D/AT      (  943): AT+CLCC&lt;br /&gt;D/AT      (  943): +CLCC: 1,1,4,0,0,"0952123687",129,"808&lt;br /&gt;D/AT      (  943): 42C771F"&lt;br /&gt;D/AT      (  943): OK&lt;br /&gt;D/AT      (  943): AT&lt; +CLCC: 1,1,4,0,0,"0952123687",129,"80842C771F"&lt;br /&gt;D/AT      (  943): AT&lt; OK&lt;br /&gt;D/RILC    (  943): [0283]&lt; GET_CURRENT_CALLS {[id=1,INCOMING,toa=129,norm,mt,als=0,voc,noevp,0952082687,cli=0,name='(null)',0}&lt;br /&gt;V/RILJ    (  791): Read packet: 88 bytes&lt;br /&gt;D/RILJ    (  791): InCall VoicePrivacy is disabled&lt;br /&gt;D/RILJ    (  791): [0283]&lt; GET_CURRENT_CALLS  [id=1,INCOMING,toa=129,norm,mt,0,voc,noevp,,cli=1,,0] &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;PS. tag information&lt;br /&gt;RIL:  /hardware/ril/reference-ril/refereince-ril.c&lt;br /&gt;AT:   /hardware/ril/reference-ril/atchannel.c&lt;br /&gt;RILD: /hardware/ril/rild/rild.c&lt;br /&gt;RILC: /hardware/ril/libril/ril.cpp&lt;br /&gt;RILJ: /frameworks/base/telephony/java/com/android/internal/telephony/gsm/RIL.java&lt;br /&gt;GSM:  /frameworks/base/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-8455291775031894885?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/8455291775031894885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/11/radio-layer-interface-in-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/8455291775031894885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/8455291775031894885'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/11/radio-layer-interface-in-android.html' title='Radio Layer Interface in Android'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_fB3UGiuVTOI/SxXlMJALgZI/AAAAAAAAEYU/6dwSo2xqTB0/s72-c/Screenshot-OpenOffice.org+3.1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-4280403302387888457</id><published>2009-11-19T08:15:00.000-08:00</published><updated>2009-11-19T08:21:56.508-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gsm'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Pick up the phone in Beagle board</title><content type='html'>I just uploaded two videos about using NEO as external GSM modem in Beagle board. We were trying to make both MT and MO phone call in Beagle board. Since we'd like to hear something during the phone call, I set it to SPEAKER mode in Android Dev phone. Therefore, we can hear what we speak in NEO and also hear some annoyed ECHO sound. Sorry for this....&lt;br /&gt;&lt;br /&gt;&lt;object height="364" width="445"&gt;&lt;param name="movie" value="http://www.youtube.com/v/MGgC4XGHhkQ&amp;amp;hl=en_GB&amp;amp;fs=1&amp;amp;color1=0x006699&amp;amp;color2=0x54abd6&amp;amp;border=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/MGgC4XGHhkQ&amp;amp;hl=en_GB&amp;amp;fs=1&amp;amp;color1=0x006699&amp;amp;color2=0x54abd6&amp;amp;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="364" width="445"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="364" width="445"&gt;&lt;param name="movie" value="http://www.youtube.com/v/gxPXMeyvaJo&amp;amp;hl=en_GB&amp;amp;fs=1&amp;amp;color1=0x006699&amp;amp;color2=0x54abd6&amp;amp;border=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/gxPXMeyvaJo&amp;amp;hl=en_GB&amp;amp;fs=1&amp;amp;color1=0x006699&amp;amp;color2=0x54abd6&amp;amp;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="364" width="445"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-4280403302387888457?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/4280403302387888457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/11/pick-up-phone-in-beagle-board.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/4280403302387888457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/4280403302387888457'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/11/pick-up-phone-in-beagle-board.html' title='Pick up the phone in Beagle board'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-2252714244469664789</id><published>2009-11-06T00:58:00.000-08:00</published><updated>2009-11-06T02:58:16.731-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gsm'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>External GSM modem in Beagle board</title><content type='html'>&lt;span style="font-family:verdana;"&gt;My friend &lt;a href="http://linuxocarina.blogspot.com/"&gt;Tick&lt;/a&gt; just migrated 0xdroid to &lt;/span&gt;&lt;a style="font-family: verdana;" href="http://groups.google.com/group/0xlab-devel/browse_thread/thread/404e297e9b24d104?hl=en"&gt;beagle-donut&lt;/a&gt;&lt;span style="font-family:verdana;"&gt; branch and then I go back to work on &lt;/span&gt;&lt;a style="font-family: verdana;" href="http://code.google.com/p/0xdroid/issues/detail?id=3"&gt;external GSM modem issue&lt;/a&gt;&lt;span style="font-family:verdana;"&gt; in Beagle board. This time I tried to connect two devices from my working Ubuntu machine via two USB cables. It becomes very easy to debug and trace the behaviour between GSM modem and Beagle board. &lt;/span&gt;&lt;span style="font-family:verdana;"&gt;I set up an ethernet bridge in Ubuntu machine (192.168.0.200) and two USB networks. One is to connect with NEO phone (192.168.0.202) and the other is to connect with Beagle board (192.168.0.201). All of these three devices can see each other. Therefore, I can use ssh or adb shell to control them.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/SvQAYD-mQyI/AAAAAAAAEMk/MzZiZk9VwwI/s1600-h/externalGSM2.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/SvQAYD-mQyI/AAAAAAAAEMk/MzZiZk9VwwI/s400/externalGSM2.jpg" alt="" id="BLOGGER_PHOTO_ID_5400942266508788514" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-family: verdana;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/SvPnyC3bH4I/AAAAAAAAEKk/sHKPHtENSsk/s1600-h/Screenshot.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 180px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/SvPnyC3bH4I/AAAAAAAAEKk/sHKPHtENSsk/s320/Screenshot.png" alt="" id="BLOGGER_PHOTO_ID_5400915225096167298" border="0" /&gt;&lt;/a&gt;  &lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;br /&gt;GSM modem is a device "/dev/ttySAC0" in NEO GTA02 phone and I use netcat to make it be listened in port 4270. This modem becomes 192.168.0.202:4270 now. How to make Android to see it? I use a &lt;a href="http://svn.openmoko.org/trunk/src/host/qemu-neo1973/pty.c"&gt;pty&lt;/a&gt; small program from &lt;a href="http://blogs.gnome.org/thos/2007/10/30/turning-the-neo1973-into-an-expensive-external-gsm-modem/"&gt;OpenedHand&lt;/a&gt;. It's like a pseudo terminal and it can  reads and writes to the socket. Running it can make GSM modem become a device "/dev/pts/0" in Android. After starting ril-daemon service, it would connect to GSM modem. Then, everything is like usual. We can camp to GSM network and can dial out a phone call.&lt;/span&gt;&lt;span style="font-family:verdana;"&gt; I am going to close this issue and then file other issues about ril problems later.&lt;/span&gt;  &lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh3.ggpht.com/_fB3UGiuVTOI/SvP8812EWbI/AAAAAAAAEMI/fSpIN9Xdu_k/s912/modem1.jpg"&gt;&lt;img style="cursor: pointer; width: 668px; height: 375px;" src="http://lh3.ggpht.com/_fB3UGiuVTOI/SvP8812EWbI/AAAAAAAAEMI/fSpIN9Xdu_k/s912/modem1.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-2252714244469664789?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/2252714244469664789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/11/external-gsm-modem-in-beagle-board.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/2252714244469664789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/2252714244469664789'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/11/external-gsm-modem-in-beagle-board.html' title='External GSM modem in Beagle board'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_fB3UGiuVTOI/SvQAYD-mQyI/AAAAAAAAEMk/MzZiZk9VwwI/s72-c/externalGSM2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-8357425854306769404</id><published>2009-10-31T00:16:00.000-07:00</published><updated>2009-10-31T09:40:15.109-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bluetooth'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Download Bluetooth OBEX UI from CyanogenMod</title><content type='html'>I am very glad &lt;a href="http://www.cyanogenmod.com/"&gt;CyanogenMod&lt;/a&gt; use Bluetooth OBEX support in their new released ROM image "&lt;a href="http://forum.xda-developers.com/showthread.php?t=567610"&gt;version 4.2.3.1&lt;/a&gt;". If you'd like to try this feature, you could flash with their Android image. Also, you can use &lt;a href="http://code.google.com/p/cyanogen-updater/"&gt;CM updater&lt;/a&gt; to keep tracing with their works!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/SuxnwEoJnnI/AAAAAAAAEJ8/vY58QxmAF7U/s1600-h/device14.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/SuxnwEoJnnI/AAAAAAAAEJ8/vY58QxmAF7U/s200/device14.png" alt="" id="BLOGGER_PHOTO_ID_5398804128883908210" border="0" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/Suxnv3PMzmI/AAAAAAAAEJ0/Om0X7qCnJ4Y/s1600-h/device13.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/Suxnv3PMzmI/AAAAAAAAEJ0/Om0X7qCnJ4Y/s200/device13.png" alt="" id="BLOGGER_PHOTO_ID_5398804125289598562" border="0" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/SuxnvkfAQvI/AAAAAAAAEJs/WKJswun5zBk/s1600-h/device15.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/SuxnvkfAQvI/AAAAAAAAEJs/WKJswun5zBk/s200/device15.png" alt="" id="BLOGGER_PHOTO_ID_5398804120255611634" border="0" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/SuxnvXM2ytI/AAAAAAAAEJk/NkqfHcJKkbY/s1600-h/device3.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/SuxnvXM2ytI/AAAAAAAAEJk/NkqfHcJKkbY/s200/device3.png" alt="" id="BLOGGER_PHOTO_ID_5398804116689832658" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-8357425854306769404?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/8357425854306769404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/10/download-bluetooth-obex-ui-from.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/8357425854306769404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/8357425854306769404'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/10/download-bluetooth-obex-ui-from.html' title='Download Bluetooth OBEX UI from CyanogenMod'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_fB3UGiuVTOI/SuxnwEoJnnI/AAAAAAAAEJ8/vY58QxmAF7U/s72-c/device14.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-8144729943868495827</id><published>2009-10-26T02:35:00.000-07:00</published><updated>2009-10-26T02:56:15.073-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bluetooth'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>how to have OBEX function in Android?</title><content type='html'>Few months ago, I was working on porting openobex, obexpushd and obexftp in Android. They are using commands and I don't have any UI application to use. It's not that convenient for common users. My friend &lt;a href="http://jserv.blogspot.com/"&gt;jserv&lt;/a&gt; sent me a link in September, then I found there is a Bluetooth UI application about OPUSH/FTP profiles from &lt;a href="https://www.codeaurora.org/wiki/QAEP_Patch_Releases"&gt;Aurora forum&lt;/a&gt;. Therefore, I started to work on it.&lt;br /&gt;&lt;br /&gt;At first, we should prepare &lt;a href="http://source.android.com/download"&gt;Android building environment&lt;/a&gt; and I am using Donut branch now. My target is Android Dev phone. I can &lt;a href="http://source.android.com/documentation/building-for-dream"&gt;build the images&lt;/a&gt; for this device and flash with my images successfully. If you are familiar with Android building environment, you can use my works as below:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(1) Android frameworks &lt;/span&gt;&lt;br /&gt;base: http://android.git.kernel.org/?p=platform/frameworks/base.git;a=shortlog;h=refs/heads/donut&lt;br /&gt;my work: &lt;a href="http://androidobex.googlecode.com/files/0001-apply-Bluetooth-FTP-OPP-patch-from-aurora.patch"&gt;http://androidobex.googlecode.com/files/0001-apply-Bluetooth-FTP-OPP-patch-from-aurora.patch&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(2) Blueooth UI application patch from Aurora forum&lt;/span&gt;&lt;br /&gt;base: &lt;a href="https://www.codeaurora.org/gitweb/quic/la/?p=platform/packages/apps/Bluetooth.git;a=shortlog;h=refs/heads/donut_glazed"&gt;https://www.codeaurora.org/gitweb/quic/la/?p=platform/packages/apps/Bluetooth.git;a=shortlog;h=refs/heads/donut_glazed&lt;/a&gt;&lt;br /&gt;my work: &lt;a href="http://androidobex.googlecode.com/files/0001-Modify-OBEX-received-file-path-to-sdcard-and-set-de.patch"&gt;http://androidobex.googlecode.com/files/0001-Modify-OBEX-received-file-path-to-sdcard-and-set-de.patch&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(3) init.rc script patch &lt;/span&gt;&lt;br /&gt;base: &lt;a href="http://android.git.kernel.org/?p=platform/system/core.git;a=shortlog;h=refs/heads/donut"&gt;http://android.git.kernel.org/?p=platform/system/core.git;a=shortlog;h=refs/heads/donut&lt;/a&gt;&lt;br /&gt;my work: &lt;a href="http://androidobex.googlecode.com/files/0001-Add-obexd-and-obex-client-service.patch"&gt;http://androidobex.googlecode.com/files/0001-Add-obexd-and-obex-client-service.patch&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(4) bluedroid patch &lt;/span&gt;&lt;br /&gt;base: &lt;a href="http://android.git.kernel.org/?p=platform/system/bluetooth.git;a=shortlog;h=refs/heads/donut"&gt;http://android.git.kernel.org/?p=platform/system/bluetooth.git;a=shortlog;h=refs/heads/donut&lt;/a&gt;&lt;br /&gt;my work: &lt;a href="http://androidobex.googlecode.com/files/0001-add-obexd-obex-client-service-start-and-stop.patch"&gt;http://androidobex.googlecode.com/files/0001-add-obexd-obex-client-service-start-and-stop.patch&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(5) obexd (i use obexd-0.10 version)&lt;/span&gt;&lt;br /&gt;&lt;a href="http://gitorious.org/android-obex/obexd"&gt;http://gitorious.org/android-obex/obexd&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(6) glib (i use glib-2.13.0 version)&lt;/span&gt;&lt;br /&gt;&lt;a href="http://gitorious.org/android-obex/glib"&gt;http://gitorious.org/android-obex/glib&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(7) bluez patch&lt;/span&gt;&lt;br /&gt;base: &lt;a href="http://android.git.kernel.org/?p=platform/external/bluez.git;a=shortlog;h=refs/heads/donut"&gt;http://android.git.kernel.org/?p=platform/external/bluez.git;a=shortlog;h=refs/heads/donut&lt;/a&gt;&lt;br /&gt;from aurora: &lt;a href="https://www.codeaurora.org/gitweb/quic/la/?p=platform/external/bluez.git;a=commit;h=c2fdca9be6ac9625c229728d83c9ca3b26b64bba"&gt;https://www.codeaurora.org/gitweb/quic/la/?p=platform/external/bluez.git;a=commit;h=c2fdca9be6ac9625c229728d83c9ca3b26b64bba&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(8) openobex (i use openobex version 1.5)&lt;/span&gt;&lt;br /&gt;&lt;a href="http://gitorious.org/android-obex/openobex"&gt;http://gitorious.org/android-obex/openobex&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-8144729943868495827?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/8144729943868495827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/10/how-to-have-obex-function-in-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/8144729943868495827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/8144729943868495827'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/10/how-to-have-obex-function-in-android.html' title='how to have OBEX function in Android?'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-4535976033884332056</id><published>2009-10-25T23:01:00.000-07:00</published><updated>2009-10-26T02:06:40.341-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bluetooth'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android Bluetooth UI application from Aurora</title><content type='html'>Finally, I can use a friendly UI application in Android and it allows to use &lt;a href="https://www.codeaurora.org/patches/quic/la/PATCH_M7201JSDBALYM6380_1179_Bluetooth_OPP_FTP_20090702.tar.gz"&gt;Bluetooth OPUSH/FTP profiles&lt;/a&gt;. I was working on porting obexd and merged some patches from Aurora forum to Donut tree. Here is a discussion in &lt;a href="http://groups.google.com/group/0xlab-devel/browse_thread/thread/9441d8118d704ae2?hl=en"&gt;0xlab-devel mailing list&lt;/a&gt; about OBEX integration in 0xdroid.&lt;br /&gt;&lt;br /&gt;How is this Bluetooth UI application and what I can do? let's check some screen shots! Some examples between my nokia N73 phone and Android Dev phone.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Connect to other Bluetooth devices from G1&lt;/span&gt;&lt;br /&gt;* scan nearby devices from Remote tab&lt;br /&gt;* pair with it&lt;br /&gt;* connect to it&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/SuVHHOcgSYI/AAAAAAAAEEk/j2UVJXtu0Yg/s1600-h/device01.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/SuVHHOcgSYI/AAAAAAAAEEk/j2UVJXtu0Yg/s200/device01.png" alt="" id="BLOGGER_PHOTO_ID_5396797917935716738" border="0" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/SuVHG5LO7sI/AAAAAAAAEEc/y0huUEidqrg/s1600-h/device04.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/SuVHG5LO7sI/AAAAAAAAEEc/y0huUEidqrg/s200/device04.png" alt="" id="BLOGGER_PHOTO_ID_5396797912226131650" border="0" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/SuVHGbTpJWI/AAAAAAAAEEU/pQnRkKon_KU/s1600-h/device05.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/SuVHGbTpJWI/AAAAAAAAEEU/pQnRkKon_KU/s200/device05.png" alt="" id="BLOGGER_PHOTO_ID_5396797904208340322" border="0" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/SuVHGB1PfxI/AAAAAAAAEEM/rocHiUQlfdM/s1600-h/device11.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/SuVHGB1PfxI/AAAAAAAAEEM/rocHiUQlfdM/s200/device11.png" alt="" id="BLOGGER_PHOTO_ID_5396797897369943826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Pull file from other Bluetooth device from G1&lt;/span&gt;&lt;br /&gt;* explore file manager from Remote tab&lt;br /&gt;* download an image file&lt;br /&gt;* open it from Local tab&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/SuVKmAOTxkI/AAAAAAAAEHQ/m1IWvHrR8Cg/s1600-h/device05.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/SuVKmAOTxkI/AAAAAAAAEHQ/m1IWvHrR8Cg/s200/device05.png" alt="" id="BLOGGER_PHOTO_ID_5396801745228908098" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/SuVKmvAnUzI/AAAAAAAAEHY/NoG2EhhShio/s1600-h/device06.png"&gt; &lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/SuVKmvAnUzI/AAAAAAAAEHY/NoG2EhhShio/s200/device06.png" alt="" id="BLOGGER_PHOTO_ID_5396801757787935538" border="0" /&gt; &lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/SuVKm567WZI/AAAAAAAAEHg/r4aXnLEn5SY/s1600-h/device07.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/SuVKm567WZI/AAAAAAAAEHg/r4aXnLEn5SY/s200/device07.png" alt="" id="BLOGGER_PHOTO_ID_5396801760716872082" border="0" /&gt; &lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/SuVKnEm0SsI/AAAAAAAAEHo/SPebmbuBCqA/s1600-h/device09.png"&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/SuVKn_TNe2I/AAAAAAAAEHw/rakr-F8bC7U/s1600-h/device10.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/SuVKn_TNe2I/AAAAAAAAEHw/rakr-F8bC7U/s200/device10.png" alt="" id="BLOGGER_PHOTO_ID_5396801779340770146" border="0" /&gt; &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Push file from G1 to other Bluetooth device&lt;/span&gt;&lt;br /&gt;* open Local tab&lt;br /&gt;* choose a file&lt;br /&gt;* send it out&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/SuVL3HcBg7I/AAAAAAAAEH4/U5M4dneTV9o/s1600-h/device08.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/SuVL3HcBg7I/AAAAAAAAEH4/U5M4dneTV9o/s200/device08.png" alt="" id="BLOGGER_PHOTO_ID_5396803138734883762" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/SuVL3ZMj0YI/AAAAAAAAEIA/M8kvdhPL1ik/s1600-h/device09.png"&gt; &lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/SuVL3ZMj0YI/AAAAAAAAEIA/M8kvdhPL1ik/s200/device09.png" alt="" id="BLOGGER_PHOTO_ID_5396803143501861250" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/SuVL3i75ltI/AAAAAAAAEII/UUq3vFBau8I/s1600-h/device11.png"&gt; &lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/SuVL3i75ltI/AAAAAAAAEII/UUq3vFBau8I/s1600-h/device11.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/SuVL3i75ltI/AAAAAAAAEII/UUq3vFBau8I/s200/device11.png" alt="" id="BLOGGER_PHOTO_ID_5396803146116339410" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Receive a vcard from other Bluetooth device to G1&lt;/span&gt;&lt;br /&gt;* bluetooth authorize dialog&lt;br /&gt;* accept a *.vcf file?&lt;br /&gt;* press OK, it would store to Contact&lt;br /&gt;* open Contact&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/SuVM49MB4CI/AAAAAAAAEIQ/kPgJCo-8ZQY/s1600-h/device13.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/SuVM49MB4CI/AAAAAAAAEIQ/kPgJCo-8ZQY/s200/device13.png" alt="" id="BLOGGER_PHOTO_ID_5396804269854810146" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/SuVM5AAr1-I/AAAAAAAAEIY/9aIOCZkxEMk/s1600-h/device14.png"&gt; &lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/SuVM5AAr1-I/AAAAAAAAEIY/9aIOCZkxEMk/s200/device14.png" alt="" id="BLOGGER_PHOTO_ID_5396804270612535266" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Receive a mp3 file from other Bluetooth device to G1&lt;/span&gt;&lt;br /&gt;* bluetooth authorize dialog&lt;br /&gt;* accept a *.mp3 file?&lt;br /&gt;* press OK, it would store to sdcard&lt;br /&gt;* open Music&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/SuVlfcnos6I/AAAAAAAAEIg/8CxiNiLEz_s/s1600-h/device15.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/SuVlfcnos6I/AAAAAAAAEIg/8CxiNiLEz_s/s200/device15.png" alt="" id="BLOGGER_PHOTO_ID_5396831319406195618" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/SuVlfhmliuI/AAAAAAAAEIo/E3w2OckSh3A/s1600-h/device16.png"&gt; &lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/SuVlfhmliuI/AAAAAAAAEIo/E3w2OckSh3A/s200/device16.png" alt="" id="BLOGGER_PHOTO_ID_5396831320743971554" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/SuVlfx0yKDI/AAAAAAAAEIw/fn2StO4ilvg/s1600-h/device17.png"&gt; &lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/SuVlfx0yKDI/AAAAAAAAEIw/fn2StO4ilvg/s200/device17.png" alt="" id="BLOGGER_PHOTO_ID_5396831325098485810" border="0" /&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-4535976033884332056?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/4535976033884332056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/10/android-bluetooth-ui-application-from.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/4535976033884332056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/4535976033884332056'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/10/android-bluetooth-ui-application-from.html' title='Android Bluetooth UI application from Aurora'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_fB3UGiuVTOI/SuVHHOcgSYI/AAAAAAAAEEk/j2UVJXtu0Yg/s72-c/device01.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-6281740873122999815</id><published>2009-09-13T20:04:00.001-07:00</published><updated>2009-09-13T22:14:13.794-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bluetooth'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android Bluetooth Introduction</title><content type='html'>Check out this SlideShare Presentation :)&lt;div style="width: 425px; text-align: left;" id="__ss_1993400"&gt;&lt;a style="margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;" href="http://www.slideshare.net/erinyueh/android-bluetooth-introduction" title="Android Bluetooth Introduction"&gt;Android Bluetooth Introduction&lt;/a&gt;&lt;object style="margin: 0px;" height="355" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=androidbluetoothintro-090913215656-phpapp02&amp;amp;stripped_title=android-bluetooth-introduction"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=androidbluetoothintro-090913215656-phpapp02&amp;amp;stripped_title=android-bluetooth-introduction" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="355" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"&gt;View more &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/"&gt;documents&lt;/a&gt; from &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/erinyueh"&gt;Erin  Yueh&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-6281740873122999815?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/6281740873122999815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/09/android-bluetooth-introduction.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/6281740873122999815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/6281740873122999815'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/09/android-bluetooth-introduction.html' title='Android Bluetooth Introduction'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-6895891442084158293</id><published>2009-09-08T20:01:00.000-07:00</published><updated>2009-09-08T22:47:24.043-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android ROM images from community</title><content type='html'>When I got the Android Dev phone, I download the official Android images from &lt;a href="http://www.htc.com/www/support/android/adp.html"&gt;HTC site&lt;/a&gt;. Sometimes I build some packages myself, then upload them to ADP. Yesterday, I started to try Android images from community. I am so surprised that I can see so many different and versatile images. Their images are even based on the newest Android code. &lt;a href="http://www.blogger.com/profile/16050238364148074589"&gt;jserv&lt;/a&gt; gave me a &lt;a href="http://forum.xda-developers.com/showthread.php?t=537204"&gt;link&lt;/a&gt; that someone is using my work "&lt;a href="http://gitorious.org/android-obex/pages/Home"&gt;android obex&lt;/a&gt;" in their Android images about two weeks ago, but I didn't figure it out. I was trying to find out how HTC HERO users can get root access and how I can flash Android images from community. I tried to flash about 5 different images and played all day long. Too interesting to quit...:D&lt;br /&gt;&lt;br /&gt;Here is a very detailed &lt;a href="http://db.androidspin.com/android_build_information.asp"&gt;table chart&lt;/a&gt; and it shows kinds of Android images. I can pick one based on its status, like kernel version, WiFi or BT status, what input method, or application status....etc.&lt;br /&gt;&lt;br /&gt;The first image I tried is from &lt;a href="http://forum.xda-developers.com/showthread.php?t=539744"&gt;CyanogenMod&lt;/a&gt;. I downloaded &lt;a href="http://n0rp.chemlab.org/android/update-cm-4.0.4-signed.zip"&gt;this image file&lt;/a&gt; and push it to /sdcard in ADP. We can enter into '&lt;a href="http://www.htc.com/www/support/android/adp.html#update-recovery"&gt;Recovery&lt;/a&gt;' mode to update this image.&lt;br /&gt;&lt;br /&gt;I also found there is '&lt;a href="http://code.google.com/p/cyanogen-updater/"&gt;cyanogen-updater&lt;/a&gt;' application in Android Market. I can install it in ADP and then I can update with their newest image version. It can download ROM image and update it in Recovery mode automatically. After rebooting it, I found it has bluez utils and my obex stuff inside. It means users needn't download hidd, hcitool, or those binary files, and they needn't build those stuff themselves either. I think that is better for normal and common users. Some of my friends, they don't even know what Android phone is, but they know how to use Facebook, how to use Internet. If they buy an Android phone someday, they can use this application to flash image without pain or tears. How cool it is!&lt;br /&gt;&lt;br /&gt;Furthermore, I found &lt;a href="http://www.androidspin.com/downloads.php?dir=enomther/APPS/&amp;amp;file=cime_vsapp.zip"&gt;Chinese Input mothod&lt;/a&gt; in another &lt;a href="http://forum.xda-developers.com/showthread.php?t=538456"&gt;Android image&lt;/a&gt;. It's my first time to try this HTC Chinese input method. I used handwriting method to write words and it's pretty good to use. It can recognize all my writings. I thought I would need a cell phone with qwerty keyboard, but now I think that I can use touch input as well. XD&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh3.ggpht.com/_fB3UGiuVTOI/SqdAIWPWZ6I/AAAAAAAAD3M/-LycpswLZIw/s1024/cyan.jpg"&gt;&lt;img style="cursor: pointer; width: 699px; height: 393px;" src="http://lh3.ggpht.com/_fB3UGiuVTOI/SqdAIWPWZ6I/AAAAAAAAD3M/-LycpswLZIw/s1024/cyan.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-6895891442084158293?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/6895891442084158293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/09/android-rom-images-from-community.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/6895891442084158293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/6895891442084158293'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/09/android-rom-images-from-community.html' title='Android ROM images from community'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_fB3UGiuVTOI/SqdAIWPWZ6I/AAAAAAAAD3M/-LycpswLZIw/s72-c/cyan.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-7099887773167547228</id><published>2009-09-06T20:56:00.000-07:00</published><updated>2009-09-07T18:53:02.007-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android emulator + external GSM modem</title><content type='html'>Recently, I am working on this issue '&lt;a href="http://code.google.com/p/0xdroid/issues/detail?id=3"&gt;Use GTA02 GSM Passthrough mode as external Android GSM modem&lt;/a&gt;' and the goal is to use Beagle board as a platform. Since we are still using cupcake in beagle board, I choose to use Android emulator with latest donut in the beginning. When we have donut image in beagle board, i will switch it on that time.&lt;br /&gt;&lt;br /&gt;In Android emulator, it would use a qemud socket as GSM modem and it can simulate GSM network. Like camp to GSM base station (Android 3G :P), receive incoming call, dial out a phone call, has a simulated SIM Card, send SMS messages....etc. In my previous article about &lt;a href="http://i-miss-erin.blogspot.com/2009/04/android-trace-radio-interface-layer-ril.html"&gt;tracing RIL&lt;/a&gt;, I tried to run two emulators and made a phone call to each other. It's pretty fun, coz it can simulate real GSM network.&lt;br /&gt;&lt;br /&gt;But it's still a fake one, not real GSM network, it doesn't camp to the nearby network like your mobile does. Therefore..... I changed few lines and made Android emulator to run an external GSM modem. Here is my experiment!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/SqSiVJ5KVGI/AAAAAAAAD0w/serSrtOrLes/s1600-h/test.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 283px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/SqSiVJ5KVGI/AAAAAAAAD0w/serSrtOrLes/s400/test.png" alt="" id="BLOGGER_PHOTO_ID_5378602339303838818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;rild: allow it to use other GSM device in qemu&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;diff --git a/rild/rild.c b/rild/rild.c&lt;br /&gt;index 14a6ea9..bd91314 100644&lt;br /&gt;--- a/rild/rild.c&lt;br /&gt;+++ b/rild/rild.c&lt;br /&gt;@@ -161,7 +161,7 @@ int main(int argc, char **argv)&lt;br /&gt;    }&lt;br /&gt;    close(fd);&lt;br /&gt;&lt;br /&gt;-        if (strstr(buffer, "android.qemud=") != NULL)&lt;br /&gt;+        if (strstr(buffer, "android.qemud=") == NULL)&lt;br /&gt;    {&lt;br /&gt;        /* the qemud daemon is launched after rild, so&lt;br /&gt;        * give it some time to create its GSM socket&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Modify rild lib argument and change device name&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;diff --git a/target/board/generic/system.prop b/target/board/generic/system.prop&lt;br /&gt;index f2424c9..1b84596 100644&lt;br /&gt;--- a/target/board/generic/system.prop&lt;br /&gt;+++ b/target/board/generic/system.prop&lt;br /&gt;@@ -3,4 +3,4 @@&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;rild.libpath=/system/lib/libreference-ril.so&lt;br /&gt;-rild.libargs=-d /dev/ttyS0&lt;br /&gt;+rild.libargs=-d /dev/ttyS2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;GTA02 NEO phone&lt;/span&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;erin@daydreamer:~$ sudo ifconfig usb0 192.168.0.200&lt;br /&gt;erin@daydreamer:~$ ssh root@192.168.0.202&lt;br /&gt;root@om-gta02:~# echo 1 &gt; /sys/devices/platform/neo1973-pm-gsm.0/power_on&lt;br /&gt;root@om-gta02:~# echo ate1 | ./tickminicom&lt;br /&gt;root@om-gta02:~# nc -l -p 4270 &lt; /dev/ttySAC0 &gt; /dev/ttySAC0 &amp;amp;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;PS. tickminicom is &lt;a href="http://linuxocarina.blogspot.com/2007/09/minicom.html"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Running pty in host machine&lt;/span&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;# ./pty 192.168.0.202 4270&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;PS.1 &lt;a href="http://svn.openmoko.org/trunk/src/host/qemu-neo1973/pty.c"&gt;where&lt;/a&gt; is pty? how do I know it? it's from &lt;a href="http://blogs.gnome.org/thos/2007/10/30/turning-the-neo1973-into-an-expensive-external-gsm-modem/"&gt;Thomas&lt;/a&gt;! I was co-working with him about &lt;a href="http://wiki.openmoko.org/wiki/Gsmd"&gt;gsmd&lt;/a&gt; and &lt;a href="http://svn.openmoko.org/trunk/src/target/OM-2007.2/applications/openmoko-dialer2/"&gt;dialer&lt;/a&gt; UI in 2007.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Running emulator with serial port option&lt;/span&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;erin@daydreamer:~/android/mydroid_emu/out$ ./host/linux-x86/bin/emulator -system ./target/product/generic/system.img -sysdir ./target/product/generic/system -data ./target/product/generic/userdata.img -kernel ../prebuilt/android-arm/kernel/kernel-qemu -ramdisk ./target/product/generic/ramdisk.img -qemu -serial /dev/pts/2&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cannot receive any incoming call&lt;/span&gt;&lt;br /&gt;I was stuck on this case and it would send hangup command to any incoming calls without any notification UI. I found this issue is a &lt;a href="http://code.google.com/p/android/issues/detail?id=1858"&gt;known&lt;/a&gt; one and we can set '&lt;a href="http://android-tricks.blogspot.com/2009/01/using-adp1-without-sim-card.html"&gt;Settings.Secure.DEVICE_PROVISIONED&lt;/a&gt;' to 1. Then no problem now. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;What it can do now?&lt;/span&gt;&lt;br /&gt;* Camp to GSM network&lt;br /&gt;* Dial out a phone call&lt;br /&gt;* Receive an incoming call&lt;br /&gt;* Send SMS&lt;br /&gt;* Receive SMS&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh6.ggpht.com/_fB3UGiuVTOI/SqSmO0gqbxI/AAAAAAAAD2Y/kjGfnptYq6c/s800/ril.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 800px; height: 480px;" src="http://lh6.ggpht.com/_fB3UGiuVTOI/SqSmO0gqbxI/AAAAAAAAD2Y/kjGfnptYq6c/s800/ril.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-7099887773167547228?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/7099887773167547228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/09/android-emulator-external-gsm-modem.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/7099887773167547228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/7099887773167547228'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/09/android-emulator-external-gsm-modem.html' title='Android emulator + external GSM modem'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_fB3UGiuVTOI/SqSiVJ5KVGI/AAAAAAAAD0w/serSrtOrLes/s72-c/test.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-2098731149471945429</id><published>2009-09-02T20:31:00.000-07:00</published><updated>2009-09-02T21:25:08.423-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bluetooth'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Connect Bluetooth Keyboard in Android Dev Phone</title><content type='html'>I have an Apple Wireless Keyboard and how do I connect it with G1 or any Android phones? I am using Android Dev Phone for my example, so I already have its root permission. If you are using other Android phone, not ADP, you have to get root permission first!! BTW, my working machine is Ubuntu 9.04!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Download related bluetooth utilities &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://code.google.com/p/androidobex/downloads/list"&gt;here&lt;/a&gt;&lt;span style="font-weight: bold;"&gt; or &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://groups.google.com/group/android-platform/browse_thread/thread/73eed70fb229d7ae?pli=1"&gt;build it yourself&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;!&lt;/span&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;$ wget http://androidobex.googlecode.com/files/hciconfig&lt;br /&gt;$ wget http://androidobex.googlecode.com/files/hcitool&lt;br /&gt;$ wget http://androidobex.googlecode.com/files/hidd&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Change mount and folder permission in Android Dev Phone&lt;/span&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;$ su&lt;br /&gt;# mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system&lt;br /&gt;# chmod 777 /system/xbin&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Upload related bluetooth utilities to Android Dev phone&lt;/span&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;$ adb push hidd /system/xbin&lt;br /&gt;$ adb push hcitool /system/xbin&lt;br /&gt;$ adb push hciconfig /system/xbin&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Turn Bluetooth ON from Setting UI and click 'Scan for devices'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/Sp9COzCkFQI/AAAAAAAAD0I/spiagsCD4-k/s1600-h/device3.png"&gt;&lt;img style="cursor: pointer; width: 214px; height: 320px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/Sp9COzCkFQI/AAAAAAAAD0I/spiagsCD4-k/s320/device3.png" alt="" id="BLOGGER_PHOTO_ID_5377089302090224898" border="0" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/Sp9COjmI_mI/AAAAAAAAD0A/D52QVRXqpPs/s1600-h/device9.png"&gt;&lt;img style="cursor: pointer; width: 214px; height: 320px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/Sp9COjmI_mI/AAAAAAAAD0A/D52QVRXqpPs/s320/device9.png" alt="" id="BLOGGER_PHOTO_ID_5377089297944477282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Press 'Apple Wireless Keyboard' and it would appear Pair request&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/Sp9CuWDx52I/AAAAAAAAD0o/nFWagB0L-yA/s1600-h/device4.png"&gt;&lt;img style="cursor: pointer; width: 214px; height: 320px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/Sp9CuWDx52I/AAAAAAAAD0o/nFWagB0L-yA/s320/device4.png" alt="" id="BLOGGER_PHOTO_ID_5377089844066510690" border="0" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/Sp9Ct-ncTTI/AAAAAAAAD0g/a9zE1tJcetc/s1600-h/device5.png"&gt;&lt;img style="cursor: pointer; width: 214px; height: 320px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/Sp9Ct-ncTTI/AAAAAAAAD0g/a9zE1tJcetc/s320/device5.png" alt="" id="BLOGGER_PHOTO_ID_5377089837773638962" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Type '0000' or '1111' as pin code and it would appear 'Paired but not connected'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/Sp9CtXGMAmI/AAAAAAAAD0Y/8PYy6id0j8Y/s1600-h/device6.png"&gt;&lt;img style="cursor: pointer; width: 214px; height: 320px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/Sp9CtXGMAmI/AAAAAAAAD0Y/8PYy6id0j8Y/s320/device6.png" alt="" id="BLOGGER_PHOTO_ID_5377089827165176418" border="0" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/Sp9CtBKQrHI/AAAAAAAAD0Q/p9NKxo1wy5A/s1600-h/device8.png"&gt;&lt;img style="cursor: pointer; width: 214px; height: 320px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/Sp9CtBKQrHI/AAAAAAAAD0Q/p9NKxo1wy5A/s320/device8.png" alt="" id="BLOGGER_PHOTO_ID_5377089821276679282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Let's type some bluez utilities commands to make it work!&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# hciconfig&lt;br /&gt;hci0: Type: UART&lt;br /&gt; BD Address: 00:22:A5:B8:AD:65 ACL MTU: 1021:4 SCO MTU: 180:4&lt;br /&gt; UP RUNNING PSCAN&lt;br /&gt; RX bytes:8672 acl:98 sco:0 events:285 errors:0&lt;br /&gt; TX bytes:3336 acl:102 sco:0 commands:89 errors:0&lt;br /&gt;&lt;br /&gt;# hcitool dev&lt;br /&gt;Devices:&lt;br /&gt; hci0 00:22:A5:B8:AD:65&lt;br /&gt;&lt;br /&gt;# hcitool scan&lt;br /&gt;Scanning ...&lt;br /&gt; 00:1D:4F:A7:9A:49 Apple Wireless Keyboard&lt;br /&gt; 00:22:43:C6:5B:B9 daydreamer-0&lt;br /&gt; 00:18:C5:42:18:78 Erin-Nokia N73&lt;br /&gt;&lt;br /&gt;# hidd --connect 00:1D:4F:A7:9A:49&lt;br /&gt;&lt;br /&gt;# hcitool con&lt;br /&gt;Connections:&lt;br /&gt; &lt; ACL 00:1D:4F:A7:9A:49 handle 1 state 1 lm MASTER &lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;DONE! I can connect to Bluetooth Keyboard in Android. It's more convenient when I type email, message, or chat with friends now!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-2098731149471945429?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/2098731149471945429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/09/connect-bluetooth-keyboard-in-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/2098731149471945429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/2098731149471945429'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/09/connect-bluetooth-keyboard-in-android.html' title='Connect Bluetooth Keyboard in Android Dev Phone'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_fB3UGiuVTOI/Sp9COzCkFQI/AAAAAAAAD0I/spiagsCD4-k/s72-c/device3.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-1840801585793641844</id><published>2009-08-24T21:34:00.000-07:00</published><updated>2009-08-24T22:03:17.514-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><title type='text'>0xlab in COSCUP 2009</title><content type='html'>What is &lt;a href="http://coscup.org/2009/en/"&gt;COSCUP&lt;/a&gt;? (Conference for Open Source Coders, Users and Promoters) It's a big event for Open Source group in Taiwan. It has become an annual festival for open source community members around Taiwan. This year it hold on August 15-16 in NTU. 0xlab has the great pleasure to become the sponsor and we are so happy to contribute 4 talks and one lightning show! :D&lt;br /&gt;&lt;br /&gt;Unfortunately, I only found three talks in &lt;a href="http://www.youtube.com/view_play_list?p=AC6A4A8E939A4B7A"&gt;YouTube&lt;/a&gt; and missed two talks (olv and walkingice). We will try to provide their pretty slides online later. If you have interests about our talks, you may check these videos in &lt;a href="http://www.youtube.com/view_play_list?p=AC6A4A8E939A4B7A"&gt;YouTube&lt;/a&gt;. haha, our team member &lt;a href="http://jserv.sayya.org/"&gt;jserv&lt;/a&gt; is quite famous in Taiwan FOSS community. His talk in COSCUP 2009 is the most funny and most popular one. It's not easy to make people laugh on hard topic like '&lt;a href="http://www.slideshare.net/jserv/linux-virtualization-goes-mobile"&gt;Linux Virtualization Goes Mobile&lt;/a&gt;'.  XD&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/p/AC6A4A8E939A4B7A&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/p/AC6A4A8E939A4B7A&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" width="480" height="385" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-1840801585793641844?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/1840801585793641844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/08/0xlab-in-coscup-2009.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/1840801585793641844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/1840801585793641844'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/08/0xlab-in-coscup-2009.html' title='0xlab in COSCUP 2009'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-347062577353227840</id><published>2009-08-24T19:30:00.000-07:00</published><updated>2009-08-24T21:25:55.506-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><title type='text'>let's discuss more with 0xlab!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/SpNblXHQSNI/AAAAAAAADw0/i5Cg0Fz1fn4/s1600-h/mailinglist.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 250px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/SpNblXHQSNI/AAAAAAAADw0/i5Cg0Fz1fn4/s400/mailinglist.jpg" alt="" id="BLOGGER_PHOTO_ID_5373739477800863954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I am very glad that &lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt; created two mailing lists for community. We would like to see more people here. If you could drop us a line or few notes about our works, or express your idea about Android, it would be terrific! I am going to close my comment board in this tiny blog, since we have a better one. :P&lt;br /&gt;&lt;br /&gt;Currently we have two mailing lists in &lt;a href="http://groups.google.com/support/?hl=en"&gt;Google groups&lt;/a&gt; website. &lt;a href="http://groups.google.com/group/0xlab-discuss?hl=en"&gt;0xlab-discuss&lt;/a&gt; is for general discussion and &lt;a href="http://groups.google.com/group/0xlab-devel?hl=en"&gt;0xlab-devel&lt;/a&gt; is for development related topics. Please come to visit us!!&lt;br /&gt;&lt;br /&gt;There are some different methods to join it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Visit online&lt;/span&gt;: you can read all posts in Google group website.&lt;br /&gt;&lt;a href="http://groups.google.com/group/0xlab-devel?hl=en"&gt;http://groups.google.com/group/0xlab-devel?hl=en&lt;/a&gt;&lt;br /&gt;&lt;a href="http://groups.google.com/group/0xlab-discuss?hl=en"&gt;http://groups.google.com/group/0xlab-discuss?hl=en&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Subscribe it&lt;/span&gt;: you can join our groups and read groups from your email. Also, you can post message to the group from your email too!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Available feeds&lt;/span&gt;: The feeds allow you to read new topics or new messages from this group with any feed reading software. For example, Bloglines, Google Reader, or Firefox RSS....&lt;br /&gt;&lt;br /&gt;PS. you will need to create a google account to use Google Groups!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-347062577353227840?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/347062577353227840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/08/lets-discuss-more-with-0xlab.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/347062577353227840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/347062577353227840'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/08/lets-discuss-more-with-0xlab.html' title='let&apos;s discuss more with 0xlab!'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_fB3UGiuVTOI/SpNblXHQSNI/AAAAAAAADw0/i5Cg0Fz1fn4/s72-c/mailinglist.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-6770224794574951613</id><published>2009-08-18T21:16:00.000-07:00</published><updated>2009-08-19T01:35:58.716-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>oh...my God! Happy Installer!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh5.ggpht.com/_fB3UGiuVTOI/SouHLBBJAhI/AAAAAAAADvU/aVq_e9G7vfo/s800/200908.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 600px; height: 500px;" src="http://lh5.ggpht.com/_fB3UGiuVTOI/SouHLBBJAhI/AAAAAAAADvU/aVq_e9G7vfo/s800/200908.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Our team member &lt;a href="http://jserv.blogspot.com/2009/08/beagleboard-image-installer.html"&gt;jserv&lt;/a&gt; provides a very convenient 'Installer' tool and it's for beagle board + Android. What I need is one SD card and download three image files from &lt;a href="http://downloads.0xlab.org/"&gt;0xlab&lt;/a&gt; site. Just spend me two minutes and then I can play Android on beagle board.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Download images from &lt;a href="http://downloads.0xlab.org/"&gt;0xlab&lt;/a&gt; website&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- wget http://downloads.0xlab.org/installer/beagle-cupcake-0x1/uImage.bin &lt;span style="font-style: italic;"&gt;(installer itself)&lt;/span&gt;&lt;br /&gt;- wget http://downloads.0xlab.org/release/beagle-cupcake-0x1/0xkernel-beagle.bin &lt;span style="font-style: italic;"&gt;(kernel image)&lt;/span&gt;&lt;br /&gt;- wget http://downloads.0xlab.org/release/beagle-cupcake-0x1/android-beagle.ubi &lt;span style="font-style: italic;"&gt;(android image)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. Prepare a SD card &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- Format the first partition over than 100MB with VFAT on a SD card.  &lt;span style="font-style: italic;"&gt;(&lt;a href="http://wiki.openmoko.org/wiki/Android_on_Freerunner#Preparing_the_SD_Card"&gt;howto format&lt;/a&gt;)&lt;/span&gt;&lt;br /&gt;- Copy those three image files into the first partition of SD/MMC card&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. Boot it with beagle board&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- Plug the SD card in beagleboard SD slot and restart the beagleboard&lt;br /&gt;- Wait for UI installer over&lt;br /&gt;- Erase NAND flash with those three images&lt;br /&gt;- Done&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4. Reboot beagle board without SD card&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;- start to run Android system&lt;br /&gt;- Enjoy!&lt;br /&gt;&lt;br /&gt;PS. we provide &lt;a href="http://downloads.0xlab.org/dailybuild/"&gt;daily build images&lt;/a&gt; as well. You may rename the image file and copy it to SD card.&lt;br /&gt;&lt;br /&gt;PS1. here is a 2 minutes &lt;a href="http://www.youtube.com/watch?v=6E8aS6wxZV0"&gt;video&lt;/a&gt; in youtube based on real booting time!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-6770224794574951613?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/6770224794574951613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/08/ohmy-god-happy-installer.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/6770224794574951613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/6770224794574951613'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/08/ohmy-god-happy-installer.html' title='oh...my God! Happy Installer!'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_fB3UGiuVTOI/SouHLBBJAhI/AAAAAAAADvU/aVq_e9G7vfo/s72-c/200908.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-173000929052312627</id><published>2009-08-04T23:58:00.000-07:00</published><updated>2009-08-04T23:59:16.563-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>[video] Listen FM radio in Android</title><content type='html'>&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/xgGXKJg8bOo&amp;amp;hl=zh_TW&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/xgGXKJg8bOo&amp;amp;hl=zh_TW&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-173000929052312627?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/173000929052312627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/08/video-listen-fm-radio-in-android.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/173000929052312627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/173000929052312627'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/08/video-listen-fm-radio-in-android.html' title='[video] Listen FM radio in Android'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-9152997002446388316</id><published>2009-08-04T01:02:00.000-07:00</published><updated>2009-08-06T01:49:55.360-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Listen FM radio in Android</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/Snf4LFFolYI/AAAAAAAADtY/Sy1q7t8JQsE/s1600-h/08042009071.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/Snf4LFFolYI/AAAAAAAADtY/Sy1q7t8JQsE/s320/08042009071.jpg" alt="" id="BLOGGER_PHOTO_ID_5366030350263293314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I started to work on &lt;a href="http://beagleboard.org/"&gt;beagle board&lt;/a&gt; from July and it's a low power OMAP3 based platform. My friend &lt;a href="http://linuxocarina.blogspot.com/search/label/0xlab"&gt;Tick&lt;/a&gt; is hacking it with Android recently. Therefore, it's very easy for me to pick up Android stuff in beagle board based on his work.&lt;br /&gt;&lt;br /&gt;Since i am working on beagle board with Android, I need to use a lot of cable lines around it. Eg. HDMI cable, USB hub, USB keyboard, USB mice, speaker, mini USB cable and a bluetooth board. Those lines occupy my desk and my mind! Actually, I am checking &lt;a href="http://www.broadcom.com/collateral/pb/4325-PB00-R.pdf"&gt;Broadcom 4325&lt;/a&gt; solution, it combines Bluetooth, Wi-Fi and FM radio functionality on a single-chip design. Yup! It means we can listen to FM Radio in Android. That is the one to keep me busy in July. :D&lt;br /&gt;&lt;br /&gt;Here is a simple FM Radio application. It allows me to adjust FM frequency, preset few radio stations, mute/unmute, and auto scan....etc. I will make a video about FM radio later. The best scenario is browsing internet with WiFi, listen mp3 from a bluetooth speaker, and also listen FM radio from screen speaker by this tiny combo chip. And, it works!&lt;br /&gt;&lt;br /&gt;PS. &lt;a href="http://www.e-classical.com.tw/"&gt;FM 99.7&lt;/a&gt; is a classical radio station in Taiwan and it's my favorite one!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-9152997002446388316?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/9152997002446388316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/08/listen-fm-radio-in-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/9152997002446388316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/9152997002446388316'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/08/listen-fm-radio-in-android.html' title='Listen FM radio in Android'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_fB3UGiuVTOI/Snf4LFFolYI/AAAAAAAADtY/Sy1q7t8JQsE/s72-c/08042009071.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-2750760835478836528</id><published>2009-07-09T19:49:00.000-07:00</published><updated>2009-07-09T21:17:18.958-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bluetooth'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>How to build OBEX in Android</title><content type='html'>First of all, they are all for Android Dev Phone. You need to have root permission in Android devices. My working machine is Ubuntu 9.04 and I use Android tool chain to compile these applications.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Prepare working environment:&lt;/span&gt;&lt;br /&gt;Check &lt;a href="http://source.android.com/download"&gt;Android official website&lt;/a&gt; and they provide a user guide. It tells me how to download Android source code and how to compile it. &lt;br /&gt;&lt;br /&gt;It took me few hours to set up environment, download code, and make the whole building system. Like my friend said, all &lt;a href="http://en.wikipedia.org/wiki/Otaku"&gt;OTAKU&lt;/a&gt; in Taiwan have android source code in their machine.&lt;br /&gt;&lt;br /&gt;If you can run Android emulator from your compiled result, it should mean DONE. :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. Build it for &lt;a href="http://www.htc.com/www/support/android/adp.html"&gt;DREAM&lt;/a&gt;:&lt;/span&gt;&lt;br /&gt;The Android emulator in item one doesn't support bluetooth and I cannot play OBEX in it. I choose to play it with my Android Dev Phone. Then I modified my build system and changed some configuration files. Check another document from &lt;a href="http://source.android.com/documentation/building-for-dream"&gt;Android&lt;/a&gt;, it tells me how to change my building environment. Also, if you'd like to use the official system images, you can download them from &lt;a href="http://www.htc.com/www/support/android/adp.html#s3"&gt;HTC&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. Download OBEX source codes from &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://gitorious.org/android-obex"&gt;android-obex&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;a. build openobex&lt;/span&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;&gt; cd $MYDROID (change folder to mydroid folder)&lt;br /&gt;&gt; cd external (change folder to external directory, it's for native code)&lt;br /&gt;&gt; &lt;span id="repo-7130-git-url"&gt;&lt;code&gt;git clone &lt;a href="git://gitorious.org/android-obex/openobex.git" class="link_noop"&gt;git://gitorious.org/android-obex/openobex.git&lt;/a&gt;&lt;/code&gt;&lt;/span&gt; (it would download code to openobex folder)&lt;br /&gt;&gt; cd openobex&lt;br /&gt;&gt; . ../../build/envsetup.sh (run android env setup script)&lt;br /&gt;&gt; mm (it would run Android makefile to compile sources)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;After running above commands, it would generate related libraries and binary files in android 'out' directory.&lt;br /&gt;&lt;br /&gt;one static library: libopenobex (out/target/product/dream/obj/STATIC_LIBRARIES/libopenobex_intermediates/libopenobex.a)&lt;br /&gt;one binary file: obex_test (out/target/product/dream/system/bin/obex_test)&lt;br /&gt;&lt;br /&gt;use USB cable to upload binary file to Android Dev Phone.&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;&gt; adb shell&lt;br /&gt;&gt; mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system (add WRITE permission in system dir)&lt;br /&gt;&gt; adb push $MYDROID/out/target/product/dream/system/bin/obex_test /system/bin&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;b. build obexpushd&lt;/span&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;&gt; cd $MYDROID (change folder to mydroid folder)&lt;br /&gt;&gt; cd external (change folder to external directory, it's for native code)&lt;br /&gt;&gt; &lt;span id="repo-7130-git-url"&gt;&lt;code&gt;git clone &lt;/code&gt;&lt;/span&gt;&lt;span id="repo-7133-git-url"&gt;&lt;code&gt;git clone &lt;a href="git://gitorious.org/android-obex/obexpushd.git" class="link_noop"&gt;git://gitorious.org/android-obex/obexpushd.git&lt;/a&gt;&lt;/code&gt;&lt;/span&gt; (it would download code to obexpushd folder)&lt;br /&gt;&gt; cd obexpushd/src&lt;br /&gt;&gt; . ../../build/envsetup.sh (run android env setup script)&lt;br /&gt;&gt; mm (it would run Android makefile to compile sources)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;After running above commands, it would generate one binary files in android 'out' directory. The same as openobex, you can use adb push to upload binary file to Android Dev Phone. BTW, you should compile openobex before obexpushd, coz obexpushd need to use openobex libraries.&lt;br /&gt;&lt;br /&gt;one binary file: obexpushd (out/target/product/dream/system/xbin/obexpushd)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4. Verify OBEX functions&lt;/span&gt; between Ubuntu machine and Android Dev Phone. Check the previous article about &lt;a href="http://i-miss-erin.blogspot.com/2009/06/bluetooth-obex-file-sharing-in-android.html"&gt;it&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;PS. if you are not interested in source codes, you can download the binary files from &lt;a href="http://code.google.com/p/androidobex/downloads/list"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-2750760835478836528?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/2750760835478836528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/07/how-to-build-obex-in-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/2750760835478836528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/2750760835478836528'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/07/how-to-build-obex-in-android.html' title='How to build OBEX in Android'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-6517545051126004975</id><published>2009-06-25T02:53:00.000-07:00</published><updated>2009-06-25T20:14:30.881-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bluetooth'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android bluetooth introduction part I</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/SkOe9ED6bbI/AAAAAAAADPk/hApFSMb9CwQ/s1600-h/androidBluetoothProcessDiagram.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 314px; height: 320px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/SkOe9ED6bbI/AAAAAAAADPk/hApFSMb9CwQ/s320/androidBluetoothProcessDiagram.jpg" alt="" id="BLOGGER_PHOTO_ID_5351295554145643954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Here is a very detailed &lt;a href="http://sites.google.com/a/android.com/opensource/projects/bluetooth-faq/android_bluetooth_architecture_10.jpg"&gt;image&lt;/a&gt; from Android website and it tells us the whole architecture about bluetooth in Android. I tried to understand how bluetooth works in Android Dev phone and what BT services we can use.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;I. related source code&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;* bluez 3.36 &lt;span style="font-style: italic;"&gt;(both userspace &amp;amp; kernel)&lt;/span&gt;&lt;br /&gt;- /mydroid/externel/bluez&lt;br /&gt;- /mydroid/kernel/drivers/bluetooth&lt;br /&gt;- /mydroid/kernel/net/bluetooth&lt;br /&gt;&lt;br /&gt;* framework &lt;span style="font-style: italic;"&gt;(java &amp;amp; c++)&lt;/span&gt;&lt;br /&gt;- /mydroid/frameworks/base/core/jni/android_bluetooth_*.cpp &lt;span style="font-style: italic;"&gt;(connect with hcid via dbus)&lt;/span&gt;&lt;br /&gt;- /mydroid/frameworks/base/core/java/android/bluetooth/*.java&lt;br /&gt;- /mydroid/frameworks/base/services/java/com/android/server/ &lt;span style="font-style: italic;"&gt;(SystemServer)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;* UI application &lt;span style="font-style: italic;"&gt;(java)&lt;/span&gt;&lt;br /&gt;- /mydroid/packages/apps/Phone/src/com/android/phone/ &lt;span style="font-style: italic;"&gt;(Phone App)&lt;/span&gt;&lt;br /&gt;- /mydroid/packages/apps/Settings/src/com/android/settings/bluetooth/ &lt;span style="font-style: italic;"&gt;(Settings App)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;II. Init bluetooth&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;* &lt;span style="font-weight: bold;"&gt;init script&lt;/span&gt; from /root/init.rc&lt;br /&gt;&lt;ol&gt;&lt;li&gt;create this directory '/data/misc/hcid' to store paired BT device information&lt;/li&gt;&lt;li&gt;launch &lt;a href="http://www.freedesktop.org/wiki/Software/dbus"&gt;dbus-daemon&lt;/a&gt; &lt;span style="font-style: italic;"&gt;(deal connections between hcid and system server)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;create &lt;a href="http://linux.die.net/man/8/hcid"&gt;hcid&lt;/a&gt; &lt;span style="font-style: italic;"&gt;(Bluetooth Host Controller Interface Daemon) &lt;/span&gt;service, but disabled at first&lt;/li&gt;&lt;li&gt;create hfag service, it's for bluetooth &lt;a href="http://en.wikipedia.org/wiki/Bluetooth_profile#Hands-Free_Profile_.28HFP.29"&gt;Hands-Free Profile&lt;/a&gt;, but disabled at first, and only 'one shot' &lt;span style="font-style: italic;"&gt;(it means not restart this service when it exits)&lt;/span&gt;. Also it would register a SDP service and channel is 10.&lt;/li&gt;&lt;li&gt;create hsag service, it's for bluetooth &lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Bluetooth_profile#Headset_Profile_.28HSP.29"&gt;Headset Profile&lt;/a&gt;, but disabled at first, and only 'one shot' &lt;span style="font-style: italic;"&gt;(it means not restart this service when it exits)&lt;/span&gt;. Also it would register a SDP service and channel is 11.&lt;/li&gt;&lt;li&gt;create dun service, it's for bluetooth &lt;a href="http://en.wikipedia.org/wiki/Bluetooth_profile#Dial-up_Networking_Profile_.28DUN.29"&gt;Dial-up Networking Profile&lt;/a&gt;, but disabled at first, and only 'one shot' &lt;span style="font-style: italic;"&gt;(it means not restart this service when it exits)&lt;/span&gt;. Also it would register a SDP service and channel is 2.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;# create basic filesystem structure&lt;br /&gt;mkdir /data/misc/hcid 0770 bluetooth bluetooth&lt;br /&gt;&lt;br /&gt;service dbus /system/bin/dbus-daemon --system --nofork&lt;br /&gt;socket dbus stream 660 bluetooth bluetooth&lt;br /&gt;user bluetooth&lt;br /&gt;group bluetooth net_bt_admin&lt;br /&gt;&lt;br /&gt;service hcid /system/bin/hcid -s -n -f /etc/bluez/hcid.conf&lt;br /&gt;socket bluetooth stream 660 bluetooth bluetooth&lt;br /&gt;socket dbus_bluetooth stream 660 bluetooth bluetooth&lt;br /&gt;# init.rc does not yet support applying capabilities, so run as root and&lt;br /&gt;# let hcid drop uid to bluetooth with the right linux capabilities&lt;br /&gt;group bluetooth net_bt_admin misc&lt;br /&gt;disabled&lt;br /&gt;&lt;br /&gt;service hfag /system/bin/sdptool add --channel=10 HFAG&lt;br /&gt;user bluetooth&lt;br /&gt;group bluetooth net_bt_admin&lt;br /&gt;disabled&lt;br /&gt;oneshot&lt;br /&gt;&lt;br /&gt;service dun /system/bin/sdptool add --channel=2 DUN&lt;br /&gt;user bluetooth&lt;br /&gt;group bluetooth net_bt_admin&lt;br /&gt;disabled&lt;br /&gt;oneshot&lt;br /&gt;&lt;br /&gt;service hsag /system/bin/sdptool add --channel=11 HSAG&lt;br /&gt;user bluetooth&lt;br /&gt;group bluetooth net_bt_admin&lt;br /&gt;disabled&lt;br /&gt;oneshot&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;* &lt;span style="font-weight: bold;"&gt;init script&lt;/span&gt; from /root/init.trout.rc&lt;br /&gt;&lt;ol&gt;&lt;li&gt;this script file is from /vendor/htc/dream folder and it's particular for this device.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;create &lt;a href="http://www.linuxmanpages.com/man8/hciattach.8.php"&gt;hciattach&lt;/a&gt; &lt;span style="font-style: italic;"&gt;(attach serial devices via UART HCI to BlueZ stack)&lt;/span&gt; service, but disabled at first.&lt;/li&gt;&lt;li&gt;specify UART speed is 115200, serial device is /dev/ttyHS0, id/type is texas.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;service hciattach /system/bin/hciattach \&lt;br /&gt;-n -s 115200 /dev/ttyHS0 texas 4000000 flow&lt;br /&gt;user bluetooth&lt;br /&gt;group bluetooth net_bt_admin&lt;br /&gt;disabled&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;* &lt;span style="font-weight: bold;"&gt;system server&lt;/span&gt;: it would decide whether it should turn bluetooth ON or OFF from settings value. If the value is ON, then it would start hciattach and hcid service. That is why the init scripts set them disabled at first. We can decide BT power from UI application.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;III. Connect with other BT devices&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;bluez: it provides 'hcid' daemon and it's responsible for all related bluetooth services&lt;/li&gt;&lt;li&gt;dbus-daemon: the bridge between hcid and system server&lt;/li&gt;&lt;li&gt;D-Bus is a simple inter-process communication (IPC) system for software applications to communicate with one another.&lt;/li&gt;&lt;li&gt;debug utility: &lt;a href="https://fedorahosted.org/d-feet/"&gt;d-feet&lt;/a&gt; &lt;span style="font-style: italic;"&gt;(a dbus UI debugger )&lt;/span&gt;, &lt;a href="http://linux.die.net/man/1/dbus-monitor"&gt;dbus-monitor&lt;/a&gt; &lt;span style="font-style: italic;"&gt;(debug probe to print message bus messages)&lt;/span&gt;, &lt;a href="http://linux.die.net/man/1/dbus-send"&gt;dbus-send&lt;/a&gt; &lt;span style="font-style: italic;"&gt;(Send a message to a message bus)    &lt;/span&gt;&lt;/li&gt;&lt;li&gt;bluez dbus API document: /mydroid/external/bluez/utils/hcid/dbus-api.txt&lt;/li&gt;&lt;li&gt;one example as below&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;* Scan nearby BT devices in Android&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In system server, it would send a method 'DiscoverDevices' to bluez via dbus-daemon. This method starts the device discovery procedure. This includes an inquiry procedure and remote device name resolving. On start up this process will generate a DiscoveryStarted signal and then return DeviceFound singals. If the procedure has been finished an DiscoveryCompleted signal will be sent.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/SkQ72bEhs8I/AAAAAAAADPs/30l0hT9CaXA/s1600-h/bluez_Architecture.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 216px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/SkQ72bEhs8I/AAAAAAAADPs/30l0hT9CaXA/s320/bluez_Architecture.png" alt="" id="BLOGGER_PHOTO_ID_5351468063388709826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;/mydroid/frameworks/base/core/jni/android_server_BluetoothDeviceService.cpp&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;/* Compose the command */&lt;br /&gt;msg = dbus_message_new_method_call(BLUEZ_DBUS_BASE_IFC, nat-&gt;adapter, DBUS_CLASS_NAME, "DiscoverDevices");&lt;br /&gt;/* Send the command. */&lt;br /&gt;reply = dbus_connection_send_with_reply_and_block(nat-&gt;conn, msg, -1, &amp;amp;err);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;log from ddms&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;06-18 14:42:14.567: INFO/BluetoothEventLoop.cpp(67): DiscoveryStarted signal received&lt;br /&gt;06-18 14:42:14.584: VERBOSE/BluetoothEventRedirector(361): Received android.bluetooth.intent.action.DISCOVERY_STARTED&lt;br /&gt;06-18 14:42:14.834: VERBOSE/BluetoothEventRedirector(361): Received android.bluetooth.intent.action.REMOTE_DEVICE_FOUND&lt;br /&gt;06-18 14:42:35.034: INFO/BluetoothEventLoop.cpp(67): DiscoveryCompleted signal received&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-6517545051126004975?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/6517545051126004975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/06/android-bluetooth-introduction-part-i.html#comment-form' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/6517545051126004975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/6517545051126004975'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/06/android-bluetooth-introduction-part-i.html' title='Android bluetooth introduction part I'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_fB3UGiuVTOI/SkOe9ED6bbI/AAAAAAAADPk/hApFSMb9CwQ/s72-c/androidBluetoothProcessDiagram.jpg' height='72' width='72'/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-5134233138665631671</id><published>2009-06-21T22:49:00.000-07:00</published><updated>2009-06-23T03:56:14.317-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bluetooth'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>OBEX introduction</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/Sj8e5bD-R-I/AAAAAAAADPA/RfpYKrMRKwU/s1600-h/unixsocket1.gif"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 251px; height: 320px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/Sj8e5bD-R-I/AAAAAAAADPA/RfpYKrMRKwU/s320/unixsocket1.gif" alt="" id="BLOGGER_PHOTO_ID_5350028854205237218" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:verdana;" &gt;What is OBEX?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;OBEX (abbreviation of OBject EXchange, also termed IrOBEX) is a communications protocol that facilitates the exchange of binary objects between devices. It is maintained by the Infrared Data Association but has also been adopted by the Bluetooth Special Interest Group and the SyncML wing of the Open Mobile Alliance (OMA). OBEX is very similar in design and function to HTTP. It's a client-server type. One device is a server and it waits for any connections. The other device is a client and it requests to send a file to the server.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:verdana;" &gt;How to use OBEX via bluetooth in Android?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;There are some popular open source projects and they have implemented OBEX protocol. I choose &lt;a href="http://dev.zuckschwerdt.org/openobex/"&gt;openobex&lt;/a&gt;, &lt;a href="http://sourceforge.net/projects/obexpushd"&gt;obexpushd&lt;/a&gt;, &lt;a href="http://dev.zuckschwerdt.org/openobex/wiki/ObexFtp"&gt;obexftp&lt;/a&gt; applications, and I made some changes to allow them to run in Android.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:verdana;" &gt;* build&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;download the original source&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;write related Android.mk files&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;fix undeclared problems or modify to use glib functions....etc&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;upload the source code to gitorious site (&lt;a href="http://gitorious.org/android-obex"&gt;http://gitorious.org/android-obex&lt;/a&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;font-family:verdana;" &gt;* install&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;adb push obexpushd /system/xbin/obexpushd&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;adb push obexftp /system/bin/obexftp&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;adb push obex_test /system/bin/obex_test&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:verdana;" &gt;Examples:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;A. Run an OBEX data &lt;span style="font-style: italic;"&gt;server&lt;/span&gt; in Android, use 'adb shell' to Android Dev phone terminal&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&gt; su &lt;span style="font-style: italic;"&gt;(use root account)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;# cd /sdcard  &lt;span style="font-style: italic;"&gt;(change dir to sdcard and launch obex data server here)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;# obexpushd &lt;span style="font-style: italic;"&gt;(it will store incoming files to /sdcard dir and run in backgournd)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family:verdana;"&gt;or &lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;span style="font-family:verdana;"&gt;# obexpushd -n -d &lt;span style="font-style: italic;"&gt;(it will store incoming file to /sdcard dir and not run in backgound, display debug message)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;When it launchs an OBEX data server in Android, it would broadcast "OBEX Object Push" service from SDP server. If you use other BT devices to search OBEX service, it can discover Android Dev phone. Once you make a paired connection, you can send files to Android Dev phone via bluetooth. It will automatically store files to sdcard. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;B. Make Android Dev phone as a &lt;span style="font-style: italic;"&gt;client&lt;/span&gt;, use 'adb shell' to Android Dev phone terminal&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;This is an example, I send a mp3 file from Android phone to my NOKIA N73 mobile phone.&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;span style="font-family:verdana;"&gt;&gt; su &lt;span style="font-style: italic;"&gt;(use root account)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;# hcitool scan &lt;span style="font-style: italic;"&gt;(scan all near by bluetooth device)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Scanning ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    00:18:C5:42:18:78    Erin-Nokia N73&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;# sdptool search FTP &lt;span style="font-style: italic;"&gt;(search near by BT device with FTP service)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Inquiring ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Searching for FTP on 00:18:C5:42:18:78 ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Service Name: OBEX File Transfer&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Service RecHandle: 0x1000e&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Service Class ID List:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  "OBEX File Transfer" (0x1106)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Protocol Descriptor List:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  "L2CAP" (0x0100)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  "RFCOMM" (0x0003)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    Channel: 11&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  "OBEX" (0x0008)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Language Base Attr List:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  code_ISO639: 0x454e&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  encoding:    0x6a&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  base_offset: 0x100&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Profile Descriptor List:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  "OBEX File Transfer" (0x1106)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    Version: 0x0100&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;# cd /sdcard&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;# obexftp -b 00:18:C5:42:18:78 -B 11 --list &lt;span style="font-style: italic;"&gt;(list folder information)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Browsing 00:18:C5:42:18:78 ...&lt;br /&gt;Channel: 11&lt;br /&gt;Connecting..\done&lt;br /&gt;Receiving "(null)"...|&lt;br /&gt;&lt;!--ATTLIST folder mem-type CDATA #IMPLIED--&gt;&lt;br /&gt;&lt;!--ATTLIST folder label CDATA #IMPLIED--&gt; ]&gt;&lt;br /&gt;&lt;folder-listing version="1.0"&gt;&lt;br /&gt;&lt;folder name="C:" perm="RW" type="DEV" label="Phone memory"&gt;&lt;br /&gt;&lt;folder name="E:" perm="RW" type="MMC" label="Mcard"&gt;&lt;br /&gt;&lt;/folder&gt;done&lt;br /&gt;Disconnecting../done&lt;br /&gt;&lt;/folder&gt;&lt;/folder-listing&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;# obexftp -b 00:18:C5:42:18:78 -B 11 -cE: -p 01.Breakaway.mp3 &lt;span style="font-style: italic;"&gt;(send a MP3 song to NOKIA phone)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Browsing 00:18:C5:42:18:78 ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Channel: 11&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Connecting..\done&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Sending "E:"...|done&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Sending "01.Breakaway.mp3".../done&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Disconnecting..-done&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;# obex_test -b 00:18:C5:42:18:78 11 &lt;span style="font-style: italic;"&gt;(send obex text file to NOKIA phone)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Using Bluetooth RFCOMM transport&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;OBEX Interactive test client/server.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&gt; c (create connection)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Made some progress...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Server request finished!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;server_done() Command (00) has now finished&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Timeout waiting for data. Aborting&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&gt; p (push a file)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;PUT file (local, remote)&gt; /sdcard/obex&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;test (write a subject name)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;name=/sdcard/obex, size=3423&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Going to send 3423 bytes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Made some progress...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Made some progress...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Made some progress...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Made some progress...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Server request finished!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;server_done() Command (02) has now finished&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Timeout waiting for data. Aborting&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&gt; q (leave it)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;PS. all related source code is &lt;a href="http://gitorious.org/android-obex"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-5134233138665631671?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/5134233138665631671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/06/obex-introduction.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/5134233138665631671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/5134233138665631671'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/06/obex-introduction.html' title='OBEX introduction'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_fB3UGiuVTOI/Sj8e5bD-R-I/AAAAAAAADPA/RfpYKrMRKwU/s72-c/unixsocket1.gif' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-4999681365550896153</id><published>2009-06-15T05:49:00.000-07:00</published><updated>2009-06-23T03:57:23.614-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bluetooth'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Bluetooth OBEX file sharing in Android</title><content type='html'>&lt;div style="text-align: justify;"&gt;I'd like to use OBEX in Android Dev phone, but there is no any available bluetooth application yet. Therefore, I made some changes from 'openobex' and 'obexpushd', then I can run these applications in Android. According to &lt;a href="http://sites.google.com/a/android.com/opensource/projects/bluetooth-faq/android_bluetooth_architecture_10.jpg?attredirects=0"&gt;Android Bluetooth architecture&lt;/a&gt;, we can see ‘RFCOMM’ in kernel bluez. RFCOMM is a simple set of transport protocols, made on top of the L2CAP protocol, providing emulated RS-232 serial ports (up to sixty simultaneous connections to a bluetooth device at a time). In the protocol stack, RFCOMM is bound to L2CAP. In Bluetooth, OBEX is used for many profiles that require simple data exchange, e.g. object push, file transfer, basic imaging, basic printing, phonebook access etc. In the protocol stack, OBEX is bound to RFCOMM. It means if I can use RFCOMM connections between two BT devices correctly, I should be able to use OBEX between them. &lt;/div&gt;&lt;div class="page wiki-page"&gt;&lt;div class="page-content"&gt;  &lt;p style="font-style: italic;"&gt;Here is my experiment!&lt;/p&gt;  &lt;p style="text-align: justify;"&gt;I prepared two bluetooth devices, one is my ubuntu laptop and the other one is Android Dev Phone. I installed bluez version 4.32 in Ubuntu and bluez version 3.36 in Android. OBEX is like the client-server networking. The sending file one is a client and the receiving one is a server. For example, if I want to receive a file via bluetooth in Android Dev phone, I can run an OBEX data server and it would start to listen a channel for any incoming connections. If I want to send a file via bluetooth in Android Dev phone, I can use obex_test or obexftp to push data to another BT device.&lt;/p&gt;&lt;p style="text-align: justify;"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/SjdaEqr2W1I/AAAAAAAADOo/PfpGbux3COM/s1600-h/Screenshot-1.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/SjdaEqr2W1I/AAAAAAAADOo/PfpGbux3COM/s320/Screenshot-1.png" alt="" id="BLOGGER_PHOTO_ID_5347842118749936466" border="0" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/SjdaEADWZJI/AAAAAAAADOg/ShLeTw_tt_I/s1600-h/Screenshot.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/SjdaEADWZJI/AAAAAAAADOg/ShLeTw_tt_I/s320/Screenshot.png" alt="" id="BLOGGER_PHOTO_ID_5347842107305780370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Receiving file in Android Dev phone&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&gt; obexpushd -n -d&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;this command would start an OBEX data server with debug message, not detach from terminal, and the default channel is 9. Be aware of the file permission problem in Android! I run this command in /sdcard folder, and then it can store the incoming files in this folder with write permission.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Sending file from Android Dev phone&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&gt; obex_test -b OTHER_BT_ADDR CHANNEL&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;this command will build the connection betwen Android Dev phone and the other BT device. OTHER_BT_ADDRESS is the other BT device address and CHANNEL is its OBEX channel number.&lt;/p&gt;&lt;p&gt;&lt;span style="font-style: italic;"&gt;Done! Listening to the music!&lt;/span&gt;&lt;br /&gt;&lt;/p&gt; &lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/SjdacRCn-iI/AAAAAAAADO4/WjN2GTqGloA/s1600-h/device.png"&gt;&lt;img style="cursor: pointer; width: 214px; height: 320px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/SjdacRCn-iI/AAAAAAAADO4/WjN2GTqGloA/s320/device.png" alt="" id="BLOGGER_PHOTO_ID_5347842524183001634" border="0" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/SjdacMDJSuI/AAAAAAAADOw/S2il9JfeYrE/s1600-h/device01.png"&gt;&lt;img style="cursor: pointer; width: 214px; height: 320px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/SjdacMDJSuI/AAAAAAAADOw/S2il9JfeYrE/s320/device01.png" alt="" id="BLOGGER_PHOTO_ID_5347842522843007714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;PS. source code is in &lt;a href="http://code.google.com/p/androidobex/source/checkout"&gt;google code&lt;/a&gt; temporally and I will move to &lt;a href="http://gitorious.org/android-obex"&gt;gitorious&lt;/a&gt; site soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-4999681365550896153?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/4999681365550896153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/06/bluetooth-obex-file-sharing-in-android.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/4999681365550896153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/4999681365550896153'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/06/bluetooth-obex-file-sharing-in-android.html' title='Bluetooth OBEX file sharing in Android'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_fB3UGiuVTOI/SjdaEqr2W1I/AAAAAAAADOo/PfpGbux3COM/s72-c/Screenshot-1.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-2839800961466274289</id><published>2009-06-03T01:49:00.000-07:00</published><updated>2009-06-03T03:02:44.521-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='QR code'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>QR code scanner in Android</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/SiZJnC50EWI/AAAAAAAADOQ/uDZOYU_NO4k/s1600-h/erin_namecard.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 191px; height: 191px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/SiZJnC50EWI/AAAAAAAADOQ/uDZOYU_NO4k/s200/erin_namecard.png" alt="" id="BLOGGER_PHOTO_ID_5343038943064756578" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;We were talking about making our 0xlab business card this afternoon. How can make it be different? use particular title, like code generator, cleaner, terminator, or CEO something? ha, some people want to put finger print to provide their public key. I also want to put something interesting, then I think of '&lt;a href="http://en.wikipedia.org/wiki/QR_Code"&gt;QR code&lt;/a&gt;'.&lt;br /&gt;&lt;br /&gt;I downloaded a '&lt;a href="http://code.google.com/p/zxing/"&gt;QR code scanner&lt;/a&gt;'(reader) from Android Market and made a QR code image from this '&lt;a href="http://www.qrdoor.com.tw/prt.aspx"&gt;QR door website&lt;/a&gt;' (QR code generator). We can make few kinds of QR code image. Like contact information, URL, email address, RSS feed, Geo location, plain text, phone number....etc.&lt;br /&gt;&lt;br /&gt;How we apply for these QR code type?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Contact informatio&lt;/span&gt;n: it would be a name card. When we scan it by a cell phone, we can store it to Address book directly.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/SiZGRdxGXmI/AAAAAAAADMw/nqqnoN16eY4/s1600-h/device03.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/SiZGRdxGXmI/AAAAAAAADMw/nqqnoN16eY4/s200/device03.png" alt="" id="BLOGGER_PHOTO_ID_5343035273783959138" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/SiZGRiPQbtI/AAAAAAAADM4/kEt9kWehVOE/s1600-h/device02.png"&gt; &lt;img style="cursor: pointer; width: 200px; height: 134px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/SiZGRiPQbtI/AAAAAAAADM4/kEt9kWehVOE/s200/device02.png" alt="" id="BLOGGER_PHOTO_ID_5343035274984189650" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/SiZGRwYME0I/AAAAAAAADNA/b36peD1XIVs/s1600-h/device10.png"&gt; &lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/SiZGRwYME0I/AAAAAAAADNA/b36peD1XIVs/s200/device10.png" alt="" id="BLOGGER_PHOTO_ID_5343035278779749186" border="0" /&gt; &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;URL:&lt;/span&gt; when we scan it, we can open the link from web browser.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/SiZG2p8l0wI/AAAAAAAADNQ/vybXK0mTITk/s1600-h/device04.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/SiZG2p8l0wI/AAAAAAAADNQ/vybXK0mTITk/s200/device04.png" alt="" id="BLOGGER_PHOTO_ID_5343035912708543234" border="0" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/SiZG2LamPMI/AAAAAAAADNI/lps_QlzftFQ/s1600-h/device05.png"&gt;&lt;img style="cursor: pointer; width: 200px; height: 134px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/SiZG2LamPMI/AAAAAAAADNI/lps_QlzftFQ/s200/device05.png" alt="" id="BLOGGER_PHOTO_ID_5343035904512900290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Geo location&lt;/span&gt;: we can provide Geo information for restaurants or sightseeing places. When we scan it, it can be added in the map. It would be extremely convenient for people cannot remember the address or people are easy to get lost.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/SiZHf_qso5I/AAAAAAAADNo/pyn6VwAiaLc/s1600-h/device06.png"&gt;&lt;img style="cursor: pointer; width: 200px; height: 134px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/SiZHf_qso5I/AAAAAAAADNo/pyn6VwAiaLc/s200/device06.png" alt="" id="BLOGGER_PHOTO_ID_5343036622913708946" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/SiZHfvy_zpI/AAAAAAAADNg/vTvbasnBrNo/s1600-h/device08.png"&gt; &lt;img style="cursor: pointer; width: 200px; height: 134px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/SiZHfvy_zpI/AAAAAAAADNg/vTvbasnBrNo/s200/device08.png" alt="" id="BLOGGER_PHOTO_ID_5343036618653552274" border="0" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/SiZHfZ5s_3I/AAAAAAAADNY/6WrnunWI9Zk/s1600-h/device09.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/SiZHfZ5s_3I/AAAAAAAADNY/6WrnunWI9Zk/s200/device09.png" alt="" id="BLOGGER_PHOTO_ID_5343036612776099698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Phone number:&lt;/span&gt; when we scan it, we can dial to this number directly.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/SiZJDjvIbhI/AAAAAAAADN4/oxCrfHfbM2I/s1600-h/device11.png"&gt;&lt;img style="cursor: pointer; width: 200px; height: 134px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/SiZJDjvIbhI/AAAAAAAADN4/oxCrfHfbM2I/s200/device11.png" alt="" id="BLOGGER_PHOTO_ID_5343038333403033106" border="0" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/SiZJDd7j3kI/AAAAAAAADNw/ICINDXaCTSY/s1600-h/device12.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/SiZJDd7j3kI/AAAAAAAADNw/ICINDXaCTSY/s200/device12.png" alt="" id="BLOGGER_PHOTO_ID_5343038331844550210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SMS:&lt;/span&gt; when we scan it, we can launch SMS application to send a message.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/SiZJXTcbYAI/AAAAAAAADOI/_Py4WKfI8Co/s1600-h/device13.png"&gt;&lt;img style="cursor: pointer; width: 200px; height: 134px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/SiZJXTcbYAI/AAAAAAAADOI/_Py4WKfI8Co/s200/device13.png" alt="" id="BLOGGER_PHOTO_ID_5343038672626999298" border="0" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/SiZJXUrbOpI/AAAAAAAADOA/lzYR-e-LU2g/s1600-h/device14.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/SiZJXUrbOpI/AAAAAAAADOA/lzYR-e-LU2g/s200/device14.png" alt="" id="BLOGGER_PHOTO_ID_5343038672958339730" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-2839800961466274289?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/2839800961466274289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/06/qr-code-scanner-in-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/2839800961466274289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/2839800961466274289'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/06/qr-code-scanner-in-android.html' title='QR code scanner in Android'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_fB3UGiuVTOI/SiZJnC50EWI/AAAAAAAADOQ/uDZOYU_NO4k/s72-c/erin_namecard.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-767324296301658370</id><published>2009-05-27T03:03:00.000-07:00</published><updated>2009-07-01T01:37:23.788-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>few notes about android bluetooth</title><content type='html'>&lt;span style="font-weight: bold;font-size:78%;" &gt;bluez version3.36 source code in Android git&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;git://android.git.kernel.org/platform/external/bluez.git&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;start bluetooth manually&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;Pull high in BT power&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="highlight"&gt;#echo 1 &gt; /sys/class/rfkill/rfkill0/state&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Load BT firmware to hci stack&lt;/span&gt;&lt;br /&gt;&lt;div class="highlight"&gt;# hciattach -n -s 115200 /dev/ttyHS0 texas 4000000 flow&lt;/div&gt;&lt;br /&gt;Texas module LMP version : 0X3&lt;br /&gt;Texas module LMP sub-version : 0X1126&lt;br /&gt;    internal version freeze: 38&lt;br /&gt;    software version: 2&lt;br /&gt;    chip: brf6300 (4)&lt;br /&gt;Setting speed to 4000000&lt;br /&gt;Texas speed changed to 4000000.&lt;br /&gt;Loading firmware from /etc/firmware/brf6300.bin...&lt;br /&gt;Firmware load successful.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Start HCI device&lt;/span&gt;&lt;br /&gt;&lt;div class="highlight"&gt;# hciconfig hci0 up&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Start HCI daemon&lt;/span&gt;&lt;br /&gt;&lt;div class="highlight"&gt;# hcid -s -n -f /etc/bluez/hcid.conf&lt;/div&gt;&lt;br /&gt;hcid[307]: Bluetooth HCI daemon&lt;br /&gt;hcid[307]: Device hci0 has been activated&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Gettingthe current values from dbus:&lt;/span&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;# dbus-send --system --type=method_call --print-reply --dest=org.bluez /org/bluez/hci0 org.bluez.Adapter.GetMode&lt;br /&gt;# dbus-send --system --type=method_call --print-reply --dest=org.bluez /org/bluez/hci0 org.bluez.Adapter.GetDiscoverableTimeout&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Changing to discoverable mode and setting the timeout to 60 seconds&lt;/span&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;# dbus-send --system --type=method_call --print-reply --dest=org.bluez /org/bluez/hci0 org.bluez.Adapter.SetMode string:discoverable&lt;br /&gt;# dbus-send --system --type=method_call --print-reply --dest=org.bluez /org/bluez/hci0 org.bluez.Adapter.SetDiscoverableTimeout uint32:60&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:78%;" &gt;check bluetooth is On or Off&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;div class="highlight"&gt;# ps | grep hci&lt;/div&gt;&lt;br /&gt;325 1002        744 S   /system/bin/hciattach -n -s 115200 /dev/ttyHS0 texas&lt;br /&gt;326 1002       1608 S   /system/bin/hcid -s -n -f /etc/bluez/hcid.conf&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:78%;" &gt;bluetooth configuration file:&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;/etc/bluez/hcid.conf&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:78%;" &gt;hcid.conf manual&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;http://linux.die.net/man/5/hcid.conf&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:78%;" &gt;check bluetooth device in detail&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;div class="highlight"&gt;# hciconfig -a&lt;/div&gt;&lt;br /&gt;hci0:    Type: UART&lt;br /&gt;BD Address: 00:22:A5:B8:AD:65 ACL MTU: 1021:4 SCO MTU: 180:4&lt;br /&gt;UP RUNNING PSCAN&lt;br /&gt;RX bytes:2271 acl:18 sco:0 events:66 errors:0&lt;br /&gt;TX bytes:1156 acl:16 sco:0 commands:39 errors:0&lt;br /&gt;Features: 0xff 0xff 0x2d 0xfe 0x9b 0xf9 0x00 0x80&lt;br /&gt;Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3&lt;br /&gt;Link policy: RSWITCH HOLD SNIFF PARK&lt;br /&gt;Link mode: SLAVE ACCEPT&lt;br /&gt;Name: 'g1mokoko'&lt;br /&gt;Class: 0x48010c&lt;br /&gt;Service Classes: Capturing, Telephony&lt;br /&gt;Device Class: Computer, Laptop&lt;br /&gt;HCI Ver: 2.0 (0x3) HCI Rev: 0x0 LMP Ver: 2.0 (0x3) LMP Subver: 0x1126&lt;br /&gt;Manufacturer: Texas Instruments Inc. (13)&lt;br /&gt;&lt;br /&gt;&lt;div class="highlight"&gt;# dmesg | grep Blue&lt;/div&gt;&lt;br /&gt;[    5.751220] Bluetooth: HCI UART driver ver 2.2&lt;br /&gt;[    5.751525] Bluetooth: HCI H4 protocol initialized&lt;br /&gt;[    5.751831] Bluetooth: HCILL protocol initialized&lt;br /&gt;[    5.767395] Bluetooth: L2CAP ver 2.11&lt;br /&gt;[    5.767669] Bluetooth: L2CAP socket layer initialized&lt;br /&gt;[    5.768005] Bluetooth: SCO (Voice Link) ver 0.6&lt;br /&gt;[    5.768524] Bluetooth: SCO socket layer initialized&lt;br /&gt;[    5.782531] Bluetooth: RFCOMM socket layer initialized&lt;br /&gt;[    5.782928] Bluetooth: RFCOMM TTY layer initialized&lt;br /&gt;[    5.783599] Bluetooth: RFCOMM ver 1.10&lt;br /&gt;[    5.783905] Bluetooth: BNEP (Ethernet Emulation) ver 1.3&lt;br /&gt;[    5.784210] Bluetooth: HIDP (Human Interface Emulation) ver 1.2&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:78%;" &gt;Scan nearby bluetooth devices&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;div class="highlight"&gt;# hcitool scan &lt;/div&gt;&lt;br /&gt;Scanning ...&lt;br /&gt;00:22:43:C6:5B:B9    daydreamer-0&lt;br /&gt;00:18:C5:42:18:78    Erin-Nokia N73&lt;br /&gt;00:1E:52:6D:E8:E9    erin's keyboard&lt;br /&gt;00:0F:79:08:D4:05    GgBlu&lt;br /&gt;00:07:61:4B:20:3B    Bluetooth Travel Mouse&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:78%;" &gt;Check what service it has:&lt;/span&gt;&lt;span style="font-size:78%;"&gt; &lt;/span&gt;&lt;span style="font-size:78%;"&gt;AVRCP,A2DP,HandsFree, Headset&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;div class="highlight"&gt;# sdptool browse local&lt;/div&gt;&lt;br /&gt;Browsing FF:FF:FF:00:00:00 ...&lt;br /&gt;Service Name: Audio Source&lt;br /&gt;Service RecHandle: 0x10000&lt;br /&gt;Service Class ID List:&lt;br /&gt;"Audio Source" (0x110a)&lt;br /&gt;Protocol Descriptor List:&lt;br /&gt;"L2CAP" (0x0100)&lt;br /&gt;PSM: 25&lt;br /&gt;"AVDTP" (0x0019)&lt;br /&gt;uint16: 0x100&lt;br /&gt;Profile Descriptor List:&lt;br /&gt;"Advanced Audio" (0x110d)&lt;br /&gt;Version: 0x0100&lt;br /&gt;&lt;br /&gt;Service Name: AVRCP TG&lt;br /&gt;Service RecHandle: 0x10001&lt;br /&gt;Service Class ID List:&lt;br /&gt;"AV Remote Target" (0x110c)&lt;br /&gt;Protocol Descriptor List:&lt;br /&gt;"L2CAP" (0x0100)&lt;br /&gt;PSM: 23&lt;br /&gt;"AVCTP" (0x0017)&lt;br /&gt;uint16: 0x100&lt;br /&gt;Profile Descriptor List:&lt;br /&gt;"AV Remote" (0x110e)&lt;br /&gt;Version: 0x0100&lt;br /&gt;&lt;br /&gt;Service Name: Voice Gateway&lt;br /&gt;Service RecHandle: 0x10002&lt;br /&gt;Service Class ID List:&lt;br /&gt;"Headset Audio Gateway" (0x1112)&lt;br /&gt;"Generic Audio" (0x1203)&lt;br /&gt;Protocol Descriptor List:&lt;br /&gt;"L2CAP" (0x0100)&lt;br /&gt;"RFCOMM" (0x0003)&lt;br /&gt;Channel: 11&lt;br /&gt;Profile Descriptor List:&lt;br /&gt;"Headset" (0x1108)&lt;br /&gt;Version: 0x0100&lt;br /&gt;&lt;br /&gt;Service Name: Voice Gateway&lt;br /&gt;Service RecHandle: 0x10003&lt;br /&gt;Service Class ID List:&lt;br /&gt;"Handsfree Audio Gateway" (0x111f)&lt;br /&gt;"Generic Audio" (0x1203)&lt;br /&gt;Protocol Descriptor List:&lt;br /&gt;"L2CAP" (0x0100)&lt;br /&gt;"RFCOMM" (0x0003)&lt;br /&gt;Channel: 10&lt;br /&gt;Profile Descriptor List:&lt;br /&gt;"Handsfree" (0x111e)&lt;br /&gt;Version: 0x0105&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:78%;" &gt;Connect to bluetooth keyboard&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;add these lines to /etc/bluez/hcid.conf&lt;br /&gt;device 00:1E:52:6D:E8:E9 {&lt;br /&gt;name “Bluetooth Keyboard”;&lt;br /&gt;auth enable;&lt;br /&gt;encrypt enable;&lt;br /&gt;}&lt;br /&gt;&lt;div class="highlight"&gt;# hidd --connect 00:1E:52:6D:E8:E9&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:78%;" &gt;Connect to bluetooth mice&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;add these lines to /etc/bluez/hcid.conf&lt;br /&gt;device 00:07:61:4B:20:3B {&lt;br /&gt;name “Bluetooth Mouse”;&lt;br /&gt;}&lt;br /&gt;&lt;div class="highlight"&gt;# hidd --connect 00:07:61:4B:20:3B&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:78%;" &gt;Confirm the connections&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;div class="highlight"&gt; hidd --show&lt;/div&gt;&lt;br /&gt;00:1E:52:6D:E8:E9 Bluetooth HID Boot Protocol Device [0000:0000] connected [boot-protocol]&lt;br /&gt;00:07:61:4B:20:3B Bluetooth HID Boot Protocol Device [0000:0000] connected [boot-protocol]&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-767324296301658370?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/767324296301658370/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/05/few-notes-for-android-bluetooth.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/767324296301658370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/767324296301658370'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/05/few-notes-for-android-bluetooth.html' title='few notes about android bluetooth'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-1845538819670145950</id><published>2009-05-26T20:47:00.000-07:00</published><updated>2009-05-26T23:07:12.120-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>YouTube on Android</title><content type='html'>From Android supported media formats, we know they only support 3gp and mp4 formats now. There is a particular YouTube application on Android, so I needn't open Android Browser to watch YouTube video. Why I can watch YouTube video without any problem? The reason is from &lt;a href="http://code.google.com/apis/youtube/2.0/reference.html"&gt;gdata youtube API&lt;/a&gt;. When we make a search in YouTube, they can only display mp4 videos files for searching result. I can tell it from android's logs. Below texts are from ddms logcat:&lt;br /&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;05-27 11:24:06.604: DEBUG/youtube(1603): VideoQuery.run url: /feeds/api/videos?vq=blackandwhite+ep12&amp;amp;format=2&amp;amp;restriction=tw this: com.google.android.youtube.YouTubeActivity$SearchVideoQuery@4364bb78&lt;br /&gt;&lt;br /&gt;05-27 11:24:06.604: DEBUG/youtube(1603): YouTubeQueryWorker url:http://gdata.youtube.com/feeds/api/videos?vq=blackandwhite+ep12&amp;amp;format=2&amp;amp;restriction=tw&amp;amp;start-index=1&amp;amp;max-results=9 mStartingIndex: 0&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;We can find it made a search from below URL and it has some paramaters. The detailed reference guide is &lt;a href="http://code.google.com/apis/youtube/2.0/reference.html#formatsp"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;&lt;a href="http://gdata.youtube.com/feeds/api/videos?vq=blackandwhite+ep12&amp;amp;format=2&amp;amp;restriction=tw&amp;amp;start-index=1&amp;amp;max-results=9"&gt;http://gdata.youtube.com/feeds/api/videos?vq=blackandwhite+ep12&amp;amp;format=2&amp;amp;restriction=tw&amp;amp;start-index=1&amp;amp;max-results=9&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;q&lt;/span&gt;: The q parameter specifies a search query term&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;format&lt;/span&gt;: The format parameter specifies that videos must be available in a particular video format.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;restriction&lt;/span&gt;: The restriction parameter identifies the IP address that should be used to filter videos that can only be played in specific countries.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;start-index&lt;/span&gt;: The start-index parameter specifies the index of the first matching result that should be included in the result set.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;max-results&lt;/span&gt;: The max-results parameter specifies the maximum number of results that should be included in the result set.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Let's verify it in Android Dev Phone!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. search video from YouTube application: (play successfully!)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/ShzTeOageLI/AAAAAAAADLQ/rCef5TCoWtM/s1600-h/device.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/ShzTeOageLI/AAAAAAAADLQ/rCef5TCoWtM/s200/device.png" alt="" id="BLOGGER_PHOTO_ID_5340375774373378226" border="0" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/ShzTeaHunpI/AAAAAAAADLY/Mcj72WX862k/s1600-h/device8.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/ShzTeaHunpI/AAAAAAAADLY/Mcj72WX862k/s200/device8.png" alt="" id="BLOGGER_PHOTO_ID_5340375777515839122" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/ShzTen_8YfI/AAAAAAAADLg/VCA8wM3UzFM/s1600-h/device10.png"&gt; &lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/ShzTen_8YfI/AAAAAAAADLg/VCA8wM3UzFM/s200/device10.png" alt="" id="BLOGGER_PHOTO_ID_5340375781241283058" border="0" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/ShzTe7TZcfI/AAAAAAAADLo/bOEp4wrEG-c/s1600-h/device11.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/ShzTe7TZcfI/AAAAAAAADLo/bOEp4wrEG-c/s200/device11.png" alt="" id="BLOGGER_PHOTO_ID_5340375786423153138" border="0" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/ShzTtT2qCoI/AAAAAAAADLw/QuVSKd7kqVU/s1600-h/device6.png"&gt;&lt;img style="cursor: pointer; width: 200px; height: 134px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/ShzTtT2qCoI/AAAAAAAADLw/QuVSKd7kqVU/s200/device6.png" alt="" id="BLOGGER_PHOTO_ID_5340376033531660930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. search video from Android Browser application: (cannot play!)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/ShzU-OBlUII/AAAAAAAADMQ/xok0EUSiYw4/s1600-h/device12.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/ShzU-OBlUII/AAAAAAAADMQ/xok0EUSiYw4/s200/device12.png" alt="" id="BLOGGER_PHOTO_ID_5340377423536279682" border="0" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/ShzU96s6B_I/AAAAAAAADMI/HyUJSULncyY/s1600-h/device7.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/ShzU96s6B_I/AAAAAAAADMI/HyUJSULncyY/s200/device7.png" alt="" id="BLOGGER_PHOTO_ID_5340377418349283314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/ShzU9ptt4AI/AAAAAAAADMA/1Ggzry7odh4/s1600-h/device3.png"&gt;&lt;img style="cursor: pointer; width: 200px; height: 134px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/ShzU9ptt4AI/AAAAAAAADMA/1Ggzry7odh4/s200/device3.png" alt="" id="BLOGGER_PHOTO_ID_5340377413789278210" border="0" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/ShzU9a3CSmI/AAAAAAAADL4/BRugtRen1t4/s1600-h/device5.png"&gt;&lt;img style="cursor: pointer; width: 200px; height: 134px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/ShzU9a3CSmI/AAAAAAAADL4/BRugtRen1t4/s200/device5.png" alt="" id="BLOGGER_PHOTO_ID_5340377409801833058" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;PS. there is another interesting trick! Based on youtube API, the valid formats are 1, 5, 6. If I click &lt;a href="http://gdata.youtube.com/feeds/api/videos?vq=blackandwhite+ep12&amp;amp;format=2&amp;amp;restriction=tw&amp;amp;start-index=1&amp;amp;max-results=9"&gt;that link&lt;/a&gt; from my laptop Firefox browser, I will see nothing. Unless, I change the format to &lt;a href="http://gdata.youtube.com/feeds/api/videos?vq=blackandwhite+ep12&amp;amp;format=1&amp;amp;restriction=tw&amp;amp;start-index=1&amp;amp;max-results=9"&gt;1&lt;/a&gt;, &lt;a href="http://gdata.youtube.com/feeds/api/videos?vq=blackandwhite+ep12&amp;amp;format=5&amp;amp;restriction=tw&amp;amp;start-index=1&amp;amp;max-results=9"&gt;5&lt;/a&gt;, or &lt;a href="http://gdata.youtube.com/feeds/api/videos?vq=blackandwhite+ep12&amp;amp;format=6&amp;amp;restriction=tw&amp;amp;start-index=1&amp;amp;max-results=9"&gt;6&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-1845538819670145950?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/1845538819670145950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/05/youtube-on-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/1845538819670145950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/1845538819670145950'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/05/youtube-on-android.html' title='YouTube on Android'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_fB3UGiuVTOI/ShzTeOageLI/AAAAAAAADLQ/rCef5TCoWtM/s72-c/device.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-7016234260890637198</id><published>2009-05-22T01:59:00.000-07:00</published><updated>2009-05-22T03:00:25.347-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>playing with Android Dev Phone</title><content type='html'>&lt;span style=";font-family:verdana;font-size:85%;"  &gt;Finally I got an Android Dev phone this week and start to have fun with it. The first thing is I do is to flash it with the newest android 1.5 system images. :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;* Flash the radio and system images&lt;/span&gt;&lt;br /&gt;Official images from &lt;a href="http://www.htc.com/www/support/android/adp.html"&gt;HTC&lt;/a&gt;: just follow their introduction, step by step, then all done. Or, build yourself! Yup, we can build the image from android source code too. Here is a &lt;a href="http://source.android.com/documentation/building-for-dream"&gt;document&lt;/a&gt; from android site. It show&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;s how to build the Android source and deploy it to Dev Phone. If you follow it, you will meet few problems. I solved it by this blog &lt;a href="http://www.koushikdutta.com/2008/12/building-android-source-and-deploying.html"&gt;article&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;* Busybox&lt;/span&gt;&lt;br /&gt;We all know the toolbox in Android environment is too limited. Therefore, I download a &lt;a href="http://benno.id.au/blog/2007/11/14/android-busybox"&gt;busybox for Android&lt;/a&gt; from this site. Then, I can use a lot of BASIC commands in adb shell now.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;* Bluetooth&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;Android is based on Bluez 3.36 version, but I found it doesn't have some useful bluez utils in off&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;icial image. Therefore, I make bluez library and utility myself. Android provides their &lt;a href="http://source.android.com/projects/bluetooth-faq"&gt;Bluetooth introduction&lt;/a&gt;  and a good &lt;a style="font-weight: bold;" href="http://source.android.com/projects/bluetooth-faq/android_bluetooth_architecture_10.jpg"&gt;Bluetooth diagram&lt;/a&gt; here. I added  "BOARD_HAVE_BLUETOOTH := true" one line in BoardConfig.mk file and typed 'mm' in 'mydroid/external/bluez/' folder. Then it would build bluez related library and utilities. I use 'adb push' to Dev Phone. If you find the &lt;span style="font-weight: bold;"&gt;permission problem&lt;/span&gt;, you can use 'mount -o remount,rw -t yaffs2 /dev/block/mtdblock3&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt; /system', it can make 'system' partition be writable. Or you should use 'chmod' to modify system folder permission.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/ShZ01_Eb09I/AAAAAAAADKI/wAxDSHYrFv0/s1600-h/device01.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/ShZ01_Eb09I/AAAAAAAADKI/wAxDSHYrFv0/s200/device01.png" alt="" id="BLOGGER_PHOTO_ID_5338582879106225106" border="0" /&gt;  &lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/ShZ02Pc6QxI/AAAAAAAADKQ/PAAOS0cH9hw/s1600-h/device02.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/ShZ02Pc6QxI/AAAAAAAADKQ/PAAOS0cH9hw/s200/device02.png" alt="" id="BLOGGER_PHOTO_ID_5338582883503850258" border="0" /&gt;  &lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/ShZ02DO3afI/AAAAAAAADKY/2sPMZHj8bZg/s1600-h/device03.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/ShZ02DO3afI/AAAAAAAADKY/2sPMZHj8bZg/s200/device03.png" alt="" id="BLOGGER_PHOTO_ID_5338582880223717874" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/ShZ02Vr6YGI/AAAAAAAADKg/DYn0SKC2DyA/s1600-h/device04.png"&gt;  &lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/ShZ02Vr6YGI/AAAAAAAADKg/DYn0SKC2DyA/s200/device04.png" alt="" id="BLOGGER_PHOTO_ID_5338582885177385058" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;* Connect to Bluetooth stereo headphone&lt;/span&gt;&lt;br /&gt;1. make this BT device be discoverable (check its manu&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;al)&lt;br /&gt;2. on Dev phone, Wireless controls, turn Bluetooth 'On'&lt;br /&gt;3. on Dev phone, Bluetooth settings, choose 'Scan for devices'&lt;br /&gt;4. see a headset icon 'GgBlu' and click to Pair with it&lt;br /&gt;5. Done! it shows 'Connected to phone and media audio'&lt;br /&gt;6. Play music and make an incoming call&lt;br /&gt;7. it can stop the music and display incoming call screen&lt;br /&gt;8. after finished the phone call, it can continue to play music successfully&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/ShZ02dk5P5I/AAAAAAAADKo/-6j-l7Hng3Q/s1600-h/device06.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/ShZ02dk5P5I/AAAAAAAADKo/-6j-l7Hng3Q/s200/device06.png" alt="" id="BLOGGER_PHOTO_ID_5338582887295434642" border="0" /&gt;&lt;/a&gt;   &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/ShZ19_qzveI/AAAAAAAADKw/rzQ3ur_bEQQ/s1600-h/device07.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/ShZ19_qzveI/AAAAAAAADKw/rzQ3ur_bEQQ/s200/device07.png" alt="" id="BLOGGER_PHOTO_ID_5338584116217757154" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/ShZ1-F8BOWI/AAAAAAAADK4/YSdQhxh3tMs/s1600-h/device08.png"&gt;  &lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/ShZ1-F8BOWI/AAAAAAAADK4/YSdQhxh3tMs/s200/device08.png" alt="" id="BLOGGER_PHOTO_ID_5338584117900556642" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;* Connect to the bluetooth mice and keyboard&lt;/span&gt;&lt;br /&gt;Just follow this &lt;a href="http://groups.google.com/group/android-platform/browse_thread/thread/73eed70fb229d7ae?pli=1"&gt;discussion&lt;/a&gt; and you can connect with BT mice and keyboard! Ha, I can write long email and blog article via my apple BT keyboard now.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/ShZ3AotSEoI/AAAAAAAADLA/YV3ghng4z8g/s1600-h/device09.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/ShZ3AotSEoI/AAAAAAAADLA/YV3ghng4z8g/s200/device09.png" alt="" id="BLOGGER_PHOTO_ID_5338585261105353346" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/ShZ3A5fOphI/AAAAAAAADLI/RkbPZLMPf_4/s1600-h/device10.png"&gt;  &lt;img style="cursor: pointer; width: 200px; height: 134px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/ShZ3A5fOphI/AAAAAAAADLI/RkbPZLMPf_4/s200/device10.png" alt="" id="BLOGGER_PHOTO_ID_5338585265609811474" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-7016234260890637198?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/7016234260890637198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/05/playing-with-android-dev-phone.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/7016234260890637198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/7016234260890637198'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/05/playing-with-android-dev-phone.html' title='playing with Android Dev Phone'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_fB3UGiuVTOI/ShZ01_Eb09I/AAAAAAAADKI/wAxDSHYrFv0/s72-c/device01.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-8568631039722286482</id><published>2009-05-05T03:43:00.000-07:00</published><updated>2009-05-05T20:46:55.968-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><title type='text'>Hello 0xLab android application</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/SgAibFqNWhI/AAAAAAAADI4/beKP4NWZEWk/s1600-h/screenshot1.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 170px; height: 320px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/SgAibFqNWhI/AAAAAAAADI4/beKP4NWZEWk/s320/screenshot1.png" alt="" id="BLOGGER_PHOTO_ID_5332299807577692690" border="0" /&gt;&lt;/a&gt;I created an android application &lt;a href="http://code.google.com/p/hello0x1ab/"&gt;'Hello 0xLab'&lt;/a&gt; to display all 0xLab team member information. It looks like a business card, but it is an android apk file. User can &lt;a href="http://hello0x1ab.googlecode.com/files/Hello0x1ab.apk"&gt;download it&lt;/a&gt; and install it to Android cell phone. It collects 8 people photo images, phone number, email address and blog web URL.&lt;br /&gt;&lt;br /&gt;For me, it's my first android application. I hope it could be fun and also be meaningful for 0xLab. I read &lt;a href="http://www.pragprog.com/titles/eband/hello-android"&gt;HelloAndroid&lt;/a&gt; book source code and Android development guides. I choose two topics 'WebView' and 'Intent' to practice.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;WebView&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Android Web Browser is based on Webkit engine, like &lt;a href="http://i-miss-erin.blogspot.com/2009/03/webkit-based-web-browser-part-ii.html"&gt;Qt4 Web Browser&lt;/a&gt;. There is a &lt;a href="http://developer.android.com/reference/android/webkit/WebView.html"&gt;WebView&lt;/a&gt; widget in Android API and we can use it as a Web Browser. Therefore, I put a half screen page as a Web browser container. The WebView can load the content from local files stored in 'assets' folder and also can load any web page from the Web. You can write Java script in your html file and interact it with your application too. I modified my application based on a sample code from an Android blog article &lt;a href="http://android-developers.blogspot.com/2008/09/using-webviews.html"&gt;'WebViewDemo'&lt;/a&gt;. In each person name card, you can see a 0xLab logo in upper part. If you click it, it would change to this person's photo.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/SgEEjovFg7I/AAAAAAAADJA/cE2M8Gs3G_M/s1600-h/screenshot2.png"&gt;&lt;img style="cursor: pointer; width: 107px; height: 200px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/SgEEjovFg7I/AAAAAAAADJA/cE2M8Gs3G_M/s200/screenshot2.png" alt="" id="BLOGGER_PHOTO_ID_5332548444060222386" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/SgEEyRyWuNI/AAAAAAAADJI/eKiaO8Sele8/s1600-h/screenshot4.png"&gt;&lt;img style="cursor: pointer; width: 106px; height: 200px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/SgEEyRyWuNI/AAAAAAAADJI/eKiaO8Sele8/s200/screenshot4.png" alt="" id="BLOGGER_PHOTO_ID_5332548695597955282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Intent&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;From Android Dev guide, three of the core components of an application — activities, services, and  broadcast receivers — are activated through messages, called &lt;a href="http://developer.android.com/reference/android/content/Intent.html"&gt;&lt;i&gt;intents&lt;/i&gt;&lt;/a&gt;. I can use it to trigger Android applications plus information data I add. Therefore, I put three image buttons to interact with other Android phone applications. Click the first one can launch Android Dialer with member's phone number. Click the second one can launch Android Email composer with member's email address. If you click the last one, the WebView would reload to member's blog website.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/SgEHNYEDGBI/AAAAAAAADJQ/fstsuFI9s78/s1600-h/screenshot7.png"&gt;&lt;img style="cursor: pointer; width: 108px; height: 200px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/SgEHNYEDGBI/AAAAAAAADJQ/fstsuFI9s78/s200/screenshot7.png" alt="" id="BLOGGER_PHOTO_ID_5332551360162502674" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/SgEHNoseG4I/AAAAAAAADJY/178VBpudzTw/s1600-h/screenshot5.png"&gt;&lt;img style="cursor: pointer; width: 106px; height: 200px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/SgEHNoseG4I/AAAAAAAADJY/178VBpudzTw/s200/screenshot5.png" alt="" id="BLOGGER_PHOTO_ID_5332551364627012482" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/SgEHNvYtqUI/AAAAAAAADJg/t33crXrTGHA/s1600-h/lunapic-124151661638346%283%29.png"&gt;&lt;img style="cursor: pointer; width: 107px; height: 200px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/SgEHNvYtqUI/AAAAAAAADJg/t33crXrTGHA/s200/lunapic-124151661638346%283%29.png" alt="" id="BLOGGER_PHOTO_ID_5332551366423193922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Are you curious what 0xLab team member look like? Would you like to contact 0xLab directly? &lt;a href="http://hello0x1ab.googlecode.com/files/Hello0x1ab.apk"&gt;Download it and install&lt;/a&gt; it to your Android phone! If you are interested how it works, you could &lt;a href="http://hello0x1ab.googlecode.com/files/Hello0x1ab.tar.gz"&gt;download all source code&lt;/a&gt;. I created a project &lt;a href="http://code.google.com/p/hello0x1ab/"&gt;'hello0x1ab&lt;/a&gt;' in google code site too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-8568631039722286482?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/8568631039722286482/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/05/hello-0xlab-android-application.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/8568631039722286482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/8568631039722286482'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/05/hello-0xlab-android-application.html' title='Hello 0xLab android application'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_fB3UGiuVTOI/SgAibFqNWhI/AAAAAAAADI4/beKP4NWZEWk/s72-c/screenshot1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-3796247311330383904</id><published>2009-05-01T20:33:00.000-07:00</published><updated>2009-05-02T00:03:51.677-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><title type='text'>why we call '0xLab'?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/SfvHYTR-c9I/AAAAAAAADHM/eIoD6C_ZqqM/s1600-h/oxo-tower.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 146px; height: 200px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/SfvHYTR-c9I/AAAAAAAADHM/eIoD6C_ZqqM/s200/oxo-tower.jpg" alt="" id="BLOGGER_PHOTO_ID_5331073804229571538" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;我們這個TEAM的成員  有一段的時間&lt;br /&gt;每週二晚上都會參加&lt;a href="http://tossug.blogspot.com/"&gt;TOSSUG&lt;/a&gt;在MIX的聚會&lt;br /&gt;話說有天晚上  我們正在票選LAB的名稱&lt;br /&gt;但總選不到響亮又要好記的名字&lt;br /&gt;有人愛中國禪風 有人愛KUSO的阿宅&lt;br /&gt;有人對機器人有莫名的愛戀&lt;br /&gt;又因為我們喜歡做open source的專案&lt;br /&gt;因此我們很希望名字能帶有OPEN的感覺&lt;br /&gt;&lt;br /&gt;我開著stardict查單字 想著要有服務社群的概念&lt;br /&gt;從cross十字架開始關聯 想到第1個電腦井字遊戲&lt;br /&gt;那不是就是圈叉圈的標記&lt;br /&gt;腦海中回憶起在倫敦時橋上看見的&lt;a href="http://en.wikipedia.org/wiki/Oxo_Tower"&gt;OXO tower&lt;/a&gt;&lt;br /&gt;好吧 那不如取名 OX Lab 吧&lt;br /&gt;一講出口  阿宅們就開始KUSO&lt;br /&gt;OXLab --&gt; 0XLab --&gt; 0xlab --&gt; 0x1ab --&gt; 427&lt;br /&gt;嗯 那就是四月二十七日揭竿起義啦&lt;br /&gt;而我們很可愛的LOGO 是從團員中唯一有美學概念的&lt;a href="http://walkingice.twbbs.org/blog/"&gt;walkingice&lt;/a&gt;&lt;br /&gt;花了他幾個晚上繪畫出來的  外星人 很有我們的FU~&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://0xlab.org"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 142px; height: 161px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/SfvIrMOE-8I/AAAAAAAADHc/sOSCy8zF0QE/s200/alien.png" alt="" id="BLOGGER_PHOTO_ID_5331075228263316418" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-3796247311330383904?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/3796247311330383904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/05/0xlab.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/3796247311330383904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/3796247311330383904'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/05/0xlab.html' title='why we call &apos;0xLab&apos;?'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_fB3UGiuVTOI/SfvHYTR-c9I/AAAAAAAADHM/eIoD6C_ZqqM/s72-c/oxo-tower.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-8938804055453184274</id><published>2009-04-26T08:12:00.000-07:00</published><updated>2009-04-26T08:59:28.907-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><title type='text'>0xlab grand opening!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.0xlab.org/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 140px; height: 140px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/SfSEkfJMoXI/AAAAAAAADFQ/U-BY1DWXLzU/s320/lunapic-12402624955518%285%29.gif" alt="" id="BLOGGER_PHOTO_ID_5329030021456372082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;yup! &lt;a href="http://www.0xlab.org/"&gt;0xlab&lt;/a&gt; is opening now!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-8938804055453184274?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.0xlab.org/' title='0xlab grand opening!'/><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/8938804055453184274/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/04/0xlab-grand-opening.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/8938804055453184274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/8938804055453184274'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/04/0xlab-grand-opening.html' title='0xlab grand opening!'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_fB3UGiuVTOI/SfSEkfJMoXI/AAAAAAAADFQ/U-BY1DWXLzU/s72-c/lunapic-12402624955518%285%29.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-5573852717820941988</id><published>2009-04-23T20:18:00.000-07:00</published><updated>2009-05-08T00:32:29.036-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><title type='text'>watch youtube in android</title><content type='html'>From &lt;a href="http://developer.android.com/guide/appendix/media-formats.html"&gt;Android supported media page&lt;/a&gt;, we can see they don't support FLV files. It means we cannot watch youtube videos in Android SDK 1.5 version. Therefore, here is a easy way and it allows you to download MP4 video file from youtube website. These are steps you need to do in Android.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;1. open browser to youtube web site and search the video you want&lt;br /&gt;&lt;br /&gt;2. before you click the video to play, press menu and select 'Go'&lt;br /&gt;&lt;br /&gt;3. modify the current URL and insert 'pwn' to 'youtube'&lt;br /&gt;eg. http://m.youtube.com/watch?v=f7-neZSZjM8 ==&gt; http://m.pwnyoutube.com/watch?v=f7-neZSZjM8&lt;br /&gt;&lt;br /&gt;4. it would transfer to 'pwnyoutube' website&lt;br /&gt;&lt;br /&gt;5. click to 'Download High Quality Video (MP4)'&lt;br /&gt;&lt;br /&gt;6. this file is mp4 video format and android allows to play this format&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;object height="360" width="580"&gt;&lt;param name="movie" value="http://www.youtube.com/v/RKbZaVNc-ks&amp;amp;hl=zh_TW&amp;amp;fs=1&amp;amp;color1=0x3a3a3a&amp;amp;color2=0x999999&amp;amp;border=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/RKbZaVNc-ks&amp;amp;hl=zh_TW&amp;amp;fs=1&amp;amp;color1=0x3a3a3a&amp;amp;color2=0x999999&amp;amp;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="360" width="580"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Another way to see youtube in Android, here is a hint from &lt;a href="http://olvaffe.blogspot.com/2009/04/android-binder.html"&gt;olv's blog&lt;/a&gt;. Since he can run a cairo program via frame buffer, i believe we can run a mplayer program via frame buffer too. Therefore, we should be able to run any video formats that mplayer can support. Here is a video '&lt;a href="http://www.youtube.com/watch?v=1PwdmHPQf6k"&gt;mplayer on Android&lt;/a&gt;' in YouTube.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-5573852717820941988?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/5573852717820941988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/04/watch-youtube-in-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/5573852717820941988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/5573852717820941988'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/04/watch-youtube-in-android.html' title='watch youtube in android'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-7957422179611095627</id><published>2009-04-09T07:40:00.000-07:00</published><updated>2009-04-25T05:41:05.698-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>[android] trace radio interface layer (RIL) by two emulators</title><content type='html'>I study android from this week and my entry point is based on my related GSM network experiences. Yeah! Let's start it from code tracing: how to register to the network, how to receive/dial a phone call, how to send/receive a SMS message...etc...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A. Set up the working environment:&lt;/span&gt; my machine is ubuntu 8.10, kernel is 2.6.27-11-generic.&lt;br /&gt;&lt;br /&gt;1. download &lt;a href="http://developer.android.com/sdk/1.1_r1/index.html"&gt;Android SDK&lt;/a&gt;&lt;br /&gt;unzip the file, and you will see theses two tools ( &lt;a href="http://developer.android.com/guide/developing/tools/emulator.html"&gt;emulator&lt;/a&gt; &amp;amp;&lt;a href="http://developer.android.com/guide/developing/tools/adb.html"&gt; adb&lt;/a&gt;) we need.&lt;br /&gt;&lt;br /&gt;2. download &lt;a href="http://source.android.com/download"&gt;Android source code &lt;/a&gt;&lt;br /&gt;just follow the steps, and type 'make', then i get it all done. (yes, i'm a lucky person!)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;B. Let's have fun with &lt;a href="http://developer.android.com/guide/developing/tools/emulator.html#multipleinstances"&gt;multiple emulator&lt;/a&gt;:&lt;/span&gt;&lt;br /&gt;1. prepare two terminals:&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;terminal A: $emulator -skin HVGA-P -data lib/images/userdata.img -debug modem,radio -scale 0.5&lt;br /&gt;terminal B: $emulator -skin HVGA-L -data lib/images/userdata2.img -debug modem,radio -scale 0.5&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;2. it would come out with two emulators: (I changed one of them to use &lt;a href="http://www.anddev.org/emulator_iphone_skin_-_qvga-hvga_landscape-portrait-t109.html"&gt;iPhone skin&lt;/a&gt;!)&lt;br /&gt;&lt;br /&gt;3. When both of them camp to the 'Android' network, use Dialer in emulator-5554 and dial '5556', then it would display an incoming call in emulator-5556. (5554 and 5556 are their port number)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fB3UGiuVTOI/Sd4QNsbb9rI/AAAAAAAADDY/vNFcAxU20qE/s1600-h/Screenshot.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_fB3UGiuVTOI/Sd4QNsbb9rI/AAAAAAAADDY/vNFcAxU20qE/s320/Screenshot.png" alt="" id="BLOGGER_PHOTO_ID_5322709637049087666" border="0" /&gt;&lt;/a&gt;   &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/Sd4QNvjqJxI/AAAAAAAADDQ/6R1BSMnHg14/s1600-h/Screenshot-1.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/Sd4QNvjqJxI/AAAAAAAADDQ/6R1BSMnHg14/s320/Screenshot-1.png" alt="" id="BLOGGER_PHOTO_ID_5322709637888878354" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4. Answer the incoming call in emulator-5556 and then hang up in emulator-5554. (You will receive different events if you hang up in emulator-5556.)&lt;br /&gt;&lt;br /&gt;5. DONE! Let's get the log date from both of them.&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;$adb -s emulator-5554 logcat -b radio -d &gt; radio.5554&lt;br /&gt;$adb -s emulator-5556 logcat -b radio -d &gt; radio.5556&lt;br /&gt;$adb -s emulator-5554 logcat *:D -d &gt; debugall.5554&lt;br /&gt;$adb -s emulator-5556 logcat *:D -d &gt; debugall.5556&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;C. Check the RIL process by these photos&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/Sd4RnUU_PSI/AAAAAAAADDg/okj_ZkmEEA4/s1600-h/ril_process1.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 120px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/Sd4RnUU_PSI/AAAAAAAADDg/okj_ZkmEEA4/s320/ril_process1.png" alt="" id="BLOGGER_PHOTO_ID_5322711176767814946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/Sd4RnRZ-FII/AAAAAAAADDo/ZAjSRWf3hc4/s1600-h/telephony.gif"&gt;&lt;img style="cursor: pointer; width: 320px; height: 297px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/Sd4RnRZ-FII/AAAAAAAADDo/ZAjSRWf3hc4/s320/telephony.gif" alt="" id="BLOGGER_PHOTO_ID_5322711175983404162" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;D. How to dial out a call in Android? I traced the radio log and make sure the whole procedure and the source code.&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;DIAL out a phone call: (MO call)&lt;br /&gt;&lt;br /&gt;from top UI to bottom,&lt;br /&gt;[App] Phone Application ---&gt; [App Framework] Telephony Manager (GSM)  ---&gt;&lt;br /&gt;[App Framework] Telephony Manager (RIL) ---&gt; [Libraries]  Telephony Manager&lt;br /&gt;---&gt; [Libraries] rild    ---&gt; [Libraries] libril.so ---&gt; [Kernel Driver] Baseband&lt;br /&gt;&lt;br /&gt;RIL:  /hardware/ril/reference-ril/refereince-ril.c&lt;br /&gt;AT:   /hardware/ril/reference-ril/atchannel.c&lt;br /&gt;RILD: /hardware/ril/rild/rild.c&lt;br /&gt;RILC: /hardware/ril/libril/ril.cpp&lt;br /&gt;RILJ: /frameworks/base/telephony/java/com/android/internal/telephony/gsm/RIL.java&lt;br /&gt;GSM:  /frameworks/base/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java&lt;br /&gt;&lt;br /&gt;D/RILJ    (   85): [0053]&gt; DIAL&lt;br /&gt;D/RIL     (   22): onRequest: DIAL&lt;br /&gt;D/AT      (   22): AT&gt; ATD5556;&lt;br /&gt;D/AT      (   22): AT&lt; OK&lt;br /&gt;&lt;br /&gt;D/GSM     (   85): [GSMConn] update: parent=DIALING, hasNewParent=false, wasConnectingInOrOut=true,&lt;br /&gt;wasHolding=false, isConnectingInOrOut=true, changed=false&lt;br /&gt;D/RILJ    (   85): [UNSL]&lt; CALL_STATE_CHANGED&lt;br /&gt;D/AT      (   22): AT&lt; RING&lt;br /&gt;D/RILJ    (   85): [UNSL]&lt; CALL_STATE_CHANGED&lt;br /&gt;D/RILJ    (   85): [0059]&gt; SET_MUTE false&lt;br /&gt;D/RIL     (   22): onRequest: SET_MUTE&lt;br /&gt;D/RILJ    (   85): [0059]&lt; SET_MUTE error: com.android.internal.telephony.gsm.CommandException:&lt;br /&gt;REQUEST_NOT_SUPPORTED&lt;br /&gt;D/RILJ    (   85): [0060]&gt; GET_CURRENT_CALLS&lt;br /&gt;D/RIL     (   22): onRequest: GET_CURRENT_CALLS&lt;br /&gt;D/AT      (   22): AT&gt; AT+CLCC&lt;br /&gt;D/AT      (   22): AT&lt; +CLCC: 1,0,3,0,0,"5556",129&lt;br /&gt;D/AT      (   22): AT&lt; OK&lt;br /&gt;&lt;br /&gt;D/RILJ    (   85): [0124]&lt; GET_CURRENT_CALLS  [id=1,mo,ACTIVE,voice,norm,129,0] &lt;br /&gt;D/GSM     (   85): [GSMConn] update: parent=ACTIVE, hasNewParent=false, wasConnectingInOrOut=&lt;br /&gt;false, wasHolding=false, isConnectingInOrOut=false, changed=false&lt;br /&gt;D/RILJ    (   85): WAKE_LOCK_TIMEOUT  mReqPending=0 mRequestList=1&lt;br /&gt;D/RILJ    (   85): 0: [14] SET_NETWORK_SELECTION_AUTOMATIC&lt;br /&gt;D/GSM     (   85): [CallTracker] hangupForegroundResumeBackground&lt;br /&gt;D/RILJ    (   85): [0125]&gt; HANGUP_FOREGROUND_RESUME_BACKGROUND&lt;br /&gt;D/RIL     (   22): onRequest: HANGUP_FOREGROUND_RESUME_BACKGROUND&lt;br /&gt;D/AT      (   22): AT&gt; AT+CHLD=1&lt;br /&gt;D/AT      (   22): AT&lt; OK&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;PS. Above logs are all from emulator-5554! ATD: dial command in modem, AT+CLCC: List current calls, AT+CHLD: Releases all active calls&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-7957422179611095627?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/7957422179611095627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/04/android-trace-radio-interface-layer-ril.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/7957422179611095627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/7957422179611095627'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/04/android-trace-radio-interface-layer-ril.html' title='[android] trace radio interface layer (RIL) by two emulators'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_fB3UGiuVTOI/Sd4QNsbb9rI/AAAAAAAADDY/vNFcAxU20qE/s72-c/Screenshot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-4732669564093276161</id><published>2009-03-29T12:33:00.000-07:00</published><updated>2009-04-03T02:06:27.792-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebKit'/><category scheme='http://www.blogger.com/atom/ns#' term='qt'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>a webkit-based web browser part II</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/Sc_pjwJovGI/AAAAAAAADBQ/Mw4Erjg83tg/s1600-h/collage3.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 250px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/Sc_pjwJovGI/AAAAAAAADBQ/Mw4Erjg83tg/s400/collage3.jpg" alt="" id="BLOGGER_PHOTO_ID_5318726485377858658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;yup! it's my web browser part II! I was thinking about iphone browser features and how to make a browser like it. It's for small devices, not like a normal firefox one. The screen is smaller, without a fully functional keyboard, and probably user only use fingers. I saw a &lt;a href="http://www.apple.com/iphone/features/safari.html#safarifeature"&gt;video&lt;/a&gt; from Apple iphone website and found their nice features. Eg.'zoom-in, zoom-out', 'finger scrolling', 'vertical &amp;amp; horizontal placing', and a easy bookmark menu!&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;A. finger scrolling:&lt;/span&gt;&lt;br /&gt;i found a very cool article in Qt blog and Ariya Hidayat implemented a &lt;a href="http://labs.trolltech.com/blogs/2008/11/15/flick-list-or-kinetic-scrolling/"&gt;Flick Charm&lt;/a&gt; example. Also, Akos Polster updated it to a &lt;a href="http://code.google.com/p/flickcharm-python/"&gt;python version&lt;/a&gt;. They save all my work. Only few lines, then i can see this beauty. User needn't use mouse wheel to scroll pages and can scroll/drag page by mouse gestures. If it's a touch screen, then it would be user fingers. You can check ariya's video in &lt;a href="http://www.youtube.com/watch?v=S7I24PawwMA"&gt;youtube&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt; WebBrowser = QtWebKit.QWebView(Frame3)&lt;br /&gt; charm = FlickCharm()&lt;br /&gt; charm.activateOn(WebBrowser)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;B. Text zoom-in &amp;amp; zoom-out:&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;I put 3 zooming buttons on the tool bar and also make hot keys. User can zoom-in, zoom-out, zoom to fit-in page by clicking a button.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt; def on_actionZoomIn_triggered(self):&lt;br /&gt;     current = self.WebBrowser.textSizeMultiplier()&lt;br /&gt;     self.WebBrowser.setTextSizeMultiplier(current+0.1)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;C. Full page zooming:&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;There is another zooming function and it can zoom-in the whole web page (including images and fonts). I use a MouseDoubleClick event to set the page view to 0.5 or 1.0. When user read a web page, they can use this function to see a thumbnail image.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt; def mouseDoubleClickEvent(self,mouseEvent):&lt;br /&gt;     if self.zoomFactor() == 1.0:&lt;br /&gt;         self.setZoomFactor(0.5)&lt;br /&gt;     else:&lt;br /&gt;         self.setZoomFactor(1.0)&lt;br /&gt;     QtWebKit.QWebView.mouseDoubleClickEvent(self,mouseEvent)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/SdHayJfJwRI/AAAAAAAADCQ/rW1Pq2dc5Ls/s1600-h/Screenshot-Google+%E5%9C%B0%E5%9C%96-1.png"&gt;&lt;img style="cursor: pointer; width: 200px; height: 157px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/SdHayJfJwRI/AAAAAAAADCQ/rW1Pq2dc5Ls/s320/Screenshot-Google+%E5%9C%B0%E5%9C%96-1.png" alt="" id="BLOGGER_PHOTO_ID_5319273189976162578" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/SdHax2G1RMI/AAAAAAAADCI/vQgDzR4ZTTo/s1600-h/Screenshot-Google+%E5%9C%B0%E5%9C%96.png"&gt;&lt;img style="cursor: pointer; width: 200px; height: 157px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/SdHax2G1RMI/AAAAAAAADCI/vQgDzR4ZTTo/s320/Screenshot-Google+%E5%9C%B0%E5%9C%96.png" alt="" id="BLOGGER_PHOTO_ID_5319273184773883074" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;D. bookmark menu:&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;I made 2 buttons on tool bar. One is to show bookmark list and the other one is to add the current page to a bookmark. User can click one bookmark in list and load it in browser. Also, user can double-click to delete a bookmark. I use python-sqlite to store bookmark data to a db.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;I have to distinguish MousePressEvent and MouseDoubleClickEvent, since they have different meaning in my design. I use a timer, when I get a MousePressEvent.  It would load a bookmark page after 300 millisecond. Also, if we get a double-clicked event, it would stop that timer. Then, I can know it's to delete a bookmark, not to load it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;E. enable plug-in: (Flash player)&lt;/span&gt;&lt;br /&gt;I just found that i cannot see video in YouTube website from Qt version 4.4. Therefore, I have to upgrade it to version 4.5, even PyQt 4.5 is still development snapshots. Qt4.5 new feature: Netscape plug in (NPAPI) support, enabling you to to incorporate Flash™ content in your Qt applications. :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;*download &amp;amp; install Qt4.5&lt;/span&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;wget http://dist.trolltech.com/developer/download/qt-embedded-linux-eval-src-4.5.0.tar.gz&lt;br /&gt;tar zxvf qt-x11-eval-src-4.5.0.tar.gz&lt;br /&gt;cd qt-x11-eval-src-4.5.0/&lt;br /&gt;./configure &amp;amp; make &amp;amp; sudo make install&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;*install sip 4.8 and pyqt4.5 (Development Snapshots!!)&lt;/span&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;wget http://www.riverbankcomputing.co.uk/static/Downloads/sip4/sip-4.8-snapshot-20090327.tar.gz&lt;br /&gt;tar zxvf sip-4.8-snapshot-20090327.tar.gz&lt;br /&gt;cd sip-4.8-snapshot-20090327&lt;br /&gt;python configure.py&lt;br /&gt;make &amp;amp; make install&lt;br /&gt;&lt;br /&gt;wget http://www.riverbankcomputing.co.uk/static/Downloads/PyQt4/PyQt-x11-gpl-4.5-snapshot-20090328.tar.gz&lt;br /&gt;tar zxvf PyQt-x11-gpl-4.5-snapshot-20090328.tar.gz&lt;br /&gt;cd PyQt-x11-gpl-4.5-snapshot-20090328&lt;br /&gt;python configure.py --qmake=/usr/local/Trolltech/Qt-4.5.0/bin/qmake&lt;br /&gt;make &amp;amp; make install&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Put one more line!&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt; web = QtWebKit.QWebView()&lt;br /&gt; web.settings().setAttribute(QtWebKit.QWebSettings.PluginsEnabled,True)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;DONE! I can watch a video from my tiny pyqt browser. The&lt;a href="http://code.google.com/p/pyqt-browser/"&gt; complete source code&lt;/a&gt; are here.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fB3UGiuVTOI/SdDbXArlzqI/AAAAAAAADBw/-Qr5unqcQOk/s1600-h/Screenshot-YouTube+-+PyQT+Webkit+Browser+in+2+minutes-1.png"&gt;&lt;img style="cursor: pointer; width: 200px; height: 157px;" src="http://4.bp.blogspot.com/_fB3UGiuVTOI/SdDbXArlzqI/AAAAAAAADBw/-Qr5unqcQOk/s200/Screenshot-YouTube+-+PyQT+Webkit+Browser+in+2+minutes-1.png" alt="" id="BLOGGER_PHOTO_ID_5318992348290862754" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-4732669564093276161?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/4732669564093276161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/03/webkit-based-web-browser-part-ii.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/4732669564093276161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/4732669564093276161'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/03/webkit-based-web-browser-part-ii.html' title='a webkit-based web browser part II'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_fB3UGiuVTOI/Sc_pjwJovGI/AAAAAAAADBQ/Mw4Erjg83tg/s72-c/collage3.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-7221704337921963692</id><published>2009-03-25T08:18:00.000-07:00</published><updated>2009-03-25T10:25:31.963-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='qt'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>write a web browser by python</title><content type='html'>&lt;div style="text-align: justify;"&gt;Probably half year ago, I wrote a web browser application by python and the source code is just few hundred lines. That example is based on python-qt4 and webkit. If you install related qt4 and python-qt packages, you can see a lot of cool qt examples. Browser is one of them. Since I cannot run the original python one, it needs a window IE activeqt component. Therefore, I modified few lines and then I can run this example in GTA02 and my desktop. I was trying to run this example in EeePC tonight. It took me about 3 minutes work.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;There are two browser examples in qt. One is by cpp and the other one is by python!&lt;br /&gt;&lt;br /&gt;Install qt4:&lt;br /&gt;&lt;div class="highlight"&gt;sudo apt-get install qt4-demos&lt;/div&gt;&lt;br /&gt;Check where is qt4-demos:&lt;br /&gt;&lt;div class="highlight"&gt;dpkg -L qt4-demos&lt;/div&gt;&lt;br /&gt;Run a c++ web browser:&lt;br /&gt;&lt;div class="highlight"&gt;./usr/lib/qt4/demos/browser/browser&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/ScpP8thmNcI/AAAAAAAADAw/pTkwHLHGtG8/s1600-h/Screenshot-Qt+%E2%80%93+A+cross-platform+application+and+UI+framework+-+Qt+Demo+Browser.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 209px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/ScpP8thmNcI/AAAAAAAADAw/pTkwHLHGtG8/s320/Screenshot-Qt+%E2%80%93+A+cross-platform+application+and+UI+framework+-+Qt+Demo+Browser.png" alt="" id="BLOGGER_PHOTO_ID_5317150214495548866" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Install python-qt4 related packages:&lt;br /&gt;&lt;div class="highlight"&gt;sudo apt-get install python-qt4 python-qt4-dev python-qt4-doc&lt;/div&gt;&lt;br /&gt;Check where is python-qt4-doc&lt;br /&gt;&lt;div class="highlight"&gt;dpkg -L python-qt4-doc&lt;/div&gt;&lt;br /&gt;Run a python web browser:&lt;br /&gt;&lt;div class="highlight"&gt;cd /usr/share/doc/python-qt4-doc/examples&lt;br /&gt;find -name '*browser*&lt;br /&gt;python activeqt/webbrowser/webbrowser.py&lt;/div&gt;&lt;br /&gt;ERROR: The Windows commercial version of PyQt is required to run this example.&lt;br /&gt;&lt;br /&gt;Download my pyqt-browser:&lt;br /&gt;&lt;div class="highlight"&gt;wget http://pyqt-browser.googlecode.com/files/webbrowser.tar.gz&lt;br /&gt;tar zxvf webbrowser.tar.gz&lt;br /&gt;python webbrowser/webbrowser.py&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fB3UGiuVTOI/ScpQHGqYWnI/AAAAAAAADA4/i8mHmRAtu34/s1600-h/Screenshot-Qt+WebBrowser.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 249px;" src="http://1.bp.blogspot.com/_fB3UGiuVTOI/ScpQHGqYWnI/AAAAAAAADA4/i8mHmRAtu34/s320/Screenshot-Qt+WebBrowser.png" alt="" id="BLOGGER_PHOTO_ID_5317150393041967730" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;here is browser python code: or &lt;a href="http://code.google.com/p/pyqt-browser/"&gt;download it&lt;/a&gt;!&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;#!/usr/bin/env python&lt;br /&gt;&lt;br /&gt;import sys&lt;br /&gt;from PyQt4 import QtCore, QtGui, QtWebKit&lt;br /&gt;from ui_mainwindow import Ui_MainWindow&lt;br /&gt;&lt;br /&gt;class MainWindow(QtGui.QMainWindow, Ui_MainWindow):&lt;br /&gt;    # Maintain the list of browser windows so that they do not get garbage&lt;br /&gt;    # collected.&lt;br /&gt;    _window_list = []&lt;br /&gt;&lt;br /&gt;    def __init__(self):&lt;br /&gt;        QtGui.QMainWindow.__init__(self)&lt;br /&gt;&lt;br /&gt;        MainWindow._window_list.append(self)&lt;br /&gt;&lt;br /&gt;        self.setupUi(self)&lt;br /&gt;        &lt;br /&gt;        self.lblAddress = QtGui.QLabel("", self.tbAddress)&lt;br /&gt;        self.tbAddress.insertWidget(self.actionGo, self.lblAddress)&lt;br /&gt;        self.addressEdit = QtGui.QLineEdit(self.tbAddress)&lt;br /&gt;        self.tbAddress.insertWidget(self.actionGo, self.addressEdit)&lt;br /&gt;        &lt;br /&gt;        self.addressEdit.setFocusPolicy(QtCore.Qt.StrongFocus)&lt;br /&gt;        &lt;br /&gt;        self.connect(self.addressEdit, QtCore.SIGNAL("returnPressed()"),&lt;br /&gt;                     self.actionGo, QtCore.SLOT("trigger()"))&lt;br /&gt;                     &lt;br /&gt;        self.connect(self.actionBack, QtCore.SIGNAL("triggered()"),&lt;br /&gt;                     self.WebBrowser, QtCore.SLOT("back()"))&lt;br /&gt;        &lt;br /&gt;        self.connect(self.actionForward, QtCore.SIGNAL("triggered()"),&lt;br /&gt;                     self.WebBrowser, QtCore.SLOT("forward()"))&lt;br /&gt;        &lt;br /&gt;        self.connect(self.actionStop, QtCore.SIGNAL("triggered()"),&lt;br /&gt;                     self.WebBrowser, QtCore.SLOT("stop()"))&lt;br /&gt;        &lt;br /&gt;        self.connect(self.actionRefresh, QtCore.SIGNAL("triggered()"),&lt;br /&gt;                     self.WebBrowser, QtCore.SLOT("reload()"))&lt;br /&gt;&lt;br /&gt;        self.pb = QtGui.QProgressBar(self.statusBar())&lt;br /&gt;        self.pb.setTextVisible(False)&lt;br /&gt;        self.pb.hide()&lt;br /&gt;        self.statusBar().addPermanentWidget(self.pb)&lt;br /&gt;        self.WebBrowser.load(QtCore.QUrl("http://www.google.com"))&lt;br /&gt;&lt;br /&gt;        &lt;br /&gt;    @QtCore.pyqtSignature("")&lt;br /&gt;    def on_actionHome_triggered(self):&lt;br /&gt;        self.WebBrowser.load(QtCore.QUrl("http://www.google.com"))&lt;br /&gt;&lt;br /&gt;    def on_WebBrowser_urlChanged(self, url):&lt;br /&gt;        self.addressEdit.setText(url.toString())&lt;br /&gt;        &lt;br /&gt;    def on_WebBrowser_titleChanged(self, title):&lt;br /&gt;        #print 'titleChanged',title.toUtf8()&lt;br /&gt;        self.setWindowTitle(title)&lt;br /&gt;&lt;br /&gt;    def on_WebBrowser_loadStarted(self):&lt;br /&gt;        #print 'loadStarted'&lt;br /&gt;        #self.misc.keyboard_show()&lt;br /&gt;        &lt;br /&gt;        self.pb.show()&lt;br /&gt;        self.pb.setRange(0, 100)&lt;br /&gt;        self.pb.setValue(1)&lt;br /&gt;&lt;br /&gt;    def on_WebBrowser_loadFinished(self, flag):&lt;br /&gt;        #print 'loadFinished'&lt;br /&gt;        if flag is True:&lt;br /&gt;            self.pb.hide()&lt;br /&gt;            self.statusBar().removeWidget(self.pb)&lt;br /&gt;            &lt;br /&gt;    def on_WebBrowser_loadProgress(self, status):&lt;br /&gt;        self.pb.show()&lt;br /&gt;        self.pb.setRange(0, 100)&lt;br /&gt;        self.pb.setValue(status)&lt;br /&gt;&lt;br /&gt;    @QtCore.pyqtSignature("")&lt;br /&gt;    def on_actionGo_triggered(self):&lt;br /&gt;        #print "on_actionGo_triggered"&lt;br /&gt;        &lt;br /&gt;        self.WebBrowser.load(QtCore.QUrl(self.addressEdit.text()))&lt;br /&gt;        self.addressEdit.setText(self.addressEdit.text())&lt;br /&gt;&lt;br /&gt;    @QtCore.pyqtSignature("")&lt;br /&gt;    def on_actionHome_triggered(self):&lt;br /&gt;        #print "on_actionHome_triggered"&lt;br /&gt;        self.WebBrowser.load(QtCore.QUrl("http://www.google.com"))&lt;br /&gt;        self.addressEdit.setText("http://www.google.com")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;    a = QtGui.QApplication(sys.argv)&lt;br /&gt;    w = MainWindow()&lt;br /&gt;&lt;br /&gt;    w.show()&lt;br /&gt;    sys.exit(a.exec_())&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-7221704337921963692?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/7221704337921963692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/03/write-web-browser-by-python.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/7221704337921963692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/7221704337921963692'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/03/write-web-browser-by-python.html' title='write a web browser by python'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_fB3UGiuVTOI/ScpP8thmNcI/AAAAAAAADAw/pTkwHLHGtG8/s72-c/Screenshot-Qt+%E2%80%93+A+cross-platform+application+and+UI+framework+-+Qt+Demo+Browser.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-588833205670874537</id><published>2009-03-20T01:11:00.000-07:00</published><updated>2009-03-20T04:25:17.925-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Taipei App Engine Sprint 2009'/><title type='text'>Taipei App Engine Sprint 2009</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span style="font-family:arial;"&gt;I went to &lt;a href="http://maps.google.com/maps?hl=en&amp;amp;q=Taipei+101&amp;amp;ie=UTF8&amp;amp;ll=25.037608,121.564515&amp;amp;spn=0.008904,0.019827&amp;amp;t=h&amp;amp;z=16&amp;amp;iwloc=A"&gt;Google Taipei office&lt;/a&gt; to join an event 'Taipei App Engine Sprint' with my team mate '&lt;a href="http://olvaffe.blogspot.com/"&gt;olv&lt;/a&gt;' and '&lt;a href="http://linuxocarina.blogspot.com/2009/03/taipei-app-engine-sprint-2009.html"&gt;tick&lt;/a&gt;'. We heard this news from '&lt;a href="http://pingyeh.blogspot.com/"&gt;Ping Yeh&lt;/a&gt;' in &lt;a href="http://wiki.tossug.org/"&gt;Tossug&lt;/a&gt; and got the invitation from him. It's a whole day event and we would like to build a web site by google app-engine in a day. There were about 20 people and we separated to 5 groups. My team name is '&lt;a href="http://zh.wikipedia.org/wiki/%E5%A4%A7%E9%9C%B8%E5%B0%96%E5%B1%B1"&gt;Dabajianshan&lt;/a&gt;' and actually it's a conference room name in their office. They name all conference rooms by famous sightseeing place in Taiwan. Also, we found a new team mate 'Daniel Lin' and he knows web applications much much more than our three Linux engineers.&lt;/span&gt; &lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fB3UGiuVTOI/ScNpZnhnWnI/AAAAAAAADAI/JWAH968VVYY/s1600-h/collage2.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 320px;" src="http://3.bp.blogspot.com/_fB3UGiuVTOI/ScNpZnhnWnI/AAAAAAAADAI/JWAH968VVYY/s320/collage2.jpg" alt="" id="BLOGGER_PHOTO_ID_5315207874054937202" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family:arial;"&gt;We launched a new web site '&lt;a href="http://sighthistory.appspot.com/"&gt;Sight History&lt;/a&gt;'. Using &lt;a href="http://code.google.com/apis/picasaweb/"&gt;Picasa Web Albums&lt;/a&gt;, we can search all their photos by keyword and group those photos by different time lines. Thanks a lot for Google Service APIs, they provide very useful, convenient, comprehensive API services and good readme documents. That is probably the main reason why we can build this site in a day (less than 10 hours). There are only two tricky points. The first one is '&lt;a href="http://code.google.com/apis/picasaweb/developers_guide_python.html#ListCommunityPhotos"&gt;community search&lt;/a&gt;'. With this API, we can search photos uploaded by Picasa users, as long as they are in a public album. This function is quite amazing and it means we can search whole Picasa Web Albums in Internet. BTW, Google has a limitation for their Google Data Service API searching function and we can only retrieve 1000 records. When I make a search in Picasa Web Albums, the total results are over 100,0000 photos most of time. I am so glad even only 1000 images are still quite meaningful for our search.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt; &lt;div style="text-align: justify;"&gt;&lt;span style="font-family:arial;"&gt;The second one is 'grouping photos by a time line'. Like search '&lt;a href="http://sighthistory.appspot.com/search?keyword=cherry+blossom"&gt;Cherry Blossom&lt;/a&gt;', we can get a lot of cherry images, and you would see most of them 'shot time' are in March and April. Why only in these two months? That is because Cherry blossom time is March in Japan, and April in East States. We also display the images in a Google Map and we can see where are these photos from. For users, they are easy to tell 'when' and 'where' to see Cheery Blossom!!!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family:arial;"&gt;Furthermore, we group Picasa web photos not only by 'month', but also by 'day' and 'hour'. Like search '&lt;a href="http://sighthistory.appspot.com/search?keyword=%E9%98%BF%E9%87%8C%E5%B1%B1%E6%97%A5%E5%87%BA&amp;amp;period=hour"&gt;阿里山日出&lt;/a&gt;', it's a very famous mountain in Taiwan and people visit it coz of beautiful sunrise. By our search, we can see what time most people can see sunrise in this place. That is a very interested searching result. I can see the images in 3AM-4AM, most of people start to take the train or start to leave hotels. The most images are in 4AM-6AM, then I can tell people can see pretty sunrise in this time slot.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family:arial;"&gt;In the end of day, our team won the first place in Taipei App Engine Sprint. I got a very cute 'Google App-Engine' t-shirt and a certification from Google.&lt;/span&gt; :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Here is our web site: &lt;a href="http://sighthistory.appspot.com/"&gt;http://sighthistory.appspot.com&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Download the source code: &lt;a href="http://gitorious.org/projects/dabajianshan"&gt;http://gitorious.org/projects/dabajianshan&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;You can clone this repository with the following command:&lt;/span&gt;&lt;br /&gt;  &lt;code&gt;git clone git://gitorious.org/dabajianshan/mainline.git&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;PS. some photos about this event in my &lt;a href="http://picasaweb.google.com.tw/imisserin/2009_google_appengine_sprint#"&gt;picasa web album&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-588833205670874537?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/588833205670874537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/03/taipei-app-engine-sprint-2009.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/588833205670874537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/588833205670874537'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/03/taipei-app-engine-sprint-2009.html' title='Taipei App Engine Sprint 2009'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_fB3UGiuVTOI/ScNpZnhnWnI/AAAAAAAADAI/JWAH968VVYY/s72-c/collage2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-5185488144547807941</id><published>2009-03-01T17:55:00.000-08:00</published><updated>2010-01-13T01:26:10.972-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asterisk'/><title type='text'>asterisk &amp; media wiki configuration notes</title><content type='html'>&lt;span style="font-weight: bold; color: rgb(153, 51, 153);font-size:130%;" &gt;&lt;span style="font-style: italic;"&gt;Asterisk&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A. Installation&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;1. using an iso image '&lt;a href="http://www.asterisknow.org/"&gt;AsteriskNOW&lt;/a&gt;' to install the whole package with linux OS&lt;br /&gt;&lt;a href="http://www.asterisknow.org/"&gt;http://www.asterisknow.org/&lt;/a&gt;&lt;br /&gt;We can find the documents and download the lastest version from their website. After installing AsteriskNOW step by step to a machine, we can configure it by any web browser, only need to remember the URL, ID, and password.&lt;br /&gt;&lt;br /&gt;2. self install on linux machine (like Debian, Ubuntu, Fedora...etc)&lt;br /&gt;we could reference to these documents&lt;br /&gt;&lt;a href="http://www.asteriskguru.com/tutorials/asterisk_gui.html"&gt;http://www.asteriskguru.com/tutorials/asterisk_gui.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.howtoforge.com/asterisk_pbx_linux"&gt;http://www.howtoforge.com/asterisk_pbx_linux&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(1) create a working folder:&lt;br /&gt;# mkdir /usr/src/asterisk&lt;br /&gt;&lt;br /&gt;(2) download all needed packages&lt;br /&gt;from website as below:&lt;br /&gt;&lt;a href="http://downloads.digium.com/pub/"&gt;http://downloads.digium.com/pub/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(3) installing libpri&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;# wget http://downloads.digium.com/pub/libpri/libpri-1.4.2.tar.gz&lt;br /&gt;# tar xzvf libpri-1.4.2.tar.gz&lt;br /&gt;# cd libpri-1.4.2&lt;br /&gt;# make clean&lt;br /&gt;# make&lt;br /&gt;# make install&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;(4) installing zaptel&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;# wget http://downloads.digium.com/pub/zaptel/zaptel-1.4.6.tar.gz&lt;br /&gt;# tar xzvf zaptel-1.4.6.tar.gz&lt;br /&gt;# make clean&lt;br /&gt;# make&lt;br /&gt;# make install&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;PS. if you met the problem like missing Linux kernel header file, you may download your Linux header&lt;br /&gt;&lt;br /&gt;files:&lt;br /&gt;# cat /proc/version&lt;br /&gt;# apt-get install linux-headers-2.6.20-16-386&lt;br /&gt;&lt;br /&gt;(5) installing asterisk&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;# wget http://downloads.digium.com/pub/asterisk/asterisk-1.4-current.tar.gz&lt;br /&gt;# tar xzvf asterisk-1.4-current.tar.gz&lt;br /&gt;# ./configure&lt;br /&gt;# make clean&lt;br /&gt;# make&lt;br /&gt;# make install&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;(6) installing asterisk-addons&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;# wget http://downloads.digium.com/pub/asterisk/asterisk-addons-1.4.4.tar.gz&lt;br /&gt;# tar xzvf asterisk-addons-1.4.4.tar.gz&lt;br /&gt;# ./configure&lt;br /&gt;# make clean&lt;br /&gt;# make&lt;br /&gt;# make install&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;(7) installing asterisk-gui&lt;br /&gt;&lt;div class="highlight"&gt;&lt;br /&gt;# svn checkout http://svn.digium.com/svn/asterisk-gui/trunk&lt;br /&gt;# make clean&lt;br /&gt;# make&lt;br /&gt;# make install&lt;br /&gt;# make checkconfig [it can detect all config file status ]&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;(8) modify 2 confiure files, then we can use astersik gui web interfaces&lt;br /&gt;# vi /etc/asterisk/manager.conf&lt;br /&gt;&lt;br /&gt;a. modifiy these two lines&lt;br /&gt;enabled = yes&lt;br /&gt;webenabled = yes&lt;br /&gt;&lt;br /&gt;b. add a user&lt;br /&gt;[administrator]&lt;br /&gt;secret = 123456&lt;br /&gt;read = system,call,log,verbose,command,agent,user,config&lt;br /&gt;write = system,call,log,verbose,command,agent,user,config&lt;br /&gt;&lt;br /&gt;# vi /etc/asterisk/http.conf&lt;br /&gt;a. modify these lines&lt;br /&gt;enabled=yes&lt;br /&gt;enablestatic=yes&lt;br /&gt;bindaddr= 0.0.0.0&lt;br /&gt;&lt;br /&gt;(9) use asterisk CPI prompt to execute shell commands&lt;br /&gt;# asterisk -vvvvvr&lt;br /&gt;erin-laptop*CLI&gt; restart now (it will restart asterisk now)&lt;br /&gt;&lt;br /&gt;(10) open a browser to verify asterisk&lt;br /&gt;http://127.0.0.1:8088/asterisk/static/config/cfgbasic.html&lt;br /&gt;http://127.0.0.1:8088/asterisk/static/config/cfgadvanced.html&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;B. Configuration&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;we can change the configuration from asterisk site, like adding the extension number, or change voicemail number....etc&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;C. Softphone&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A softphone is a software program for making telephone calls over the Internet&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Softphone"&gt;http://en.wikipedia.org/wiki/Softphone&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1. SJphone: &lt;a href="http://www.sjlabs.com/sjp.html"&gt;http://www.sjlabs.com/sjp.html&lt;/a&gt;&lt;br /&gt;download windows version&lt;br /&gt;&lt;a href="http://www.sjphone.org/softphone/SJphone-1.65.2637.exe"&gt;http://www.sjphone.org/softphone/SJphone-1.65.2637.exe&lt;/a&gt;&lt;br /&gt;user guide for windows&lt;br /&gt;&lt;a href="http://www.sjphone.org/doc/SJphone_User_Guide.pdf"&gt;http://www.sjphone.org/doc/SJphone_User_Guide.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. X-Lite: &lt;a href="http://www.counterpath.com/xlite-overview.html"&gt;http://www.counterpath.com/xlite-overview.html&lt;/a&gt;&lt;br /&gt;3. google talk: &lt;a href="http://www.google.com/talk/intl/zh-TW/"&gt;http://www.google.com/talk/intl/zh-TW/&lt;/a&gt;&lt;br /&gt;4. Zoiper: &lt;a href="http://www.zoiper.com/"&gt;http://www.zoiper.com/&lt;/a&gt;&lt;br /&gt;it provides different OS version, including Linux, Windows, and Mac OS.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 51, 153);font-size:130%;" &gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;MediaWiki&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A. Installation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;the installations notes is from here:&lt;br /&gt;&lt;a href="http://lifehacker.com/software/wikipedia/geek-to-live-set-up-your-personal-wikipedia-163707.php"&gt;http://lifehacker.com/software/wikipedia/geek-to-live-set-up-your-personal-wikipedia-163707.php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;all download files are from SourceForge:&lt;br /&gt;&lt;br /&gt;1. install WAMP:&lt;br /&gt;WAMP is an all-in-one PHP/MySQL/Apache installation for Windows.&lt;br /&gt;&lt;a href="http://www.wampserver.com/en/download.php"&gt;http://www.wampserver.com/en/download.php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. Install MediaWiki, the software that powers Wikipedia.&lt;br /&gt;&lt;a href="http://prdownloads.sourceforge.net/wikipedia/mediawiki-1.5.8.tar.gz?download"&gt;http://prdownloads.sourceforge.net/wikipedia/mediawiki-1.5.8.tar.gz?download&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Sysop account name: WikiSysop&lt;br /&gt;passwd: erin&lt;br /&gt;&lt;br /&gt;3. mysql database:&lt;br /&gt;user ID: root&lt;br /&gt;passwd: erin&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;B. Configuration&lt;/span&gt;&lt;br /&gt;here is a very detailed configuration settings README&lt;br /&gt;&lt;a href="http://www.mediawiki.org/wiki/Manual:Configuration_settings"&gt;http://www.mediawiki.org/wiki/Manual:Configuration_settings&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;How to: Install Apache, PHP, PEAR, MySQL &amp;amp; phpMyAdmin for Windows XP&lt;br /&gt;&lt;a href="http://www.sematopia.com/?p=28"&gt;http://www.sematopia.com/?p=28&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;C. Sending email&lt;/span&gt;&lt;br /&gt;Set email configuration for mediawiki &amp;amp; wamp:&lt;br /&gt;&lt;br /&gt;1. modify settings in C:\wamp\www\mediawiki\LocalSettings.php&lt;br /&gt;$wgEnableEmail = true;&lt;br /&gt;$wgEnableUserEmail = true;&lt;br /&gt;&lt;br /&gt;2. modify SMTP mode settings in C:\wamp\www\mediawiki\include\DefaultSettings.php&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;$wgSMTP = array(&lt;br /&gt;"host" =&gt; ' gmail.google.com',&lt;br /&gt;"IDHost" =&gt; ' gmail.google.com ',&lt;br /&gt;"port" =&gt; "25",&lt;br /&gt;"auth" =&gt; false,&lt;br /&gt;#"username" =&gt; "my_user_name",&lt;br /&gt;#"password" =&gt; "my_password"&lt;br /&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;3. add PEAR in C:\wamp\www\mediawiki\LocalSettings.php&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;$IP = "C:\\wamp\\www\\mediawiki";&lt;br /&gt;$setPHPPEAR = "C:\\wamp\\php\\PEAR";&lt;br /&gt;ini_set( "include_path", ".;$IP;$IP/includes;$IP/languages;$setPHPPEAR;" );&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;if you meet the problem like cannot find Mail.php or Net_SMTP.php, it's probably coz of PEAR modules.&lt;br /&gt;&lt;br /&gt;4. check the pear folder first, it should be in C:\wamp\php\PEAR&lt;br /&gt;&lt;br /&gt;5. run go-pear in windows command prompt&lt;br /&gt;&gt; cd c:\wamp\php&lt;br /&gt;&gt; go-pear.bat&lt;br /&gt;&lt;br /&gt;6. install Mail and NET_SMTP modules in pear&lt;br /&gt;&gt; cd c:\wamp\php\&lt;br /&gt;&gt; pear install mail&lt;br /&gt;&gt; pear install NET_SMTP&lt;br /&gt;&lt;br /&gt;7. restart all services in wamp&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-5185488144547807941?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/5185488144547807941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/03/asterisk-media-wiki-configuration-notes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/5185488144547807941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/5185488144547807941'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/03/asterisk-media-wiki-configuration-notes.html' title='asterisk &amp; media wiki configuration notes'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6730068706524524033.post-2914661065306507236</id><published>2009-02-28T15:42:00.001-08:00</published><updated>2009-02-28T20:36:59.214-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='app-engine'/><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>用python寫facebook application</title><content type='html'>&lt;span style="font-family:verdana;"&gt;前陣子  剛好在看google提出的service時  注意到了&lt;a href="http://code.google.com/appengine"&gt;app engine&lt;/a&gt;&lt;br /&gt;因為它整個都是python寫的  重燃了我對web的小小興趣&lt;br /&gt;發現google上有一篇關於&lt;a href="http://code.google.com/appengine/articles/shelftalkers.html"&gt;facebook&lt;/a&gt;的文章  於是就開始熱血了&lt;br /&gt;&lt;br /&gt;照理說 工程師的第一個sample code 應該是hello world&lt;br /&gt;但是對我而言 我的hello world就是sudoku&lt;br /&gt;Once upon a time ......&lt;br /&gt;&lt;br /&gt;Download the source code for this example application here:&lt;br /&gt;&lt;a href="http://code.google.com/p/todaysudoku/"&gt;http://code.google.com/p/todaysudoku/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;font-size:100%;" &gt;&lt;span&gt;I. Set up the working environment&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;a. install Google App Engine:&lt;br /&gt;&lt;div class="highlight"&gt; svn checkout http://googleappengine.googlecode.com/svn/trunk/ googleappengine-read-only&lt;/div&gt;&lt;br /&gt;b. install pyfacebook:&lt;br /&gt;&lt;div class="highlight"&gt; svn checkout http://pyfacebook.googlecode.com/svn/trunk/ pyfacebook&lt;/div&gt;&lt;br /&gt;c. create a new 'app engine' application :&lt;br /&gt;&lt;a href="http://appengine.google.com/"&gt;http://appengine.google.com/&lt;/a&gt;&lt;br /&gt;remember the app URL and app ID&lt;br /&gt;&lt;br /&gt;d. set up a new facebook application:&lt;br /&gt;&lt;a href="http://www.facebook.com/developers/"&gt;http://www.facebook.com/developers/&lt;/a&gt;&lt;br /&gt;remember the API, secret key, fill out the callback URL&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;font-size:100%;" &gt;&lt;span&gt;II. Start coding&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;a. how to make a 9*9 sudoku puzzle: use html &lt;a href="http://www.w3.org/TR/html4/struct/tables.html"&gt;table&lt;/a&gt; &amp;amp; &lt;a href="http://www.w3schools.com/css/css_table.asp"&gt;CSS&lt;/a&gt; style&lt;br /&gt;&lt;a href="http://www.w3.org/TR/html4/struct/tables.html"&gt;&lt;/a&gt;&lt;br /&gt;b. using &lt;a href="http://code.google.com/appengine/docs/python/gettingstarted/templates.html"&gt;Django html templates&lt;/a&gt;:&lt;br /&gt;this part is really like what i did for daily news website. The designers&lt;br /&gt;make a beautiful html page. We cut some places in html page and paste with&lt;br /&gt;'{{ params }}'. These {{ params}} would replace with DB data or other&lt;br /&gt;programming result. I made three html template files for this demo, &lt;a href="http://todaysudoku.googlecode.com/svn/trunk/index.html"&gt;main puzzle page&lt;/a&gt;,&lt;br /&gt;&lt;a href="http://todaysudoku.googlecode.com/svn/trunk/result.html"&gt;score page&lt;/a&gt; and upload score &lt;a href="http://todaysudoku.googlecode.com/svn/trunk/score.html"&gt;result page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;c. prepare '&lt;a href="http://code.google.com/appengine/docs/python/gettingstarted/staticfiles.html"&gt;app.yaml&lt;/a&gt;':&lt;br /&gt;this file can define the application name and handlers for URLs. It can make&lt;br /&gt;the App more organized.&lt;br /&gt;&lt;br /&gt;d. prepare 'facebook.py':&lt;br /&gt;&lt;div class="highlight"&gt; wget http://shelftalkers.googlecode.com/svn/trunk/shelftalkers/facebook.py&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;this file would take care of facebook login problem and retrieve data from&lt;br /&gt;facebook website.&lt;br /&gt;&lt;br /&gt;Example 1: try to get auth_token from Facebook by your keys, it would ask user login first.&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;# instantiate the Facebook API wrapper with your FB App's keys&lt;br /&gt;fb = facebook.Facebook(_FbApiKey, _FbSecret)&lt;br /&gt;auth_token = self.request.get('auth_token')&lt;br /&gt;&lt;br /&gt;if not fb.check_session(self.request) or not auth_token:&lt;br /&gt;    url = fb.get_login_url()&lt;br /&gt;    self.response.out.write('')&lt;br /&gt;    return&lt;br /&gt;session_key = self.request.get('fb_sig_session_key')&lt;br /&gt;uid = self.request.get('fb_sig_user')&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Example 2: Retrieve the user detailed information by user ID&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;# retrieve the user data from facebook by few keys&lt;br /&gt;fb = facebook.Facebook(_FbApiKey, _FbSecret)&lt;br /&gt;fb.session_key = self.request.get('session_key')&lt;br /&gt;fb.uid = self.request.get('uid')&lt;br /&gt;info = fb.users.getInfo([fb.uid],['name','pic','profile_url'])&lt;br /&gt;user = info[0]&lt;br /&gt;player_name = str(user['name'])&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;e. how to keep the game score data: (using &lt;a href="http://code.google.com/appengine/docs/python/datastore/overview.html"&gt;google data store&lt;/a&gt; API)&lt;br /&gt;Before, I need to use a MySQL to store the data, but google provides a very useful datastore api. It can define table schema and make sql querys. Then you can store the web data like database.&lt;br /&gt;&lt;br /&gt;Example 1: define a GameScore class like a table in DB&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;# define GameScore like a table&lt;br /&gt;class GameScore(db.Model):&lt;br /&gt;  player = db.StringProperty()&lt;br /&gt;  date = db.DateProperty(auto_now_add=True)&lt;br /&gt;  score = db.IntegerProperty()&lt;br /&gt;  level = db.StringProperty()&lt;br /&gt;  show = db.BooleanProperty()&lt;br /&gt;  content = db.StringProperty(multiline=True)&lt;br /&gt;  name = db.StringProperty()&lt;br /&gt;  photo = db.LinkProperty()&lt;br /&gt;  profile = db.LinkProperty()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Example 2: retrieve top ten records by date (make a SQL query)&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;# retrieve today top ten records only&lt;br /&gt;q = db.GqlQuery("SELECT * FROM GameScore " +&lt;br /&gt;         "WHERE date = :1 AND level = :2 " +&lt;br /&gt;         "ORDER BY score ",&lt;br /&gt;         today,level)&lt;br /&gt;result = q.fetch(10)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;font-size:100%;" &gt;&lt;span&gt;III. Upload the application and Run it&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;a. &lt;a href="http://code.google.com/appengine/docs/python/gettingstarted/helloworld.html"&gt;testing&lt;/a&gt; it at localhost:&lt;br /&gt;&lt;div class="highlight"&gt;google_appengine/dev_appserver.py todaysudoku/&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;b. &lt;a href="http://code.google.com/appengine/docs/python/gettingstarted/uploading.html"&gt;upload&lt;/a&gt; the whole folder:&lt;br /&gt;&lt;div class="highlight"&gt;google_appengine/appcfg.py update todaysudoku/&lt;/div&gt;&lt;br /&gt;c. run it: We can now this application running on App Engine.&lt;br /&gt;&lt;a href="http://todaysudoku.appspot.com/"&gt;http://todaysudoku.appspot.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh3.ggpht.com/_fB3UGiuVTOI/SaoCfZsTdEI/AAAAAAAACZA/QzcrABbhMzs/s800/collage.jpg"&gt;&lt;img style="cursor: pointer; width: 600px; height: 375px;" src="http://lh3.ggpht.com/_fB3UGiuVTOI/SaoCfZsTdEI/AAAAAAAACZA/QzcrABbhMzs/s800/collage.jpg" alt="today-sudoku" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;font-size:100%;" &gt;&lt;span&gt;&lt;br /&gt;IV. Check Google App engine service:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://appengine.google.com/"&gt;http://appengine.google.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;a. Dashboard:&lt;br /&gt;* up-to-the-minute overview of our system status with real-time, unedited data&lt;br /&gt;* daily overall serving status for each of our APIs, including any outages or downtime&lt;br /&gt;* detailed historical latency and error-rate graphs for the App Engine Datastore, Images, Mail, Memcache, Serving, URL Fetch, and Users components&lt;br /&gt;&lt;br /&gt;b. Logs: it would store all error log information and it's very convenient for debugging.&lt;br /&gt;&lt;br /&gt;c. Data Viewer: it is like php-mysql admin style. You can see the table data and make some query or delete data.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh5.ggpht.com/_fB3UGiuVTOI/SaoCf83H5WI/AAAAAAAACZI/D4250KwvBM0/s512/collage1.jpg"&gt;&lt;img style="cursor: pointer; width: 512px; height: 512px;" src="http://lh5.ggpht.com/_fB3UGiuVTOI/SaoCf83H5WI/AAAAAAAACZI/D4250KwvBM0/s512/collage1.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6730068706524524033-2914661065306507236?l=i-miss-erin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://i-miss-erin.blogspot.com/feeds/2914661065306507236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://i-miss-erin.blogspot.com/2009/02/pythonfacebook-application.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/2914661065306507236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6730068706524524033/posts/default/2914661065306507236'/><link rel='alternate' type='text/html' href='http://i-miss-erin.blogspot.com/2009/02/pythonfacebook-application.html' title='用python寫facebook application'/><author><name>erin</name><uri>http://www.blogger.com/profile/17766743879857803642</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_fB3UGiuVTOI/SanItpnh5KI/AAAAAAAACV4/tqkjTCWtC-U/S220/03182007142.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_fB3UGiuVTOI/SaoCfZsTdEI/AAAAAAAACZA/QzcrABbhMzs/s72-c/collage.jpg' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
