"Кто дома?" через 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 Добрый день, добавим обязательно



  • Добрый вечер всем! я заметил что когда работают снипеты к кинетику происходит зависание самого роутера через пару дней. у кого нибудь такое же наблюдается?



  • Пользователь @m_n61rus написал в "Кто дома?" через Zyxel Keenetic:

    Добрый вечер всем! я заметил что когда работаю`

    У меня KN1010 , не замечал



  • @dev Решил по интересоваться. Скоро ли будет для микротика снипплет ?



  • Приветствую!
    у кого нибудь работает снипет?



  • @m_n61rus Добрый день, на момент написание сниппета все работало ☺



  • На момент написания снипета у меня работала .
    но после последних прошивок перестал работать ть



  • @m_n61rus Спасибо за информацию, будем иметь ввиду



  • Добрый день, вынужден был обновиться на новую версию 3.6.3 и сниппет не работает. Что нужно подправить ?



  • @Anatol Добрый день, возможно поменялся формат авторизации и структура запросов, к сожалению на текущий момент мы не можем заняться данным вопросом, предлагаем вернуться к нему позже.



  • Заменил сниппет, скриптом на самом роутере, теперь он по протоколу Mqtt отправляет сам сообщение, когда появляется и когда выходит из сети устройство с определенным MAC адресом.



  • а скриптик можно по смотреть?



  • Скрипт написал Khaninea из форума по keenetic, чуть подправил вывод на mqtt.

    #!/bin/sh

    DEV1="00:00:00:00:00:00"
    DEV2="00:00:00:00:00:00"

    replacement() {
    case "$1" in
    $DEV1 ) echo "1";;
    $DEV2 ) echo "2";;
    esac
    }

    #map del to 0 and new to 1
    replacement2() {
    case "$1" in
    new ) echo "1";;
    del ) echo "0";;
    esac
    }

    if [[ "$address" = "ipv4" && "$update" = "none" ]]; then
    #получаем mac устройства по ID
    mac=$(wget -qO - http://127.0.0.1:79/rci/show/ip/neighbour | jq --arg num "$id" '.[$num].mac')
    #проверяем mac на принадлежность нужному нам хосту
    who=$(replacement "$mac")
    [ -z "$who" ] && exit 0
    #replace mac to idx
    action2=$(replacement2 "$action")

    #публикуем mqtt сообщение в топик zyxel
    mosquitto_pub -d -t zyxel/$who -m "{"idx": $who, "sost": $action2}" -h 192.168.1.150 -p 1883 -r
    fi

    Ссылку не знаю можно ли выкладывать, но поиск по запуск скрипта при появлении нового клиента wifi



  • спасибо большое,поиграемся!



  • а для микротик когда появится?


Log in to reply