59
59
#define FMT_KILOGRAM_UUID 0xA010
60
60
#define FMT_HANGING_UUID 0xA011
62
static guint timeout_id = 0;
64
static gboolean change_battery_state(gpointer user_data)
66
static uint8_t state = 0x05;
70
/* Battery state is being increased every 10 seconds. */
72
sdp_uuid16_create(&uuid, BATTERY_STATE_UUID);
73
attrib_db_update(0x0110, &uuid, atval, 1);
78
62
static int register_attributes(void)
80
64
const char *devname = "Example Device";
101
85
u16 = htons(GENERIC_ACCESS_PROFILE_ID);
102
86
atval[0] = u16 >> 8;
104
attrib_db_add(0x0001, &uuid, atval, 2);
88
attrib_db_add(0x0001, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 2);
106
90
/* GAP service: device name characteristic */
107
91
sdp_uuid16_create(&uuid, GATT_CHARAC_UUID);
112
96
atval[3] = u16 >> 8;
114
attrib_db_add(0x0004, &uuid, atval, 5);
98
attrib_db_add(0x0004, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 5);
116
100
/* GAP service: device name attribute */
117
101
sdp_uuid16_create(&uuid, GATT_CHARAC_DEVICE_NAME);
118
102
len = strlen(devname);
119
103
strncpy((char *) atval, devname, len);
120
attrib_db_add(0x0006, &uuid, atval, len);
104
attrib_db_add(0x0006, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, len);
122
106
/* GATT service: primary service definition */
123
107
sdp_uuid16_create(&uuid, GATT_PRIM_SVC_UUID);
124
108
u16 = htons(GENERIC_ATTRIB_PROFILE_ID);
125
109
atval[0] = u16 >> 8;
127
attrib_db_add(0x0010, &uuid, atval, 2);
111
attrib_db_add(0x0010, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 2);
129
113
/* GATT service: attributes opcodes characteristic */
130
114
sdp_uuid16_create(&uuid, GATT_CHARAC_UUID);
135
119
atval[3] = u16 >> 8;
137
attrib_db_add(0x0011, &uuid, atval, 5);
121
attrib_db_add(0x0011, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 5);
139
123
/* GATT service: attribute opcodes supported */
140
124
sdp_uuid16_create(&uuid, OPCODES_SUPPORTED_UUID);
143
attrib_db_add(0x0012, &uuid, atval, 2);
127
attrib_db_add(0x0012, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 2);
145
129
/* Battery state service: primary service definition */
146
130
sdp_uuid16_create(&uuid, GATT_PRIM_SVC_UUID);
147
131
u16 = htons(BATTERY_STATE_SVC_UUID);
148
132
atval[0] = u16 >> 8;
150
attrib_db_add(0x0100, &uuid, atval, 2);
134
attrib_db_add(0x0100, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 2);
152
136
/* Battery: battery state characteristic */
153
137
sdp_uuid16_create(&uuid, GATT_CHARAC_UUID);
158
142
atval[3] = u16 >> 8;
160
attrib_db_add(0x0106, &uuid, atval, 5);
144
attrib_db_add(0x0106, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 5);
162
146
/* Battery: battery state attribute */
163
147
sdp_uuid16_create(&uuid, BATTERY_STATE_UUID);
165
attrib_db_add(0x0110, &uuid, atval, 1);
149
attrib_db_add(0x0110, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 1);
167
151
/* Battery: Client Characteristic Configuration */
168
152
sdp_uuid16_create(&uuid, GATT_CLIENT_CHARAC_CFG_UUID);
171
attrib_db_add(0x0111, &uuid, atval, 2);
173
timeout_id = g_timeout_add_seconds(10, change_battery_state, NULL);
155
attrib_db_add(0x0111, &uuid, ATT_NONE, ATT_AUTHENTICATION, atval, 2);
175
157
/* Thermometer: primary service definition */
176
158
sdp_uuid16_create(&uuid, GATT_PRIM_SVC_UUID);
177
159
u16 = htons(THERM_HUMIDITY_SVC_UUID);
178
160
atval[0] = u16 >> 8;
180
attrib_db_add(0x0200, &uuid, atval, 2);
162
attrib_db_add(0x0200, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 2);
182
164
/* Thermometer: Include */
183
165
sdp_uuid16_create(&uuid, GATT_INCLUDE_UUID);
189
171
atval[4] = u16 >> 8;
191
attrib_db_add(0x0201, &uuid, atval, 6);
173
attrib_db_add(0x0201, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 6);
193
175
/* Thermometer: Include */
198
attrib_db_add(0x0202, &uuid, atval, 4);
180
attrib_db_add(0x0202, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 4);
200
182
/* Thermometer: temperature characteristic */
201
183
sdp_uuid16_create(&uuid, GATT_CHARAC_UUID);
206
188
atval[3] = u16 >> 8;
208
attrib_db_add(0x0203, &uuid, atval, 5);
190
attrib_db_add(0x0203, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 5);
210
192
/* Thermometer: temperature characteristic value */
211
193
sdp_uuid16_create(&uuid, TEMPERATURE_UUID);
214
attrib_db_add(0x0204, &uuid, atval, 2);
196
attrib_db_add(0x0204, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 2);
216
198
/* Thermometer: temperature characteristic format */
217
199
sdp_uuid16_create(&uuid, GATT_CHARAC_FMT_UUID);
224
206
u16 = htons(FMT_OUTSIDE_UUID);
225
207
atval[5] = u16 >> 8;
227
attrib_db_add(0x0205, &uuid, atval, 7);
209
attrib_db_add(0x0205, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 7);
229
211
/* Thermometer: characteristic user description */
230
212
sdp_uuid16_create(&uuid, GATT_CHARAC_USER_DESC_UUID);
231
213
len = strlen(desc_out_temp);
232
214
strncpy((char *) atval, desc_out_temp, len);
233
attrib_db_add(0x0206, &uuid, atval, len);
215
attrib_db_add(0x0206, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, len);
235
217
/* Thermometer: relative humidity characteristic */
236
218
sdp_uuid16_create(&uuid, GATT_CHARAC_UUID);
241
223
atval[3] = u16 >> 8;
243
attrib_db_add(0x0210, &uuid, atval, 5);
225
attrib_db_add(0x0210, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 5);
245
227
/* Thermometer: relative humidity value */
246
228
sdp_uuid16_create(&uuid, RELATIVE_HUMIDITY_UUID);
248
attrib_db_add(0x0212, &uuid, atval, 1);
230
attrib_db_add(0x0212, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 1);
250
232
/* Thermometer: relative humidity characteristic format */
251
233
sdp_uuid16_create(&uuid, GATT_CHARAC_FMT_UUID);
260
242
u16 = htons(FMT_OUTSIDE_UUID);
261
243
atval[6] = u16 >> 8;
263
attrib_db_add(0x0213, &uuid, atval, 8);
245
attrib_db_add(0x0213, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 8);
265
247
/* Thermometer: characteristic user description */
266
248
sdp_uuid16_create(&uuid, GATT_CHARAC_USER_DESC_UUID);
267
249
len = strlen(desc_out_hum);
268
250
strncpy((char *) atval, desc_out_hum, len);
269
attrib_db_add(0x0214, &uuid, atval, len);
251
attrib_db_add(0x0214, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, len);
271
253
/* Secondary Service: Manufacturer Service */
272
254
sdp_uuid16_create(&uuid, GATT_SND_SVC_UUID);
273
255
u16 = htons(MANUFACTURER_SVC_UUID);
274
256
atval[0] = u16 >> 8;
276
attrib_db_add(0x0500, &uuid, atval, 2);
258
attrib_db_add(0x0500, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 2);
278
260
/* Manufacturer name characteristic definition */
279
261
sdp_uuid16_create(&uuid, GATT_CHARAC_UUID);
284
266
atval[3] = u16 >> 8;
286
attrib_db_add(0x0501, &uuid, atval, 5);
268
attrib_db_add(0x0501, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 5);
288
270
/* Manufacturer name characteristic value */
289
271
sdp_uuid16_create(&uuid, MANUFACTURER_NAME_UUID);
290
272
len = strlen(manufacturer_name1);
291
273
strncpy((char *) atval, manufacturer_name1, len);
292
attrib_db_add(0x0502, &uuid, atval, len);
274
attrib_db_add(0x0502, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, len);
294
276
/* Manufacturer serial number characteristic */
295
277
sdp_uuid16_create(&uuid, GATT_CHARAC_UUID);
300
282
atval[3] = u16 >> 8;
302
attrib_db_add(0x0503, &uuid, atval, 5);
284
attrib_db_add(0x0503, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 5);
304
286
/* Manufacturer serial number characteristic value */
305
287
sdp_uuid16_create(&uuid, MANUFACTURER_SERIAL_UUID);
306
288
len = strlen(serial1);
307
289
strncpy((char *) atval, serial1, len);
308
attrib_db_add(0x0504, &uuid, atval, len);
290
attrib_db_add(0x0504, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, len);
310
292
/* Secondary Service: Manufacturer Service */
311
293
sdp_uuid16_create(&uuid, GATT_SND_SVC_UUID);
312
294
u16 = htons(MANUFACTURER_SVC_UUID);
313
295
atval[0] = u16 >> 8;
315
attrib_db_add(0x0505, &uuid, atval, 2);
297
attrib_db_add(0x0505, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 2);
317
299
/* Manufacturer name characteristic definition */
318
300
sdp_uuid16_create(&uuid, GATT_CHARAC_UUID);
323
305
atval[3] = u16 >> 8;
325
attrib_db_add(0x0506, &uuid, atval, 5);
307
attrib_db_add(0x0506, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 5);
327
309
/* Secondary Service: Vendor Specific Service */
328
310
sdp_uuid16_create(&uuid, GATT_SND_SVC_UUID);
329
311
u16 = htons(VENDOR_SPECIFIC_SVC_UUID);
330
312
atval[0] = u16 >> 8;
332
attrib_db_add(0x0550, &uuid, atval, 2);
314
attrib_db_add(0x0550, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 2);
334
316
/* Vendor Specific Type characteristic definition */
335
317
sdp_uuid16_create(&uuid, GATT_CHARAC_UUID);
340
322
atval[3] = u16 >> 8;
342
attrib_db_add(0x0560, &uuid, atval, 5);
324
attrib_db_add(0x0560, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 5);
344
326
/* Vendor Specific Type characteristic value */
345
327
sdp_uuid16_create(&uuid, VENDOR_SPECIFIC_TYPE_UUID);
352
attrib_db_add(0x0568, &uuid, atval, 6);
334
attrib_db_add(0x0568, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 6);
354
336
/* Manufacturer name attribute */
355
337
sdp_uuid16_create(&uuid, MANUFACTURER_NAME_UUID);
356
338
len = strlen(manufacturer_name2);
357
339
strncpy((char *) atval, manufacturer_name2, len);
358
attrib_db_add(0x0507, &uuid, atval, len);
340
attrib_db_add(0x0507, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, len);
360
342
/* Characteristic: serial number */
361
343
sdp_uuid16_create(&uuid, GATT_CHARAC_UUID);
366
348
atval[3] = u16 >> 8;
368
attrib_db_add(0x0508, &uuid, atval, 5);
350
attrib_db_add(0x0508, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 5);
370
352
/* Serial number characteristic value */
371
353
sdp_uuid16_create(&uuid, MANUFACTURER_SERIAL_UUID);
372
354
len = strlen(serial2);
373
355
strncpy((char *) atval, serial2, len);
374
attrib_db_add(0x0509, &uuid, atval, len);
356
attrib_db_add(0x0509, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, len);
376
358
/* Weight service: primary service definition */
377
359
sdp_uuid16_create(&uuid, GATT_PRIM_SVC_UUID);
378
360
memcpy(atval, prim_weight_uuid, 16);
379
attrib_db_add(0x0680, &uuid, atval, 16);
361
attrib_db_add(0x0680, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 16);
381
363
/* Weight: include */
382
364
sdp_uuid16_create(&uuid, GATT_INCLUDE_UUID);
388
370
atval[4] = u16 >> 8;
390
attrib_db_add(0x0681, &uuid, atval, 6);
372
attrib_db_add(0x0681, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 6);
392
374
/* Weight: characteristic */
393
375
sdp_uuid16_create(&uuid, GATT_CHARAC_UUID);
397
379
memcpy(atval + 3, char_weight_uuid, 16);
398
attrib_db_add(0x0682, &uuid, atval, 19);
380
attrib_db_add(0x0682, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 19);
400
382
/* Weight: characteristic value */
401
383
sdp_uuid128_create(&uuid, char_weight_uuid);
406
attrib_db_add(0x0683, &uuid, atval, 4);
388
attrib_db_add(0x0683, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 4);
408
390
/* Weight: characteristic format */
409
391
sdp_uuid16_create(&uuid, GATT_CHARAC_FMT_UUID);
418
400
u16 = htons(FMT_HANGING_UUID);
419
401
atval[6] = u16 >> 8;
421
attrib_db_add(0x0684, &uuid, atval, 8);
403
attrib_db_add(0x0684, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, 8);
423
405
/* Weight: characteristic user description */
424
406
sdp_uuid16_create(&uuid, GATT_CHARAC_USER_DESC_UUID);
425
407
len = strlen(desc_weight);
426
408
strncpy((char *) atval, desc_weight, len);
427
attrib_db_add(0x0685, &uuid, atval, len);
409
attrib_db_add(0x0685, &uuid, ATT_NONE, ATT_NOT_PERMITTED, atval, len);