Files
Akita-Meshtastic-Meshcore-B…/examples/meshcore_simulator.py
2025-11-18 18:55:02 -05:00

88 lines
2.8 KiB
Python

# 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()