Долгий tcp коннект

alko
Offline
Зарегистрирован: 22.08.2014

Всем привет!

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); 
}

 

 

Подскажите пожалуйста, кто знает, куда копать дальше?

 

Спасибо!

art100
Offline
Зарегистрирован: 09.03.2014

у меня тоже

я забил и построил вебинтерфейс (по требованию 5 сек)

в ява скрипте указал обновлятся через 5 сек не чаще но все равно иногда подтормаживание как я понял это броузер может а потом пучком прорыв

 

alko
Offline
Зарегистрирован: 22.08.2014

Это конечно выход, но всеравно отклик не тот. 

По сути надо отправить в сокет не больше 16 байт.

Уже не первую неделю гуглю, пробую варианты.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

попробуйте сервер попинговать. может в его отклике проблема? У меня на коннект уходит около 0,5 секунды. правда и сервер у меня стоит дуня-свитч-свитч-сервер

alko
Offline
Зарегистрирован: 22.08.2014

Сервер в пределах одного свича, проблемы в отклике нет.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

тогда попробуйте ардуино побыстрее. я сильно сомневаюсь что Вам удастся сокеты поднять на дуне. неважно какой

alko
Offline
Зарегистрирован: 22.08.2014

Вот что странно, сейчас обнаружил:

Открываю сокет на nodejs, сокет работает вполне нормально. Если отправляю строку через сокет, типа - client.print("blablablablabla"); то все нормально приходит, а если сохраняю значение (идентификатор ключа 1wire) в переменную, и отправляю, то приходит кусками. и в несколько строк, или не приходит, а потом приходят два идентификатора. Пробовал отправлять и строкой и char.