【发布时间】:2018-01-07 23:54:20
【问题描述】:
我是 Python 编程的初学者(学习和实践不超过 6 个月)。 我的车上有一个 GPS 追踪器,我父亲的车上还有一个。 我想将这两个 GPS 跟踪器发送的所有数据记录到数据库中以供将来统计。 一切正常,直到我尝试将通过 TCP 接收的数据写入 mysql 表。
我试图找到解决问题的方法,但没有成功 (here,here,here)。 任何想法、帮助,无论我多么渺小,都将不胜感激。
控制台错误消息 Get data from ('tracker_ip', 25904) ('tracker_id', 纬度, 经度, '102456', '010817', 'N', 'E', '0', '0.00', 10.3) 错误:未捕获的 python 异常,关闭通道 main.EchoHandler 连接 tracker_ip:25904 at 0x7f627f6e2b38> (:dbinsert() 缺少 1 个必需的位置 参数:'data_tuple' [/usr/lib/python3.5/asyncore.py|read|83] [/usr/lib/python3.5/asynco re.py|handle_read_event|423] [server3_1.py|handle_read|84])
我的代码
#!/usr/bin/python3
import pymysql
import asyncore
import socket
import re
class Database():
def __init__(self):
self.dbconnection = pymysql.connect('localhost','db_user','password','db' )
self.cursor = self.dbconnection.cursor()
sql = """CREATE TABLE IF NOT EXISTS GPS (
signature CHAR(50) NOT NULL,
latitude REAL,
orientationNS CHAR(1),
longitude REAL,
orientationEV CHAR(1),
gpstime CHAR(10),
gpsdate CHAR(10),
speed CHAR(6),
direction CHAR(3),
distance REAL)"""
self.cursor.execute(sql)
self.dbconnection.commit()
def dbinsert(self,data_tuple):
cmd =("""INSERT INTO GPS (signature,latitude,longitude,gpstime,gpsdata,orientationNS,orientationEV,direction,speed,distance)\
VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)""")
self.cursor.execute(cmd,data_tuple)
self.dbconnection.commit()
def __del__(self):
self.dbconnection.close()
class ClientHandler(asyncore.dispatcher):
def ConvertCoordinates(self,latitude,longitude):
lat_degree = int(float(latitude) / 100);
lng_degree = int(float(longitude) / 100);
# Extracting minutes for latitude and longitude
lat_mm_mmmm = float(latitude) % 100
lng_mm_mmmmm = float(longitude) % 100
converted_latitude = lat_degree + (lat_mm_mmmm / 60)
converted_longitude = lng_degree + (lng_mm_mmmmm / 60)
return (converted_latitude,converted_longitude) #tuple
def GetData(self,data_string):
data_list = re.sub(r'\s', '', data_string).split(',')
signature = data_list[1]
latitude,longitude = self.ConvertCoordinates(data_list[5],data_list[7])
orientationNS = data_list[6] #latitude
orientationEV = data_list[8] #longitude
gpstime = data_list[3]
gpsdate =data_list[11]
gps_fix_validate = data_list[4] #
speed= data_list[9]
direction = data_list[10]
distance = 10.3 #dummy data
return (signature,latitude,longitude,gpstime,gpsdate,orientationNS,orientationEV,direction,speed,distance)
def handle_read(self):
data = self.recv(8192)
data_string = data.decode(errors="ignore")
#print(len(data_string))
if len(data_string) >= 84 and len(data_string) <= 88 :
data_tuple = self.GetData(data_string)
print(data_tuple)
Database.dbinsert(data_tuple)
class DataServer(asyncore.dispatcher):
def __init__(self, host, port):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.set_reuse_addr()
self.bind((host, port))
self.listen(5)
def handle_accept(self):
pair = self.accept()
if pair is None:
return
else:
sock, addr = pair
print('Get data from %s' % repr(addr))
handler = ClientHandler(sock)
database=Database()
server = DataServer('192.168.10.10', 21112)
asyncore.loop()
【问题讨论】:
标签: mysql python-3.5 sql-insert mysql-python asyncore