Android手机之间的蓝牙通信的代码和原理

时间:2021-01-22 18:58:24

原理类似socket通信,必须有一个作为服务端,一个作为客户端。特别注意的两端的uuid必须相同。一下就是简单蓝牙聊天代码。源码下载地址:http://download.csdn.net/detail/cao185493676/9782519

1.客户端代码

package com.example.myblooth;

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.os.Bundle;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnItemClickListener {
	private BluetoothAdapter bAtapter;
	private BluetoothDevice device;
	private List<BluetoothDevice> deviceList = new ArrayList<BluetoothDevice>();
	private List<String> nameList = new ArrayList<String>();
	private ListView mListView;
	private BluetoothSocket bs;
	private EditText mEditText;
	private StringBuilder incoming = new StringBuilder();
	private TextView tv;
	private BluetoothSocket transferSocket;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mEditText = (EditText) findViewById(R.id.et_id);
		tv = (TextView) findViewById(R.id.tv_id);
		initView();
	}

	public void click(View view) {
		if (transferSocket != null) {
			String str = mEditText.getText().toString();
			sendMessage(transferSocket, "客户端说:" + str + "\n");
		}
	}

	private void initView() {
		// TODO Auto-generated method stub
		bAtapter = BluetoothAdapter.getDefaultAdapter();
		mListView = (ListView) findViewById(R.id.list_id);
		mListView.setOnItemClickListener(this);
		startDiscovery();
		mListView.setAdapter(baseAdapter);
	}

	private void startDiscovery() {
		// TODO Auto-generated method stub
		registerReceiver(discoveryRsult, new IntentFilter(
				BluetoothDevice.ACTION_FOUND));

		deviceList.clear();
		nameList.clear();
		bAtapter.startDiscovery();

	}

	BroadcastReceiver discoveryRsult = new BroadcastReceiver() {

		@Override
		public void onReceive(Context arg0, Intent arg1) {
			// TODO Auto-generated method stub
			nameList.add(arg1.getStringExtra(BluetoothDevice.EXTRA_NAME));
			deviceList.add((BluetoothDevice) arg1
					.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE));
			Log.i("caohaidemo", "nameList:" + nameList.size());
			baseAdapter.notifyDataSetChanged();

		}
	};
	BaseAdapter baseAdapter = new BaseAdapter() {

		@Override
		public View getView(int arg0, View arg1, ViewGroup arg2) {
			arg1 = LayoutInflater.from(MainActivity.this).inflate(
					R.layout.item, arg2, false);
			TextView tv = (TextView) arg1.findViewById(R.id.item_text);
			tv.setText(nameList.get(arg0));
			return arg1;
		}

		@Override
		public long getItemId(int arg0) {
			// TODO Auto-generated method stub
			return arg0;
		}

		@Override
		public Object getItem(int arg0) {
			// TODO Auto-generated method stub
			return nameList.get(arg0);
		}

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return nameList.size();
		}
	};

	@Override
	public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
		// TODO Auto-generated method stub
		final BluetoothDevice device = deviceList.get(arg2);
		new Thread() {
			@Override
			public void run() {
				// TODO Auto-generated method stub

				connectToServerSocket(device,
						UUID.fromString("a60f35f0-b93a-11de-8a39-08002009c666"));
			}
		}.start();

	}

	

	private void connectToServerSocket(BluetoothDevice device, UUID uuid) {
		try {
			BluetoothSocket clientSocket = device
					.createRfcommSocketToServiceRecord(uuid);
			transferSocket = clientSocket;
			// Block until server connection accepted.
			clientSocket.connect();
			runOnUiThread(new Runnable() {

				@Override
				public void run() {
					// TODO Auto-generated method stub
					Toast.makeText(MainActivity.this, "连接成功", Toast.LENGTH_LONG)
							.show();
				}
			});
			// Start listening for messages.

			listenForMessages(clientSocket, incoming);

			// Add a reference to the socket used to send messages.

		} catch (IOException e) {
			Log.e("BLUETOOTH", "Blueooth client I/O Exception", e);
		}
	}

	private void sendMessage(BluetoothSocket socket, String message) {
		OutputStream outStream;
		try {
			outStream = socket.getOutputStream();

			// Add a stop character.
			byte[] byteArray = (message + " ").getBytes();
			byteArray[byteArray.length - 1] = 0;

			outStream.write(byteArray);
		} catch (IOException e) {

		}
	}

	private boolean listening = false;

	private void listenForMessages(BluetoothSocket socket,
			final StringBuilder incoming) {
		listening = true;

		int bufferSize = 1024;
		byte[] buffer = new byte[bufferSize];

		try {
			InputStream instream = socket.getInputStream();
			int bytesRead = -1;

			while (listening) {
				bytesRead = instream.read(buffer);
				if (bytesRead != -1) {
					String result = "";
					while ((bytesRead == bufferSize)
							&& (buffer[bufferSize - 1] != 0)) {
						result = result + new String(buffer, 0, bytesRead - 1);
						bytesRead = instream.read(buffer);
					}
					result = result + new String(buffer, 0, bytesRead - 1);
					incoming.append(result);
					Log.i("caohaidemo", "服务器说:" + incoming.toString());
					runOnUiThread(new Runnable() {

						@Override
						public void run() {
							// TODO Auto-generated method stub
							tv.setText(incoming.toString());
						}
					});
				}

			}
			// socket.close();
		} catch (IOException e) {

		} finally {
		}
	}
}
 
 
 
 
 
 
 
 
 
Android手机之间的蓝牙通信的代码和原理

 
 

2.服务端代码:

package com.example.mybloothserver;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;

import android.os.Bundle;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
	private EditText mEditText;
	private StringBuffer sb;
	private TextView tv;
	private StringBuilder incoming = new StringBuilder();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mEditText = (EditText) findViewById(R.id.et_id);
		sb = new StringBuffer();
		tv = (TextView) findViewById(R.id.tv_id);
		startServerSocket(BluetoothAdapter.getDefaultAdapter());
	}

	public void click(View view) {

		if (transferSocket != null) {
			String str = mEditText.getText().toString();
			sendMessage(transferSocket, "服务器说:" + str + "\n");
		}

	}

	private BluetoothSocket transferSocket;

	private UUID startServerSocket(BluetoothAdapter bluetooth) {
		UUID uuid = UUID.fromString("a60f35f0-b93a-11de-8a39-08002009c666");
		String name = "bluetoothserver";

		try {
			final BluetoothServerSocket btserver = bluetooth
					.listenUsingRfcommWithServiceRecord(name, uuid);

			Thread acceptThread = new Thread(new Runnable() {
				public void run() {
					try {
						// Block until client connection established.
						final BluetoothSocket serverSocket = btserver.accept();
						transferSocket = serverSocket;
						runOnUiThread(new Runnable() {

							@Override
							public void run() {
								// TODO Auto-generated method stub
								Toast.makeText(MainActivity.this, "连接成功",
										Toast.LENGTH_LONG).show();
							}
						});
						// Start listening for messages.

						listenForMessages(serverSocket, incoming);
						// Add a reference to the socket used to send messages.

					} catch (IOException e) {
						Log.e("BLUETOOTH", "Server connection IO Exception", e);
					}
				}
			});
			acceptThread.start();
		} catch (IOException e) {
			Log.e("BLUETOOTH", "Socket listener IO Exception", e);
		}
		return uuid;
	}

	/**
	 * Listing 16-8: Sending and receiving strings using Bluetooth Sockets
	 */
	private void sendMessage(BluetoothSocket socket, String message) {
		OutputStream outStream;
		try {
			outStream = socket.getOutputStream();

			// Add a stop character.
			byte[] byteArray = (message + " ").getBytes();
			byteArray[byteArray.length - 1] = 0;

			outStream.write(byteArray);
		} catch (IOException e) {

		}
	}

	private boolean listening = false;

	private void listenForMessages(BluetoothSocket socket,
			final StringBuilder incoming) {
		listening = true;

		int bufferSize = 1024;
		byte[] buffer = new byte[bufferSize];

		try {
			InputStream instream = socket.getInputStream();
			int bytesRead = -1;

			while (listening) {
				bytesRead = instream.read(buffer);
				if (bytesRead != -1) {
					String result = "";
					while ((bytesRead == bufferSize)
							&& (buffer[bufferSize - 1] != 0)) {
						result = result + new String(buffer, 0, bytesRead - 1);
						bytesRead = instream.read(buffer);
					}
					result = result + new String(buffer, 0, bytesRead - 1);
					incoming.append(result);
					runOnUiThread(new Runnable() {

						@Override
						public void run() {
							// TODO Auto-generated method stub
							tv.setText(incoming.toString());
						}
					});
				}
				// socket.close();
			}
			socket.close();
		} catch (IOException e) {

		} finally {
		}
	}

}