搜尋

首頁  >  問答  >  主體

手机开发 - Android蓝牙模块连接后怎么接收数据?求助

package myapplication.com.myapplicationble;

import android.app.Service;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.PopupMenu;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.UUID;
public class MainActivity extends AppCompatActivity {

    private BluetoothAdapter BA;
    BluetoothServerSocket mmServerSocket;

    private static String address = "20:16:09:26:81:80"; // <==应填写蓝牙串口模块的蓝牙地址。
    private BluetoothSocket btSocket = null;
    private OutputStream outStream = null;
    public InputStream inStream = null;
    EditText editText;
    TextView textView;
    Button button, button1;
    private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();

    }
    /**
     * 连接蓝牙
     * **/
    public void connect() {
        BA = BluetoothAdapter.getDefaultAdapter();
        BluetoothDevice device = BA.getRemoteDevice(address);

//          pairedDevices = BA.getBondedDevices();
        try {
            btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
            new  ReceiveDatas(btSocket).start();
        } catch (IOException e) {
        }
        BA.cancelDiscovery();
        try {
            btSocket.connect();
            String s="sm\n";
            outStream = btSocket.getOutputStream();
            outStream.write(s.getBytes());
            //outStream.write(0x41);
            inStream = btSocket.getInputStream();
            Jieshou();
          //  System.out.println("**" + inStream.toString());
          //  System.out.println("**" + inStream.read());
           //  int x = inStream.read();
            //outStream.write(x+1);
           // System.out.println("****--"+x);



        } catch (IOException e) {
        }
        try {
          //  btSocket.close();
        } catch (Exception e2) {

            // Log .e(TAG,"ON RESUME: Unable to close socket during connection failure", e2);
        }
    }

    public void initView() {


        editText = (EditText) findViewById(R.id.edit);
        textView = (TextView) findViewById(R.id.textView);
        button = (Button) findViewById(R.id.button);
        button1 = (Button) findViewById(R.id.button1);
        BA = BluetoothAdapter.getDefaultAdapter();
       /**
        * 连接蓝牙
        * */
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                System.out.println("***11");
                as();
            }
        });
        /**
         * 发送信息 可以发送了
         * **/
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String s = editText.getText().toString().trim();
                try {
                    outStream = btSocket.getOutputStream();
                    inStream=btSocket.getInputStream();
                    outStream.write(s.getBytes());


                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });


    }



/**
 *
 *   连接蓝牙
 * **/
    public void as() {
        new AsyncTask() {

            @Override
            protected String doInBackground(Object[] params) {

                connect();
                return null;
            }

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
            }

            @Override
            protected void onPostExecute(Object o) {
                super.onPostExecute(o);
                Toast.makeText(getApplicationContext(), "2", Toast.LENGTH_SHORT).show();
            }
        }.execute();
    }
/**
     * 
     * */
    public  void Jieshou() {

        new Thread(new Runnable() {
            @Override
            public void run() {
                while(true){


                    ByteArrayOutputStream  byteArrayOutputStream=null;
                    byteArrayOutputStream = new ByteArrayOutputStream();
                    try {
                        inStream=btSocket.getInputStream();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    byte[] buffer = new byte[1024];// 缓冲数据流
                    int temp = 0;
                    //   while( (temp = inStream.read(buffer)) != -1) {
                    //  os.write(buffer, 0, temp);
                    byteArrayOutputStream.write(buffer, 0, temp);
                    //   }
                    System.out.println("*shuju*"+byteArrayOutputStream.toByteArray().toString());
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

            }
        }).start();
    }

  
}

已经可以发送信息到蓝牙了,可是怎么接收数据啊?求助

PHPzPHPz2773 天前663

全部回覆(2)我來回復

  • 大家讲道理

    大家讲道理2017-04-17 17:59:02

    自己找了一個接受資料的線程…

    private class ConnectedThread extends Thread {
           private final BluetoothSocket socket;
           private final InputStream inputStream;
           private final OutputStream outputStream;
           public ConnectedThread(BluetoothSocket socket) {
               this.socket = socket;
               InputStream input = null;
               OutputStream output = null;
               try {
                   input = socket.getInputStream();
                   output = socket.getOutputStream();
               } catch (IOException e) {
                   e.printStackTrace();
               }
               this.inputStream = input;
               this.outputStream = output;
           }
           public void run() {
               byte[] buff = new byte[1024];
               int bytes;
               while (true) {
                   try {
                       bytes = inputStream.read(buff);
                       String str = new String(buff, "ISO-8859-1");
                       str = str.substring(0, bytes);
                       Log.e("recv", str);
    
                       Message message=handler.obtainMessage();
                       message.obj=str;
                       handler.sendMessage(message);
                   } catch (IOException e) {
                       e.printStackTrace();
                       break;
                   }
               }
           }
           public void write(byte[] bytes) {
               try {
                   outputStream.write(bytes);
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
           public void cancel() {
               try {
                   socket.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
       }

    回覆
    0
  • PHPz

    PHPz2017-04-17 17:59:02

    感覺你的寫法有點奇怪…

    mBluetoothGattCallback 是 BluetoothGattCallback的實現,用於回調連接狀態和傳輸數據,具體你可以百度一下或看官方文檔

    回覆
    0
  • 取消回覆