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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| #include <bluetooth/bluetooth.h> #include <bluetooth/hci.h> #include <kernel.h>
static struct k_delayed_work g_work;
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); static void stop_cb(struct k_work *work);
static K_DELAYED_WORK_DEFINE(g_work, stop_cb);
void ble_scan() { int err; struct bt_le_scan_param scan_param = { .type = BT_HCI_LE_SCAN_PASSIVE, .options = BT_LE_SCAN_OPT_NONE, .interval = 0x0010, .window = 0x0010, };
k_delayed_work_submit(&g_work, K_MSEC(500));
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; }
printk("[Bluetooth] start scanning\n"); }
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; } }
static void stop_cb(struct k_work *work) { bt_le_scan_stop(); printk("[Bluetooth] stop scanning\n"); }
|