- Connect multiple devices to one device via Bluetooth
- 7 Answers 7
- How to Connect Multiple Bluetooth Devices
- Connect Multiple Bluetooth Devices to Smartphones and Tablets
- Tips
- Tips
- Connect Multiple Bluetooth Devices to Your Computer
- Tips
- Tips
- Types of Bluetooth Devices
- Troubleshooting
- Connecting multiple devices to bluetooth in Android
- 1 Answer 1
Connect multiple devices to one device via Bluetooth
I would like to create a game, where you must connect multiple devices (4+) to a main device (ex. a tablet) via Bluetooth. There would be two apps, a main one to which all data would be send from the phones, and to the phones. Is that even possible?
7 Answers 7
Yes, that is possible. At its lowest level Bluetooth allows you to connect up to 7 devices to one master device. I have done this and it has worked well for me, but only on other platforms (linux) where I had lots of manual control — I’ve never tried that on Android and there are some possible complications so you will need to do some testing to be certain.
One of the issues is that you need the tablet to the master and Android doesn’t give you any explicit control of this. It is likely that this won’t be a problem because * the tablet will automatically become the master when you try to connect a second device to it, or * you will be able to control the master/slave roles by how you setup your socket connection
I will caution though that most apps using Bluetooth on mobile are not attempting many simultaneous connections and Bluetooth can be a bit fragile, e.g. what if two devices already have a Bluetooth connection for some other app — how might that affect the roles?
Bluetooth 4.0 Allows you in a Bluetooth piconet one master can communicate up to 7 active slaves, there can be some other devices up to 248 devices which sleeping.
Also you can use some slaves as bridge to participate with more devices.
Yes you can do so and I have created a library for the same.
This allows you to connect up-to four devices to the main server device creating different channels for each client and running interactions on different threads.
To use this library simple add compile com.mdg.androble:library:0.1.2 in dependency section of your build.gradl e .
This is the class where the connection is established and messages are recieved. Make sure to pair the devices before you run the application. If you want to have a slave/master connection, where each slave can only send messages to the master , and the master can broadcast messages to all slaves. You should only pair the master with each slave , but you shouldn’t pair the slaves together.
package com.example.gaby.coordinatorv1; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.Set; import java.util.UUID; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothServerSocket; import android.bluetooth.BluetoothSocket; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.widget.Toast; public class Piconet < private final static String TAG = Piconet.class.getSimpleName(); // Name for the SDP record when creating server socket private static final String PICONET = "ANDROID_PICONET_BLUETOOTH"; private final BluetoothAdapter mBluetoothAdapter; // String: device address // BluetoothSocket: socket that represent a bluetooth connection private HashMapmBtSockets; // String: device address // Thread: thread for connection private HashMap mBtConnectionThreads; private ArrayList mUuidList; private ArrayList mBtDeviceAddresses; private Context context; private Handler handler = new Handler() < public void handleMessage(Message msg) < switch (msg.what) < case 1: Toast.makeText(context, msg.getData().getString("msg"), Toast.LENGTH_SHORT).show(); break; default: break; >>; >; public Piconet(Context context) < this.context = context; mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); mBtSockets = new HashMap(); mBtConnectionThreads = new HashMap(); mUuidList = new ArrayList(); mBtDeviceAddresses = new ArrayList(); // Allow up to 7 devices to connect to the server mUuidList.add(UUID.fromString("a60f35f0-b93a-11de-8a39-08002009c666")); mUuidList.add(UUID.fromString("54d1cc90-1169-11e2-892e-0800200c9a66")); mUuidList.add(UUID.fromString("6acffcb0-1169-11e2-892e-0800200c9a66")); mUuidList.add(UUID.fromString("7b977d20-1169-11e2-892e-0800200c9a66")); mUuidList.add(UUID.fromString("815473d0-1169-11e2-892e-0800200c9a66")); mUuidList.add(UUID.fromString("503c7434-bc23-11de-8a39-0800200c9a66")); mUuidList.add(UUID.fromString("503c7435-bc23-11de-8a39-0800200c9a66")); Thread connectionProvider = new Thread(new ConnectionProvider()); connectionProvider.start(); > public void startPiconet() < Log.d(TAG, " -- Looking devices -- "); // The devices must be already paired SetpairedDevices = mBluetoothAdapter .getBondedDevices(); if (pairedDevices.size() > 0) < for (BluetoothDevice device : pairedDevices) < // X , Y and Z are the Bluetooth name (ID) for each device you want to connect to if (device != null && (device.getName().equalsIgnoreCase("X") || device.getName().equalsIgnoreCase("Y") || device.getName().equalsIgnoreCase("Z") || device.getName().equalsIgnoreCase("M"))) < Log.d(TAG, " -- Device " + device.getName() + " found --"); BluetoothDevice remoteDevice = mBluetoothAdapter .getRemoteDevice(device.getAddress()); connect(remoteDevice); >> > else < Toast.makeText(context, "No paired devices", Toast.LENGTH_SHORT).show(); >> private class ConnectionProvider implements Runnable < @Override public void run() < try < for (int i=0; icatch (IOException e) < Log.e(TAG, " ** IOException when trying to close serverSocket ** "); >if (myBTsocket != null) < String address = myBTsocket.getRemoteDevice().getAddress(); mBtSockets.put(address, myBTsocket); mBtDeviceAddresses.add(address); Thread mBtConnectionThread = new Thread(new BluetoohConnection(myBTsocket)); mBtConnectionThread.start(); Log.i(TAG," ** Adding " + address + " in mBtDeviceAddresses ** "); mBtConnectionThreads.put(address, mBtConnectionThread); >else < Log.e(TAG, " ** Can't establish connection ** "); >> > catch (IOException e) < Log.e(TAG, " ** IOException in ConnectionService:ConnectionProvider ** ", e); >> > private class BluetoohConnection implements Runnable < private String address; private final InputStream mmInStream; public BluetoohConnection(BluetoothSocket btSocket) < InputStream tmpIn = null; try < tmpIn = new DataInputStream(btSocket.getInputStream()); >catch (IOException e) < Log.e(TAG, " ** IOException on create InputStream object ** ", e); >mmInStream = tmpIn; > @Override public void run() < byte[] buffer = new byte[1]; String message = ""; while (true) < try < int readByte = mmInStream.read(); if (readByte == -1) < Log.e(TAG, "Discarting message: " + message); message = ""; continue; >buffer[0] = (byte) readByte; if (readByte == 0) < // see terminateFlag on write method onReceive(message); message = ""; >else < // a message has been recieved message += new String(buffer, 0, 1); >> catch (IOException e) < Log.e(TAG, " ** disconnected ** ", e); >mBtDeviceAddresses.remove(address); mBtSockets.remove(address); mBtConnectionThreads.remove(address); > > > /** * @param receiveMessage */ private void onReceive(String receiveMessage) < if (receiveMessage != null && receiveMessage.length() >0) < Log.i(TAG, " $$$$ " + receiveMessage + " $$$$ "); Bundle bundle = new Bundle(); bundle.putString("msg", receiveMessage); Message message = new Message(); message.what = 1; message.setData(bundle); handler.sendMessage(message); >> /** * @param device * @param uuidToTry * @return */ private BluetoothSocket getConnectedSocket(BluetoothDevice device, UUID uuidToTry) < BluetoothSocket myBtSocket; try < myBtSocket = device.createRfcommSocketToServiceRecord(uuidToTry); myBtSocket.connect(); return myBtSocket; >catch (IOException e) < Log.e(TAG, "IOException in getConnectedSocket", e); >return null; > private void connect(BluetoothDevice device) < BluetoothSocket myBtSocket = null; String address = device.getAddress(); BluetoothDevice remoteDevice = mBluetoothAdapter.getRemoteDevice(address); // Try to get connection through all uuids available for (int i = 0; i < mUuidList.size() && myBtSocket == null; i++) < // Try to get the socket 2 times for each uuid of the list for (int j = 0; j < 2 && myBtSocket == null; j++) < Log.d(TAG, " ** Trying connection. " + j + " with " + device.getName() + ", uuid " + i + ". ** "); myBtSocket = getConnectedSocket(remoteDevice, mUuidList.get(i)); if (myBtSocket == null) < try < Thread.sleep(200); >catch (InterruptedException e) < Log.e(TAG, "InterruptedException in connect", e); >> > > if (myBtSocket == null) < Log.e(TAG, " ** Could not connect ** "); return; >Log.d(TAG, " ** Connection established with " + device.getName() +"! ** "); mBtSockets.put(address, myBtSocket); mBtDeviceAddresses.add(address); Thread mBluetoohConnectionThread = new Thread(new BluetoohConnection(myBtSocket)); mBluetoohConnectionThread.start(); mBtConnectionThreads.put(address, mBluetoohConnectionThread); > public void bluetoothBroadcastMessage(String message) < //send message to all except Id for (int i = 0; i < mBtDeviceAddresses.size(); i++) < sendMessage(mBtDeviceAddresses.get(i), message); >> private void sendMessage(String destination, String message) < BluetoothSocket myBsock = mBtSockets.get(destination); if (myBsock != null) < try < OutputStream outStream = myBsock.getOutputStream(); final int pieceSize = 16; for (int i = 0; i < message.length(); i += pieceSize) < byte[] send = message.substring(i, Math.min(message.length(), i + pieceSize)).getBytes(); outStream.write(send); >// we put at the end of message a character to sinalize that message // was finished byte[] terminateFlag = new byte[1]; terminateFlag[0] = 0; // ascii table value NULL (code 0) outStream.write(new byte[1]); > catch (IOException e) < Log.d(TAG, "line 278", e); >> > >
Your main activity should be as follow :
package com.example.gaby.coordinatorv1; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends Activity < private Button discoveryButton; private Button messageButton; private Piconet piconet; @Override public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); piconet = new Piconet(getApplicationContext()); messageButton = (Button) findViewById(R.id.messageButton); messageButton.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < piconet.bluetoothBroadcastMessage("Hello World---*Gaby Bou Tayeh*"); >>); discoveryButton = (Button) findViewById(R.id.discoveryButton); discoveryButton.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < piconet.startPiconet(); >>); > >
Do not forget to add the following permissions to your Manifest File :
How to Connect Multiple Bluetooth Devices
Most smartphones, tablets and computers can connect with several Bluetooth devices simultaneously. Use the Settings app on your mobile device and the Manage Bluetooth Devices screen on your Windows 8.1 computer to establish multiple Bluetooth pairing connections.
Connect Multiple Bluetooth Devices to Smartphones and Tablets
Set each device you want to pair to discoverable mode. Bluetooth devices must be discoverable before you can connect them to your smartphone or tablet. The method for making a device discoverable varies depending on the device. Some simply need to be turned on, while others have dedicated buttons that make them discoverable. Consult the device’s manual for additional information on entering the discoverable mode.
Open the Settings app on your smartphone or tablet and select Bluetooth on the main menu.
Tips
Images here are from a Samsung Galaxy S5 smartphone running the Google Android 5.0 operating system. Although these images differ somewhat from iPhones, iPads, older Android phones and Windows Phone devices, the process for connecting multiple Bluetooth devices is essentially the same.
Touch the virtual Bluetooth switch to turn Bluetooth functionality on, if it’s not already enabled. Wait a moment for the smartphone or tablet to display a list of discoverable Bluetooth devices currently within range.
Touch the name of the first device you want to connect and touch Yes, Pair or OK, depending on the device, to authorize the connection. Enter the device’s pairing code, if prompted to do so. Repeat this process for each device you want to connect to your smartphone or tablet.
Tips
Not all devices require a pairing code. If yours does and you don’t know what it is, try 0000 or 1234. These are two of the most common pairing codes for Bluetooth devices.
Connect Multiple Bluetooth Devices to Your Computer
Set each Bluetooth device to its discoverable mode. Devices must be discoverable before you can connect them to your computer. Consult each device’s manual for information on how to make it discoverable.
Go to the Start screen on your Windows 8 or 8.1 computer, press Control-C to open the Charms menu and then click the Settings icon.
Tips
If your device has a touch screen, swipe in from the bottom-right to display the Charms menu.
Choose PC Settings, click PC & Devices and then select Bluetooth to open the computer’s Bluetooth settings screen.
Click the Bluetooth switch to set it to the On position to enable Bluetooth connectivity on your computer.
Tips
Some older computers don’t have built-in Bluetooth capabilities. If your computer doesn’t, purchase a Bluetooth dongle that you attach to the USB port of the computer to add Bluetooth functionality.
Select the first device you want to connect by Bluetooth and then click its associated Pair button. Click Yes or OK to confirm the connection request and then enter the device’s pairing code, if required. Repeat this process for each Bluetooth device you want to pair with the computer.
Types of Bluetooth Devices
You don’t have to stop at connecting your phone to a nearby printer, your laptop to a keyboard or your tablet to a wireless headset. A computer, smartphone or tablet is not required for every Bluetooth connection. You can connect a Bluetooth headset to a car stereo, or a TV to a set of Bluetooth speakers. How you pair these types of devices varies. Consult the manuals for information on how to make these devices discoverable and how to pair them with other Bluetooth-capable devices.
Troubleshooting
- In order for the Bluetooth devices to work properly together, they should be within 30 feet of one another. This is the maximum range for signal transmission for many of the Bluetooth devices that connect with mobile devices and computers.
- If you experience signal dropouts or interference, evaluate the environment in which you’re using the Bluetooth devices. The quality of a Bluetooth signal is negatively affected by concrete walls, microwaves and other wireless devices such as cordless telephones.
Connecting multiple devices to bluetooth in Android
So far what I know that its possible to communicate to multiple devices from your android phone. But my case is that I want to connect two ‘similar’ devices. My understanding is that, I need to use different UUID if I need to connect 2 devices, the bluetooth chat application suggest to hardcoding the UUID. Now scenario is that, I m programing for a game, where physical gun will be connected to phone via bluetooth (to track shots etc). Ok here I can ask gun vendor to hard-code a UUID for all guns and phone can connect to 1 gun at a time.. its easy. The requirement is that, user may have more then 1 gun! Can somebody tell me how to manage this, if I m hardcoding a single UUID for all guns then I m not sure how to connect multiple guns. And if I m not hardcoding the UUID in gun chip, how I can find the UUID to connect?
1 Answer 1
A UUID is not a unique device identifier; UUIDs are unique identifiers used by the Bluetooth Service Discover Protocol to identify the protocol a Bluetooth device is using. Bluetooth.org has a list of common UUIDs.
Assuming you know or can control the UUID in the guns (it sounds like you can), then you can set up the phone as the Bluetooth server (using the same UUID that the guns use). The guns would then connect as the clients using the same UUID (I know the guns are probably not using Android, but there’s some example code there that might be helpful).
Of course, you may need to flip the client/server model around to fit your specific needs. You should be able to make as many of those server and client threads as you need (within the limits of the number of connected devices that your hardware imposes).