@@ -65,6 +65,8 @@ static struct bt_conn_auth_info_cb auth_info_cb;
65
65
66
66
#define KEY_STR_LEN 33
67
67
68
+ #define ADV_DATA_DELIMITER ", "
69
+
68
70
/*
69
71
* Based on the maximum number of parameters for HCI_LE_Generate_DHKey
70
72
* See BT Core Spec V5.2 Vol. 4, Part E, section 7.8.37
@@ -193,65 +195,134 @@ static bool data_cb(struct bt_data *data, void *user_data)
193
195
}
194
196
}
195
197
196
- static void print_data_set (uint8_t type , uint8_t set_value_len ,
198
+ static void print_data_hex (const uint8_t * data , uint8_t len , enum shell_vt100_color color )
199
+ {
200
+ if (len == 0 )
201
+ return ;
202
+
203
+ shell_fprintf (ctx_shell , color , "0x" );
204
+ /* Reverse the byte order when printing as advertising data is LE
205
+ * and the MSB should be first in the printed output.
206
+ */
207
+ for (int16_t i = len - 1 ; i >= 0 ; i -- ) {
208
+ shell_fprintf (ctx_shell , color , "%02x" , data [i ]);
209
+ }
210
+ }
211
+
212
+ static void print_data_set (uint8_t set_value_len ,
197
213
const uint8_t * scan_data , uint8_t scan_data_len )
198
214
{
199
- uint8_t min_value_len = MIN ( set_value_len , scan_data_len ) ;
215
+ uint8_t idx = 0 ;
200
216
201
- shell_fprintf (ctx_shell , SHELL_INFO , "%*sType 0x%02x: " ,
202
- strlen (scan_response_label ), "" ,
203
- type );
204
- for (uint8_t i = 0U ; i < (scan_data_len / min_value_len ); i ++ ) {
205
- if (i > 0L ) {
206
- shell_fprintf (ctx_shell , SHELL_INFO , ", " );
207
- }
217
+ if (scan_data_len == 0 || set_value_len > scan_data_len ) {
218
+ return ;
219
+ }
208
220
209
- shell_fprintf (ctx_shell , SHELL_INFO , "0x" );
210
- for (uint8_t j = 0U ; j < min_value_len ; j ++ ) {
211
- shell_fprintf (ctx_shell , SHELL_INFO , "%02x" ,
212
- scan_data [i * min_value_len + j ]);
221
+ do {
222
+ if (idx > 0 ) {
223
+ shell_fprintf (ctx_shell , SHELL_INFO , ADV_DATA_DELIMITER );
213
224
}
214
- }
215
225
216
- shell_fprintf (ctx_shell , SHELL_INFO , "\n" );
226
+ print_data_hex (& scan_data [idx ], set_value_len , SHELL_INFO );
227
+ idx += set_value_len ;
228
+ } while (idx + set_value_len <= scan_data_len );
229
+
230
+ if (idx < scan_data_len ) {
231
+ shell_fprintf (ctx_shell , SHELL_WARNING , " Excess data: " );
232
+ print_data_hex (& scan_data [idx ], scan_data_len - idx , SHELL_WARNING );
233
+ }
217
234
}
218
235
219
236
static bool data_verbose_cb (struct bt_data * data , void * user_data )
220
237
{
238
+ shell_fprintf (ctx_shell , SHELL_INFO , "%*sType 0x%02x: " ,
239
+ strlen (scan_response_label ), "" , data -> type );
240
+
221
241
switch (data -> type ) {
222
242
case BT_DATA_UUID16_SOME :
223
243
case BT_DATA_UUID16_ALL :
224
244
case BT_DATA_SOLICIT16 :
245
+ print_data_set (BT_UUID_SIZE_16 , data -> data , data -> data_len );
246
+ break ;
225
247
case BT_DATA_SVC_DATA16 :
226
- print_data_set (data -> type , 2 , data -> data , data -> data_len );
248
+ /* Data starts with a UUID16 (2 bytes),
249
+ * the rest is unknown and printed as single bytes
250
+ */
251
+ if (data -> data_len < BT_UUID_SIZE_16 ) {
252
+ shell_fprintf (ctx_shell , SHELL_WARNING ,
253
+ "BT_DATA_SVC_DATA16 data length too short (%u)" ,
254
+ data -> data_len );
255
+ break ;
256
+ }
257
+ print_data_set (BT_UUID_SIZE_16 , data -> data , BT_UUID_SIZE_16 );
258
+ if (data -> data_len > BT_UUID_SIZE_16 ) {
259
+ shell_fprintf (ctx_shell , SHELL_INFO , ADV_DATA_DELIMITER );
260
+ print_data_set (1 , data -> data + BT_UUID_SIZE_16 ,
261
+ data -> data_len - BT_UUID_SIZE_16 );
262
+ }
227
263
break ;
228
264
case BT_DATA_UUID32_SOME :
229
265
case BT_DATA_UUID32_ALL :
266
+ print_data_set (BT_UUID_SIZE_32 , data -> data , data -> data_len );
267
+ break ;
230
268
case BT_DATA_SVC_DATA32 :
231
- print_data_set (data -> type , 4 , data -> data , data -> data_len );
269
+ /* Data starts with a UUID32 (4 bytes),
270
+ * the rest is unknown and printed as single bytes
271
+ */
272
+ if (data -> data_len < BT_UUID_SIZE_32 ) {
273
+ shell_fprintf (ctx_shell , SHELL_WARNING ,
274
+ "BT_DATA_SVC_DATA32 data length too short (%u)" ,
275
+ data -> data_len );
276
+ break ;
277
+ }
278
+ print_data_set (BT_UUID_SIZE_32 , data -> data , BT_UUID_SIZE_32 );
279
+ if (data -> data_len > BT_UUID_SIZE_32 ) {
280
+ shell_fprintf (ctx_shell , SHELL_INFO , ADV_DATA_DELIMITER );
281
+ print_data_set (1 , data -> data + BT_UUID_SIZE_32 ,
282
+ data -> data_len - BT_UUID_SIZE_32 );
283
+ }
232
284
break ;
233
285
case BT_DATA_UUID128_SOME :
234
286
case BT_DATA_UUID128_ALL :
235
287
case BT_DATA_SOLICIT128 :
288
+ print_data_set (BT_UUID_SIZE_128 , data -> data , data -> data_len );
289
+ break ;
236
290
case BT_DATA_SVC_DATA128 :
237
- print_data_set (data -> type , 16 , data -> data , data -> data_len );
291
+ /* Data starts with a UUID128 (16 bytes),
292
+ * the rest is unknown and printed as single bytes
293
+ */
294
+ if (data -> data_len < BT_UUID_SIZE_128 ) {
295
+ shell_fprintf (ctx_shell , SHELL_WARNING ,
296
+ "BT_DATA_SVC_DATA128 data length too short (%u)" ,
297
+ data -> data_len );
298
+ break ;
299
+ }
300
+ print_data_set (BT_UUID_SIZE_128 , data -> data , BT_UUID_SIZE_128 );
301
+ if (data -> data_len > BT_UUID_SIZE_128 ) {
302
+ shell_fprintf (ctx_shell , SHELL_INFO , ADV_DATA_DELIMITER );
303
+ print_data_set (1 , data -> data + BT_UUID_SIZE_128 ,
304
+ data -> data_len - BT_UUID_SIZE_128 );
305
+ }
238
306
break ;
239
307
case BT_DATA_NAME_SHORTENED :
240
308
case BT_DATA_NAME_COMPLETE :
241
309
case BT_DATA_BROADCAST_NAME :
242
- shell_info (ctx_shell , "%*sType 0x%02x: %.*s" ,
243
- strlen (scan_response_label ), "" ,
244
- data -> type , data -> data_len , data -> data );
310
+ shell_fprintf (ctx_shell , SHELL_INFO , "%.*s" , data -> data_len , data -> data );
245
311
break ;
246
312
case BT_DATA_PUB_TARGET_ADDR :
247
313
case BT_DATA_RAND_TARGET_ADDR :
248
314
case BT_DATA_LE_BT_DEVICE_ADDRESS :
249
- print_data_set (data -> type , BT_ADDR_SIZE , data -> data , data -> data_len );
315
+ print_data_set (BT_ADDR_SIZE , data -> data , data -> data_len );
316
+ break ;
317
+ case BT_DATA_CSIS_RSI :
318
+ print_data_set (3 , data -> data , data -> data_len );
250
319
break ;
251
320
default :
252
- print_data_set (data -> type , 1 , data -> data , data -> data_len );
321
+ print_data_set (1 , data -> data , data -> data_len );
253
322
}
254
323
324
+ shell_fprintf (ctx_shell , SHELL_INFO , "\n" );
325
+
255
326
return true;
256
327
}
257
328
0 commit comments