Долгий 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.