Блок получения MAC-адреса клиента

Получение МАС-адреса клиента подключенного к ESP8266

Создаем свой блок. Вопросы, помощь знатоков.
Ответить
Uasya
Рядовой
Сообщения: 14
Зарегистрирован: 16.03.2019{, 08:39}
Репутация: 1
Откуда: Уфа
Имя: Василий

Блок получения MAC-адреса клиента

#1

Сообщение Uasya » 16.03.2019{, 17:41}

Здравствуйте друзья! Прошу помощи в создании пользовательского блока. Затея создать на esp8266 простую систему контроля доступа, где идентификатором будет служить телефон. Суть задумки такова, что ESP находясь в режиме точки доступа ждет клиента, как только клиент появился в зоне WI-FI, ESP посылает управляющий сигнал. Видел вариант когда ESP работает в режиме клиента, а телефон в роли точки доступа, но мне это не подходит. Решил создать пользовательский блок который будет получать MAC клиента и выводить его в виде строки. Использование МАС будет действовать еще, как своего рода идентификатор по которому точка будет выполнять управление. Ну думаю идею обрисовал доступно... теперь расскажу в чем собственно проблема. Итак, нашел в сети код для получения МАС клиента:
СпойлерПоказать

Код: Выделить всё

#include <ESP8266WiFi.h>
 
const char *ssid = "Ihone";
const char *password = "12345678";
 
 
 
WiFiEventHandler stationConnectedHandler; // событие - соединение
WiFiEventHandler stationDisconnectedHandler; // событие - разъединение
 
void setup() {
  Serial.begin(115200);
 
 
 
  WiFi.persistent(false); // бережем флеш-память, не перезаписываем данные подключения, если они не изменились с прошлой загрузки
  WiFi.mode(WIFI_AP); // Режим точки доступа
  WiFi.softAP(ssid, password);
 
  stationConnectedHandler = WiFi.onSoftAPModeStationConnected(&onStationConnected); // при соединении переходим к функции
  stationDisconnectedHandler = WiFi.onSoftAPModeStationDisconnected(&onStationDisconnected); // при разъединении переходим к функции
  //Serial.println( WiFi.localIP());
  //Serial.println( WiFi.softAPIP());
  //WiFi.printDiag(Serial);
}
 
void loop() {
 
}
 
void onStationConnected(const WiFiEventSoftAPModeStationConnected& evt) { // при коннекте - включаем реле
  //Serial.print("CONNECTED: ");
    //Serial.println(macToString(evt.mac)); // МАС-адрес в порт
}
 
void onStationDisconnected(const WiFiEventSoftAPModeStationDisconnected& evt) { // при дисконнекте - выключаем реле
  //Serial.print("DISCONNECTED: ");
 
  //Serial.println(macToString(evt.mac)); // МАС-адрес в порт
}
 
String macToString(const unsigned char* mac) { // Получаем МАС-адрес клиента в виде строки (может пригодиться при идентификации)
  char buf[20];
  snprintf(buf, sizeof(buf), "%02x:%02x:%02x:%02x:%02x:%02x",
  mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
  return String(buf);
}
Обрезал лишнее, типа, отправки в УАРТ, включение\отключение реле и т.д. Получилось следующее:
СпойлерПоказать

Код: Выделить всё


#include <ESP8266WiFi.h>
 
 char ESP8266ControllerWifiAP_SSID[40] = "";
 char ESP8266ControllerWifiAP_password[40] = "";
 
 
 


 
void setup() {
 
 
 
 
  WiFi.persistent(false); // бережем флеш-память, не перезаписываем данные подключения, если они не изменились с прошлой загрузки
  WiFi.softAP(ESP8266ControllerWifiAP_SSID, ESP8266ControllerWifiAP_password);
 
  
 
}
 
void loop() {
 
}
 

 

 
String macToString(const unsigned char* mac) { // Получаем МАС-адрес клиента в виде строки (может пригодиться при идентификации)
  char buf[20];
  snprintf(buf, sizeof(buf), "%02x:%02x:%02x:%02x:%02x:%02x",
  mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
  return String(buf);
}
Проверяю обрезанный код в компиляторе, все ОК. Создаю блок по примеру с сайта. Вот что получается:
СпойлерПоказать

Секция DECLARE
Изображение

**********

Секция SETUP
Изображение

*********

Секция LOOP
Изображение

*********

Создал выход блока куда будет выводится строка с МАС
Изображение

*********

Подключил библиотеку
Изображение

Сохранил, компилирую, получаю код:
СпойлерПоказать

Код: Выделить всё


[scroll]#include <ESP8266WiFi.h>
#include <ESP8266WiFi.h>

extern "C" {
#include "user_interface.h";
}
String M_195429077_1;

 char ESP8266ControllerWifiAP_SSID_195429077_1[40] = "";
char ESP8266ControllerWifiAP_password_195429077_1[40] = "";
bool ESP8266ControllerWifiClient_status = 1;
char ESP8266ControllerWifiAP_SSID[40] = "Domofon";
char ESP8266ControllerWifiAP_password[40] = "12345678";
bool ESP8266ControllerWifiAP_IsNeedReconect = 0;
bool ESP8266ControllerWifiAP_workStatus = 1;
IPAddress ESP8266ControllerWifiAP_ip(172, 1, 1, 1);
 IPAddress  ESP8266ControllerWifiAP_dns (172, 1, 1, 1);
 IPAddress  ESP8266ControllerWifiAP_gateway (172, 1, 1, 1);
IPAddress ESP8266ControllerWifiAP_subnet (255, 255, 255, 0);
 uint8_t ESP8266ControllerWifiAP_mac[6] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
bool _gtv1 = 0;
bool _gtv3 = 0;
bool _trgrt1 = 0;
bool _trgrt1I = 0;
String _stou1;
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0UL;
void setup()
{
WiFi.mode(WIFI_AP);
 _esp8266WifiModuleApReconnect();
Serial.begin(115200);
pinMode(2, OUTPUT); 

 WiFi.persistent(false); // бережем флеш-память, не перезаписываем данные подключения, если они не изменились с прошлой загрузки
  WiFi.softAP(ESP8266ControllerWifiAP_SSID_195429077_1, ESP8266ControllerWifiAP_password_195429077_1);
 
  
 
}
void loop()
{if(ESP8266ControllerWifiAP_IsNeedReconect) {_esp8266WifiModuleApReconnect(); ESP8266ControllerWifiAP_IsNeedReconect = 0; }





//Плата:1
String macToString(const unsigned char* mac)  // Получаем МАС-адрес клиента в виде строки (может пригодиться при идентификации)
  char buf[20];
  snprintf(buf, sizeof(buf), "%02x:%02x:%02x:%02x:%02x:%02x",
  mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
  return String(buf);
if (0){if(!(( M_195429077_1)==(_stou1))){Serial.print(M_195429077_1);}} _stou1 = M_195429077_1; 
if (_gtv1) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; 
 if(_trgrt1) {_tim1O = 1; _tim1I = 1;} else { if(_tim1I) {_tim1I = 0; _tim1P = millis();} else { if (_tim1O) {if ( _isTimer(_tim1P, 1010)) _tim1O = 0;}}}
_gtv3 = _tim1O;
digitalWrite(2, _tim1O);




}
bool _isTimer(unsigned long startTime, unsigned long period )
  {
  unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
  }
int hexStrToInt(String instring)
{
  byte len = instring.length();
  if  (len == 0) return 0;
  int result = 0;
  for (byte i = 0; i < 8; i++)   // только первые 8 цыфар влезуть в uint32
  {
    char ch = instring[i];
    if (ch == 0) break;
    result <<= 4;
    if (isdigit(ch))
      result = result | (ch - '0');
    else result = result | (ch - 'A' + 10);
  }
  return result;
}
 void _esp8266WifiModuleApReconnect()
{
if ( _checkMacAddres(ESP8266ControllerWifiAP_mac)) {
 wifi_set_macaddr(1, const_cast<uint8*>(ESP8266ControllerWifiAP_mac));
}
 WiFi.softAPConfig(ESP8266ControllerWifiAP_ip, ESP8266ControllerWifiAP_gateway, ESP8266ControllerWifiAP_subnet);
WiFi.softAP(ESP8266ControllerWifiAP_SSID, ESP8266ControllerWifiAP_password);
if ( ! (_checkMacAddres(ESP8266ControllerWifiAP_mac))) {
WiFi.softAPmacAddress(ESP8266ControllerWifiAP_mac);
 }
}
IPAddress _ipAddressFromUnsignetLong(unsigned long value)
{
  IPAddress result;
  byte *x = (byte *)&value;
  for (byte i = 0; i < 4; i++) {
    result[i] =  x[i];
  }
  return result;
}

bool checkIPAdressString(String value)
{
IPAddress temp;
return temp.fromString(value);
}

IPAddress _ipAddressFromString(String value)
{
IPAddress temp;
 temp.fromString(value);
return temp;
}

unsigned long _unsignetLongFromIPAdress(IPAddress value)
{
  byte buufer[4] = {0, 0, 0, 0};
 for (byte i = 0; i < 4; i++) {
    buufer[i] = value[i];
  }
  unsigned long *y = (unsigned long *)&buufer;
  return y[0];
}
bool _checkMacAddres(byte array[])
{
  bool result = 0;
  for (byte i = 0; i < 6; i++)
  {
    if (array[i] == 255) {
      return 0;
    }
    if (array[i] > 0 ) {
      result = 1;
    }
  }
  return result;
}
  void _parseMacAddressString(String value, byte array[])
{
  int index;
  byte buffer[6] = {255, 255, 255, 255, 255, 255};
  byte raz = 0;
  String tempString;
  while ((value.length() > 0) && (raz <= 6)) {
    index = value.indexOf(":");
    if (index == -1) {
      tempString = value;
      value = "";
    } else {
      tempString = value.substring(0, index);
      value = value.substring(index + 1);
    }
    buffer[raz] = byte(hexStrToInt(tempString));
    raz++;
  }
  if ( _checkMacAddres(buffer))
  {
    for (byte i = 0; i < 6; i++)
    {
      array[i] = buffer[i];
    }
  }
}
bool _compareMacAddreses(byte array1[], byte array2[])
{
  for (byte i = 0; i < 6; i++)
  {
    if (array1[i] != array2[i]) {
      return 0;
    }
  }
  return 1;
}
bool _compareMacAddresWithString(byte array[], String value)
{
 byte buffer[6] = {255, 255, 255, 255, 255, 255};
_parseMacAddressString(value,  buffer);
return _compareMacAddreses(array, buffer);
}
bool _checkMacAddresString(String value)
{
 byte buffer[6] = {255, 255, 255, 255, 255, 255};
_parseMacAddressString(value,  buffer);
return _checkMacAddres( buffer);
}
String _macAddresToString(byte array[])
{
  String result = "";
String  temp ="";
for (byte i = 0; i < 6; i++)
 {
temp=String(array[i],HEX);
if (temp.length()  < 2) {temp = String("0") + temp; }
 result = result + temp;
  if (i < 5) {
   result = result + String(":");
}
  }
   result.toUpperCase();
  return result;
}[/scroll]
И повалили ошибки...
СпойлерПоказать
C:\Users\User\AppData\Local\Temp\flprog\pr2\pr2.ino: In function 'void loop()':

pr2:51: error: expected initializer before 'char'

char buf[20];

^

pr2:52: error: 'buf' was not declared in this scope

snprintf(buf, sizeof(buf), "%02x:%02x:%02x:%02x:%02x:%02x",

^

pr2:53: error: 'mac' was not declared in this scope

mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);

^

pr2:54: error: return-statement with a value, in function returning 'void' [-fpermissive]

return String(buf);

^
Подскажите, что я сделал не так. Профессионалом в программировании не являюсь, но пытаюсь осваивать...

Brand2
Лейтенант
Сообщения: 414
Зарегистрирован: 26.02.2018{, 21:27}
Репутация: 41
Откуда: Haifa
Имя: Alex

Блок получения MAC-адреса клиента

#2

Сообщение Brand2 » 16.03.2019{, 19:04}

ПUasya, посмотрите этот скетч,может чем то поможет
ESP8266_WIFI_Unlocker_RSSI.ino
(2.91 КБ) 88 скачиваний

Uasya
Рядовой
Сообщения: 14
Зарегистрирован: 16.03.2019{, 08:39}
Репутация: 1
Откуда: Уфа
Имя: Василий

Блок получения MAC-адреса клиента

#3

Сообщение Uasya » 16.03.2019{, 19:15}

Вроде разобрался с блоком. Код компилируется. Сейчас пытаюсь проверить все в работе. Пробую отправить в уарт МАС адресс клиента и ничего мой уарт мне не присылает...

Brand2
Лейтенант
Сообщения: 414
Зарегистрирован: 26.02.2018{, 21:27}
Репутация: 41
Откуда: Haifa
Имя: Alex

Блок получения MAC-адреса клиента

#4

Сообщение Brand2 » 16.03.2019{, 19:37}

Uasya, покажи потом что получилось

aidar_i
Полковник
Сообщения: 3122
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 674
Откуда: Уфа
Имя: Айдар
Контактная информация:

Блок получения MAC-адреса клиента

#5

Сообщение aidar_i » 16.03.2019{, 20:14}

Попробовал сделать блок. проверьте.
Получение MAC адреса.flp
(44.52 КБ) 126 скачиваний

Uasya
Рядовой
Сообщения: 14
Зарегистрирован: 16.03.2019{, 08:39}
Репутация: 1
Откуда: Уфа
Имя: Василий

Блок получения MAC-адреса клиента

#6

Сообщение Uasya » 16.03.2019{, 22:29}

aidar_i, Попробовал, все работает. Получается мой косяк был, что нужно было отправку указать в функциях... :smile14:

aidar_i
Полковник
Сообщения: 3122
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 674
Откуда: Уфа
Имя: Айдар
Контактная информация:

Блок получения MAC-адреса клиента

#7

Сообщение aidar_i » 16.03.2019{, 23:39}

Добавьте описание в блок. И проект потом выложить на форуме не забудьте.

Uasya
Рядовой
Сообщения: 14
Зарегистрирован: 16.03.2019{, 08:39}
Репутация: 1
Откуда: Уфа
Имя: Василий

Блок получения MAC-адреса клиента

#8

Сообщение Uasya » 17.03.2019{, 09:36}

aidar_i, Обязательно. Благодарю за помощь! Сам бы я еще долго голову ломал пока дошел.

Отправлено спустя 34 минуты 42 секунды:
Собственно вот что получилось. Убрал ввод логина и пароля сети- все настройки точки доступа задаются в дереве проекта. Сделал, что бы при отключении клиента на выходе была пустая строка. Ну и добавил описание...
Вложения
MAC_adrr_client_ESP8266.ubi
МАС-адрес клиента ESP8266
(20.16 КБ) 115 скачиваний

aidar_i
Полковник
Сообщения: 3122
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 674
Откуда: Уфа
Имя: Айдар
Контактная информация:

Блок получения MAC-адреса клиента

#9

Сообщение aidar_i » 17.03.2019{, 12:36}

Вот еще вариант, если несколько смартфонов подключаются нужно видеть, кто подключился и кто отключился. Сделал два выхода и еще выход когда есть подключение - высокий уровень , когда отключено - низкий. Вывод на уарт сделал тоже в блоке и закомментировал, если нужно, можно раскомментировав не использовать штатный.
Получение MAC адреса_1.1.flp
(114.27 КБ) 152 скачивания
Может такой вариант пригодится.

Аватара пользователя
RuwimAdm
Рядовой
Сообщения: 48
Зарегистрирован: 29.06.2018{, 01:28}
Репутация: 2
Имя: Рувим

Блок получения MAC-адреса клиента

#10

Сообщение RuwimAdm » 19.06.2019{, 11:05}

Как работают данные блоки? Мне хотелось бы чтоб есп была подключена к роутеру, и на ней была точка доступа к которой подключались бы устройства светя свой мак и этот мак передавать по mqtt, но как я понял с данным блоком такой фокус не проходит, подскажите можно ли что-то придумать?

Ответить

Вернуться в «Разработка пользовательских блоков»