Roomba 980 Wifi Connectivity Reverse engineering

Hi all,

here is another simple way to get stuff running without node.js and all the other things (although this is a grrrreeeeaaaat reference!). Use a browser plugin, like e.g. HttpRequester, and the send the commands to your Roomba 980:

1. Get the password:
(Replace 192.168.10.135 with your robots IP address)
(Place the robot on the home base and press the HOME button for about 2 seconds until a series of tones is played and the WIFI light flashes, then hurry to send the POST command)

POST https://192.168.10.135/umi
Content-Type: application/json
Connection: close
User-Agent: aspen%20production/2618 CFNetwork/758.3.15 Darwin/15.4.0
Content-Encoding: identity
Accept: */*
Accept-Language: en-us
Host: 192.168.10.135
content-length: 37

{"do":"get","args":["passwd"],"id":1}

– Response: –

200 OK
Server:  Marvell-WM
Connection:  close
Transfer-Encoding:  chunked
Content-Type:  application/json

{"ok":{"passwd":"a1bcdEF23GhIj4KL"},"id":1}

2. Get the username/blid:
(Replace 192.168.10.135 with your robots IP address)
(For the Authorization header, you must Base64 encode the string “user:”+ThePasswordReceivedFromStep1, e.g. Base64(user:a1bcdEF23GhIj4KL) -> dXNlcjphMWJjZEVGMjNHaElqNEtM)
(The decimal “blid” values in the response must be hex encoded to receive the username: 43,6,75,31,32,127,12,132 -> 2B064B1F207F0C84)

POST https://192.168.10.135/umi
Content-Type: application/json
Connection: close
User-Agent: aspen%20production/2618 CFNetwork/758.3.15 Darwin/15.4.0
Content-Encoding: identity
Accept: */*
Accept-Language: en-us
Host: 192.168.10.135
content-length: 34
Authorization: Basic dXNlcjphMWJjZEVGMjNHaElqNEtM

{"do":"get","args":["sys"],"id":2}

– Response: –

200 OK
Server:  Marvell-WM
Connection:  close
Transfer-Encoding:  chunked
Content-Type:  application/json

{"ok":{"umi":2,"pid":2,"blid":[43,6,75,31,32,127,12,132],"sw":"v1.2.9","cfg":0,"boot":4042,"main":4313,"wifi":517,"nav":"01.08.04","ui":2996,"audio":32,"bat":"lith"},"id":2}

3. Start the robots clean job:
(Replace 192.168.10.135 with your robots IP address)
(See comment of Step 2 for the Authorization header)

POST https://192.168.10.135/umi
Content-Type: application/json
Connection: close
User-Agent: aspen%20production/2618 CFNetwork/758.3.15 Darwin/15.4.0
Content-Encoding: identity
Accept: */*
Accept-Language: en-us
Host: 192.168.10.135
content-length: 49
Authorization: Basic dXNlcjphMWJjZEVGMjNHaElqNEtM

{"do":"set","args":["cmd" {"op":"start"}],"id":3}

– Response: –

200 OK
Server:  Marvell-WM
Connection:  close
Transfer-Encoding:  chunked
Content-Type:  application/json

{"ok":null,"id":3}

4. Pause the robots clean job:
(Replace 192.168.10.135 with your robots IP address)
(See comment of Step 2 for the Authorization header)

POST https://192.168.10.135/umi
Content-Type: application/json
Connection: close
User-Agent: aspen%20production/2618 CFNetwork/758.3.15 Darwin/15.4.0
Content-Encoding: identity
Accept: */*
Accept-Language: en-us
Host: 192.168.10.135
content-length: 49
Authorization: Basic dXNlcjphMWJjZEVGMjNHaElqNEtM

{"do":"set","args":["cmd" {"op":"pause"}],"id":4}

– Response: –

200 OK
Server:  Marvell-WM
Connection:  close
Transfer-Encoding:  chunked
Content-Type:  application/json

{"ok":null,"id":4}

5. Resume the robots clean job:
(Replace 192.168.10.135 with your robots IP address)
(See comment of Step 2 for the Authorization header)

POST https://192.168.10.135/umi
Content-Type: application/json
Connection: close
User-Agent: aspen%20production/2618 CFNetwork/758.3.15 Darwin/15.4.0
Content-Encoding: identity
Accept: */*
Accept-Language: en-us
Host: 192.168.10.135
content-length: 50
Authorization: Basic dXNlcjphMWJjZEVGMjNHaElqNEtM

{"do":"set","args":["cmd" {"op":"resume"}],"id":5}

– Response: –

200 OK
Server:  Marvell-WM
Connection:  close
Transfer-Encoding:  chunked
Content-Type:  application/json

{"ok":null,"id":5}

6. Stop the robots clean job:
(Replace 192.168.10.135 with your robots IP address)
(See comment of Step 2 for the Authorization header)

POST https://192.168.10.135/umi
Content-Type: application/json
Connection: close
User-Agent: aspen%20production/2618 CFNetwork/758.3.15 Darwin/15.4.0
Content-Encoding: identity
Accept: */*
Accept-Language: en-us
Host: 192.168.10.135
content-length: 48
Authorization: Basic dXNlcjphMWJjZEVGMjNHaElqNEtM

{"do":"set","args":["cmd" {"op":"stop"}],"id":6}

– Response: –

200 OK
Server:  Marvell-WM
Connection:  close
Transfer-Encoding:  chunked
Content-Type:  application/json

{"ok":null,"id":6}

7. Force the robot to return back to its home base:
(Replace 192.168.10.135 with your robots IP address)
(See comment of Step 2 for the Authorization header)

POST https://192.168.10.135/umi
Content-Type: application/json
Connection: close
User-Agent: aspen%20production/2618 CFNetwork/758.3.15 Darwin/15.4.0
Content-Encoding: identity
Accept: */*
Accept-Language: en-us
Host: 192.168.10.135
content-length: 48
Authorization: Basic dXNlcjphMWJjZEVGMjNHaElqNEtM

{"do":"set","args":["cmd" {"op":"dock"}],"id":7}

– Response: –

200 OK
Server:  Marvell-WM
Connection:  close
Transfer-Encoding:  chunked
Content-Type:  application/json

{"ok":null,"id":7}
4 Likes