r250 - trunk/software/pyneod
smartphones-commits at lists.linuxtogo.org
smartphones-commits at lists.linuxtogo.org
Thu Apr 24 22:52:19 CEST 2008
Author: emdete
Date: 2008-04-24 22:52:19 +0200 (Thu, 24 Apr 2008)
New Revision: 250
Added:
trunk/software/pyneod/pyllbd.py
Log:
added a daemon to allow location by cell-id from pygsmd through a
local cell-id-location-database.
Added: trunk/software/pyneod/pyllbd.py
===================================================================
--- trunk/software/pyneod/pyllbd.py (rev 0)
+++ trunk/software/pyneod/pyllbd.py 2008-04-24 20:52:19 UTC (rev 250)
@@ -0,0 +1,119 @@
+#!/usr/bin/env python2.5
+# -*- coding: utf-8 -*-
+
+# copyright: m. dietrich
+# license: gpl
+__revision = '$Rev$'
+
+from os import unlink
+from struct import pack, unpack, calcsize
+from gdbm import open as db_open
+from base import log_info, log_debug, config, LOG_ERR, LOG_WARNING, LOG_INFO, LOG_DEBUG, LOG, dedbusmap
+from freesmartphone import *
+
+'''
+dbus-send --system --print-reply --type=method_call --dest=org.mobile /org/mobile/LocalLocation org.mobile.Location.SetPosition string:262.2.144.26993
+'''
+
+class LocalLocation(NotifyObject):
+ def __init__(self, bus):
+ LOG(LOG_DEBUG, __name__, '__init__')
+ NotifyObject.__init__(self,
+ object_path='/org/mobile/LocalLocation',
+ bus_name=BusName(DBUS_NAME, bus),
+ )
+ self.db = db_open(config.get('llb', 'database'), 'r')
+
+ @method(DIN_LOCATION, 's', 'a{sv}')
+ def SetPosition(self, cellid):
+ LOG(LOG_DEBUG, __name__, 'SetPosition', cellid)
+ key = self.gen_key(*[int(n) for n in cellid.split('.')])
+ if self.db.has_key(key):
+ latitude, longitude, radius = self.value(self.db[key])
+ content = dict(latitude=latitude, longitude=longitude, fix=1, )
+ else:
+ content = dict(latitude=0.0, longitude=0.0, fix=0, )
+ self.Position(content)
+ return content
+
+ @notify(DIN_LOCATION, 'a{sv}')
+ def Position(self, content):
+ LOG(LOG_DEBUG, __name__, 'Position', content)
+
+ @staticmethod
+ def gen_key(mcc, mnc, lac, ci, ):
+ return pack('!iiii', mcc, mnc, lac, ci, )
+
+ @staticmethod
+ def gen_value(mcc, mnc, lac, ci, radius, latitude, longitude, begin_angle, end_angle):
+ return pack('!iii', int(latitude*1000000), int(longitude*1000000), radius, )
+
+ @staticmethod
+ def value(buf):
+ latitude, longitude, radius = unpack('!iii', buf)
+ latitude = float(latitude) / 1000000
+ longitude = float(longitude) / 1000000
+ return latitude, longitude, radius
+
+ @staticmethod
+ def import_to_gdb(from_db):
+ f = open(from_db, 'r')
+ try: unlink(config.get('llb', 'database'))
+ except: pass
+ db = db_open(config.get('llb', 'database'), 'cf')
+ line = f.readline()
+ l = 0
+ while line:
+ mcc, mnc, lac, ci, radius, longitude, latitude, angle = line.split()
+ mcc = int(mcc)
+ mnc = int(mnc)
+ lac = int(lac)
+ ci = int(ci)
+ radius = int(radius)
+ latitude = float(latitude)
+ longitude = float(longitude)
+ begin_angle = int(angle[:3])
+ end_angle = int(angle[3:])
+ db[LocalLocation.gen_key(mcc, mnc, lac, ci)] = LocalLocation.gen_value(mcc, mnc, lac, ci, radius, latitude, longitude, begin_angle, end_angle)
+ line = f.readline()
+ l+=1
+ db.close()
+ return l
+
+ @staticmethod
+ def import_to_myqsl(from_db, host, database, user, password, port):
+ import MySQLdb as dbi
+ connection = dbi.connect(host, database, user, password, port=port, )
+ cur = connection.cursor()
+ cur.execute('DELETE FROM cell_location')
+ f = open(from_db, 'r')
+ line = f.readline()
+ while line:
+ mcc, mnc, lac, ci, radius, longitude, latitude, angle = line.split()
+ mcc = int(mcc)
+ mnc = int(mnc)
+ lac = int(lac)
+ ci = int(ci)
+ radius = int(radius)
+ latitude = float(latitude)
+ longitude = float(longitude)
+ begin_angle = int(angle[:3])
+ end_angle = int(angle[3:])
+ line = f.readline()
+ cur.execute('INSERT INTO cell_location (mcc, mnc, lac, cell_id, latitude, longitude) VALUES (%d, %d, %d, %d, %f, %f)'% (
+ mcc, mnc, lac, ci, latitude, longitude, ))
+ cur.close()
+ connection.close()
+
+if __name__ == '__main__':
+ from syslog import openlog, syslog, closelog, LOG_ERR, LOG_WARNING, LOG_INFO, LOG_DEBUG, LOG_DAEMON, LOG_NDELAY, LOG_PID, LOG_PERROR
+ from gobject import MainLoop
+ from dbus.mainloop.glib import DBusGMainLoop
+ openlog('pyggld', LOG_NDELAY|LOG_PID|LOG_PERROR, LOG_DAEMON,)
+ DBusGMainLoop(set_as_default=True)
+ mainloop = MainLoop()
+ daemon = LocalLocation(InitBus())
+ print daemon.import_to_gdb('/tmp/bla.dat'), 'cells imported'
+ mainloop.run()
+ closelog()
+# vim:tw=0:nowrap
Property changes on: trunk/software/pyneod/pyllbd.py
___________________________________________________________________
Name: svn:executable
+ *
Name: svn:keywords
+ "LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author Rev"
Name: svn:eol-style
+ native
More information about the Smartphones-commits
mailing list