广告
返回顶部
首页 > 资讯 > 移动开发 >Android蓝牙总结
  • 552
分享到

Android蓝牙总结

Android 2022-06-06 13:06:43 552人浏览 安东尼
摘要

因为之前有做与蓝牙有关的项目,所以这里写个博客总结一下。 附带了一个项目以供参考:https://GitHub.com/979451341/Bl

因为之前有做与蓝牙有关的项目,所以这里写个博客总结一下。
附带了一个项目以供参考:https://GitHub.com/979451341/BleStudy

一.蓝牙操作流程

1.获取蓝牙服务

        mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
        mBluetoothAdapter = mBluetoothManager.getAdapter();
        mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();

2.开启蓝牙

mBluetoothAdapter.enable();

3.搜索蓝牙设备

    var mScanCallback = object :ScanCallback(){
        override fun onScanResult(callbackType: Int, result: ScanResult?) {
        }
    }
mBluetoothLeScanner.startScan(mScanCallback)

4.连接蓝牙设备

//首先获取设备
        final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
//建立连接获取BluetoothGatt对象,并设置监听
        gatts = device.connectGatt(instance, false, mGattCallback);

首先说说BluetoothGatt对象,他是蓝牙通信的协议,连接蓝牙设备,发现服务,向蓝牙设备传数据和接收蓝牙设备的数据,都需经过他。
然后我们通过BluetoothGattCallback的,来监听这些过程。

    private static BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
        @Override
        public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
            super.onDescriptorWrite(gatt, descriptor, status);
            if (BluetoothGatt.GATT_SUCCESS == status) {
//开启监听成功,可以像设备写入命令了
            } 
        }
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            if (newState == BluetoothProfile.STATE_CONNECTED) {
//连接成功
                Log.e(TAG, "设备连接上 开始扫描服务");
                    boolean discoverServices = gatt.discoverServices();
                    if (discoverServices) {
                    } 
            } 
        }
        @Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            if (status == BluetoothGatt.GATT_SUCCESS) {
            //发现服务
                String address = gatt.getDevice().getAddress();
                //绑定特征
                bindCharas(address, getSupportedGattServices(address));
            } 
        }
        @Override
        public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            if (status == BluetoothGatt.GATT_SUCCESS) {
                //characteristic.getValue()为设备发送的数据,根据数据协议进行解析,对应onCharacteristicRead
            }
        }
        @Override
        public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
            //  characteristic.getValue()为设备发送的数据,根据数据协议进行解析,对应onCharacteristicChanged
        }
        @Override
        public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            Log.e(TAG, "发送成功");
        }
        @Override
        public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {
            super.onReadRemoteRssi(gatt, rssi, status);
        }
    };

其中绑定特征需要详细说说,一个蓝牙设备有多个BluetoothGattService服务,一个服务有多个BluetoothGattCharacteristic特征,一个特征有多个BluetoothGattDescriptor描述。

其中我们是通过UUID来区别特征,这个由硬件工程师提供。

我们刚连接蓝牙,需要获取蓝牙设备传过来的数据。首先获取 read的特征,然后获取 通知描述,并给 mBluetoothGatt,使其知道我们需要接受通知

//获取服务
mBluetoothGatt.getServices()
//获取read特征
    private static void bindCharas(String address, List gattServices) {
        for (BluetoothGattService gattService : gattServices) {
            List gattCharacteristics = gattService.getCharacteristics();
            for (final BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) {
                String uuid_str = gattCharacteristic.getUuid().toString();
                if (uuid_str.equalsIgnoreCase(Constant.SMART_TAG_READ_UUID)) {
                    BluetoothGattCharacteristic mReadCharacteristic = gattCharacteristic;
                    setCharacteristicNotification(address, mReadCharacteristic, true);
                }
            }
        }
    }

5.手机传送命令
首先获取write特征

        for (BluetoothGattService gattService : mBluetoothGatt.getServices()) {
            uuid = gattService.getUuid().toString();
            List gattCharacteristics = gattService.getCharacteristics();
            // Loops through available Characteristics.
            for (final BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) {
                uuid = gattCharacteristic.getUuid().toString();
                if (uuid.equalsIgnoreCase(Constant.SMART_TAG_WRITE_UUID)) {
                    return gattCharacteristic;
                }
            }
        }

然后给特征赋值,给gatt发出命令

            boolean write = characteristic.setValue(cmd);
            mBluetoothGatt.writeCharacteristic(characteristic);

6.断开蓝牙

在我们退出应用时,需断开连接

gatts.disconnect();
gatts.close();
二.蓝牙通信如何写入项目

1.蓝牙通信模块放哪
我们需要将蓝牙通信模块放在一个生命周期和应用相当的对象里,比如Application,不过这个类承担了很多sdk初始化的任务,所以我认为应该交给Service。

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            startForegroundService(Intent(this, BleService::class.java))
        } else {
            startService(Intent(this, BleService::class.java))
        }

2.数据分发
在Service里初始化蓝牙服务,在BluetoothGattCallback里监听蓝牙连接的状况,并通过EventBus发送出去,也可以通过广播发送出去,我认为EventBus写的代码少一些好用一些。

3.蓝牙重连和心跳包
在service的onCeate函数里,使用Handler或TimerTask完成这个任务

4.连接多蓝牙设备
需区分设备

参考文献
Https://juejin.im/post/599b8388f265da249600bbfd


作者:键盘舞者113


--结束END--

本文标题: Android蓝牙总结

本文链接: https://www.lsjlt.com/news/29362.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android蓝牙总结
    因为之前有做与蓝牙有关的项目,所以这里写个博客总结一下。 附带了一个项目以供参考:https://github.com/979451341/Bl...
    99+
    2022-06-06
    Android
  • Android Phone蓝牙通信方式总结(Socket与Gatt)
    Android手机间通过蓝牙方式进行通信,有两种常见的方式,一种是socket方式,另一种是通过Gatt Server(Android 5.0以...
    99+
    2022-06-06
    通信方式 gatt 通信 socket Android
  • Android蓝牙开发
    题引: 最近项目上涉及与硬件相关的功能,需要通过蓝牙进行消息收发。项目已完成,这里做下记录。 通信步骤: 初始化BluetoothAdapter.getDefaultAdapter()获取BluetoothAdapter对象 2.判断蓝牙是...
    99+
    2023-09-01
    java 开发语言
  • Android 蓝牙广播
    蓝牙广播 广播蓝牙状态变化(开关状态)广播蓝牙设备发现广播蓝牙配对(配对操作)广播ACL 连接状态变化广播蓝牙绑定状态变化(配对状态)广播蓝牙服务启动广播蓝牙服务停止广播蓝牙连接状态广播蓝牙扫描模式广播蓝牙音频状态广播蓝牙数据传输广...
    99+
    2023-08-17
    蓝牙广播
  • Android蓝牙BLE开发
    最近正在研究Android的蓝牙BLE开发学习,以下是自己做的个人总结 1.1何为BLE? 首先得说明什么是低功耗蓝牙BLE,BLE的全称为Bluetooth low energy(或称Blooth ...
    99+
    2023-09-01
    android java
  • Android蓝牙通信编程
    项目涉及蓝牙通信,所以就简单的学了学,下面是自己参考了一些资料后的总结,希望对大家有帮助。  以下是开发中的几个关键步骤: 1、首先开启蓝牙  2、搜索可用...
    99+
    2022-06-06
    通信 Android
  • 蓝牙HID——将android设备变成蓝牙鼠标/触控板(BluetoothHidDevice)
    前言 本篇为蓝牙HID系列篇章之一,本篇以红米K30(MIUI13即Android 12)手机作为蓝牙HID设备,可以与电脑、手机、平板等其他蓝牙主机进行配对从而实现鼠标触控板的功能。 蓝牙HID系列...
    99+
    2023-09-07
    android 蓝牙HID 鼠标/触控板 蓝牙外设
  • Android 蓝牙状态的监听
    一、需求背景 客户在使用我公司的Flutter插件时,要求有一个蓝牙与设备重连的功能,我用公司提供的Android SDK只能实现超出和进入蓝牙范围进行重连,但是无法在蓝牙打开进行重连,这不得不让我使用Android手写一个广播监听。 二、...
    99+
    2023-10-23
    android flutter android studio
  • Android BLE蓝牙开发流程
    Android BLE蓝牙开发流程包括以下步骤:1. 检查设备是否支持BLE:使用`BluetoothAdapter`类的`getD...
    99+
    2023-09-20
    Android
  • Android Ble蓝牙App(一)扫描
    Ble蓝牙App(一)扫描 前言目录正文一、基本配置二、扫描准备三、扫描页面① 增加UI布局② 点击监听③ 扫描处理④ 广播处理 四、权限处理五、扫描结果① 列表适配器② 扫描结果处理③...
    99+
    2023-09-10
    Ble蓝牙扫描
  • Android 9.0 蓝牙配对流程
    1 、UI DeviceListPreferenceFragment是蓝牙扫描到的设备列表,点击其中一个蓝牙设备,调用onPreferenceT...
    99+
    2022-06-06
    配对 Android 蓝牙
  • Android 蓝牙权限(更新到 Android 12)
    Android 蓝牙权限 Android 11 及以下目标版本Android 12 中的新蓝牙权限应用不推导物理位置指明使用的蓝牙功能检查功能可用性 Android 11 及以下目标版本 ...
    99+
    2023-09-08
    蓝牙权限
  • Android 蓝牙开发实例解析
    在使用手机时,蓝牙通信给我们带来很多方便。那么在Android手机中怎样进行蓝牙开发呢?本文以实例的方式讲解Android蓝牙开发的知识。    ...
    99+
    2022-06-06
    Android 蓝牙
  • Android Bluetooth蓝牙技术初体验
    一:Bluetooth包简介 Android平台提供了一个android.bluetooth的包,里面实现蓝牙设备之间通信的蓝牙API。总共有8个类,常用的四个类如下: Blu...
    99+
    2022-06-06
    Android
  • android系统蓝牙自动连接
    实现的主要功能(蓝牙配对成功如何与远程设备一直连接) 1.当蓝牙配对成功连接时,非主动断开会自动连接 2.当设备长时间锁屏会导致CachedBl...
    99+
    2022-06-06
    自动 连接 Android 蓝牙
  • 蓝牙原理Android代码实现
    本文实例为大家分享了Android实现蓝牙原理代码,供大家参考,具体内容如下 package com.example.se7en.testbluetooth; import ...
    99+
    2022-06-06
    Android 蓝牙
  • Android蓝牙开发深入解析
    1. 使用蓝牙的响应权限 代码如下:<uses-permission android:name="android.permission.BLUETOOTH" />&...
    99+
    2022-06-06
    android蓝牙开发 Android
  • Android 扫描附近的蓝牙设备并连接蓝牙音响的示例
    写了一个可以扫描附近蓝牙设备的小Demo,可以查看蓝牙设备的设备名和Mac地址代码量不多,很容易看懂public class ScanDeviceActivity extends AppCompatActivity { private Lo...
    99+
    2023-05-30
    android 扫描 蓝牙
  • Android中怎么实现蓝牙通信
    这期内容当中小编将会给大家带来有关Android中怎么实现蓝牙通信,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一:注意事项      1:android...
    99+
    2023-05-30
    android
  • Android Ble蓝牙App(五)数据操作
    Ble蓝牙App(五)数据操作 前言目录正文一、操作内容处理二、读取数据① 概念② 实操 三、写入数据① 概念② 实操 四、打开通知一、概念二、实操三、收到数据 五、源码 ...
    99+
    2023-09-21
    Ble数据交互 Android BLE兼容 低功耗蓝牙数据交互
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作