# PyTrackerClient.py ''' author: edistar license: GPL v3 or later version 0.1 ''' from __future__ import with_statement import datetime import ecore import e_dbus import os import sys from socket import * from dbus import SystemBus, Interface from optparse import OptionParser class TrackClient: def __init__(self, username='anonymous', passwordhash='', host='localhost', port='49152'): self.InitSocket(host, port) self.InitDbusStuff() self.InitUserHash(username, passwordhash) def InitSocket(self, host, port): # Set the socket parameters # e.g. host = "localhost" # e.g. port = 49152 self.__addr = (str(host),int(port)) # Create socket self.__UDPSock = socket(AF_INET,SOCK_DGRAM) # Debug message: print "UDP Socket for %s at port %s created" % (host, port) def TransmitUDP(self, data): if data: self.__UDPSock.sendto(data,self.__addr) # Debug message: print "UDP stream %s sent" % (data) def CloseSocket(self): self.__UDPSock.close() # Debug message: # print "UDP Socket closed" def InitDbusStuff(self): # get FSO Usage proxy/iface up to request GPS self.systembus=systembus = SystemBus(mainloop=e_dbus.DBusEcoreMainLoop()) self.usage_proxy = self.systembus.get_object('org.freesmartphone.ousaged', '/org/freesmartphone/Usage') self.usage_iface = Interface(self.usage_proxy, 'org.freesmartphone.Usage') # request GPS from FSO (which then powers on the GPS chip) self.usage_iface.RequestResource("GPS") # get gypsy proxy/iface up self.ogpsd_proxy = self.systembus.get_object('org.freesmartphone.ogpsd', '/org/freedesktop/Gypsy') self.course_iface = Interface(self.ogpsd_proxy, 'org.freedesktop.Gypsy.Course') self.pos_iface = Interface(self.ogpsd_proxy, 'org.freedesktop.Gypsy.Position') self.terminator="" def UpdateData(self, fields, timestamp, lat, lon, alt): # get UTC time from gypsy timestamp string = str(datetime.datetime.utcfromtimestamp(timestamp)) date, time = string.split() utctime = "%sT%sZ" % (date, time) # prepare data for sending UDPData = "%s,%s,%s,%s" % (lat, lon, alt, utctime) self.SendData(self.__username, self.__pwhash, 'TRANSMIT', UDPData) # Debug message: # print "Updated Data" def InitUserHash(self, username, pwhash): # set username and password globally in the class self.__username = username self.__pwhash = pwhash def SendData(self, username, pwhash, action, data=""): # put together and send data to TransmitUDP() senddata = "%s;%s;%s;%s" % (username, pwhash, action, data) self.TransmitUDP(senddata) def StartTrack(self): self.SendData(self.__username, self.__pwhash, action="START") # call self.UpdatePosition() when a dbus signal "PositionChanged" comes along the system bus # if an event handler has already been set, delete it! try: if self.terminator: self.terminator.delete() except: pass self.terminator = self.pos_iface.connect_to_signal("PositionChanged", self.UpdateData) def StopTrack(self): self.SendData(self.__username, self.__pwhash, action="STOP") # remove connect_to_signal event self.terminator.remove() # self.usage_iface.ReleaseResource("GPS")