정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

데이터 베이스 서버 연결
김덕수 | 2016-10-04

http://kocoafab.cc/make/view/359

이글을 보고 데이터 베이스 서버에 연결을 시도 하고있습니다.

일단 연결은 됩니다만 굉장히 느리게 연결이되어

읽어오는 속도가 너무느려서 혹시 그 속도를 빠르게 할 수 있나 여쭤보고 싶습니다.

읽어올 데이터의 양이 큰것은 아니고 40글자 정도 되는 텍스트입니다.

하지만 읽는 속도가 너무 느립니다. 왜이렇게 느린지 이해가 안되는데 혹시 원래 느린것인지 알고 싶습니다.

저는 5~10초 주기(loop)로 데이터 입력과 출력을 하고 싶은데,

원래의 글은 주르륵 읽고 바로 떠있습니다만 저는 서버를 연결하는데 오래걸리는 것인지

약 1~2분정도 걸려서 연결이 되더군요. 혹시 왜이러는지 알려주실수 있으신가요?

웹페이지로 연결할 시에는 굉장히 빠른속도로 뜨는데, 물론 다른분들도 이렇게 걸리시는지는

직접 구동하는 모습을 보지 못하여 잘 모르겠습니다. 그리고 한번의 연결이 끝나고

No Socket available 이라는 말이 계속뜨면서 다시 연결, 즉 또다시 연결하여 읽어오는 행동을 못하는데

만약 이 소스코드에서 setup에서 connectToServer 함수가 불려오는데 loop안에서 그 함수를 실행시킨다면

계속해서 읽어올 수 있을까요?

정리하자면

1. 위의 페이지를 보고 따라하고 있으나 얼마 되지 않는 텍스트를 읽어오는 속도가 1~2분 정도로 상당히 느린속도로

읽어옵니다, 이 속도를 빠르게 하고 싶은데 어떻게 해야할까요? 웹페이지에서 서버를 접속시에는 바로바로 뜹니다..

2. 지속적으로 일정 주기를 가지고 루프를 돌면서 계속 읽어오게 하고 싶습니다. 예를 들면 5~10초 주기로 계속 데이터 베이스에

접근하여 데이터를 읽어오고 몇 초뒤 다시 루프를 돌아 읽어오게 하고 싶습니다. 어떻게 하는것이 좋을지 여쭤보고 싶습니다.

3. No Socket available 이 문제는 client.flush() 와 client.stop()으로 해결하라는 댓글을 보아 그렇게 하면 될것같습니다. 감사합니다

소스코드와 실행 화면을 첨부합니다.

 

--------------------------소스코드-----------------------------------

#include <SPI.h>
#include <WiFi.h>
char ssid[] = "***"; //  your network SSID (name)
char pass[] = "***";    // your network password (use for WPA, or use as key for WEP)
int keyIndex = 0;            // your network key Index number (needed only for WEP)
String location = "Gangnam"; //날씨정보를 보고싶은 지역

//인스턴스 변수 초기화
WiFiServer server(80);
WiFiClient client;
const unsigned long requestInterval = 60000;  // 요구 시간 딜레이(1 min)
IPAddress hostIp;
uint8_t ret;
unsigned long lastAttemptTime = 0;            // 마지막으로 서버에서 데이터를 전송받은 시간
void setup() {
  Serial.begin(115200);   
  delay(10);
  //WiFi연결 시도
  Serial.println("Connecting to WiFi...."); 
  WiFi.begin(ssid, pass);  //WiFi가 패스워드를 사용한다면 매개변수에 password도 작성
  server.begin();
  Serial.println("Connect success!");
  Serial.println("Waiting for DHCP address");
  //DHCP주소를 기다린다
  while(WiFi.localIP() == INADDR_NONE) {
    Serial.print(".");
    delay(300);
  }
  Serial.println("\n");
  printWifiData();
  connectToServer();
}
void loop()
{
  if (client.connected()) {
    while (client.available()) {
      //전송된 데이터가 있을 경우 데이터를 읽어들인다.
      char inChar = client.read();
      Serial.write(inChar);
    }  
  }
  else if (millis() - lastAttemptTime > requestInterval) {
    //연결을 실패했다면 requestInterval(60초)이후에 다시 연결을 시도한다.
    connectToServer();
  }
}
//서버와 연결
void connectToServer() {
  Serial.println("connecting to server...");
  String content = "";
  if (client.connect(hostIp, 80)) {
    Serial.println("Connected! Making HTTP request to api.openweathermap.org for "+location+"...");
    //Serial.println("GET /data/2.5/weather?q="+location+"&mode=xml");
    client.println("GET /arduino_command.php?room=401 HTTP/1.0");
    //위에 지정된 주소와 연결한다.
    client.print("HOST: dsk.dlinkddns.com\n");
    //client.println("User-Agent: launchpad-wifi");
    client.println("Connection: close");
    client.println();
    Serial.println("Weather information for "+location);
  }
  //마지막으로 연결에 성공한 시간을 기록
  lastAttemptTime = millis();
}

void printHex(int num, int precision) {
  char tmp[16];
  char format[128];
  sprintf(format, "%%.%dX", precision);
  sprintf(tmp, format, num);
  Serial.print(tmp);
}
void printWifiData() {
  // Wifi쉴드의 IP주소를 출력
  Serial.println();
  Serial.println("IP Address Information:"); 
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);
  //MAC address출력
  byte mac[6]; 
  WiFi.macAddress(mac);
  Serial.print("MAC address: ");
  printHex(mac[5], 2);
  Serial.print(":");
  printHex(mac[4], 2);
  Serial.print(":");
  printHex(mac[3], 2);
  Serial.print(":");
  printHex(mac[2], 2);
  Serial.print(":");
  printHex(mac[1], 2);
  Serial.print(":");
  printHex(mac[0], 2);
  Serial.println();
  //서브넷 마스크 출력
  IPAddress subnet = WiFi.subnetMask();
  Serial.print("NetMask: ");
  Serial.println(subnet);
  //게이트웨이 주소 출력
  IPAddress gateway = WiFi.gatewayIP();
  Serial.print("Gateway: ");
  Serial.println(gateway);
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());
  ret = WiFi.hostByName("dsk.dlinkddns.com", hostIp);
  Serial.print("ret: ");
  Serial.println(ret);
  Serial.print("Host IP: ");
  Serial.println(hostIp);
  Serial.println("");
}

-------------------------실행화면-----------------------------------

Connecting to WiFi....
Connect success!
Waiting for DHCP address
 
IP Address Information:
IP Address: ***
MAC address: ***
NetMask: ***
Gateway: ***
SSID: ***
ret: 1
Host IP: ***.***.***
connecting to server...
connecting to server... //이런식으로 두번이나 연결할 시간을 기다려야만 이 밑으로처럼 값이 뜨더군요 ..
Connected! Making HTTP request to api.openweathermap.org for Gangnam...
Weather information for Gangnam
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Server: Microsoft-IIS/10.0
X-Powered-By: PHP/5.6.24
Date: Tue, 04 Oct 2016 04:20:03 GMT
Connection: close
Content-Length: 88
chkcode:cs;<br> command:000;<br>to_ave1:350,100!;<br>to_ave2:0,0!;<br>to_ave3:0,0!;<br>*

 

이전글   |    정량펌프에 관한 질문2 2016-10-03
다음글   |    HC-06 거리 측정, 신호 세기 측정법. 2016-10-04