• Android学习——蓝牙通讯


    蓝牙
    蓝牙,是一种支持设备短距离通信(一般10m内,且无阻隔媒介)的无线电技术。能在包括移动电话、PDA、无线耳机、笔记本电脑等众多设备之间进行无线信息交换。利用“蓝牙”技术,能够有效的简化移动通信终端设备之间的通信,也能够成功的简化设备与Internet之间的通信,这样数据传输变得更加迅速高效,为无线通信拓宽道路。

    注意:Android 2.0 引入蓝牙接口,在开发时,需要真机测试,如果需要数据传输,还需要两台机器,另外蓝牙下哟硬件支持。

    蓝牙设备操作
    权限:

    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    打开蓝牙的方式有两种:

    //第一种方法,打开蓝牙设备(提示对话框)
    Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
    discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
    startActivity(discoverableIntent);
    //第二种方法,打开蓝牙,静默打开
    BluetoothAdapter bluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
    bluetoothAdapter.enable();
    搜索蓝牙设备

    //开始扫描蓝牙设备
    BluetoothAdapter bluetoothAdapter2=BluetoothAdapter.getDefaultAdapter();
    bluetoothAdapter2.startDiscovery();
    关闭蓝牙设备

    BluetoothAdapter bluetoothAdapter1=BluetoothAdapter.getDefaultAdapter();
    bluetoothAdapter1.disable();
     
    蓝牙通讯案例


     

    MainActivity.java

    package com.example.bluetooth;

    import android.bluetooth.BluetoothAdapter;
    import android.bluetooth.BluetoothDevice;
    import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;

    import java.util.Set;

    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button open, close,button_scan,button_server,button_client;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    open = findViewById(R.id.open);
    close = findViewById(R.id.close);
    button_scan = findViewById(R.id.button_scan);
    button_server = (Button) findViewById(R.id.button_server);
    button_client = (Button) findViewById(R.id.button_client);
    open.setOnClickListener(this);
    close.setOnClickListener(this);
    button_scan.setOnClickListener(this);
    button_server.setOnClickListener(this);
    button_client.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
    switch (v.getId()){
    case R.id.open:
    /*//第一种方法,打开蓝牙设备(提示对话框)
    Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
    //打开本机蓝牙发现功能
    discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
    startActivity(discoverableIntent);*/

    //第二种方法,打开蓝牙,静默打开
    BluetoothAdapter bluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
    bluetoothAdapter.enable();
    break;
    case R.id.close:
    BluetoothAdapter bluetoothAdapter1=BluetoothAdapter.getDefaultAdapter();
    bluetoothAdapter1.disable();
    break;
    case R.id.button_scan:
    //开始扫描蓝牙设备
    BluetoothAdapter bluetoothAdapter2=BluetoothAdapter.getDefaultAdapter();
    bluetoothAdapter2.startDiscovery();
    Log.i("tag","开始扫描蓝牙设备");
    Set<BluetoothDevice> set=bluetoothAdapter2.getBondedDevices();
    for (BluetoothDevice bd:set){
    Log.i("tag","name:"+bd.getName());
    Log.i("tag","address:"+bd.getAddress());
    }
    break;
    case R.id.button_server:
    Intent intent = new Intent(this, ServerBluetoothActivity.class);
    startActivity(intent);
    break;
    case R.id.button_client:
    Intent intent1 = new Intent(this, ClientBluetoothActivity.class);
    startActivity(intent1);
    break;
    default:
    break;
    }
    }
    }
    ServerBluetoothActivity.java

    package com.example.bluetooth;

    import android.bluetooth.BluetoothAdapter;
    import android.bluetooth.BluetoothServerSocket;
    import android.bluetooth.BluetoothSocket;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.text.TextUtils;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    import android.widget.Toast;

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.lang.ref.WeakReference;
    import java.util.UUID;

    public class ServerBluetoothActivity extends AppCompatActivity {

    private static final int CONN_SUCCESS=0x1;
    private static final int CONN_FAIL=0x2;
    private static final int RECEIVER_INFO=0x3;
    private static final int SET_EDITTEXT_NULL=0x4;
    private static Button button_send;
    private static TextView textView_content;
    private static EditText editText_info;
    BluetoothAdapter bluetoothAdapter=null;//本地蓝牙设备
    BluetoothServerSocket serverSocket=null;//蓝牙设备Socket服务端
    BluetoothSocket socket=null;//蓝牙设备Socket客户端

    //输入输出流
    PrintStream out;
    BufferedReader in;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_server_bluetooth);
    setTitle("蓝牙服务端");
    textView_content= (TextView) findViewById(R.id.textView_content);
    editText_info= (EditText) findViewById(R.id.editText_info);
    button_send= (Button) findViewById(R.id.button_send);
    init();
    }

    //创建蓝牙服务器端的Socket
    private void init() {
    textView_content.setText("服务器已启动,正在等待连接... ");
    new Thread(new Runnable() {
    @Override
    public void run() {
    //1.得到本地设备
    bluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
    //2.创建蓝牙Socket服务器
    try {
    serverSocket=bluetoothAdapter.listenUsingRfcommWithServiceRecord("text", UUID.fromString("00000000-2527-eef3-ffff-ffffe3160865"));
    //3.阻塞等待Socket客户端请求
    socket=serverSocket.accept();
    if (socket!=null){
    out=new PrintStream(socket.getOutputStream());
    in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
    }
    handler.sendEmptyMessage(CONN_SUCCESS);
    } catch (IOException e) {
    e.printStackTrace();
    Message msg=handler.obtainMessage(CONN_FAIL,e.getLocalizedMessage());
    handler.sendMessage(msg);
    }
    }
    }).start();
    }

    //防止内存泄漏 正确的使用方法
    private final MyHandler handler = new MyHandler(this);
    public class MyHandler extends Handler {
    //软引用
    WeakReference<ServerBluetoothActivity> weakReference;

    public MyHandler(ServerBluetoothActivity activity) {
    weakReference=new WeakReference<ServerBluetoothActivity>(activity);
    }

    @Override
    public void handleMessage(Message msg) {
    super.handleMessage(msg);
    ServerBluetoothActivity activity=weakReference.get();
    if (activity!=null){
    switch (msg.what){
    case RECEIVER_INFO:
    setInfo(msg.obj.toString()+" ");
    break;
    case SET_EDITTEXT_NULL:
    editText_info.setText("");
    break;
    case CONN_SUCCESS:
    setInfo("连接成功! ");
    button_send.setEnabled(true);
    new Thread(new ReceiverInfoThread()).start();
    break;
    case CONN_FAIL:
    setInfo("连接失败! ");
    setInfo(msg.obj.toString() + " ");
    break;
    default:
    break;
    }
    }
    }
    }
    private boolean isReceiver=true;

    private class ReceiverInfoThread implements Runnable {
    @Override
    public void run() {
    String info=null;
    while (isReceiver){
    try {
    info=in.readLine();
    Message msg=handler.obtainMessage(RECEIVER_INFO,info);
    handler.sendMessage(msg);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    }

    public void sendClick(View view){
    final String content=editText_info.getText().toString();
    if (TextUtils.isEmpty(content)){
    Toast.makeText(this, "不能发送空消息", Toast.LENGTH_SHORT).show();
    return;
    }
    new Thread(new Runnable() {
    @Override
    public void run() {
    out.println(content);
    out.flush();
    handler.sendEmptyMessage(SET_EDITTEXT_NULL);
    }
    }).start();
    }
    private void setInfo(String info){
    StringBuffer sb=new StringBuffer();
    sb.append(textView_content.getText());
    sb.append(info);
    textView_content.setText(sb);
    }
    }
    ClientBluetoothActivity.java

    package com.example.bluetooth;

    import android.bluetooth.BluetoothAdapter;
    import android.bluetooth.BluetoothDevice;
    import android.bluetooth.BluetoothSocket;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.text.TextUtils;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    import android.widget.Toast;

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.lang.ref.WeakReference;
    import java.util.UUID;

    public class ClientBluetoothActivity extends AppCompatActivity {
    private static final int CONN_SUCCESS=0x1;
    private static final int CONN_FAIL=0x2;
    private static final int RECEIVER_INFO=0x3;
    private static final int SET_EDITTEXT_NULL=0x4;
    private static Button button_send;
    private static TextView textView_content;
    private static EditText editText_info;

    BluetoothAdapter bluetooth=null;//本地蓝牙设备
    BluetoothDevice device=null;//远程蓝牙设备
    BluetoothSocket socket=null;//蓝牙设备Socket客户端

    //输入输出流
    PrintStream out;
    BufferedReader in;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_client_bluetooth);

    setTitle("蓝牙客户端");
    textView_content= (TextView) findViewById(R.id.textView_content);
    editText_info= (EditText) findViewById(R.id.editText_info);
    button_send= (Button) findViewById(R.id.button_send);
    init();
    }

    //创建蓝牙客户端端的Socket
    private void init() {
    textView_content.setText("客户端已启动,正在等待连接... ");
    new Thread(new Runnable() {
    @Override
    public void run() {
    //1.得到本地蓝牙设备的默认适配器
    bluetooth=BluetoothAdapter.getDefaultAdapter();
    //2.通过本地蓝牙设备得到远程蓝牙设备
    device=bluetooth.getRemoteDevice("22:22:4E:6E:59:86");
    //3.根据UUID创建并返回一个BoluetoothSocket
    try {
    socket=device.createRfcommSocketToServiceRecord(UUID.fromString("00000000-2527-eef3-ffff-ffffe3160865"));
    if (socket!=null) {
    // 连接
    socket.connect();
    //处理客户端输出流
    out=new PrintStream(socket.getOutputStream());
    in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
    }
    handler.sendEmptyMessage(CONN_SUCCESS);
    } catch (IOException e) {
    e.printStackTrace();
    Message msg=handler.obtainMessage(CONN_FAIL,e.getLocalizedMessage());
    handler.sendMessage(msg);
    }
    }
    }).start();
    }
    //防止内存泄漏 正确的使用方法
    private final MyHandler handler = new MyHandler(this);
    public class MyHandler extends Handler {
    //软引用
    WeakReference<ClientBluetoothActivity> weakReference;

    public MyHandler(ClientBluetoothActivity activity) {
    weakReference = new WeakReference<ClientBluetoothActivity>(activity);
    }

    @Override
    public void handleMessage(Message msg) {
    super.handleMessage(msg);
    ClientBluetoothActivity activity = weakReference.get();
    if (activity!=null){
    switch (msg.what){
    case RECEIVER_INFO:
    setInfo(msg.obj.toString() + " ");
    break;
    case SET_EDITTEXT_NULL:
    editText_info.setText("");
    break;
    case CONN_SUCCESS:
    setInfo("连接成功! ");
    button_send.setEnabled(true);
    System.out.println("name"+device.getName());
    System.out.println("Uuids"+device.getUuids());
    System.out.println("Address"+device.getAddress());
    new Thread(new ReceiverInfoThread()).start();
    break;
    case CONN_FAIL:
    setInfo("连接失败! ");
    setInfo(msg.obj.toString() + " ");
    break;
    default:
    break;
    }
    }
    }
    }
    private boolean isReceiver=true;
    //接收信息的线程
    class ReceiverInfoThread implements Runnable{
    @Override
    public void run() {
    String info=null;
    while (isReceiver){
    try {
    Log.i("tag","--ReceiverInfoThread start --");
    info=in.readLine();
    Log.i("tag","--ReceiverInfoThread read --");
    Message msg=handler.obtainMessage(RECEIVER_INFO,info);
    handler.sendMessage(msg);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    }

    public void sendClick(View v){
    final String content=editText_info.getText().toString();
    if (TextUtils.isEmpty(content)){
    Toast.makeText(this, "不能发送空消息", Toast.LENGTH_SHORT).show();
    return;
    }
    new Thread(new Runnable() {
    @Override
    public void run() {
    out.println(content);
    out.flush();
    handler.sendEmptyMessage(SET_EDITTEXT_NULL);
    }
    }).start();
    }
    private void setInfo(String info){
    StringBuffer sb=new StringBuffer();
    sb.append(textView_content.getText());
    sb.append(info);
    textView_content.setText(sb);
    }

    --------------------- 

  • 相关阅读:
    Spring Bean的生命周期
    使用docker安装虚拟机并打开ssh连接
    查看/设置JVM使用的垃圾收集器
    使用Apollo动态修改线上数据源
    java8之lambda表达式
    Java8之Stream
    @Bean 的用法
    Java中的Filter过滤器
    详解tomcat的连接数与线程池
    什么是ClassLoader
  • 原文地址:https://www.cnblogs.com/hyhy904/p/10995876.html
Copyright © 2020-2023  润新知