When the Bluetooth central samples in an open air environment it is very likely that there are multiple devices nearby with a received signal strength stronger than -70 dBm. To avoid connecting to the wrong device, make the check stricter. For tests using those samples, the NtNcable attenuation is changed from the default 60 dBm to 40 dBm to satisfy the new requirement. Signed-off-by: Rubin Gerritsen <rubin.gerritsen@nordicsemi.no>
139 lines
2.6 KiB
C
139 lines
2.6 KiB
C
/* main.c - Application main entry point */
|
|
|
|
/*
|
|
* Copyright (c) 2015-2016 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <zephyr/types.h>
|
|
#include <stddef.h>
|
|
#include <errno.h>
|
|
#include <zephyr/kernel.h>
|
|
#include <zephyr/sys/printk.h>
|
|
|
|
#include <zephyr/bluetooth/bluetooth.h>
|
|
#include <zephyr/bluetooth/hci.h>
|
|
#include <zephyr/bluetooth/conn.h>
|
|
#include <zephyr/bluetooth/uuid.h>
|
|
#include <zephyr/bluetooth/gatt.h>
|
|
#include <zephyr/sys/byteorder.h>
|
|
|
|
static void start_scan(void);
|
|
|
|
static struct bt_conn *default_conn;
|
|
|
|
static void device_found(const bt_addr_le_t *addr, int8_t rssi, uint8_t type,
|
|
struct net_buf_simple *ad)
|
|
{
|
|
char addr_str[BT_ADDR_LE_STR_LEN];
|
|
int err;
|
|
|
|
if (default_conn) {
|
|
return;
|
|
}
|
|
|
|
/* We're only interested in connectable events */
|
|
if (type != BT_GAP_ADV_TYPE_ADV_IND &&
|
|
type != BT_GAP_ADV_TYPE_ADV_DIRECT_IND) {
|
|
return;
|
|
}
|
|
|
|
bt_addr_le_to_str(addr, addr_str, sizeof(addr_str));
|
|
printk("Device found: %s (RSSI %d)\n", addr_str, rssi);
|
|
|
|
/* connect only to devices in close proximity */
|
|
if (rssi < -50) {
|
|
return;
|
|
}
|
|
|
|
if (bt_le_scan_stop()) {
|
|
return;
|
|
}
|
|
|
|
err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN,
|
|
BT_LE_CONN_PARAM_DEFAULT, &default_conn);
|
|
if (err) {
|
|
printk("Create conn to %s failed (%d)\n", addr_str, err);
|
|
start_scan();
|
|
}
|
|
}
|
|
|
|
static void start_scan(void)
|
|
{
|
|
int err;
|
|
|
|
/* This demo doesn't require active scan */
|
|
err = bt_le_scan_start(BT_LE_SCAN_PASSIVE, device_found);
|
|
if (err) {
|
|
printk("Scanning failed to start (err %d)\n", err);
|
|
return;
|
|
}
|
|
|
|
printk("Scanning successfully started\n");
|
|
}
|
|
|
|
static void connected(struct bt_conn *conn, uint8_t err)
|
|
{
|
|
char addr[BT_ADDR_LE_STR_LEN];
|
|
|
|
bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));
|
|
|
|
if (err) {
|
|
printk("Failed to connect to %s (%u)\n", addr, err);
|
|
|
|
bt_conn_unref(default_conn);
|
|
default_conn = NULL;
|
|
|
|
start_scan();
|
|
return;
|
|
}
|
|
|
|
if (conn != default_conn) {
|
|
return;
|
|
}
|
|
|
|
printk("Connected: %s\n", addr);
|
|
|
|
bt_conn_disconnect(conn, BT_HCI_ERR_REMOTE_USER_TERM_CONN);
|
|
}
|
|
|
|
static void disconnected(struct bt_conn *conn, uint8_t reason)
|
|
{
|
|
char addr[BT_ADDR_LE_STR_LEN];
|
|
|
|
if (conn != default_conn) {
|
|
return;
|
|
}
|
|
|
|
bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));
|
|
|
|
printk("Disconnected: %s (reason 0x%02x)\n", addr, reason);
|
|
|
|
bt_conn_unref(default_conn);
|
|
default_conn = NULL;
|
|
|
|
start_scan();
|
|
}
|
|
|
|
BT_CONN_CB_DEFINE(conn_callbacks) = {
|
|
.connected = connected,
|
|
.disconnected = disconnected,
|
|
};
|
|
|
|
int main(void)
|
|
{
|
|
int err;
|
|
|
|
err = bt_enable(NULL);
|
|
if (err) {
|
|
printk("Bluetooth init failed (err %d)\n", err);
|
|
return 0;
|
|
}
|
|
|
|
printk("Bluetooth initialized\n");
|
|
|
|
start_scan();
|
|
return 0;
|
|
}
|