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

<channel>
	<title>Robotfreak Blog &#187; RF protocol</title>
	<atom:link href="http://www.robotfreak.de/blog/tag/rf-protocol/feed" rel="self" type="application/rss+xml" />
	<link>http://www.robotfreak.de/blog</link>
	<description>Robotik, Elektronik, Arduino und mehr</description>
	<lastBuildDate>Mon, 23 Jan 2012 21:13:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Roomba RF Protokoll (Teil 2)</title>
		<link>http://www.robotfreak.de/blog/robotik/roomba-rf-protokoll-teil-2/328</link>
		<comments>http://www.robotfreak.de/blog/robotik/roomba-rf-protokoll-teil-2/328#comments</comments>
		<pubDate>Fri, 14 May 2010 13:03:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Robotik]]></category>
		<category><![CDATA[Roomba]]></category>
		<category><![CDATA[IEEE 802.15.4]]></category>
		<category><![CDATA[RF protocol]]></category>
		<category><![CDATA[wireless protocol]]></category>
		<category><![CDATA[Wireshark]]></category>

		<guid isPermaLink="false">http://www.robotfreak.de/blog/?p=328</guid>
		<description><![CDATA[Im zweiten Teil der Roomba RF Protokoll Reihe geht es um die Unterschiede im MAC Layer Protokoll. Unverst&#228;ndlicherweise wird beim Roomba nicht der IEEE 802.15.4 MAC Layer verwendet, sondern ein eigenes Protokoll, obwohl IEEE 802.15.4 ein Standard ist und lizens- und kostenfrei verwendet werden kann, im Gegensatz zum lizens- und kostenpflichtigen Zigbee Protokoll. Das unterschiedliche [...]]]></description>
			<content:encoded><![CDATA[<p>Im zweiten Teil der Roomba RF Protokoll Reihe geht es um die Unterschiede im MAC Layer Protokoll. Unverst&#228;ndlicherweise wird beim Roomba nicht der IEEE 802.15.4 MAC Layer verwendet, sondern ein eigenes Protokoll, obwohl IEEE 802.15.4 ein Standard ist und lizens- und kostenfrei verwendet werden kann, im Gegensatz zum lizens- und kostenpflichtigen Zigbee Protokoll.<br />
Das unterschiedliche MAC Layer Protokoll ist wahrscheinlich auch die Ursache daf&#252;r, das ich mit der Standard RZRAVEN Software keinen Erfolg beim Sniffen der Pakete hatte.<br />
<span id="more-328"></span></p>
<h2>Unterschiede im MAC Layer</h2>
<p>Die Protokolle sind zwar &#228;hnlich aber im Detail doch sehr unterschiedlich, was das Reengineering nicht gerade einfach macht.</p>
<h3>IEEE 802.15.4 MAC Layer Frame:</h3>
<p>IEEE 802.15.4 Pakete sind im Little Endian Format. (HIGH Byte wird vor dem LOW Bate gesendet). Jedes Byte wird mit LSB zuerst gesendet.</p>
<pre>
  |  FCF  |Seq No|  Addressing |         Data          |  FCS  |
  |2 bytes|1 byte|0 to 20 bytes|Length-(Overhead) bytes|2 Bytes|
 </pre>
<p>Hier findet man neben dem 2 Byte Frame Control Field (FCF) noch einen 1 Byte Frame Counter.</p>
<h3>Roomba MAC Layer Frame:</h3>
<pre>
  |  FCF  Seq No |  Addressing |         Data          |  FCS  |
  |2 bytes       |0 to xx bytes|Length-(Overhead) bytes|2 Bytes|
 </pre>
<p>Beim Roomba Protokoll gibt es nur den kombinierten 2 Byte Frame Header / Frame Counter. </p>
<p>Wenn man nun mit Wireshark oder einem anderen Paket-Sniffer die Roomba Frames encoden m&#246;chte, erh&#228;lt man lauter &#8216;unknown frame types&#8217; und &#8216;invalid address mode&#8217; Fehlermeldungen. Man m&#252;&#223;te seinen eigenen Dissector f&#252;r Wireshark schreiben oder das frame encoding abschalten.<br />
<img src='http://farm2.static.flickr.com/1233/4606477712_565eca2776.jpg' alt='wireshark-frame'/><br />
<img src='http://farm2.static.flickr.com/1053/4605862947_7e83922905.jpg' alt='wireshark-frame7'/></p>
<h2>Frame Checksumme FCS</h2>
<p>Zum Gl&#252;ck wird bei beiden MAC layer das selbe Format f&#252;r die Frame Checksumme (FCS) verwendet. In den Wireshark Quellen findet man die genauen Parameter und den Algorythmus zur Checksummen Erzeugung.</p>
<pre>
   CRC16 is calculated using the x^16 + x^12 + x^5 + 1 polynomial
   as specified by ITU-T, and is calculated over the IEEE 802.15.4
   packet (excluding the FCS) as transmitted over the air. Note,
   that because the least significan bits are transmitted first, this
   will require reversing the bit-order in each byte. Also, unlike
   most CRC algorithms, IEEE 802.15.4 uses an initial and final value
   of 0x0000, instead of 0xffff (which is used by the CCITT).
</pre>
<p>Klingt kompliziert, aber es ist l&#246;sbar. Mein C# Sniffer kann inzwischen auch die Checksumme erzeugen. Damit steht dem Erzeugen/Senden eigener Frames eigentlich nichts mehr im Wege.<br />
<img src='http://farm5.static.flickr.com/4036/4606543876_6ece510ec4.jpg' alt='Roomba RF sniffer'/></p>
<h2>Fazit</h2>
<p>Mit den neuen Erkenntnissen und vor allem mit der Checksummen Erzeugung ist es nun m&#246;glich eigene Frames zu erzeugen und zu senden. Vorest als Notl&#246;sung auf PC Seite. Sp&#228;ter ist es sicher besser, die ganze MAC Schicht auf dem Jackdaw Board laufen zu lassen und zum PC nur auf der Applikationsebene zu kommunizieren.</p>
<h2>Weblinks</h2>
<ul>
<li><a href="http://standards.ieee.org/getieee802/download/802.15.4-2006.pdf" class="lipdf">IEEE 802.15.x Standards</a></li>
<li><a href="http://www.wireshark.org/" class="liexternal">Wireshark</a></li>
<li><a href="http://media-2.cacetech.com/wireshark/src/wireshark-1.2.8.tar.bz2" class="liexternal">Wireshark Sourcecode</a></li>
<li><a href="http://github.com/robotfreak/RoombaRFCtrl" class="liexternal">RoombaRFCtrl  Sourcecode (GitHub)</a></li>
<li><a href="http://pcapdotnet.codeplex.com/" class="liexternal">Pcap.Net Library</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.robotfreak.de/blog/robotik/roomba-rf-protokoll-teil-2/328/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Roomba RF Protokoll (Teil 1)</title>
		<link>http://www.robotfreak.de/blog/robotik/roomba-rf-protokoll/276</link>
		<comments>http://www.robotfreak.de/blog/robotik/roomba-rf-protokoll/276#comments</comments>
		<pubDate>Fri, 07 May 2010 07:14:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Robotik]]></category>
		<category><![CDATA[Roomba]]></category>
		<category><![CDATA[IEEE 802.15.4]]></category>
		<category><![CDATA[RF protocol]]></category>
		<category><![CDATA[robotic]]></category>
		<category><![CDATA[wireless protocol]]></category>

		<guid isPermaLink="false">http://www.robotfreak.de/blog/?p=276</guid>
		<description><![CDATA[Meine Frau meinte, es w&#228;re mal an der Zeit, das meine Roboter auch mal eine sinnvolle Aufgabe &#252;bernehmen sollten. Gesagt, getan habe ich mir zu &#8220;Forschungszwecken&#8221; einen Roomba Staubsauger Roboter von iRobot besorgt. Damit konnte ich gleich 2 Fliegen mit einer Klappe schlagen. Meine Frau hat ein n&#252;tzliches Haushaltsger&#228;t, und wenn der Roomba mal nicht [...]]]></description>
			<content:encoded><![CDATA[<p>Meine Frau meinte, es w&#228;re mal an der Zeit, das meine Roboter auch mal eine sinnvolle Aufgabe &#252;bernehmen sollten. Gesagt, getan habe ich mir zu &#8220;Forschungszwecken&#8221; einen Roomba Staubsauger Roboter von <a href="http://www.irobot.com" class="liexternal">iRobot</a> besorgt. Damit konnte ich gleich 2 Fliegen mit einer Klappe schlagen. Meine Frau hat ein n&#252;tzliches Haushaltsger&#228;t, und wenn der Roomba mal nicht am arbeiten ist, kann ich mich damit befassen.<br />
<img src='http://farm5.static.flickr.com/4041/4585197000_2e4b887ef5.jpg' alt='Roomba 625'/><br />
<span id="more-276"></span></p>
<h2>SCI / OI Schnittstelle</h2>
<p>Wie schon die &#228;lteren Modelle, besitzen auch die aktuellen Modelle der Roomba 500 Reihe eine serielle Schnittstelle &#252;ber die man den Roomba fernsteuern kann, oder seine Sensorwerte abfragen kann. Die sogenannte <a href="http://www.irobot.com/images/consumer/hacker/Roomba_SCI_Spec_Manual.pdf" class="lipdf">SCI Schnittstelle</a> ist gut dokumentiert und erhielt mit Einf&#252;hrung der 500 Reihe auch ein Update mit <a href="http://www.irobot.lv/uploaded_files/File/iRobot_Roomba_500_Open_Interface_Spec.pdf" class="lipdf">erweiterten Befehlen</a>, die Schnittstelle erhielt auch einen neuen Namen und hei&#223;t jetzt OI (Open Interface). Zudem besitzen die Roomba 5xx Modelle viel mehr Sensoren als die Vorg&#228;ngerversionen.</p>
<p>Leider w&#228;hrte meine Freude nicht sehr lange, da mir beim Anschluss eines Controller Boards ein kleiner Fehler mit fatalen Folgen unterlief. Blind vertrauend auf den Aufdruck auf dem Controller Board vertauschte ich RX mit TX  und damit war es um die Roomba Schnittstelle und den Controller geschehen. Zwar funktioniert der Roomba weiterhin problemlos, aber die SCI Schnittstelle l&#228;&#223;t sich nun nicht mehr nutzen.<br />
<img src='http://farm5.static.flickr.com/4030/4584564637_7ab6fc26b9.jpg' alt='Roomba SCI FTDI UART'/></p>
<h2>IEEE 802.11.4 2.4GHz Schnittstelle</h2>
<p>Die Modelle ab dem Roomba 560 aufw&#228;rts besitzen neben dem seriellen Interface auch eine Drahtlos Schnittstelle im 2.4GHz Bereich. Damit kommuniziert der Roomba mit den neuen Virtual Wall/Lighthouse Modulen (kurz VWLH) und einer drahtlosen Fernbedienung, dem Wireless Control Center (kurz WCC). &#220;ber diese Schnittstelle ist leider wenig bekannt, es gibt keinerlei Doku dazu, lediglich die Eckdaten sind bekannt.</p>
<ul>
<li>2.4GHz <a href="http://de.wikipedia.org/wiki/IEEE_802.15.4" rel="nofollow" class="liwikipedia">IEEE 802.15.4</a> Transceiver</li>
<li>nicht ZigBee kompatibles, propriet&#228;res Protokoll</li>
<li>Freescale MC13202 2.4GHz RF transceiver</li>
</ul>
<p>Nach dem Lesen dieses <a href=" http://www.robotreviews.com/chat/viewtopic.php?f=4&amp;t=7529" class="liinternal">robotreviews Threads</a>,  kam ich dann auf die Idee mich n&#228;her mit dem RF Protokoll des Roomba zu befassen und die in dem Thread begonnene Arbeit fortzusetzen.<br />
<img src='http://farm5.static.flickr.com/4009/4587636226_7d0dc65254.jpg' alt='Roomba RF Modul'/></p>
<h2>verwendete Hard- und Software</h2>
<p>Da ich auch ein bisher ungenutztes RZRAVEN Bord herumliegen hatte, war auch die n&#246;tige Hardware vorhanden, um das Roomba RF Protokoll zu erforschen.<br />
Die Software-Tools des RZRAVEN Boards funktionierten leider nicht so wie ich das gerne mochte, deshalb wurde die Firmware des RZRAVEN Board mit der <a href="http://www.sics.se/~adam/contiki/docs-uipv6/a01108.html" class="liexternal">Jackdaw Firmware</a> aus dem <a href="http://www.sics.se/contiki/" class="liexternal">Contiki Projekt</a> ersetzt. Man ben&#246;tigt nicht das komplette Contiki Paket, es gen&#252;gt das <a href="https://sourceforge.net/projects/contiki/files/Contiki/Contiki%202.4/contiki-raven-2.4.zip/download" class="liexternal">Contiki Raven Paket</a>. Somit wurde aus dem Raben (Raven) eine Dohle (Jackdaw) und damit funktioniert bisher alles wunderbar. Man kann damit sogar <a href="http://www.wireshark.org/" class="liexternal">Wireshark</a> f&#252;r das Packet Capturing verwenden.<br />
Der Trick dabei ist, das die Jackdaw Firmware die 802.15.4 Pakete in einem Ethernet-Frame einbindet. Mit den Jackdaw Treiber erscheint das Board unter Windows zum einen als Netzwerk-Ger&#228;t und als USB-Ger&#228;t f&#252;r die serielle Konfiguration (zum ausw&#228;hlen des Kanals, dem Sniffer Mode, etc.).<br />
<img src='http://farm5.static.flickr.com/4068/4584566929_1977494e11.jpg' alt='Atmel RZRAVEN'/><br />
Leider wird zum Umprogrammieren des RZRAVEN boards ein JTAG Programmer ben&#246;tigt, d.h. man ben&#246;tigt einen JTAG ICE Mk II, einen AVR ONE! oder ein Dragon Board.<br />
<img src='http://farm5.static.flickr.com/4015/4584567891_abe1df6880.jpg' alt='Atmel RZRAVEN JTAG Adapter'/><br />
Diese derzeitige L&#246;sung ist sicher nicht f&#252;r jedermann geeignet. Das RZRAVEN Kit ist nicht gerade billig (105€ bei <a href="http://www.watterott.com/de/Atmel-RZ-Raven" class="liexternal">Watterott</a>) und zudem ist ein JTAG Programmer erforderlich. Vielleicht ergibt sich ein Weg, das Transceiver Modul aus der WCC oder einem VWLH auszul&#246;ten und &#252;ber einen anderen Controller (z.B. einem Arduino) anzusteuern. Die Schnittstelle ist ein einfaches SPI Interface. Eine Firmware gibt es im Transceiver auch nicht, der ist relativ dumm. Eine andere M&#246;glichkeit w&#228;ren vielleicht die <a href="http://www.digi.com/products/wireless/zigbee-mesh/xbee-zb-module.jsp#overview" class="liexternal">XBee Module von Digi</a>. Diese verwenden wohl den gleichen Freescale Transceiver. Allerdings arbeiten die XBees im ZigBee Mode.</p>
<h2>Erste Untersuchungen</h2>
<p>Hier ist mein derzeitiger Stand der Forschung &#252;ber das Roomba RF-Protokoll:</p>
<p>Begonnen wurde damit, bei jedem Ger&#228;t einzeln die Batterien einzulegen und die rohen IEEE 802.15.4 Pakete mit Wireshark aufzuzeichnen.</p>
<h3>Roomba auf Kanal 15:</h3>
<pre>   No.     Time      Data
      1 0.000000   17 00 ff ff 00 05 00 01 10 f7 02
      2 0.420558   17 10 ff ff 00 05 00 01 10 8f 59
      3 1.488229   17 00 ff ff fc 00 01 16 76 43
      4 2.188864   17 10 ff ff fc 00 01 16 bf f6
      5 2.971726   17 20 ff ff fc 00 01 16 f5 20
      6 3.754072   17 30 ff ff fc 00 01 16 3c 95
      7 4.537940   17 40 ff ff fc 00 01 16 70 84
      8 5.320669   17 50 ff ff fc 00 01 16 b9 31
      9 6.103414   17 60 ff ff fc 00 01 16 f3 e7
     10 6.885647   17 70 ff ff fc 00 01 16 3a 52
     11 7.669509   17 80 ff ff fc 00 01 16 6b c5
     12 8.451608   17 90 ff ff fc 00 01 16 a2 70
     13 9.235353   17 a0 ff ff fc 00 01 16 e8 a6
     14 10.017840  17 b0 ff ff fc 00 01 16 21 13
     15 10.801700  17 c0 ff ff fc 00 01 16 6d 02
     16 11.584420  17 d0 ff ff fc 00 01 16 a4 b7
     17 12.366922  17 e0 ff ff fc 00 01 16 ee 61
     18 13.149155  17 f0 ff ff fc 00 01 16 27 d4</pre>
<p>Die ersten beiden Frames werden nur nach Einlegen des Batteriepacks eingelegt, ansonsten werden immer nur die folgenden 16 Frames stetig wiederholt.</p>
<h3>WCC auf Kanal 15:</h3>
<pre>   No.     Time      Data
      1 0.000000   17 00 14 c4 00 11 00 01 10 55 0d
      2 0.357063   17 10 14 c4 00 11 00 01 10 2d 56
      3 2.254351   17 00 14 c4 00 11 00 01 10 55 0d
      4 2.610909   17 10 14 c4 00 11 00 01 10 2d 56
      5 4.509101   17 00 14 c4 00 11 00 01 10 55 0d
      6 4.866875   17 10 14 c4 00 11 00 01 10 2d 56
      7 6.764044   17 00 14 c4 00 11 00 01 10 55 0d
      8 7.121856   17 10 14 c4 00 11 00 01 10 2d 56</pre>
<p>Im Unterschied zu Roomba und VWLH &#228;ndert sich der Frame counter nur zwischen 0 und 1. Alle 2 Sekunden werden die beiden Pakete wiederholt.</p>
<h3>VWLH auf Kanal 15:</h3>
<pre>   No.     Time      Data
      1 0.000000   17 00 ff ff 00 07 b8 01 10 01 77
      2 0.359804   17 10 ff ff 00 07 b8 01 10 79 2c
      3 4.113874   17 20 ff ff 00 07 b8 01 10 f1 c1
      4 4.478571   17 30 ff ff 00 07 b8 01 10 89 9a
      5 8.233644   17 40 ff ff 00 07 b8 01 10 f0 12
      6 8.599708   17 50 ff ff 00 07 b8 01 10 88 49
      7 12.355781  17 60 ff ff 00 07 b8 01 10 00 a4
      8 12.722344  17 70 ff ff 00 07 b8 01 10 78 ff
      9 16.478553  17 80 ff ff 00 07 b8 01 10 e3 bc
     10 16.844117  17 90 ff ff 00 07 b8 01 10 9b e7
     11 20.597685  17 a0 ff ff 00 07 b8 01 10 13 0a
     12 20.963336  17 b0 ff ff 00 07 b8 01 10 6b 51
     13 24.719456  17 c0 ff ff 00 07 b8 01 10 12 d9
     14 25.086514  17 d0 ff ff 00 07 b8 01 10 6a 82
     15 28.842096  17 e0 ff ff 00 07 b8 01 10 e2 6f
     16 29.207154  17 f0 ff ff 00 07 b8 01 10 9a 34</pre>
<p>Beim VWLH werden jeweils 2 Pakete alle 4 Sekunden gesendet. Der Frame counter z&#228;hlt wie beim Roomba von 0 bis F.</p>
<p>Alle Messages sehen ziemlich &#228;hnlich aus, beginnend mit 0&#215;17 (wie fast jedes Paket). Das HIGH Nibble des folgenden Bytes wird mit jedem Paket inkrementiert, ich denke es ist ein Frame counter. Das LOW Nibble ist wohl der Message Typ, in diesem Fall 0. Die n&#228;chsten 2 Bytes k&#246;nnte ein 16-Bit-Adresse. Roomba und VWLH verwendet 0xFFFF als Adresse, das ist demnach eine Broadcast-Adresse. Nur das WCC liefert eine andere Adresse, 0x14C4 in diesem Fall. Der Rest der Nachricht ist so weit unbekannt, mit Ausnahme der letzten 2 Bytes, der CRC-Pr&#252;fsumme f&#252;r das Paket.</p>
<h3>Pairing Roomba mit WCC auf Kanal 15:</h3>
<pre>   No.     Time      Data
      1 0.000000   17 00 ff ff 00 05 00 01 10 f7 02
      2 0.420800   17 10 ff ff 00 05 00 01 10 8f 59
      3 1.487354   17 00 ff ff fc 00 01 16 76 43
      4 2.188480   17 10 ff ff fc 00 01 16 bf f6
      5 2.970842   17 20 ff ff fc 00 01 16 f5 20
      6 3.753079   17 30 ff ff fc 00 01 16 3c 95
      7 4.536435   17 40 ff ff fc 00 01 16 70 84
      8 5.320184   17 50 ff ff fc 00 01 16 b9 31
      9 5.333627   17 00 14 c4 00 11 00 01 17 ea 79
     10 6.171521   17 10 14 c4 00 11 00 01 10 2d 56
     11 6.528450   17 20 14 c4 00 11 00 01 10 a5 bb
     12 6.544792   17 00 ff ff fc 00 01 11 14 c4 0f 01 e6 82</pre>
<p>Die Frames 1 bis 8 kennt man bereits vom &#8216;Roomba auf Kanal 15&#8242; capture. Die n&#228;chsten 3 Frames stammen vom WCC. Ein kleiner Unterschied ist die letzte Date im Frame 9 (0&#215;17 anstelle de 0&#215;10). Dann folgt als letzter Frame wieder eine Antwort vom Roomba, l&#228;nger als die bisherigen Pakete. Zudem erscheint die WCC Adresse 0x14c4 in diesem Antwort Paket. Das ist wohl die eigentliche Pairing complete Message. Danach ist auf Kanal 15 Sendepause. Der weitere Datenverkehr findet nun auf Kanal 26 statt.</p>
<h3>Datenverkehr Roomba / WCC auf Kanal 26:</h3>
<pre>   No.     Time      Data
      1 0.000000   17 02 14 c4 fc 00 48 15 23 eb
      2 0.720154   17 12 14 c4 fc 00 48 15 ea 5e
      3 24.349287  17 12 14 c4 fc 00 48 15 ea 5e
      5 25.789405  17 22 14 c4 fc 00 48 15 a0 88
      6 25.804986  17 01 14 c4 10 11 00 01 20 29 09
      7 25.810707  17 01 14 c4 10 11 00 01 20 29 09
      8 25.817085  17 01 14 c4 10 11 00 01 20 29 09
      9 25.822579  17 01 14 c4 10 11 00 01 20 29 09
     10 25.828787  17 01 14 c4 10 11 00 01 20 29 09
     11 25.843207  17 11 14 c4 10 11 00 01 20 51 52
     12 25.849459  17 11 14 c4 10 11 00 01 20 51 52
     13 25.854948  17 11 14 c4 10 11 00 01 20 51 52
     14 25.861073  17 11 14 c4 10 11 00 01 20 51 52
     15 25.868092  17 11 14 c4 10 11 00 01 20 51 52
     16 25.880333  17 21 14 c4 00 11 00 01 30 0a 88 33
     17 25.881948  17 24 bf bf
     18 25.892321  17 31 14 c4 00 11 00 14 02 00 00 b1 b9
     19 25.894274  17 34 3e af
     20 25.903341  17 41 14 c4 00 11 00 14 02 00 00 2d 96
     21 25.905069  17 44 b9 dc
     22 25.915725  17 51 14 c4 00 11 00 14 02 00 00 7f 44
     23 25.917568  17 54 38 cc
     24 25.924315  17 21 14 c4 10 00 17 41 0a 0a 8a 0a 00 00 53 ad
     25 25.925691  17 24 bf bf
     26 25.928831  17 61 14 c4 00 11 00 14 02 00 00 98 3a
     27 25.930092  17 64 bb fd
     28 25.941191  17 71 14 c4 00 11 00 14 02 00 00 ca e8
     29 25.942873  17 74 3a ed
     30 25.953745  17 81 14 c4 00 11 00 14 02 00 00 a0 65
     31 25.955264  17 84 b5 1a
     32 25.965316  17 91 14 c4 00 11 00 14 02 00 00 f2 b7
     33 25.966801  17 94 34 0a
     34 26.509151  17 32 14 c4 fc 00 14 14 b7 56
     35 26.512332  17 a1 14 c4 00 11 00 14 02 00 00 15 c9
     36 26.513828  17 a4 b7 3b
     37 26.520839  17 b1 14 c4 00 11 00 14 02 00 00 47 1b
     38 26.522708  17 b4 36 2b
     39 26.532451  17 c1 14 c4 00 11 00 14 02 00 00 db 34
     40 26.534199  17 c4 b1 58
     41 26.545332  17 d1 14 c4 00 11 00 14 02 00 00 89 e6
     42 26.547079  17 d4 30 48
     43 26.556988  17 e1 14 c4 00 11 00 14 02 00 00 6e 98
     44 26.558448  17 e4 b3 79
     45 26.569661  17 f1 14 c4 00 11 00 14 02 00 00 3c 4a
     46 26.571201  17 f4 32 69</pre>
<p>Es gibt wesentlich mehr Traffic auf diesem Kanal nach erfolreichem Pairing. Im Gegensatz zu den Nachrichten auf Kanal 15 gibt es hier andere Message Typen (Low Nibble des 2. Byte, 0 bei Kanal 15, hier 1,2 und 4).<br />
Der Frame counter wird in Abh&#228;ngigkeit des Message Typs inkrementiert (siehe Frame 34).<br />
Ebenso enthalten die meisten Pakete die WCC-Adresse 0x14C4, stammen also vom WCC. Dazwischen gibt es einige kurze Mitteilungen zu 4 Bytes (ohne Adresse). Sieht nach einer Acknowlegde Nachricht vom Roomba zur vorherigen Nachricht aus. Z.B.  sendet die WCC 0&#215;17 0xD1 &#8230; Dann lautet die Antwort des Roombas dazu: 0&#215;17 0xD4. Man erkennt zudem die gleiche Frame-Nummer im Acknowledge Paket.</p>
<p>In den Wireshark PCAP Files standen auch  einige Eintr&#228;ge mit Nachrichten, die kein Acknowledge bekamen. Die WCC wiederholt dann solange die Nachricht, bis ein Acknowledge kommt.</p>
<h2>Fazit</h2>
<h3>Message Format</h3>
<p>So sieht nach derzeitigem Kenntnisstand der allgemeinen Nachrichten Aufbau aus:</p>
<pre>    &lt;hh&gt; &lt;ft&gt; &lt;aa &lt;aa&gt; &lt;dd&gt;.....&lt;dd&gt; 

    hh    8bit Frame Header constant 0x17
    ft    4Bit Frame counter / 4bit Message Typ
    aa    optionale 16bit Adresse
    dd    optionale Daten variabler L&#228;nge
    cc    16bit CRC Checksumme CCITT</pre>
<h3>Message Typ</h3>
<pre>     0    Pairing, Connection
     1    Command, ACK expected
     2    ???, no ACK expected
     4    Acknowledge</pre>
<h3>WCC Bedien Message</h3>
<p>Die Kodierung der gedr&#252;ckten Tasten beim WCC waren sehr leicht anhand der aufgezeichneten Protokolle zu erkennen. Jedes Paket wird zudem vom Roomba mit einer Acknowledge Message quittiert. So sieht die Befehlsfolge dazu aus:</p>
<pre>    17 f1 14 C4 00 11 00 14 02 kk kk cc cc   (13 Bytes) command from WCC
    17 f4 cc cc                              (4 Bytes) ack from roomba

    f 4Bit Frame counter 0..f
    k 16Bit Key number bit oriented
    c 16Bit CRC checksum</pre>
<h3>Tasten  Bits</h3>
<pre>
    00 00   no key
    00 01   hour
    00 02   minute
    00 04   clock
    00 08   ???
    00 10   ???
    00 20   ???
    00 40   ???
    00 80   ???
    01 00   clean
    02 00   spot
    04 00   max
    08 00   schedule
    10 00   forward
    20 00   right
    40 00   left
    80 00   day</pre>
<p>Taste geddr&#252;ckt, das entsprechende Bit ist 1, Taste losgelassen, das entsprechend Bit ist 0. 11 Tasten befinden sich auf der Remote, 5 Bits bleiben unbenutzt.<br />
<img src='http://farm5.static.flickr.com/4032/4585193170_58f56390f0.jpg' alt='Roomba WCC'/></p>
<h3>Was kann man damit anfangen</h3>
<p>Nach derzeitigem Stand kann man zumindest die Funktionen der WCC mit einem PC Programm und dem RZRAVEN USB Dongle nachbilden und den Roomba damit rudiment&#228;r ansteueren. F&#252;r die Einbindung in eine bestehende Hausautomation oder einen PC gesteuerte Scheduler ist das sicher ausreichend.<br />
Die kompletten Features zur Steuerung, wie sie die SCI/OI Schnittstelle bietet, wird man damit wohl leider nicht erreichen. Hier sollte vielleicht der Hersteller <a href="http://www.irobot.com" class="liexternal">iRobot</a> dar&#252;ber mal nachdenken, diese Schnittstelle freizugeben bzw. besser zu unterst&#252;tzen. Technisch w&#228;re es sicher kein Problem, die bestehende SCI/OI Schnittstelle auch &#252;ber das RF Modul zu rooten. Bedarf daf&#252;r gibt es auf alle F&#228;lle. Der Vorteil liegt einfach darin, dass man ohne Umbau und Aufbauten auf dem Roomba diesen &#252;ber eine drahtlose Schnittstelle steuern k&#246;nnte.</p>
<h2>Wie geht es  weiter</h2>
<p>Viele Fragen bleiben noch offen:</p>
<ul>
<li>Wie werden die Uhrzeit und die Scheduler Zeiten &#252;bertragen?</li>
<li>Liefert der Roomba seinen Akku Ladezustand?</li>
<li>Was hat es mit den omin&#246;sen Messages auf sich, die nicht in das derzeitige Protokoll passen?</li>
<li>Gibt es vielleicht ein Hintert&#252;rchen um an die Blackbox Daten oder an das SCI/OI Interface heranzukommen?</li>
</ul>
<p>Ich habe begonnen, ein Tool mit der <a href="http://pcapdotnet.codeplex.com/" class="liexternal">Pcap.Net Bibliothek</a> in C# zu programmieren. Damit soll der Empfang und das Versenden von Paketen sowie das Pairing mit dem Roomba erm&#246;glicht werden. Im Moment ist das Tools aber noch ein reiner Paket-Sniffer.</p>
<p>Was derzeit noch fehlt:</p>
<ul>
<li>Generieren / Check  der Check. Dieses sollte eine normale CCITT CRC Checksumme sein.</li>
<li>Senden von Paketen</li>
<li>Interpreter f&#252;r die empfangenen Pakete</li>
<li>Automatischer Kanalwechsel, nach dem Pairing</li>
</ul>
<h2>Weblinks</h2>
<ul>
<li><a href="http://www.irobot.com" class="liexternal">iRobot</a></li>
<li><a href="http://www.irobot.lv/uploaded_files/File/iRobot_Roomba_500_Open_Interface_Spec.pdf" class="lipdf">Roomba 500 Open Interface</a></li>
<li><a href="http://www.irobot.com/images/consumer/hacker/Roomba_SCI_Spec_Manual.pdf" class="lipdf">Roomba SCI Interface</a></li>
<li><a href="http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=MC13202" class="liexternal">Freescale MC13202 2.4GHz RF Transceiver</a></li>
<li><a href="http://www.sics.se/~adam/contiki/docs-uipv6/a01108.html" class="liexternal">Jackdaw Firmware</a></li>
<li><a href="https://sourceforge.net/projects/contiki/files/Contiki/Contiki%202.4/contiki-raven-2.4.zip/download" class="liexternal">Contiki Raven Paket</a></li>
<li><a href="http://www.wireshark.org/" class="liexternal">Wireshark</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.robotfreak.de/blog/robotik/roomba-rf-protokoll/276/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

