Python parsing Bluetooth RFCOMM for 9 bytes

MRAB python at mrabarnett.plus.com
Fri Dec 14 01:49:39 CET 2012


On 2012-12-14 00:00, Barry Dick wrote:
> My data looks like this when it comes from the device (biofeedback device). There are 9 bytes in total, and I need to buffer so much, and then poll it for new/recent packets. The start packet unfortunately starts with 0x00
>
> So far the only thing I've found that looks like what I want to do is this, but I don't know how to implement it. http://code.activestate.com/recipes/408859/
>
>
> Data:  [0000002d0270025e00]
> Data:  [0001004a0006026547]
> Data:  [0002004b000a026343]
> Data:  [00]
> Data:  [03004f0006025b4a00]
> Data:  [046698000802569d00]
> Data:  [00003002830257f100]
> Data:  [01004a000602585400]
> Data:  [020048000a025b4e00]
> Data:  [03004b0006025b4e00]
> Data:  [046698000702579d00]
> Data:  [00002f027602480e00]
> Data:  [01004a0006024b61]
> Data:  [0002004a000a025552]
> Data:  [0003004b0006025752]
> Data:  [00046698000702569e]
> Data:  [0000002c025b025321]
> Data:  [00010048000602505e]
>
> My code so far looks like this...
>
> import bluetooth, sys, time, os, binascii, struct;
>
> # Create the client socket
> client_socket=BluetoothSocket( RFCOMM )
>
> client_socket.connect(("10:00:E8:AC:4D:D0", 1))
>
> data = ""
> try:
> 	while True:
> 		try:
> 			data = client_socket.recv(9)
> 		except bluetooth.BluetoothError, b:
> 			print "Bluetooth Error: ", b
>
> 		if len(data) > 0:
> 			print "Data:  [%s]" % binascii.hexlify(data)
>
> except KeyboardInterrupt:
> 	#print "Closing socket...",
> 	client_socket.close()
> 	#print "done."
>
Is the following more like how you want it?

data = ""
try:
     while True:
         try:
             more = client_socket.recv(9)
         except bluetooth.BluetoothError, b:
             print "Bluetooth Error: ", b
         else:
             data += more

             while len(data) >= 9:
                 print "Data:  [%s]" % binascii.hexlify(data[ : 9])
                 data = data[9 : ]
except KeyboardInterrupt:
     #print "Closing socket...",
     client_socket.close()
     #print "done."

You could, of course, decide to recv more than 9 bytes at a time. It
could return less than you asked for (but it should block until at
least 1 byte is available), but it will never return more than you
asked for.



More information about the Python-list mailing list