安卓读取蓝牙BLE设备信息

android 配对ble设备,Android bluetooth创建GATT连接并读取设备信息 一 GATT简介蓝牙分为经典蓝牙和低功耗蓝牙(BLE),我们常用的蓝牙遥控器就是低功耗蓝牙低功耗蓝牙(BLE)连接都是建立在 GATT (Generic Attribute Profile) 协议之上。GATT全称Generic Attribute Profile(直译即:通用属性协议),是一个在蓝牙连接之上的发送和接收较短的数据段的通用规范,这些很短的数据段被称为属性(Attribute)。二 ... 阅读详情

简介

目前,许多项目都会涉及与BLE设备进行交互的功能,接下来说一下读取BLE设备信息的具体实现流程。安卓BLE相关接口介绍详见官网链接:
https://developer.android.google.cn/guide/topics/connectivity/bluetooth-le

轮询方式代码实现

这里实现的示例代码,每60秒通过bluetoothManager查询当前是否有已连接的BLE设备,如果有,则与该设备建立GATT连接,读取设备信息,读完之后断开GATT连接。

package com.komect.gatttest2;

import androidx.appcompat.app.AppCompatActivity;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCallback;
import android.bluetooth.BluetoothGattCharacteristic;
import android.bluetooth.BluetoothGattService;
import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothProfile;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import java.util.List;
import java.util.UUID;

public class MainActivity extends AppCompatActivity {

    private String TAG = "BLE";
    private BluetoothGatt mBluetoothGatt;
    private BluetoothGattCharacteristic mGattCharacteristic;
    private BluetoothGattService mGattService;
    private boolean alreadyConnected = false;

    //service的UUID
    public static final UUID DEVICE_INFO_SERVICE_UUID = UUID.fromString("0000180A-0000-1000-8000-00805f9b34fb");

    //characteristic的UUID
    public static final UUID MANUFACTURER_Name_UUID = UUID.fromString("00002A29-0000-1000-8000-00805f9b34fb");
    public static final UUID SN_UUID = UUID.fromString("00002A25-0000-1000-8000-00805f9b34fb");
    public static final UUID MODEL_NAME_UUID = UUID.fromString("00002A24-0000-1000-8000-00805f9b34fb");
    public static final UUID SOFTWARE_VERSION_UUID = UUID.fromString("00002A27-0000-1000-8000-00805f9b34fb");
    public static final UUID FIRMWARE_VERSION_UUID = UUID.fromString("00002A26-0000-1000-8000-00805f9b34fb");
    public static final UUID MAC_UUID = UUID.fromString("00002A23-0000-1000-8000-00805f9b34fb");

    private final static UUID[] characteristicUUIDList = {
            MANUFACTURER_Name_UUID,
            SN_UUID,
            MODEL_NAME_UUID,
            SOFTWARE_VERSION_UUID,
            FIRMWARE_VERSION_UUID
    };

    private int index = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        while(true) {
            if(alreadyConnected == false) {
                findGattDevice();
            }

            try {
                Thread.sleep(60000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

	//GATT连接回调接口
    BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {

            super.onConnectionStateChange(gatt, status, newState);
            if (newState == BluetoothProfile.STATE_CONNECTED) {
                //GATT连接成功
                Log.i(TAG, "GATT connect success");
                alreadyConnected = true;
                if(gatt != null) {
                    gatt.discoverServices();
                }
            } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
                //GATT连接断开
                Log.i(TAG, "GATT disconnect");
                closeGatt();
            }
        }

        @Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {

            super.onServicesDiscovered(gatt, status);
            Log.i(TAG, "onServicesDiscovered status:" + status);
            if (status == BluetoothGatt.GATT_SUCCESS) {
                //根据uuid获取指定的service
                mGattService = gatt.getService(DEVICE_INFO_SERVICE_UUID);

                if (mGattService == null) {
                    Log.i(TAG, "service is null, disconnect GATT");
                    closeGatt();
                    return;
                } else {
                    Log.i(TAG, "find service!");
                }

                //根据uuid获取指定的characteristic
                mGattCharacteristic = mGattService.getCharacteristic(characteristicUUIDList[0]);

                if (mGattCharacteristic == null) {
                    Log.i(TAG, "characteristic is null");
                    closeGatt();
                    return;
                } else {
                    //读取蓝牙特征值
                    Log.i(TAG, "start read characteristic");
                    mBluetoothGatt.readCharacteristic(mGattCharacteristic);
                }

            } else {
                Log.i(TAG, "onServicesDiscovered status false");
                closeGatt();
            }
        }

        @Override
        public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            super.onCharacteristicRead(gatt, characteristic, status);
            if (status == BluetoothGatt.GATT_SUCCESS) {
                String value = new String(characteristic.getValue()).trim().replace(" ", "");
                Log.i(TAG, "read data:" + value);

                if(mGattService == null) {
                    Log.i(TAG, "service is null, disconnect GATT");
                    closeGatt();
                    return;
                }

                index ++;
                if(index < characteristicUUIDList.length) {
                    mGattCharacteristic = mGattService.getCharacteristic(characteristicUUIDList[index]);
                } else {
                    closeGatt();
                    return;
                }

                if (mGattCharacteristic == null) {
                    Log.i(TAG, "characteristic is null");
                    closeGatt();
                    return;
                } else {
                    //读取蓝牙特征值
                    Log.i(TAG, "start read characteristic");
                    mBluetoothGatt.readCharacteristic(mGattCharacteristic);
                }
            } else {
                Log.i(TAG, "onCharacteristicRead status false");
                closeGatt();
            }
        }

        @Override
        public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            super.onCharacteristicWrite(gatt, characteristic, status);
            Log.i(TAG, "onCharacteristicWrite:" + characteristic.getUuid().toString());
        }
    };

	//查找是否有已连接的BLE设备
    private void findGattDevice() {
        Log.i(TAG, "findGattDevice start");
        BluetoothManager bluetoothManager = (BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE);
        List<BluetoothDevice> connectedList = bluetoothManager.getConnectedDevices(BluetoothProfile.GATT);
        if(connectedList == null) {
            Log.i(TAG, "connectedList is null");
            return;
        }
        int i = 0;
        Log.i(TAG, "connectedList size:" + connectedList.size());
        while(connectedList.size() > i) {
            BluetoothDevice bluetoothDevice = connectedList.get(i);
            if(bluetoothDevice != null) {
                Log.i(TAG, "find device:" + bluetoothDevice.getName());
                try {
                	//建立GATT连接
                    mBluetoothGatt = bluetoothDevice.connectGatt(this, false, mGattCallback);
                } catch (Exception e) {
                    Log.i(TAG, "findGattDevice e:" + e.getMessage());
                }
            }
            i++;
        }
    }

	//关闭GATT连接
    private void closeGatt() {
        Log.i(TAG, "closeGatt start");
        alreadyConnected = false;
        mGattService = null;
        mGattCharacteristic = null;
        index = 0;
        if(mBluetoothGatt != null) {
            Log.i(TAG, "closeGatt do close");
            try {
                mBluetoothGatt.disconnect();
                mBluetoothGatt.close();
            } catch (Exception e) {
                Log.i(TAG, "closeGatt e:" + e.getMessage());
            }
            mBluetoothGatt = null;
        }
    }
}

在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"/>

监听广播方式代码实现

todo

Android 蓝牙4.0(BLE)开发实现对蓝牙的写入数据和读取数据 由于最近学校组织了一个移动APP(安卓)设计大赛,自己也学习安卓有一段时间了,就跟同学商量一起去参加试试,一拍即合,然后我们就开始想idea,因为最近可穿戴设备比较火,我们也就想试试。经过商量,我负责Android上位机的开发,同学负责下位机的开发。 上位机的开发主要是低功耗蓝牙BLE的开发,然后就开始找资料,各种找,最后谷歌官方提供的demo还有其他网友基于官方demo修改的demo,结合网上 阅读详情

相关推荐

Ble蓝牙开发详解

蓝牙主要分为两种:经典蓝牙和低功耗蓝牙 Ble简介 低功耗蓝牙4.0只有android4.3或4.3以上才支持 1、BLE蓝牙4.0核心profile,主要特点是快速搜索,快速连接,超低功耗保持连接和数据传输,缺点:数据传输速率低,BLE蓝牙一包数据最多为20字节,因此安卓系统下最好不要使用BLE蓝牙传输大量数据,由于其具有低功耗特点,所以经常用在可穿戴设备之中。 2、Profile: 蓝牙规范,...

qq_36159785的博客 5060

关于android读取BLE设备信息

研究了半个月的扫描蓝牙设备信息,从开始的不明白为什么读取不到任何的信息,到后来慢慢的深入,中间走了很多的弯路,总结一下,以后的自己遇到不至于忘了这会测试的一切。 1、开始使用的是旧的apimBluetoothAdapter.startLeScan(mLeScanCallback)启动的扫描,发现在一些设备上面运行很正常,可能运行一天也不会中断,其中在6.0的机子上面运行,总会出现一段时间的中断,

u010419173的博客 2316

Android 低功耗蓝牙BLE连接通信

简介 蓝牙(Bluetooth®):是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换(使用2.4—2.485GHz的ISM波段的UHF无线电波)。蓝牙技术最初由电信巨头爱立信公司于1994年创制,当时是作为RS232数据线的替代方案。蓝牙可连接多个设备,克服了数据同步的难题。 蓝牙 4.0 蓝牙技术联盟于2010年6月30日正式推出蓝牙核心规格4.0 。它包...

hwx865的专栏 3160

android BLE蓝牙RSSI数据的读写

获取RSSI 无非就两种方法,一是在扫描回调时读取,二是在BLE连接之后读取,两种方法都比较简单,关键在于对蓝牙BLE的认识。那我首先就介绍下在 扫描回调时怎么去读。因为通常情况下,我们扫描时的设备及信息都是放在界面上,我就拿这个来说吧, 以呈现在列表上为例,首先 适配器的创建在创建适配器的时候,要加入 addDevice()方法 public ArrayList<BluetoothDevice

成长的味道 8760

Android BLE 蓝牙通信库

然后根据自定义的协议,解析对应的 BeaconItem 中的 bytes,首先创建一个 BeaconParser,传入对应的 BeaconItem,然后根据协议不断读取数据, 如果协议中某个字段占 1 个字节,则调用 readByte,若占用两个字节则调用 readShort,如果要取某个字节的某个 bit 则调用 getBit。// 获取第 1 字节的第 1bit。可以在广播中携带设备的自定义数据,用于设备识别,数据广播,事件通知等,这样手机端无需连接设备就可以获取设备推送的数据。

2401_89190668的博客 1171

Android BLE 蓝牙开发-扫码枪集成

  一、蓝牙模式HID与BLE   当扫码枪与手机连接时,通常采用的是蓝牙HID(Human Interface Device)模式。本质上是一个把扫码枪作为一个硬件键盘,按照键盘协议把扫码后的结果逐个输入到对应的控件上。   优点:无需开发集成,配对就可以立即作为键盘输入使用。可以使用输入框等组件直接接收扫码结果。   缺点:对非数字支持不佳,与输入法相关,在某些时候会触发英文联想-_-||,与虚拟键盘会发生冲突,连接扫码枪时需要切换键盘输入法输入。   而我们要扫描的标签,不仅有英文,特殊符号,

锅叔的博客 3419

Android和iOS如何连接指定的蓝牙设备

在BLE4.0时代,蓝牙得到了很广泛的应用,为了满足一些指定场景,需要手机端直接去连接指定的蓝牙设备,这里有个巧妙的方法可以供大家使用,目前在很多共享产品就是这样的方案进行的;在Android设备上,连接指定的设备就是要知道设备的deviceID,也就是MAC地址,如何知道呢,一般就是将指定的地址自己广播出来,这样,当你的已知MAC地址进行对比,就知道要连接那个设备了;直接连接就是;在IOS设备,...

农夫!~!布谷鸟 5678

Android蓝牙BLE之RSSI读写(2)

第二种方法就是连接后读取rssi 废话不多说,代码奉上 import com.example.readblerssi.R; import com.readrssi.ble.BluetoothOperate; import android.annotation.SuppressLint; import android.app.Activity; import android.bluetooth

Fan 6903

Android Ble蓝牙App(五)数据操作

关于低功耗蓝牙的服务、特性、属性、描述符都已经讲清楚了,而下面就是使用这些知识进行数据的读取、写入、通知等操作。

晨曦 7673

android ble蓝牙接收不到数据_Android BLE蓝牙开发-读写数据 获取UUID

最近在做一个蓝牙智能锁的项目,需要在Android APP 上使用 Ble低功耗蓝牙 和单片机蓝牙设备进行通信,网上关于搜索 连接 读写数据的资料太多了,我在最后放了一个Demo,完整实现搜索 连接 读写数据,在文章结尾重点说一下UUID首先:1.BLE介绍BLE是Bluetooth Low Energy的缩写,又叫蓝牙4.0,区别于蓝牙3.0和之前的技术。BLE前身是NOKIA开发的Wibr...

weixin_36150816的博客 2103

【BlueDroid】【BLE】Android BLE 蓝牙开发入门解析

BluetoothAdapter 拥有基本的蓝牙操作,例如开启蓝牙扫描,使用已知的 MAC 地址 (BluetoothAdapter#getRemoteDevice)实例化一个 BluetoothDevice 用于连接蓝牙设备的操作等等。代表一个远程蓝牙设备。这个类可以让你连接所代表的蓝牙设备或者获取一些有关它的信息,例如它的名字,地址和绑定状态等等。这个类提供了 Bluetooth GATT 的基本功能。例如重新连接蓝牙设备,发现蓝牙设备的 Service 等等。

风云说通信 1964

android 获取蓝牙版本,Android 蓝牙BLE开发详解

蓝牙是一种短距离的无线通信技术,可以实现固定设备、移动设备之间的数据交换。一般将蓝牙分为两大类,蓝牙3.0规范之前的版本称为传统蓝牙,蓝牙4.0规范之后的版本称为低功耗蓝牙,也就是常说的BLE(Bluetooth Low Energy)。本文主要讲解的是Android设备与BLE设备之间的通信,Android 从4.3版本(API Level 18)开始支持BLE通信。看图说话: 首先要判断当前...

weixin_28909441的博客 3652

JAVA + 海康威视SDK + FFmpeg+ SRS 实现海康威视摄像头二次开发

海康威视SDK接入方案摘要 本文介绍了使用海康威视官方SDK开发物联网平台摄像头接入功能的完整方案。系统采用Java后端集成HCNetSDK控制摄像头,通过FFmpeg将RTSP流转为RTMP推送到SRS流媒体服务器,前端基于HTTP-FLV协议实现视频播放。文章详细说明了开发准备工作,包括SDK下载、SRS部署、FFmpeg安装等关键步骤,并提供了数据库表设计和接口定义。核心部分展示了如何集成海康SDK,包括提取必要代码、加载DLL文件、配置打包插件等具体实现细节,最终形成了一套支持实时预览、回放和下载的

2401_83057947的博客 2262

STM32与BLE蓝牙通信 Android APP配置(二)

事务的难度远远低于对事物的恐惧 0.前言 在 Android BLE蓝牙配置全流程(一) 附APP源码 中已经完成了前期的准备工作,在这里我们得到了需要连接的蓝牙设备的名字和地址,需要完成蓝牙设备的连接和数据传输功能。 1.初始化界面 首先需要完成对这个界面包含的控件进行初始化,代码如下: private TextView text1, text2; private EditText editText; private Button btn_send; private String status = "

weixin_44355077的博客 4775

360可视门铃双摄版数据恢复实战:BIN文件解析与视频重组

本文详细解析了360可视门铃双摄版BIN文件的数据恢复过程,包括文件结构分析、双摄像头数据存储机制及视频重组技术。通过Python开发环境和FFmpeg工具链,成功实现了H.265视频流的解析与重组,为智能家居设备数据恢复提供了实用解决方案。

weixin_29196891的博客 908

十一种室内定位传感器方案汇总介绍与对比(机器人、物联网领域)

室内定位传感器方案汇总 目录 室内定位传感器方案汇总 1、定位方案概述 1.1、内定位系统有最基本的5种算法: 1.2、常用的室内定位技术主要包括以下几种: 1.3、定位理论 1.4、不同的定位方案对比 2、各种定位方案详细介绍 2.1、单线激光定位 2.2、多线激光定位: 2.3、视觉定位: 2.4、基于射频识别(RFID)技术室内定位 2.4.1、RFID标签(不涉及...

JK-Cool的博客 3万+

android 蓝牙4.0通讯,Android BLE4.0通信之计步、体重、血压

public classBluetoothLeService extendsService {privateBluetoothManager mBluetoothManager;privateBluetoothAdapter mBluetoothAdapter;privateString mBluetoothDeviceAddress;privateBluetoothGatt mBluetooth...

weixin_39549936的博客 224

检索增强世界模型(R-WoM)原理与应用实践

世界模型是AI系统理解环境的核心技术,通过构建环境的内部表示实现状态预测和行动规划。传统方法基于RNN或VAE等神经网络,而检索增强世界模型(R-WoM)创新性地引入检索机制,结合外部记忆库提升系统性能。这种架构突破模型参数限制,使AI能像人类一样利用历史经验解决问题,在游戏AI、虚拟助手等场景表现优异。关键技术包括FAISS相似性搜索、分层记忆管理和动态检索策略,其中Transformer编码器和GRU动态模型的组合实现高效环境建模。实践表明,该方法可提升47%的战术多样性,加快32%的应急响应速度。

weixin_42676876的博客 341

Android蓝牙基础框架使用详解

研究了一段时间的蓝牙使用,发现网上相关的资料比较贫乏,不像其他 Android相关资料那么齐全,基本上大部分资料都是在蓝牙联盟SIG 提供的官网 https://www.bluetooth.com/zh-cn/specifications 上查找得到,也没有一个比较稳定好用的基...

chuanao8829的博客 152

VSAN闪存缓存磁盘故障处理指南-RAID0模式实战解析

本文详细解析了VSAN集群中RAID0模式下的闪存缓存磁盘故障处理全流程。通过模拟真实故障场景,从告警识别、数据重建策略到磁盘组重构,提供了手把手的实战操作指南,并深入探讨了RAID0缓存故障的独特影响与风险,为运维人员应对此类高性能存储架构的突发问题提供了专业解决方案。

assembly8low的博客 444

39、高频 LLC 谐振转换控制系统动态优化算法分析与研究

本文针对高频下LLC谐振转换器动态性能差的问题,提出一种基于谐振电容器充放电估计动态切换时间的优化控制算法。通过改进状态轨迹控制方法,突破传统算法在谐振频率与开关频率相等条件下的限制,并结合新型采样策略有效抑制电压过冲。算法在MATLAB和SABER中完成仿真验证,并搭建基于STM32F407的原型系统进行测试,结果表明该方法显著缩短动态响应时间,提升系统稳定性。研究为高频、高功率密度开关电源的动态优化提供了可行解决方案。

linux6sysadmin的博客 111

FastBle蓝牙数据读取终极指南:如何高效实现BLE设备数据读取

FastBle是一个专为Android平台设计的**蓝牙低功耗(BLE)快速开发框架**,它简化了蓝牙BLE设备的连接、扫描、数据读写等操作。在BLE开发中,数据读取是获取设备信息、传感器数据等关键功能的核心环节。本文将深入解析FastBle框架中的BleReadCallback,帮助开发者掌握高效的数据读取实现方法。 ## 🔍 什么是BleReadCallback? **BleReadCa

gitblog_01038的博客 391

YOLO26科研升级:BiFPN双向特征金字塔,让多尺度特征融合精度再突破

在目录下,新建AddModules文件夹,将bifpn.py放入其中。

LXY_LOVE36的博客 558

Android BLE 快速上手指南

原文地址 本文旨在提供一个方便没接触过Android上低功耗蓝牙(Bluetooth Low Energy)的同学快速上手使用的简易教程,因此对其中的一些细节不做过分深入的探讨,此外,为了让没有Ble设备的同学也能模拟与设备的交互过程,本文还提供了中央设备(central)和外围设备(peripheral)的示例代码,只需2部手机大家就可以愉快的“左右互搏”了。 准备工作 角色 上面我们提到了中...

weixin_33912638的博客 300

Cadence 开发合集【总目录】

专栏主要介绍Cadence原理图和PCB信号完整性电源完整性仿真相关的内容,更加注重实操,以帮助大家轻松上手并不断提高;在开始专栏的更新前,博主先列出专栏的大纲,以供大家参考。大家直接点击大纲中的蓝色标题即可轻松传送。 ............

fydar的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android蓝牙BLE开发

这篇文章是本人这几天对BLE开发基础的大概总结

weixin_51890646的博客 8207

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

上一篇: 使用ContentProvider实现应用间数据共享
下一篇: 网络问题常用排查方法
Jason_Flash
博客等级 码龄7年 1万+粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值