Device Program
- Device 화면에 이미지를 출력한다.
- 소켓 통신을 통해 "Subscribe" 컴포넌트로 부터 메시지를 받는다.
- 이 때, subscribe 컴포넌트가 client --> device가 server
- 소켓 통신을 통해 "Publish" 컴포넌트로 메시지 보낸다.
- 이 때, publish 컴포넌트가 server <-- device가 client
- 위 세가지 역할은 multi-processing을 통해 처리한다.
iot_device.py
from multiprocessing import Process, Semaphore, Array
import socket
import json
from time import sleep
import cv2
shared_arr = Array('i', range(10))
sem = Semaphore()
Print_image = Process(target=device_control, args=(shared_arr, sem))
Action_trigger = Process(target=device_server, args=(shared_arr, sem))
Report_status = Process(target=device_client, args=(shared_arr, sem))
Print_image.start()
Action_trigger.start()
Report_status.start()
Print_image.join()
Action_trigger.join()
Report_status.join()
def device_control(arr, sem):
cv2.namedWindow("output", cv2.WINDOW_NORMAL)
cv2.resizeWindow("output", 1200, 1150)
while True:
sem.acquire()
ii = arr[0]
sem.release()
imgFile = "Pictures/image" + str(ii) +".jpg"
img = cv2.imread(imgFile, cv2.IMREAD_COLOR)
cv2.imshow("output", img)
ret = cv2.waitKey(1000)
cv2.destroyALLWindows()
def device_server(arr, sem):
S_HOST = '192.168.0.20'
S_PORT = 8888
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((S_HOST, S_PORT))
server_socket.listen()
while True:
client_socket, addr = server_socket.accept()
print('connected by', addr)
while True:
data = client_socket.recv(1024)
print(data.decode())
if not data:
print('Disconnect')
break
client_socket.sendall(data)
desired = json.loads(data.decode())
sem.acquire()
arr[0] = int(desired["content"])
print(f'Get action as {arr[0]}')
sem.release()
client_socket.close()
server_socket.close()
def device_client(arr, sem):
HOST = '10.177.xxx.xxx'
PORT = 8888
RPI_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
while True:
try:
RPI_client_socket.connect((HOST, PORT))
break
except Exception as ex:
print(f'Failed connect to server, retry after 5 sec {ex}')
sleep(5)
message = {"device": 1, "status": 0, "db_action": "put"}
while True:
sem.acquire()
message["status"] = arr[0]
sem.release()
RPI_client_socket.sendall(json.dumps(message).encode('utf-8'))
reply = RPI_client_socket.recv(1024)
sleep(10)
RPI_client_socket.close()