有问题

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;
    }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值