@@ -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));
@@ -735,6 +739,44 @@ bool BLEDeviceManager::hasLocalName(const BLEDevice* device) const
735
739
return retval;
736
740
}
737
741
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
+
738
780
bool BLEDeviceManager::hasAdvertisedServiceUuid (const BLEDevice* device) const
739
781
{
740
782
if (BLEUtils::isLocalBLE (*device) == true )
@@ -882,50 +924,34 @@ String BLEDeviceManager::localName(const BLEDevice* device) const
882
924
{
883
925
return _local_name;
884
926
}
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);
893
927
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);
897
942
}
898
943
899
- while (adv_data_len > 1 )
944
+ if ( true == retval)
900
945
{
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)
913
947
{
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 ;
922
949
}
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 ;
926
953
}
927
-
928
- String temp (localname_string);
954
+
929
955
return temp;
930
956
}
931
957
@@ -1347,8 +1373,8 @@ BLEDevice BLEDeviceManager::available()
1347
1373
_available_for_connect_peripheral_scan_rsp_data_len = _peer_scan_rsp_data_len[index ];
1348
1374
_available_for_connect_peripheral_adv_data_len = _peer_adv_data_len[index ];
1349
1375
_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());
1352
1378
_peer_adv_mill[index ] -= 2000 ; // Set it as expired
1353
1379
if (_adv_duplicate_filter_enabled)
1354
1380
{
@@ -1362,7 +1388,8 @@ BLEDevice BLEDeviceManager::available()
1362
1388
bool BLEDeviceManager::setAdvertiseBuffer (const bt_addr_le_t * bt_addr,
1363
1389
const uint8_t *ad,
1364
1390
uint8_t data_len,
1365
- int8_t rssi)
1391
+ int8_t rssi,
1392
+ bool connectable)
1366
1393
{
1367
1394
bt_addr_le_t * temp = NULL ;
1368
1395
uint64_t timestamp = millis ();
@@ -1408,6 +1435,7 @@ bool BLEDeviceManager::setAdvertiseBuffer(const bt_addr_le_t* bt_addr,
1408
1435
_peer_adv_rssi[index ] = rssi;
1409
1436
// Update the timestamp
1410
1437
_peer_adv_mill[index ] = timestamp;
1438
+ _peer_adv_connectable[index ] = connectable;
1411
1439
retval = true ;
1412
1440
}
1413
1441
@@ -1477,7 +1505,8 @@ uint8_t BLEDeviceManager::getTempAdvertiseIndexFromBuffer(const bt_addr_le_t* bt
1477
1505
void BLEDeviceManager::setTempAdvertiseBuffer (const bt_addr_le_t * bt_addr,
1478
1506
int8_t rssi,
1479
1507
const uint8_t *ad,
1480
- uint8_t data_len)
1508
+ uint8_t data_len,
1509
+ bool connectable)
1481
1510
{
1482
1511
bt_addr_le_t * temp = NULL ;
1483
1512
uint8_t i = getTempAdvertiseIndexFromBuffer (bt_addr);
@@ -1496,6 +1525,7 @@ void BLEDeviceManager::setTempAdvertiseBuffer(const bt_addr_le_t* bt_addr,
1496
1525
1497
1526
memcpy (_peer_temp_adv_data[i], ad, data_len);
1498
1527
_peer_temp_adv_data_len[i] = data_len;
1528
+ _peer_temp_adv_connectable[i] = connectable;
1499
1529
1500
1530
return ;
1501
1531
}
@@ -1520,12 +1550,14 @@ void BLEDeviceManager::advertiseAcceptHandler(const bt_addr_le_t *addr,
1520
1550
{
1521
1551
const uint8_t *adv_data = ad;
1522
1552
uint8_t adv_data_len = data_len;
1553
+ bool connectable = (BT_LE_ADV_NONCONN_IND != type);
1523
1554
bool update_advertise_data = true ;
1524
1555
// The critical is accepted
1525
1556
// Find the oldest and expired buffer
1526
1557
if (BT_LE_ADV_SCAN_RSP == type)
1527
1558
{
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__);
1529
1561
if (false == setScanRespBuffer (addr, ad, data_len, rssi))
1530
1562
{
1531
1563
// Find the device in the ADV temp buffer
@@ -1534,22 +1566,20 @@ void BLEDeviceManager::advertiseAcceptHandler(const bt_addr_le_t *addr,
1534
1566
{
1535
1567
adv_data = _peer_temp_adv_data[tempIndex];
1536
1568
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 ;
1541
1571
}
1542
1572
}
1543
- else
1544
- {
1545
- update_advertise_data = false ;
1546
- }
1547
1573
}
1548
1574
pr_debug (LOG_MODULE_BLE, " %s-%d" , __FUNCTION__, __LINE__);
1549
1575
1550
1576
if (true == update_advertise_data)
1551
1577
{
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))
1553
1583
{
1554
1584
pr_info (LOG_MODULE_BLE, " No buffer to store the ADV\n " );
1555
1585
}
@@ -1571,54 +1601,52 @@ void BLEDeviceManager::handleDeviceFound(const bt_addr_le_t *addr,
1571
1601
uint8_t real_adv_len = data_len;
1572
1602
1573
1603
/* 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 ))
1576
1608
{
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 )
1581
1619
{
1582
1620
return ;
1583
1621
}
1584
-
1585
- while (data_len > 1 )
1586
- {
1587
- uint8_t len = data[0 ];
1588
1622
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 ;
1616
1626
}
1617
- else
1627
+
1628
+ if (true == advertiseDataProc (data[1 ], &data[2 ], len - 1 ))
1618
1629
{
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 ;
1621
1633
}
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);
1622
1650
}
1623
1651
1624
1652
}
0 commit comments