IoT Wireless

Serial-To-WiFi using WizFi250 CSI 본문

IoT Platform(Script)

Serial-To-WiFi using WizFi250 CSI

DH0815 2015. 6. 26. 15:45

몇 주 전에, Instructables에 WizFi250-CSI의 기본적인 개념과 동작에 대해서 포스팅 했다.

http://www.instructables.com/id/WizFi250-CSIC-Script-Interpreter-for-rapid-prototy/




이번에는 WizFi250-CSI를 이용해서 Serial-To-WiFi를 구현하는 예제에 대해 설명하겠다.


아래는 SErial-To-WiFi를 구현한 C 스크립트 전체 소스이다.
UART로 입력 받은 데이터를 TCP Server(192.168.3.54:6000)에 양방향 전송하는 예제이다.
 
#include "wizfi250-csi.h"

void main(void)
{
  struct sockaddr_in stSockAddr;
  int Res, result;
  
  // Join to AP
  if ( result = wifi_join("WizFiDemoAP", "wpa2", "11111111", 0, 0, 0)!=0 )
  {
    printf("wifi_join error : %d", result);
    return;
  }

  // TCP Socket  
  int SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  if (-1 == SocketFD)
  {
    printf("cannot create socket\r\n");
    return; 
  }

  // Define Server IP, Port
  memset(&stSockAddr, 0, sizeof(stSockAddr));
  stSockAddr.sin_family = AF_INET;
  stSockAddr.sin_addr.s_addr = inet_addr("192.168.3.54");
  stSockAddr.sin_port = htons(6000);  
  
  if (-1 == connect(SocketFD, (struct sockaddr *)&stSockAddr, sizeof(stSockAddr)))
  {
    printf("connect failed\r\n");
    close(SocketFD);
    return;
  }
  
  char szData[256];
  int length = 0;
  
  // Set GPIO12 input-pin.
  pinMode(GPIO12, 1);
  
  while(1)
  {
    length = uart_rx(0, szData, 256);
    if ( length>0 )
    {
      pinOut(GPIO12, 0);
      result = send(SocketFD, szData, length, 0);
      pinOut(GPIO12, 1);
      if ( result<0 )	break;
    }
  
    length = recv(SocketFD, szData, sizeof(szData), MSG_DONTWAIT);
    if ( length==0 )
    {
      break;
    }
    else if ( length<0 )    
    {
      if ( sock_error==EAGAIN )		continue;
      
      printf("<%d,%d>", length, sock_error); 
      break;
    }
    else
    {
      pinOut(GPIO12, 0);
      uart_tx(0, szData, length);
      pinOut(GPIO12, 1);
    }

  }
   
  printf("Disconnected (%d) \r\n", length);
  close(SocketFD);
  
  return;
} 
코드를 보면 알 수 있듯이, 생각보다 간단히 구현됨을 알 수 있다.
위의 스크립트에서 사용된 모든 함수들은 "wizfi250-csi.h"의 정의된 함수들이다.
"wizfi250-csi.h" 파일은 아래 링크에서 확인할 수 있다.


아래 그림은 실제로 테스트를 한 화면이다.

Serial to WiFi, WiFi to Serial로 양방향 통신이 정상적으로 이루어지는 것을 볼 수 있다.




WizFi250-CSI를 이용하여, Serial-To-WiFi를 구현하면, 아래와 같은 장점을 가질 수 있다.

- TCP/UDP, Server/Client를 C Code Level에서 유저가 구현할 수 있다.
  (설정을 위한 Configuration Tool이나 웹서버가 필요 없다.)
- Multi Socket 사용이 가능하다.
- Network Packet의 Data Packing을 Socket API Level에서 유저가 자유롭게 할 수 있다.
- 복잡한 시리얼 커맨드(AT Command)를 사용할 필요 없다.
- LED Indication을 유저가 정의할 수 있다. (GPIO, ADC 등도 유저가 사용 가능)
- Standard C 문법과 99% 이상 흡사하므로 어렵지 않다.

정리하면, WizFi250-CSI를 이용하여 Serial-To-WiFi를 구현할 때, 
사용자는 별도의 Configuration Tool이나 개발 툴 없이도, 시리얼 터미널 프로그램만으로 Serial-To-WiFi 기본 기능과 관련된 설정 뿐만 아니라 대부분의 Customizing 작업을 사용자 스스로가 구현할 수 있다.

<추가>
위의 내용을 Instructables에 아래와 같이 포스팅하였다.