Android - BlueTooth BLE 之 Central 与 Peripheral

2023-11-13

一.前言

Andorid 5.0 之前是无法进行 外围设备开发的,在Android 5.0 API 21 android.bluetooth.le包下,新增加 Scaner相关类和 Advertiser 相关类。目前最后使用Scanner相关类实现蓝牙扫描。这段时间对蓝牙的学习与理解,对中心设备与周边设备做下面总结。

先看下 android.bluetooth.le 包下内容:

这里写图片描述

1. Android BLE 周边设备 (Peripheral)可以通过 Advertiser 相关类实现操作; 
2. Android BLE 中心设备 (Central)可以通过 Scanner相关类实现蓝牙扫描; 
3. Android BLE 建立中心连接的时候,使用 BlueToothDevice#connectGatt() 实现

如果你对 Central 与 Peripheral 理解的话,就移步下面文章 !

Android 5.0 BLE 实现中心与外围设备 (待更…)


二. Central 和 Peripheral

1. 蓝牙通信规则

Bluetooth BLE 的交互有两个角色 : Central 与 Peripheral 。可以对比传统的CS结构,理解为客户端-服务端结构。

  • 服务端 (外围设备): Peripheral 通常具有其他设备所需要的数据,即数据提供服务;
  • 客户端(中心设备):Central 通常通过使用Perpheral 的信息来实现一些特定的功能 ;

    例如 : 如下图所示,心跳监听器提供心跳数据,在你的其他设备的app上 需要以用户友好的方式显示用户的心跳信息。

    (来源于网络) 

    这里写图片描述

2.Central 发现并连接广播中的 Peripheral

在BLE中 ,Peripheral 通过广播的方式向Central提供数据是主要方式。主要操作如下:

  • 服务端 外围设备(Peripheral): 向外广播数据包(Advertising)形式的数据,比如设备名称,功能等!
  • 客户端 中心设备(Central ) : 可以通过实现扫描和监听到广播数据包,并展示数据。

如图所示 :

(图片来源于网络) 
这里写图片描述

例如 :

温度传感器设备会向外广播它获取到的温度信息

3. 外围设备(Peripheral )数据如何构成

Peripheral 包含一个或者多个Service(服务)以及有关其连接信号强度的有用信息 。

  • Service :是指为了实现一个功能或者特性的数据采集和相关行为的集合,包含一个或多个特征(Characteristic)。

  • Characteristic :它包括一个value和0至多个对次value的描述(Descriptor),知道更多数据细节。

  • Descriptor : 对Characteristic的描述,例如范围、计量单位等

如图所示:

这里写图片描述


三. Central 与 Peripheral 交互总结

在 Central 与 Perpheral 建立连接后,就可以发现(discoverServicesPerpheral 提供的所有的ServicesCharacteristic 。然后,Central 可以通过读写Service中的Characteristic 的valuePerpheral进行交互。

以Android 开发举例 :

I . Central (中心设备)开发流程

  1. 建立中心角色 
    确定中心角色,客户端确立。

  2. 扫描 外设 
    扫描设备:Android 5.0 以下使用 BluetoothAdapter#startLeScan() 实现扫描,Android5.0及其以上,使用android.bluetooth.le 包下 BluetoothLeScaner#startScan()实现。

  3. 建立连接 
    中心设备主要的类 BluetoothGatt 核心对象,通过 BlueToothDevice#connectGatt() 可以获取到操作对象

  4. 获取services与characteristics 
    在连接设备的时候,会使用BluetoothGattCallback 进行一些数据返回和状态返回,当连接成功时,进行discoverservices ,比如

    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        if (newState == BluetoothGatt.STATE_CONNECTED) {
            gatt.discoverServices();
        }
        @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {
        super.onServicesDiscovered(gatt, status);
        //当调用 discoverServices的时候,会调用此方法
        printServices(gatt);
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  5. 与外设设备交互和订阅 Characteristic 通知
  6. 断开连接 
    代码如下:

    public void disconnect() {
        if (mBluetoothGatt != null) {
            mBluetoothGatt.disconnect();
            mBluetoothGatt.close();
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

II . Peripheral(外围设备)开发流程

  1. 确定外围设备

  2. 初始化外围设备管理对象 
    Android 5.0 之前没有外围设备开发,目前使用 BluetoothLeAdvertiser 进行外围设备管理;可以通过下面的方法获取 BluetoothAdapter#getBluetoothLeAdvertiser() 可以获取到该对象。

  3. 打开外围广播 
    根据SERIVE_UUID,打开一个外围设备连接,通过下面类实现BluetoothLeAdvertiser#startAdvertising();

  4. 获取外围设备Server 
    通过BluetoothGattServer 进行订阅通知,读写Characteristic操作,通过下面方法获取。 
    mBluetoothManager.openGattServer(mContext, bluetoothGattServerCallback)


四.参考文档

IOS Core Bluetooth 蓝牙通信

https://developer.android.google.cn/reference/android/bluetooth/le/AdvertiseData.html

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LABLENET/article/details/54924157
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android - BlueTooth BLE 之 Central 与 Peripheral 的相关文章

  • 如何为ScrollView放置固定图像背景?

    我应该想要滚动视图滚动 而不是背景中的图像 将图像添加到滚动视图框架之前的视图层次结构的较高位置
  • Android Studio 3.0 Canary 9 - 无法解析包

    我在 Android Studio 3 0 Canary 9 中遇到几个错误 这些错误是 无法解析 android 软件包 下面列出了一些错误 我刚刚安装了 SDK 的所有额外软件包 但仍然收到 gradle 构建错误 Error 82 1
  • 类型容器“Android 依赖项”引用不存在的库 android-support-v7-appcompat/bin/android-support-v7-appcompat.jar

    我在尝试在我的项目中使用 Action Bar Compat 支持库时遇到了某种错误 我不知道出了什么问题 因为我已按照此链接中的说明进行操作 gt http developer android com tools support libr
  • Android - 从资产中解析巨大(超大)JSON 文件的最佳方法

    我正在尝试从资产文件夹中解析一些巨大的 JSON 文件 我如何加载并添加到 RecyclerView 我想知道解析这种大文件 大约 6MB 的最佳方法是什么 以及您是否知道可以帮助我处理此文件的良好 API 我建议您使用GSON lib h
  • SearchView过滤ListView

    我已经实现了搜索视图来过滤我的列表视图项目 当我输入任何文本时 它会过滤列表 但当我退出搜索视图时 它不会返回原始列表项 public class PlacesListAdapter extends ArrayAdapter
  • CollapsingToolBarLayout - 状态栏稀松布颜色不改变

    几天前我更新了我的 android studio 并开始使用 CoordinatorLayout 和 CollapsingToolbarLayout 只是尝试一些东西 工具栏稀松布颜色似乎覆盖了状态栏初始颜色和状态栏稀松布颜色 从 xml
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • Android SIP 来电使用带有广播接收器的服务

    大家好 其实我正在尝试创建一个应用程序 支持基于 SIP 通过互联网进行音频呼叫 这里使用本机 sip 我遇到了来电问题 我已经完成了服务的注册部分 但是在接听电话时我无法接听电话 请帮助我 Service file package exa
  • 是否必须删除 Intent extra?

    这可能是一个愚蠢的问题 但是是否有一条规则规定消费活动必须显式删除 Intent 额外内容 或者只有在回收 Intent 对象时才如此 换句话说 如果我总是通过执行以下操作来链接到下一个活动 Intent i new Intent MyCu
  • 如何使用 Cordova 获取当前安装的应用程序的版本?

    我已经找到了应用程序可用性插件 https github com ohh2ahh AppAvailability它主要检查用户是否在其设备上安装了某个应用程序 是否有可能获得应用程序的当前版本 开发者名称 重要 以及所有可能的信息 一般来说
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 在gradle插件中获取应用程序变体的包名称

    我正在构建一个 gradle 插件 为每个应用程序变体添加一个新任务 此新任务需要应用程序变体的包名称 这是我当前的代码 它停止使用最新版本的 android gradle 插件 private String getPackageName
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 获取当前 android.intent.category.LAUNCHER 活动的实例

    我创建了一个库项目 并在多个应用程序之间共享 我实现了一个简单的会话过期功能 该功能将在一段时间后将用户踢回到登录屏幕 登录屏幕活动是我的主要活动 因此在清单中它看起来像这样
  • Ubuntu 16.04 - Genymotion:找不到 /dev/hw_random

    I install Genymotion on the Ubuntu 16 04 64Bit I created a virtual emulator for Android 6 0 then I run this emulator but
  • 我想实现下面的布局,按钮应该在屏幕底部,当惰性列被填充时,按钮不应该出去

    顶部有惰性列 惰性列下方有输入电话号码布局并从电话簿布局添加联系人 我希望当未添加联系人时此布局位于顶部 当我添加大量联系人时输入电话号码并添加电话簿布局中的联系人会随着惰性列滚动并移出屏幕 我不让他们走出屏幕 当接触较多时 它们必须粘在底
  • 如何根据 gradle 风格设置变量

    我想传递一个变量test我为每种风格设置了不同的值作为 NDK 的定义 但出于某种原因 他总是忽略了最后味道的价值 这是 build gradle apply plugin com android library def test andr
  • Android 套接字和 asynctask

    我即将开始制作一个应该充当 tcp 聊天客户端的应用程序 我一直在阅读和阅读 我得出的结论是最好 如果不需要 将我的套接字和异步任务中的阅读器 问题是我不确定从哪里开始 因为我是 Android 新手 这至少对我来说是一项艰巨的任务 但据我
  • 在activity_main.xml中注释

    我是安卓新手 据我所知 XML 中的注释与 HTML 中的注释相同 使用 形式 我想在 Android 项目的 Activity main xml 配置文件中写一些注释 但它给了我错误 值得注意的是 我使用的是 Eclipse 但目前 我直
  • 强制 Listview 不重复使用视图(复选框)

    我做了一个定制Listview 没有覆盖getView 方法 Listview 中的每个项目都具有以下布局 联系布局 xml

随机推荐

  • 位运算说明

    文章目录 参考文档 表格 来自百度百科 按位与运算符 按位或运算符 异或运算符 取反运算符 左移运算符 lt lt 右移运算符 gt gt 无符号右移运算符 gt gt gt 复合赋值运算符 不同长度的数据进行位运算 参考文档 百度百科 h
  • Windows记事本编码反汇编分析

    转载自 liam page 网上有一个流传多年的段子 这个段子大致是说 若你在简体中文版本的 Windows 系统下 用系统自带的记事本程序 以默认的 ANSI 编码保存 联通 两个字 那么重新打开后 联通 二字就消失了 如果我没记错的话
  • 【JDBC】idea添加mysql-jar包(很轻松)

    添加jar包 官网下载jar包 idea导入jar包 检查 官网下载jar包 官网地址 MySQL Download Connector J 下载完之后解压 打开文件夹 直到见到我们需要的jar包 idea导入jar包 我们复制刚才下载好的
  • 【ERROR】AssertionError: The NVIDIA driver on your system is too old (found version). Please upd

    错误信息 AssertionError The NVIDIA driver on your system is too old found version 10000 Please update your GPU driver by dow
  • spark boot封装,多线程高效执行

    1 简介 众所周知 spark是一个分布式计算引擎 可以将计算数据分不到不同的节点进行计算 但是往往我们的业务都是比较复杂 每天定时跑的时候不只是一个job 可能是有很多的job 但是引擎本身是串行化的 而且对于经验不深的同学 一个业务可能
  • redis中关闭rdb跟aof

    当往redis中导入数据时 有时会出现redis server went away的情况 出现这一问题的原因有 导入的数据量太大 而内存不够 即内存1G 但数据有2G 此时的redis服务需要重启 可能是同一时间导入的数据太多 导致数据持久
  • CSS实现半透明边框

    CSS3实现半透明边框 一 往期文章 二 CSS hsla 函数 四 代码 三 效果图 一 往期文章 CSS3回炉计划 编码技巧 如何实现半透明边框 边框中显示背景 二 CSS hsla 函数 hsla 函数使用色相 饱和度 亮度 透明度来
  • 6.130 字符串指针和字符数组的区别

    字符串指针 1 字符串指针变量存储在栈区 其指向的字符串存储在常量区 2 字符串指针变量存储的字符串首字符的地址 并非整个字符串 3 不能对指向的字符串做任何修改 char 本质为 char const 4 字符串指针变量可以做 操作 字符
  • sed的一些用法总结

    一 sed删除中文 LANG C sed r e s x81 xFE x40 xFE g e s g e s g 删除 中文 和 和 面LANG C要加上否则报错 sed后面要使用双引号 区别使用单引号 x81 xFE x40 xFE 代表
  • 我国常用的投影坐标系_ArcGIS中的坐标系

    点击上方 蓝字 带你去看小星星 今天将解决以下问题 1 分清地理坐标系和投影坐标系 2 什么地区选什么带号 3 如何使用有关 坐标系 的三个工具 今天的内容有点多 咱一次性说明白 可以先收藏 之后遇到再翻也方便 暗示收藏 转发 再看 Arc
  • 关于蓝桥杯的乱七八糟的话(经验、心得、建议、技巧)

    参赛经验 心得 先介绍一下自身情况 我参加的是C C B组 所在的赛区是江苏赛区 参加过三次蓝桥杯 最好的成绩是国三 没错我就是个小辣鸡 蓝桥杯省赛题目一般有结果填空 代码填空和程序题三种题型 但是第十届已经没有了代码填空 填空题只要结果
  • leaftlet 中Polygon的使用属性

    绘制一个面 var latlngs 37 109 05 41 109 03 41 102 05 37 102 04 var polygon L polygon latlngs color red addTo map map fitBound
  • videopose3d制作自己的视频转换

    videopose3d制作自己的视频转换 最近学了深度学习 对其中的人体姿态检测和识别感兴趣 但是网上包括官方网站的都是对源码的解读 没有一个是利用自己的视频进行姿态检测和渲染的 因此自己试着按照官方的in the wild教程试了一下 很
  • Python开发图形可视化界面程序(一)

    前言 近来使用Python开发了一些简单的辅助脚本 发现这真的是一门很有趣的语言 于是乎 便想着使用python来开发一些具有图形可视化界面 GUI 的程序 对于python来说 支持其开发GUI可视化程序的框架非常之多 简直让人眼花燎原
  • bugfree pdo mysql扩展模块_windows平台bugfree3.0.3搭建心得(nginx+php+mysql+bugfree+RunHiddenConsole)...

    之前没做过windows服务器管理 我的认识还停在个人用户操作系统的认知上 这次搭建bugfree环境 挺多麻烦的 在安装之前 我百度的bugfree搭建大多是使用xampp集成环境的安装方法 然后我就照做 下载xampp 然后安装到系统c
  • C语言实现两数相加的三种方法

    笔试题里面看到的 总结一下 分享给需要的小伙伴 一 原始办法 这种方法最直观明了 int add int x int y return x y 二 利用printf的返回值 这个操作鲜为人知 include
  • linux域名解析

    linux域名解析 首先确保你的电脑可以连上网 服务端和客户端能够连通 1 本地解析 优先级高 在服务端中 ping www baidu com 找出ip 在客户端中的浏览器中搜索ip地址就可以上网 但是ip地址记起来非常不方便 所以这里用
  • 网贷风控体系之-风控模型

    网贷风控体系之 风控模型 大数据风控模型主要分为两类 反欺诈模型 交叉验证 聚类分析 黑灰名单 二元好坏模型 准入阶段 授信额度期限利率模型 评分卡模型 LR XGBoost 贷中阶段 风险变化评估 风险预警 贷后阶段 催收时机 催收方法
  • TVM:源码编译安装

    TVM Linux源码编译安装 笔者环境 OS Ubuntu 18 04 CMake 3 10 2 gcc 7 5 0 cuda 11 1 编译安装过程总览 本文将简介 tvm 的编译安装过程 包含两个步骤 通过C 代码构建共享库 设置相关
  • Android - BlueTooth BLE 之 Central 与 Peripheral

    一 前言 Andorid 5 0 之前是无法进行 外围设备开发的 在Android 5 0 API 21 android bluetooth le包下 新增加 Scaner相关类和 Advertiser 相关类 目前最后使用Scanner相