#!/usr/bin/python # -*- coding:utf-8 -*- import RPi.GPIO as GPIO import serial import time import paho.mqtt.client as mqtt ser = serial.Serial('/dev/ttyS0', 115200) ser.flushInput() # MQTT Configuration MQTT_BROKER = "65.108.199.212" MQTT_PORT = 1883 MQTT_TOPIC = "gps/coordinates" # Create MQTT client client = mqtt.Client() def connect_mqtt(): client.connect(MQTT_BROKER, MQTT_PORT) client.loop_start() def send_at(command, back, timeout): rec_buff = '' ser.write((command+'\r\n').encode()) time.sleep(timeout) if ser.inWaiting(): time.sleep(0.01) rec_buff = ser.read(ser.inWaiting()) if rec_buff != '': if back not in rec_buff.decode(): print(command + ' ERROR') print(command + ' back:\t' + rec_buff.decode()) return 0, rec_buff else: print(rec_buff.decode()) return 1, rec_buff else: print('GPS no está listo') return 0, rec_buff def get_gps_position(): rec_null = True answer = 0 print('Iniciando GPS') send_at('AT+CGPS=1,1','OK',1) time.sleep(2) while rec_null: answer, rec_buff = send_at('AT+CGPSINFO','+CGPSINFO: ',1) if answer == 1: if ',,,,,,' in rec_buff.decode(): print('GPS no está listo') else: # Parse GPS data gps_data = rec_buff.decode().split('+CGPSINFO: ')[1].strip() lat, lon = parse_gps_data(gps_data) if lat and lon: # Send GPS coordinates to MQTT broker mqtt_payload = f"{lat},{lon}" client.publish(MQTT_TOPIC, mqtt_payload) print(f"Sent to MQTT: {mqtt_payload}") rec_null = False else: print('error %d'%answer) send_at('AT+CGPS=0','OK',1) return False time.sleep(1.5) def parse_gps_data(gps_data): parts = gps_data.split(',') if len(parts) >= 4: lat = convert_to_degrees(parts[0]) lon = convert_to_degrees(parts[2]) return lat, lon return None, None def convert_to_degrees(raw_value): if raw_value: degree = float(raw_value[:2]) minute = float(raw_value[2:]) return degree + (minute / 60.0) return None def power_on(power_key): print('SIM7600X is starting:') GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(power_key,GPIO.OUT) time.sleep(0.1) GPIO.output(power_key,GPIO.HIGH) time.sleep(2) GPIO.output(power_key,GPIO.LOW) time.sleep(20) ser.flushInput() print('SIM7600X is ready') def power_down(power_key): print('SIM7600X is loging off:') GPIO.output(power_key,GPIO.HIGH) time.sleep(3) GPIO.output(power_key,GPIO.LOW) time.sleep(18) print('Good bye') try: power_key = 6 # Assuming power key is connected to GPIO 6 connect_mqtt() power_on(power_key) get_gps_position() power_down(power_key) except Exception as e: print(f"An error occurred: {e}") finally: if ser is not None: ser.close() client.loop_stop() client.disconnect() GPIO.cleanup()