I am developing an app which will have multiple phones communicating
together concurrently via bluetooth.  To this end, I extended the
BluetoothChat example to support multiple simultaneous connections.
Once I got it working with 3 phones, I ramped up to 4 but have
discovered that it appears that phones running Android 2.2 can only
support 2 simultaneous bluetooth connections, while phones running
2.3.4 can support 3 (at least, if not more).  Can anyone confirm this
as a known bug for 2.2?  It would be good to know if this is just a
hard limitation.

Phones I am testing with:
HTC Incredible (2.2)
Nexus S (2.3.4)
Nexus 1 (2.3.4)
Nexus 1 (2.3.4)

Here's how I determined that there is this hard limit:

My code extends the BluetoothChat sample program, as I said.
Unfortunately I cannot share it right now (company legal limitations)
but it's basically the same as the original except that all threads
are not killed when new connections are made, all ConnectThread and
ConnectedThread objects are stored in an array, and I kick off a new
AcceptThread whenever an incoming connection is turned into a
ConnectedThread.

After instrumenting my code with lots of debug, what I've found is
that once my 2.2 device (the incredible) has established 2
connections, it will literally hang at either the accept() in the
AcceptThread or at the connect() in the ConnectThread.  This is true
with whichever order of connections are made.  For example, if I do
the following:
1. Incredible > NS
2. Incredible > N1 (1)
3. Incredible > N1 (2)
or
1. Incredible > N1 (1)
2. Incredible > N1 (2)
3. Incredible > NS
or
1. Incredible > N1 (either)
2. Incredible > NS
3. Incredible > N1 (either)
or
1. NS > Incredible
2. N1 (either) > Incredible
3. N1 (either) > Incredible

In all cases, the Incredible will Always hang on step 3, whether it's
on the connect() in the first 3 cases, or the accept() in the last
case. Debug shows that it hangs specifically on those calls (not the
RFComm socket creation calls or anything else).  Now, there are other
potential connection orders but these are the basic ones that need to
work, so I'm not worried about interleaving connects and accepts right
now.

The other interesting thing is that I instrumented an end program
method from the menu which calls cancel on all open threads.
According to the SDK, when you call close() on an open hanging socket,
it is supposed to throw an error.  Well, if the app has already hung
on either accept() or connect() in any of the scenarios above, then
the close() call hangs as well and I have to forceclose the program.

Other info:
- Using another N1 running 2.3.4, I found that I didn't have any
trouble connecting all 4 phones as long as the incredible wasn't in
the mix.
- Also, when a phone running 2.3.4 with 2 active connections tries to
connect to the incredible while the incredible has 2 other active
connections, the phone running 2.3.4 fails to connect and does not
hang, while attempting the connection in reverse has the (now)
expected hang.
- Also tried to connect 4 phones with a Samsung Infuse (2.2) and
another N1 running 2.2.  Both cases had similar hangs (cannot
exhaustively check this thanks to limited access to the devices).
- When trying to establish a 3rd connection with a device which is not
there (turned off the bluetooth on one of the N1s), the connect() call
does NOT hang.  However, if I then turn on BT on the 3rd phone and try
to reconnect, it's back to hanging at connect().  Therefore there
definitely appears to be some kind of connection management problem
when running 2.2.
- If I make 2 connections on the incredible, then close one, I can
open another.  All closing/opening works fine as long as I'm only
trying to manage 2 connections.

Anyways, as I said, if anyone can confirm that I simply cannot use my
2.2. device for testing more than 2 concurrent connections, that would
be very helpful.

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to