mti840-projet/device/device/compute.py

103 lines
2.8 KiB
Python

import io
import sys
import json
import time
import queue
import base64
import logging
import threading
import picamera
import requests
from device import things
logger = logging.getLogger('device')
action_queue = queue.Queue()
def register_device(settings):
cloud_url = settings.get('iot.cloud_url')
device_url = settings.get('iot.device_url')
device_uid = settings.get('iot.device_uid')
register_url = '%s/device/%s' % (cloud_url, device_uid)
callback = '%s/door' % device_url
payload = json.dumps({'callback': callback})
logger.info('Registering device to cloud %s %s', register_url, payload)
try:
requests.put(register_url, data=payload)
except Exception as e:
logger.warn('Cloud not register device to cloud, %s', e)
def camera_loop(settings):
camera_fps = float(settings.get('iot.camera_fps'))
detect_dist = float(settings.get('iot.detect_dist'))
device_uid = settings.get('iot.device_uid')
edge_url = settings.get('iot.edge_url')
camera_url = '%s/input/camera' % edge_url
delta = 1 / camera_fps
stream = io.BytesIO()
after_time = before_time = time.time()
with picamera.PiCamera() as camera:
logger.info('Running camera loop')
camera.resolution = (1024, 768)
while True:
before_time = time.time()
dist = things.distance()
if dist < detect_dist:
next(camera.capture_continuous(
stream, format='jpeg', use_video_port=True))
stream.seek(0)
image_b64 = base64.b64encode(stream.read())
payload = json.dumps({
'image': image_b64.decode('ascii'),
'device': device_uid
})
try:
logger.debug('Sending image to edge')
response = requests.post(camera_url, data=payload)
logger.debug('Got response %s', response.text)
except Exception as e:
logger.warning('Error while sending request: %s', str(e))
stream.truncate()
stream.seek(0)
after_time = time.time()
sleep_time = before_time + delta - after_time
if sleep_time > 0:
time.sleep(sleep_time)
def action_loop():
logger.info('Running action loop')
while True:
thing, state = action_queue.get()
if thing == 'door':
things.change_door_state(state)
def start_processing(settings):
register_device(settings)
things.setup()
logger.info('Starting processing thread...')
camera_thread = threading.Thread(
target=camera_loop, args=(settings,), daemon=True)
camera_thread.start()
action_thread = threading.Thread(
target=action_loop, daemon=True)
action_thread.start()