1

我编写了一个 android 应用程序,作为通过 XMPP 和蓝牙进行通信的网络中的中间层。出于某种原因,我发现尽管蓝牙连接和 XMPP 连接在我将它们组合在同一个应用程序中时似乎可以单独工作,但蓝牙连接似乎会中断 XMPP 连接并且应用程序失败。以前有没有人遇到过这样的问题,或者可以在我的代码中看到可能导致这种情况的问题?

注意我已经从代码中删除了我的 IP 地址。

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;

public class XMPPActivity extends Activity {
    private static final int REQUEST_ENABLE_BT = 1;
    private BluetoothAdapter mBluetoothAdapter;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //Thread th = new Thread(new XMPP());
        //th.start();
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if (!mBluetoothAdapter.isEnabled()) {
            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
        }
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        registerReceiver(mReceiver, filter);
        mBluetoothAdapter.startDiscovery();
        try {
            Thread.sleep(12000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        /*mBluetoothAdapter.cancelDiscovery();
        unregisterReceiver(mReceiver);*/
    }
    final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            // When discovery finds a device
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                // Get the BluetoothDevice object from the Intent
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                // Add the name and address to an array adapter to show in a ListView
                System.out.println(device.getName() + "\n" + device.getAddress());
                if(device.getName().contentEquals("NXT")){
                    Thread connection = new Thread(new ConnectThread(device,mBluetoothAdapter));
                    connection.start();
                }
            }
        }
    };
}

import org.jivesoftware.smack.*;
import org.jivesoftware.smack.ConnectionConfiguration.SecurityMode;
import org.jivesoftware.smack.filter.MessageTypeFilter;
import org.jivesoftware.smack.filter.PacketFilter;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Packet;
public class XMPPClient {
    private String server;
    private int port;
    private ConnectionConfiguration config;
    private XMPPConnection connection;
    private PacketListener messageListener;
    private PacketFilter messageFilter;
    public XMPPClient(String server, int port){
        this.server=server;
        this.port = port;
    }
    public void init() throws XMPPException {
        config = new ConnectionConfiguration(server,port);
        config.setSASLAuthenticationEnabled(false);
        config.setSecurityMode(SecurityMode.disabled);

        connection = new XMPPConnection(config);
        connection.connect();
        messageListener = new MyMessageListener();
        messageFilter = new MessageTypeFilter(Message.Type.chat);
        connection.addPacketListener(messageListener,messageFilter);
    }
    public void performLogin(String username, String password) throws XMPPException{
        if(connection!=null&&connection.isConnected()){
            connection.login(username, password);
        }
    }
    public void destroy(){
        if(connection!=null && connection.isConnected()){
            connection.disconnect();
        }
    }
    public void sendMessage (String message, String buddyJID) throws XMPPException{
        System.out.println(String.format("Sending message '%1$s' with name %2$s", message, buddyJID));
        Message msg = new Message(buddyJID,Message.Type.chat);
        msg.setBody(message);
        this.connection.sendPacket(msg);
    }
    public void createEntry (String user, String name) throws Exception {
        System.out.println(String.format("Creating entry for buddy '%1$s' to user %2$s", user,name));
        Roster roster = connection.getRoster();
        roster.createEntry(user, name, null);
    }
    class MyMessageListener implements PacketListener{
        public void processPacket(Packet packet) {
            if(!(packet instanceof Message))
                return;
            // Extract the useful stuff
            Message message = (Message)packet;
            String from = message.getFrom();
            String body = message.getBody();
            System.out.println(String.format("Recieved message '%1$s' from %2$s", body,from));
        }
    }
}


import org.jivesoftware.smack.XMPPException;

public class XMPP implements Runnable{

    @Override
    public void run() {
        // TODO Auto-generated method stub
        String username = "androidtestuser1";
        String password = "androidtestuser1";
        XMPPClient xmppClient = new XMPPClient("ipAddress",5222);
        try {
            xmppClient.init();
        } catch (XMPPException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            xmppClient.performLogin(username, password);
        } catch (XMPPException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            xmppClient.sendMessage("Hello mate", "testuser1@localhostname/Spark 2.6.3");
        } catch (XMPPException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        boolean isRunning = true;
        while (isRunning){
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        xmppClient.destroy();
    }

}

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.UUID;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;

public class ConnectThread extends Thread {
    private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
    private final BluetoothSocket mmSocket;
    private final BluetoothAdapter mBluetoothAdapter;

    public ConnectThread(BluetoothDevice device, BluetoothAdapter mBluetoothAdapter) {
        // Use a temporary object that is later assigned to mmSocket,
        // because mmSocket is final
        BluetoothSocket tmp = null;
        // Get a BluetoothSocket to connect with the given BluetoothDevice
        try {
            // MY_UUID is the app's UUID string, also used by the server code
            tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
        } catch (IOException e) { }
        mmSocket = tmp;
        this.mBluetoothAdapter = mBluetoothAdapter;
    }

    public void run() {
        // Cancel discovery because it will slow down the connection
        mBluetoothAdapter.cancelDiscovery();
        System.out.println("connecting");
        try {
            // Connect the device through the socket. This will block
            // until it succeeds or throws an exception
            mmSocket.connect();
        } catch (IOException connectException) {
            // Unable to connect; close the socket and get out
            try {
                mmSocket.close();
            } catch (IOException closeException) { }
            return;
        }
        System.out.println("connected");
        byte b = 1;
        try {
            writeMessage(b);
        } catch (InterruptedException e) {
            System.out.println("Send failed");
        }
        // Do work to manage the connection (in a separate thread)
        //manageConnectedSocket(mmSocket);
    }

    /** Will cancel an in-progress connection, and close the socket */
    public void cancel() {
        try {
            mmSocket.close();
        } catch (IOException e) { }
    }
    public void writeMessage(byte msg) throws InterruptedException{
        if(mmSocket!=null){
            try {

                OutputStreamWriter out=new OutputStreamWriter(mmSocket.getOutputStream());
                out.write(msg);
                out.flush();

                Thread.sleep(1000);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }else{
            //Error
        }
    }
}
4

0 回答 0