Iskra JS и cloudmqtt

Тема в разделе "Iskra JS, Espruino, Йодо", создана пользователем Koatz, 27 ноя 2019.

Метки:
  1. Koatz

    Koatz Нуб

    Добрый день. Хочу публиковать данные с Iskra JS+ WiFi модуль на сервис cloudmqtt и считывать их с ПК например через python. Нигде не могу найти примера на русском языке как публиковать и считывать данные с топика на базе cloudmqtt. Нет ли у кого ссылочки что посмотреть или почитать?
     
  2. BAR__MEN

    BAR__MEN Вселенский Няш Администратор

    А чем английский вариант не угодил?
    Для работы с MQTT есть отдельная библиотека

    Можно попросить кого-то перевести, но это за деньежку. А так только гуглом переводить
     
    KindMan нравится это.
  3. Koatz

    Koatz Нуб

    Я не очень понимаю как должен выглядеть код чтоб подключиться к cloudmqtt серверу и публиковать/считывать результаты. Есть ли у кого-нибудь пример кода? Например подключаемся к cloudmqtt, публикуем 1 в топик, подписываемся на топик, считываем 1 в переменную.
     
  4. Koatz

    Koatz Нуб

    Здравствуйте. Немного подразобрался, "оно" даже работает. Разобрался как из объекта data вытащить uid. Но возникла проблема. Программа продолжает посылать данные uid если убрать nfc метку. Пробовал делать условия если данные пусты, то в переменную nfcdata писать 0, но, видимо что-то делаю не так. Не могли бы вы ткнуть носом как это сделать в данном коде?

    Код (Javascript):


    var libs = {"@amperka/wifi": require("@amperka/wifi")};

    var host = "host mqtt";

    var options = {
      client_id: getSerial(),
      keep_alive: 60,
      port: 13053,
      clean_session: true,
      username: "mqtt login",
      password: "mqtt password",
      protocol_name: "MQTT",
      protocol_level: 4
    };

    var mqtt = require("MQTT").create(host, options);

        var topic = "/test/nfc";

    mqtt.on("connected", function() {
      mqtt.subscribe(topic);
      setInterval(sendToCloud, 7000);
    });

    mqtt.on("disconnected", function() {
      setTimeout(function() {
        mqtt.connect();
      }, 1000);
    });



    function sendToCloud() {
      var datamsg = JSON.stringify({});
      mqtt.publish(topic, nfcdata);//переменная
    }

     

    var SSID = "My_SSID";
    var PASSWORD = "MY_password";
    PrimarySerial.setup(115200);
    var wifi = libs["@amperka/wifi"].setup(PrimarySerial, function(err) {
      wifi.connect(
        SSID,
        PASSWORD,
        function(err) {
          if (!err) {
            console.log("Connected to WiFi");
            mqtt.connect();
          } else {
            console.log("Error connection to Wi Fi network " + SSID);
          }
        }
      );
    });

    I2C1.setup({sda: SDA, scl: SCL, bitrate: 400000});
    var nfcdata=0;//переменная
    var nfc = require('@amperka/nfc').connect({i2c: I2C1, irqPin: P10});

    nfc.wakeUp(function(error) {
      if (error) {
        print('wake up error', error);
      } else {
        print('wake up OK');
        nfc.listen();
      }
    });
    nfc.on('tag', function(error, data) {
      if (error) {
        print('tag read error');
      } else {
        print(data.uid);
        nfcdata=data.uid;//переменная
      }

      setTimeout(function () {
        nfc.listen();
      }, 1000);
    });
     
  5. ИгорьК

    ИгорьК Гуру

    Могу ткнуть лишь головой в логику.

    У вас каждые 7 секунд вызывается функция sendToCloud()
    Эта функция, ничего не проверяя, кидает переменную nfcdata на брокер.

    nfcdata всегда имеет последнее считанное значение.

    Чтобы исправить ситуацию, вам надо в функции sendToCloud():
    - перед отправкой на брокер проверять что значение nfcdata не равно, например, 0, если 0 - ничего не делать;
    - после отправки - обнулять значение nfcdata.

    Как это сделать в коде - думайте сами.


    Но еще лучше - не дергать отправку каждые 7 секунд, а отправлять данные лишь по считыванию карты.
     
  6. Koatz

    Koatz Нуб

    Почему "гуру" форумов всегда такие надменные? штука в том, что пока карта стоит на считывателе. программа должна отправлять uid на mqtt сервер, а если карту убрать, то нужно отправлять 0.
     
  7. ИгорьК

    ИгорьК Гуру

    Заявление на удаление с форума?

    Объясните мне, вашу ЛИЧНОСТЬ здесь кто-то трогал, оценивал?

    На ваш вопрос не ответил?

    Вам кто-то мешает это сделать, или код должен быть написан за вас?

    И кто кроме вас знает, что вам надо.
     
    Последнее редактирование: 11 дек 2019
  8. Koatz

    Koatz Нуб

    Основание для удаления? Вашу личность тоже никто не трогал.
    Надменно, не находите?
     
  9. ИгорьК

    ИгорьК Гуру

    Кто ж знал, что думаете вы носом.

    Как никто не знал, как должна работать программа.
    Тогда еще все проще - в функции отправки добавьте строку, присваивающую nfcdata ноль после отправки.
     
  10. Koatz

    Koatz Нуб

    Зачем вы передергиваете? "Ткнуть носом" - устойчивое выражение. То, что я назвал "гуру" надменными это не оскорбление, а факт. Многие в таком ключе общаются, непонятно почему. Создана тема, вопрос задан форумчанам, а не конкретно вам. Если не нравится вопрос, то не отвечайте. В чем проблема? Зачем незнакомым людям говорить такие вещи, которые вы бы не сказали, если бы вам задали вопрос тет-а-тет?

    по теме: спасибо за ответ. Разобрался. До этого я зачем-то пытался проверять в блоке считывания метки.
     
  11. ИгорьК

    ИгорьК Гуру

    Еще раз, вашу личность хоть как-то оценивали?

    пысы. Зря вы так оцениваете отношение к себе.
     
    Последнее редактирование: 11 дек 2019
  12. DetSimen

    DetSimen Спамовредитель Модератор

    Ох, не с тех ты бубей на этот форум зашол. :)

    "Примерно во времена Домициана в Риме жил такой греческий философ-стоик Эпиктет. Ему приписывают замечательный совет всем, кто хочет чему-то научиться: «Если хочешь учиться, будь готов считаться дураком и тупицей»"

    Дедовщину не зря придумали же.
     
    Daniil нравится это.
  13. Koatz

    Koatz Нуб

    Здравствуйте. Снова с вопросом. Кто-нибудь может объяснить, что не так? Вроде как программа должна отправлять данные раз в 7 секунд (раньше так и было) либо данные uid, либо 0. Но сейчас не могу понять, что происходит. Устройство шлет данные раз в 1 секунду, а иногда быстрее. И даже когда данные карты считаны, устройство шлет вперемешку с 0.

    Код (Javascript):


    var libs = {"@amperka/wifi": require("@amperka/wifi")};

    var host = "сервер";

    var options = {
      client_id: getSerial(),
      keep_alive: 60,
      port: 13053,
      clean_session: true,
      username: "логин",
      password: "пароль",
      protocol_name: "MQTT",
      protocol_level: 4
    };

    var mqtt = require("MQTT").create(host, options);

        var topic = "/test/nfc";

    mqtt.on("connected", function() {
      mqtt.subscribe(topic);
      setInterval(sendToCloud, 7000);
    });

    mqtt.on("disconnected", function() {
      setTimeout(function() {
        mqtt.connect();
      }, 1000);
    });

    var nfcdata=0;

    function sendToCloud() {
      var datamsg = JSON.stringify({});
      mqtt.publish(topic, nfcdata);
      nfcdata=0;//переменная
    }



    var SSID = "wifi";
    var PASSWORD = "password";
    PrimarySerial.setup(115200);
    var wifi = libs["@amperka/wifi"].setup(PrimarySerial, function(err) {
      wifi.connect(
        SSID,
        PASSWORD,
        function(err) {
          if (!err) {
            console.log("Connected to WiFi");
            mqtt.connect();
          } else {
            console.log("Error connection to Wi Fi network " + SSID);
          }
        }
      );
    });

    I2C1.setup({sda: SDA, scl: SCL, bitrate: 400000});
    var nfc = require('@amperka/nfc').connect({i2c: I2C1, irqPin: P10});

    nfc.wakeUp(function(error) {
      if (error) {
        print('wake up error', error);
      } else {
        print('wake up OK');
        nfc.listen();
      }
    });
    nfc.on('tag', function(error, data) {
      if (error) {
        print('tag read error');
      } else {
        print(data.uid);
        nfcdata=data.uid;//переменная
      }

      setTimeout(function () {
        nfc.listen();
      }, 1000);
    });
    плюс ко всему часто не подключается к WiFi (разные точки доступа пробовал)
     
    Последнее редактирование: 14 янв 2020
  14. ИгорьК

    ИгорьК Гуру

    ... плюс, полагаю, периодически перегружается.
     
  15. Koatz

    Koatz Нуб

    Спасибо. Это как-то решается? Я пробовал и в другой usb втыкать, и питание от адаптера делать. Все равно, первые несколько секунд может как положено работать, а затем ускоряется и получается полная дичь.
     
  16. ИгорьК

    ИгорьК Гуру

    Проблема во взаимодействии этих частей кода:

    Код (Javascript):
    mqtt.on("connected", function() {
      mqtt.subscribe(topic);
      setInterval(sendToCloud, 7000);
    });

    mqtt.on("disconnected", function() {
      setTimeout(function() {
        mqtt.connect();
      }, 1000);
    });
    Каждый раз, когда теряется коннект с брокером, при его восстановлении создается новый таймер, который сыплет на брокер информацию.
    Лишние таймеры требуют ресурса процессора, в том числе, начинают ломать wifi (ибо пока callback очередного таймера не отработает - возможности поддержки сети ограничены).

    В конце концов количество этих таймеров "убивает" устройство.

    Решением будет создание всего одного именованного в переменной таймера для отправки сообщения на брокер, остановке его при потере коннекта и повторного запуска при восстановлении связи.
     
    Последнее редактирование: 14 янв 2020
  17. Koatz

    Koatz Нуб

    Спасибо большое. Буду думать