blob: 29eb6cc22d029d9c63fa1cf6076f47fb93575c92 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
#ifndef OSM_PROTOCOL_H
#define OSM_PROTOCOL_H
#include <stdint.h>
// The types used in connections
/*
* Before signatures can be validated, we need to get
* a public verification key, along with the firendly
* name and type of device.
*
* These are those initial connection frames.
*/
/// The magic number for init frames
extern const char OSM_MAGIC_INIT[4];
/// The magic number for normal frames
extern const char OSM_MAGIC_FRAME[4];
/**
* The init frame from the controller
* includes the uuid of the sender and the public
* key the sender will use to sign messages (up to 4096 bytes)
*
* The paired device will send one back at the end of the pairing
* process. In the end frame, the pubkey is encrypted by the pairing code.
*/
typedef struct {
uint8_t magic[4];
uint8_t uuid[8];
uint8_t keytype;
uint16_t keylen;
uint8_t pubkey[4096];
} OSMInitFrame;
/**
* Represents the format of the pairing code type that the
* initializing device will give the user.
*/
typedef struct {
uint8_t magic[4];
uint8_t uuid[8];
} OSMInitPairfmt;
/**
* All OSM messages are at most 2048 bytes long and include a gpg signature at
* the start of the data to validate the sender. The signature length is determined based on
* the signing key of the sender.
*/
typedef struct {
uint8_t magic[4]; // magic number
uint8_t uuid[8]; // device that this message is from
uint8_t sub_uuid[8]; // sub device that this message is from
uint8_t frame_type; // type of frame
uint8_t data[2048]; // message data
} OSMFrame;
/*
* Once the data has been validated, it is one of the following frame types
*/
/// Result of previously sent frame, with information requested (if any)
#define OSM_FT_RES 0
/// Set a sensor/config value on the device
#define OSM_FT_SET 1
/// Get a sensor/config value from the device
#define OSM_FT_GET 2
/// Send data
#define OSM_FT_DAT 3
/// Setup new stream (value out to device FROM THIS MACHINE)
#define OSM_FT_SVO 4
/// Setup new stream (value in from device TO THIS MACHINE)
#define OSM_FT_SVI 5
/// Close stream
#define OSM_FT_SCL 6
/**
* Result of a sent frame
*/
typedef struct {
uint8_t res_type; // the type of frame sent
uint8_t a;
} OSMResFrame;
typedef struct {
uint8_t num_set;
uint8_t pairs[2047];
} OSMSetFrame;
typedef struct {
uint8_t control_id[8]; // The ID of the control we are setting the value on
uint8_t val_type; // The data type of the value (or 0 for future data frames)
uint8_t value[8]; // The new value for the control, or the data frame number we will next use
} OSMSetControl;
#endif
|