IoT Wireless

Basic examples of WizFi250-PicoC 본문

IoT Platform(Script)

Basic examples of WizFi250-PicoC

DH0815 2015. 4. 28. 09:03

WizFi250에 PicoC를 포팅하면서 아래와 같은 기능을 추가하고, 간단한 스크립트 예제를 테스트 해 보았다.


1. Flash Read/Write/Delete


picoc_read : Flash에 저장된 스크립트 C 파일을 읽어온다.

picoc_write : 스크립트 C 파일을 Flash에 저장한다. (Raw File Upload)

picoc_delete : Flash에 저장된 스크립트 C 파일을 읽어온다.

picoc_run : Flash에 저장된 스크립트 C 파일을 실행한다.


WizFi250이 부팅이 되면, 특정 Flash 섹터에 있는 C 스크립트 파일을 확인하고, 유효한 스크립트 파일이면, 스크립트 내의 main() 함수를 실행시키게 구현하였다.


2. WiFi Management 함수 

int wifi_join(char*, char*, char*, char*, char*, char*);
int wifi_leave();


3. BSD 소켓 함수 추가

int accept(int, struct sockaddr *, unsigned long *);
int bind(int, struct sockaddr *, unsigned long);
int shutdown(int, int);
int getpeername(int, struct sockaddr *, unsigned long *);
int getsockname(int, struct sockaddr *, unsigned long *);
int getsockopt(int, int, int, void *, unsigned long *);
int setsockopt(int, int, int, void *, unsigned long);
int close(int);
int connect(int, struct sockaddr *, unsigned long);
int listen(int, int);
int recv(int, void *, unsigned long, int);
int recvfrom(int, void *, unsigned long, int, struct sockaddr *, unsigned long *);
int send(int, void *, unsigned long, int);
int sendto(int, void *, unsigned long, int, struct sockaddr *, unsigned long);
int socket(int, int, int);
int select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
int fcntl(int, int, int);


BSD 함수는 lwip 라이브러리에서 지원하는 것을 기준으로 작성하였고, 전체적으로 통상적인 BSD 소켓 함수 수준의 90% 수준에서 호환될 것으로 보인다.

(소켓 옵션, 소켓 에러 코드, File Descriptor등에서 지원하지 못하는 부분이 있음)



4. PicoC 스크립트 Example : Basic 


기본적인 C 문법과 Function Call 등을 확인하기 위해서 WizFi250의 GPIO를 설정/제어하는 함수와 Delay 함수를 추가하여, 아래와 같은 간단한 C 스크립트를 사용하였다.

먼저, 메모장으로 main() 함수가 포함된 간단한 C 소스(스크립트) 파일을 작성한다.

그리고, picoc_write 명령을 이용하여, 이 스크립트 파일을 Flash에 저장한 후에, 실행시킨다.

아래는 스크립트 소스와 실행 화면이다.



...

#include <stdio.h>
#include <stk.h>

int my_function(int i)
{
  int j=10;
  return (9-i);
}

void main(void)
{
  printf("Hello C Script \r\n");
  
  int i = 0;
  pinMode(GPIO12, 1);  
  for (i=0; i<10; i++)
  {
    printf("%d", my_function(i));
    pinOut(GPIO12, 0);
    delay_ms(100);
    pinOut(GPIO12, 1);
    delay_ms(100);
  }  
  printf("\r\nDone\r\n\r\n");  
}

...


5. PicoC 스크립트 Example : UDP Client


이번에는 BSD 소켓 함수에 대한 테스트를 진행하였다.

테스트를 위한 BSD 소켓 함수를 사용한 C 소스는 Berkeley Socket Wiki 사이트의 UDP 클라이언트 C 소스를 사용하였다.

http://en.wikipedia.org/wiki/Berkeley_sockets#Client_2

위 링크에 있는 C 소스와 아래의 C 스크립트를 비교해보면, AP에 Joining 하는 함수가 추가 되었을 뿐, 대부분의 소스를 변경없이 재활용 할 수 있음을 확인하였다.



#include <network.h>
#include <string.h>
#include <stdio.h>
#include <wifi.h>

void main(void)
{
  int result = 0;
  int sock;
  struct sockaddr_in sa;
  int bytes_sent;
  char buffer[200];
  
  if ( result = wifi_join("WizFiDemoAP", "wpa2", "11111111", 0, 0, 0)!=0 )
  {
    printf("wifi_join error : %d", result);
    return;
  }
 
  strcpy(buffer, "Hello WizFi250!\r\n");
 
  sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
  if (-1 == sock)
  {
      printf("Error Creating Socket\r\n");
      return;
  }
 
  memset(&sa, 0, sizeof sa);
 
  sa.sin_family = AF_INET; 
  sa.sin_addr.s_addr = inet_addr("192.168.3.255"); 
  sa.sin_port = htons(6000);
 
  bytes_sent = sendto(sock, buffer, strlen(buffer), 0,(struct sockaddr*)&sa, sizeof(sa));
  if (bytes_sent < 0) {
    printf("Error sending packet: \r\n");
    return;
  }
  close(sock);
  return;
}


6. Features of C 스크립팅

  • S/W 작업을 위한 별도의 툴을 PC에 설치할 필요 없음
  • TCP/UDP, Server/Client, Destination IP/Port 등을 BSD 소켓 표준 함수 수준에서 접근 가능
  • Block/Non-block, TCP-Keep-Alive 등의 소켓 옵션 사용 가능(getsockopt, setsockopt)
  • GPIO, ADC, UART 등의 Peripherals도 소스 수준에서 제어 가능 
  • Data Packing도 유저가 자유롭게 설정 가능(C 함수 수준 : send, recv, uart_rx, uart_tx, delay)
  • 별도의 Configuration Tool이 필요 없음(Web Server, PC Utility)