• Веб сокеты в node js?

    @de1m
    Я бы посоветовал всё таки использовать socket.io он может не только websocket, но и GET и POST для клинтов, которые не могут websocket.
    В вашем варианте плохо то, что надо два порта и я так понимаю их будет четыре если ещё добавить https.
    Вот пример с socket.io
    var express = require('express');
    var app = express();
    var server = require('http').createServer(app);
    var io = require('socket.io')(server);
    var mkdirp = require('mkdirp');
    
    var appPort = process.env.APPPORT || "5000"
    
    app.set('views', __dirname + '/app/views')
    app.set('view engine', 'pug')
    app.use(express.static(__dirname + '/public'))
    
    server.listen(appPort, function () {
      console.log('Server listening at port %d', appPort);
    });
    
    //App components
    var routes = require('./app/routes');
    
    app.use('/', routes);
    
    io.attach(server);
    
    var socket = require('./app/socket');
    socket.start(io);

    В папке app/socket лежит остальное, подробней можно посмотреть тут

    Ответ написан
    Комментировать
  • Как искать несколько устройств в локальной сети?

    @de1m Автор вопроса
    В общем сегодня было время и я думаю нашел подходящее решение. Клиетны (esp8266) будут слать каждые 10 сек. свою информацию на мултикаст адрес:порт 239.255.255.250:400

    Может бы кому понадобится. Код клинта (esp8266) в С:
    #include "ets_sys.h"
    #include "user_interface.h"
    #include "osapi.h"
    #include "gpio.h"
    #include "os_type.h"
    #include <espconn.h>
    
    /* Change to desired SSID name */
    const char ssid[32] = "wwwdlan";
    /* Enter the Password of the AP */
    const char password[32] = "wertwert5";
    /* Will hold the SSID and Password Information */
    struct station_config stationConf;
    
    struct espconn sendResponse; //udp
    esp_udp udp;
    
    // timer
    os_timer_t send_udp_device_info;
    
    /******************************************************************************
    * FunctionName : user_init
    * Description : entry of user application, init user function here
    * Parameters : none
    * Returns : none
    *******************************************************************************/
    
    void send_dev_info(void *pArg)
    {
    	int err;
    	 sendResponse.type = ESPCONN_UDP;
    	 sendResponse.state = ESPCONN_NONE;
    	 sendResponse.proto.udp = &udp;
    	 IP4_ADDR((ip_addr_t *)sendResponse.proto.udp->remote_ip, 239, 255, 255, 250);
    	 sendResponse.proto.udp->remote_port = 4000; // Remote port
    	 err = espconn_create(&sendResponse);
    	 err = espconn_send(&sendResponse, "hi123", 5);
    	 err = espconn_delete(&sendResponse);
    
    }
    
    
    void user_init(void)
    {
        /* Select UART 0 and configure the baud rate to 9600 */
        uart_div_modify(0, UART_CLK_FREQ / 9600);
        os_printf("Demo Example - ESP8266 as Station\r\n");
    
        /* Configure the ESP8266 to Station Mode */
        wifi_set_opmode( STATION_MODE );
    
        /* Copy the SSID and Password Info to the structure */
        os_memcpy(&stationConf.ssid, ssid, 32);
        os_memcpy(&stationConf.password, password, 32);
    
        /* Configure the station to connect to the following AP */
        wifi_station_set_config(&stationConf);
    
        /* Connects to the AP */
        wifi_station_connect();
    
        os_timer_setfn(&send_udp_device_info, send_dev_info, NULL);
        os_timer_arm(&send_udp_device_info, 10*1000, 1);
    }


    И программа на компе в node.js
    var PORT = 4000;
    var MULTICAST_ADDR = '239.255.255.250';
    var dgram = require('dgram');
    var client = dgram.createSocket('udp4');
    
    client.on('listening', function () {
        var address = client.address();
        console.log('UDP Client listening on ' + address.address + ":" + address.port);
    });
    
    client.on('message', function (message, rinfo) {
        console.log('Message from: ' + rinfo.address + ':' + rinfo.port + ' - ' + message);
    });
    
    client.bind(PORT, function () {
        client.addMembership(MULTICAST_ADDR);
    });
    Ответ написан
    Комментировать
  • Где можно получить образования инженера - электроника с новыми знаниями в этой области?

    @de1m
    Я подозреваю, что нигде. Пока вы будете пять лет учиться уже всё давно устареет. К тому-же в электроннике скорость устаривания всётаки несколько ниже, чем к примеру в IT.
    Самый хороший вариант, учёба и практика паралелльно. К примеру три дня учится и два работать или что-то похожее.
    Ответ написан
    1 комментарий
  • Распределение силы тока в параллельно подключенных проводах?

    @de1m
    Да, будет распределятся, в теории должно быть пополам, но это зависит от сопротевления в проводе.
    Прохождение тока засит от площади проводника только до определённого уравня, позже ток проходит по внешней стороне проводника и дальше уже площадь проводника роли не играет. В вашем случае можно наверное скрутить несколько штук вместе.
    Ответ написан
  • Как увидеть node_modules "снаружи" контейнера Docker?

    @de1m
    Надо на один уровень выше монтировать

    volumes:
      - ../app:/src/app


    Может надо вместо ".." папку написать.
    Ответ написан
    Комментировать
  • Как обновить Node.js в Ubuntu?

    @de1m
    npm install -g @angular/cli

    Вы пытаетесь ангуляр глобально поставить, но без нужных прав. Используйте sudo, когда есть параметр "-g"
    Ответ написан
  • Почему не работает npm install в Vagrant?

    @de1m
    ".deps/Users/eshanker/Code/fsevents/lib" - это часть выглядит, как слинкованная с хостовой машины. Это так?
    При установки модулей в такую папку, часто выходит ошибка, так как npm в линуксе делает hardlinks или как-то так.
    И виртуалбокс не поддерживает такое, вроде бы для этого есть опция, но она у меня как-то через раз работала.
    Ответ написан
    6 комментариев
  • Выбор платформы виртуализации?

    @de1m
    На двух серверах можно тоже развернуть отказоустойчевый кластер. Рассказываю.
    VMWare - у них есть VSA (vSphere Storage Appliance) - что-то типа RAID10 по сети, на каждом сервере лежит копия другого сервера, соответсвено можно использовать только половину диского пространства. Но зато работает на двух серверах, ещё может быть минус, что надо хорошую сеть, чтобы была нужная скорость. У нас два сервара были с друг другом соеденены через 10Gbit/s. Я не уверен, есть ли это опция в бесплатной версии VMWare ESXi.
    MS HyperV - у него есть бесплатная версия, но тут нужен уже сторедж, где будут лежать виртуальные диски и соответсвенно на двух серверах работать не будет. Еще желательно иметь AD. Если вы ни когда ещё не работали с Hyper-V, то это очень удобная и хорошая вещь. По моему мнению лучше, чем VMWare.
    Proxmox, KVM - разные продукты, но у обоих проблема в сторадже, так как стандартно у них его нет. Но здесь хорошо может помочь Ceph, там выше писали, что как-то его тяжело ставить и с ним работать, но это не так. У нас внутри фирму есть кластер, работает с 2015 года и ещё один у Hetzner'a. Для установки есть ceph-deploy. Но для него надо три сервера.
    Если выбирать из Proxmox или КVM, то всё таки лучше брать Proxmox, там надо меньше делать руками и довольно просто добавить поддержку ceph.
    Ответ написан
  • Как сделать плату захвата видео?

    @de1m
    хотя этот проект и сделан для vga, но может быть вам подойдёт.
    Ответ написан
    Комментировать
  • Как правильно использовать docker в разработке node.js ( отладка)?

    @de1m
    я использую для этого supervisord. В описание много написано, но на деле надо только сделать две вещи:
    1.
    npm i --save supervisor
    2. Добавить в package.json
    "scripts": {
        "test": "node_modules\\\\.bin\\\\supervisor index.js",
        "start": "node index.js"
      },

    Это путь в линуксе.
    3. Запускать с
    npm test
    Ответ написан
    Комментировать
  • Как вывести полученные из MySQL данные за пределы функции?

    @de1m
    Как вам уже выше сказали connection.query() и есть уже callback функция, её надо просто вызывать в нужном месте.
    Чтобы функция выполнялась "как-будто" последовательно, то надо использовать либо promise либо async/await(более новый метод, чем promise)
    Ответ написан
    Комментировать
  • Как достать данные с модуля который дергает базу, nodejs/express?

    @de1m
    Можено сделать с callback'ом
    var getDataFromDatabase = function () {
      var arr = []
      var con = mysql.createConnection(conf.config);
      con.connect(function (err) {
    
        if(err) throw err;
        con.query("SELECT DID, DName FROM Device")
        .on('result', function (data) {
          arr.push(data)
        })
        .on('end', function () {
          return callback(null, arr);
        })
        .on('error', function(err){
            return callback (err, null);
        });
    }
    
    module.exports = {
        getDataFromDatabase
    }


    Потом вызываете
    var fromDB = require(./modulName);
    fromDB.getDataFromDatabase(function(err, result){
        if(err){
            console.log(err);
        } else {
            console.log(result);
        }
    })


    Можно сделать через промис
    var getDataFromDatabase = function (callback) {
        return new Promise((resolve, reject) => {
            var arr = []
            var con = mysql.createConnection(conf.config);
            con.connect(function (err) {
    
                if (err) throw err;
                con.query("SELECT DID, DName FROM Device")
                    .on('result', function (data) {
                        arr.push(data)
                    })
                    .on('end', function () {
                        return resolve(arr);
                    })
                    .on('error', function (err) {
                        return reject(err);
                    })
            });
        })
    }
    
    module.exports = {
        getDataFromDatabase
    }

    Вызов
    var fromDB = require("./modulName");
    fromDB.getDataFromDatabase()
        .then(result =>{
            console.log(result);
        },(err)=>{
            console.log(err);
        })


    Ну и через асинхрнные функции тоже
    var getDataFromDatabase = async function (callback) {
        return new Promise((resolve, reject) => {
            var arr = []
            var con = mysql.createConnection(conf.config);
            con.connect(function (err) {
    
                if (err) throw err;
                con.query("SELECT DID, DName FROM Device")
                    .on('result', function (data) {
                        arr.push(data)
                    })
                    .on('end', function () {
                        return callback(null, arr);
                    })
                    .on('error', function (err) {
                        return callback(err, null);
                    })
            });
        })
    }
    
    module.exports = {
        getDataFromDatabase
    }

    Вызов
    var fromDB = require("./modulName");
    var test = await fromDB.getDataFromDatabase();


    Возможно я где-то ошибся, писал по памяти.
    Вот тут я почти всё писал на асинхронных функциях может быть что-то полезное найдёте.
    Ответ написан
    2 комментария
  • Что использовать для PaaS?

    @de1m
    Под описываемые вами желания, те продукты, что вы описали как-то не очень доходят.
    Я бы на вашем месте смотрел в сторону докера, а точнее говоря kubernetes'a, он собственно для таких вещей и придуман.
    Ответ написан
    Комментировать
  • Стоит ли использовать Docker на продакшене?

    @de1m
    У нас пять серверов в hetzner и несколько больших во внутреней сети, на них на всех крутяться контейнеры для разных вещей(mysql, mssql, bind, openvpn, etc). Начали со всем этим, где-то года три назад. Проблемы были, но небольшие и они уже исправлены, последние где-то месяцев 10 я ничего не вспомню.
    Если вы хотите CI/CD, то смотрите в сторону kubernetes. Его главный плюс, что можно всем управлять через API. Мы к этой идеи тоже пришли и я буквально неделю назад закончил установку kubernetes'а на трех серверах у hetzner и начал туда переводить наши сервисы.
    У докера я вижу два главных преимушества:
    1. Очень чёткое разделение между данными и системой. Выводишь нужные данные на volumes и делаешь с них бэкапы. Если сервер сгорел, заливаешь образы для docker'а и накатываешь данные и готово.
    2. Повторяемость окружения.
    Ответ написан
    1 комментарий
  • Разработка электронного устройства в качестве хобби?

    @de1m
    А ещё лучше начать с esp32 (с готовой devboard). Тогда у вас будет wifi и bluetooth.
    Начать надо конечно с проектов, как и на ардуино - мигание диодом, подключание к своей точке, поднять tcp-сервер итд. Если по мелочи начать, то будет нормально.

    Я по похожему принципу поступил, когда свою лампу делал.

    Что-то учить и читать надо паралельно практике, а то будете год теорию учить и потом уже всё надоест.
    Ответ написан
    1 комментарий
  • Как вызывать скрипт каждые 30 минут?

    @de1m
    Если у вас скпипт написан на node.js, то использование node-cron ещё как-то оправдано, а если нет, то лучше не надо.
    Ответ написан
    Комментировать
  • На базе каких светодиодов лучше делать программируемую светодиодную ленту?

    @de1m
    если надо управлять каждым в отдельности, плюс ещё и цветами, то лучше взять ws2812, они вывают на ленте(60шт./м или 120шт./м) либо как pixel'и
    Ответ написан
  • Как Перейти с Proxmox на Hyper-v?

    @de1m
    Я помню когда-то давно пеходил с VirtualPC2005R2 на Virtualbox, но там проблема с дрова ещё была, у современных ос такого уже нету.
    Я бы сделал так, создал в Hyper-V пустую вм с доском, а дальше воспользовался бы clonezilla. У clonezilla есть опция для копирования целого диска через сеть. То есть грузите вышу вм (proxmox) с образа clonezilla и пустую вм тоже. Потом с первой (proxmox) говорите, что хотите скопировать диск через сеть.
    Плюсы у токого решения, что не надо копировать виртуальный диск для конвертирования.
    Ответ написан
  • Почему сообщение не отправляется всем клиентам (socket.io)?

    @de1m
    У меня с broadcast тоже не работало, попробуйте так.
    io.emit('writeModalConfigs', result);
    Вот тут полностью пример
    Ответ написан
  • Как найти причину бага в Node? Неверная архитектура?

    @de1m
    Можно сделать debug вывод, если к примеру стартовать программу с ключом "-d".
    Но по уму наверное надо работать с объектов "Error" который выдаёт trace до ошибки.
    var winston = require('winston');
    //logger is configured to save output to log file
    var logger = new (winston.Logger)({
      level: level,
      transports: [
        new (winston.transports.File)({
          filename: '' + logdir + "/" + timeAct + '_' + program.server + '.log',
          json: false
        })
      ]
    });
    
    //add console output if debug is on
    if (program.debug) {
      logger.add(winston.transports.Console, { json: false });
    } else {
      if (program.debugfile) {
        logger = new (winston.Logger)({
          level: 'debug',
          transports: [
            new (winston.transports.File)({
              filename: '' + logdir + "/" + timeAct + "_" + program.server + '_debug_.log',
              json: false
            })
          ]
        });
      } else {
        //if error, write to console
        logger.add(winston.transports.Console, {
          level: 'error',
          json: false
        });
      }
    }
    Ответ написан
    Комментировать