mirror of https://github.com/arendst/Tasmota.git
Added 2 new filters: BLE filter by name and minimum RSSI (#22530)
This commit is contained in:
parent
25f13e434f
commit
3448e17317
|
@ -108,6 +108,9 @@
|
||||||
BLEEnableUnsaved
|
BLEEnableUnsaved
|
||||||
*0/1 - if BLE is disabled, this can be used to enable BLE without
|
*0/1 - if BLE is disabled, this can be used to enable BLE without
|
||||||
it being saved - useful as the last command in autoexec.bat
|
it being saved - useful as the last command in autoexec.bat
|
||||||
|
BLEFilterNames
|
||||||
|
BLEFilterNames0 - clear filter list
|
||||||
|
BLEFilterNames1 - <name1>,<name2> - set one or more device names
|
||||||
|
|
||||||
Other drivers can add callbacks to receive advertisements
|
Other drivers can add callbacks to receive advertisements
|
||||||
Other drivers can add 'operations' to be performed and receive callbacks from the operation's success or failure
|
Other drivers can add 'operations' to be performed and receive callbacks from the operation's success or failure
|
||||||
|
@ -134,6 +137,8 @@ i.e. the Bluetooth of the ESP can be shared without conflict.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define BLE_ESP32_ALIASES
|
#define BLE_ESP32_ALIASES
|
||||||
|
#define BLE_ESP32_FILTER_BY_NAME
|
||||||
|
#define BLE_ESP32_FILTER_BY_RSSI
|
||||||
|
|
||||||
// uncomment for more diagnostic/information messages - + more flash use.
|
// uncomment for more diagnostic/information messages - + more flash use.
|
||||||
//#define BLE_ESP32_DEBUG
|
//#define BLE_ESP32_DEBUG
|
||||||
|
@ -472,6 +477,12 @@ std::deque<BLE_ESP32::SCANCOMPLETE_CALLBACK*> scancompleteCallbacks;
|
||||||
std::deque<BLE_ESP32::ble_alias_t*> aliases;
|
std::deque<BLE_ESP32::ble_alias_t*> aliases;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef BLE_ESP32_FILTER_BY_NAME
|
||||||
|
std::vector<String> bleFilterNames;
|
||||||
|
#endif
|
||||||
|
#ifdef BLE_ESP32_FILTER_BY_RSSI
|
||||||
|
int minRSSI = -100;
|
||||||
|
#endif
|
||||||
|
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
* constants
|
* constants
|
||||||
|
@ -480,7 +491,7 @@ std::deque<BLE_ESP32::ble_alias_t*> aliases;
|
||||||
#define D_CMND_BLE "BLE"
|
#define D_CMND_BLE "BLE"
|
||||||
|
|
||||||
const char kBLE_Commands[] PROGMEM = D_CMND_BLE "|"
|
const char kBLE_Commands[] PROGMEM = D_CMND_BLE "|"
|
||||||
"Period|Adv|Op|Mode|Details|Scan|Alias|Name|Debug|Devices|MaxAge|AddrFilter|EnableUnsaved";
|
"Period|Adv|Op|Mode|Details|Scan|Alias|Name|Debug|Devices|MaxAge|AddrFilter|EnableUnsaved|FilterNames|MinRssiLevel";
|
||||||
|
|
||||||
static void CmndBLEPeriod(void);
|
static void CmndBLEPeriod(void);
|
||||||
static void CmndBLEAdv(void);
|
static void CmndBLEAdv(void);
|
||||||
|
@ -495,6 +506,8 @@ static void CmndBLEDevices(void);
|
||||||
static void CmndBLEMaxAge(void);
|
static void CmndBLEMaxAge(void);
|
||||||
static void CmndBLEAddrFilter(void);
|
static void CmndBLEAddrFilter(void);
|
||||||
static void CmndBLEEnableUnsaved(void);
|
static void CmndBLEEnableUnsaved(void);
|
||||||
|
static void CmndBleFilterNames(void);
|
||||||
|
static void CmndSetMinRSSI(void);
|
||||||
|
|
||||||
void (*const BLE_Commands[])(void) PROGMEM = {
|
void (*const BLE_Commands[])(void) PROGMEM = {
|
||||||
&BLE_ESP32::CmndBLEPeriod,
|
&BLE_ESP32::CmndBLEPeriod,
|
||||||
|
@ -509,7 +522,9 @@ void (*const BLE_Commands[])(void) PROGMEM = {
|
||||||
&BLE_ESP32::CmndBLEDevices,
|
&BLE_ESP32::CmndBLEDevices,
|
||||||
&BLE_ESP32::CmndBLEMaxAge,
|
&BLE_ESP32::CmndBLEMaxAge,
|
||||||
&BLE_ESP32::CmndBLEAddrFilter,
|
&BLE_ESP32::CmndBLEAddrFilter,
|
||||||
&BLE_ESP32::CmndBLEEnableUnsaved
|
&BLE_ESP32::CmndBLEEnableUnsaved,
|
||||||
|
&BLE_ESP32::CmndBleFilterNames,
|
||||||
|
&BLE_ESP32::CmndSetMinRSSI
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *successStates[] PROGMEM = {
|
const char *successStates[] PROGMEM = {
|
||||||
|
@ -1128,7 +1143,24 @@ void ReverseMAC(uint8_t _mac[]){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Search for device name in filer list
|
||||||
|
*
|
||||||
|
* @param deviceName device name string
|
||||||
|
*/
|
||||||
|
#ifdef BLE_ESP32_FILTER_BY_NAME
|
||||||
|
bool isDeviceInFilter(const String& deviceName) {
|
||||||
|
#ifdef BLE_ESP32_DEBUG
|
||||||
|
if (BLEDebugMode > 0) AddLog(LOG_LEVEL_DEBUG,PSTR("BLE: Device chcked in filter %s"), deviceName);
|
||||||
|
#endif
|
||||||
|
for (const auto& filterName : bleFilterNames) {
|
||||||
|
if (deviceName == filterName) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
* Advertisment details
|
* Advertisment details
|
||||||
|
@ -1372,9 +1404,24 @@ class BLEAdvCallbacks: public NimBLEScanCallbacks {
|
||||||
BLEAdvertisment.name[sizeof(BLEAdvertisment.name)-1] = 0;
|
BLEAdvertisment.name[sizeof(BLEAdvertisment.name)-1] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int filter = 0;
|
||||||
|
#ifdef BLE_ESP32_FILTER_BY_NAME
|
||||||
|
if (!bleFilterNames.empty()) {
|
||||||
|
if (!advertisedDevice->haveName() || !isDeviceInFilter(namestr))
|
||||||
|
{
|
||||||
|
filter = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BLE_ESP32_FILTER_BY_RSSI
|
||||||
|
if (advertisedDevice->getRSSI() < minRSSI) {
|
||||||
|
filter = 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// log this device safely
|
// log this device safely
|
||||||
if (BLEAdvertisment.addrtype <= BLEAddressFilter){
|
if ((BLEAdvertisment.addrtype <= BLEAddressFilter) && (0 == filter) ){
|
||||||
addSeenDevice(BLEAdvertisment.addr, BLEAdvertisment.addrtype, BLEAdvertisment.name, BLEAdvertisment.RSSI);
|
addSeenDevice(BLEAdvertisment.addr, BLEAdvertisment.addrtype, BLEAdvertisment.name, BLEAdvertisment.RSSI);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2833,6 +2880,58 @@ void CmndBLEDetails(void){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CmndBleFilterNames(void) {
|
||||||
|
#ifdef BLE_ESP32_FILTER_BY_NAME
|
||||||
|
int op = XdrvMailbox.index;
|
||||||
|
#ifdef BLE_ESP32_DEBUG
|
||||||
|
if (BLEDebugMode > 0) AddLog(LOG_LEVEL_DEBUG,PSTR("BLE: Name %d %s"), op, XdrvMailbox.data);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
switch(op){
|
||||||
|
case 0:{
|
||||||
|
bleFilterNames.clear();
|
||||||
|
ResponseCmndDone();
|
||||||
|
} break;
|
||||||
|
case 1:{
|
||||||
|
if (XdrvMailbox.data_len) {
|
||||||
|
String filters = XdrvMailbox.data;
|
||||||
|
bleFilterNames.clear();
|
||||||
|
|
||||||
|
int start = 0;
|
||||||
|
int end = filters.indexOf(',');
|
||||||
|
while (end != -1) {
|
||||||
|
bleFilterNames.push_back(filters.substring(start, end));
|
||||||
|
start = end + 1;
|
||||||
|
end = filters.indexOf(',', start);
|
||||||
|
}
|
||||||
|
bleFilterNames.push_back(filters.substring(start));
|
||||||
|
|
||||||
|
Response_P(PSTR("{\"BLEFilterNames\":\"%s\"}"), filters.c_str());
|
||||||
|
} else {
|
||||||
|
String filterList;
|
||||||
|
for (const auto& name : bleFilterNames) {
|
||||||
|
if (!filterList.isEmpty()) {
|
||||||
|
filterList += ", ";
|
||||||
|
}
|
||||||
|
filterList += name;
|
||||||
|
}
|
||||||
|
|
||||||
|
Response_P(PSTR("{\"BLEFilterNames\":\"%s\"}"), filterList.c_str());
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void CmndSetMinRSSI(void) {
|
||||||
|
#ifdef BLE_ESP32_FILTER_BY_RSSI
|
||||||
|
if (XdrvMailbox.data_len) {
|
||||||
|
minRSSI = atoi(XdrvMailbox.data);
|
||||||
|
}
|
||||||
|
Response_P(PSTR("{\"MinRSSI\":\"%d\"}"), minRSSI);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void CmndBLEAlias(void){
|
void CmndBLEAlias(void){
|
||||||
#ifdef BLE_ESP32_ALIASES
|
#ifdef BLE_ESP32_ALIASES
|
||||||
int op = XdrvMailbox.index;
|
int op = XdrvMailbox.index;
|
||||||
|
|
Loading…
Reference in New Issue