Долгий tcp коннект
- Войдите на сайт для отправки комментариев
Пт, 22/08/2014 - 17:04
Всем привет!
Arduino UNO R3, Ethernet Shield.
Столкнулся с проблемой:
Долгий коннект по http (от 2 до 7 секунд). Хотел решить проблему, держа просто телнет сессию, и по надобности отправлять данные, но данные приходят не всегда "пачкой".
139d821500b 1 3 9d8215 0 0 b 1 3 9 d 821500b 139d821500b139d821500b139 d 8215 0 0 b
Сам скетч:
#include <SPI.h> #include <Ethernet.h> #include <OneWire.h> int read_led = 7; int beeper = 9; int error_led = 6; int onewirepin = 8; int wireerr=0; int stby_counter=0; String Key_hash=""; OneWire ds(onewirepin); byte mac[] = { 0x00, 0x01, 0xBB, 0xCC, 0xDE, 0x02 }; byte ip[] = { 192,168,1,240 }; byte server[] = { 192,168,1,250 }; char apikey[] = "60140d9ed7821194091dd2af8608fe6e"; EthernetClient client; void setup() { Ethernet.begin(mac, ip); Serial.begin(9600); delay(1000); Serial.println("connecting..."); if (client.connect(server, 8115)) { Serial.println("connected"); } else { Serial.println("connection failed"); } } void loop() { if (client.connected()) { String rt = wireread(); if(rt=="0") { if(stby_counter==1000) { Key_hash=""; stby_counter=0; } else stby_counter++; } else { Serial.println(Key_hash); client.println(Key_hash); dly(100); Key_hash=""; beep(50,1); dly(1000); led(0, 0); } } if (!client.connected()) { Serial.println(); Serial.println("disconnecting."); client.stop(); Serial.println("connecting..."); if (client.connect(server, 8115)) { Serial.println("connected"); } else { Serial.println("connection failed"); } delay(1000); } } String wireread() { byte i; byte present = 0; byte data[12]; byte addr[8]; String idk; led(0, 0); if (!ds.search(addr)) { ds.reset_search(); return "0"; } for(i=0;i<8;i++) { if(addr[i]==0) wireerr++; else wireerr=0; idk+=String(addr[i],HEX); } if(i==8) { if(wireerr<6) { Key_hash=idk; return "1"; } } if(wireerr>6) { beep(200,0); dly(1000); led(0, 0); } if(OneWire::crc8(addr, 7) != addr[7]) { Serial.print("CRC is not valid!\n"); return "0"; } if(addr[0] != 0x01) { Serial.print("Device is not a DS1990A family device.\n"); return "0"; } ds.reset(); dly(1000); } void beep(unsigned char delayms, int t) { if(t==1) { led(0, 1); tone(beeper,1500,300); } else { led(1, 1); tone(beeper,800,400); } } void led(int color, int st) { if(st==0) { digitalWrite(read_led, LOW); digitalWrite(error_led, LOW); } else { if(color==1) { digitalWrite(read_led, HIGH); digitalWrite(error_led, LOW); } else { digitalWrite(read_led, LOW); digitalWrite(error_led, HIGH); } } } void dly(int d) { Serial.print("delay:"); Serial.println(d); delay(d); }
Подскажите пожалуйста, кто знает, куда копать дальше?
Спасибо!
у меня тоже
я забил и построил вебинтерфейс (по требованию 5 сек)
в ява скрипте указал обновлятся через 5 сек не чаще но все равно иногда подтормаживание как я понял это броузер может а потом пучком прорыв
Это конечно выход, но всеравно отклик не тот.
По сути надо отправить в сокет не больше 16 байт.
Уже не первую неделю гуглю, пробую варианты.
попробуйте сервер попинговать. может в его отклике проблема? У меня на коннект уходит около 0,5 секунды. правда и сервер у меня стоит дуня-свитч-свитч-сервер
Сервер в пределах одного свича, проблемы в отклике нет.
тогда попробуйте ардуино побыстрее. я сильно сомневаюсь что Вам удастся сокеты поднять на дуне. неважно какой
Вот что странно, сейчас обнаружил:
Открываю сокет на nodejs, сокет работает вполне нормально. Если отправляю строку через сокет, типа - client.print("blablablablabla"); то все нормально приходит, а если сохраняю значение (идентификатор ключа 1wire) в переменную, и отправляю, то приходит кусками. и в несколько строк, или не приходит, а потом приходят два идентификатора. Пробовал отправлять и строкой и char.