Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <lilka.h>
- #include "ipapp.h"
- #include "servicemanager.h"
- #include "services/network.h"
- extern "C" {
- #include "lwip/etharp.h"
- #include "lwip/netif.h"
- #include "lwip/ip_addr.h"
- }
- IPApp::IPApp() : App("IP Address") {}
- void IPApp::scanNetwork(std::vector<ScanResult>& results) {
- results.clear();
- struct netif* netif = netif_list;
- IPAddress localIP = WiFi.localIP();
- IPAddress subnetMask = WiFi.subnetMask();
- uint32_t ip = (uint32_t)localIP;
- uint32_t mask = (uint32_t)subnetMask;
- uint32_t network = ip & mask;
- uint32_t broadcast = network | ~mask;
- // Відправляємо ARP-запити до всіх адрес у підмережі
- for (uint32_t addr = network + 1; addr < broadcast; ++addr) {
- IPAddress targetIP(addr);
- ip4_addr_t target_ip;
- ip4addr_aton(targetIP.toString().c_str(), &target_ip);
- etharp_request(netif, &target_ip);
- vTaskDelay(10 / portTICK_PERIOD_MS);
- }
- vTaskDelay(1000 / portTICK_PERIOD_MS);
- // Збираємо знайдені IP–MAC
- for (uint32_t addr = network + 1; addr < broadcast; ++addr) {
- IPAddress ip(addr);
- ip4_addr_t target_ip;
- ip4addr_aton(ip.toString().c_str(), &target_ip);
- struct eth_addr *eth_ret;
- const ip4_addr_t *ip_ret;
- if (etharp_find_addr(netif, &target_ip, ð_ret, &ip_ret) >= 0) {
- ScanResult res;
- res.ip = ip;
- memcpy(res.mac, eth_ret->addr, 6);
- results.push_back(res);
- }
- }
- }
- const char* lookupVendor(const uint8_t mac[6]);
- void IPApp::run() {
- std::vector<ScanResult> arpResults;
- scanNetwork(arpResults);
- lilka::Menu menu("ARP scan");
- menu.addActivationButton(lilka::Button::B); // Back
- menu.addActivationButton(lilka::Button::C);
- if (arpResults.empty()) {
- menu.addItem("No devices found");
- } else {
- for (const auto& entry : arpResults) {
- char macbuf[18];
- snprintf(macbuf, sizeof(macbuf), "%02X:%02X:%02X:%02X:%02X:%02X",
- entry.mac[0], entry.mac[1], entry.mac[2],
- entry.mac[3], entry.mac[4], entry.mac[5]);
- menu.addItem(entry.ip.toString() + " - " + String(macbuf));
- }
- }
- menu.addItem("Оновити");
- menu.addItem("Назад");
- int count = (int)arpResults.size() + 2;
- if (arpResults.empty()) count = 3;
- while (true) {
- while (!menu.isFinished()) {
- menu.update();
- menu.draw(canvas);
- queueDraw();
- }
- int cursor = menu.getCursor();
- if (cursor == count - 1 || menu.getButton() == lilka::Button::B) {
- return;
- }
- if (cursor == count - 2) { // Оновити
- arpResults.clear();
- menu.clearItems();
- scanNetwork(arpResults);
- if (arpResults.empty()) {
- menu.addItem("No devices found");
- } else {
- for (const auto& entry : arpResults) {
- char macbuf[18];
- snprintf(macbuf, sizeof(macbuf), "%02X:%02X:%02X:%02X:%02X:%02X",
- entry.mac[0], entry.mac[1], entry.mac[2],
- entry.mac[3], entry.mac[4], entry.mac[5]);
- menu.addItem(entry.ip.toString() + " - " + String(macbuf));
- }
- }
- menu.addItem("Оновити");
- menu.addItem("Назад");
- continue;
- }
- if (menu.getButton() == lilka::Button::C && !arpResults.empty() && cursor < (int)arpResults.size()) {
- const ScanResult& entry = arpResults[cursor];
- char macbuf[18];
- snprintf(macbuf, sizeof(macbuf), "%02X:%02X:%02X:%02X:%02X:%02X",
- entry.mac[0], entry.mac[1], entry.mac[2],
- entry.mac[3], entry.mac[4], entry.mac[5]);
- const char* vendor = lookupVendor(entry.mac);
- String info = "IP: " + entry.ip.toString() + "\nMAC: " + String(macbuf);
- if (vendor && String(vendor) != "Unknown") {
- info += "\nVendor: ";
- info += vendor;
- }
- lilka::Alert alert("Device info", info);
- while (!alert.isFinished()) {
- alert.update();
- alert.draw(canvas);
- queueDraw();
- }
- continue;
- }
- // Якщо вибрано "No devices found" — просто оновити меню (нічого не робимо)
- }
- }
- // --- Додаємо структуру та масив OUI-вендорів ---
- const MacVendor macVendors[] = VENDORS_LIST_INITIALIZER;
- const int macVendorsCount = sizeof(macVendors) / sizeof(macVendors[0]);
- // Функція для пошуку вендора за MAC
- const char* lookupVendor(const uint8_t mac[6]) {
- uint32_t target = (mac[0] << 16) | (mac[1] << 8) | mac[2];
- int left = 0, right = macVendorsCount - 1;
- while (left <= right) {
- int mid = (left + right) / 2;
- uint32_t midOUI = (macVendors[mid].oui[0] << 16) | (macVendors[mid].oui[1] << 8) | macVendors[mid].oui[2];
- if (target == midOUI) return macVendors[mid].vendor;
- if (target < midOUI) right = mid - 1;
- else left = mid + 1;
- }
- return "Unknown";
- }
- #ifndef IPAPP_H
- #define IPAPP_H
- #include <lilka.h>
- #include "app.h"
- #include "services/network.h"
- #include <vector>
- struct MacVendor {
- uint8_t oui[3];
- char vendor[32];
- };
- #define VENDORS_LIST_INITIALIZER { \
- { {0x00,0x00,0xF0}, "Samsung" }, \
- { {0x00,0x02,0x78}, "Samsung" }, \
- { {0x00,0x07,0xAB}, "Samsung" }, \
- { {0x00,0x09,0x18}, "Samsung" }, \
- { {0x00,0x0A,0xEB}, "TP-LINK" }, \
- { {0x00,0x0D,0xAE}, "Samsung" }, \
- { {0x00,0x0D,0xE5}, "Samsung" }, \
- { {0x00,0x11,0x32}, "Synology" }, \
- { {0x00,0x12,0x47}, "Samsung" }, \
- { {0x00,0x12,0xFB}, "Samsung" }, \
- { {0x00,0x13,0x77}, "Samsung" }, \
- { {0x00,0x14,0x78}, "TP-LINK" }, \
- { {0x00,0x15,0x99}, "Samsung" }, \
- { {0x00,0x15,0xB9}, "Samsung" }, \
- { {0x00,0x16,0x32}, "Samsung" }, \
- { {0x00,0x16,0x6B}, "Samsung" }, \
- { {0x00,0x16,0x6C}, "Samsung" }, \
- { {0x00,0x16,0xDB}, "Samsung" }, \
- { {0x00,0x17,0xC9}, "Samsung" }, \
- { {0x00,0x17,0xD5}, "Samsung" }, \
- { {0x00,0x18,0xAF}, "Samsung" }, \
- { {0x00,0x19,0xE0}, "TP-LINK" }, \
- { {0x00,0x1A,0x79}, "Apple" }, \
- { {0x00,0x1A,0x8A}, "Samsung" }, \
- { {0x00,0x1B,0x63}, "Cisco" }, \
- { {0x00,0x1B,0x98}, "Samsung" }, \
- { {0x00,0x1C,0x43}, "Samsung" }, \
- { {0x00,0x1C,0xBF}, "Samsung" }, \
- { {0x00,0x1D,0x0F}, "TP-LINK" }, \
- { {0x00,0x1D,0x25}, "Samsung" }, \
- { {0x00,0x1D,0xD8}, "Huawei" }, \
- { {0x00,0x1D,0xF6}, "Samsung" }, \
- { {0x00,0x1E,0x7D}, "Samsung" }, \
- { {0x00,0x1E,0xC2}, "Intel" }, \
- { {0x00,0x1E,0xE1}, "Samsung" }, \
- { {0x00,0x1E,0xE2}, "Samsung" }, \
- { {0x00,0x1F,0xCC}, "Samsung" }, \
- { {0x00,0x1F,0xCD}, "Samsung" }, \
- { {0x00,0x21,0x27}, "TP-LINK" }, \
- { {0x00,0x21,0x4C}, "Samsung" }, \
- { {0x00,0x21,0x6A}, "TP-Link" }, \
- { {0x00,0x21,0xD1}, "Samsung" }, \
- { {0x00,0x21,0xD2}, "Samsung" }, \
- { {0x00,0x22,0x43}, "Xiaomi" }, \
- { {0x00,0x23,0x39}, "Samsung" }, \
- { {0x00,0x23,0x3A}, "Samsung" }, \
- { {0x00,0x23,0x69}, "LG" }, \
- { {0x00,0x23,0x99}, "Samsung" }, \
- { {0x00,0x23,0xC2}, "Samsung" }, \
- { {0x00,0x23,0xCD}, "TP-LINK" }, \
- { {0x00,0x23,0xD6}, "Samsung" }, \
- { {0x00,0x23,0xD7}, "Samsung" }, \
- { {0x00,0x24,0x54}, "Samsung" }, \
- { {0x00,0x24,0x90}, "Samsung" }, \
- { {0x00,0x24,0x91}, "Samsung" }, \
- { {0x00,0x24,0xE8}, "Dell" }, \
- { {0x00,0x24,0xE9}, "Samsung" }, \
- { {0x00,0x25,0x38}, "Samsung" }, \
- { {0x00,0x25,0x66}, "Samsung" }, \
- { {0x00,0x25,0x67}, "Samsung" }, \
- { {0x00,0x25,0x86}, "TP-LINK" }, \
- { {0x00,0x25,0x9C}, "HP" }, \
- { {0x00,0x26,0x18}, "Asus" }, \
- { {0x00,0x26,0x37}, "Samsung" }, \
- { {0x00,0x26,0x5D}, "Samsung" }, \
- { {0x00,0x26,0x5F}, "Samsung" }, \
- { {0x00,0x27,0x0E}, "Realtek" }, \
- { {0x00,0x27,0x19}, "TP-LINK" }, \
- { {0x00,0x28,0xF8}, "Amazon" }, \
- { {0x00,0x30,0x65}, "Google" }, \
- { {0x00,0x50,0x56}, "VMware" }, \
- { {0x00,0x60,0x2F}, "Microsoft" }, \
- { {0x00,0x6F,0x64}, "Samsung" }, \
- { {0x00,0x73,0xE0}, "Samsung" }, \
- { {0x00,0x80,0x41}, "Motorola" }, \
- { {0x00,0x87,0x01}, "Samsung" }, \
- { {0x00,0x90,0x4C}, "Sony" }, \
- { {0x00,0x9E,0xC8}, "Xiaomi" }, \
- { {0x00,0xA0,0xC9}, "Cisco" }, \
- { {0x00,0xB0,0x52}, "Panasonic" }, \
- { {0x00,0xC0,0xCA}, "Toshiba" }, \
- { {0x00,0xD0,0x59}, "Sharp" }, \
- { {0x00,0xE0,0x4C}, "Nokia" }, \
- { {0x00,0xE0,0x64}, "Samsung" }, \
- { {0x00,0xE3,0xB2}, "Samsung" }, \
- { {0x00,0xF0,0x1C}, "Lenovo" }, \
- { {0x00,0xF4,0x6F}, "Samsung" }, \
- { {0x08,0x1F,0x71}, "TP-LINK" }, \
- { {0x08,0x57,0x00}, "TP-LINK" }, \
- { {0x0C,0x1D,0xAF}, "Xiaomi" }, \
- { {0x0C,0x72,0x2C}, "TP-LINK" }, \
- { {0x0C,0x82,0x68}, "TP-LINK" }, \
- { {0x10,0x2A,0xB3}, "Xiaomi" }, \
- { {0x10,0x27,0xBE}, "Apple" }, \
- { {0x10,0x68,0x3F}, "Apple" }, \
- { {0x10,0xFE,0xED}, "TP-LINK" }, \
- { {0x14,0x75,0x90}, "TP-LINK" }, \
- { {0x14,0x86,0x92}, "TP-LINK" }, \
- { {0x14,0xCC,0x20}, "TP-LINK" }, \
- { {0x14,0xCF,0x92}, "TP-LINK" }, \
- { {0x14,0xE6,0xE4}, "TP-LINK" }, \
- { {0x14,0xF6,0x5A}, "Xiaomi" }, \
- { {0x18,0x59,0x36}, "Xiaomi" }, \
- { {0x18,0x65,0x90}, "Apple" }, \
- { {0x18,0xA6,0xF7}, "Samsung" }, \
- { {0x18,0xA6,0xF7}, "TP-LINK" }, \
- { {0x18,0xD6,0xC7}, "TP-LINK" }, \
- { {0x18,0xFE,0x34}, "Espressif" }, \
- { {0x1C,0x1A,0xC0}, "Apple" }, \
- { {0x1C,0x44,0x19}, "TP-LINK" }, \
- { {0x1C,0xFA,0x68}, "TP-LINK" }, \
- { {0x20,0x82,0xC0}, "Xiaomi" }, \
- { {0x20,0xDC,0xE6}, "TP-LINK" }, \
- { {0x20,0xF8,0x3B}, "Home Assistant" }, \
- { {0x24,0x0A,0xC4}, "Espressif" }, \
- { {0x24,0x4B,0xFE}, "Apple" }, \
- { {0x24,0x69,0x68}, "TP-LINK" }, \
- { {0x28,0x2C,0xB2}, "TP-LINK" }, \
- { {0x28,0x6C,0x07}, "Xiaomi" }, \
- { {0x28,0xE3,0x1F}, "Xiaomi" }, \
- { {0x28,0xEE,0x52}, "TP-LINK" }, \
- { {0x2C,0x54,0xCF}, "TP-Link" }, \
- { {0x30,0x07,0x4D}, "Apple" }, \
- { {0x30,0xAE,0xA4}, "Espressif" }, \
- { {0x30,0xB4,0x9E}, "TP-LINK" }, \
- { {0x30,0xB5,0xC2}, "TP-LINK" }, \
- { {0x30,0xFC,0x68}, "TP-LINK" }, \
- { {0x34,0x36,0x3B}, "Apple" }, \
- { {0x34,0x80,0xB3}, "Xiaomi" }, \
- { {0x34,0x96,0x72}, "TP-LINK" }, \
- { {0x34,0xCE,0x00}, "Xiaomi" }, \
- { {0x38,0x83,0x45}, "TP-LINK" }, \
- { {0x38,0xA4,0xED}, "Xiaomi" }, \
- { {0x38,0xC9,0x86}, "Apple" }, \
- { {0x3C,0x46,0xD8}, "TP-LINK" }, \
- { {0x3C,0x5A,0xB4}, "Apple" }, \
- { {0x3C,0xBD,0x3E}, "Xiaomi" }, \
- { {0x40,0x16,0x9F}, "TP-LINK" }, \
- { {0x40,0x3F,0x8C}, "TP-LINK" }, \
- { {0x40,0x4E,0x36}, "Apple" }, \
- { {0x44,0x2A,0x60}, "Apple" }, \
- { {0x44,0xB3,0x2D}, "TP-LINK" }, \
- { {0x48,0x5A,0x3F}, "Apple" }, \
- { {0x4C,0x32,0x75}, "Apple" }, \
- { {0x50,0x2C,0xC6}, "Unknown" }, \
- { {0x50,0xBD,0x5F}, "TP-LINK" }, \
- { {0x50,0xC7,0xBF}, "TP-LINK" }, \
- { {0x50,0xFA,0x84}, "TP-LINK" }, \
- { {0x54,0x27,0x1E}, "Apple" }, \
- { {0x54,0x5A,0xA6}, "Espressif" }, \
- { {0x54,0xC8,0x0F}, "TP-LINK" }, \
- { {0x54,0xE6,0xFC}, "TP-LINK" }, \
- { {0x58,0x44,0x98}, "Xiaomi" }, \
- { {0x58,0x55,0xCA}, "Apple" }, \
- { {0x5C,0x59,0x48}, "Apple" }, \
- { {0x5C,0x63,0xBF}, "TP-LINK" }, \
- { {0x5C,0x89,0x9A}, "TP-LINK" }, \
- { {0x5C,0xCF,0x7F}, "Espressif" }, \
- { {0x60,0x01,0x94}, "Espressif" }, \
- { {0x60,0xE3,0x27}, "TP-LINK" }, \
- { {0x64,0x09,0x80}, "Xiaomi" }, \
- { {0x64,0x56,0x01}, "TP-LINK" }, \
- { {0x64,0x66,0xB3}, "TP-LINK" }, \
- { {0x64,0x70,0x02}, "TP-LINK" }, \
- { {0x64,0xB4,0x73}, "Xiaomi" }, \
- { {0x64,0xCC,0x2E}, "Xiaomi" }, \
- { {0x68,0x5B,0x35}, "Apple" }, \
- { {0x68,0xDF,0xDD}, "Xiaomi" }, \
- { {0x6C,0x40,0x08}, "Apple" }, \
- { {0x6C,0xE8,0x73}, "TP-LINK" }, \
- { {0x70,0x3A,0x51}, "Apple" }, \
- { {0x70,0x4F,0x57}, "TP-LINK" }, \
- { {0x74,0x23,0x44}, "Xiaomi" }, \
- { {0x74,0x51,0xBA}, "Xiaomi" }, \
- { {0x74,0xE2,0xF5}, "Apple" }, \
- { {0x74,0xEA,0x3A}, "TP-LINK" }, \
- { {0x78,0x02,0xF8}, "Xiaomi" }, \
- { {0x78,0x31,0xC1}, "Apple" }, \
- { {0x78,0xA1,0x06}, "TP-LINK" }, \
- { {0x7C,0x1D,0xD9}, "Xiaomi" }, \
- { {0x7C,0x6D,0x62}, "Apple" }, \
- { {0x80,0x89,0x17}, "TP-LINK" }, \
- { {0x80,0xEA,0x96}, "Apple" }, \
- { {0x84,0x16,0xF9}, "TP-LINK" }, \
- { {0x84,0x38,0x35}, "Apple" }, \
- { {0x88,0x1F,0xA1}, "Apple" }, \
- { {0x88,0x25,0x93}, "TP-LINK" }, \
- { {0x8C,0x21,0x0A}, "TP-LINK" }, \
- { {0x8C,0xA6,0xDF}, "TP-LINK" }, \
- { {0x8C,0xBE,0xBE}, "Xiaomi" }, \
- { {0x90,0x27,0xE4}, "Apple" }, \
- { {0x90,0x97,0xD5}, "Espressif" }, \
- { {0x90,0xAE,0x1B}, "TP-LINK" }, \
- { {0x90,0xF6,0x52}, "TP-LINK" }, \
- { {0x94,0x0C,0x6D}, "TP-LINK" }, \
- { {0x94,0xE9,0x79}, "Apple" }, \
- { {0x98,0x01,0xA7}, "Apple" }, \
- { {0x98,0xDE,0xD0}, "TP-LINK" }, \
- { {0x98,0xFA,0xE3}, "Xiaomi" }, \
- { {0x9C,0x20,0x7B}, "Apple" }, \
- { {0x9C,0x21,0x6A}, "TP-LINK" }, \
- { {0x9C,0x99,0xA0}, "Xiaomi" }, \
- { {0xA0,0x20,0xA6}, "Espressif" }, \
- { {0xA0,0x86,0xC6}, "Xiaomi" }, \
- { {0xA0,0x99,0x9B}, "Apple" }, \
- { {0xA0,0xF3,0xC1}, "TP-LINK" }, \
- { {0xA4,0x2B,0xB0}, "TP-LINK" }, \
- { {0xA4,0x5E,0x60}, "Apple" }, \
- { {0xA8,0x15,0x4D}, "TP-LINK" }, \
- { {0xA8,0x20,0x66}, "Apple" }, \
- { {0xA8,0x57,0x4E}, "TP-LINK" }, \
- { {0xAC,0xBC,0x32}, "Apple" }, \
- { {0xAC,0xC1,0xEE}, "Xiaomi" }, \
- { {0xAC,0xD0,0x74}, "Espressif" }, \
- { {0xAC,0xF7,0xF3}, "Xiaomi" }, \
- { {0xB0,0x48,0x7A}, "TP-LINK" }, \
- { {0xB0,0x95,0x8E}, "TP-LINK" }, \
- { {0xB0,0x99,0xD7}, "Samsung" }, \
- { {0xB0,0xE2,0x35}, "Xiaomi" }, \
- { {0xB4,0x18,0xD1}, "Apple" }, \
- { {0xB8,0x17,0xC2}, "Apple" }, \
- { {0xB8,0x27,0xEB}, "Raspberry Pi" }, \
- { {0xB8,0xF8,0x83}, "TP-LINK" }, \
- { {0xBC,0x46,0x99}, "TP-LINK" }, \
- { {0xBC,0xD1,0x77}, "TP-LINK" }, \
- { {0xC0,0x25,0xE9}, "TP-LINK" }, \
- { {0xC0,0x4A,0x00}, "TP-LINK" }, \
- { {0xC0,0x61,0x18}, "TP-LINK" }, \
- { {0xC0,0xE4,0x2D}, "TP-LINK" }, \
- { {0xC4,0x6E,0x1F}, "TP-LINK" }, \
- { {0xC4,0xE9,0x84}, "TP-LINK" }, \
- { {0xCC,0x34,0x29}, "TP-LINK" }, \
- { {0xD0,0xC7,0xC0}, "TP-LINK" }, \
- { {0xD4,0x01,0x6D}, "TP-LINK" }, \
- { {0xD4,0x6E,0x0E}, "TP-LINK" }, \
- { {0xD8,0x15,0x0D}, "TP-LINK" }, \
- { {0xD8,0x5D,0x4C}, "TP-LINK" }, \
- { {0xDC,0x00,0x77}, "TP-LINK" }, \
- { {0xDC,0xFE,0x18}, "TP-LINK" }, \
- { {0xE0,0x05,0xC5}, "TP-LINK" }, \
- { {0xE4,0xD3,0x32}, "TP-LINK" }, \
- { {0xE8,0x94,0xF6}, "TP-LINK" }, \
- { {0xE8,0xDE,0x27}, "TP-LINK" }, \
- { {0xEC,0x08,0x6B}, "TP-LINK" }, \
- { {0xEC,0x17,0x2F}, "TP-LINK" }, \
- { {0xEC,0x26,0xCA}, "TP-LINK" }, \
- { {0xEC,0x88,0x8F}, "TP-LINK" }, \
- { {0xF0,0xF3,0x36}, "TP-LINK" }, \
- { {0xF4,0x83,0xCD}, "TP-LINK" }, \
- { {0xF4,0xEC,0x38}, "TP-LINK" }, \
- { {0xF4,0xF2,0x6D}, "TP-LINK" }, \
- { {0xF8,0x1A,0x67}, "TP-LINK" }, \
- { {0xF8,0xD1,0x11}, "TP-LINK" }, \
- { {0xFC,0xD7,0x33}, "TP-LINK" } \
- }
- struct ScanResult {
- IPAddress ip;
- uint8_t mac[6];
- };
- class IPApp : public App {
- public:
- IPApp();
- private:
- void run() override;
- void scanNetwork(std::vector<ScanResult>& results);
- lilka::Menu menu;
- };
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement