android蓝牙通讯

最新成果图:从图中我们可以看出,接收到不同的AD值,波形会发生变化。现在这个AD值是通过另外一部手机发送的。


1.蓝牙先跟着http://blog.csdn.net/geekdonie/article/details/7487761#这个例子写了一下,代码看起来很多,其实不难。主要的思路就是哪一个事件发生就发出一个广播,然后在注册一个广播来接收。例子中查找蓝牙,连接蓝牙,发送,接收消息等都是按这个思路写的。

2.下面两百多行的代码实现了相同的功能。需要知道Thread,Handler,AsyncTask和蓝牙相关知识。

2.1  在发送函数有这一句byte[] byteString = (msg+" ").getBytes(); 这边多加了一个字节并将最后一个字节值赋为0,这样在接收那边通过这句 while ((bytesRead==bufferSize)&&(buffer[bufferSize-1] != 0))判断是否结束。有哪句不懂的欢迎咨询qq:1012628668

package com.h2.bluetoothtexting;

 

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.util.ArrayList;

import java.util.List;

import java.util.UUID;

 

import android.app.Activity;

import android.bluetooth.BluetoothAdapter;

import android.bluetooth.BluetoothDevice;

import android.bluetooth.BluetoothServerSocket;

import android.bluetooth.BluetoothSocket;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.os.AsyncTask;

import android.os.Bundle;

import android.os.Handler;

import android.util.Log;

import android.view.KeyEvent;

import android.view.SurfaceView;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.View.OnKeyListener;

import android.widget.AdapterView;

import android.widget.ArrayAdapter;

import android.widget.Button;

import android.widget.EditText;

import android.widget.ListView;

import android.widget.TextView;

import android.widget.AdapterView.OnItemClickListener;

 

public class BluetoothTexting extends Activity {

  

  private static int DISCOVERY_REQUEST = 1;

  

  private Handler handler = new Handler();

  private ArrayList<BluetoothDevice> foundDevices=new  ArrayList<BluetoothDevice>();

  private ArrayAdapter<BluetoothDevice> aa; 

  private ListView list;

  

  private BluetoothAdapter bluetooth;

  private BluetoothSocket socket;

  private UUID uuid = UUID.fromString("a60f35f0-b93a-11de-8a39-08002009c666");

 

  @Override

  public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main2);

    

    // Get the Bluetooth Adapter

    configureBluetooth();

 

    // Setup the ListView of discovered devices

    setupListView();    

 

    // Setup search button

    setupSearchButton();

 

    // Setup listen button

    setupListenButton();

  }

 

  private void configureBluetooth() {

    bluetooth = BluetoothAdapter.getDefaultAdapter();

  }

  

  private void setupListenButton() {

    Button listenButton = (Button)findViewById(R.id.button_listen);

    listenButton.setOnClickListener(new OnClickListener() {

      public void onClick(View view) {

        Intent disc = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);

        startActivityForResult(disc, DISCOVERY_REQUEST);     

      }

    });

  }

 

  @Override

  protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == DISCOVERY_REQUEST) {

      boolean isDiscoverable = resultCode > 0;

      if (isDiscoverable) {

        String name = "bluetoothserver";

        try {

          final BluetoothServerSocket btserver = 

            bluetooth.listenUsingRfcommWithServiceRecord(name, uuid);

 

          AsyncTask<Integer, Void, BluetoothSocket> acceptThread = 

            new AsyncTask<Integer, Void, BluetoothSocket>() {

 

            @Override

            protected BluetoothSocket doInBackground(Integer... params) {

              try {  

             //BluetoothAdapter.getDefaultAdapter().cancelDiscovery();

                socket = btserver.accept();

                return socket;

              } catch (IOException e) {

                Log.d("BLUETOOTH", e.getMessage());            

              }

              return null;

            }

 

            @Override

            protected void onPostExecute(BluetoothSocket result) {

              if (result != null)

                switchUI();

            }            

          };          

          acceptThread.execute(resultCode);

        } catch (IOException e) {

          Log.d("BLUETOOTH", e.getMessage());            

        }

      }

    }

  }

  

  private void setupListView() {

    aa = new ArrayAdapter<BluetoothDevice>(this, 

               android.R.layout.simple_list_item_1,

               foundDevices);

    list = (ListView)findViewById(R.id.list_discovered);    

    list.setAdapter(aa);

 

    list.setOnItemClickListener(new OnItemClickListener() {

      public void onItemClick(AdapterView<?> arg0, View view, 

                              int index, long arg3) {

        AsyncTask<Integer, Void, Void> connectTask = 

          new AsyncTask<Integer, Void, Void>() { 

            @Override

            protected Void doInBackground(Integer... params) {

              try {

             BluetoothAdapter.getDefaultAdapter().cancelDiscovery();

                BluetoothDevice device = foundDevices.get(params[0]);

                socket = device.createRfcommSocketToServiceRecord(uuid);

                socket.connect();              

              } catch (IOException e) {

                Log.d("BLUETOOTH_CLIENT", e.getMessage());

              }

              return null;

            }

 

            @Override

            protected void onPostExecute(Void result) {

              switchUI();

            }

          };

        connectTask.execute(index);

      }      

    });

  }

  

  private void setupSearchButton() {

 

    Button searchButton = (Button)findViewById(R.id.button_search);

    searchButton.setOnClickListener(new OnClickListener() {

      public void onClick(View view) {

     bluetooth.enable();

        registerReceiver(discoveryResult, new IntentFilter(BluetoothDevice.ACTION_FOUND));

        if (!bluetooth.isDiscovering()) {

          foundDevices.clear();

          bluetooth.startDiscovery();

        }

      }

    });

  }

  

  BroadcastReceiver discoveryResult = new BroadcastReceiver() {

    @Override

    public void onReceive(Context context, Intent intent) {

      BluetoothDevice remoteDevice;

      remoteDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

      if (bluetooth.getBondedDevices().contains(remoteDevice)) {  

        foundDevices.add(remoteDevice);

        aa.notifyDataSetChanged();

      }

    }

  };

  private void switchUI() {    

    final TextView messageText = (TextView)findViewById(R.id.text_messages);

    final EditText textEntry = (EditText)findViewById(R.id.text_message);

final SurfaceView surface=(SurfaceView)findViewById(R.id.sv_show);  

surface.setVisibility(View.VISIBLE);

    messageText.setVisibility(View.VISIBLE);

    list.setVisibility(View.GONE);

    textEntry.setEnabled(true);

Button btnSend=(Button)findViewById(R.id.btnSend);

    btnSend.setOnClickListener(new OnClickListener() {

        @Override

        public void onClick(View v) {

 

            if(textEntry.getText().length()>0) {

                 sendMessage(socket, textEntry.getText().toString());   

            }else{

                 sendMessage(socket, "Test_String");    

            }

        }

    }); 

    BluetoothSocketListener bsl = new BluetoothSocketListener(socket, handler, messageText);

    Thread messageListener = new Thread(bsl);

    messageListener.start();

  }

 

  private void sendMessage(BluetoothSocket socket, String msg) {

    OutputStream outStream;

    try {

      outStream = socket.getOutputStream();

      byte[] byteString = (msg+" ").getBytes();

      byteString[byteString.length - 1] = 0;

      outStream.write(byteString);

    } catch (IOException e) {

      Log.d("BLUETOOTH_COMMS", e.getMessage());

    }    

  }

   

  private class MessagePoster implements Runnable {

    private TextView textView;

    private String message;

    

    public MessagePoster(TextView textView, String message) {

      this.textView = textView;

      this.message = message;

    }

    

    public void run() {

      textView.setText(message);

    }     

  }

  

  private class BluetoothSocketListener implements Runnable {

    

  private BluetoothSocket socket;

  private TextView textView;

  private Handler handler;

  

  public BluetoothSocketListener(BluetoothSocket socket, 

                                 Handler handler, TextView textView) {

    this.socket = socket;

    this.textView = textView;

    this.handler = handler;

  }

  

    public void run() {

      int bufferSize = 1024;

      byte[] buffer = new byte[bufferSize];      

      try {

        InputStream instream = socket.getInputStream();

        int bytesRead = -1;

        String message = "";

        while (true) {

          message = "";

          bytesRead = instream.read(buffer);//没有读到为-1

          if (bytesRead != -1) {

            while ((bytesRead==bufferSize)&&(buffer[bufferSize-1] != 0)) {

              message = message + new String(buffer, 0, bytesRead);

              bytesRead = instream.read(buffer);

            }

            message = message + new String(buffer, 0, bytesRead - 1); 

                  

            handler.post(new MessagePoster(textView, message));              

            socket.getInputStream();

          }

        }

      } catch (IOException e) {

        Log.d("BLUETOOTH_COMMS", e.getMessage());

      } 

    }

  }

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值