@@ -41,6 +41,7 @@ BLEDeviceManager::BLEDeviceManager():
41
41
_available_for_connect_peripheral_adv_data_len(0 ),
42
42
_available_for_connect_peripheral_scan_rsp_data_len(0 ),
43
43
_available_for_connect_peripheral_adv_rssi(0 ),
44
+ _available_for_connect_peripheral_connectable(false ),
44
45
_connecting(false ),
45
46
_has_service_uuid(false ),
46
47
_has_service_solicit_uuid(false ),
@@ -80,9 +81,12 @@ BLEDeviceManager::BLEDeviceManager():
80
81
memset (_peer_scan_rsp_data_len, 0 , sizeof (_peer_scan_rsp_data_len));
81
82
memset (_peer_adv_rssi, 0 , sizeof (_peer_adv_rssi));
82
83
84
+ memset (_peer_adv_connectable, 0 , sizeof (_peer_adv_connectable));
85
+
83
86
memset (_peer_temp_adv_buffer, 0 , sizeof (_peer_temp_adv_buffer));
84
87
memset (_peer_temp_adv_data, 0 , sizeof (_peer_temp_adv_data));
85
88
memset (_peer_temp_adv_data_len, 0 , sizeof (_peer_temp_adv_data_len));
89
+ memset (_peer_temp_adv_connectable, 0 , sizeof (_peer_adv_connectable));
86
90
87
91
memset (&_adv_accept_critical, 0 , sizeof (_adv_accept_critical));
88
92
memset (&_adv_critical_service_uuid, 0 , sizeof (_adv_critical_service_uuid));
@@ -716,36 +720,44 @@ bool BLEDeviceManager::hasLocalName(const BLEDevice* device) const
716
720
BT_DATA_NAME_COMPLETE,
717
721
local_name,
718
722
local_name_len);
719
- /*
720
- getDeviceAdvertiseBuffer(device->bt_le_address(),
721
- adv_data,
722
- adv_data_len);
723
- if (NULL == adv_data )
723
+ }
724
+
725
+ bool BLEDeviceManager::hasManufacturerData ( const BLEDevice* device) const
726
+ {
727
+ if (BLEUtils::isLocalBLE (*device) == true )
724
728
{
725
- return false ;
729
+ return (_manufacturer_data_length != 0 ) ;
726
730
}
727
731
728
- while (adv_data_len > 1)
729
- {
730
- uint8_t len = adv_data[0];
731
- uint8_t type = adv_data[1];
732
-
733
- // Check for early termination
734
- if (len == 0 || ((len + 1) > adv_data_len))
735
- {
736
- return false;
737
- }
738
-
739
- if (type == BT_DATA_NAME_COMPLETE)
740
- {
741
- return true;
742
- }
732
+ const uint8_t * manufactgurer_data = NULL ;
733
+ uint8_t manufactgurer_data_len = 0 ;
734
+ return getDataFromAdvertiseByType (device,
735
+ BT_DATA_MANUFACTURER_DATA,
736
+ manufactgurer_data,
737
+ manufactgurer_data_len);
738
+ }
743
739
744
- adv_data_len -= len + 1;
745
- adv_data += len + 1;
740
+ bool BLEDeviceManager::getManufacturerData (const BLEDevice* device,
741
+ uint8_t * manu_data,
742
+ uint8_t &manu_data_len) const
743
+ {
744
+ if (BLEUtils::isLocalBLE (*device) == true )
745
+ {
746
+ return (_manufacturer_data_length != 0 );
746
747
}
747
- return false;
748
- */
748
+
749
+ const uint8_t * manufactgurer_data = NULL ;
750
+ uint8_t manufactgurer_data_len = 0 ;
751
+ bool retval = getDataFromAdvertiseByType (device,
752
+ BT_DATA_MANUFACTURER_DATA,
753
+ manufactgurer_data,
754
+ manufactgurer_data_len);
755
+ if (retval)
756
+ {
757
+ memcpy (manu_data, manufactgurer_data, manufactgurer_data_len);
758
+ manu_data_len = manufactgurer_data_len;
759
+ }
760
+ return retval;
749
761
}
750
762
751
763
bool BLEDeviceManager::hasAdvertisedServiceUuid (const BLEDevice* device) const
@@ -895,50 +907,26 @@ String BLEDeviceManager::localName(const BLEDevice* device) const
895
907
{
896
908
return _local_name;
897
909
}
898
- const uint8_t * adv_data = NULL ;
899
- uint8_t adv_data_len = 0 ;
900
- char localname_string[BLE_MAX_ADV_SIZE];
901
- memset (localname_string, 0 , sizeof (localname_string));
902
910
903
- getDeviceAdvertiseBuffer (device->bt_le_address (),
904
- adv_data,
905
- adv_data_len);
906
-
907
- if (NULL == adv_data) {
908
- String temp (localname_string);
909
- return temp;
910
- }
911
-
912
- while (adv_data_len > 1 )
913
- {
914
- uint8_t len = adv_data[0 ];
915
- uint8_t type = adv_data[1 ];
916
-
917
- /* Check for early termination */
918
- if ((len == 0 ) || ((len + 1 ) > adv_data_len)) {
919
- break ;
920
- }
921
-
922
- /* Sid, 2/15/2017. Support both forms of data name.
923
- */
924
- if (type == BT_DATA_NAME_COMPLETE ||
925
- type == BT_DATA_NAME_SHORTENED)
911
+ const uint8_t * local_name = NULL ;
912
+ uint8_t local_name_len = 0 ;
913
+ String temp (" " );
914
+ char local_name_buff[BLE_MAX_ADV_SIZE];
915
+ bool retval = getDataFromAdvertiseByType (device,
916
+ BT_DATA_NAME_COMPLETE,
917
+ local_name,
918
+ local_name_len);
919
+ if (true == retval)
920
+ {
921
+ if (local_name_len >= BLE_MAX_ADV_SIZE)
926
922
{
927
- if (len >= BLE_MAX_ADV_SIZE)
928
- {
929
- len = BLE_MAX_ADV_SIZE-1 ;
930
- }
931
- uint8_t copy_len = len - 1 ;
932
- memcpy (localname_string, &adv_data[2 ], copy_len);
933
- localname_string[copy_len] = ' \0 ' ;
934
- break ;
923
+ local_name_len = BLE_MAX_ADV_SIZE - 1 ;
935
924
}
936
-
937
- adv_data_len -= len + 1 ;
938
- adv_data += len + 1 ;
925
+ memcpy (local_name_buff, local_name, local_name_len);
926
+ local_name_buff[local_name_len] = ' \0 ' ;
927
+ temp = local_name_buff ;
939
928
}
940
-
941
- String temp (localname_string);
929
+
942
930
return temp;
943
931
}
944
932
@@ -1321,8 +1309,8 @@ BLEDevice BLEDeviceManager::available()
1321
1309
_available_for_connect_peripheral_scan_rsp_data_len = _peer_scan_rsp_data_len[index ];
1322
1310
_available_for_connect_peripheral_adv_data_len = _peer_adv_data_len[index ];
1323
1311
_available_for_connect_peripheral_adv_rssi = _peer_adv_rssi[index ];
1324
-
1325
- pr_debug (LOG_MODULE_BLE, " %s-%d:Con addr-%s" , __FUNCTION__, __LINE__, BLEUtils::macAddressBT2String (*temp).c_str ());
1312
+ _available_for_connect_peripheral_connectable = _peer_adv_connectable[ index ];
1313
+ // pr_debug(LOG_MODULE_BLE, "%s-%d:Con addr-%s", __FUNCTION__, __LINE__, BLEUtils::macAddressBT2String(*temp).c_str());
1326
1314
_peer_adv_mill[index ] -= 2000 ; // Set it as expired
1327
1315
}
1328
1316
}
@@ -1332,7 +1320,8 @@ BLEDevice BLEDeviceManager::available()
1332
1320
bool BLEDeviceManager::setAdvertiseBuffer (const bt_addr_le_t * bt_addr,
1333
1321
const uint8_t *ad,
1334
1322
uint8_t data_len,
1335
- int8_t rssi)
1323
+ int8_t rssi,
1324
+ bool connectable)
1336
1325
{
1337
1326
bt_addr_le_t * temp = NULL ;
1338
1327
uint64_t timestamp = millis ();
@@ -1378,6 +1367,7 @@ bool BLEDeviceManager::setAdvertiseBuffer(const bt_addr_le_t* bt_addr,
1378
1367
_peer_adv_rssi[index ] = rssi;
1379
1368
// Update the timestamp
1380
1369
_peer_adv_mill[index ] = timestamp;
1370
+ _peer_adv_connectable[index ] = connectable;
1381
1371
retval = true ;
1382
1372
}
1383
1373
@@ -1447,7 +1437,8 @@ uint8_t BLEDeviceManager::getTempAdvertiseIndexFromBuffer(const bt_addr_le_t* bt
1447
1437
void BLEDeviceManager::setTempAdvertiseBuffer (const bt_addr_le_t * bt_addr,
1448
1438
int8_t rssi,
1449
1439
const uint8_t *ad,
1450
- uint8_t data_len)
1440
+ uint8_t data_len,
1441
+ bool connectable)
1451
1442
{
1452
1443
bt_addr_le_t * temp = NULL ;
1453
1444
uint8_t i = getTempAdvertiseIndexFromBuffer (bt_addr);
@@ -1466,6 +1457,7 @@ void BLEDeviceManager::setTempAdvertiseBuffer(const bt_addr_le_t* bt_addr,
1466
1457
1467
1458
memcpy (_peer_temp_adv_data[i], ad, data_len);
1468
1459
_peer_temp_adv_data_len[i] = data_len;
1460
+ _peer_temp_adv_connectable[i] = connectable;
1469
1461
1470
1462
return ;
1471
1463
}
@@ -1490,12 +1482,14 @@ void BLEDeviceManager::advertiseAcceptHandler(const bt_addr_le_t *addr,
1490
1482
{
1491
1483
const uint8_t *adv_data = ad;
1492
1484
uint8_t adv_data_len = data_len;
1485
+ bool connectable = (BT_LE_ADV_NONCONN_IND != type);
1493
1486
bool update_advertise_data = true ;
1494
1487
// The critical is accepted
1495
1488
// Find the oldest and expired buffer
1496
1489
if (BT_LE_ADV_SCAN_RSP == type)
1497
1490
{
1498
- pr_debug (LOG_MODULE_BLE, " %s-%d" , __FUNCTION__, __LINE__);
1491
+ update_advertise_data = false ;
1492
+ pr_debug (LOG_MODULE_BLE, " %s-%d" , __FUNCTION__, __LINE__);
1499
1493
if (false == setScanRespBuffer (addr, ad, data_len, rssi))
1500
1494
{
1501
1495
// Find the device in the ADV temp buffer
@@ -1504,22 +1498,20 @@ void BLEDeviceManager::advertiseAcceptHandler(const bt_addr_le_t *addr,
1504
1498
{
1505
1499
adv_data = _peer_temp_adv_data[tempIndex];
1506
1500
adv_data_len = _peer_temp_adv_data_len[tempIndex];
1507
- }
1508
- else
1509
- {
1510
- update_advertise_data = false ;
1501
+ connectable = _peer_temp_adv_connectable[tempIndex];
1502
+ update_advertise_data = true ;
1511
1503
}
1512
1504
}
1513
- else
1514
- {
1515
- update_advertise_data = false ;
1516
- }
1517
1505
}
1518
1506
pr_debug (LOG_MODULE_BLE, " %s-%d" , __FUNCTION__, __LINE__);
1519
1507
1520
1508
if (true == update_advertise_data)
1521
1509
{
1522
- if (false == setAdvertiseBuffer (addr, adv_data, adv_data_len, rssi))
1510
+ if (false == setAdvertiseBuffer (addr,
1511
+ adv_data,
1512
+ adv_data_len,
1513
+ rssi,
1514
+ connectable))
1523
1515
{
1524
1516
pr_info (LOG_MODULE_BLE, " No buffer to store the ADV\n " );
1525
1517
}
@@ -1541,54 +1533,52 @@ void BLEDeviceManager::handleDeviceFound(const bt_addr_le_t *addr,
1541
1533
uint8_t real_adv_len = data_len;
1542
1534
1543
1535
/* We're only interested in connectable events */
1544
- if (type == BT_LE_ADV_IND || type == BT_LE_ADV_DIRECT_IND ||
1545
- type == BT_LE_ADV_SCAN_RSP)
1536
+ // pr_debug(LOG_MODULE_BLE, "%s-%d", __FUNCTION__, __LINE__);
1537
+ // Filter address
1538
+ if (BLEUtils::macAddressValid (_adv_accept_device) == true &&
1539
+ (memcmp (addr->val , _adv_accept_device.val , sizeof (addr->val )) != 0 ))
1546
1540
{
1547
- // pr_debug(LOG_MODULE_BLE, "%s-%d", __FUNCTION__, __LINE__);
1548
- // Filter address
1549
- if (BLEUtils::macAddressValid (_adv_accept_device) == true &&
1550
- (memcmp (addr->val , _adv_accept_device.val , sizeof (addr->val )) != 0 ))
1541
+ pr_debug (LOG_MODULE_BLE, " %s-%d" , __FUNCTION__, __LINE__);
1542
+ return ;
1543
+ }
1544
+
1545
+ while (data_len > 1 )
1546
+ {
1547
+ uint8_t len = data[0 ];
1548
+
1549
+ /* Check for early termination */
1550
+ if (len == 0 )
1551
1551
{
1552
1552
return ;
1553
1553
}
1554
-
1555
- while (data_len > 1 )
1556
- {
1557
- uint8_t len = data[0 ];
1558
1554
1559
- /* Check for early termination */
1560
- if (len == 0 )
1561
- {
1562
- return ;
1563
- }
1564
-
1565
- if ((len + 1 ) > data_len) { // Sid. KW, cannot be (data_len < 2)
1566
- pr_info (LOG_MODULE_BLE, " AD malformed\n " );
1567
- return ;
1568
- }
1569
-
1570
- if (true == advertiseDataProc (data[1 ], &data[2 ], len - 1 ))
1571
- {
1572
- advertiseAcceptHandler (addr, rssi, type, ad, real_adv_len);
1573
- pr_debug (LOG_MODULE_BLE, " %s-%d: Done" , __FUNCTION__, __LINE__);
1574
- return ;
1575
- }
1576
-
1577
- data_len -= len + 1 ;
1578
- data += len + 1 ;
1579
- }
1580
- // pr_debug(LOG_MODULE_BLE, "%s: done", __FUNCTION__);
1581
- // Doesn't accept the ADV/scan data
1582
- // Check it in the buffer
1583
- if (BT_LE_ADV_SCAN_RSP == type)
1584
- {
1585
- setScanRespBuffer (addr, ad, real_adv_len, rssi);
1555
+ if ((len + 1 ) > data_len) { // Sid. KW, cannot be (data_len < 2)
1556
+ pr_info (LOG_MODULE_BLE, " AD malformed\n " );
1557
+ return ;
1586
1558
}
1587
- else
1559
+
1560
+ if (true == advertiseDataProc (data[1 ], &data[2 ], len - 1 ))
1588
1561
{
1589
- // Add advertise into buffer
1590
- setTempAdvertiseBuffer (addr, rssi, ad, real_adv_len);
1562
+ advertiseAcceptHandler (addr, rssi, type, ad, real_adv_len);
1563
+ // pr_debug(LOG_MODULE_BLE, "%s-%d: Done", __FUNCTION__, __LINE__);
1564
+ return ;
1591
1565
}
1566
+
1567
+ data_len -= len + 1 ;
1568
+ data += len + 1 ;
1569
+ }
1570
+ // pr_debug(LOG_MODULE_BLE, "%s: done", __FUNCTION__);
1571
+ // Doesn't accept the ADV/scan data
1572
+ // Check it in the buffer
1573
+ if (BT_LE_ADV_SCAN_RSP == type)
1574
+ {
1575
+ // Find the ADV and set response
1576
+ setScanRespBuffer (addr, ad, real_adv_len, rssi);
1577
+ }
1578
+ else
1579
+ {
1580
+ // Add advertise into buffer
1581
+ setTempAdvertiseBuffer (addr, rssi, ad, real_adv_len, BT_LE_ADV_NONCONN_IND != type);
1592
1582
}
1593
1583
1594
1584
}
0 commit comments