【问题标题】:Problems with Bluetooth Android Application. Beginner蓝牙 Android 应用程序的问题。初学者
【发布时间】:2012-04-02 20:39:35
【问题描述】:

大家好,这是我在这里的第一个问题。 很抱歉,如果我犯了任何错误。(我无法从代码块中的蓝牙类中获取代码。如何在不花费 20 分钟复制粘贴的情况下解决此问题?)

我遇到的问题可能是 Android 应用程序。

这是我学校的一个项目。我两个月前才开始学习android。

我已经创建了自己的类,它有点像蓝牙的外壳。 (基本上我在学习蓝牙的工作原理)。

我有 1 个用于测试的 Activity,1 个名为 bluetooh 的类(我的 shell)。 以下是 3 个线程,来自 android 开发人员的示例。 android bluetooth basics

我们有一个 Acceptedthread 作为服务器。 可以与 AcceptedThread 建立连接的 ConnectThread。 如果他们连接,他们会得到一个蓝牙套接字。 使用此蓝牙套接字,两个设备都使用此套接字启动 Connectedthread。 关闭 Accapthread 和 ConnectThread。

我遇到了一些问题。

  1. 我可以建立连接并发送测试消息。但是从 1 个设备我只能发送 3 个,然后它就会出错。另一台设备可以接受任意数量的消息(有效)。

2.如果我从设备 a 向 b / 发送消息,然后从 b 向 a / 发送 1,它通常仅在某些时候不起作用。在它出错并退出应用程序之前。

3.欢迎所有关于我如何能做得更好的建议。如果我做了一些非常愚蠢的事情,请不要退缩称我为白痴。我对这种编程很陌生。

下面是代码。

接受线程:

public class AcceptThread extends Thread {
private final BluetoothServerSocket mmServerSocket;
private static final UUID MY_UUID = UUID.fromString("fa87c0d0-afac-11de-8a39-0800200c9a66");
private Handler mHandler;
private Bleutooth BT;
public AcceptThread(BluetoothAdapter Adapter,Handler handler,Bleutooth bt) {
    // Use a temporary object that is later assigned to mmServerSocket,
    // because mmServerSocket is final
    mHandler = handler;
    BT = bt;
    BluetoothServerSocket tmp = null;
    try {
        // MY_UUID is the app's UUID string, also used by the client code
        tmp = Adapter.listenUsingRfcommWithServiceRecord("menno/ruben/app",MY_UUID);

    } catch (IOException e) { }
    mmServerSocket = tmp;
}

public void run() {
    Log.d("AcceptThreadlog","Accepthread Run Gestart");
    BluetoothSocket socket = null;
    // Keep listening until exception occurs or a socket is returned
    while (true) {
        try {
            socket = mmServerSocket.accept();
        } catch (IOException e) {
            break;
        }
        // If a connection was accepted
        if (socket != null) {
            Log.d("AcceptThreadlog","ConnectedThread Gestart");
            ConnectedThread mConnectedThread = new ConnectedThread(socket,mHandler);
            mConnectedThread.start();
            BT.HoldConnectThread(mConnectedThread);
            try {
                mmServerSocket.close();
            } catch (IOException e) {

                Log.d("AcceptThreadlog","ServerSocket close throwed IOexception");
            }
            break;
        }
    }
}

/** Will cancel the listening socket, and cause the thread to finish */
public void cancel() {
    try {
        mmServerSocket.close();
    } catch (IOException e) { }
}

连接线程:

public class ConnectThread extends Thread {
private final BluetoothSocket mmSocket;
private final BluetoothDevice mmDevice;
BluetoothAdapter adapter;
private Handler mHandler;
private Bleutooth BT;
private static final UUID MY_UUID = UUID.fromString("fa87c0d0-afac-11de-8a39-0800200c9a66");
public ConnectThread(BluetoothDevice device,BluetoothAdapter adapter,Handler handler,Bleutooth bt) {
    // Use a temporary object that is later assigned to mmSocket,
    // because mmSocket is final
    BT = bt;
    mHandler = handler;
    BluetoothSocket tmp = null;
    mmDevice = device;  
    // 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;
}

public void run() {
     Log.d("ConnectThread","Run gestart");
    // Cancel discovery because it will slow down the connection.
    if (adapter != null) { adapter.cancelDiscovery();};

    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) { Log.d("ConnectThread","IOexception opgetreden socket.close"); }

    }

    // Do work to manage the connection (in a separate thread)
    Log.d("ConnectThread","ConnectedThread Gestart");
    ConnectedThread mConnectedThread = new ConnectedThread(mmSocket,mHandler);
    mConnectedThread.start();
    BT.HoldConnectThread(mConnectedThread);
}

/** Will cancel an in-progress connection, and close the socket */
public void cancel() {
    try {
        mmSocket.close();
    } catch (IOException e) { }
}

连接线程:

public class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
private Handler mHandler;
public ConnectedThread(BluetoothSocket socket,Handler handler)
{
    mHandler = handler;
    mmSocket = socket;
    InputStream tmpIn = null;
    OutputStream tmpOut = null;
    // Get the input and output streams, using temp objects because
    // member streams are final
    try {
        tmpIn = socket.getInputStream();
        tmpOut = socket.getOutputStream();
    } catch (IOException e) { }

    mmInStream = tmpIn;
    mmOutStream = tmpOut;
}

public void run() {
    byte[] buffer = new byte[1024];  // buffer store for the stream
    int bytes; // bytes returned from read()
    Message message = Message.obtain(mHandler);
    // Keep listening to the InputStream until an exception occurs
    // Bevestiging verbinding
    Log.d("ConnectedThread","YES !!!!!!!!!");
     message.what = 1;
     message.arg1 = 1;
     mHandler.sendMessage(message);
    while (true) {
        try {

            // Read from the InputStream
            bytes = mmInStream.read(buffer);
            message.what = 1;
            message.arg1 = 2;
            String Test = new String(buffer);
            Bundle bundle = new Bundle();
            bundle.putString("test",Test);
            message.setData(bundle);
            mHandler.sendMessage(message);

        } catch (IOException e) {
            break;
        }
    }
}
   public void write(byte[] bytes) {
    try {
        mmOutStream.write(bytes);
    } catch (IOException e) { }
}

public void cancel() {
    try {
        mmSocket.close();
    } catch (IOException e) { }
}

测试活动:

public class BleutoothProftaakActivity extends Activity {
/** Called when the activity is first created. */
  private Bleutooth BT;
  private Handler mHandler;
  ConnectedThread Connection = null;
@Override

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    mHandler = new Handler() {
        @Override
synchronized public void handleMessage(Message msg) 
        {
            if (msg.arg1 == 1 && msg.what == 1)
            {
            Toast T =   Toast.makeText(getBaseContext(),"Verbinding gemaakt",10000);
            T.show();
            return;
            }
            if (msg.arg1 == 2 && msg.what == 1)
            {
            Bundle b = msg.getData();
            String message = b.getString("test");
            Toast T =   Toast.makeText(getBaseContext(),message,10000);
            T.show();
            return;
            }
        }


};

    BT = new Bleutooth(this);
    Button button = (Button) findViewById(R.id.button1);
    button.setOnClickListener(new OnClickListener(){
        public void onClick(View v){            
            Toast T =   Toast.makeText(getBaseContext(),BT.CheckBleutoothStatus(),10000);
            T.show(); 
        }
    });
    Button button2 = (Button) findViewById(R.id.button2);
    button2.setOnClickListener(new OnClickListener(){
        public void onClick(View v){            
            BT.TurnBleutoothOn();
        }
    });
    Button button3 = (Button) findViewById(R.id.button3);
    button3.setOnClickListener(new OnClickListener(){
        public void onClick(View v)
        {           
         BT.DiscoverDevices();
        } });
    Button button9 = (Button) findViewById(R.id.button9);
    button9.setOnClickListener(new OnClickListener(){
        public void onClick(View v){
        ArrayList<String> devicesfound = BT.GetFoundDevices();
        if (devicesfound.isEmpty())
        {
            Toast T =   Toast.makeText(getBaseContext(),"Geen Devices Gevonden",10000);
            T.show();
        }
        else
        {
            for (int i = 0 ;i<devicesfound.size();i++)
            {
                Toast T =   Toast.makeText(getBaseContext(),devicesfound.get(i),10000);
                T.show(); 
            }
        }
        }
    });
    Button button5 = (Button) findViewById(R.id.button5);
    button5.setOnClickListener(new OnClickListener(){
        public void onClick(View v){            
            ArrayList<String> devicesfound = BT.ReturnBondedDevices();
            if (devicesfound.isEmpty())
            {
                Toast T =   Toast.makeText(getBaseContext(),"Er zijn geen bonded devices",10000);
                T.show();
            }
            else
            {
                for (int i = 0 ;i<devicesfound.size();i++)
                {
                    Toast T =   Toast.makeText(getBaseContext(),devicesfound.get(i),10000);
                    T.show(); 
                }
            }
        }
    });
    Button button6 = (Button) findViewById(R.id.button6);
    button6.setOnClickListener(new OnClickListener(){
        public void onClick(View v){
            BT.SetDiscoverable();
        } 
    });
    Button button7 = (Button) findViewById(R.id.button7);
    button7.setOnClickListener(new OnClickListener(){
        public void onClick(View v){
            BT.StartServerSideConnection(mHandler);
        } 
    });
    Button button8 = (Button) findViewById(R.id.button8);
    button8.setOnClickListener(new OnClickListener(){
        public void onClick(View v){
            BluetoothAdapter adapter = BT.GetAdapter();
            ArrayList<String>devices = BT.ReturnBondedDevices();
            BluetoothDevice adress = adapter.getRemoteDevice(devices.get(0));
            BT.StartClientSideConnection(adress,mHandler);
        } 
    });
    Button button4 = (Button) findViewById(R.id.button4);
    button4.setOnClickListener(new OnClickListener(){
        public void onClick(View v){
            Connection = BT.ReturnConnectedThread();
            if (Connection == null)
            {
                Toast T =   Toast.makeText(getBaseContext(),"Er is geen verbinding",10000);
                T.show();
            }
            else
            {
                String Test = "TESTESTTEST JIppie!!!!!";
                byte[] bytearray = Test.getBytes();
                Connection.write(bytearray);
            }
        } 
    });

}
@Override
protected void onDestroy() {
    super.onDestroy();
    BT.CleanUp();
}

我的蓝牙课程:

 public class Bleutooth 
 {

 BluetoothAdapter adapter;
 Activity main;
 BroadcastReceiver receiver;
 ArrayList<String> founddevices;
 boolean receiverRegistered;
 AcceptThread mAcceptThread= null;
 ConnectThread mConnectThread = null;
 ConnectedThread mConnectedThread = null;


 public Bleutooth(Activity Main)
 {  
adapter = BluetoothAdapter.getDefaultAdapter();
main = Main;
receiverRegistered = false;
founddevices = new ArrayList<String>();

 }
 public BluetoothAdapter GetAdapter(){
return adapter;
 }
 public void StartServerSideConnection(Handler handler){   
// Cancel any thread attempting to make a connection
 if (mConnectThread != null) {mConnectThread.cancel(); mConnectThread = null;}

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

 // Start the thread to listen on a BluetoothServerSocket
 if (mAcceptThread == null) {
    mAcceptThread = new AcceptThread(adapter,handler,this);
    mAcceptThread.start();
 }

 }
 public void StartClientSideConnection(BluetoothDevice device,Handler handler){
//Cancel any thread attempting to make a connection
 if (mConnectThread != null) {mConnectThread.cancel(); mConnectThread = null;}

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

 // Start the thread to listen on a BluetoothServerSocket
 if (mConnectThread == null) {
    mConnectThread = new ConnectThread(device,adapter,handler,this);
    mConnectThread.start();
 }

 }
 public void SetDiscoverable(){
 Intent discoverableIntent = 
 new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
 main.startActivity(discoverableIntent);
 }
 public String CheckBleutoothStatus(){
String returnString;
if (adapter == null)
 {
 returnString = "Geen bleutooth ondersteund";
 }
 else if(adapter.isEnabled())
 {
     returnString = "Bleutooth staat aan";
 }
 else
 {
     returnString = "Bleutooth staat uit";
 }  
return returnString;
 }
 public void TurnBleutoothOn(){
int REQUEST_ENABLE_BT = 1;
if (!adapter.isEnabled()) 
{
    Intent enableBtIntent = new Intent(adapter.ACTION_REQUEST_ENABLE);
    main.startActivityForResult(enableBtIntent,REQUEST_ENABLE_BT);      
}
 }

 public ArrayList<String> ReturnBondedDevices() {
ArrayList<String> BondedDevices = new ArrayList<String>();
Set<BluetoothDevice> pairedDevices = adapter.getBondedDevices();
// If there are paired devices
if (pairedDevices.size() > 0) {
    // Loop through paired devices
    for (BluetoothDevice device : pairedDevices) {
        // Add the name and address to an array adapter to show in a ListView
        BondedDevices.add(device.getAddress());         
    }

}
return BondedDevices;
 }
 public void DiscoverDevices(){
adapter.startDiscovery();   
// Create a BroadcastReceiver for ACTION_FOUND
    receiver = new BroadcastReceiver() 
    {
    public void onReceive(Context context, Intent intent) 
    {           
        String action = intent.getAction();
        // When discovery finds a device
        if (BluetoothDevice.ACTION_FOUND.equals(action))
        {
 BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

founddevices.add(device.getName() + "\n" + device.getAddress());
Toast T = Toast.makeText(main.getBaseContext(),"BleutoothDevice Gevonden",10000);
            T.show();
        }
    }
};
// Register the BroadcastReceiver
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
main.registerReceiver(receiver, filter); 
receiverRegistered = true;
 }
 public ArrayList<String> GetFoundDevices(){    
return founddevices;    
 } 
 public void CleanUp(){   System.gc();
if (receiverRegistered)
{
    main.unregisterReceiver(receiver);
}
if (mConnectedThread != null)
{
mConnectedThread.cancel();
}
adapter.cancelDiscovery();
System.gc();
}
public void HoldConnectThread(ConnectedThread mConnectedThread){
this.mConnectedThread = mConnectedThread;
}
public ConnectedThread ReturnConnectedThread(){
if (this.mConnectedThread != null)
{
    return mConnectedThread;
}
else {return null;}
}

【问题讨论】:

    标签: android sockets bluetooth


    【解决方案1】:

    我已经找到答案了。

    我一遍又一遍地使用相同的消息。而messageque不喜欢那样。

    通过每次创建新消息来解决问题现在就像一个魅力一样。

    感觉自己像个白痴……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多