0

シンプルな Android bluetooth クライアント サーバー プログラムを作成したい

サーバーコード:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tv1=(TextView)findViewById(R.id.textView1);
    tv2=(TextView)findViewById(R.id.textView2);
    mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
    try {
        mBluetoothServerSocket=mBluetoothAdapter.listenUsingRfcommWithServiceRecord(name,uUID);
        mBluetoothAdapter.cancelDiscovery();
        mBluetoothSocket=mBluetoothServerSocket.accept();
        mInputStream=mBluetoothSocket.getInputStream();
        //if(mInputStream.available()>0){
            mBufferedReader=new BufferedReader(new InputStreamReader(mInputStream));
            data = mBufferedReader.readLine();
            tv1.setText(data);
        //} 
            if(mInputStream.available()>0){
            data=mBufferedReader.readLine();
            tv2.setText(data);
            x++;
        }

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


}

クライアントコード:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    lb=(Button)findViewById(R.id.button1);
    btAdapter = BluetoothAdapter.getDefaultAdapter();

      BluetoothDevice device = btAdapter.getRemoteDevice(addressHTC);
      try {
        btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
        btAdapter.cancelDiscovery();
        btSocket.connect();
        String message = "Hello.............. from....... Android......\n";
        outStream = btSocket.getOutputStream();
        byte[] msgBuffer = message.getBytes();
        outStream.write(msgBuffer);
      }
    catch(IOException e){
        e.printStackTrace();    
    }
      lb.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            String m1="msg 2";
            byte[] msgBuffer = m1.getBytes();
            try {
                outStream.write(msgBuffer);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    });
}

このアプリケーションは片側モードで動作し、サーバーにメッセージを送信して受信したバッファーを表示するだけですが、サーバーからクライアントにメッセージを継続的に送信する必要があります。

どうやってするの?

何か考えがあれば。共有してください。

4

2 に答える 2

0

メッセージをアクティビティに送信するリッスン用の別のスレッドが必要です。このスレッドは、メッセージを送信するスレッドにすることもできます。そうすれば、UI が動かなくなり、メッセージを継続的に受け取ることができます。そのようなスレッドの例:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.app.Activity;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.util.Log;

public class MessageManager extends Thread {

private static final String TAG = "MessageListener thread";
private BluetoothSocket btConnectedSocket;
private InputStream inStream;
private OutputStream outStream;
private Activity parent;
private boolean run = true;

public MessageManager(BluetoothSocket btConnectedSocket, Activity parent) throws IOException {
    this.btConnectedSocket = btConnectedSocket;
    this.parent = parent;
    inStream =  btConnectedSocket.getInputStream();
    outStream = btConnectedSocket.getOutputStream();        
}

/* this method will listen continuously to messages received through the BT socket until you call cancel
public void run() {
    byte[] buffer = new byte[1024];
    int bytes; 

    while (run) {
        try {
            bytes = inStream.read(buffer);
        }
        catch(IOException ex) {
            Log.e(TAG, "error while reading from bt socket");

        }
        parent.doStuffWithTheMessage(buffer); // pay attention: its in bytes. u need to convert it to a string
    }
}

/* Call this from the main activity to send data to the remote device */
public void write(byte[] bytes) throws IOException{
        outStream.write(bytes);
}

/* Call this from the main activity to shutdown the connection */
public void cancel() {
    run = false;
    try {
        btConnectedSocket.close();
    } catch (IOException e) { }

}

}

于 2013-10-13T23:57:29.363 に答える
0

これは、継続的に読むために私にとってはうまくいきます。それを試してみてください。

       try {
            BufferedReader Reader = new BufferedReader(
                    new InputStreamReader(mmSocket.getInputStream()));

            while(true)
            {                   
                String receivedMsg;
                while((receivedMsg = Reader.readLine()) != null)
                {
                     // what you do with your message 
                }

            }
        } catch (Exception ex) {
            System.out.println(ex);
        }
于 2013-10-08T11:07:06.953 に答える