Zephyr开发 之 扫描解析

本文基于Zephyr开发 之 蓝牙扫描

1
vim src/ble_central.c
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
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>

static void scan_cb(const bt_addr_le_t *addr, int8_t rssi, uint8_t adv_type,
struct net_buf_simple *buf);
static bool parse_cb(struct bt_data *data, void *user_data);

void ble_scan()
{
struct bt_le_scan_param scan_param = {
.type = BT_HCI_LE_SCAN_PASSIVE,
.options = BT_LE_SCAN_OPT_NONE,
.interval = 0x0010,
.window = 0x0010,
};
int err;

err = bt_enable(NULL);
if (err)
{
printk("[Bluetooth] init failed (err %d)\n", err);
return;
}

err = bt_le_scan_start(&scan_param, scan_cb);
if (err)
{
printk("[Bluetooth] start scanning failed (err %d)\n", err);
return;
}
}

static void scan_cb(const bt_addr_le_t *addr, int8_t rssi, uint8_t adv_type,
struct net_buf_simple *buf)
{
bt_data_parse(buf, parse_cb, (void *)addr);
}

static bool parse_cb(struct bt_data *data, void *user_data)
{
bt_addr_le_t *addr = (bt_addr_le_t *)user_data;

switch (data->type)
{
case BT_DATA_NAME_COMPLETE:
printk("ble addr: ");
printk("%x:", addr->a.val[5]);
printk("%x:", addr->a.val[4]);
printk("%x:", addr->a.val[3]);
printk("%x:", addr->a.val[2]);
printk("%x:", addr->a.val[1]);
printk("%x", addr->a.val[0]);
printk("\n");

printk("ble name: ");
for (int i = 0; i < data->data_len; i++)
{
printk("%c", data->data[i]);
}
printk("\n");

return false;
default:
return true;
}
}