You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by cc...@apache.org on 2015/12/22 00:34:42 UTC
incubator-mynewt-larva git commit: Set advertising data.
Repository: incubator-mynewt-larva
Updated Branches:
refs/heads/master dc6289454 -> 56f1ce6f8
Set advertising data.
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/commit/56f1ce6f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/tree/56f1ce6f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/diff/56f1ce6f
Branch: refs/heads/master
Commit: 56f1ce6f8179c6c711d703de80e8a1c21d3499a5
Parents: dc62894
Author: Christopher Collins <cc...@gmail.com>
Authored: Mon Dec 21 15:33:09 2015 -0800
Committer: Christopher Collins <cc...@gmail.com>
Committed: Mon Dec 21 15:34:24 2015 -0800
----------------------------------------------------------------------
net/nimble/host/include/host/ble_gap.h | 6 ++
net/nimble/host/src/ble_gap_conn.c | 123 +++++++++++++++++++++++++---
net/nimble/host/src/ble_gap_conn.h | 18 +++-
project/hostctlrtest/src/main.c | 18 +++-
4 files changed, 146 insertions(+), 19 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/56f1ce6f/net/nimble/host/include/host/ble_gap.h
----------------------------------------------------------------------
diff --git a/net/nimble/host/include/host/ble_gap.h b/net/nimble/host/include/host/ble_gap.h
index 8cb9d0f..f91c30e 100644
--- a/net/nimble/host/include/host/ble_gap.h
+++ b/net/nimble/host/include/host/ble_gap.h
@@ -68,9 +68,15 @@ typedef void ble_gap_connect_fn(struct ble_gap_conn_event *event, void *arg);
#define BLE_GAP_DISC_MODE_LTD 2
#define BLE_GAP_DISC_MODE_GEN 3
+struct ble_gap_conn_adv_fields {
+ char *name;
+ unsigned name_is_complete:1;
+};
+
void ble_gap_conn_set_cb(ble_gap_connect_fn *cb, void *arg);
int ble_gap_conn_advertise(uint8_t discoverable_mode, uint8_t connectable_mode,
uint8_t *peer_addr, uint8_t peer_addr_type);
+int ble_gap_conn_set_adv_fields(struct ble_gap_conn_adv_fields *adv_fields);
int ble_gap_conn_gen_disc(uint32_t duration_ms);
int ble_gap_conn_direct_connect(int addr_type, uint8_t *addr);
int ble_gap_conn_terminate(uint16_t handle);
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/56f1ce6f/net/nimble/host/src/ble_gap_conn.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_gap_conn.c b/net/nimble/host/src/ble_gap_conn.c
index 1e4db01..90db35b 100644
--- a/net/nimble/host/src/ble_gap_conn.c
+++ b/net/nimble/host/src/ble_gap_conn.c
@@ -82,18 +82,16 @@
/** 10.24 seconds. */
#define BLE_GAP_GEN_DISC_SCAN_MIN (10.24 * 1000)
-#define BLE_GAP_CONN_S_MODE_NONE (-1)
-#define BLE_GAP_CONN_S_MODE_NON_DISC 0
-#define BLE_GAP_CONN_S_MODE_LTD_DISC 1
-#define BLE_GAP_CONN_S_MODE_GEN_DISC 2
-#define BLE_GAP_CONN_S_MODE_NON_CONN 3
-#define BLE_GAP_CONN_S_MODE_DIR_CONN 4
-#define BLE_GAP_CONN_S_MODE_UND_CONN 5
-#define BLE_GAP_CONN_S_MODE_MAX 6
-
#define BLE_GAP_CONN_MODE_MAX 4
#define BLE_GAP_DISC_MODE_MAX 4
+/**
+ * The maximum amount of user data that can be put into the advertising data.
+ * Six bytes are reserved at the end for the flags field and the transmit power
+ * field.
+ */
+#define BLE_GAP_CONN_ADV_DATA_LIMIT (BLE_HCI_MAX_ADV_DATA_LEN - 6)
+
static int ble_gap_conn_adv_params_tx(void *arg);
static int ble_gap_conn_adv_power_tx(void *arg);
static int ble_gap_conn_adv_data_tx(void *arg);
@@ -126,6 +124,9 @@ static uint8_t ble_gap_conn_master_addr_type;
static uint8_t ble_gap_conn_slave_addr_type;
static uint8_t ble_gap_conn_master_addr[BLE_DEV_ADDR_LEN];
static uint8_t ble_gap_conn_slave_addr[BLE_DEV_ADDR_LEN];
+static uint8_t ble_gap_conn_adv_data_len;
+static uint8_t ble_gap_conn_adv_data[BLE_HCI_MAX_ADV_DATA_LEN];
+static int8_t ble_gap_conn_tx_pwr_lvl;
static struct os_callout_func ble_gap_conn_master_timer;
static struct os_callout_func ble_gap_conn_slave_timer;
@@ -572,11 +573,53 @@ ble_gap_conn_adv_rsp_data_tx(void *arg)
static int
ble_gap_conn_adv_data_tx(void *arg)
{
- uint8_t adv_data[BLE_HCI_MAX_ADV_DATA_LEN] = { 0 }; /* XXX */
+ uint8_t flags;
+ int adv_data_len;
int rc;
+ /* Calculate the value of the flags field from the discoverable mode. */
+ flags = 0;
+ switch (ble_gap_conn_s_disc_mode) {
+ case BLE_GAP_DISC_MODE_NON:
+ break;
+
+ case BLE_GAP_DISC_MODE_LTD:
+ flags |= BLE_GAP_CONN_AD_F_DISC_LTD;
+ break;
+
+ case BLE_GAP_DISC_MODE_GEN:
+ flags |= BLE_GAP_CONN_AD_F_DISC_GEN;
+ break;
+
+ default:
+ assert(0);
+ break;
+ }
+
+ /* Encode the flags AD field if it is nonzero. */
+ if (flags != 0) {
+ adv_data_len = ble_gap_conn_adv_data_len + 3;
+ assert(adv_data_len <= BLE_HCI_MAX_ADV_DATA_LEN);
+
+ ble_gap_conn_adv_data[ble_gap_conn_adv_data_len] = 2;
+ ble_gap_conn_adv_data[ble_gap_conn_adv_data_len + 1] =
+ BLE_GAP_CONN_AD_TYPE_FLAGS;
+ ble_gap_conn_adv_data[ble_gap_conn_adv_data_len + 2] = flags;
+ } else {
+ adv_data_len = ble_gap_conn_adv_data_len;
+ }
+
+ /* Encode the transmit power AD field. */
+ adv_data_len = ble_gap_conn_adv_data_len + 3;
+ assert(adv_data_len <= BLE_HCI_MAX_ADV_DATA_LEN);
+ ble_gap_conn_adv_data[ble_gap_conn_adv_data_len] = 2;
+ ble_gap_conn_adv_data[ble_gap_conn_adv_data_len + 1] =
+ BLE_GAP_CONN_AD_TYPE_TX_PWR_LEVEL;
+ ble_gap_conn_adv_data[ble_gap_conn_adv_data_len + 2] =
+ ble_gap_conn_tx_pwr_lvl;
+
ble_hci_ack_set_callback(ble_gap_conn_adv_ack, NULL);
- rc = host_hci_cmd_le_set_adv_data(adv_data, sizeof adv_data);
+ rc = host_hci_cmd_le_set_adv_data(ble_gap_conn_adv_data, adv_data_len);
if (rc != 0) {
ble_gap_conn_slave_failed(rc);
return 1;
@@ -611,7 +654,8 @@ ble_gap_conn_adv_power_ack(struct ble_hci_ack *ack, void *arg)
return;
}
- /* XXX: Save power level value so it can be put in the adv. data. */
+ /* Save power level value so it can be put in the advertising data. */
+ ble_gap_conn_tx_pwr_lvl = power_level;
ble_gap_conn_adv_next_state();
}
@@ -765,6 +809,61 @@ ble_gap_conn_advertise(uint8_t discoverable_mode, uint8_t connectable_mode,
return 0;
}
+static int
+ble_gap_conn_set_adv_field(uint8_t type, uint8_t data_len, void *data)
+{
+ int new_len;
+
+ new_len = ble_gap_conn_adv_data_len + 2 + data_len;
+ if (new_len > BLE_GAP_CONN_ADV_DATA_LIMIT) {
+ return BLE_HS_EMSGSIZE;
+ }
+
+ ble_gap_conn_adv_data[ble_gap_conn_adv_data_len] = data_len + 1;
+ ble_gap_conn_adv_data[ble_gap_conn_adv_data_len + 1] = type;
+ memcpy(ble_gap_conn_adv_data + ble_gap_conn_adv_data_len + 2,
+ data, data_len);
+
+ ble_gap_conn_adv_data_len = new_len;
+
+ return 0;
+}
+
+/**
+ * Sets the significant part of the data in outgoing advertisements.
+ *
+ * @return 0 on success; on failure.
+ */
+int
+ble_gap_conn_set_adv_fields(struct ble_gap_conn_adv_fields *adv_fields)
+{
+ uint8_t type;
+ int name_len;
+ int rc;
+
+ ble_gap_conn_adv_data_len = 0;
+
+ if (adv_fields->name != NULL) {
+ name_len = strlen(adv_fields->name);
+ if (name_len > UINT8_MAX) {
+ return BLE_HS_EINVAL;
+ }
+
+ if (adv_fields->name_is_complete) {
+ type = BLE_GAP_CONN_AD_TYPE_COMP_NAME;
+ } else {
+ type = BLE_GAP_CONN_AD_TYPE_INCOMP_NAME;
+ }
+
+ rc = ble_gap_conn_set_adv_field(type, name_len, adv_fields->name);
+ if (rc != 0) {
+ return rc;
+ }
+ }
+
+ return 0;
+}
+
/*****************************************************************************
* $general discovery procedure *
*****************************************************************************/
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/56f1ce6f/net/nimble/host/src/ble_gap_conn.h
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_gap_conn.h b/net/nimble/host/src/ble_gap_conn.h
index ea1430e..767cff5 100644
--- a/net/nimble/host/src/ble_gap_conn.h
+++ b/net/nimble/host/src/ble_gap_conn.h
@@ -23,9 +23,21 @@ struct hci_le_conn_complete;
struct hci_disconn_complete;
struct ble_hci_ack;
-int ble_gap_conn_general_discovery(void);
-int ble_gap_conn_direct_connect(int addr_type, uint8_t *addr);
-int ble_gap_conn_direct_advertise(int addr_type, uint8_t *addr);
+#define BLE_GAP_CONN_AD_TYPE_FLAGS 0x01
+#define BLE_GAP_CONN_AD_TYPE_INCOMP_16BIT_UUIDS 0x02
+#define BLE_GAP_CONN_AD_TYPE_COMP_16BIT_UUIDS 0x03
+#define BLE_GAP_CONN_AD_TYPE_INCOMP_32BIT_UUIDS 0x04
+#define BLE_GAP_CONN_AD_TYPE_COMP_32BIT_UUIDS 0x05
+#define BLE_GAP_CONN_AD_TYPE_INCOMP_128BIT_UUIDS 0x06
+#define BLE_GAP_CONN_AD_TYPE_COMP_128BIT_UUIDS 0x07
+#define BLE_GAP_CONN_AD_TYPE_INCOMP_NAME 0x08
+#define BLE_GAP_CONN_AD_TYPE_COMP_NAME 0x09
+#define BLE_GAP_CONN_AD_TYPE_TX_PWR_LEVEL 0x0a
+#define BLE_GAP_CONN_AD_TYPE_DEVICE_CLASS 0x0b
+
+#define BLE_GAP_CONN_AD_F_DISC_LTD 0x01
+#define BLE_GAP_CONN_AD_F_DISC_GEN 0x02
+
void ble_gap_conn_rx_adv_report(struct ble_gap_conn_adv_rpt *rpt);
int ble_gap_conn_rx_conn_complete(struct hci_le_conn_complete *evt);
void ble_gap_conn_rx_disconn_complete(struct hci_disconn_complete *evt);
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/56f1ce6f/project/hostctlrtest/src/main.c
----------------------------------------------------------------------
diff --git a/project/hostctlrtest/src/main.c b/project/hostctlrtest/src/main.c
index 3c75de0..dc8c8e2 100755
--- a/project/hostctlrtest/src/main.c
+++ b/project/hostctlrtest/src/main.c
@@ -59,7 +59,9 @@ uint8_t g_host_adv_len;
static uint8_t hostctlrtest_slv_addr[6] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
//static uint8_t hostctlrtest_slv_addr[6] = {0x82, 0x6a, 0xd0, 0x48, 0xb4, 0xb0};
+#if HOSTCTLRTEST_CFG_ROLE == HOSTCTLRTEST_ROLE_INITIATOR
static uint8_t hostctlrtest_mst_addr[6] = {0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a};
+#endif
/* Create a mbuf pool of BLE mbufs */
#define MBUF_NUM_MBUFS (8)
@@ -331,12 +333,20 @@ hostctlrtest_task_handler(void *arg)
ble_gap_conn_set_cb(hostctlrtest_on_connect, NULL);
#if HOSTCTLRTEST_CFG_ROLE == HOSTCTLRTEST_ROLE_ADVERTISER
+ struct ble_gap_conn_adv_fields ad_fields;
+
hostctlrtest_register_attrs();
- console_printf("ble_gap_directed_connectable\n");
- rc = ble_gap_conn_direct_connectable(BLE_HCI_ADV_PEER_ADDR_PUBLIC,
- hostctlrtest_mst_addr);
+ console_printf("ADVERTISER\n");
+
+ ad_fields.name = "blahblah";
+ ad_fields.name_is_complete = 1;
+ rc = ble_gap_conn_set_adv_fields(&ad_fields);
+ assert(rc == 0);
+
+ rc = ble_gap_conn_advertise(BLE_GAP_DISC_MODE_NON, BLE_GAP_CONN_MODE_UND,
+ NULL, 0);
#else
- console_printf("ble_gap_direct_connection_establishment\n");
+ console_printf("INITIATOR\n");
rc = ble_gap_conn_direct_connect(BLE_HCI_ADV_PEER_ADDR_PUBLIC,
hostctlrtest_slv_addr);
#endif