3 Stimmen

Wie verbinde ich mich mit Android und sende eine Nachricht an mehrere Geräte über Blue Tooth?

Ich möchte eine Anwendung für das Senden einer Nachricht an mehrere Geräte über Blue Tooth entwickeln. Ich weiß, dass Blue Tooth eine Punkt-zu-Punkt-Kommunikation ist, obwohl ich gerne eine Verbindung herstellen und eine Nachricht in folgenden Schritten senden würde:

1. die Liste der gekoppelten Geräte abrufen

2. wählen Sie ein Gerät aus der gekoppelten Liste aus

3. mit dem gekoppelten Gerät verbinden, eine Nachricht an das ausgewählte gekoppelte Gerät senden

4. trennen Sie die Verbindung zum Gerät

5. eine Verbindung zu einem anderen Gerät herstellen und so weiter (eins nach dem anderen).

Ich erhalte eine Liste mit den Adressen gekoppelter Geräte wie folgt:

       mBtAdapter = BluetoothAdapter.getDefaultAdapter();

      Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();

    if (pairedDevices.size() > 0) {
     for (BluetoothDevice device : pairedDevices) {

        pairedList.add(device.getAddress());

        }

     Log.v("11111111", "11111111111"+dev);
    }

Ich versuche, eine Verbindung zu ihnen herzustellen und eine Nachricht zu senden, wenn der Benutzer auf eine Schaltfläche wie folgt klickt:

      ((Button)findViewById(R.id.button1)).setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {

        String message = "Haiii";

        for(int i=0;i<dev.size();i++){
            Log.v("device", "111111  :  "+pairedList.get(i));
        mbService.connect(mBtAdapter.getRemoteDevice(pairedList.get(i)));

                    mbService.write(message.getBytes());

                    mbService.stop();
        }

    }
}); 

Aus dem obigen Code erhalte ich Verbindung, wenn Schleife pairedList.get(0).But die Nachricht ist nicht an ein anderes device.In einem anderen Gerät api Beispielanwendung installiert hat.

Wenn ich pairedList.get(i) verwende, wird keine Verbindung zu irgendeinem Gerät hergestellt, auch nicht zu einem einzelnen Gerät.

Bitte helfen Sie mir.

2voto

user387184 Punkte 10880

Versuchen Sie, für jede Verbindung einen eigenen Thread zu erstellen - ich hatte ein ähnliches Problem, und das Erstellen eines neuen Threads für jede Verbindung hat es gut gelöst. Übrigens erstelle ich sogar einen neuen Thread, um die Verbindung herzustellen - damit der Verbindungsaufbau die Benutzeroberfläche nicht blockiert. Das habe ich aus dem BT-Beispielcode...

um einen neuen Thread zu erstellen, um eine Verbindung herzustellen:

    mConnectBluetoothThread = new ConnectBluetoothThread(device);
    mConnectBluetoothThread.start();

wobei ConnectBluetoothThread wie folgt definiert ist:

public ConnectBluetoothThread(BluetoothDevice device) {
        if (DEBUG)
        Log.i(this.getClass().getSimpleName(),
            this.getClass().getName()
                + " ->"
                + Thread.currentThread().getStackTrace()[2]
                    .getMethodName());

        mmDevice = device;
        BluetoothSocket tmp = null;

        // Get a BluetoothSocket for a connection with the
        // given BluetoothDevice
        try {
        tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
        } catch (IOException e) {
        Log.e(this.getClass().getSimpleName(), "create() failed", e);
        }
        mmSocket = tmp;
    }

    public void run() {
        if (DEBUG)
        Log.i(this.getClass().getSimpleName(),
            this.getClass().getName()
                + " ->"
                + Thread.currentThread().getStackTrace()[2]
                    .getMethodName());
        // TODO
        setName("ConnectThread");

        // Always cancel discovery because it will slow down a connection
        mBluetoothAdapter.cancelDiscovery();

        // Make a connection to the BluetoothSocket
        try {
        // This is a blocking call and will only return on a
        // successful connection or an exception
        mmSocket.connect();
        } catch (IOException e) {

        connectionFailed();

        // Close the socket
        try {
            mmSocket.close();
        } catch (IOException e2) {
            Log.e(this.getClass().getSimpleName(),
                "unable to close() socket during connection failure",
                e2);
        }

        return;
        }

        // Reset the ConnectThread because we're done
        synchronized (InterBT.this) {
        mConnectBluetoothThread = null;
        }

        // Start the connected thread
        connected(mmSocket, mmDevice);
    }

    public void cancel() {
        try {
        mmSocket.close();
        } catch (IOException e) {
        Log.e(this.getClass().getSimpleName(),
            "close() of connect socket failed", e);
        }
    }
    }

    public synchronized void connected(BluetoothSocket socket,
        BluetoothDevice device) {
    if (DEBUG)
        Log.d(this.getClass().getSimpleName(), "connected");

    // Cancel the thread that completed the connection
    if (mConnectBluetoothThread != null) {
        mConnectBluetoothThread.cancel();
        mConnectBluetoothThread = null;
    }

    // Cancel any thread currently running a connection
    if (mConnectedBluetoothThread != null) {
        mConnectedBluetoothThread.cancel();
        mConnectedBluetoothThread = null;
    }

    // Cancel the accept thread because we only want to connect to one
    // device
    // if (mAcceptThread != null) {mAcceptThread.cancel(); mAcceptThread =
    // null;}

    // Start the thread to manage the connection and perform transmissions
    mConnectedBluetoothThread = new ConnectionThreadBT(socket);
    mConnectedBluetoothThread.start();

    setState(STATE_CONNECTED);

    }

und erstellen Sie außerdem eine neue Klasse ConnectionThreadBT der die Verbindung zum Lesen und Schreiben herstellt:

public class ConnectionThreadBT extends ConnectionThreadBase {
    private static final boolean DEBUG = true;

    private final BluetoothSocket mmSocket;
    private final InputStream mmInStream;
    private final OutputStream mmOutStream;
    byte[] responseBuffer = new byte[4096 * 4]; 
    int responseBufferLen = 0;

    public ConnectionThreadBT(BluetoothSocket socket) {
    if (DEBUG)
        Log.i(this.getClass().getSimpleName(),
            this.getClass().getName()
                + " ->"
                + Thread.currentThread().getStackTrace()[2]
                    .getMethodName());

    mmSocket = socket;
    InputStream tmpIn = null;
    OutputStream tmpOut = null;

    // Get the BluetoothSocket input and output streams
    try {
        tmpIn = socket.getInputStream();
        tmpOut = socket.getOutputStream();
    } catch (IOException e) {
        Log.e(this.getClass().getSimpleName(), "temp sockets not created",
            e);
    }

    mmInStream = tmpIn;
    mmOutStream = tmpOut;
   }

    public void run() {
    if (DEBUG)
        Log.i(this.getClass().getSimpleName(),
            this.getClass().getName()
                + " ->"
                + Thread.currentThread().getStackTrace()[2]
                    .getMethodName());
    //we have successfully connected to BT

    //now inform UI 

    Home_Screen.sendMessageToHomeScreen(
        Home_Screen.MESSAGE_INTERBT_CONNECTION_TESTED,
        Home_Screen.CONNECTION_SUCCESS, true);
  }

und dann zum Schreiben einfach diese Methode aufrufen, die auch in ConnectionThreadBT definiert ist

public void sendMsg(MyBuffer buffer){
        try {
        mmOutStream.write(buffer);
        mmOutStream.flush();
        successfullyWritten = true;
        } catch (IOException e) {
        Log.e(this.getClass().getSimpleName(),
            "Exception during write", e);
        successfullyWritten = false;
        }

zu lesen, tun Sie entweder dasselbe oder starten Sie eine Überwachungsschleife in der Run-Methode, die so lange liest, wie der connectedThread aktiv ist, und melden Sie alle gelesenen Informationen über einen Handler zurück, ähnlich wie bei der Aktualisierung des UI-Bildschirms

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X