Android蓝牙通信:实现跨设备数据传输与控制

一、什么是蓝牙通信

蓝牙(Bluetooth)是一种短距离无线通信技术,它的传输距离一般在10米以内,最高不超过100米。在现代生活中,蓝牙被广泛应用于手机、电脑、蓝牙音箱等设备的数据传输和控制。

蓝牙通信的特点是无需数据线连接两台设备,同时支持多设备同时连接,传输速率相对较慢但功耗低,稳定性较好。

二、蓝牙通信的实现技术

Android系统提供了Bluetooth API,使得开发者可以方便地实现蓝牙通信功能。

在蓝牙通信中,一般存在服务端和客户端两个角色。服务端负责创建蓝牙连接,等待客户端连接并接收客户端发送的数据。而客户端则负责搜索可用的服务端并向其发送数据。

在本文的蓝牙通信示例中,我们将演示如何在Android设备上实现蓝牙通信并通过蓝牙控制LED灯的开关。其中,一台设备将扮演服务端的角色,而另一台设备则作为客户端。

三、蓝牙通信示例代码

示例代码中,我们将在两个Activity中实现蓝牙通信功能。第一个Activity作为服务端,第二个Activity作为客户端。

服务端代码


    private BluetoothAdapter mAdapter;
    private AcceptThread mAcceptThread;
    private ConnectThread mConnectThread;
    private ConnectedThread mConnectedThread;
    private int mState;
 
    private static final int STATE_NONE = 0;       // we're doing nothing
    private static final int STATE_LISTEN = 1;     // now listening for incoming connections
    private static final int STATE_CONNECTING = 2; // now initiating an outgoing connection
    private static final int STATE_CONNECTED = 3;  // now connected to a remote device
 
    public BluetoothService() {
        mAdapter = BluetoothAdapter.getDefaultAdapter();
        mState = STATE_NONE;
    }
 
    private synchronized void setState(int state) {
        mState = state;
    }
 
    public synchronized int getState() {
        return mState;
    }
 
    public synchronized void start() {
        cancelConnectThread();
        cancelConnectedThread();
 
        if (mAcceptThread == null) {
            mAcceptThread = new AcceptThread();
            mAcceptThread.start();
        }
        setState(STATE_LISTEN);
    }
 
    public synchronized void connect(BluetoothDevice device) {
        cancelConnectThread();
        cancelConnectedThread();
        mConnectThread = new ConnectThread(device);
        mConnectThread.start();
        setState(STATE_CONNECTING);
    }
 
    public synchronized void connected(BluetoothSocket socket, BluetoothDevice device) {
        cancelConnectThread();
        cancelConnectedThread();
        mConnectedThread = new ConnectedThread(socket);
        mConnectedThread.start();
        setState(STATE_CONNECTED);
    }
 
    public synchronized void stop() {
        cancelConnectThread();
        cancelConnectedThread();
        cancelAcceptThread();
        setState(STATE_NONE);
    }
 
    public void write(byte[] out) {
        ConnectedThread r;
        synchronized (this) {
            if (mState != STATE_CONNECTED) return;
            r = mConnectedThread;
        }
        r.write(out);
    }
 
    private void connectionFailed() {
        setState(STATE_LISTEN);
    }
 
    private void connectionLost() {
        setState(STATE_LISTEN);
    }
 
    private void cancelConnectThread() {
        if (mConnectThread != null) {
            mConnectThread.cancel();
            mConnectThread = null;
        }
    }
 
    private void cancelConnectedThread() {
        if (mConnectedThread != null) {
            mConnectedThread.cancel();
            mConnectedThread = null;
        }
    }
 
    private void cancelAcceptThread() {
        if (mAcceptThread != null) {
            mAcceptThread.cancel();
            mAcceptThread = null;
        }
    }
 
    private class AcceptThread extends Thread {
        private final BluetoothServerSocket mmServerSocket;
 
        public AcceptThread() {
            BluetoothServerSocket tmp = null;
            try {
                tmp = mAdapter.listenUsingRfcommWithServiceRecord("BluetoothService", MY_UUID);
            } catch (IOException e) {
                e.printStackTrace();
            }
            mmServerSocket = tmp;
        }
 
        public void run() {
 
            BluetoothSocket socket = null;
 
            while (mState != STATE_CONNECTED) {
                try {
                    socket = mmServerSocket.accept();
                } catch (IOException e) {
                    e.printStackTrace();
                    break;
                }
 
                if (socket != null) {
                    connected(socket, socket.getRemoteDevice());
                }
            }
        }
 
        public void cancel() {
            try {
                mmServerSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
 
    private class ConnectThread extends Thread {
        private final BluetoothSocket mmSocket;
        private final BluetoothDevice mmDevice;
 
        public ConnectThread(BluetoothDevice device) {
            BluetoothSocket tmp = null;
            mmDevice = device;
            try {
                tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
            } catch (IOException e) {
                e.printStackTrace();
            }
            mmSocket = tmp;
        }
 
        public void run() {
            mAdapter.cancelDiscovery();
            try {
                mmSocket.connect();
            } catch (IOException e) {
                connectionFailed();
                try {
                    mmSocket.close();
                } catch (IOException e2) {
                    e2.printStackTrace();
                }
                BluetoothService.this.start();
                return;
            }
            connected(mmSocket, mmDevice);
        }
 
        public void cancel() {
            try {
                mmSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
 
    private class ConnectedThread extends Thread {
        private final BluetoothSocket mmSocket;
        private final InputStream mmInStream;
        private final OutputStream mmOutStream;
 
        public ConnectedThread(BluetoothSocket socket) {
            mmSocket = socket;
            InputStream tmpIn = null;
            OutputStream tmpOut = null;
            try {
                tmpIn = socket.getInputStream();
                tmpOut = socket.getOutputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }
            mmInStream = tmpIn;
            mmOutStream = tmpOut;
        }
 
        public void run() {
            byte[] buffer = new byte[1024];
            int bytes;
 
            while (true) {
                try {
                    bytes = mmInStream.read(buffer);
                    mHandler.obtainMessage(BluetoothState.MESSAGE_READ, bytes, -1, buffer)
                            .sendToTarget();
                } catch (IOException e) {
                    connectionLost();
                    BluetoothService.this.start();
                    break;
                }
            }
        }
 
        public void write(byte[] buffer) {
            try {
                mmOutStream.write(buffer);
                mHandler.obtainMessage(BluetoothState.MESSAGE_WRITE, -1, -1, buffer)
                        .sendToTarget();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
 
        public void cancel() {
            try {
                mmSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

客户端代码


    private BluetoothAdapter mBluetoothAdapter;
    private BluetoothService mBluetoothService;
    private Button mBtnSwitch;
    private boolean mLedOn = false;
 
    private final Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case BluetoothState.MESSAGE_READ:
                    break;
                case BluetoothState.MESSAGE_WRITE:
                    break;
                default:
                    break;
            }
        }
    };
 
    private void setupBluetooth() {
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if (mBluetoothAdapter == null) {
            Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_LONG).show();
            finish();
            return;
        }
        if (!mBluetoothAdapter.isEnabled()) {
            Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
        } else {
            setupService();
        }
    }
 
    private void setupService() {
        mBluetoothService = new BluetoothService(this, mHandler);
    }
 
    private void connectDevice(Intent data, boolean secure) {
        String address = data.getExtras()
                .getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS);
        BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
        mBluetoothService.connect(device);
    }
 
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case REQUEST_CONNECT_DEVICE_SECURE:
                if (resultCode == Activity.RESULT_OK) {
                    connectDevice(data, true);
                }
                break;
            case REQUEST_ENABLE_BT:
                if (resultCode == Activity.RESULT_OK) {
                    setupService();
                } else {
                    Toast.makeText(this, "Bluetooth is not enabled",
                            Toast.LENGTH_SHORT).show();
                    finish();
                }
        }
    }
 
    private void switchLED() {
        if (mLedOn) {
            mBtnSwitch.setText(R.string.btn_led_on);
            byte[] command = "0".getBytes();
            mBluetoothService.write(command);
        } else {
            mBtnSwitch.setText(R.string.btn_led_off);
            byte[] command = "1".getBytes();
            mBluetoothService.write(command);
        }
        mLedOn = !mLedOn;
    }

四、小结

本文介绍了蓝牙通信的基本概念和实现技术,并提供了Android设备上蓝牙通信的示例代码。通过示例代码,我们可以实现在两台Android设备之间进行蓝牙通信,并通过蓝牙控制LED灯的开关。

原创文章,作者:TDIS,如若转载,请注明出处:https://www.506064.com/n/147602.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
TDISTDIS
上一篇 2024-11-01 14:10
下一篇 2024-11-01 14:10

相关推荐

  • 如何解决egalaxtouch设备未找到的问题

    egalaxtouch设备未找到问题通常出现在Windows或Linux操作系统上。如果你遇到了这个问题,不要慌张,下面我们从多个方面进行详细阐述解决方案。 一、检查硬件连接 首先…

    编程 2025-04-29
  • 跨域通信浮标——实现客户端之间的跨域通信

    本文将介绍跨域通信浮标的使用方法,该浮标可以实现客户端之间的跨域通信,解决了浏览器同源策略的限制,让开发者能够更加方便地进行跨域通信。 一、浮标的原理 跨域通信浮标的原理是基于浮动…

    编程 2025-04-27
  • NB设备上传数据方案

    NB(Narrow Band)是一种物联网通信技术,可以实现低功耗、宽覆盖、多连接等特点。本文旨在探讨如何使用NB设备上传数据。在这篇文章中,我们将介绍NB设备上传数据的基本原理、…

    编程 2025-04-27
  • 通信专业Python和Java的开发技巧

    本文旨在介绍通信专业Python和Java的开发技巧,为读者提供实用且可操作的思路和方法。 一、Python在通信领域中的应用 Python是一种优秀的程序设计语言,因其易学易用、…

    编程 2025-04-27
  • ROS通信

    一、概述 ROS是机器人操作系统,是一个开源的、灵活的、分布式的软件平台,可以帮助我们快速开发机器人应用程序。ROS中的通信是机器人应用程序开发中最重要的部分之一,它是实现多模块协…

    编程 2025-04-25
  • Python 进程通信

    当需要在不同进程之间进行通信时,Python 提供了几种方法来实现进程间通信。这些方法包括队列,管道,共享内存以及套接字。 1. 队列 Python 队列是进程安全的,并且可以很方…

    编程 2025-04-24
  • HC-05蓝牙模块控制

    一、简介 HC-05是一款蓝牙串口模块,与典型的串口模块相似,可通过UART通信发送和接收数据。它可以很方便地与其他设备进行蓝牙通信,例如智能手机,平板电脑等,实现无线控制。HC-…

    编程 2025-04-24
  • TIPC:多节点通信的高效解决方案

    一、TIPC概述 TIPC是一个Linux内核中的通信协议,在多节点通信场景下拥有出色的表现,被许多公司使用。 TIPC协议支持传输层的连接管理、拥塞控制、流量调整等高级特性,对于…

    编程 2025-04-24
  • c#串口通信数据读取

    一、基础概念 串口通信是指通过串口进行数据交换的过程。串口是指COM口,COM口是计算机硬件设备之一,其可进行异步数据传输,因此能方便地进行数据收发,被广泛应用于各种领域中。 串口…

    编程 2025-04-24
  • ROS串口通信详解

    一、ROS介绍 ROS(Robot Operating System)是一个开源的机器人操作系统,为机器人软件开发提供了很多功能包,如导航、定位、感知等。 ROS主要基于发布/订阅…

    编程 2025-04-24

发表回复

登录后才能评论