Нет, способ развести на эмоции - это человек 1995 года рождения, соединяющий usb-кабелем два usb-клиента и удивляющийся, почему не работает. Эта хотя бы слушает, что говорят и пытается что-то делать сама.
Я отправляю GET запрос формата ?text=000|2222|3333|4444|5555|
Я хочу первым параметром (вместо "000") отправлять "контрольную сумму" всего пакета, как это сделать? Хочу на сервере првоерять целостность пакета. Или не надо это..?
Я отправляю GET запрос формата ?text=000|2222|3333|4444|5555|
Я хочу первым параметром (вместо "000") отправлять "контрольную сумму" всего пакета, как это сделать? Хочу на сервере првоерять целостность пакета. Или не надо это..?
Я отправляю GET запрос формата ?text=000|2222|3333|4444|5555|
Я хочу первым параметром (вместо "000") отправлять "контрольную сумму" всего пакета, как это сделать? Хочу на сервере првоерять целостность пакета. Или не надо это..?
Закрой после разбора... Вроде же все логично - работу закончил, клиента остановил (сокет закрыл). Никто же тарелку не начинает мыть до того, как суп закончил есть.
Так и подсчитать. Сперва получить данные, потом сформировать запрос, и только потом отправлять, а считывать данные прямо в процессе отправки запроса считается дурным тоном.
String s;
for (int i = 1; i < 3; i++) {
s += "cat";
s += String(i);
s += "=";
s += String(analogRead(i));
// ... что-то типа того
}
client.println("POST /temp.php HTTP/1.1");
client.println("Host: 192.168.0.22");
client.println("Content-Length: " + String(s.length()) );
client.println("Content-Type: application/x-www-form-urlencoded");
client.println("");
client.print(s);
ps приведённый пример псевдокод, может даже и не скомпилируется, но суть вот такая
Поговорить хочу.
Так как я теперь 'умею' работать с char, String я трогать не хочу, тяжелее, медленнее.
Отправлять я буду строку формата val=1111|2222|3333}4444|5555.............nnnn|
К примеру, таких показаний у меня 100 штук.
Я создала char[510] и задумалась...как много динамической памяти трачу...а зачем?
Ведь можно в цикле подсчитать длину показаний и прибавить к ним число постоянных параметров (разделители и текст).
Т.е. если у меня 100 четырёхзначных показаний 100*4=400
Прибавляем 100 разделителей "|" 400+100=500
и добавляем ещё 4 (val=) итого Content-Length: 504
Всё верно?))))
byte count = 100;
int analog = 1024;
int ContentLength = 0;
void setup() {
Serial.begin(9600);
for (int i = 0; i < count; i++) {
char GetReadings[10];
//memset(GetReadings, 0, 10);//чистить не надо?
itoa(analog, GetReadings, DEC);
ContentLength = ContentLength + strlen(GetReadings);
}
Serial.println(ContentLength);
}
Единственное, память не надо жалеть до тех пор, пока её хватает, у есп куча минимум 40 килобайт, так что можно не жалеть. Сам по себе http-клиент или кто там, сервер, занимает гораздо больше памяти, и что теперь, не использовать его, что ли?
Всё таки придётся создавать массив? Т.к. считанные показания я сразу отправляю в клиент
Нет. Метод применения предрасчёта длины верен и оптимален. Если есть возможность при отсылке всегда соблюдать одну и ту же длину поля данных, а это позволяет любой *printf* (например с %05d), то все становится вовсе простым: content-length = 5 * кол-во полей + сепараторы + хидер.
Сделайте одинаковую. Забейте пустые места нулями, если пробелы не нравятся или сделайте выравнивание по левому краю. Методов-то много. Вплоть до передачи в шестнадцатеричном виде с фиксированной шириной поля в 4 символа.
Сделайте одинаковую. Забейте пустые места нулями, если пробелы не нравятся или сделайте выравнивание по левому краю. Методов-то много. Вплоть до передачи в шестнадцатеричном виде с фиксированной шириной поля в 4 символа.
if (analog<=999 && analog>99 )Serial.print("0");
if (analog<=99 && analog>9)Serial.print("00");
if (analog<=9 && analog<99)Serial.print("000");
Serial.print(analog);
Serial.print("|");
Хороший вариант, теперь у меня строка будет фиксированной длины.
Коли уж решили зафлудить, то можно и так сыканомить RAM:
if (analog < 10) Serial.print('0');
if (analog < 100) Serial.print('0');
if (analog < 1000) Serial.print('0');
Serial.print(analog);
Serial.print("|");
Только имейте в виду - каждый print инициирует отправку пакета. Выиграли память ардуины - потеряли производительность сетевой подсистемы. Нельзя сказать, что сеть ляжет под нагрузкой сразу же, но как-то неаккуратненько.
Только имейте в виду - каждый print инициирует отправку пакета. Выиграли память ардуины - потеряли производительность сетевой подсистемы. Нельзя сказать, что сеть ляжет под нагрузкой сразу же, но как-то неаккуратненько.
При прямом подключении я не получаю
Serial.println(Ethernet.begin(mac) );
Initialize Ethernet with DHCP:
DHCP assigned IP 192.168.1.56
connecting to 192.168.1.55
Получается что мой IP адрес не устанавливается
byte ip[] = {192, 168, 1, 3};
Вместо него ставится 192.168.1.56
https://www.arduino.cc/en/Reference/EthernetBegin
Ethernet.begin(mac, ip);
Так у меня до этой строчки кода не доходит, if (Ethernet.begin(mac) == 0) {
попробовать -
byte
ip[] = {192, 168, 1, 56};
Убрала проверки из стандартного примера библиотеки
получаю connection failed
Соответственно адрес 192,168,1,3 пингуется
Ахаххххх, дурочка я глупая......Брандмауэр........................проститеее
так прямым кабелем работает?
Ахаххххх, дурочка я глупая
Да.
Ахаххххх, дурочка я глупая
Да.
Дима, у Иринки высокая степень эмпатии просто, а это способ, развести на эмоции )))
Нет, способ развести на эмоции - это человек 1995 года рождения, соединяющий usb-кабелем два usb-клиента и удивляющийся, почему не работает. Эта хотя бы слушает, что говорят и пытается что-то делать сама.
так прямым кабелем работает?
32 пост 1 вариант соединения.
Всем спасибо.
Я не знала что брандмауэр заблокирует прямое соединение (хотя писали в 44 посту про фаэрвол) )))
Нет,
не спорь, психологии у Михаила Литвака учился )))
Я не знала что брандмауэр заблокирует прямое соединение (хотя писали в 44 посту про фаэрвол) )))
а вот так пробовать не стали
Я не знала что брандмауэр заблокирует прямое соединение (хотя писали в 44 посту про фаэрвол) )))
а вот так пробовать не стали
Так в моем коде IP адрес задаётся точно так же
Ещё вопрос
Я отправляю GET запрос формата ?text=000|2222|3333|4444|5555|
Я хочу первым параметром (вместо "000") отправлять "контрольную сумму" всего пакета, как это сделать? Хочу на сервере првоерять целостность пакета. Или не надо это..?
Я не знала что брандмауэр заблокирует прямое соединение (хотя писали в 44 посту про фаэрвол) )))
а вот так пробовать не стали
Так в моем коде IP адрес задаётся точно так же
Разговор шёл именно о 56 адресе, если через DHCP отрабатывал. то должен был этот адрес отрабатывать и напрямую (файрвол бы не блокировал)
Разговор шёл именно о 56 адресе, если через DHCP отрабатывал. то должен был этот адрес отрабатывать и напрямую (файрвол бы не блокировал)
Попробую
Ещё вопрос
Я отправляю GET запрос формата ?text=000|2222|3333|4444|5555|
Я хочу первым параметром (вместо "000") отправлять "контрольную сумму" всего пакета, как это сделать? Хочу на сервере првоерять целостность пакета. Или не надо это..?
Не надо, за целостность отвечает tcp.
Ещё вопрос
Я отправляю GET запрос формата ?text=000|2222|3333|4444|5555|
Я хочу первым параметром (вместо "000") отправлять "контрольную сумму" всего пакета, как это сделать? Хочу на сервере првоерять целостность пакета. Или не надо это..?
Сеть плохо работает или подделки опасаетесь?
https://stackoverflow.com/questions/8269693/crc-checking-done-automatica...
И лучше POST, хотя и с GET тоже работать будет.
Теперь вопрос по организации сервера
В какой момент нужно вызывать client.stop();
Теперь вопрос по организации сервера
В какой момент нужно вызывать client.stop();
после 37 строки
Тогда while (client.connected()) { висит
Так то конечно работает, но мне нужно разобрать полученный get запрос
Закрой после разбора... Вроде же все логично - работу закончил, клиента остановил (сокет закрыл). Никто же тарелку не начинает мыть до того, как суп закончил есть.
В моём варианте, когда client.stop(); 32 строчкой я получаю в монитор порта
Надо определиться с тем, какова цель и что требуется обработать. Без этого нет смысла рассуждать о моменте закрытия соединения.
К тому же, по-моему, библиотека Ethernet в процессе эволюции меняла своё поведение при stop(). Но я давно уже не читал её на ночь, конечно.
Цель посмотреть что запрашивается и отправить соответствующие данные
Так и подсчитать. Сперва получить данные, потом сформировать запрос, и только потом отправлять, а считывать данные прямо в процессе отправки запроса считается дурным тоном.
ps приведённый пример псевдокод, может даже и не скомпилируется, но суть вот такая
Поговорить хочу.
Так как я теперь 'умею' работать с char, String я трогать не хочу, тяжелее, медленнее.
Отправлять я буду строку формата val=1111|2222|3333}4444|5555.............nnnn|
К примеру, таких показаний у меня 100 штук.
Я создала char[510] и задумалась...как много динамической памяти трачу...а зачем?
Ведь можно в цикле подсчитать длину показаний и прибавить к ним число постоянных параметров (разделители и текст).
Т.е. если у меня 100 четырёхзначных показаний 100*4=400
Прибавляем 100 разделителей "|" 400+100=500
и добавляем ещё 4 (val=) итого Content-Length: 504
Всё верно?))))
Можно, всё верно.
Единственное, память не надо жалеть до тех пор, пока её хватает, у есп куча минимум 40 килобайт, так что можно не жалеть. Сам по себе http-клиент или кто там, сервер, занимает гораздо больше памяти, и что теперь, не использовать его, что ли?
у есп куча минимум 40 килобайт, так что мож
Atmega328
Я могу строчку client.println("Content-Length: ***"); отправить после 12 строки? Хотя нет, нельзя.
Всё таки придётся создавать массив? Т.к. считанные показания я сразу отправляю в клиент
Цель посмотреть что запрашивается и отправить соответствующие данные
Это понятное, но очень абстрактное для формирования алгоритма желание.
Оно эквивалентно такому вопросу: "Хочу посчитать сколько машин проезжает под окном и позвонить в ГИБДД. Когда мне отходить от окна?"
Очевидно, что если нет критерия, по которому определяется момент завершения процесса наблюдения, от окна вас унесут, когда потеряете сознание.
Поэтому следует определиться: "сколько машин проезжает за час?", "сколько машин проезжает до того, как будет замечен автомобиль с сиреной" и пр.
На что вы опираетесь, когда заключаете: "я получила достаточно данных"?
Всё таки придётся создавать массив? Т.к. считанные показания я сразу отправляю в клиент
Нет. Метод применения предрасчёта длины верен и оптимален. Если есть возможность при отсылке всегда соблюдать одну и ту же длину поля данных, а это позволяет любой *printf* (например с %05d), то все становится вовсе простым: content-length = 5 * кол-во полей + сепараторы + хидер.
Я, лично, предпочитаю snprintf.
Длина поля данных разная, показания с аналогового порта
Ента всё равно память аллоцировать, а её, вишь, жалко :) Сами же и запугали блин новичков :)
Сделайте одинаковую. Забейте пустые места нулями, если пробелы не нравятся или сделайте выравнивание по левому краю. Методов-то много. Вплоть до передачи в шестнадцатеричном виде с фиксированной шириной поля в 4 символа.
Ента всё равно память аллоцировать, а её, вишь, жалко :)
За буфер в 10 байт можно жабу и придушить слегонца...
.. client.println("Content-Length: ***"); отправить после 12 строки? Хотя нет, нельзя.
Всё таки придётся создавать массив? Т.к. считанные показания я сразу отправляю в клиент
не нужен массив.
1. В Content-Length с запасом величину отправляем.
2. Отправляем данные и считаем их длину.
3. После отправки всех данных вычисляем, сколько не хватило до отправленной в п.1 и дополняем, например пробелами.
Сделайте одинаковую. Забейте пустые места нулями, если пробелы не нравятся или сделайте выравнивание по левому краю. Методов-то много. Вплоть до передачи в шестнадцатеричном виде с фиксированной шириной поля в 4 символа.
Хороший вариант, теперь у меня строка будет фиксированной длины.
Так же понравился вариант дополнения 0.
По быстродействию будет значительная разница?
Так не проще?
Проще. Спасибо.
При каждой новой отправке данных вывожу в монитор порта millis()
Столбец millis() - это время которое приходит в монитор порта. Красные цифры - это разница между 1 и 2, 2 и 3 и т.д. показаниями millis()
Коли уж решили зафлудить, то можно и так сыканомить RAM:
Только имейте в виду - каждый print инициирует отправку пакета. Выиграли память ардуины - потеряли производительность сетевой подсистемы. Нельзя сказать, что сеть ляжет под нагрузкой сразу же, но как-то неаккуратненько.
Зачем это?
Спасибо )
Зачем это?
Косвенно проверяла быстроту работы
Быстроту работы сериала на 9600??????
Быстроту работы сериала на 9600??????
115200
Проверка косвенная, в сравнении GET с POST
А заодно ещё и бессмысленная :) но за попытку молодец.
Только имейте в виду - каждый print инициирует отправку пакета. Выиграли память ардуины - потеряли производительность сетевой подсистемы. Нельзя сказать, что сеть ляжет под нагрузкой сразу же, но как-то неаккуратненько.
А как надо?
Это перестраховка. Делайте пока, как вам надо и как получается. Потом, (если) наткнётесь, переделаете правильно, без блокирований.