SharedIT | 묻고 답하기(AMP)

GPIO 신호로 메일을 자동발송 하는 시스템을 만들고싶은데

안녕하세요 늘 도움받고 있는 회원입니다. 


장비운영을 함에 있어서 24시간 감시가 어려워 장비 장애시 메일로 수신하는 시스템을 구축하여 비상상황에 대비코자 하는데


일단 제가 생각하는건 GPIO 접점 신호를 서버나 컴퓨터가 인식해서 메일을 발송하는 시스템을 구성하고 싶습니다.



이런식으로 구성한다면, PC내에 GPIO 신호를 받아들일수 있는 카드가 구비되면 될것이고, PC안에 접점신호를 인식하고 E-mail을 자동적으로 발송해주는 SW가 있으면 될거같은데

이 과정에서 PC가 아니라 서버를 구매해야 할까요?? 이렇게 구축은 하고싶은데 어떻게 해야될지 갈피를 못잡아 이렇게 글을 올립니다 

Tags : 태그가 없습니다.

4개의 답변이 있습니다.

양성환
  0 추천 | 3년 이상 전

잡는거야 어렵지 않구요 

센드메일 (25번 포트) 또는 SSL ( 443 ) 으로 보내면 됩니다.

wansoo
  0 추천 | 3년 이상 전

GPIO를 통해서 읽어 들일 수 있는 값은 0 아니면 1이기 때문에 GPIO에 접근할 수 있는 주소를 알고 있다면 해당 포트로 부터 값을 읽어서 해당 핀의 값이 1이면 메일 발송 처리하는 식으로 하면 될 것 같네요.




아래 링크 참고해 보면,


https://www.ics.com/blog/how-control-gpio-hardware-c-or-c


C나 C++에서 기본적으로 sysfs interface를 사용해서 가상 file로 부터 값을 읽는 것 처럼 처리하면 되는것 같네요.


C가 UNIX 운영체제를 개발하면서 만들어진 언어이다 보니...


UNIX에서 모든 장치들을 File 처럼 취급하는 것 처럼, C도 하드웨어 장치들을 file로 취급하는게 당연할것 같다는 생각이 드네요.


GPIO로 부터 값을 읽어 오는 C 프로그램은 대충 아래와 같은 형식으로 만들면 되지 않을까 싶어 보이고요.




#include <errno.h>

#include <fcntl.h>

#include <stdio.h>

#include <stdlib.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <unistd.h>


#define BUFF_SIZE 3


int main()

{

    char buff[BUFF_SIZE];

    int fd = open("/sys/class/gpio/export", O_RDONLY);

    if (fd == -1) {

        perror("Unable to open /sys/class/gpio/export");

        exit(1);

    }


    read(fd, buff, 2);

    buff[2]='\0';

    printf( "%s", buff );


    close(fd);


    return 0;

}



대신 buff에 저장되는 값이 바이트 단위이기 때문에 bit 연산을 통해서 특정 핀의 값을 꺼집어 내어서 메일을 보낼지 말지를 판단해야 할 것 같고요.

wansoo | 3년 이상 전

/sys/class/gpio/export 는 출력용인거 같네요.

/sys/class/gpio/export 를 /sys/class/gpio/gpioN/ 과 같은 형식으로 사용해야 할것 같네요.


https://www.kernel.org/doc/Documentation/gpio/sysfs.txt

wansoo | 3년 이상 전

컴퓨터에 리눅스를 설치해서 구현한다면, 개발 언어를 이용해서 포트에 접근할 필요없이, cat 명령으로 바로 읽어 와도 될것 같네요.


gpio port에 접근할때 순서가,

우선 gpio를 읽는 용도로 접근하는지, 출력하는 용도로 접근하는지를 설정해 주고, 다음으로 gpio에 실질적인 접근을 해서 데이터를 읽어 오거나 출력하거나 하면 되는거 같네요.

앞에 올린 C 언어 샘플에서, gpio에서 읽기 전에 읽는 용도로 접근한다는 설정을 하기 위해 "in"에 대한 값을 먼저 보내도록 수정해야 할 걸로 보여 지고요.


리눅스에서 gpio에 직접 접근해서 데이터를 읽어 오려 한다면.

echo in > /sys/class/gpio/gpio64/direction

또는

echo "low" > /sys/class/gpio/gpio64/direction

와 같이 gpio64번 포트를 읽는 용도로 접근한다고 신호를 보내고 난 후에,


cat /sys/class/gpio/gpio64/value

로 값을 읽어서,

1 값이면 

메일을 보내도록 처리하면 간단하게 원하는 기능을 구현할 수 있겠네요.

wansoo | 3년 이상 전

아래 링크도 참조하면 도움 될 거 같고요.


https://ding-dong-in-future.tistory.com/74

kwi1458 | 3년 이상 전

와.... 정말 친절하고 전문적인 답변 감사드립니다.. 부족한 지식이 채워지는 기분입니다. 


감사드립니다 !!!

wansoo
  0 추천 | 3년 이상 전

라즈베리파이로 만드세요.

GPIO로 신호를 센싱하는 건, 적외선 센서나 초음파 센서, 릴레이 같은 전자 스위치 같은 걸 이용해도 될 거 같고요.

PC를 사용한다면 가격도 비싸고, 추가 카드도 필요할것 같고요.

라즈베리 파이는 가격도 몇 만원하지 않는데다, GPIO 포트들이 미리 준비되어 있고, 확장 보드에 활용할 수 있는 다양한 라이브러리도 어렵지 않게 구할 수 있겠고요.

메일 발송은 linux의 mailto 같은 메일 프로그램을 이용해도 될 것 같고, 파이썬 같은 개발 언어를 이용해서 직접 개발해도 될 것 같고요.


wansoo | 3년 이상 전

단순히 GPIO로 부터 신호를 읽어 들어 하드웨어를 조작하는 정도로 한다면 아두이노가 더 저렴하고 적합할 것 같은데, 아두이노로 메일을 발송되게 만들려면 네트워크 모듈도 장착해야 하고, 관련 제어 프로그램도 만들어야 해서 복잡해 질 수도 있을것 같고...

아두이노보다는 라즈베리 파이를 이용하는게 더 적절할 걸로 보이네요.

kwi1458 | 3년 이상 전

일단GPIO접점 카드도 있고 PC도 있긴 합니다. 라즈베리 파이 말고 PC로 운영할려면

파이썬 같은 개발언어로 직접 개발하는 수밖에 없겠네요 

파이썬으로 개발할까도 생각했는데 결국 개발해서 GPIO접점 신호를 받는게 

미생
  0 추천 | 3년 이상 전

이벤트를 어떻게 잡아낼것인지, 이벤트를 잡았을때 어떤 Action을 하도록 하실것인지 어느정도 가이드는 다 잡아두신것 같습니다.

PC를 써도 되고, 마이크로서버(hp) 등을 쓰셔도 되고, 라즈베리파이 같은 물품을 활용하시는 방법도 있을텐데 일단 어떤 환경에서 사용하고, 저 작동에 있어 문제가 발생시 어느정도까지 문제가 없는지 (예를 들어 하루밤 정도 문제되는건 상관 없다)에 따라 이야기가 달라질 것 같습니다.

안정성만으로 보면 검증된 저비용 도입은 hp의 마이크로서버군이 무난할텐데 특별히 문제없다면 요즘 조립식 PC도 잘 버티긴 합니다. 결국 그 이벤트 캐치와 메일발송을 하는 OS가 Windows냐 아님 다른 플랫폼으로도 가능하냐 등등이 문제가 될 것으로 생각됩니다.