Arduino Mega Server

Модератор: Alex

Аватара пользователя
uni
Сообщения: 191
Зарегистрирован: Вс июл 26, 2015 9:21 pm
Откуда: Екатеринбург
Благодарил (а): 4 раза
Поблагодарили: 7 раз
Контактная информация:

Re: Arduino Mega Server

Сообщение uni » Чт авг 13, 2015 9:49 am

Работа с JSON в jscript удобна, когда имеешь дело с массивами произвольных данных. Интерпретация туда и обратно прозрачна и встроена в язык. У меня есть настроечные файлы - файлы конфигурации. Они имеют формат json и хранятся на стороне сервера. Эти файлы могу быть значительными по объёму в зависимости от системы и количества хранимых параметров. Вообще, как я уже говорил, json является стандартом для обмена данными в сети.

Ну, а самое важное, мк очень плохо переваривает работу со строками. Т.е. код, который что-то делает со строками должен быть минимальным. На роутере у меня другая проблема. Запрос от клиента обрабатывает командный интерпретатор shell, он тоже тормозной, а ещё убогий. Там нужно компактно всё делать. XML парсить я бы просто не смог, а для JSON есть библиотечка.
Если использовать короткие теги вроде <p1> <p2>, то разница в объёме передаваемого по сети будет минимальна и, судя по всему, практически несущественна.
Зачем вообще теги использовать? Формировать интерфейс должен только браузер, а в посылках должны быть наборы сухих данных.

П.С. А, это теги xml'я. Нужно ещё и названия им придумывать.

В общем, покажите как вы передаёте массив к примеру: {1, '2', 3, '4', 'name' } при помощи xml наверх и как выглядит код разбора этого дела на страничке. Я покажу как это делается с использованием json.
Россия навсегда!
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Чт авг 13, 2015 10:46 am

Это со стороны сервера, со стороны браузера будет чуть позже.

Код: Выделить всё

void sendXMLtitle(EthernetClient cl) {
  cl.println(F("<?xml version = \"1.0\" ?>"));
}

void sendTagByte(char tagBase[], char tagCount[], byte val, EthernetClient cl) {
  cl.print("<"); cl.print(tagBase); cl.print(tagCount); cl.print(">");
  cl.print(val);
  cl.print("</"); cl.print(tagBase); cl.print(tagCount); cl.println(">");
}

void sendTagStr(char tagBase[], char tagCount[], char s[], EthernetClient cl) {
  cl.print("<"); cl.print(tagBase); cl.print(tagCount); cl.print(">");
  cl.print(s);
  cl.print("</"); cl.print(tagBase); cl.print(tagCount); cl.println(">");
}


void responseTest(EthernetClient cl) {
  sendXMLtitle(cl);

  cl.println("<inputs>");
    sendTagByte("p1",  "", 1,  cl);
    sendTagByte("p2",  "", 2,  cl);
    sendTagByte("p3",  "", 3,  cl);
    sendTagByte("p4",  "", 4,  cl);
    sendTagStr("nm",  "", name,  cl);
  cl.println("</inputs>");
}

<p1>1</p1>
<p2>2</p2>
<p3>3</p3>
<p4>4</p4>
<nm>name</nm>
Аватара пользователя
uni
Сообщения: 191
Зарегистрирован: Вс июл 26, 2015 9:21 pm
Откуда: Екатеринбург
Благодарил (а): 4 раза
Поблагодарили: 7 раз
Контактная информация:

Re: Arduino Mega Server

Сообщение uni » Чт авг 13, 2015 12:06 pm

Вот конкретный пример, ссылку на который я выше давал:

Код: Выделить всё

// Путь к скрипту.
var ACTION = '/cgi-bin/modules/schoolbell/action.cgi';

// Отправка запроса серверу на чтение настроек: "{ action : 'loadsettings' }"
TabControl.prototype = {

    OnTabChange: function() {

        switch ( this.ItemName ) {

            case 'TabSettings': {

                // Настройки.
                $.post( ACTION, { action : 'loadsettings' },
                    function( data ) { // <- чтение ответа тут же
                        settings.Load( data );
                        settings.Refresh();
                    }, 'json' );

                break;
            }
            
// Приём ответа и его декодирование осуществляется автоматически, за это отвечает параметр 'json'.    
// Вот как выглядит метод Settings.Load():

Load: function( values ) {

    try {

        this.mode = values[ 'mode' ];
        this.schedule = values[ 'schedule' ];
        this.preinterval = values[ 'preinterval' ];
        this.premelody = values[ 'premelody' ];

    } catch ( ex ) {

        console.error( ex );
    }

}

// То есть у меня на входе сразу имеется массив с именованными параметрами. Сами настройки
// выглядят вот так (это передаваемая строка):

{"mode":"1","schedule":"1","preinterval":"2","premelody":"0"} 
Т.е. никакого ни кодирования, ни декодирования я вообще не делаю, просто нужно добавить скобочек, запятых и кавычек (последние не обязательны). При приёме мы имеем объект jscript сразу и работаем с ним как с массивом. Причём, это более сложный вариант, для простых массивов всё ещё прозрачней.
Россия навсегда!
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Чт авг 13, 2015 1:23 pm

Со стороны браузера

Код: Выделить всё

function getTest() {
  var request = new XMLHttpRequest();
  request.onreadystatechange = function() {
    if (this.readyState == 4) {
      if (this.status == 200) {
        if (this.responseXML != null) {

          try {
            var pin1 = this.responseXML.getElementsByTagName('p1')[0].childNodes[0].nodeValue;
          } catch (err) {
              pin1 = "-1";
            }
          try {
            var pin2 = this.responseXML.getElementsByTagName('p2')[0].childNodes[0].nodeValue;
          } catch (err) {
              pin2 = "-1";
            }
          try {
            var pin3 = this.responseXML.getElementsByTagName('p3')[0].childNodes[0].nodeValue;
          } catch (err) {
              pin3 = "-1";
            }
          try {
            var pin4 = this.responseXML.getElementsByTagName('p4')[0].childNodes[0].nodeValue;
          } catch (err) {
              pin4 = "-1";
            }
          try {
            var nme = this.responseXML.getElementsByTagName('nm')[0].childNodes[0].nodeValue;
          } catch (err) {
              nme = "-1";
            }            
          
        } //if (this.responseXML != null)
      } // if (this.status == 200)
    } // if (this.readyState == 4)
  } // request.onreadystatechange = function()
} 
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Чт авг 13, 2015 1:29 pm

Ещё вопрос в XML теги однозначно определяют содержимое, а в json интерпретация месива из данных и скобок как происходит?

Ещё момент, в связи с экономией, jQuery для нас непозволительная роскошь, вернее неплохо было бы иметь вариант с ним и без него.
Аватара пользователя
uni
Сообщения: 191
Зарегистрирован: Вс июл 26, 2015 9:21 pm
Откуда: Екатеринбург
Благодарил (а): 4 раза
Поблагодарили: 7 раз
Контактная информация:

Re: Arduino Mega Server

Сообщение uni » Чт авг 13, 2015 1:42 pm

Ещё вопрос в XML теги однозначно определяют содержимое, а в json интерпретация месива из данных и скобок как происходит?
А зачем это нужно? Либо порядковым номером, либо просто по имени объекта.
Есть стандарт для JSON.

Без jquery я уже давал ссылку. Вот так (практически то же самое):
modbus.jsПоказать

Код: Выделить всё

    ajax: function( request ) {

        var xhr = new XMLHttpRequest();

        xhr.open( request.type, request.url, request.async );

        xhr.onreadystatechange = function() {

            if ( this.readyState == 4 && this.status == 200 ) {

                request.success( JSON.parse( xhr.responseText ) );
            }

        };

        xhr.send( JSON.stringify( request.data ) );
    },


    Post: function( task ) {

        var self = this;
        var bytes = [];

        try {

            bytes.push( task.slaveid );
            bytes.push( task.func );
            bytes.push( task.address >> 8 );
            bytes.push( task.address & 0xFF );

            if ( task.func == WRITE_MULTIPLE_REGISTERS ) {

                bytes.push( task.value.length >> 8 );
                bytes.push( task.value.length & 0xFF );
                bytes.push( 2 * task.value.length );
             
                for ( var n = 0; n < task.value.length; n++ ) {

                    bytes.push( task.value[n] >> 8 );
                    bytes.push( task.value[n] & 0xFF );
                }

            } else {

                bytes.push( task.value >> 8 );
                bytes.push( task.value & 0xFF );
            }

            // CRC высчитывается на стороне shell-скрипта.
            
            // Преобразуем массив в строку.
            var adu = '';

            for ( var b in bytes ) adu += dec2hex( bytes[b] );

            this.ajax({

                url: this.Url,
                type: 'POST',
                async: false,
                data: { action: 'query', serial: this.Serial, data: adu },
                success: function( data ) { self.OnReceive( task, data ); },
                dataType: 'json'
            });

        } catch ( ex ) {

            console.error( ex );
        }

    },
Россия навсегда!
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Чт авг 13, 2015 2:20 pm

А посылать имя объекта это чем определяется? По желанию? Можно посылать, а можно нет?
Аватара пользователя
uni
Сообщения: 191
Зарегистрирован: Вс июл 26, 2015 9:21 pm
Откуда: Екатеринбург
Благодарил (а): 4 раза
Поблагодарили: 7 раз
Контактная информация:

Re: Arduino Mega Server

Сообщение uni » Чт авг 13, 2015 2:29 pm

Форматом json определяется. Ты работаешь либо с упорядоченным набором объектов, либо с массивами, либо вперемешку. В общем, объекты и их наборы можно представлять для себя как структуры с именованными параметрами. Каждое поле должно иметь строковое имя. Если нет имени, то это уже просто массив (оформляется квадратными скобками), а не структура (оформляется фигурными скобками).

Если посмотреть по ссылке на стандарт (там есть картинки), то там можно понять как оформляются данные в json.
Россия навсегда!
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Чт авг 13, 2015 8:05 pm

Что-то json у меня плохо идёт, видать мозг ещё не до конца съехал в программистскую сторону. Был опыт с OHM — впечатления остались ужасные (хотя OHM я всё-таки заставил работать).
Аватара пользователя
uni
Сообщения: 191
Зарегистрирован: Вс июл 26, 2015 9:21 pm
Откуда: Екатеринбург
Благодарил (а): 4 раза
Поблагодарили: 7 раз
Контактная информация:

Re: Arduino Mega Server

Сообщение uni » Чт авг 13, 2015 8:27 pm

Очень желательно, если хотите использовать JsMn, настроить сниффер и JTAG. Без них очень трудно будет понять как работает парсер и почему именно так. Между прочим, на сайте автора где-то есть даже тест производительности таких парсеров и JsMn показывает там один из лучших результатов. Для встраиваемых приложений это важно.
К сожалению, я пока занят разработками в другой области и не могу участвовать. Железо я куплю себе на основе W5500, но придёт оно ещё не скоро.
Россия навсегда!
Ответить