package com.taobao365dz.bluetoothtest;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Vibrator;
import android.app.Activity;
import android.app.Service;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
/*
* 蓝牙接收线程类
*
* */
class bluetoothMsgThread extends Thread {
private DataInputStream mmInStream; //in数据流
private Handler msgHandler; //Handler
public bluetoothMsgThread(DataInputStream mmInStream,Handler msgHandler) { //构造函数,获得mmInStream和msgHandler对象
this.mmInStream = mmInStream;
this.msgHandler = msgHandler;
}
public void run() {
byte[] InBuffer = new byte[64]; //创建 缓冲区
while (!Thread.interrupted()) {
try {
mmInStream.readFully(InBuffer, 0, 8); //读取蓝牙数据流
Message msg = new Message(); //定义一个消息,并填充数据
msg.what = 0x1234;
msg.obj = InBuffer;
msgHandler.sendMessage(msg); //通过handler发送消息
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
public class MainActivity extends Activity {
BluetoothAdapter mBluetoothAdapter; //蓝牙适配器
BluetoothDevice device; //蓝牙设备
BluetoothSocket clientSocket; //socket 通讯用
BluetoothServerSocket btserver; //未用上
String address; //蓝牙设备地址
OutputStream mmOutStream; //out数据流
DataInputStream mmInStream; //in数据流
bluetoothMsgThread blue_tooth_msg_thread;
UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); //蓝牙连接用 UUID 标识
Vibrator vib; //手机系统震动 对象
/*
* 显示从蓝牙设备接收到的数据
* */
public void show_result(byte[] buffer,int count)
{
StringBuffer msg = new StringBuffer(); //创建缓冲区
TextView tvInfo = (TextView)findViewById(R.id.textViewReceiveInfo); //创建 文本显示对象
tvInfo.setText(""); //清空对象内容
for (int i = 0; i < count; i++) //循环 加入 数据,16进制 格式
msg.append(String.format("0x%x ", buffer[i]));
tvInfo.setText(msg); //显示到界面上
}
/*
* 设置按钮的状态,根据入参设置一批 按钮的状态
*
* */
public void set_btn_status(boolean status)
{
Button ledonBtn = (Button)findViewById(R.id.ledonBtn);
ledonBtn.setEnabled(status);
Button ledoffBtn = (Button)findViewById(R.id.ledoffBtn);
ledoffBtn.setEnabled(status);
Button jdqonBtn = (Button)findViewById(R.id.jdqonBtn);
jdqonBtn.setEnabled(status);
Button jdqoffBtn = (Button)findViewById(R.id.jdqoffBtn);
jdqoffBtn.setEnabled(status);
}
protected void onDestroy() {
super.onDestroy();
try {
if (mmOutStream != null)
mmOutStream.close(); //关闭 out 数据流
if (mmInStream != null)
mmInStream.close(); //关闭 in 数据流
if (clientSocket != null)
clientSocket.close(); //关闭socket
blue_tooth_msg_thread.interrupt();
Toast.makeText(getApplicationContext(), "蓝牙测试应用程序退出", Toast.LENGTH_LONG).show(); //提示信息
}catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
set_btn_status(false); //蓝呀设备未连接,设置 屏幕 一些 按钮 不能操作
vib = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE); //获取手机震动对象
Button searchDeviceBtn = (Button)findViewById(R.id.searchDeviceBtn); //创建 搜索按键对象 并 监听 click事件
searchDeviceBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); //获取 蓝牙 适配器
if (mBluetoothAdapter == null) { //手机无蓝牙功能,提示并退出
Toast.makeText(getApplicationContext(), "bluetooth is no available",Toast.LENGTH_LONG).show();
finish();
return;
}
mBluetoothAdapter.enable(); //打开手机 蓝牙 功能
if (!mBluetoothAdapter.isEnabled()) { //手机未打开蓝牙功能,提示并退出
Toast.makeText(getApplicationContext(), "bluetooth function is no available",Toast.LENGTH_LONG).show();
finish();
return;
}
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); //获取 已经配对的蓝牙设备列表
if (pairedDevices.size() < 1) { //无配对蓝牙设备,则退出
Toast.makeText(getApplicationContext(), "没有找到已经配对的蓝牙设备,请配对后再操作",Toast.LENGTH_LONG).show();
finish();
return;
}
Spinner spinner = (Spinner)findViewById(R.id.spinner1); //获取 下拉框控件 对象
List<String>list = new ArrayList<String>(); //创建列表,用于保存蓝牙设备地址
for (BluetoothDevice device:pairedDevices) {
//myArrayAdapter.add(device.getName() + " " + device.getAddress());
//list.add(device.getName() + " " + device.getAddress());
list.add(device.getAddress()); //将蓝牙地址进入到列表
}
//创建数组适配器
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(),android.R.layout.simple_spinner_item,list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); //设置 下来显示方式
spinner.setAdapter(adapter); //将适配器中数据给下拉框对象
Button connectBtn = (Button)findViewById(R.id.connectBtn); //创建 连接按钮对象
connectBtn.setEnabled(true); //允许连接对象按钮操作
}
}
);
Button connectBtn = (Button)findViewById(R.id.connectBtn); //创建 连接按钮 对象,设置监听器
connectBtn.setEnabled(false); //不允许 连接对象 按钮操作
connectBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
Spinner spinner = (Spinner)findViewById(R.id.spinner1); //获取 下拉框对象
address = spinner.getSelectedItem().toString(); //从下拉框中选择项目,并获得它的地址
try {
device = mBluetoothAdapter.getRemoteDevice(address); //根据蓝牙设备的地址 连接 单片机蓝牙 设备
clientSocket = device.createRfcommSocketToServiceRecord(uuid); //根据uuid创建 socket
clientSocket.connect(); //手机socket连接远端蓝牙设备
mmOutStream = clientSocket.getOutputStream(); //从socket获得 数据流对象,实现读写操作
mmInStream = new DataInputStream(new BufferedInputStream(clientSocket.getInputStream()));
Toast.makeText(getApplicationContext(), "蓝牙设备连接成功,可以操作了", Toast.LENGTH_SHORT).show();
vib.vibrate(100); //手机震动,时长100毫秒
set_btn_status(true); //允许 按钮操作 (开LED灯等按钮)
//定义 多线程对象,并执行线程,用于接收蓝牙数据
blue_tooth_msg_thread = new bluetoothMsgThread(mmInStream,bluetoothMessageHandle);
blue_tooth_msg_thread.start();
}catch (Exception e) {
set_btn_status(false); //不允许 按钮操作 (开LED灯等按钮)
Toast.makeText(getApplicationContext(), "蓝牙设备连接失败!", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
});
Button ledonBtn = (Button)findViewById(R.id.ledonBtn); //创建 开led灯按钮 对象,设置监听器
ledonBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
byte[] InBuffer = new byte[64]; //输入缓存
byte buffer[] = "a".getBytes(); //创建字符数组 a,只有一个字符,当然也可以自己定义协议
try {
mmOutStream.write(buffer); //数据流发送数组,发送给单片机蓝牙设备
//mmInStream.readFully(InBuffer, 0, 8); //读取 外部蓝牙设备发送回来的数据
//show_result(InBuffer,8); //显示到界面上
vib.vibrate(100); //手机震动,时长100毫秒
}catch (Exception e) {
e.printStackTrace();
}
}
});
Button ledoffBtn = (Button)findViewById(R.id.ledoffBtn); //创建 关led灯按钮 对象,设置监听器
ledoffBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
byte[] InBuffer = new byte[64]; //输入缓存
byte buffer[] = "b".getBytes(); //创建字符数组 b,只有一个字符,当然也可以自己定义协议
try {
mmOutStream.write(buffer); //数据流发送数组,发送给单片机蓝牙设备
//mmInStream.readFully(InBuffer, 0, 8); //读取 外部蓝牙设备发送回来的数据
//show_result(InBuffer,8); //显示到界面上
vib.vibrate(100); //手机震动,时长100毫秒
}catch (Exception e) {
e.printStackTrace();
}
}
});
Button jdqonBtn = (Button)findViewById(R.id.jdqonBtn); //创建 开继电器灯按钮 对象,设置监听器
jdqonBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
byte[] InBuffer = new byte[64]; //输入缓存
byte buffer[] = "c".getBytes(); //创建字符数组c,只有一个字符,当然也可以自己定义协议
try {
mmOutStream.write(buffer); //数据流发送数组,发送给单片机蓝牙设备
//mmInStream.readFully(InBuffer, 0, 8); //读取 外部蓝牙设备发送回来的数据
//show_result(InBuffer,8); //显示到界面上
vib.vibrate(100); //手机震动,时长100毫秒
}catch (Exception e) {
e.printStackTrace();
}
}
});
Button jdqoffBtn = (Button)findViewById(R.id.jdqoffBtn); //创建 关继电器灯按钮 对象,设置监听器
jdqoffBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
byte[] InBuffer = new byte[64]; //输入缓存
byte buffer[] = "d".getBytes(); //创建字符数组d,只有一个字符,当然也可以自己定义协议
try {
mmOutStream.write(buffer); //数据流发送数组,发送给单片机蓝牙设备
//mmInStream.readFully(InBuffer, 0, 8); //读取 外部蓝牙设备发送回来的数据
//show_result(InBuffer,8); //显示到界面上
vib.vibrate(100); //手机震动,时长100毫秒
}catch (Exception e) {
e.printStackTrace();
}
}
});
}
Handler bluetoothMessageHandle = new Handler() { //蓝牙消息 handler 对象
public void handleMessage(Message msg) {
if (msg.what == 0x1234) { //如果消息是 0x1234,则是从 线程中 传输过来的数据
show_result((byte [])msg.obj,8); //将 缓冲区的数据显示到 UI
}
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}