Remote über Bluetooth von meinem Handy (Series 60) zum PC

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
LukasHetzi
User
Beiträge: 14
Registriert: Donnerstag 25. Januar 2007, 12:01

Hallo,
ich möchte von meinem Nokia Series 60-Handy (Nokia 6630) aus eine Verbindung zu meinem PC herstellen und so zum Beispiel den Media-Player Amarok oder den vlc-Player steuern.
Leider bin ich bei diesem Programm noch ganz am Anfang und brauche eine kleine Starthilfe.
Ich verwende auf dem Handy "Python for Series 60" (http://forum.nokia.com/python) und auf dem Linux-Rechner Python mit pyBluez

Was ich bis jetzt geschafft habe: Ich habe eine Bluetooth-RFCOMM-Verbindung vom Handy zum PC aufgebaut (und auch umgekehrt) und kann schon einzelne Nachrichten schicken.

Was ich aber eigentlich machen will: Ich will vom Handy aus zum Computer einen Befehl senden (z.B. amarok showtitle), der PC soll darauf reagieren und den entsprechenden Titel zum Handy zurück senden.
Also so:
PC: RFCOMM-Server läuft
Handy: Öffnet eine Bluetooth-Verbindung zum PC und sendet "amarok Showtitle"
PC: reagiert darauf und sendet zurück: "foobar - blablabla"
Handy: empfängt den Titel und zeigt ihn an

Ich weiß aber nicht, wie ich es machen soll dass der Computer Server und Client zugleich ist (also Daten empfangen und die Antwort darauf senden kann)

Hat schon jemand etwas ähnliches gemacht oder kann mir irgendjemand anderer halfen?

PS: Ich bin neu in diesem Forum. Ich habe die Suche und Google benützt, konnte aber nicht das Richtige finden. Ich habe es in das Forum "Allgemeine Fragen" geschrieben, weil ich sonst nichts passendes gefunden habe.

Ich bin für jede Hilfe dankbar,
mfg LukasHetzi
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

LukasHetzi hat geschrieben:Ich weiß aber nicht, wie ich es machen soll dass der Computer Server und Client zugleich ist (also Daten empfangen und die Antwort darauf senden kann)
Braucht er nicht. Auch Clients dürfen daten an den Server schicken. Sonst wäre sowas wie IRC unmöglich.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
LukasHetzi
User
Beiträge: 14
Registriert: Donnerstag 25. Januar 2007, 12:01

Leonidas hat geschrieben:
LukasHetzi hat geschrieben:Ich weiß aber nicht, wie ich es machen soll dass der Computer Server und Client zugleich ist (also Daten empfangen und die Antwort darauf senden kann)
Braucht er nicht. Auch Clients dürfen daten an den Server schicken. Sonst wäre sowas wie IRC unmöglich.
Danke, hast du oder irgendjemand anderes ein Beispielscript für eine solche Bluetooth-Verbindung?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

LukasHetzi hat geschrieben:hast du oder irgendjemand anderes ein Beispielscript für eine solche Bluetooth-Verbindung?
Ja. Hier gibt es Informationen und da ist ein 77-Seitiges PDF verlinkt, welches eine BT-EInführung bietet. Außerdem noch An Introduction to Bluetooth programming in GNU/Linux wo auch die Python-Seite beschrieben wird.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
LukasHetzi
User
Beiträge: 14
Registriert: Donnerstag 25. Januar 2007, 12:01

Hallo,
ich habe das Beispiel von pyBluez für den Aufbau einer l2cap-Verbindung auf RFCOMM umgeschrieben und wollte nun GTK entfernen, da ich es später nicht brauchen werde.
Der Code sieht jetzt so aus.

Code: Alles auswählen

#!/usr/bin/python

import os
import sys
import time

import gtk

import bluetooth

class BluezChatGui:
	def __init__(self):
		
		print "called init"
		
		self.peers = {}
		self.sources = {}
		self.addresses = {}

		# the listening sockets
		self.server_sock = None


	def scan(self):
		newdevs = bluetooth.discover_devices()

		self.discovered.clear()

		for addr in newdevs:
			name = bluetooth.lookup_name(addr)
			if not name:
				name = "[unknown]"

			self.discovered.append( [ addr, addr, name ] )
#			self.add_text("\ndiscovered [%s]" % addr)


	def send(self, text):
		#text = "str"
		if len(text) == 0: return

		for addr, sock in self.peers.items():
			sock.send(text)

		print "sending", text, "to", self.peers.items()

# --- network events

	def incoming_connection(self, source, condition):
		sock, info = self.server_sock.accept()
		address, psm = info

		print "accepted connection from ", str(address)

		# add new connection to list of peers
		self.peers[address] = sock
		self.addresses[sock] = address
		self.sources[address] = source
		
		self.send("hello")
		
		return True

	def data_ready(self, sock, condition):
		address = self.addresses[sock]
		data = sock.recv(1024)

		if len(data) == 0:
			print "lost connection with ", address
			gobject.source_remove(self.sources[address])
			del self.sources[address]
			del self.peers[address]
			del self.addresses[sock]
			sock.close()
		else:
			print "Nachricht von ", address, ": ", str(data)
			
			if data == "hi":
				self.send("hi too")
			
		return True

# --- other stuff

	def cleanup(self):
		print "called cleanup"
		self.hci_sock.close()

	def connect(self, addr):
		sock = bluetooth.BluetoothSocket( bluetooth.RFCOMM )
		try:
			sock.connect((addr, 17))
		except bluez.error, e:
			print "Bluez error: ", str(e)
			sock.close()
			return

		self.peers[addr] = sock
		self.sources[addr] = source
		self.addresses[sock] = addr

	def start_server(self):
		self.server_sock = bluetooth.BluetoothSocket( bluetooth.RFCOMM )
		self.server_sock.bind(("",17))
		self.server_sock.listen(5)

		uuid = "94f39d29-7d6d-437d-973b-fba39e49d4ee"

		bluetooth.advertise_service( self.server_sock, "FooBar service",
				   service_id = uuid,
				   service_classes = [ uuid, bluetooth.SERIAL_PORT_CLASS ],
				   profiles = [ bluetooth.SERIAL_PORT_PROFILE ] )

	def run(self):
		print "starting server.."
		self.start_server()
		gtk.main()

print "loading gui"
gui = BluezChatGui()
gui.run()
Wenn ich das Programm so ausführe wartet es auf eine Bluetooth-Verbindung.
Entferne ich allerdings "import gtk" und "gtk.main()" so wird es nach dem Starten sofort wieder beendet. Ich hab also keine Möglichkeit vom handy aus eine Verbindung herzustellen.
Zuletzt geändert von LukasHetzi am Samstag 27. Januar 2007, 18:56, insgesamt 1-mal geändert.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

LukasHetzi
User
Beiträge: 14
Registriert: Donnerstag 25. Januar 2007, 12:01

sape hat geschrieben:@LukasHetzi:
http://www.python-forum.de/faq.php#21
Okay. schon geändert
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

LukasHetzi hat geschrieben:Entferne ich allerdings "import gtk" und "gtk.main()" so wird es nach dem Starten sofort wieder beendet.
Natürlich, was erwartest du denn? GTK schaltet in eine Mainloop, die das Programm in der Dauerschleife laufen lässt. Entfernst du diese Schleife, kommt es zu keiner einzigen Interation und das programm beendet sich.

Sieh dir mal den Code an:

Code: Alles auswählen

class MyClass(object):
    def __init__(self):
        print 'started'

    def run(self):
        # do nothing
        pass

myclass = MyClass()
myclass.run()
Was erwartest du was passiert?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
LukasHetzi
User
Beiträge: 14
Registriert: Donnerstag 25. Januar 2007, 12:01

Hallo,

ich verstehe schon dass dein Beispielcode gleich beendet wird.
Aber gibt es eine - ausser gtk - noch eine Möglichkeit eine Mainloop zu erzeugen? Ich habe es schon mit einigen while-Schleifen versucht, jedoch ohne Erfolg.
Benutzeravatar
blumi
User
Beiträge: 8
Registriert: Mittwoch 31. Januar 2007, 11:30
Wohnort: Erfurt

LukasHetzi hat geschrieben:Hallo,

ich verstehe schon dass dein Beispielcode gleich beendet wird.
Aber gibt es eine - ausser gtk - noch eine Möglichkeit eine Mainloop zu erzeugen? Ich habe es schon mit einigen while-Schleifen versucht, jedoch ohne Erfolg.
In prozeduralen Programmiersprachen verwendet man üblicherweise folgenden Konstrukt:

Code: Alles auswählen

<Initialisierung>

while True:
    <Aktion 1>
    <Aktion 2>
    (...)
    <Aktion n>

    if <Abbruchbedingung>:
        break;

<Aufräumen>
Antworten