#!/usr/bin/python

import sys
import time
import dbus
from optparse import OptionParser, make_option

bus = dbus.SystemBus()

manager = dbus.Interface(bus.get_object("org.bluez", "/"),
						"org.bluez.Manager")
option_list = [
		make_option("-i", "--device", action="store",
				type="string", dest="dev_id"),
		]
parser = OptionParser(option_list=option_list)

(options, args) = parser.parse_args()

if options.dev_id:
	adapter_path = manager.FindAdapter(options.dev_id)
else:
	adapter_path = manager.DefaultAdapter()

adapter = dbus.Interface(bus.get_object("org.bluez", adapter_path),
							"org.bluez.Adapter")

if (len(args) < 1):
	print "Usage: %s <address> [service]" % (sys.argv[0])
	sys.exit(1)

address = sys.argv[0]

if (len(args) < 2):
	service = "spp"
else:
	service = args[1]

path = adapter.FindDevice(address)

serial = dbus.Interface(bus.get_object("org.bluez", path),
						"org.bluez.Serial")

node = serial.Connect(service)

print "Connected %s to %s" % (node, address)

print "Press CTRL-C to disconnect"

try:
	time.sleep(1000)
	print "Terminating connection"
except:
	pass

serial.Disconnect(node)
