폴더 정리를 하다가 학생때 했던 소소한 프로젝트를 하나 발견했다.
c언어를 이용한 라즈베리파이 프로젝트였는데 이 텀프로젝트 또한 재미있게 했었기에 정리하게 됐다.
올리기에 부끄러운 수준이지만 뭐 중요한가 다음에는 더 발전할 여지가 있다는 말이니까
Git 주소
마찬가지로 깃 주소를 먼저 첨부하고 시작하겠다.
이 프로젝트는 라즈베리파이와 나의 핸드폰(안드로이드)를 통신시켜서 핸드폰으로 라즈베리파이의 모터를 제어하는 프로젝트였다.
일명 무선 선풍기이다.
4학년이되고 라즈베리파이를 처음 만져보며 제일 흥미롭게 또 재미있게 느꼇던 부분은
이 라즈베리파이로는 서버를 구축할 수 있다는 것이었다.
3학년때 했던 프로젝트도 올릴 것이지만 3학년때는 J-kit를 사용했기에 서버,인터넷과는 거리가 좀 멀었던 개인 프로젝트였었는데 그래서 OS가 있는 이 라즈베리가 마냥 신기했었다.
그래서 현대 사회에서 필수적인 또 무언가를 제어하기에 가장 적합한 핸드폰과 통신 시켜서 무선 선풍기를 구현하려 했다.
무선 선풍기를 개발하며 가장 중요하게 생각했던 부분은 무엇보다도 통신 이었다.
결국에는 핸드폰과 라즈베리가 연결 되어있어야 제어가 가능하니까 말이다.
이를 위한 방법에는 블루투스,서버,소켓등 여러 방법이 있지만 나는 소켓 통신을 선택했다.
서로 다른 기기끼리 통신하는 가장 기초적인 통신이지만 그만큼 중요하다고 생각했기 때문이다.
소켓통신은 서로 다른 기기들을 하나의 소켓에 끼워넣어서 통신시키는 방법으로 처리순서로는 1.소켓의 생성,2,bind,3.listen,4.accept,5.read or write의 순서로 진행 되는데 socket(),listen(),accept(),read()의 형식으로 파라미터에 각각의 값을 넣어서 사용한다.
또한 이 통신을 위한 함수의 파라미터 안에서의 여러가지 프로토콜도 필요한데
socket()은 int socket(int domain, int type, int protocol); 의 형태로 도메인은 IPv4를 사용하기 위한 AF_INET,TCP통신을 위한 SOCK_STREAM,프로토콜은 기본 값 0
bind()는 함수에 소켓 ip주소와 포트 번호를 할당하는 역할을 하는데 이는 사용자 라즈베리의 ip주소와 내가 지정한 임의의 포트번호
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
listen(int sockfd, int backlog);의 형태이며 backlog는 대기를 할 수 있는 수이고 이번 프로젝트의 경우 핸드폰 하나와만 통신할 것이라 1
read()함수는 파일 디스크립터로부터 데이터를 읽는 함수인데 ssize_t read(int fd, void *buf, size_t count); 의 형식이다. 이번 프로젝트의 경우 데이터의 특정 메시지를 계속 보낼 수도 있기에 무한루프에 이 함수를 넣어 게속 데이터를 읽고 저장할 수 있게 했다.
또한 통신되고 나서의 모터를 제어할 스레드까지 사용하였다.
글이 조금 난잡한것 같아 사진을 첨부하자면

listen()까지 된 상황에서 사용자는 핸드폰의 어플을 이용해 지정된 포트번호와 ip주소로 connect에 성공하게 되고 이 이후에 클라이언트와 서버는 서로 소통하며 라즈베리의 모터를 키고 끄는 제어를 하게 했다.
클라이언트의 소켓은 내가 직접짤 수 있었다면 공부해서라도 짜고 싶었지만 학생이라 다른 과목들의 공부 겸사... 안드로이드 개발을 혼자 공부하기에는 시간이 부족했기에 시중의 소켓통신을 도와주는 어플을 깔아 사용하였다.
코드를 실행하면 알겠지만 한 90%정도의 성공이었다.
통신까지와 모터의 제어까지 성공했으나 그에 따른 LED의 제어에 어려움을 겪었다.
이는 스레드가 서버가 작동할때 같이 생성되는데 스레드 두개가 서로의 lock과 unlock을 풀어주어야 하는데 이때 서버가 같이 닫히는 현상이 있었기에 서버를 구성할 때 스레드의 사용은 필히 조심해야겠다는 생각을 했다.
스레드에 대해서는 조금은 아쉬운 부분이 있었지만 이 프로젝트에서 서버에 관련한 매우 많은 함수들에 대해 공부했고 프로토콜에 대해서도 공부했는데 이를 계기로 개발자에 대한 많은 공부가 된거 같아서 재미있었다.