* Uses protobuf with a 4 byte prefix header that encodes a 'type' and length. For length, mask the top nibble. For type, mast all but the top nibble. 0 = unencrypted, 2 = encryption setup, 1 = encrypted.

* ECDH is used to share public keys and produce a 32byte shared secret, but its truncated to 16 bytes

* a 32 byte salt and 16 byte nonce for each direction are traded

* encrypted messages have a hmac signature. The key of the signature is the salt signed using the shared secret

* messages are encrypted using aes-128-ctr in little endian (nodeJS crypto library version is big endian), the key is the nonce encrypted using the shared secret

* After encryption setup, the app requests the user tap the button. On getting the expected message, the app queries the spectacles serial number, firmware version, battery level. Then prompts the user to name the device. Device name is sent to spectacles; they enable bluetooth classic and begin advertising.