"Кто дома?" через Zyxel Keenetic



  • Получаем информацию с роутера о телефонах которые находятся в домашней сети

    Для получение данных необходимо создать устройство Актуатор универсальный бинарный и необходимо заполнить следующие параметры:

    mac - мак адрес устройства (телефона) для поиска
    ip - йп роутера
    port - порт роутера, 80 по умолчанию
    login - логин роутера
    password - пароль роутера

    Убедитесь что установлена актуальная версия прошивки.

    /**
    * New snippet
    */
    
    const crypto = require('crypto');
    const http = require('http');
    
    module.exports = callback => {
      
      const mac = '88:28:b3:41:fb:00'; // mac-address phone or any device
    
      const ip = '192.168.0.1';  // ip router
      const port = 80;  // port router
    
      const login = 'admin';   // login router
      const password = '12345' // pass router
      
      
      let sessionid = ''
      let realm = '';
      let token = '';
      
      function getHash() {
        const a = `${login}:${realm}:${password}`;
        const b = crypto.createHash('md5').update(a).digest('hex');
        const c = token + b;
        const d = crypto.createHash('sha256').update(c).digest('hex');
        return d;
      }
      
      function auth() {
        const postData = JSON.stringify({
          login,
          password: getHash(),
        }, null, 2);
        
        const options = {
          host: ip,
          port: port,
          path: '/auth',
          method: 'POST',
          headers: {
            'Content-Length': Buffer.byteLength(postData),
            'Cookie': `_authorized=${login}; sysmode=router; session_id=${sessionid}`,
            'Cache-Control': 'no-cache',
            'Accept': 'application/json, text/plain, */*',
            'Content-Type': 'application/json;charset=UTF-8',
          }
        };
        
        const req = http.request(options, (res) => {
          res.setEncoding('utf8');
          res.on('data', (chunk) => {});
          res.on('end', () => {
            api();
          });
        });
        
        req.write(postData);
        req.end();
      }
      
      function api() {
        const options = {
          host: ip,
          port: port,
          path: `/rci/show/ip/hotspot?mac=${mac}`,
          method: 'GET',
          headers: {
            'Cookie': `_authorized=${login}; sysmode=router; session_id=${sessionid}`,
            'Cache-Control': 'no-cache',
            'Accept': 'application/json, text/plain, */*',
            'Content-Type': 'application/json;charset=UTF-8',
          }
        };
        http.get(options, (resp) => {
          let body = '';
          resp.on('data', (chunk) => {
            body += chunk;
          });
          resp.on('end', () => {
            const data = JSON.parse(body);
            if (data.host !== undefined && data.host[0]) {
              callback(null, data.host[0].link === 'up' ? 1 : 0);
            } else {
              callback(null, 0);
            }
          });
        });
      }
      
      http.get(`http://${ip}:${port}/auth`, (resp) => {
        let body = '';
        resp.on('data', (chunk) => {});
        resp.on('end', () => {
          token = resp.headers['x-ndm-challenge'];
          realm = resp.headers['x-ndm-realm'];
          sessionid = resp.headers['set-cookie'][0].split(';')[0].slice(11);
          auth();
        });
      });
    };
    


  • Можно еще для mikrotikа инструкцию.



  • @amgstone Добрый день, добавим обязательно


Log in to reply