@@ -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+
738780bool 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()
13621388bool 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
14771505void 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