ble原理(3) 广播类型

1.广播部分

1:广播可设置以下几种类型:

  1. Connectable Undirected Event Type(可连接无定向广播)

  2. Connectable Directed Event Type(可连接定向广播)

  3. Scannable Undirected Event Type(可扫描无定向广播)

  4. Non-connectable Undirected Event Type(不可连接无定向广播)

2. Connectable Undirected Event Type

可连接非定向广播包为(ADV_IND PDU)。在可连接的无定向广播类型下,一个“扫描者”或“发起者”可以用扫描请求或连接请求来回应这个广播包。“扫描者”可发送一个扫描请求(SCAN_REQ PDU)来获取广播的额外信息(SCAN_RSP);“发起者”可发送一个连接请求(CONNECT_REQ PDU)来要求Link Layer(链接层)进入链接状态。

Link Layer(链接层)需在同一个广播信道上监听来自“扫描者”或“发起者”的请求。

如果“广播者”收到一个扫描请求包(SCAN_REQ PDU),该请求包含有它的设备地址,并且该“扫描者”为广播过滤策略所允许,那么“广播者”就会在同一信道上回应一个数据包(SCAN_RSP PDU)。当(SCAN_RSP PDU)发送完成后,或由于广播过滤策略阻止了该请求包,“广播者”就会移到下一个广播信道来发送另一个广播包(ADV_IND PUD),或关闭广播事件。

如果“广播者”收到一个连接请求包(CONNECT_REQ PDU), 该请求包含有它的设备地址,并且该“发起者”为广播策略所允许,Link Layer(链接层)就会退出广播状态并转移到连接状态,并且角色转化为“从设备”。如果广播过滤策略阻止了该连接请求包,“广播者”就会移到下一个广播信道来发送另一个广播包(ADV_IND PUD),或关闭广播事件。

在一个广播事件中的两个相邻广播包(ADV_IND PDU)的时间间距小于等于10ms,广播状态将在advertising interval内完成状态的关闭。

一个没有扫描请求和连接请求的广播事件(使用所有广播信道37、38、39)如下图所示:

3.Connectable Directed Event Type

可连接的定向广播包为(ADV_DIRECT_IND PDU)。该类型允许一个“发起者”以连接请求包来回应(CONNECT_REQ PDU)该广播包,“发起者”发送一个连接请求包要求LinkLayer(链接层)进入连接状态。

可连接的定向广播包(ADV_DIRECT_IND PDU)同时包含“发起者”设备地址和“广播者”设备地址。只有符合该地址的“发起者”才可向“广播者”发起一个连接请求(CONNECT_REQ PDU),也就是说当“发起者”收到该广播包时,它会检测是否和自己的地址一致,如果不一致就丢弃该包不做任何回应,如果是自己的地址,它会将它提交到Host层,由Host层来决定是否发起一个连接请求。

当“广播者”发送一个广播包(ADV_DIRECT_IND PDU)后,它将在同一信道上监听连接请求包(CONNECT_REQPDU)。任何扫描包将被忽略,也就是说不接受扫描请求。

如果“广播者”收到一个包含它设备地址的连接请求包,并且该“发起者”就是广播包的指定目标,那么Link Layer(链接层)将退出广播状态并转移到连接状态,并且角色将由“广播者”转化为“从设备”。否则,“广播者”将切换到下一个广播信道发送下一个广播包,或者关闭这个广播事件。

在同一个广播信道上的两个相邻广播包的时间间隔小于等于3.75ms,可见该类型的广播速度比可连接非定向广播包(<=30ms)要快很多。

当进入广播状态后,Link Layer(链接层)会在1.28s内退出广播状态。

一个没有连接请求(CONNECT_REQ PDU),含有5个广播包(ADV_DIRECT_IND PDU)的两个广播事件序列图4.Scannable Undirected Event Type
可扫描非定向广播包(ADV_SCAN_IND PDU),允许一个“扫描者”回应一个扫描请求包(SAN_REQ PDU)来向“广播者”获取附加信息(SCAN_RSP)。

Link Layer(链接层)将在同一个信道上监控来自扫描者的请求。
如果“广播者”收到一个包含它的地址的扫描请求包(SCAN_REQ PDU),并且该“扫描者”的地址符合过滤策略(说白了就是该设备合法,不被“广播者”的地址过滤策略过滤),那么“广播者”将在同一广播信道上回应一个数据包(SCAN_RSP PDU)。当SCAN_RSP PDU数据包发送完成后或SCAN_REQ被过滤策略阻止,那么“广播者”将切换到下一个广播信道发送下一个广播包或关闭该广播事件。
在一个广播事件中的两个相邻广播包(ADV_IND PDU)的时间间距小于等于10ms,广播状态将在advertising interval内完成状态的关闭。

没有扫描请5. Non-connectable Undirected Event Type
不可连接非定向广播包(ADV_NONCONNN_IND PDU),该广播类型不接受任何请求包(包含:扫描请求和连接请求),“扫描者”可接收来自“广播者”的广播包。

在一个广播事件中的两个相邻广播包(ADV_IND PDU)的时间间距小于等于10ms,广播状态将在advertising interval内完成状态的关闭。

2 广播格式类型

地址

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答Android BLE广播获取广播时间的问题。在Android BLE中,可以通过BluetoothLeAdvertiser对象的startAdvertising()方法的回调函数来获取BLE广播的时间。以下是获取BLE广播时间的步骤: 1. 创建AdvertiseSettings对象:AdvertiseSettings是广播设置的对象,可以通过它来设置广播模式、广播信号强度等参数。例如,可以通过以下代码创建一个高功率的广播设置对象: ``` AdvertiseSettings settings = new AdvertiseSettings.Builder() .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_HIGH_POWER) .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH) .setConnectable(false) .build(); ``` 2. 创建AdvertiseData对象:AdvertiseData是广播数据的对象,可以通过它来设置广播的内容。例如,可以通过以下代码创建一个包含设备名称和服务UUID的广播数据对象: ``` AdvertiseData data = new AdvertiseData.Builder() .setIncludeDeviceName(true) .addServiceUuid(new ParcelUuid(SERVICE_UUID)) .build(); ``` 3. 开始广播:使用BluetoothLeAdvertiser.startAdvertising()方法开始广播,可以传入AdvertiseSettings和AdvertiseData对象。例如,可以通过以下代码开始广播: ``` BluetoothLeAdvertiser advertiser = BluetoothAdapter.getDefaultAdapter().getBluetoothLeAdvertiser(); long startTimeMillis = System.currentTimeMillis(); advertiser.startAdvertising(settings, data, new AdvertiseCallback() { @Override public void onStartSuccess(AdvertiseSettings settingsInEffect) { long endTimeMillis = System.currentTimeMillis(); long advertisingTimeMillis = endTimeMillis - startTimeMillis; Log.d(TAG, "Advertising time: " + advertisingTimeMillis + " ms"); } @Override public void onStartFailure(int errorCode) { Log.e(TAG, "Advertising onStartFailure: " + errorCode); } }); ``` 在上面的代码中,创建一个AdvertiseCallback对象,并在它的onStartSuccess()方法中获取BLE广播的时间。使用System.currentTimeMillis()方法获取当前时间,然后计算广播时间差即可。 需要注意的是,在获取BLE广播时间时,需要在回调函数中进行计时,不能在广播开始前或结束后计时,否则计算的广播时间不准确。同时,BLE广播时间也受到广播设置和设备性能的影响,可能会有一定的误差。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值