从客户端登陆服务器的配置文件,BLE模式和配置文件

BLE模式和配置文件(原文)

本文档探讨了BLE如何工作,特别是如何将两种BLE模式(连接和广告)用于不同的目的。

外围设备和中央设备vs服务器和客户端

当我们通过BLE连接设备时,我们将它们视为外设(从设备)设备或中央(主设备)设备。 蓝牙标准建立了该区分方式以匹配设备上可用的资源:

主设备/中央

通常将具有更多的计算资源和可用能量 - 例如计算机或平板电脑。

从设备/外设

一个mbed设备 - 将在计算资源和能源两个方面受限制。

目前,mbed的BLE_API支持创建外设。 我们计划尽快将其扩展到中央设备。

BLE使用两个附加术语来描述连接实体 - 服务器和客户端:

服务器

该设备具有希望共享的信息,且对于BLE而言通常是外设(如mbed板子)。

客户端

需要信息和服务的设备,且对于BLE而言通常是中央设备 - 例如电话。

在讨论信息交流时,我们使用术语服务器和客户端 。 我们使用中央和外设来表示BLE连接的起点和目标。 中央作为客户端连接,外围设备作为服务器并不罕见。

clientserver.png

服务器和客户端

mbed板是服务器或外设;手机是客户端和中央设备“)

启动连接

中央启动,控制和结束连接 - 外设不能强制中央执行(扫描BLE设备,查看其信息,连接等)。 中央还决定询问外围设备的频度。 然而,外设可以向中央推荐一些东西。 有关这些决定的更多信息,请参阅连接参数部分 。

广告和连接模式

BLE使用的两种模式是:

广告模式

外设会发出该区域任何设备可以接收到的信息。 这是中央设备如何知道周围有外围设备的方式。

连接模式

外设和中央设备建立一对一的对话。 这就是他们如何交换复杂的信息的方式。

中央设备必须知道外围设备存在才能与之连接。 因此,外设将使用BLE 广告模式发布其存在。 在这种模式下,设备使用通用访问配置文件 (GAP)以稳定的速率发送一些信息 —— 一个广告。 这个广告是其他设备,像你的手机,接收到的。 它告诉他们附近有一个BLE设备存在,以及该设备是否愿意与他们交谈。

ConnModes.png

广告模式是一对多的,而连接模式是一对一的。

广告模式数据包大小非常有限。 GAP广播的一般数据包格式如下图所示:

GeneralStruct.png

BLE协议栈占用了47B数据包的一部分,直到我们的数据只有26B

每个BLE包可以包含最多47个字节(这不是很多),我们不能使用它们的全部:

为了自己的目的,BLE协议栈需要8个字节(1 + 4 + 3)。

因此,广告分组数据单元(PDU)最多具有39个字节。 但是BLE栈再次需要一些开销,占用8个字节(2 + 6)。

PDU的广告数据字段剩下31个字节,分为广告数据(AD)结构。 然后:

GAP广播必须包含告诉设备有关我们发送的广告类型的标志。 标志结构总共使用三个部分(一个用于数据长度,一个用于数据类型,一个用于数据本身)。 我们需要前两个字节(数据长度和类型指示)的原因是帮助解析器来使用我们的标志信息正常工作。 我们还剩下28个字节。

现在我们终于用自己的数据结构发送自己的数据了 - 但是它也需要一个长度和类型的指示(总共两个字节),所以我们只剩下26个字节。

所有这些意味着我们只有26B用于通过GAP发送的数据。

如果您想查看AD的示例,请参阅自定义GAP广告部分中的扩展说明。

对于许多应用,广告可能是需要的一切。 这可能是:

外围设备只想周期性地广播可以适应广告的少量信息。

无论身份验证如何,这些数据都可用于范围内的任何中央设备。

但是,有时候,您需要提供比单向数据传输更多的信息或更复杂的交互。 为此,您需要在BLE设备和用户的手机,平板电脑或计算机之间设置“对话”。该会话基于连接模式 ,其描述了仅两个设备之间的关系:BLE外围设备和中央设备。

目前,广告和连接模式还不能共存。 这是因为BLE外围设备一次只能连接到一个中央设备(如移动电话)。 连接建立的时刻,BLE外设将停止广告。 在这一点上,没有其他中央设备能够连接到它,因为如果它不广告,他们不能发现该设备在那里。 只有在第一个连接终止并且BLE外围设备再次开始广告之后,才能建立新的连接。

注意:最新的蓝牙标准允许广告并行连接,这将在2015年底之前成为mbed的BLE_API的一部分。

服务和配置文件(GATT)

为了使上述通信的功耗较低,BLE规范在连接模式下交换数据的方式施加了特定的结构。 它依赖于BLE外设维护客户端可以访问的状态变量数据库(如电池电量,温度和时间)的能力。 我们可以根据功能将状态变量分组到服务中。 例如,心率服务是状态变量的集合,包括心率测量和身体传感器位置。 这些状态变量的技术术语是“特征(Characteristics)”。 为了互操作性,每个特征(Characteristics)也包含了值类型的描述。 这样客户端就可以解释这个值,即使它们没有被特别编程来识别它。

Service.png

单一服务可以包含几个特征

服务,特征及其配套属性是连接方式的基本实体。 服务使用通用属性配置文件(Generic Attribute Profile,GATT)根据特征来组织信息。 我们将在下面更详细地探索特征。

我们将服务捆绑到一个配置文件中 。 例如,心率配置文件(Heart Rate Profile)包括两个服务 - 心率和设备信息(Heart Rate and Device Information),血压配置文件(Blood Pressure Profile)包括血压和设备信息(Blood Pressure and Device Information)服务。

heart_rate_profile.png

具有两个服务的示例配置文件

BLE已经有一段时间了,所以它有一些标准的服务,你可以进入。 回到我们的心率监测器的例子,心率服务是完善的,易于使用。 它可以从BLE心率监测器读取信息并将其发送到应用程序。 你会在稍后的编码示例中看到。

在开始研究项目之前,值得看看是否已经有可以完成所需功能的服务了; 它会节省大量的编码和测试时间。 您可以在这里找到可用的配置文件和服务列表。

特征和相互作用

服务将数据分解为特征 。 每个特征映射到单个数据点:它告诉你一件事,只有一件事。 例如, 设备信息服务具有以下特征:

DeviceInformationService.png

制造商名称

型号

序列号

硬件版本

固件版本

软件版本

系统ID

IEEE 11073-20601监管认证资料清单(regulatory certification data list)

这些特征中的每一个应该只包含其标签所包含的信息。 他们一起揭示设备的制造商信息,并组成一个完整的设备信息服务。 此服务本身捆绑在不同的配置文件中。

在mbed上创建一个特征非常简单,因为BLE_API为涉及服务定义的实体提供C++抽象。 例如,这里我们创建一个简单的特征,通知客户一个按钮的状态(按下/释放):

//button initial state

bool buttonPressed = false;

//read-only characteristic of type boolean,

//accepting the buttonState’s UUID and initial value

ReadOnlyGattCharacteristic buttonState(BUTTON_STATE_CHARACTERISTIC_UUID,

&buttonPressed);

有关mbed的特征创建的完整展示,请参阅我们的输入服务模板 。

特征完全由其声明,值和描述符定义:

声明包含有关特征的数据,例如其通用唯一标识符(UUID)。

值是特征的“有趣”部分:它是包含您正在查看和响应的数据的值。

** 描述符**不是强制性的; 您可以使用它来提供有关特征的更多信息或控制其行为。 例如,在使用通知时使用描述符。

特征可以是静态的(如设备的制造商名称)或动态的。 如果一个特征是动态的,当设备有新的信息时,您的设备可以为它生成一个新的值。 例如,在心率服务中, 当前心率是定期获得新值的特征。

以下是创建读/写特征(可以接收新值并显示其当前值的特征)的示例:

bool initialValueForLEDCharacteristic = false;

ReadWriteGattCharacteristic ledState(LED_STATE_CHARACTERISTIC_UUID,

&initialValueForLEDCharacteristic);

有关在mbed上创建读/写特征的信息,请参阅我们的执行器服务模板 。

一些特征是双向实体。 这意味着服务器(BLE外设)可以自己更新,也可以从客户端(手机)接收新的值。 这种双向流量使BLE具有交互性:用户向一个或多个特征发送新值,并且设备响应这些新值。 例如,当UriBeacon设备打开时,它进入临时配置模式(configuration mode) ,让我们有机会更新其特征的值(包含稍后公布的数据)。

对于每个特征,服务定义说明客户端是否有权写入该特征。 这是在外设上设置GATT服务器时完成的。 在我们的示例中, 配置模式(configuration mode)指出广告信息是可读/写的, 广告模式表示它是只读的。 因此,根据设备的模式,相同的特征可以具有两种不同的权限。

UUID

每个服务和特征都需要一个普遍唯一的标识符(UUID),它们在声明中列出(如上所述)。 对于BLE官方实体,UUID为16位,BLE站点上提供了完整的列表,以获取服务和特性 。 对于您自己创建的服务和特征,您将需要128位UUID; 您可以在UTI网站上生成。

有关UUID分配的更多信息,请参见我们的服务创建示例 。

配置文件,服务和特征的总结

因此,配置文件的完整拆分是:一个或多个服务,每个服务包含零个或多个特征,每个特征具有零个或多个描述符:

BLE_Profile_Breakdown.png

单个配置文件可以包含多个服务,并且每个服务可以包含几个特征

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563671.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

和preload_通过LD_PRELOAD绕过disable_functions

0x00 前言前段时间碰到拿到shell以后限制了basedir并且无法执行命令的情况,解决办法是上传恶意的.so文件,并通过设置LD_PRELOAD,然后调用新进程来加载恶意.so文件,达到绕过的效果。当时做这道题目的时候是跟着别人的题解直接套的(…

群晖服务器性能测试,对群晖DS716+进行性能测试_群晖 DS716+_企业存储技术与评测-中关村在线...

Iometer是一个工作在单系统和集群系统上用来衡量和描述I/O子系统的工具。可以被配置为模拟任何程序或者基准测试程序的磁盘和网络I/O的负载,或者用来产生整个综合的I/O负载。它也可以用来产生并测量单系统或者多系统(网络)的负载。在性能测试环节,我们采…

传播路由_什么路由器穿墙效果好?购买防骗知识

买无线路由器,首要辨识什么路由器穿墙效果好。面对市面上五花八门的路由器,很多小白在看到纷繁的参数就凌乱了,上了无良商家的当。小编觉得授人以鱼不如授人以渔,所以给大家写了一篇辨别什么路由器穿墙效果好的防入坑购买指南。我…

小程序消息服务器webapi,小程序订阅消息

# 小程序订阅消息# 功能介绍消息能力是小程序能力中的重要组成,我们为开发者提供了订阅消息能力,以便实现服务的闭环和更优的体验。 订阅消息推送位置:服务通知订阅消息下发条件:用户自主订阅订阅消息卡片跳转能力:点击…

php生成pdf中文断码_Rmarkdown导出中文PDF解决方案

Rmarkdown非常适合R语言使用者导出格式漂亮的文档,但是输出中文PDF的过程中会遇到各种麻烦的问题,本文整理了我的经验供大家参考。总的来说,通过Rmarkdown输出中文版pdf报告,要解决以下两个核心问题:导出PDF需要配置Te…

分数的大小比较优秀教案_人教版小学数学五年级下册异分母分数加、减法公开课优质课课件教案视频...

教学案例-《异分母分数加减法》教学目标:1.借助直观图形,在操作、观察、比较、的活动中理解异分母分数加减法的算理,掌握计算方法,并能正确进行计算。2.渗透转化、迁移的数学思想,积累研究分数问题的数学活动经验。3.能…

分号可以用来分段么_更高效的GMX分段模拟方法:修改tpr文件

■2020-11-01 22:42:18在以前的一篇文章中, 我简单说过基于GROMACS的分段模拟方法[1]. 这种方法非常通用, 几乎能完成任意的功能, 且无须修改源代码, 但是运行效率比较差, 因为每次运行mdrun都要重新生成tpr文件. 对大分子来说, 使用grompp生成tpr还是很耗时的, 可能会成为运行…

java list拷贝_深入了解浅拷贝与深拷贝

在学习深拷贝和浅拷贝之前&#xff0c;咱们先来一个例子&#xff1a;import java.util.ArrayList;public class MyBaby implements Cloneable {/*** 私有变量*/private ArrayList<String> list new ArrayList<>();Overrideprotected Object clone() throws CloneN…

放大镜_屏幕放大镜怎么样使用方法

首先&#xff0c;打开控制面板&#xff0c;然后找到并单击“显示”&#xff0c;然后启动放大镜。放大镜的放大倍率基于原始屏幕&#xff0c;而不是矢量放大倍率。有关放大镜的详细操作&#xff0c;请单击帮助按钮&#xff0c;其中有特定说明。捷径一&#xff1a;win 可以快速调…

mysql取消主键_mysql如何删除主键?

当一个表中设置了主键之后&#xff0c;如果想要删除主键了要怎么做&#xff1f;下面本篇文章就给大家介绍MySQL删除主键的方法&#xff0c;希望对你们有所帮助。首先我们来看看删除主键的语法&#xff1a;ALTER TABLE TABLE_NAME DROP PRIMARY KEY;在MySQL中删除主键要考虑两种…

公认音质好的耳机品牌_什么品牌蓝牙耳机音质比较好?2020五款HIFI音质蓝牙耳机推荐...

对于蓝牙耳机&#xff0c;绝大多数人的需求都是听音乐&#xff0c;同时也作为一个穿戴的修饰品。基于这些需求&#xff0c;在我们选择蓝牙耳机的时候&#xff0c;就会选择一些外观比较好看的时尚音乐蓝牙耳机&#xff0c;既有时尚的外观&#xff0c;又有较好的音质。那么现在有…

mysql取消操作系统_Linux下的MySQL简单操作(服务启动与关闭、启动与关闭、查看版本)...

小弟今天记录一下在Linux系统下面的MySQL的简单使用&#xff0c;如下&#xff1a;服务启动与关闭 启动与关闭 查看版本环境Linux版本&#xff1a;centeros 6.6(下面演示)&#xff0c;Ubuntu 12.04(参见文章末尾红色标注字体)MySQL版本&#xff1a;5.1.73查看MySQL服务的启动状态…

python日期转化成周数_[转]浅析使用python计算两个日期间隔天数﹑周数和指定若干天后对应的日期等...

>>> import datetime>>> help(datetime)http://docs.python.org/library/datetime.html查看2009年5月31日和2009年2月1日间隔多少天>>> d1datetime.date(2009,05,31)>>> d2datetime.date(2009,02,01)>>> d1-d2datetime.timedelta…

python笔记小白入门_Python 笔记:全网最详细最小白的Class类和实例详解

面向对象最重要的概念就是类(class)和实例(instance)&#xff0c;类是抽象&#xff0c;而实例(Instance)则是一个个具体的对象面向对象三大特点&#xff1a;封装、继承和多态class Animal(object):def __init__(self, name):self.name name # 初始化类变量def Dog(self): # 创…

java 字符串转dom对象_xml类型的字符串转换为Dom对象

我写这篇博客的目的是因为我在这一点转换方面耽搁了快2天时间&#xff0c;真是惭愧呀&#xff0c;dom4j.jar包有自带方法DocumentHelper.parseText(String text)用于将字符串类型的xml转换为Dom对象&#xff0c;从而进行下面的解析&#xff0c;还有一个关键是&#xff1a;产生字…

java nlpir_中科院NLPIR中文分词java版

摘要&#xff1a;为解决中文搜索的问题&#xff0c;最开始使用 版 SCWS &#xff0c;但是处理人名和地名时&#xff0c;会出现截断人名地名出现错误。开始使用 NLPIR 分词&#xff0c;在分词准确性上效果要比 SCWS 好。本文介绍如何在 系统下 JAVA &#xff0c;生成可以执行的 …

java怎编写么解析一个类型_DAY3:你必须知道的java虚拟机之类篇——类文件的结构...

马上过年啦&#xff0c;不知道大家今年有没有投资基金股票呢&#xff1f;是赚的盆满钵满还是拍断大腿&#xff0c;可以评论区一起交流交流&#xff0c;秀一秀哈哈&#xff0c;反正我是没来得及上车。暴富西不可能暴富的啦&#xff0c;打工人嘛几能写写文章啦&#xff5e;记得点…

java自学笔记_JAVA自学笔记(4)

发现JAVA的有趣Day1 继承不是"继承"1.0 继承的格式public classFU {public voidmethod(){System.out.println("Good night!");}}public class ZI extendsFU {}public classPractice {public static voidmain(String[] args) {ZI zinewZI();zi.method();}}打…

java分隔符算法_《Java数据结构和算法》栈 分隔符分配

分隔符包括“&#xff5b;“、"["、”(”、“] “、“)“、“&#xff5d;”&#xff0c;每个左分隔符需要右分隔符匹配。同时&#xff0c;在字符串中后出现左分隔符应该比早出现的先匹配。程序从字符串中不断读取字符&#xff0c;每次读取一个字符。若发现是左分隔符…

Java集合迭代器原理图解_Java Iterator接口遍历单列集合迭代器原理详解

这篇文章主要介绍了Java Iterator接口遍历单列集合迭代器原理详解,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下Iterator接口概述在程序开发中&#xff0c;经常需要遍历集合中的所有元素。针对这种需求&#x…