@@ -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 ),
@@ -83,9 +84,12 @@ BLEDeviceManager::BLEDeviceManager():
83
84
memset (_peer_scan_rsp_data_len, 0 , sizeof (_peer_scan_rsp_data_len));
84
85
memset (_peer_adv_rssi, 0 , sizeof (_peer_adv_rssi));
85
86
87
+ memset (_peer_adv_connectable, 0 , sizeof (_peer_adv_connectable));
88
+
86
89
memset (_peer_temp_adv_buffer, 0 , sizeof (_peer_temp_adv_buffer));
87
90
memset (_peer_temp_adv_data, 0 , sizeof (_peer_temp_adv_data));
88
91
memset (_peer_temp_adv_data_len, 0 , sizeof (_peer_temp_adv_data_len));
92
+ memset (_peer_temp_adv_connectable, 0 , sizeof (_peer_adv_connectable));
89
93
90
94
memset (&_adv_accept_critical, 0 , sizeof (_adv_accept_critical));
91
95
memset (&_adv_critical_service_uuid, 0 , sizeof (_adv_critical_service_uuid));
@@ -724,36 +728,44 @@ bool BLEDeviceManager::hasLocalName(const BLEDevice* device) const
724
728
BT_DATA_NAME_COMPLETE,
725
729
local_name,
726
730
local_name_len);
727
- /*
728
- getDeviceAdvertiseBuffer(device->bt_le_address(),
729
- adv_data,
730
- adv_data_len);
731
- if (NULL == adv_data )
731
+ }
732
+
733
+ bool BLEDeviceManager::hasManufacturerData ( const BLEDevice* device) const
734
+ {
735
+ if (BLEUtils::isLocalBLE (*device) == true )
732
736
{
733
- return false ;
737
+ return (_manufacturer_data_length != 0 ) ;
734
738
}
735
739
736
- while (adv_data_len > 1)
737
- {
738
- uint8_t len = adv_data[0];
739
- uint8_t type = adv_data[1];
740
-
741
- // Check for early termination
742
- if (len == 0 || ((len + 1) > adv_data_len))
743
- {
744
- return false;
745
- }
746
-
747
- if (type == BT_DATA_NAME_COMPLETE)
748
- {
749
- return true;
750
- }
740
+ const uint8_t * manufactgurer_data = NULL ;
741
+ uint8_t manufactgurer_data_len = 0 ;
742
+ return getDataFromAdvertiseByType (device,
743
+ BT_DATA_MANUFACTURER_DATA,
744
+ manufactgurer_data,
745
+ manufactgurer_data_len);
746
+ }
751
747
752
- adv_data_len -= len + 1;
753
- adv_data += len + 1;
748
+ bool BLEDeviceManager::getManufacturerData (const BLEDevice* device,
749
+ uint8_t * manu_data,
750
+ uint8_t &manu_data_len) const
751
+ {
752
+ if (BLEUtils::isLocalBLE (*device) == true )
753
+ {
754
+ return (_manufacturer_data_length != 0 );
754
755
}
755
- return false;
756
- */
756
+
757
+ const uint8_t * manufactgurer_data = NULL ;
758
+ uint8_t manufactgurer_data_len = 0 ;
759
+ bool retval = getDataFromAdvertiseByType (device,
760
+ BT_DATA_MANUFACTURER_DATA,
761
+ manufactgurer_data,
762
+ manufactgurer_data_len);
763
+ if (retval)
764
+ {
765
+ memcpy (manu_data, manufactgurer_data, manufactgurer_data_len);
766
+ manu_data_len = manufactgurer_data_len;
767
+ }
768
+ return retval;
757
769
}
758
770
759
771
bool BLEDeviceManager::hasAdvertisedServiceUuid (const BLEDevice* device) const
@@ -903,50 +915,26 @@ String BLEDeviceManager::localName(const BLEDevice* device) const
903
915
{
904
916
return _local_name;
905
917
}
906
- const uint8_t * adv_data = NULL ;
907
- uint8_t adv_data_len = 0 ;
908
- char localname_string[BLE_MAX_ADV_SIZE];
909
- memset (localname_string, 0 , sizeof (localname_string));
910
918
911
- getDeviceAdvertiseBuffer (device->bt_le_address (),
912
- adv_data,
913
- adv_data_len);
914
-
915
- if (NULL == adv_data) {
916
- String temp (localname_string);
917
- return temp;
918
- }
919
-
920
- while (adv_data_len > 1 )
921
- {
922
- uint8_t len = adv_data[0 ];
923
- uint8_t type = adv_data[1 ];
924
-
925
- /* Check for early termination */
926
- if ((len == 0 ) || ((len + 1 ) > adv_data_len)) {
927
- break ;
928
- }
929
-
930
- /* Sid, 2/15/2017. Support both forms of data name.
931
- */
932
- if (type == BT_DATA_NAME_COMPLETE ||
933
- type == BT_DATA_NAME_SHORTENED)
919
+ const uint8_t * local_name = NULL ;
920
+ uint8_t local_name_len = 0 ;
921
+ String temp (" " );
922
+ char local_name_buff[BLE_MAX_ADV_SIZE];
923
+ bool retval = getDataFromAdvertiseByType (device,
924
+ BT_DATA_NAME_COMPLETE,
925
+ local_name,
926
+ local_name_len);
927
+ if (true == retval)
928
+ {
929
+ if (local_name_len >= BLE_MAX_ADV_SIZE)
934
930
{
935
- if (len >= BLE_MAX_ADV_SIZE)
936
- {
937
- len = BLE_MAX_ADV_SIZE-1 ;
938
- }
939
- uint8_t copy_len = len - 1 ;
940
- memcpy (localname_string, &adv_data[2 ], copy_len);
941
- localname_string[copy_len] = ' \0 ' ;
942
- break ;
931
+ local_name_len = BLE_MAX_ADV_SIZE - 1 ;
943
932
}
944
-
945
- adv_data_len -= len + 1 ;
946
- adv_data += len + 1 ;
933
+ memcpy (local_name_buff, local_name, local_name_len);
934
+ local_name_buff[local_name_len] = ' \0 ' ;
935
+ temp = local_name_buff ;
947
936
}
948
-
949
- String temp (localname_string);
937
+
950
938
return temp;
951
939
}
952
940
@@ -1368,8 +1356,8 @@ BLEDevice BLEDeviceManager::available()
1368
1356
_available_for_connect_peripheral_scan_rsp_data_len = _peer_scan_rsp_data_len[index ];
1369
1357
_available_for_connect_peripheral_adv_data_len = _peer_adv_data_len[index ];
1370
1358
_available_for_connect_peripheral_adv_rssi = _peer_adv_rssi[index ];
1371
-
1372
- pr_debug (LOG_MODULE_BLE, " %s-%d:Con addr-%s" , __FUNCTION__, __LINE__, BLEUtils::macAddressBT2String (*temp).c_str ());
1359
+ _available_for_connect_peripheral_connectable = _peer_adv_connectable[ index ];
1360
+ // pr_debug(LOG_MODULE_BLE, "%s-%d:Con addr-%s", __FUNCTION__, __LINE__, BLEUtils::macAddressBT2String(*temp).c_str());
1373
1361
_peer_adv_mill[index ] -= 2000 ; // Set it as expired
1374
1362
if (_adv_duplicate_filter_enabled)
1375
1363
{
@@ -1383,7 +1371,8 @@ BLEDevice BLEDeviceManager::available()
1383
1371
bool BLEDeviceManager::setAdvertiseBuffer (const bt_addr_le_t * bt_addr,
1384
1372
const uint8_t *ad,
1385
1373
uint8_t data_len,
1386
- int8_t rssi)
1374
+ int8_t rssi,
1375
+ bool connectable)
1387
1376
{
1388
1377
bt_addr_le_t * temp = NULL ;
1389
1378
uint64_t timestamp = millis ();
@@ -1429,6 +1418,7 @@ bool BLEDeviceManager::setAdvertiseBuffer(const bt_addr_le_t* bt_addr,
1429
1418
_peer_adv_rssi[index ] = rssi;
1430
1419
// Update the timestamp
1431
1420
_peer_adv_mill[index ] = timestamp;
1421
+ _peer_adv_connectable[index ] = connectable;
1432
1422
retval = true ;
1433
1423
}
1434
1424
@@ -1498,7 +1488,8 @@ uint8_t BLEDeviceManager::getTempAdvertiseIndexFromBuffer(const bt_addr_le_t* bt
1498
1488
void BLEDeviceManager::setTempAdvertiseBuffer (const bt_addr_le_t * bt_addr,
1499
1489
int8_t rssi,
1500
1490
const uint8_t *ad,
1501
- uint8_t data_len)
1491
+ uint8_t data_len,
1492
+ bool connectable)
1502
1493
{
1503
1494
bt_addr_le_t * temp = NULL ;
1504
1495
uint8_t i = getTempAdvertiseIndexFromBuffer (bt_addr);
@@ -1517,6 +1508,7 @@ void BLEDeviceManager::setTempAdvertiseBuffer(const bt_addr_le_t* bt_addr,
1517
1508
1518
1509
memcpy (_peer_temp_adv_data[i], ad, data_len);
1519
1510
_peer_temp_adv_data_len[i] = data_len;
1511
+ _peer_temp_adv_connectable[i] = connectable;
1520
1512
1521
1513
return ;
1522
1514
}
@@ -1541,12 +1533,14 @@ void BLEDeviceManager::advertiseAcceptHandler(const bt_addr_le_t *addr,
1541
1533
{
1542
1534
const uint8_t *adv_data = ad;
1543
1535
uint8_t adv_data_len = data_len;
1536
+ bool connectable = (BT_LE_ADV_NONCONN_IND != type);
1544
1537
bool update_advertise_data = true ;
1545
1538
// The critical is accepted
1546
1539
// Find the oldest and expired buffer
1547
1540
if (BT_LE_ADV_SCAN_RSP == type)
1548
1541
{
1549
- pr_debug (LOG_MODULE_BLE, " %s-%d" , __FUNCTION__, __LINE__);
1542
+ update_advertise_data = false ;
1543
+ pr_debug (LOG_MODULE_BLE, " %s-%d" , __FUNCTION__, __LINE__);
1550
1544
if (false == setScanRespBuffer (addr, ad, data_len, rssi))
1551
1545
{
1552
1546
// Find the device in the ADV temp buffer
@@ -1555,22 +1549,20 @@ void BLEDeviceManager::advertiseAcceptHandler(const bt_addr_le_t *addr,
1555
1549
{
1556
1550
adv_data = _peer_temp_adv_data[tempIndex];
1557
1551
adv_data_len = _peer_temp_adv_data_len[tempIndex];
1558
- }
1559
- else
1560
- {
1561
- update_advertise_data = false ;
1552
+ connectable = _peer_temp_adv_connectable[tempIndex];
1553
+ update_advertise_data = true ;
1562
1554
}
1563
1555
}
1564
- else
1565
- {
1566
- update_advertise_data = false ;
1567
- }
1568
1556
}
1569
1557
pr_debug (LOG_MODULE_BLE, " %s-%d" , __FUNCTION__, __LINE__);
1570
1558
1571
1559
if (true == update_advertise_data)
1572
1560
{
1573
- if (false == setAdvertiseBuffer (addr, adv_data, adv_data_len, rssi))
1561
+ if (false == setAdvertiseBuffer (addr,
1562
+ adv_data,
1563
+ adv_data_len,
1564
+ rssi,
1565
+ connectable))
1574
1566
{
1575
1567
pr_info (LOG_MODULE_BLE, " No buffer to store the ADV\n " );
1576
1568
}
@@ -1592,54 +1584,52 @@ void BLEDeviceManager::handleDeviceFound(const bt_addr_le_t *addr,
1592
1584
uint8_t real_adv_len = data_len;
1593
1585
1594
1586
/* We're only interested in connectable events */
1595
- if (type == BT_LE_ADV_IND || type == BT_LE_ADV_DIRECT_IND ||
1596
- type == BT_LE_ADV_SCAN_RSP)
1587
+ // pr_debug(LOG_MODULE_BLE, "%s-%d", __FUNCTION__, __LINE__);
1588
+ // Filter address
1589
+ if (BLEUtils::macAddressValid (_adv_accept_device) == true &&
1590
+ (memcmp (addr->val , _adv_accept_device.val , sizeof (addr->val )) != 0 ))
1597
1591
{
1598
- // pr_debug(LOG_MODULE_BLE, "%s-%d", __FUNCTION__, __LINE__);
1599
- // Filter address
1600
- if (BLEUtils::macAddressValid (_adv_accept_device) == true &&
1601
- (memcmp (addr->val , _adv_accept_device.val , sizeof (addr->val )) != 0 ))
1592
+ pr_debug (LOG_MODULE_BLE, " %s-%d" , __FUNCTION__, __LINE__);
1593
+ return ;
1594
+ }
1595
+
1596
+ while (data_len > 1 )
1597
+ {
1598
+ uint8_t len = data[0 ];
1599
+
1600
+ /* Check for early termination */
1601
+ if (len == 0 )
1602
1602
{
1603
1603
return ;
1604
1604
}
1605
-
1606
- while (data_len > 1 )
1607
- {
1608
- uint8_t len = data[0 ];
1609
1605
1610
- /* Check for early termination */
1611
- if (len == 0 )
1612
- {
1613
- return ;
1614
- }
1615
-
1616
- if ((len + 1 ) > data_len) { // Sid. KW, cannot be (data_len < 2)
1617
- pr_info (LOG_MODULE_BLE, " AD malformed\n " );
1618
- return ;
1619
- }
1620
-
1621
- if (true == advertiseDataProc (data[1 ], &data[2 ], len - 1 ))
1622
- {
1623
- advertiseAcceptHandler (addr, rssi, type, ad, real_adv_len);
1624
- pr_debug (LOG_MODULE_BLE, " %s-%d: Done" , __FUNCTION__, __LINE__);
1625
- return ;
1626
- }
1627
-
1628
- data_len -= len + 1 ;
1629
- data += len + 1 ;
1630
- }
1631
- // pr_debug(LOG_MODULE_BLE, "%s: done", __FUNCTION__);
1632
- // Doesn't accept the ADV/scan data
1633
- // Check it in the buffer
1634
- if (BT_LE_ADV_SCAN_RSP == type)
1635
- {
1636
- setScanRespBuffer (addr, ad, real_adv_len, rssi);
1606
+ if ((len + 1 ) > data_len) { // Sid. KW, cannot be (data_len < 2)
1607
+ pr_info (LOG_MODULE_BLE, " AD malformed\n " );
1608
+ return ;
1637
1609
}
1638
- else
1610
+
1611
+ if (true == advertiseDataProc (data[1 ], &data[2 ], len - 1 ))
1639
1612
{
1640
- // Add advertise into buffer
1641
- setTempAdvertiseBuffer (addr, rssi, ad, real_adv_len);
1613
+ advertiseAcceptHandler (addr, rssi, type, ad, real_adv_len);
1614
+ // pr_debug(LOG_MODULE_BLE, "%s-%d: Done", __FUNCTION__, __LINE__);
1615
+ return ;
1642
1616
}
1617
+
1618
+ data_len -= len + 1 ;
1619
+ data += len + 1 ;
1620
+ }
1621
+ // pr_debug(LOG_MODULE_BLE, "%s: done", __FUNCTION__);
1622
+ // Doesn't accept the ADV/scan data
1623
+ // Check it in the buffer
1624
+ if (BT_LE_ADV_SCAN_RSP == type)
1625
+ {
1626
+ // Find the ADV and set response
1627
+ setScanRespBuffer (addr, ad, real_adv_len, rssi);
1628
+ }
1629
+ else
1630
+ {
1631
+ // Add advertise into buffer
1632
+ setTempAdvertiseBuffer (addr, rssi, ad, real_adv_len, BT_LE_ADV_NONCONN_IND != type);
1643
1633
}
1644
1634
1645
1635
}
0 commit comments