| @ -0,0 +1,79 @@ | |||
| import re | |||
| import socket | |||
| from flask import Flask, request | |||
| from twilio.twiml.messaging_response import MessagingResponse | |||
| app = Flask(__name__) | |||
| def decimal_to_ddmm(value): | |||
| degrees = int(value) | |||
| minutes_decimal = (value - degrees) * 60 | |||
| abs_minutes = abs(minutes_decimal) | |||
| minutes = round(abs_minutes, 2) | |||
| return "{:02d}{:05.2f}".format(abs(degrees), abs(minutes)) | |||
| # APRS-IS login info | |||
| serverHost = 'rotate.aprs2.net' | |||
| serverPort = 14580 | |||
| aprsUser = 'CALL' | |||
| aprsPass = 'PASS' | |||
| text = 'Sat2APRS' | |||
| # Create and connect the APRS-IS socket | |||
| aprs_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |||
| try: | |||
| aprs_sock.connect((serverHost, serverPort)) | |||
| login_str = 'user {} pass {} vers Sat2APRS 0.1b\r\n'.format(aprsUser, aprsPass) | |||
| aprs_sock.send(login_str.encode()) | |||
| response = aprs_sock.recv(1024).decode('utf-8') | |||
| print('APRS-IS login response:', response) | |||
| except Exception as e: | |||
| print('Error connecting to APRS-IS:', e) | |||
| def send_aprs_packet(callsign, lat, lon, text): | |||
| lat_ddmm = decimal_to_ddmm(lat) | |||
| lon_ddmm = decimal_to_ddmm(lon) | |||
| aprs_packet = '{}>APRS:!{}{}\{}{}S{}\r\n'.format(callsign, lat_ddmm, "N" if lat >= 0 else "S", lon_ddmm, "E" if lon >= 0 else "W", text) | |||
| try: | |||
| aprs_sock.sendall(aprs_packet.encode()) | |||
| print('Sent APRS packet:', aprs_packet.strip()) | |||
| except Exception as e: | |||
| print('Error sending APRS packet:', e) | |||
| @app.route('/sms', methods=['POST']) | |||
| def webhook(): | |||
| incoming_sms = request.form.get('Body', '') | |||
| latitude = None | |||
| longitude = None | |||
| # Log incoming message | |||
| print('Received Message:', incoming_sms) | |||
| # Search for latitude and longitude in the message using regular expressions | |||
| lat_long_match = re.search(r'Location:\s*(-?\d+\.\d+),(-?\d+\.\d+)', incoming_sms) | |||
| if lat_long_match: | |||
| latitude = float(lat_long_match.group(1)) | |||
| longitude = float(lat_long_match.group(2)) | |||
| print('Detected Lat Long: ({}, {})'.format(latitude, longitude)) | |||
| # Convert latitude and longitude to DDMM.MM format without dashes | |||
| lat_ddmm = decimal_to_ddmm(latitude) | |||
| long_ddmm = decimal_to_ddmm(longitude) | |||
| print('Converted Lat Long to DDMM.MM: {}, {}'.format(lat_ddmm, long_ddmm)) | |||
| print('{}/{}'.format(lat_ddmm, long_ddmm)) | |||
| # Send APRS packet | |||
| send_aprs_packet(aprsUser, latitude, longitude, text) | |||
| else: | |||
| print('No Lat Long detected.') | |||
| response = MessagingResponse() | |||
| return str(response) | |||
| if __name__ == '__main__': | |||
| app.run(host='0.0.0.0', port=5001, debug=True) | |||