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
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");
}

参考