Страница 30 из 326
Re: Arduino Mega Server
Добавлено: Чт авг 13, 2015 9:49 am
uni
Работа с JSON в jscript удобна, когда имеешь дело с массивами произвольных данных. Интерпретация туда и обратно прозрачна и встроена в язык. У меня есть настроечные файлы - файлы конфигурации. Они имеют формат json и хранятся на стороне сервера. Эти файлы могу быть значительными по объёму в зависимости от системы и количества хранимых параметров. Вообще, как я уже говорил, json является стандартом для обмена данными в сети.
Ну, а самое важное, мк очень плохо переваривает работу со строками. Т.е. код, который что-то делает со строками должен быть минимальным. На роутере у меня другая проблема. Запрос от клиента обрабатывает командный интерпретатор shell, он тоже тормозной, а ещё убогий. Там нужно компактно всё делать. XML парсить я бы просто не смог, а для JSON есть библиотечка.
Если использовать короткие теги вроде <p1> <p2>, то разница в объёме передаваемого по сети будет минимальна и, судя по всему, практически несущественна.
Зачем вообще теги использовать? Формировать интерфейс должен только браузер, а в посылках должны быть наборы сухих данных.
П.С. А, это теги xml'я. Нужно ещё и названия им придумывать.
В общем, покажите как вы передаёте массив к примеру: {1, '2', 3, '4', 'name' } при помощи xml наверх и как выглядит код разбора этого дела на страничке. Я покажу как это делается с использованием json.
Re: Arduino Mega Server
Добавлено: Чт авг 13, 2015 10:46 am
Alex
Это со стороны сервера, со стороны браузера будет чуть позже.
Код: Выделить всё
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>
Re: Arduino Mega Server
Добавлено: Чт авг 13, 2015 12:06 pm
uni
Вот конкретный пример, ссылку на который я выше давал:
Код: Выделить всё
// Путь к скрипту.
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 сразу и работаем с ним как с массивом. Причём, это более сложный вариант, для простых массивов всё ещё прозрачней.
Re: Arduino Mega Server
Добавлено: Чт авг 13, 2015 1:23 pm
Alex
Со стороны браузера
Код: Выделить всё
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()
}
Re: Arduino Mega Server
Добавлено: Чт авг 13, 2015 1:29 pm
Alex
Ещё вопрос в XML теги однозначно определяют содержимое, а в json интерпретация месива из данных и скобок как происходит?
Ещё момент, в связи с экономией, jQuery для нас непозволительная роскошь, вернее неплохо было бы иметь вариант с ним и без него.
Re: Arduino Mega Server
Добавлено: Чт авг 13, 2015 1:42 pm
uni
Ещё вопрос в XML теги однозначно определяют содержимое, а в json интерпретация месива из данных и скобок как происходит?
А зачем это нужно? Либо порядковым номером, либо просто по имени объекта.
Есть стандарт для
JSON.
Без jquery я уже давал
ссылку. Вот так (практически то же самое):
Код: Выделить всё
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 );
}
},
Re: Arduino Mega Server
Добавлено: Чт авг 13, 2015 2:20 pm
Alex
А посылать имя объекта это чем определяется? По желанию? Можно посылать, а можно нет?
Re: Arduino Mega Server
Добавлено: Чт авг 13, 2015 2:29 pm
uni
Форматом json определяется. Ты работаешь либо с упорядоченным набором объектов, либо с массивами, либо вперемешку. В общем, объекты и их наборы можно представлять для себя как структуры с именованными параметрами. Каждое поле должно иметь строковое имя. Если нет имени, то это уже просто массив (оформляется квадратными скобками), а не структура (оформляется фигурными скобками).
Если посмотреть по ссылке на стандарт (там есть картинки), то там можно понять как оформляются данные в json.
Re: Arduino Mega Server
Добавлено: Чт авг 13, 2015 8:05 pm
Alex
Что-то json у меня плохо идёт, видать мозг ещё не до конца съехал в программистскую сторону. Был опыт с OHM — впечатления остались ужасные (хотя OHM я всё-таки заставил работать).
Re: Arduino Mega Server
Добавлено: Чт авг 13, 2015 8:27 pm
uni
Очень желательно, если хотите использовать JsMn, настроить сниффер и JTAG. Без них очень трудно будет понять как работает парсер и почему именно так. Между прочим, на сайте автора где-то есть даже тест производительности таких парсеров и JsMn показывает там один из лучших результатов. Для встраиваемых приложений это важно.
К сожалению, я пока занят разработками в другой области и не могу участвовать. Железо я куплю себе на основе W5500, но придёт оно ещё не скоро.