# examples/meshcore_simulator.py """ Simple Meshcore Serial Device Simulator. """ import serial import time import json import threading import random SIMULATOR_PORT = "/dev/ttyS1" BAUD_RATE = 9600 SEND_PERIODIC_SENSOR_DATA = True SENSOR_INTERVAL_S = 15 shutdown_event = threading.Event() serial_port = None def serial_reader(): print("[Reader] Serial reader thread started.") while not shutdown_event.is_set(): if serial_port and serial_port.is_open: try: if serial_port.in_waiting > 0: line = serial_port.readline() if line: try: decoded_line = line.decode('utf-8').strip() print(f"\n[Reader] <<< Received: {decoded_line}") except UnicodeDecodeError: print(f"\n[Reader] <<< Received non-UTF8 data: {line!r}") else: time.sleep(0.1) except Exception as e: print(f"\n[Reader] Error: {e}") time.sleep(1) else: time.sleep(1) def periodic_sender(): print("[Periodic Sender] Started.") while not shutdown_event.is_set(): if serial_port and serial_port.is_open: try: sensor_value = round(20 + random.uniform(-2, 2), 2) message = { "destination_meshtastic_id": "!aabbccdd", "payload_json": {"type": "temp", "val": sensor_value} } message_str = json.dumps(message) + '\n' print(f"\n[Sender] >>> {message_str.strip()}") serial_port.write(message_str.encode('utf-8')) except Exception as e: print(f"\n[Sender] Error: {e}") shutdown_event.wait(SENSOR_INTERVAL_S) def main(): global serial_port print("--- Meshcore Simulator ---") reader = threading.Thread(target=serial_reader, daemon=True) reader.start() if SEND_PERIODIC_SENSOR_DATA: sender = threading.Thread(target=periodic_sender, daemon=True) sender.start() while not shutdown_event.is_set(): if not serial_port or not serial_port.is_open: try: serial_port = serial.Serial(SIMULATOR_PORT, BAUD_RATE, timeout=0.5) print(f"[Main] Opened {SIMULATOR_PORT}") except Exception: time.sleep(5) continue try: user_input = input() if user_input: msg = user_input.encode('utf-8') + b'\n' serial_port.write(msg) except KeyboardInterrupt: break shutdown_event.set() if serial_port: serial_port.close() if __name__ == "__main__": main()