학교 SW-AI 인재양성 프로젝트에서 진행하고 있는 열람실 지문인식 출석 시스템을 구축하면서 서버와 라즈베리파이가 통신해야하는 상황이 발생하였다.
이전에 스마트 태블릿 보관함을 제작하면서 사용했던 방식인 express 서버에서 socketio 라이브러리를 통해서 라즈베리파이와 통신을 하였다.
이와 같은 방식으로 통신을 하려고 한다.
그렇다면 Socket.io란 무엇인가?
끄투나 웹을 통해서 채팅을 하는 앱 같은 경우에 실시간으로 통신해야 한다.
채팅은 클라이언트와 클라이언트가 실시간으로 통신해야 하기에 중간에 서버가 클라이언트의 메시지를 대상 클라이언트에게 전달해준다.
이렇게 실시간 양방향 통신이 가능하도록 해주는 라이브러리이다.
이를 통해서 express 서버에서 구축한 socketio 서버를 라즈베리파이가 접속하여 실시간으로 센서의 데이터를 송수신할 수 있게 된다.
먼저 express 서버에 socket io 서버를 구축해야 한다.
npm i socket.io
쉘에 위 명령어를 입력해서 라이브러리를 추가한다.
이제 express 서버 코드에 바로 추가해서 사용할 수 있다.
자바스크립트를 사용하였으며 commonjs모듈을 사용하였습니다.
페이지 표시하는 코드는 제외하였습니다 (원하시는 일부분의 코드만 가져가서 사용하시면 됩니다)
const express = require('express') // express 라이브러리 선언
const socketIO = require('socket.io') // Socket 라이브러리 선언
// 기존에 http를 선언하지 않고 app.listen 함수를 통해 바로 서버를 실행시킬 수 있는데, 서버 객체를 socket io에 인자로 넣어주어야 하기에 따로 선언을 위해 http 라이브러리를 가져와 선언
const http = require('http')
const bodyParser = require('body-parser')
const app = express()
const port = 3000
const server = http.createServer(app) // Socket io에 서버 객체 전달을 위한 객체 선언
const io = socketIO(server) // Socket io 서버 객체 선언
// 하나의 새로운 클라이언트가 연결되었을 때 실행되는 이벤트
io.on('connection',(socket)=>{
// socket을 통해서 연결된 클라이언트의 이벤트를 수신할 수 있음
// 연결된 클라이언트에서 message라는 이름으로 이벤트가 발생하였을 경우 실행
socket.on('message', (data)=>{
console.log(data)
})
})
// express 서버 수신 시작 (위에서 선언한 port의 상수를 통해 포트 설정)
server.listen(port, ()=>{
console.log("서버가 실행되었습니다")
})
위와 같은 코드를 작성하였다면 이제 라즈베리파이 또는 파이썬 코드를 작성해주어야 합니다.
라즈베리파이를 통해서 센서값을 불러와 파이썬을 통해 express 서버로 전송해줄 수 있다.
최종적으로 express와 라즈베리파이가 서로 통신을 위한 단계라고 볼 수 있다.
파이썬을 통해 socket.io를 사용하기 위해서는 파이썬 패키지를 설치해주어야 한다.
파이썬 패키지는 nodejs처럼 'socket.io'가 아니라 다음과 같은 명령어를 입력해주어야 한다.
pip install python-socketio
위 명령어를 입력하면 파이썬 전용 socket.io 패키지 설치가 진행된다.
설치가 완료되었다면 main.py 파일을 만들어 다음과 같은 코드를 작성한다.
제가 작성한 모든 코드를 공개하지 않고 일부를 공개하여 독자분들께서 어느정도 추출해서 사용하실 수 있습니다.
import socketio
import time
sio = socketio.Client() # socketio패키지의 Client 객체 선언
sensor_value = 0 # 센서 값을 저장해줄 변수 (센서값을 수신하고 저장하는건 미제공)
# 파이썬 socket.io는 다음과 같은 방법으로 이벤트를 수신할 수 있다
@sio.event
def connect():
print('연결되었습니다')
# 센서값을 기반으로 서버에 전송하기
whie True:
sio.emit('message',"센서값 : {}".format(sensor_value))
time.sleep(1) # 1초 이후 다시 반복되도록 (밑에 추가적인 코드가 없으니)
# 연결 할 Socket.io 서버의 아이피 주소
sio.connect('서버의 아이피주소')
# 서버의 데이터 수신 대기
sio.wait()
위와 같이 파이썬 코드를 작성하면 이제 파이썬에서 express로 메시지가 1초씩 송수신 될 것이다.
이렇게 해서 라즈베리파이를 기반으로 작성한 socket.io를 활용한 데이터 통신이였습니다.
이벤트의 송신 수신은 양측에서 가능하기에 emit 함수만 사용해서 사용가능합니다
내용에 오류가 있거나 보충 의견이 있으시다면 언제나 말해주세요