蓝牙规范系列--经典蓝牙概述(第一篇)

一、目的

        从本篇开始介绍经典蓝牙的基础知识,内容较多故会分成多篇进行介绍。

        经典蓝牙(BR/EBR)射频(物理层PHY)工作在免授权的2.4G ISM频段(2400 - 2483.5 MHz),使用跳频技术来对抗干扰和衰弱,基本速率使用整形二进制频率调制(高斯频移键控GFSK)降低收发器的复杂度,增强速率使用PSK调制方式(π/4-DQPSK/8DPSK);符号速率都是1Msyms/s,空中速率分别为1Mb/s(BR)、2Mb/s(π/4-DQPSK )、3Mb/s(8DPSK)。

        什么是ISM频段?

        免授权ISM频段是指工业、科学和医疗领域(Industrial, Scientific and Medical,简称ISM)中使用的一些无线电频段,这些频段不需要获得专门的无线电频率使用许可证,可以免费使用。
这些频段通常用于低功率、短距离的无线通信,如蓝牙、Wi-i、ZigBee等。其中比较常用的ISM频段包括2.4GHz、5.8GHz和433MHz等。

        什么是跳频技术? 

        在无线通信中频率跳变(frequency hopping)是一种技术,它可以在不同的频率上发送数据包,以减少干扰和提高通信的可靠性。
在跳频通信中主设备和从设备之间的通信会在不同的频率上进行,这些频率是在跳频序列中预先定义的。在发送或接收数据包之前,设备会根据跳频序列选择下一个频率,并在该频率上进行通信。
        这种技术可以提高无线网络的抗干扰能力,从而提高通信的可靠性和稳定性。

二、介绍

        蓝牙组网

        同步于一个公共时钟和跳频模式的一组设备共享一个物理射频通道,提供时钟同步参考和跳频模式的设备叫做主设备(Master),其他设备叫做从设备(Slave),这组设备构成一个微微网(piconet);这是蓝牙 BR/EDR 无线技术中通信的基本形式。

         

                a/b是一个典型的piconet,c是分散网络 

 

        跳频模式

        跳频模式由主设备的蓝牙地址和时钟决定,基本的跳频模式是 ISM 频段中 79 个频率的伪随机排序,频率间隔为1 MHz。

        如果从设备检测到同一频段内有其他无线设备的干扰,它可以向主设备请求更改跳频模式。主设备可以根据从属设备的请求,针对每个从设备上调整跳频模式,以排除干扰设备使用的部分频率。

        自适应跳频技术改善了蓝牙与静态(非跳频)ISM系统位于同一位置时的共存。

        物理通道和时隙

        蓝牙物理通道可以分为两种类型:

  • 广播通道是用于广播数据的通道,它可以被所有的蓝牙设备接收。广播通道可以用于发送广告数据,以便其他设备可以发现和连接到它。广播通道的频率范围是2402 MHz到2480 MHz,共有40个频道可用。
  • 数据通道是用于传输数据的通道,它是在蓝牙设备之间建立点对点连接时使用的。数据通道的频率范围是2402 MHz到2480 MHz,共有37个频道可用。在数据通道中,每个连接都会占用两个频道,一个用于发送数据,另一个用于接收数据。

        蓝牙物理通道进一步细分为称为槽(slots)的时间单元,也可以叫做时隙(时长625us),蓝牙设备间的数据包(packet)就在这些槽(时隙)中传递;
        某些情况下,连续的槽可以被分配给一个单一的包(也就是说一个包可以一个时隙,一个包可能需要多个时隙才能传输)

        频率跳变可以在数据包的发送或接收之间进行,通过使用时分双工模式实现全双工;

        时分双工

        时分双工(Time-Division Duplex,简称TDD)是一种无线通信技术,它允许在同一频段内使用相同的频率进行双向通信。TDD技术通过将时间分成不同的时隙,使得同一频段内的发送和接收可以在不同的时间段内进行。这种技术通常用于无线局域网(WLAN)、蜂窝移动通信系统和其他无线通信系统中。

        蓝牙中使用的TDD方案被称为半双工TDD方案,因为数据的发送和接收发生在同一频率上,但在不同的时隙中。这与全双工TDD方案形成对比,其中数据的发送和接收发生在不同的频率上。

        物理通道之上是链路和通道以及相关控制协议的分层,从物理通道往上依次为:物理通道(physical channel)、物理链路(physical link)、逻辑传输(logical transport)、逻辑链路(logical link)以及L2CAP channel

        物理链路

        通常情况下在一个物理通道内,主设备和从设备间存在一个物理链路(physical link),但是查询扫描和页扫描物理通道没有与之关联的物理链路;
        物理链路提供了主设备和从设备之间的双向数据包传输,但无连接的从设备广播(Connectionless Slave Broadcast)物理链路是个例外,这条物理链路提供了一个从主设备到(数量不定的)从设备的单向数据包传输。

        一个物理通道可能包含多个从设备,主从设备间存在一条物理链路,但是同一个piconet中的从设备间不存在物理链路。

        逻辑链路 

        物理链路被用作一个或多个逻辑链路(logic link)的传输,这些链路支持单播同步(unicast synchronous)、异步(asynchronous)、等时(isochronous)以及广播(broadcast)数据,而这些数据则被多路复用到物理链路上。

        除用户数据外,逻辑链路也承载基带和物理层的控制协议,这个协议叫做链路管理协议(LMP);一个piconet网络中的活跃(active)设备存在一个默认的异步、面向连接的逻辑传输,用于传输LMP协议信令,也叫做ACL。

        ACL(Asynchronous Connection-Oriented Logical Transport)逻辑传输是蓝牙技术中的一种传输方式,用于在蓝牙设备之间传输数据。
        ACL 逻辑传输是一种可靠的、面向连接的传输方式,它使用 L2CAP(Logical Link Control and Adaptation Protocol)协议将数据分成小的数据包进行传输。
        ACL 逻辑传输通常用于传输需要可靠传输的数据,例如音频、视频和文件传输等。在蓝牙设备之间建立 ACL 连接后,它们可以通过 ACL 逻辑传输进行数据传输。


        除无连接从机广播设备(CSB)外,当一个设备加入piconet时会创建一个主ACL逻辑传输;CSB设备加入piconet仅仅监听无连接从设备广播包(仅会创建一个CSB逻辑传输);当需要传输同步数据流时才会创建额外的逻辑传输。

        链路管理器使用LMP控制piconet中的设备并且给下层(射频和基带层)提供管理服务;L2CAP层在基带层之上给应用和服务提供了一个基于通道的抽象。通过共享逻辑链路对应用程序数据进行分段和重组,并对多个通道进行多路复用和解复用

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Qt 中,可以使用 Qt Bluetooth 模块来实现安卓设备的蓝牙通信。下面是一个简单的示例代码,演示如何接收蓝牙广播数据: ```cpp #include <QBluetoothDeviceDiscoveryAgent> #include <QBluetoothDeviceInfo> #include <QBluetoothUuid> #include <QDebug> class BluetoothReceiver : public QObject { Q_OBJECT public: BluetoothReceiver(QObject *parent = nullptr) : QObject(parent) { QBluetoothUuid uuid = QBluetoothUuid::ServiceClassUuids::SerialPort; m_discoveryAgent = new QBluetoothDeviceDiscoveryAgent(uuid, this); connect(m_discoveryAgent, &QBluetoothDeviceDiscoveryAgent::deviceDiscovered, this, &BluetoothReceiver::deviceDiscovered); } private slots: void deviceDiscovered(const QBluetoothDeviceInfo &device) { qDebug() << "Discovered device:" << device.name() << device.address().toString(); // 获取设备的广播数据 QMap<QBluetoothUuid, QByteArray> advertisingData = device.advertisingData(); for (auto it = advertisingData.cbegin(); it != advertisingData.cend(); ++it) { qDebug() << "Service UUID:" << it.key().toString(); qDebug() << "Raw data:" << it.value().toHex(); } } private: QBluetoothDeviceDiscoveryAgent *m_discoveryAgent; }; ``` 在上面的代码中,我们创建了一个 `BluetoothReceiver` 类,其中包含一个 `QBluetoothDeviceDiscoveryAgent` 对象来扫描设备。在构造函数中,我们将要扫描的服务 UUID 设置为 `SerialPort`。将其设置为你需要接收广播数据的服务 UUID。连接 `deviceDiscovered` 信号以获取设备信息和广播数据。在 `deviceDiscovered` 槽函数中,我们可以获取设备的 UUID 和原始广播数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值