BLE学习笔记2:广播

1. 广播初始化

广播初始化主要配置两个结构体advdata广播参数和option广播方式。

1.1 advdata

在初始化advdata之前,先使用 memset(&advdata, 0, sizeof(advdata))语句将advdata结构体中的所有数置零。下图是advdata结构体列表参数,在蓝牙示例程序中,我们需要配置name_type(名称类型,注意这里并不是名称,名称定义是在GAP初始化中实现的),flags(蓝牙设备模式),uuid_complete(uuid设置)。

结构体列表
1.1.1 name_type
广播时名称的显示类型,其本身也是个结构体

typedef enum
{
    BLE_ADVDATA_NO_NAME,                                              /**< Include no device name in advertising data. */
    BLE_ADVDATA_SHORT_NAME,                                           /**< Include short device name in advertising data. */
    BLE_ADVDATA_FULL_NAME                                             /**< Include full device name in advertising data. */
} ble_advdata_name_type_t;

初始化时选择结构体的其中一个参数

advdata.name_type               = BLE_ADVDATA_FULL_NAME;

1.1.2 flags
蓝牙设备模式,一共有以下几种情况,我们常用前3种,其中LE表示低功耗,BR/DER表示基本速率或增强速率。
官方手册
初始化时选择

advdata.flags                   = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MOD

其中

#define BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE   (BLE_GAP_ADV_FLAG_LE_GENERAL_DISC_MODE | BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED)

1.1.3 uuid_complete
uuid_complete是一个结构体,我们需要对其中的两个参数分别初始化

typedef struct
{
    uint16_t                     uuid_cnt;                            /**< Number of UUID entries. */
    ble_uuid_t *                 p_uuids;                             /**< Pointer to UUID array entries. */
} ble_advdata_uuid_list_t;

初始化程序

 advdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]);//UUID
 advdata.uuids_complete.p_uuids  = m_adv_uuids

1.2 options

options结构体参数主要配置广播的具体参数,这里我们使用了快速广播模式,故只需要配置其中和快速广播有关的参数。

typedef struct
{
    bool     ble_adv_whitelist_enabled;       /**< Enable or disable use of the whitelist. */
    bool     ble_adv_directed_enabled;        /**< Enable or disable direct advertising mode. */
    bool     ble_adv_directed_slow_enabled;   /**< Enable or disable direct advertising mode. */
    uint32_t ble_adv_directed_slow_interval;  /**< Advertising interval for directed advertising. */
    uint32_t ble_adv_directed_slow_timeout;   /**< Time-out (number of tries) for direct advertising. */
    bool     ble_adv_fast_enabled;            /**< Enable or disable fast advertising mode. */
    uint32_t ble_adv_fast_interval;           /**< Advertising interval for fast advertising. */
    uint32_t ble_adv_fast_timeout;            /**< Time-out (in seconds) for fast advertising. */
    bool     ble_adv_slow_enabled;            /**< Enable or disable slow advertising mode. */
    uint32_t ble_adv_slow_interval;           /**< Advertising interval for slow advertising. */
    uint32_t ble_adv_slow_timeout;            /**< Time-out (in seconds) for slow advertising. */
}ble_adv_modes_config_t;

具体配置程序如下,分别配置了广播类型,广播间隔以及广播超时时间。

    options.ble_adv_fast_enabled  = BLE_ADV_FAST_ENABLED;
    options.ble_adv_fast_interval = APP_ADV_INTERVAL;
    options.ble_adv_fast_timeout  = APP_ADV_TIMEOUT_IN_SECONDS;

1.3 ble_advertising_init()
广播初始化函数,它需要传入5个参数

uint32_t ble_advertising_init(ble_advdata_t const                 * p_advdata,
                              ble_advdata_t const                 * p_srdata,
                              ble_adv_modes_config_t const        * p_config,
                              ble_advertising_evt_handler_t const   evt_handler,
                              ble_advertising_error_handler_t const error_handler)

将advdata,option结构体以及广播事件回调函数(主要实现板级设备的配置,例如使用一个led灯表示广播的状态)写入该初始化,

err_code = ble_advertising_init(&advdata, NULL, &options, on_adv_evt, NULL);

2.在回调派发函数中调用广播初始化的参数

这一步的处理在协议栈初始化中实现,

static void ble_evt_dispatch(ble_evt_t * p_ble_evt)
{
    dm_ble_evt_handler(p_ble_evt);
    ble_conn_params_on_ble_evt(p_ble_evt);
    bsp_btn_ble_on_ble_evt(p_ble_evt);
    on_ble_evt(p_ble_evt);
    ble_advertising_on_ble_evt(p_ble_evt);
    /*YOUR_JOB add calls to _on_ble_evt functions from each service your application is using
    ble_xxs_on_ble_evt(&m_xxs, p_ble_evt);
    ble_yys_on_ble_evt(&m_yys, p_ble_evt);
    */
}

实际上,广播初始化的参数传递到evt_id里面,并在ble_advertising_on_ble_evt(p_ble_evt)函数中进行判断。

3.开启广播

err_code = ble_advertising_start(BLE_ADV_MODE_FAST);

该函数不仅可以实现广播的开启,还可以进行广播由上至下的切换,若快速模式超时,便切换到慢速模式。前提是需要在options中声明慢速模式,后面我会详细谈下如何修改广播。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以为您解答Android BLE广播过程中更新广播数据的问题。在Android BLE中,可以通过BluetoothLeAdvertiser对象的updateAdvertiseData()方法来更新BLE广播数据。以下是更新BLE广播数据的步骤: 1. 创建AdvertiseData对象:创建一个新的AdvertiseData对象,用于更新广播数据。 2. 调用updateAdvertiseData()方法:调用BluetoothLeAdvertiser对象的updateAdvertiseData()方法,传入新的AdvertiseData对象。 例如,以下代码演示了如何在BLE广播过程中更新广播数据: ``` private BluetoothLeAdvertiser mAdvertiser; private AdvertiseData mAdvertiseData; // 初始化广播数据 private void initAdvertiseData() { mAdvertiseData = new AdvertiseData.Builder() .setIncludeDeviceName(true) .addServiceUuid(new ParcelUuid(SERVICE_UUID)) .build(); } // 开始广播 private void startAdvertise() { mAdvertiser = BluetoothAdapter.getDefaultAdapter().getBluetoothLeAdvertiser(); mAdvertiser.startAdvertising(settings, mAdvertiseData, null); } // 更新广播数据 private void updateAdvertiseData() { AdvertiseData newAdvertiseData = new AdvertiseData.Builder() .setIncludeDeviceName(true) .addServiceUuid(new ParcelUuid(SERVICE_UUID)) .addManufacturerData(MANUFACTURER_ID, new byte[]{0x01, 0x02, 0x03}) .build(); mAdvertiser.updateAdvertiseData(newAdvertiseData, null); } ``` 在上面的代码中,initAdvertiseData()方法用于初始化广播数据,startAdvertise()方法用于开始广播,updateAdvertiseData()方法用于更新广播数据。在updateAdvertiseData()方法中,创建一个新的AdvertiseData对象,并调用updateAdvertiseData()方法更新广播数据。 需要注意的是,更新BLE广播数据可能会影响广播性能和功耗。因此,需要谨慎使用,并根据具体需求进行优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生活在别处u

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值