Skip to content
David Gray edited this page Dec 4, 2016 · 4 revisions

NOTE: This page is a work in progress. Details will be wrong, things will change.

The Orvibo Kepler is a Kickstarter-funded gas and CO2 detector. It was built by a smaller team at Orvibo, as a "20% project" of sorts, to test if such a product would be economically viable. It must be, because you can now buy the unit at GearBest for roughly $130 AUD / $95 USD

Reviews of the Android app are almost entirely negative. I got my device (which I purchased from a disgruntled Kickstarter backer) set up only once (after 40+ attempts). Every other time it refuses to respond via the app. Once I did get it set up, the app still refused to respond, but the Kepler responded to replayed requests instantly.

The protocol has changed a fair bit compared to the S10 / S20 and AllOne devices:

  • The header has remained similar, still requiring 6864 and a two bytes for packet length, but the command ID no longer follows (instead, it's a protocol type identifier, which seems to be "pk" or "dk").
  • The last part of the message is AES-128-ECB encrypted, and when decrypted, are JSON.
  • The private key for decrypting messages is stored in the Kepler APK. Final versions of the code will require you to extract your own key due to legal reasons
  • All communication takes place on port 9999
  • MAC address is no longer present in the message. Seems to have been replaced by UID and serial number
  • Serial number, which is present in almost (?) all messages (in the JSON part), is the current time, in milliseconds, with the first four digits removed. So if the current time in milliseconds is 1458392506765, the Serial would be 392506765
  • UID seems to be based on Java's HashSet(), though my Java knowledge is spotty at best. I need to confirm this, but the Kepler might generate its own hash and send that to the client, and expect the client to use that hash until further notice.
  • The data now has a crc32 checksum, which appears just after the magic word, packet length and protocol type. Use this code to calculate the checksum:
    • crc = crc32(new Buffer(dec, 'hex')).toString('hex')
    • Where dec is the utf8 version of the encrypted hex, crc32'd then outputted as a hex string. See tools/keplercode.js for information
Clone this wiki locally