Android实现蓝牙客户端与服务器端通信示例

yizhihongxing

以下是“Android实现蓝牙客户端与服务器端通信示例”的完整攻略:

1. 准备工作

在开始实现蓝牙客户端和服务器端通信之前,我们需要做以下准备工作:

  • 确保安卓设备支持蓝牙功能
  • 在AndroidManifest.xml文件中添加蓝牙权限
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <!-- 蓝牙设备需要定位权限 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  • 在build.gradle文件中添加蓝牙依赖库
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:design:28.0.0'
    implementation 'com.android.support:support-v4:28.0.0'
    implementation 'com.android.support:cardview-v7:28.0.0'
    implementation 'com.android.support:recyclerview-v7:28.0.0'

2. 创建蓝牙客户端

2.1 初始化蓝牙适配器

创建蓝牙客户端前,我们需要先初始化蓝牙适配器,这样我们才能获取到蓝牙设备和实现蓝牙通信。通常来说,我们可以在Activity中使用以下代码初始化蓝牙适配器:

    BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();            
    if (mBluetoothAdapter == null) {
        // 设备不支持蓝牙
    }
    if (!mBluetoothAdapter.isEnabled()) {
        // 蓝牙未开启,调用startActivityForResult开启蓝牙
    }

2.2 搜索蓝牙设备

初始化蓝牙适配器后,我们需要搜索可用的蓝牙设备,以便进行连接。我们可以使用startDiscovery()方法开始搜索蓝牙设备,当搜索完成后,会发送一个广播通知。我们可以创建一个BroadcastReceiver接收该通知,这样我们就可以获取到周围可用的蓝牙设备,并且可以实现连接。

示例代码如下:

    public void searchDevice(){
        mReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                // 获得扫描广播值
                if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    Log.e("device",device.getName() + ":" + device.getAddress());
                    // 连接该蓝牙设备
                }
            }
        };
        // 注册广播接收器
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        registerReceiver(mReceiver, filter);
        // 蓝牙搜索
        mBluetoothAdapter.startDiscovery();
    }

2.3 连接蓝牙设备

搜索到蓝牙设备后,我们需要连接该设备才能开始进行通信。创建连接步骤如下:

  1. 停止蓝牙搜索
  2. 创建BluetoothSocket实例
  3. 调用connect()方法连接设备
  4. 可选:判断连接是否成功

示例代码如下:

    // 蓝牙设备
    BluetoothDevice mDevice;
    // 蓝牙socket
    BluetoothSocket mSocket;

    public void connectDevice(BluetoothDevice device){
        // 停止蓝牙搜索
        mBluetoothAdapter.cancelDiscovery();
        // 创建socket
        try {
            mSocket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
        } catch (IOException e) {
            Log.e("socket", e.getMessage());
            return;
        }
        // 连接设备
        try {
            mSocket.connect();
        } catch (IOException e) {
            Log.e("connect", e.getMessage());
            // 连接失败
            try {
                mSocket.close();
            } catch (IOException ex) {
                Log.e("close", ex.getMessage());
            }
            return;
        }
        // 连接成功
    }

3. 创建蓝牙服务器端

3.1 初始化服务器端

在创建蓝牙服务器端之前,我们需要初始化BluetoothServerSocket,这样我们才能监听客户端的连接请求,从而实现服务器端的通信。

示例代码如下:

    // 服务端socket
    BluetoothServerSocket mServerSocket;

    public void initServerSocket(){
        try {
            mServerSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord("服务名称", UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
        } catch (IOException e) {
            Log.e("listen", e.getMessage());
        }
    }

3.2 等待连接请求

初始化服务器端后,我们需要等待客户端的连接请求,这里我们会使用BluetoothServerSocket的accept()方法。该方法会阻塞当前线程,并等待连接请求。

示例代码如下:

    public void waitClient(){
        BluetoothSocket socket;
        while (true) {
            try {
                socket = mServerSocket.accept();
            } catch (IOException e) {
                Log.e("accept", e.getMessage());
                break;
            }
            if (socket != null) {
                // 处理客户端请求
                break;
            }
        }
    }

4. 实现通信

在客户端和服务器端连接成功后,我们就可以开始实现通信了。在这里,我们需要使用BluetoothSocket的getInputStream()和getOutputStream()方法获取到输入流和输出流,从而实现数据的传递。

以下是客户端发送数据的示例代码:

        OutputStream outputStream;
        try {
            outputStream = mSocket.getOutputStream();
            String data = "hello world";
            outputStream.write(data.getBytes());
        } catch (IOException e) {
            Log.e("write", e.getMessage());
        }

以下是服务器端接收数据的示例代码:

        InputStream inputStream;
        try {
            inputStream = socket.getInputStream();
            byte[] buffer = new byte[1024];
            int bytes = inputStream.read(buffer);
            String data = new String(buffer, 0, bytes);
            Log.e("data", data);
        } catch (IOException e) {
            Log.e("read", e.getMessage());
        }

完整的Android实现蓝牙客户端与服务器端通信示例已经结束,该攻略提供了搜索蓝牙设备、连接蓝牙设备、创建蓝牙服务器端等操作的示例代码。其中客户端和服务器端的数据通信示例也已经提供,可以供开发者参考,实现更为复杂和完善的通讯应用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android实现蓝牙客户端与服务器端通信示例 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • MSSQL 添加字段说明

    以下是 MSSQL 添加字段说明的完整攻略。 步骤一:查看现有字段 在添加字段说明之前,我们需要查看现有的字段。使用以下代码查询表中现有的字段: sp_columns YourTableName; 其中,YourTableName 替换为你需要查看的表的名称。 步骤二:添加字段说明 在 MSSQL 中,可以使用 sp_addextendedproperty …

    other 2023年6月25日
    00
  • python中super()函数的理解与基本使用

    标题:Python中super()函数的理解与基本使用 概述:super()是一个内置函数,用于调用父类(超类)的一种方法。 1.理解super()函数 super()函数用于子类继承父类的属性和方法。它通常在子类的构造函数中使用,以便使用父类的方法和属性。 它的语法如下: class SubClassName(ParentClass): def __ini…

    other 2023年6月27日
    00
  • ASP.NET Core MVC 过滤器(Filter)

    ASP.NET Core MVC 过滤器(Filter)攻略 过滤器(Filter)是ASP.NET Core MVC中的一个重要概念,它允许我们在请求处理过程中插入自定义逻辑。过滤器可以用于处理请求前后的操作,例如身份验证、日志记录、异常处理等。本攻略将详细介绍ASP.NET Core MVC过滤器的使用方法,并提供两个示例说明。 过滤器的类型 ASP.N…

    other 2023年8月20日
    00
  • Pytest fixture及conftest相关详解

    Pytest fixture及conftest相关详解 什么是Pytest fixture? Pytest fixture是Pytest测试框架中的一个重要概念,它用于在测试用例执行前后进行一些准备和清理工作。可以将fixture看作是一个函数,它可以被测试用例调用,并且可以返回一个值或者执行一些操作。 如何定义和使用fixture? 要定义一个fixtur…

    other 2023年8月20日
    00
  • C语言关键字大全(共32个)

    C语言关键字大全(共32个) C语言关键字是指具有特殊含义的单词,不能被用作变量名、函数名等标识符。C语言一共有32个关键字,包括: Auto Double Int Struct Break Else Long Switch Case Enum Register Typedef Char Extern Return Union Const Float Sho…

    other 2023年6月27日
    00
  • C#获取真实IP地址(IP转为长整形、判断是否内网IP的方法)

    C#获取真实IP地址(IP转为长整形、判断是否内网IP的方法) 在C#中,获取真实IP地址并进行IP转为长整形以及判断是否为内网IP的操作可以通过以下步骤完成: 步骤1:引入必要的命名空间 首先,我们需要引入System.Net和System.Net.Sockets命名空间,以便使用相关的类和方法。 using System.Net; using Syste…

    other 2023年7月30日
    00
  • 在js中把json对象转化为string对象的方法

    在JavaScript中,可以使用JSON.stringify()方法将JSON对象转换为字符串对象。以下是详细的攻略,包括两个示例说明。 使用JSON.stringify()方法 JSON.stringify()方法是将JavaScript对象转换为JSON字符串的标准方法。该方法接受三个参数:要转换的对象、转换函数和缩进空格数。其中,只有第一个参数是必需…

    other 2023年5月7日
    00
  • 详解Android中Fragment的两种创建方式

    一、Fragment的概述 Fragment是Android中的一种UI组件,可以被称为“Activity的子Activity”,因为一个Activity可以有多个Fragment,Fragment可以嵌套在Activity的布局中,且可以动态加载、替换、添加、删除等操作。 二、Fragment的创建方式 在Android中,Fragment有两种创建方式:…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部