Skip to content

Commit b6fe58e

Browse files
sgbihuSidLeung
authored andcommitted
Jira 836, Enumerate non connectable Peripherals in Central scan …
Added feature: - In Central mode, the BLE library should enumerate Peripheral that are non-connectable (eg beacon). Code Mods: 1. BLEDevice.cpp: - Add the call to get Manufacturer Data info from a Peripheral. Non-connectable device may only broadcast this info. 2. BLEDevice.h: - Prototyping. 3. BLEDeviceManager.cpp: - Delete the filter about non-connectable advertisement. - Added APIs, hasManufacturerData(), setManufacturerData(), hasManufacturerData(), to gain access to adv info of non-connectable Peripherals.
1 parent 5bc2baf commit b6fe58e

File tree

4 files changed

+147
-93
lines changed

4 files changed

+147
-93
lines changed

libraries/CurieBLE/src/BLEDevice.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,17 @@ void BLEDevice::setManufacturerData(const unsigned char manufacturerData[],
133133
BLEDeviceManager::instance()->setManufacturerData(manufacturerData, manufacturerDataLength);
134134
}
135135

136+
bool BLEDevice::getManufacturerData (unsigned char* manu_data,
137+
unsigned char& manu_data_len) const
138+
{
139+
return BLEDeviceManager::instance()->getManufacturerData(this, manu_data, manu_data_len);
140+
}
141+
142+
bool BLEDevice::hasManufacturerData() const
143+
{
144+
return BLEDeviceManager::instance()->hasManufacturerData(this);
145+
}
146+
136147
void BLEDevice::setLocalName(const char *localName)
137148
{
138149
BLEDeviceManager::instance()->setLocalName(localName);

libraries/CurieBLE/src/BLEDevice.h

+5
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,11 @@ class BLEDevice
191191
void setManufacturerData(const unsigned char manufacturerData[],
192192
unsigned char manufacturerDataLength);
193193

194+
bool getManufacturerData (unsigned char* manu_data,
195+
unsigned char& manu_data_len) const;
196+
197+
bool hasManufacturerData() const;
198+
194199
/**
195200
* Set the local name that the BLE Peripheral Device advertises
196201
*

libraries/CurieBLE/src/internal/BLEDeviceManager.cpp

+119-91
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ BLEDeviceManager::BLEDeviceManager():
4141
_available_for_connect_peripheral_adv_data_len(0),
4242
_available_for_connect_peripheral_scan_rsp_data_len(0),
4343
_available_for_connect_peripheral_adv_rssi(0),
44+
_available_for_connect_peripheral_connectable(false),
4445
_connecting(false),
4546
_has_service_uuid(false),
4647
_has_service_solicit_uuid(false),
@@ -83,9 +84,12 @@ BLEDeviceManager::BLEDeviceManager():
8384
memset(_peer_scan_rsp_data_len, 0, sizeof(_peer_scan_rsp_data_len));
8485
memset(_peer_adv_rssi, 0, sizeof(_peer_adv_rssi));
8586

87+
memset(_peer_adv_connectable, 0, sizeof(_peer_adv_connectable));
88+
8689
memset(_peer_temp_adv_buffer, 0, sizeof(_peer_temp_adv_buffer));
8790
memset(_peer_temp_adv_data, 0, sizeof(_peer_temp_adv_data));
8891
memset(_peer_temp_adv_data_len, 0, sizeof(_peer_temp_adv_data_len));
92+
memset(_peer_temp_adv_connectable, 0, sizeof(_peer_adv_connectable));
8993

9094
memset(&_adv_accept_critical, 0, sizeof(_adv_accept_critical));
9195
memset(&_adv_critical_service_uuid, 0, sizeof(_adv_critical_service_uuid));
@@ -735,6 +739,44 @@ bool BLEDeviceManager::hasLocalName(const BLEDevice* device) const
735739
return retval;
736740
}
737741

742+
bool BLEDeviceManager::hasManufacturerData(const BLEDevice* device) const
743+
{
744+
if (BLEUtils::isLocalBLE(*device) == true)
745+
{
746+
return (_manufacturer_data_length != 0);
747+
}
748+
749+
const uint8_t* manufactgurer_data = NULL;
750+
uint8_t manufactgurer_data_len = 0;
751+
return getDataFromAdvertiseByType(device,
752+
BT_DATA_MANUFACTURER_DATA,
753+
manufactgurer_data,
754+
manufactgurer_data_len);
755+
}
756+
757+
bool BLEDeviceManager::getManufacturerData (const BLEDevice* device,
758+
uint8_t* manu_data,
759+
uint8_t&manu_data_len) const
760+
{
761+
if (BLEUtils::isLocalBLE(*device) == true)
762+
{
763+
return (_manufacturer_data_length != 0);
764+
}
765+
766+
const uint8_t* manufactgurer_data = NULL;
767+
uint8_t manufactgurer_data_len = 0;
768+
bool retval = getDataFromAdvertiseByType(device,
769+
BT_DATA_MANUFACTURER_DATA,
770+
manufactgurer_data,
771+
manufactgurer_data_len);
772+
if (retval)
773+
{
774+
memcpy (manu_data, manufactgurer_data, manufactgurer_data_len);
775+
manu_data_len = manufactgurer_data_len;
776+
}
777+
return retval;
778+
}
779+
738780
bool BLEDeviceManager::hasAdvertisedServiceUuid(const BLEDevice* device) const
739781
{
740782
if (BLEUtils::isLocalBLE(*device) == true)
@@ -882,50 +924,34 @@ String BLEDeviceManager::localName(const BLEDevice* device) const
882924
{
883925
return _local_name;
884926
}
885-
const uint8_t* adv_data = NULL;
886-
uint8_t adv_data_len = 0;
887-
char localname_string[BLE_MAX_ADV_SIZE];
888-
memset(localname_string, 0, sizeof(localname_string));
889-
890-
getDeviceAdvertiseBuffer(device->bt_le_address(),
891-
adv_data,
892-
adv_data_len);
893927

894-
if (NULL == adv_data) {
895-
String temp(localname_string);
896-
return temp;
928+
const uint8_t* local_name = NULL;
929+
uint8_t local_name_len = 0;
930+
String temp("");
931+
char local_name_buff[BLE_MAX_ADV_SIZE];
932+
bool retval = getDataFromAdvertiseByType(device,
933+
BT_DATA_NAME_COMPLETE,
934+
local_name,
935+
local_name_len);
936+
if (false == retval)
937+
{
938+
retval = getDataFromAdvertiseByType(device,
939+
BT_DATA_NAME_SHORTENED,
940+
local_name,
941+
local_name_len);
897942
}
898943

899-
while (adv_data_len > 1)
944+
if (true == retval)
900945
{
901-
uint8_t len = adv_data[0];
902-
uint8_t type = adv_data[1];
903-
904-
/* Check for early termination */
905-
if ((len == 0) || ((len + 1) > adv_data_len)) {
906-
break;
907-
}
908-
909-
/* Sid, 2/15/2017. Support both forms of data name.
910-
*/
911-
if (type == BT_DATA_NAME_COMPLETE ||
912-
type == BT_DATA_NAME_SHORTENED)
946+
if (local_name_len >= BLE_MAX_ADV_SIZE)
913947
{
914-
if (len >= BLE_MAX_ADV_SIZE)
915-
{
916-
len = BLE_MAX_ADV_SIZE-1;
917-
}
918-
uint8_t copy_len = len - 1;
919-
memcpy(localname_string, &adv_data[2], copy_len);
920-
localname_string[copy_len] = '\0';
921-
break;
948+
local_name_len = BLE_MAX_ADV_SIZE - 1;
922949
}
923-
924-
adv_data_len -= len + 1;
925-
adv_data += len + 1;
950+
memcpy(local_name_buff, local_name, local_name_len);
951+
local_name_buff[local_name_len] = '\0';
952+
temp = local_name_buff;
926953
}
927-
928-
String temp(localname_string);
954+
929955
return temp;
930956
}
931957

@@ -1347,8 +1373,8 @@ BLEDevice BLEDeviceManager::available()
13471373
_available_for_connect_peripheral_scan_rsp_data_len = _peer_scan_rsp_data_len[index];
13481374
_available_for_connect_peripheral_adv_data_len = _peer_adv_data_len[index];
13491375
_available_for_connect_peripheral_adv_rssi = _peer_adv_rssi[index];
1350-
1351-
pr_debug(LOG_MODULE_BLE, "%s-%d:Con addr-%s", __FUNCTION__, __LINE__, BLEUtils::macAddressBT2String(*temp).c_str());
1376+
_available_for_connect_peripheral_connectable = _peer_adv_connectable[index];
1377+
//pr_debug(LOG_MODULE_BLE, "%s-%d:Con addr-%s", __FUNCTION__, __LINE__, BLEUtils::macAddressBT2String(*temp).c_str());
13521378
_peer_adv_mill[index] -= 2000; // Set it as expired
13531379
if (_adv_duplicate_filter_enabled)
13541380
{
@@ -1362,7 +1388,8 @@ BLEDevice BLEDeviceManager::available()
13621388
bool BLEDeviceManager::setAdvertiseBuffer(const bt_addr_le_t* bt_addr,
13631389
const uint8_t *ad,
13641390
uint8_t data_len,
1365-
int8_t rssi)
1391+
int8_t rssi,
1392+
bool connectable)
13661393
{
13671394
bt_addr_le_t* temp = NULL;
13681395
uint64_t timestamp = millis();
@@ -1408,6 +1435,7 @@ bool BLEDeviceManager::setAdvertiseBuffer(const bt_addr_le_t* bt_addr,
14081435
_peer_adv_rssi[index] = rssi;
14091436
// Update the timestamp
14101437
_peer_adv_mill[index] = timestamp;
1438+
_peer_adv_connectable[index] = connectable;
14111439
retval = true;
14121440
}
14131441

@@ -1477,7 +1505,8 @@ uint8_t BLEDeviceManager::getTempAdvertiseIndexFromBuffer(const bt_addr_le_t* bt
14771505
void BLEDeviceManager::setTempAdvertiseBuffer(const bt_addr_le_t* bt_addr,
14781506
int8_t rssi,
14791507
const uint8_t *ad,
1480-
uint8_t data_len)
1508+
uint8_t data_len,
1509+
bool connectable)
14811510
{
14821511
bt_addr_le_t* temp = NULL;
14831512
uint8_t i = getTempAdvertiseIndexFromBuffer(bt_addr);
@@ -1496,6 +1525,7 @@ void BLEDeviceManager::setTempAdvertiseBuffer(const bt_addr_le_t* bt_addr,
14961525

14971526
memcpy(_peer_temp_adv_data[i], ad, data_len);
14981527
_peer_temp_adv_data_len[i] = data_len;
1528+
_peer_temp_adv_connectable[i] = connectable;
14991529

15001530
return;
15011531
}
@@ -1520,12 +1550,14 @@ void BLEDeviceManager::advertiseAcceptHandler(const bt_addr_le_t *addr,
15201550
{
15211551
const uint8_t *adv_data = ad;
15221552
uint8_t adv_data_len = data_len;
1553+
bool connectable = (BT_LE_ADV_NONCONN_IND != type);
15231554
bool update_advertise_data = true;
15241555
// The critical is accepted
15251556
// Find the oldest and expired buffer
15261557
if (BT_LE_ADV_SCAN_RSP == type)
15271558
{
1528-
pr_debug(LOG_MODULE_BLE, "%s-%d", __FUNCTION__, __LINE__);
1559+
update_advertise_data = false;
1560+
pr_debug(LOG_MODULE_BLE, "%s-%d", __FUNCTION__, __LINE__);
15291561
if (false == setScanRespBuffer(addr, ad, data_len, rssi))
15301562
{
15311563
// Find the device in the ADV temp buffer
@@ -1534,22 +1566,20 @@ void BLEDeviceManager::advertiseAcceptHandler(const bt_addr_le_t *addr,
15341566
{
15351567
adv_data = _peer_temp_adv_data[tempIndex];
15361568
adv_data_len = _peer_temp_adv_data_len[tempIndex];
1537-
}
1538-
else
1539-
{
1540-
update_advertise_data = false;
1569+
connectable = _peer_temp_adv_connectable[tempIndex];
1570+
update_advertise_data = true;
15411571
}
15421572
}
1543-
else
1544-
{
1545-
update_advertise_data = false;
1546-
}
15471573
}
15481574
pr_debug(LOG_MODULE_BLE, "%s-%d", __FUNCTION__, __LINE__);
15491575

15501576
if (true == update_advertise_data)
15511577
{
1552-
if (false == setAdvertiseBuffer(addr, adv_data, adv_data_len, rssi))
1578+
if (false == setAdvertiseBuffer(addr,
1579+
adv_data,
1580+
adv_data_len,
1581+
rssi,
1582+
connectable))
15531583
{
15541584
pr_info(LOG_MODULE_BLE, "No buffer to store the ADV\n");
15551585
}
@@ -1571,54 +1601,52 @@ void BLEDeviceManager::handleDeviceFound(const bt_addr_le_t *addr,
15711601
uint8_t real_adv_len = data_len;
15721602

15731603
/* We're only interested in connectable events */
1574-
if (type == BT_LE_ADV_IND || type == BT_LE_ADV_DIRECT_IND ||
1575-
type == BT_LE_ADV_SCAN_RSP)
1604+
//pr_debug(LOG_MODULE_BLE, "%s-%d", __FUNCTION__, __LINE__);
1605+
// Filter address
1606+
if (BLEUtils::macAddressValid(_adv_accept_device) == true &&
1607+
(memcmp(addr->val, _adv_accept_device.val, sizeof (addr->val)) != 0))
15761608
{
1577-
//pr_debug(LOG_MODULE_BLE, "%s-%d", __FUNCTION__, __LINE__);
1578-
// Filter address
1579-
if (BLEUtils::macAddressValid(_adv_accept_device) == true &&
1580-
(memcmp(addr->val, _adv_accept_device.val, sizeof (addr->val)) != 0))
1609+
pr_debug(LOG_MODULE_BLE, "%s-%d", __FUNCTION__, __LINE__);
1610+
return;
1611+
}
1612+
1613+
while (data_len > 1)
1614+
{
1615+
uint8_t len = data[0];
1616+
1617+
/* Check for early termination */
1618+
if (len == 0)
15811619
{
15821620
return;
15831621
}
1584-
1585-
while (data_len > 1)
1586-
{
1587-
uint8_t len = data[0];
15881622

1589-
/* Check for early termination */
1590-
if (len == 0)
1591-
{
1592-
return;
1593-
}
1594-
1595-
if ((len + 1) > data_len) { // Sid. KW, cannot be (data_len < 2)
1596-
pr_info(LOG_MODULE_BLE, "AD malformed\n");
1597-
return;
1598-
}
1599-
1600-
if (true == advertiseDataProc(data[1], &data[2], len - 1))
1601-
{
1602-
advertiseAcceptHandler(addr, rssi, type, ad, real_adv_len);
1603-
pr_debug(LOG_MODULE_BLE, "%s-%d: Done", __FUNCTION__, __LINE__);
1604-
return;
1605-
}
1606-
1607-
data_len -= len + 1;
1608-
data += len + 1;
1609-
}
1610-
//pr_debug(LOG_MODULE_BLE, "%s: done", __FUNCTION__);
1611-
// Doesn't accept the ADV/scan data
1612-
// Check it in the buffer
1613-
if (BT_LE_ADV_SCAN_RSP == type)
1614-
{
1615-
setScanRespBuffer(addr, ad, real_adv_len, rssi);
1623+
if ((len + 1) > data_len) { // Sid. KW, cannot be (data_len < 2)
1624+
pr_info(LOG_MODULE_BLE, "AD malformed\n");
1625+
return;
16161626
}
1617-
else
1627+
1628+
if (true == advertiseDataProc(data[1], &data[2], len - 1))
16181629
{
1619-
// Add advertise into buffer
1620-
setTempAdvertiseBuffer(addr, rssi, ad, real_adv_len);
1630+
advertiseAcceptHandler(addr, rssi, type, ad, real_adv_len);
1631+
//pr_debug(LOG_MODULE_BLE, "%s-%d: Done", __FUNCTION__, __LINE__);
1632+
return;
16211633
}
1634+
1635+
data_len -= len + 1;
1636+
data += len + 1;
1637+
}
1638+
//pr_debug(LOG_MODULE_BLE, "%s: done", __FUNCTION__);
1639+
// Doesn't accept the ADV/scan data
1640+
// Check it in the buffer
1641+
if (BT_LE_ADV_SCAN_RSP == type)
1642+
{
1643+
// Find the ADV and set response
1644+
setScanRespBuffer(addr, ad, real_adv_len, rssi);
1645+
}
1646+
else
1647+
{
1648+
// Add advertise into buffer
1649+
setTempAdvertiseBuffer(addr, rssi, ad, real_adv_len, BT_LE_ADV_NONCONN_IND != type);
16221650
}
16231651

16241652
}

0 commit comments

Comments
 (0)