고급 예제

다양한 도구들을 가지고 마음껏 응용해보세요.

아두이노 WIFI 실드-(1) wifi 기초

2014-08-11 14:25:32

개요 및 부품 목록

 

 

WiFi(Wireless Fidelity)는 무선접속장치가 설치된 곳에서 전파나 적외선 전송방식을 이용하여 일정 거리 안에서 무선 인터넷을 할 수 있는 근거리 통신망을 지칭하는 기술입니다.

근래에 들어서 선없이 인터넷이나 상호간 통신이 가능하다는 장점때문에 게임기, 프린터, TV등 다양한 주변기기들에서도 와이파이가 지원되고 있습니다.


사진 출처 : http://www.kuccblog.net/477

 

 

또한 KTX나 카페, 버스 등 많은 장소에서 Access Point(AP)를 설치하여, 어느 곳에서나 와이파이를 사용할 수 있게 되었습니다.
(Access Point : WiFi를 사용하기 위해 무선장치들을 유선장치에 연결할 수 있게 하는 장치)

이 콘텐츠에서는 와이파이 실드를 사용해 와이파이를 접속해 보고, 접속된 와이파이의 정보를 출력해 보도록 하겠습니다.
(밑의 시리얼 모니터에 나온 값은 BSSID와 MAC Address를 안 보이게 했습니다. 밑에 내용 그대로 진행하였으면 다 제대로 나오게 됩니다.)

 

 

 

부품 목록

 
NO 부품명 수량 상세설명
1 아두이노 우노 R3 1 아두이노
2 아두이노 WIFI 실드 1 WI-FI 실드
 
부품명 아두이노 우노 R3 아두이노 WI-FI 실드
파트

하드웨어 making 및 소프트웨어 Coding

WI-FI 실드 연결 방법


아두이노 우노 R3 기준으로 아두이노 실드를 바로 꽂을 수 있습니다. 각 핀에 맞게 꼽아 주시면 됩니다. 

 

소프트웨어 Coding

 

#include <WiFi.h>

char ssid[] = "AndroidHotspot6971";     //  연결하실 와이파이 이름
char pass[] = "00001111";  // 네트워크 보안키
int status = WL_IDLE_STATUS;

void setup() {

  Serial.begin(9600); 
  while (!Serial) {
    ; // 시리얼 포트에 연결될 때까지 기다림(아두이노 레오나르도만 쓰면 됨)
  }
  
  // 현재 아두이노에 연결된 실드를 확인
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present"); 
    // 와이파이 실드가 아닐 경우
    while(true);
  } 
  
 // 와이파이에 연결 시도
  while ( status != WL_CONNECTED) { // 연결이 될 때 까지 반복
    Serial.print("Attempting to connect to WPA SSID: ");
    Serial.println(ssid);
    // WPA/WAP2 네트워크에 연결
    status = WiFi.begin(ssid, pass);

    delay(10000);
  }
   
  // 연결에 성공했으면 연결확인 메시지와 연결된 네트워크 정보를 띄운다. 
  Serial.print("You're connected to the network");
  printCurrentNet();
  printWifiData();

}

void loop() { 
  // 10초마다 네트워크 연결 확인을 해준다.
  delay(10000);
  printCurrentNet();
}

void printWifiData() {
  // WI-FI 실드의 IP를 출력한다.
  IPAddress ip = WiFi.localIP();
    Serial.print("IP Address: ");
  Serial.println(ip);
  Serial.println(ip);
  
  // MAC어드레스를 출력한다.
  byte mac[6];  
  WiFi.macAddress(mac);
  Serial.print("MAC address: ");
  Serial.print(mac[5],HEX);
  Serial.print(":");
  Serial.print(mac[4],HEX);
  Serial.print(":");
  Serial.print(mac[3],HEX);
  Serial.print(":");
  Serial.print(mac[2],HEX);
  Serial.print(":");
  Serial.print(mac[1],HEX);
  Serial.print(":");
  Serial.println(mac[0],HEX);
 
}

void printCurrentNet() {
  // 접속하려는 네트워크의 SSID를 출력한다.
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // 접속하려는 router의 MAC 주소를 출력한다.
  byte bssid[6];
  WiFi.BSSID(bssid);    
  Serial.print("BSSID: ");
  Serial.print(bssid[5],HEX);
  Serial.print(":");
  Serial.print(bssid[4],HEX);
  Serial.print(":");
  Serial.print(bssid[3],HEX);
  Serial.print(":");
  Serial.print(bssid[2],HEX);
  Serial.print(":");
  Serial.print(bssid[1],HEX);
  Serial.print(":");
  Serial.println(bssid[0],HEX);

  // 수신 신호 강도를 출력한다.
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.println(rssi);

  // 암호화 타입을 출력한다.
  byte encryption = WiFi.encryptionType();
  Serial.print("Encryption Type:");
  Serial.println(encryption,HEX);
  Serial.println();
}
 

 

 

소프트웨어 설명

* 이 코드는 스케치를 사용하여 작성 / 업로드 합니다. 스케치에 대한 사용법은 링크를 참고하시기 바랍니다.

이 소스는 아두이노에서 직접 제공하는 예제 ConnectWithWPA 의 소스입니다. (파일 -> 예제 -> WiFi -> ConnectWithWPA)

와이파이 연결 시 보안 타입에 WPA / WPA2 일 경우에만 밑에 소스를 사용할 수 있습니다. (Web 방식으로 쓰시는 경우는 네트워크 연결 시 keyindex를 추가하셔야 합니다.)
(무선 네트워크를 쓰시는 경우에는 제어판 -> 네트워크 및 인터넷 -> 네트워크 및 공유 센터 -> 무선 네트워크 관리 로 들어 가시면 보안 유형이 나옵니다.)

 

 

 

 

#include <WiFi.h>

char ssid[] = "AndroidHotspot6971";     //  연결하실 와이파이 이름
char pass[] = "00001111";  // 네트워크 보안키
int status = WL_IDLE_STATUS;

WI-FI 실드를 사용하기 위해서는 WiFi 라이브러리를 사용해야 합니다. (사용하지 않았을 경우 컴파일이 되지 않습니다.)

ssid 에는 와이파이 이름, pass에는 해당 와이파이 네트워크 보안키를 적어 줍니다. (자신이 연결하고 싶은 와이파이에 이름과 보안키)
(현재 적혀 있는 ssid와 pass는 제가 쓰고 있는 와이파이 이름과 보안키입니다. 이것을 사용자에게 맞게 바꿔주셔야 연결이 됩니다. 맞지 않으면 Attempting to connect to WPA SSID: 와이파이 이름이 계속 뜨게 됩니다.)


WAP 대신 Web 형식을 사용하시는 경우 여기서 keyindex를 같이 선언해 줍니다.(int 타입)

 

 

 

 

  Serial.begin(9600); 
  while (!Serial) {
    ; // 시리얼 포트에 연결될 때까지 기다림(아두이노 레오나르도만 쓰면 됨)
  }
  
  // 현재 아두이노에 연결된 실드를 확인
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present"); 
    // 와이파이 실드가 아닐 경우
    while(true);
  } 


while(!Serial)문을 사용하여 시리얼에 연결될 때까지 계속 대기합니다.(이건 아두이노 레오나르도만 쓰면 됩니다.).
그 후 아두이노에 연결된 실드를 확인하여 WIFI 실드가 연결될 때까지 계속 대기합니다.

 

 

 

 

 

 // 와이파이에 연결 시도
  while ( status != WL_CONNECTED) { // 연결이될 때까지 반복
    Serial.print("Attempting to connect to WPA SSID: ");
    Serial.println(ssid);
    // WPA/WAP2 네트워크에 연결
    status = WiFi.begin(ssid, pass);

    delay(10000);
  }
   
  // 연결에 성공했으면 연결확인 메시지와 연결된 네트워크 정보를 띄운다. 
  Serial.print("You're connected to the network");
  printCurrentNet();
  printWifiData();

 

 

 

실드를 확인했으면 그다음으로는 WIFI에 연결을 해야 합니다. 연결 시도 중입니다 라는 메시지를 띄우고 그 후 WiFi.begin(ssid,pass)를 이용하여 접속 시도를 합니다. 연결이 성공할 때까지 계속 반복해 줍니다. 
(WPA 대신 Web 타입을 사용하시는 경우 WiFi.begin(ssid, keyindex, pass); 이렇게 사용하셔야 합니다.)

연결이 성공했으면 성공 확인 메시지를 띄우고 연결된 네트워크의 데이터를 출력해 줍니다.
 

void loop() { 
  // 10초마다 네트워크 연결을 확인해준다.
  delay(10000);
  printCurrentNet();
}

연결이 성공 한 후, 10초마다 네트워크 연결을 확인해 준다.
 

void printWifiData() {
  // WI-FI 실드의 IP를 출력한다.
  IPAddress ip = WiFi.localIP();
    Serial.print("IP Address: ");
  Serial.println(ip);
  Serial.println(ip);
  
  // MAC어드레스를 출력한다.
  byte mac[6];  
  WiFi.macAddress(mac);
  Serial.print("MAC address: ");
  Serial.print(mac[5],HEX);
  Serial.print(":");
  Serial.print(mac[4],HEX);
  Serial.print(":");
  Serial.print(mac[3],HEX);
  Serial.print(":");
  Serial.print(mac[2],HEX);
  Serial.print(":");
  Serial.print(mac[1],HEX);
  Serial.print(":");
  Serial.println(mac[0],HEX);
 

printWifiData() 함수는 아두이노와 연결된 WIFI 실드에 대한 IP 정보와 MAC 어드레스를 출력하는 함수입니다.
 

void printCurrentNet() {
  // 접속하려는 네트워크의 SSID를 출력한다.
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // 접속하려는 router의 MAC 주소를 출력한다.
  byte bssid[6];
  WiFi.BSSID(bssid);    
  Serial.print("BSSID: ");
  Serial.print(bssid[5],HEX);
  Serial.print(":");
  Serial.print(bssid[4],HEX);
  Serial.print(":");
  Serial.print(bssid[3],HEX);
  Serial.print(":");
  Serial.print(bssid[2],HEX);
  Serial.print(":");
  Serial.print(bssid[1],HEX);
  Serial.print(":");
  Serial.println(bssid[0],HEX);

  // 수신 신호 강도를 출력한다.
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.println(rssi);

  // 암호화 타입을 출력한다.
  byte encryption = WiFi.encryptionType();
  Serial.print("Encryption Type:");
  Serial.println(encryption,HEX);
  Serial.println();
}

printCurrentNet() 함수는 현재 연결된 네트워크의 이름과 라우터의 MAC주소, 연결 수신 신호 강도와 암호화 타입을 출력 해 주는 함수입니다.
(수신 신호 강도와 암호화 타입은 위에 시작 전 개념 이해하기에서 자료를 링크했습니다. 궁금하신 점 있으시면 링크 확인해 주세요)

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

WIFI쉴드, 아두이노