From 56e736caba4a1828516ddb41e85419e21dce4470 Mon Sep 17 00:00:00 2001 From: Adolfo Delorenzo Date: Fri, 12 Jul 2024 19:12:14 -0600 Subject: [PATCH] 2024-07-12 - --- GPS2.py | 140 +++++++++++++++++++++++++++++++++----------------------- GPS3.py | 118 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 202 insertions(+), 56 deletions(-) create mode 100644 GPS3.py diff --git a/GPS2.py b/GPS2.py index a9d57ac..0950048 100644 --- a/GPS2.py +++ b/GPS2.py @@ -1,18 +1,24 @@ #!/usr/bin/python # -*- coding:utf-8 -*- import RPi.GPIO as GPIO -import sqlite3 +import paho.mqtt.client as mqtt import serial import time, os -# SQLite Database settings -db_file = "gps_coordinates.db" -conn = sqlite3.connect(db_file) -cursor = conn.cursor() +# MQTT Broker settings + +mqttBroker ="65.108.199.212" +myhost = os.uname()[1] +client = mqtt.Client(myhost) +client.connect(mqttBroker, 1883) ser = serial.Serial('/dev/ttyS0',115200) ser.flushInput() +rec_buff = '' +rec_buff2 = '' +time_count = 0 + def send_at(command,back,timeout): rec_buff = '' ser.write((command+'\r\n').encode()) @@ -29,62 +35,84 @@ def send_at(command,back,timeout): print(rec_buff.decode()) return 1 else: - print('GPS is not ready') + print('GPS no está listo') return 0 def get_gps_position(): - rec_null = True - answer = 0 - print('Iniciando GPS') - rec_buff = '' - send_at('AT+CGPS=1,1','OK',1) - time.sleep(2) - while rec_null: - answer = send_at('AT+CGPSINFO','+CGPSINFO: ',1) - if 1 == answer: - answer = 0 - if ',,,,,,' in rec_buff: - print('GPS no está listo') - rec_null = False - time.sleep(1) - else: - # Extract GPS coordinates from the response - gps_data = rec_buff.split(',') - latitude = gps_data[2] - longitude = gps_data[3] + rec_null = True + answer = 0 + print('Iniciando GPS') + rec_buff = '' + send_at('AT+CGPS=1,1','OK',1) + time.sleep(2) + while rec_null: + answer = send_at('AT+CGPSINFO','+CGPSINFO: ',1) + if 1 == answer: + answer = 0 + if ',,,,,,' in rec_buff: + print('GPS no está listo') + rec_null = False + time.sleep(1) + 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("iiot/"+ myhost +"/gps", mqtt_payload) + else: + print('error %d'%answer) + rec_buff = '' + send_at('AT+CGPS=0','OK',1) + return False + time.sleep(1.5) - # Connect to the SQLite database - conn = sqlite3.connect('gps_coordinates.db') - c = conn.cursor() +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 - # Insert the GPS coordinates into the database - c.execute("INSERT INTO gps_coordinates (latitude, longitude) VALUES (?, ?)", (latitude, longitude)) +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 - # Commit and close the connection - conn.commit() - conn.close() +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') - else: - print('error %d'%answer) - rec_buff = '' - send_at('AT+CGPS=0','OK',1) - return False - time.sleep(1.5) +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') - return True - -def extract_gps_info(rec_buff): - # Implement this function based on the format of rec_buff - # Example: gps_info = rec_buff.split(',')[2] - return gps_info - -def store_gps_coordinates(gps_info): - cursor.execute("INSERT INTO coordinates (latitude, longitude) VALUES (?, ?)", gps_info) - conn.commit() - -# Main program -if __name__ == '__main__': - # Create the SQLite table if it doesn't exist - cursor.execute('''CREATE TABLE IF NOT EXISTS coordinates (id INTEGER PRIMARY KEY AUTOINCREMENT, latitude REAL, longitude REAL)''') - while True: - get_gps_position() \ No newline at end of file +try: + #power_on(power_key) + get_gps_position() + #power_down(power_key) +except: + if ser != None: + ser.close() + #power_down(power_key) + GPIO.cleanup() +if ser != None: + ser.close() + GPIO.cleanup() diff --git a/GPS3.py b/GPS3.py new file mode 100644 index 0000000..5fa53c3 --- /dev/null +++ b/GPS3.py @@ -0,0 +1,118 @@ +#!/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()