通过BLE实现类似UART的串行通信:NUS服务 vs GATT服务

在物联网和智能设备的发展中,蓝牙低功耗(Bluetooth Low Energy, BLE)技术已经成为无线数据传输的重要手段。本文将介绍通过BLE实现类似UART的串行通信,并对比NUS服务和GATT服务的使用场景,帮助开发者更好地选择适合的技术方案。

什么是UART?

UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种用于串行通信的硬件协议,常用于将数据从一个设备传输到另一个设备,比如从电脑传输到微控制器或传感器。

什么是BLE?

BLE(Bluetooth Low Energy,蓝牙低功耗)是一种无线通信技术,用于在设备之间传输数据,特点是低功耗和短距离通信。

BLE实现类似UART的串行通信

通过BLE实现类似UART的串行通信,意思是通过无线蓝牙连接,在两个设备之间传输数据,就像通过电线连接的UART那样。这种方式可以替代传统的有线连接,使用无线方式进行数据传输。

蓝牙特征服务(GATT Services and Characteristics)

蓝牙低功耗(BLE)使用通用属性配置文件(Generic Attribute Profile,GATT)来组织和定义数据。GATT包含服务和特征,每个服务和特征都有其特定的功能。

  1. 服务(Service)
    • 服务是一个逻辑集合,包含一组相关的特征。
    • 每个服务都有一个唯一的UUID(通用唯一标识符),用来标识它。
  2. 特征(Characteristic)
    • 特征是服务的基本组成部分,表示一个数据点或属性。
    • 每个特征也有一个UUID,并且包含一个或多个值和描述符。
    • 特征可以是可读的、可写的或支持通知和指示(当特征值改变时通知或指示中央设备)。

蓝牙NUS服务(Nordic UART Service)

蓝牙NUS服务是由Nordic Semiconductor公司定义的一个自定义服务,专门用于通过BLE实现类似UART的串行通信。

  1. NUS服务
    • NUS服务是一个自定义的GATT服务,有自己的UUID,通常由Nordic定义和使用。
  2. NUS特征
    • NUS服务包含两个主要的特征:
      • RX特征:用于接收从中央设备发送到外围设备的数据。
      • TX特征:用于从外围设备向中央设备发送数据(通过通知机制)。

例子:智能家居环境监控系统

使用GATT服务特征的方式

设备设置

  1. 环境监控设备
    • 配置两个特征:
      • 温度特征:定期更新当前温度值。
      • 湿度特征:定期更新当前湿度值。
  2. 手机应用
    • 订阅这两个特征,分别接收温度和湿度数据。

数据传输过程

  1. 连接建立
    • 手机应用连接到环境监控设备。
  2. 服务发现
    • 应用程序发现设备上的温度和湿度特征。
  3. 订阅特征
    • 应用程序订阅温度特征和湿度特征。
  4. 接收数据
    • 每当环境监控设备更新温度或湿度值时,应用程序会收到通知并显示数据。

使用NUS服务的方式

设备设置

  1. 环境监控设备
    • 配置NUS(Nordic UART Service)服务,带有两个特征:
      • RX特征:用于接收手机发送的命令或数据。
      • TX特征:用于发送温度和湿度数据到手机。
  2. 手机应用
    • 订阅NUS服务的TX特征,接收环境监控设备的数据。
    • 通过RX特征发送命令或数据到环境监控设备。

数据传输过程

  1. 连接建立
    • 手机应用连接到环境监控设备。
  2. 服务发现
    • 应用程序发现设备上的NUS服务和其特征。
  3. 订阅特征
    • 应用程序订阅NUS服务的TX特征。
  4. 接收和发送数据
    • 接收数据:环境监控设备定期将温度和湿度数据通过TX特征发送到手机,应用程序接收并显示数据。
    • 发送数据:如果手机应用需要请求某些数据或发送命令(比如改变数据传输频率),可以通过RX特征发送到环境监控设备。

最好用NUS服务的场景

例子:远程设备控制与数据传输

场景描述
你有一个复杂的远程监控和控制系统,例如无人机控制系统。无人机需要发送大量的实时传感器数据(如GPS坐标、速度、姿态信息等)到地面控制站,同时接收地面站发送的控制指令(如调整飞行路径、改变飞行高度等)。

为什么用NUS服务

  1. 双向通信需求
    • 无人机需要同时发送数据和接收命令。NUS服务提供了统一的接口(RX和TX特征)来处理双向数据流,非常适合这种场景。
  2. 数据类型多样
    • 传感器数据种类多、更新频率高,且需要实时传输。通过NUS服务,所有数据可以打包成统一的格式进行传输,简化了数据处理逻辑。
  3. 灵活性和扩展性
    • 可以灵活地在数据包中添加新类型的数据或命令,而不需要重新定义和管理多个GATT特征。

具体操作

  1. 无人机设备(外围设备)
    • 配置NUS服务,使用TX特征发送传感器数据,使用RX特征接收地面站命令。
  2. 地面控制站(中央设备)
    • 订阅无人机的TX特征,接收传感器数据。
    • 通过写入RX特征发送控制命令。

用GATT服务更合适的场景

例子:简单的环境传感器数据传输

场景描述
你有一个环境监测系统,例如一个简单的温度和湿度监测器。它只需要将温度和湿度数据周期性地发送到手机应用,无需接收任何命令。

为什么用GATT服务

  1. 单向通信需求
    • 传感器只需要发送数据到手机,无需接收命令。GATT服务的通知机制非常适合这种单向的数据传输。
  2. 数据类型单一
    • 只有两个数据点:温度和湿度,每个数据点对应一个特征,结构简单且清晰。
  3. 低复杂度
    • 管理单一或少量特征比管理NUS服务的数据打包和解析更简单,减少开发和维护的复杂度。

具体操作

  1. 环境传感器设备(外围设备)
    • 配置两个GATT特征,一个用于温度数据,一个用于湿度数据。
  2. 手机应用(中央设备)
    • 订阅温度和湿度特征,接收传感器数据并显示。

总结

NUS服务的最佳场景

  • 复杂、需要双向通信的应用,例如无人机控制系统。
  • 多种数据类型和高频更新的数据传输需求。
  • 需要灵活扩展数据格式和命令的场景。

GATT服务的最佳场景

  • 简单、单向的数据传输应用,例如环境监测器。
  • 数据类型单一且更新频率较低。
  • 开发和维护简单的场景。

通过这些实例和对比,希望你能更清楚地理解何时选择NUS服务,何时选择GATT服务。如果你有任何疑问或需要进一步的技术说明,请随时联系我!

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

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

相关文章

2024越南医药、制药机械展

2024年越南国际医药,制药装备及技术展览会 时间: 2024年11月21--23日 地点:越南胡志明市-西贡会展中心SECC 2024年越南国际医药,制药装备及技术展览会将于2024年11月21-23日在越南胡志明市盛大举行!展览会以国际化、专…

【Feature Pyramid Networks for Object Detection】

Feature Pyramid Networks for Object Detection 摘要引言2 相关工作3 FPN4 应用摘要 特征金字塔是识别系统中用于检测不同尺度对象的基本组件。但是,最近的深度学习对象检测器已经避免了金字塔表示,部分原因是它们在计算和内存方面都很密集。在这篇论文中,我们利用深度卷积…

LeetCode经典题之876、143 题解及延伸

系列目录 88.合并两个有序数组 52.螺旋数组 567.字符串的排列 643.子数组最大平均数 150.逆波兰表达式 61.旋转链表 160.相交链表 83.删除排序链表中的重复元素 389.找不同 1491.去掉最低工资和最高工资后的工资平均值 896.单调序列 206.反转链表 92.反转链表II 141.环形链表 …

paddleocr查看标注好的数据错误信息

字符计数 import os import json from collections import Counter# 按字符计数 label_dir"/Users/thy/Downloads/chinese20240613" zi_ls[] with open(os.path.join(label_dir,"Label.txt")) as f:linesf.readlines()for line in lines:line line.strip…

Java面试题:聚簇索引和非聚簇索引

聚簇索引和非聚簇索引 聚簇索引(聚集索引) 将数据的存储和索引放在一块,索引结构的叶子节点保存了行数据 索引字段必须存在,且只能存在一个 非聚集索引(二级索引) 将数据和索引分开存储,索引结构的叶子节点关联的是对应的主键 索引字段可以存在多个 索引的选取规则 如果…

【学习】常用的分类网络

1. LeNet 提出时间:1998年最新版本:原始版本使用的数据集格式:MNIST(28x28灰度图像)优点: 结构简单,易于理解和实现。对于小规模图像数据集(如MNIST)有很好的表现。缺点…

豆瓣高分项目管理书籍推荐

📬豆瓣网站上有很多项目管理领域的书籍获得了较高的评分,以下是一些高分项目管理书籍的精选列表,发出来跟大家分享一下: 《项目管理知识体系指南(PMBOK指南)》 【内容简介】这本书是美国项目管理协会&…

opencv检测图片上七种颜色,分辨颜色和对应位置

opencv检测图片上七种颜色,分辨颜色和对应位置 读取图片:使用cv2.imread()函数读取目标图片。 转换颜色空间:通常在HSV颜色空间中进行颜色检测,因为HSV颜色空间更适合描述颜色的属性。 定义颜色范围:为七种颜色定义…

RabbitMQ 修改默认密码

RabbitMQ的一些常用命令 #启动rabbitmq service rabbitmq-server start# 查看rabbitMQ的运行状态 service rabbitmq-server status# 开启rabbitMQ的后台管理插件 rabbitmq-plugins enable rabbitmq_management # 重启RabbitMQ服务 service rabbitmq-server restart RabbitMQ的…

AcWing 797:差分 ← 一维差分模板题

【题目来源】https://www.acwing.com/problem/content/799/【题目描述】 输入一个长度为 n 的整数序列。 接下来输入 m 个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r] 之间的每个数加上 c。 请你输出进行完所有操作后的序列。【输入格式】 第一…

富格林:正规操作实现稳健出金

富格林认为,当下的金融市场,投资者进行理财都会特别关注盈利效率高的产品,而近年来兴起的现货黄金,其高效的盈利效率吸引着大批朋友关注。不过,要想在这盈利出金,就得学习掌握正规的交易策略。下面富格林将…

onnx模型修改:去掉Dropout层

文章目录 尝试1:强行设置dropout层train mode为False尝试2:找到onnx模型中的dropout, train mode设置为False尝试3:直接删除dropout层,连接其输入输出结语 最近训练模型使用了tinyvit,性能挺强的: 但是导出…

超细毛搭配超宽设计,一款更呵护牙龈的牙刷

牙龈敏感的时候,刷牙特别难受,最近试了试惠百施(EBISU)65孔宽头软毛牙刷,感觉它的口腔护理体验很不错。这款牙刷的设计独特,采用宽头设计,一次就能刷两排牙齿,极大地提高了清洁效率。…

RS232自由转Profinet协议网关模块连接1200PLC与扫码枪通讯及手动清零案例

一、RS232和Profinet这两种通讯接口的特点和应用场景: RS232是一种串行通讯接口标准,常用于连接计算机和外部设备,传输速率较低但稳定可靠。Profinet则是一种工业以太网通讯协议,具有高速、实时性强的特点,适用于工业…

C/C++语言通过动态链表实现按需内存分配和使用(Linux Ubuntu 24.04环境)

我认为比较理想的内存使用方式应该实现这几个特性: 1. 分配一块能满足大多数情况下需求的内存,比如80%的情况下都不需要再次分配内存。 2. 对另外20%需要较多内存的情况,可以通过动态链表按需追加新的内存块。 3. 要对总共消耗的内存有一个…

【C语言】解决C语言报错:Dangling Pointer

文章目录 简介什么是Dangling PointerDangling Pointer的常见原因如何检测和调试Dangling Pointer解决Dangling Pointer的最佳实践详细实例解析示例1:释放内存后未将指针置为NULL示例2:返回指向局部变量的指针示例3:指针悬空后继续使用示例4&…

引领未来:AI Native与物联网(IoT)的革命性融合

引领未来:AI Native与物联网(IoT)的革命性融合 在数字化转型的浪潮中,AI Native作为一种新兴的软件开发模式,正逐渐成为推动技术创新的核心力量。与此同时,物联网(IoT)技术通过连接物理世界与数字世界,不断扩展其应用…

自编码器笔记

编码器解码器自编码器 先压缩特征,再通过特征还原。 判断还原的和原来的是否相等 encode data 在一个“潜在空间”里。它的用途是“深度学习”的核心-学习数据的特征并简化数据表示形式以寻找模式。 变分自编码器: 1. 首先、假设输入数据是符合正态分布…

tiny-redis 项目可能的问题

https://build-your-own.org/redis/ 事件循环怎么实现的 首先我将连接包装为一个 Connect 类,它包含了 socket fd,读写缓冲区,连接状态(这个连接是发送数据还是接收数据)等成员属性 我会在全局维护一个从 socket fd…

003 选择排序

文章目录 先挑最值,再把剩下的挑最值,再把剩下的挑最值。。。 -- 排序函数 function selectionSort(arr) -- 外层循环,从数组的第一个元素开始,对每个元素进行排序 for i 1, #arr do -- 假设当前位置的元素是最小的 local …