Made amazing progress on backend
Still need to add the source node information to the messages sent from the local node in the web browser.
This commit is contained in:
parent
8dda59f1ee
commit
1b82753a87
|
|
@ -0,0 +1 @@
|
||||||
|
.idea/
|
||||||
137
main.py
137
main.py
|
|
@ -3,25 +3,154 @@ import meshtastic.serial_interface
|
||||||
import meshtastic.node
|
import meshtastic.node
|
||||||
from pubsub import pub
|
from pubsub import pub
|
||||||
from pprint import pprint
|
from pprint import pprint
|
||||||
|
from flask import Flask, request, jsonify, render_template
|
||||||
|
from flask_cors import CORS
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
from json_utilities import json_friendly_packet, jsonify_dict, render_components
|
||||||
|
|
||||||
|
HEXADECIMAL_STRING_CHARS = "0123456789abcdef"
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
cors = CORS(app, resources={r"/*": {"origins": "*"}})
|
||||||
|
|
||||||
|
|
||||||
from json_utilities import json_friendly_packet
|
packets = []
|
||||||
|
|
||||||
|
|
||||||
def on_receive(packet):
|
def on_receive(packet):
|
||||||
packet = json_friendly_packet(packet)
|
packet = json_friendly_packet(packet)
|
||||||
print(json.dumps(packet, indent=2))
|
packets.append(packet)
|
||||||
|
|
||||||
|
|
||||||
def on_connection(topic=pub.AUTO_TOPIC):
|
def on_connection(topic=pub.AUTO_TOPIC):
|
||||||
pprint(topic)
|
pprint(topic)
|
||||||
|
|
||||||
|
|
||||||
|
def is_node_id_valid(node_id: str) -> bool:
|
||||||
|
return node_id.startswith("!") and \
|
||||||
|
len(node_id) == 9 and \
|
||||||
|
len([x for x in node_id.lower() if x in HEXADECIMAL_STRING_CHARS]) == 8
|
||||||
|
|
||||||
|
|
||||||
|
def send_message(destination: str, message: str) -> str:
|
||||||
|
packet = {"fromId": "", "toId": destination, "decoded": {"text": message, "portnum": "TEXT_MESSAGE_APP"}}
|
||||||
|
packets.append(packet)
|
||||||
|
print(json.dumps(packets, indent=2))
|
||||||
|
return str(interface.sendText(message, destination, True, False, 3))
|
||||||
|
|
||||||
|
|
||||||
|
def save_messages():
|
||||||
|
packets_serialized = json.dumps(packets)
|
||||||
|
try:
|
||||||
|
with open("mesh_msgs.json", "w") as f:
|
||||||
|
f.write(packets_serialized)
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
|
||||||
|
|
||||||
|
def load_messages():
|
||||||
|
try:
|
||||||
|
with open("mesh_msgs.json") as f:
|
||||||
|
packets_serialized = f.read()
|
||||||
|
packets.append(json.loads(packets_serialized))
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/")
|
||||||
|
def flask_main():
|
||||||
|
return jsonify({})
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/get_nodes")
|
||||||
|
def flast_get_nodes():
|
||||||
|
nodes_list = []
|
||||||
|
for node_key in interface.nodes:
|
||||||
|
try:
|
||||||
|
node_value = interface.nodes[node_key]
|
||||||
|
node_details = {}
|
||||||
|
|
||||||
|
if "snr" in node_value:
|
||||||
|
node_details["snr"] = float(node_value["snr"])
|
||||||
|
|
||||||
|
if "deviceMetrics" in node_value:
|
||||||
|
if "batteryLevel" in node_value["deviceMetrics"]:
|
||||||
|
node_details["battery_level"] = float(node_value["deviceMetrics"]["batteryLevel"])
|
||||||
|
if "voltage" in node_value["deviceMetrics"]:
|
||||||
|
node_details["voltage"] = float(node_value["deviceMetrics"]["voltage"])
|
||||||
|
|
||||||
|
if "user" in node_value:
|
||||||
|
if "id" in node_value["user"]:
|
||||||
|
node_details["node_id"] = node_value["user"]["id"]
|
||||||
|
if "longName" in node_value["user"]:
|
||||||
|
node_details["node_name"] = node_value["user"]["longName"]
|
||||||
|
if "shortName" in node_value["user"]:
|
||||||
|
node_details["node_short_name"] = node_value["user"]["shortName"]
|
||||||
|
|
||||||
|
try:
|
||||||
|
node_details["last_heard"] = str(datetime.utcfromtimestamp(float(node_value["lastHeard"])))
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
|
||||||
|
nodes_list.append(node_details)
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
|
||||||
|
return jsonify(nodes_list)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/get_messages")
|
||||||
|
def flask_get_messages():
|
||||||
|
# print(json.dumps(packets, indent=2))
|
||||||
|
|
||||||
|
messages_list = []
|
||||||
|
|
||||||
|
for message in packets:
|
||||||
|
message_details = {}
|
||||||
|
if "fromId" in message:
|
||||||
|
message_details["source"] = message["fromId"]
|
||||||
|
if "toId" in message:
|
||||||
|
message_details["destination"] = message["toId"]
|
||||||
|
if "rxSnr" in message:
|
||||||
|
message_details["snr"] = message["rxSnr"]
|
||||||
|
if "rxRssi" in message:
|
||||||
|
message_details["rssi"] = message["rxRssi"]
|
||||||
|
if "decoded" in message:
|
||||||
|
if "text" in message["decoded"]:
|
||||||
|
message_details["message"] = message["decoded"]["text"]
|
||||||
|
if "portnum" in message["decoded"]:
|
||||||
|
message_details["portnum"] = message["decoded"]["portnum"]
|
||||||
|
messages_list.append(message_details)
|
||||||
|
return jsonify(messages_list)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/send_message", methods=['POST'])
|
||||||
|
def flask_send_message():
|
||||||
|
if request.method == 'POST':
|
||||||
|
if "destination" in request.json and "message" in request.json:
|
||||||
|
destination, message = request.json["destination"], request.json["message"]
|
||||||
|
if type(destination) != str or type(message) != str:
|
||||||
|
return jsonify({"error": "destination or message invalid"})
|
||||||
|
if not is_node_id_valid(destination):
|
||||||
|
return jsonify({"error": "destination {} not valid".format(destination)})
|
||||||
|
result = send_message(destination, message)
|
||||||
|
return jsonify({"result": result})
|
||||||
|
return jsonify({"error": "destination or message not in request"})
|
||||||
|
return jsonify({"error": "use POST requests"})
|
||||||
|
|
||||||
|
|
||||||
pub.subscribe(on_receive, "meshtastic.receive")
|
pub.subscribe(on_receive, "meshtastic.receive")
|
||||||
pub.subscribe(on_connection, "meshtastic.connection.established")
|
pub.subscribe(on_connection, "meshtastic.connection.established")
|
||||||
|
|
||||||
interface = meshtastic.serial_interface.SerialInterface()
|
interface = meshtastic.serial_interface.SerialInterface()
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
node: meshtastic.Node = interface.localNode
|
try:
|
||||||
node.showInfo()
|
load_messages()
|
||||||
|
node: meshtastic.Node = interface.localNode
|
||||||
|
app.run(port=5643)
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
print("Got keyboard interrupt, exiting application")
|
||||||
|
save_messages()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue