11#if DETWS_ENABLE_BLE_GATT
15size_t att_read_req(uint16_t handle, uint8_t *out,
size_t cap)
19 out[0] = AttOp::ATT_OP_READ_REQ;
20 out[1] = (uint8_t)handle;
21 out[2] = (uint8_t)(handle >> 8);
25size_t att_read_rsp(
const uint8_t *val,
size_t vlen, uint8_t *out,
size_t cap)
27 if (!out || (vlen && !val) || cap < 1 + vlen)
29 out[0] = AttOp::ATT_OP_READ_RSP;
31 memcpy(out + 1, val, vlen);
35static size_t att_handle_value(uint8_t op, uint16_t handle,
const uint8_t *val,
size_t vlen, uint8_t *out,
size_t cap)
37 if (!out || (vlen && !val) || cap < 3 + vlen)
40 out[1] = (uint8_t)handle;
41 out[2] = (uint8_t)(handle >> 8);
43 memcpy(out + 3, val, vlen);
47size_t att_write_req(uint16_t handle,
const uint8_t *val,
size_t vlen, uint8_t *out,
size_t cap)
49 return att_handle_value(AttOp::ATT_OP_WRITE_REQ, handle, val, vlen, out, cap);
52size_t att_notify(uint16_t handle,
const uint8_t *val,
size_t vlen, uint8_t *out,
size_t cap)
54 return att_handle_value(AttOp::ATT_OP_HANDLE_VALUE_NTF, handle, val, vlen, out, cap);
57size_t att_error_rsp(uint8_t req_op, uint16_t handle, uint8_t error, uint8_t *out,
size_t cap)
61 out[0] = AttOp::ATT_OP_ERROR_RSP;
63 out[2] = (uint8_t)handle;
64 out[3] = (uint8_t)(handle >> 8);
69bool att_parse(
const uint8_t *pdu,
size_t len, AttPdu *out)
71 if (!pdu || !out || len < 1)
82 case AttOp::ATT_OP_ERROR_RSP:
86 out->handle = (uint16_t)(pdu[2] | (pdu[3] << 8));
89 case AttOp::ATT_OP_READ_REQ:
92 out->handle = (uint16_t)(pdu[1] | (pdu[2] << 8));
94 case AttOp::ATT_OP_READ_RSP:
98 out->value_len = len - 1;
101 case AttOp::ATT_OP_WRITE_REQ:
102 case AttOp::ATT_OP_HANDLE_VALUE_NTF:
105 out->handle = (uint16_t)(pdu[1] | (pdu[2] << 8));
108 out->value = pdu + 3;
109 out->value_len = len - 3;
112 case AttOp::ATT_OP_WRITE_RSP:
129void put(Buf *b,
const char *s)
133 size_t sl = strnlen(s, b->cap + 1);
134 if (b->len + sl >= b->cap)
139 memcpy(b->p + b->len, s, sl);
143void put_u(Buf *b, uint32_t v)
149 t[n++] = (char)(
'0' + v % 10);
153 for (
int i = 0; i < n; i++)
159void put_hex16(Buf *b, uint16_t v)
161 char t[7] =
"0x0000";
162 static const char *H =
"0123456789abcdef";
163 for (
int i = 0; i < 4; i++)
164 t[2 + i] = H[(v >> ((3 - i) * 4)) & 0xF];
169size_t gatt_char_json(
const GattChar *chars,
size_t n,
char *out,
size_t cap)
171 if (!out || cap == 0 || (n && !chars))
173 Buf b = {out, cap, 0,
true};
175 for (
size_t i = 0; i < n; i++)
179 put(&b,
"{\"handle\":");
180 put_u(&b, chars[i].handle);
181 put(&b,
",\"uuid\":\"");
182 put_hex16(&b, chars[i].uuid);
183 put(&b,
"\",\"props\":");
184 put_u(&b, chars[i].props);
Bluetooth ATT protocol codec + GATT characteristic bridge (DETWS_ENABLE_BLE_GATT).