#!/usr/bin/python

import sys
import time
import dbus
import socket
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 <socket_name> [service]" % (sys.argv[0])
	sys.exit(1)

socket_name = args[0]

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

sk = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sk.bind(socket_name)
sk.listen(1)

proxy_manager = dbus.Interface(bus.get_object("org.bluez", adapter_path),
						"org.bluez.SerialProxyManager")
proxy_path = proxy_manager.CreateProxy(service, socket_name)

proxy = dbus.Interface(bus.get_object("org.bluez", proxy_path),
							"org.bluez.SerialProxy")
proxy.Enable()

conn, addr = sk.accept()

print "Waiting for message"

while 1:
	data = conn.recv(1024)
	if data:
		print(data)
		break

proxy.Disable()
proxy_manager.RemoveProxy(proxy_path)
conn.close()
