11#if DETWS_ENABLE_SPARKPLUG
17#define SPB_PL_TIMESTAMP 1
18#define SPB_PL_METRICS 2
23#define SPB_MET_ALIAS 2
24#define SPB_MET_TIMESTAMP 3
25#define SPB_MET_DATATYPE 4
27#define SPB_MET_LONG 11
28#define SPB_MET_FLOAT 12
29#define SPB_MET_DOUBLE 13
30#define SPB_MET_BOOL 14
31#define SPB_MET_STRING 15
33size_t spb_build_topic(
char *buf,
size_t cap,
const char *group,
const char *message_type,
const char *edge_node,
36 if (!buf || !group || !message_type || !edge_node)
39 size_t need = 8 + strnlen(group, cap) + 1 + strnlen(message_type, cap) + 1 + strnlen(edge_node, cap);
41 need += 1 + strnlen(device, cap);
45 const char *prefix =
"spBv1.0/";
46 memcpy(buf + p, prefix, 8);
48 size_t n = strnlen(group, cap);
49 memcpy(buf + p, group, n);
52 n = strnlen(message_type, cap);
53 memcpy(buf + p, message_type, n);
56 n = strnlen(edge_node, cap);
57 memcpy(buf + p, edge_node, n);
62 n = strnlen(device, cap);
63 memcpy(buf + p, device, n);
70size_t spb_build_metric(uint8_t *buf,
size_t cap,
const SpbMetric *m)
75 pb_writer_init(&w, buf, cap);
77 pb_string(&w, SPB_MET_NAME, m->name);
79 pb_uint64(&w, SPB_MET_ALIAS, m->alias);
81 pb_uint64(&w, SPB_MET_TIMESTAMP, m->timestamp);
82 pb_uint64(&w, SPB_MET_DATATYPE, m->datatype);
85 case SpbMetricKind::SPB_M_INT:
86 pb_uint64(&w, SPB_MET_INT, m->int_value);
88 case SpbMetricKind::SPB_M_LONG:
89 pb_uint64(&w, SPB_MET_LONG, m->long_value);
91 case SpbMetricKind::SPB_M_FLOAT:
92 pb_float(&w, SPB_MET_FLOAT, m->float_value);
94 case SpbMetricKind::SPB_M_DOUBLE:
95 pb_double(&w, SPB_MET_DOUBLE, m->double_value);
97 case SpbMetricKind::SPB_M_BOOL:
98 pb_bool(&w, SPB_MET_BOOL, m->bool_value);
100 case SpbMetricKind::SPB_M_STRING:
102 pb_string(&w, SPB_MET_STRING, m->string_value);
105 return pb_writer_finish(&w);
108size_t spb_build_payload(uint8_t *buf,
size_t cap, uint64_t timestamp, uint64_t seq,
const SpbMetric *metrics,
size_t n)
110 if (!buf || (n && !metrics))
113 pb_writer_init(&w, buf, cap);
114 pb_uint64(&w, SPB_PL_TIMESTAMP, timestamp);
115 for (
size_t i = 0; i < n; i++)
121 size_t mlen = spb_build_metric(metric,
sizeof(metric), &metrics[i]);
124 pb_bytes(&w, SPB_PL_METRICS, metric, mlen);
126 pb_uint64(&w, SPB_PL_SEQ, seq);
127 return pb_writer_finish(&w);
#define DETWS_SPB_METRIC_MAX
Max serialized size of one Sparkplug B metric submessage (stack temp, bytes).
Protocol Buffers wire codec (DETWS_ENABLE_PROTOBUF) - zero-heap streaming writer.
Sparkplug B payload + topic codec (DETWS_ENABLE_SPARKPLUG) - zero-heap builder for the Eclipse Sparkp...