Link Search Menu Expand Document

Socket Server

Accept incoming socket json and publish to ARENA. An example of using non-blocking threads to allow ARENA-enabled applications to execute infinite while True loops.

!!!!!!! WARNING: This example subverts ARENA MQTT security by adding a new socket server layer you must secure yourself. !!!!!!!

import json
import socket
import threading
import time

from arena import *

SOCK_SERVER_HOST = "localhost"
SOCK_SERVER_PORT = 8888
SOCK_THREAD_NAME = "unsecured publisher"

scene = Scene(host="arenaxr.org", scene="example")
print("opened secured mqtt socket.")

def background_task():
    print("opening unsecured generic socket...")
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind((SOCK_SERVER_HOST, SOCK_SERVER_PORT))
    sock.listen(1)  # num. allowed concurrent connects, socket.SOMAXCONN = 128 on some systems

    while True:
        conn, _ = sock.accept()
        data = conn.recv(1024)
        conn.close()
        publish_unauthenticated_json(data)
        # block a bit
        time.sleep(0.01)

def publish_unauthenticated_json(data):
    print(f"received unauthenticated {data}")
    payload = json.loads(data)
    payload["action"] = "update"
    topic = PUBLISH_TOPICS.SCENE_OBJECTS.substitute({**scene.topicParams, **{"objectId": payload['object_id']}})
    print("publishing on secured mqtt socket...")
    scene.mqttc.publish(topic, json.dumps(payload), qos=0)

@scene.run_once
def load_thread():
    # create and start the daemon thread
    print("starting background task...")
    daemon = threading.Thread(target=background_task, daemon=True, name=SOCK_THREAD_NAME)
    daemon.start()
    print("main thread is free.")

scene.run_tasks()