蓝牙学习--广播(nRF52832)

广播就是设备将自身愿意展示的信息按照一定的间隔以“扫描者”可理解的方式向周边发射。

一.广播的种类

广播分为通用广播:这也是最常用的广播方式,可以被扫描,接收到连接请求时可以作为从设备进入连接。

定向广播是为了尽可能快的建立连接。这种报文包含两个地址:广播者的地址和发起者的地址。发起设备在收到发给自己的定向广播报文后,可以立即发送连接请求作为回应。定向广播事件有特殊的时序要求。完整的广播事件必须每3.75ms重复一次。这一要求使得扫描设备只需要扫描3.75ms便可以收到定向广播设备的消息。如此快的发送会让报文充斥着广播信道,进而导致该区域内的其他设备无法进行广播。定向广播最长时间不能超过1.28秒,并且不能被主动扫描。

不可连接广播:广播数据,而不进入连接态。

可发现广播:不可连接,但是可以响应扫描。

二.广播事件

设备每次广播时,会在三个广播信道上发送相同的广播包,这被称为一个广播事件。

三个广播信道37 、38、39,对应的中心频率是 2402MHz,2426MHz,2480MHz。每次广播,都会在 3 个信道上将广播数据发送一次,这能有效地避免干扰,即使一个信道存在干扰,另外的信道也可以很好地工作,而三个信道同时被干扰的情况极少。

三.Nordic的SDK

这个SDK包括很多,比如广播的配置、启动、停止等等。

广播的配置:也就是广播的初始化,可以根据自己的需求来配置广播的间隔、广播的模式、广播中包含了哪些数据。

广播的启动:应用程序初始化广播成功后,广播不会立即启动,而是应用程序需要根据初始化中的设置的模式启动广播,应用程序启动广播最终是调用API函数sd_ble_gap_adv_start()通知SoftDevice(Softdevice是Nordic蓝牙协议栈的名称,为了方便用户的使用,每一个版本的SDK都包含了该版本支持的所有softdevice)启动广播。

广播的停止:广播的停止模式有两种方式,一是应用程序主动停止广播,二是广播设置了超时停止广播,在设定的超时时间内没有和中心设备建立连接,广播会立即停止。

四.广播初始化

广播初始化中需要配置广播包中包含哪些数据,一般情况下,建议广播包中至少包含:
设备名称、Flags、外观和首要服务的 UUID。对于 BLE 工程模板,因为仅有两个必须的服
务(GAP 服务和 GATT 服务),没有其他的服务,所以这里我们在广播数据中只加入设备名
称、外观和 Flasg。

1.标准SDK广播初始化函数

在主函数中,首先调用广播初始化这个函数

我们首先定义了ble_advertising_init_t这个广播结构体变量,实际上初始了里面两个结构体变量

advdata 主要包括广播的相关内容,包括,名称,蓝牙工作模式,发射功率,UUID,制造商特定数据,服务数据,等,config主要是广播的模式配置,包含快速广播,慢速广播,高速定向广播,以及对应的广播间隔和超时时间等。

2.广播参数定义

advdata

设置广播时的名称显示

蓝牙广播设备类型

广播模式配置配置

再来看&confing 选择项,confing 为 ble_adv_modes_config_t 结构体

3.定义广播回调函数

应用程序在广播初始化的时候需要注册广播事件处理函数,用于接收广播事件,广播事
件处理函数的格式如下,函数的名称必须和注册的名称一样。蓝牙工程中,这个回调函数里必须有的部分。其中 ble_advertising_on_ble_evt(p_ble_evt)蓝牙广播蓝牙事件回调函数是主要作用。

4.用于初始化函数ble_advertising_init()

功能:用于初始化广播模块的函数

参数:p_advertising  广播模块实例。该结构必须由应用程序提供。

        p_init 初始化模块所需的信息。

5.最后一步,写入 连接设置标记

广播初始化,还需要调用 ble_advertising_conn_cfg_tag_set()函数写入连接设置标志,它
的作用是如果广播连接后,用来跟踪使用什么连接设置。这个功能是为了将来考虑的,在当
前 SoftDevice 版本中(S132 V7.2.0 版本),只能写 1。

到这里广播的初始化就完成了,这在启动快速广播时和超时时通过广播回调函数执行一些简单的操作。

  • 22
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
nrf52832可以通过UART和电脑进行蓝牙通信。具体步骤如下: 1. 配置UART 在nrf52832上配置一个UART接口,使其可以通过串口与电脑通信。你可以使用nrfx库或者SDK自带的UART库来实现。下面是使用nrfx库的示例代码: ```c #define UART_TX_PIN 6 #define UART_RX_PIN 8 #define UART_BAUDRATE NRF_UART_BAUDRATE_115200 nrfx_uart_t uart_instance = NRFX_UART_INSTANCE(0); void uart_init(void) { nrfx_uart_config_t uart_config = NRFX_UART_DEFAULT_CONFIG; uart_config.baudrate = UART_BAUDRATE; uart_config.pselrxd = UART_RX_PIN; uart_config.pseltxd = UART_TX_PIN; nrfx_uart_init(&uart_instance, &uart_config, NULL); nrfx_uart_rx_enable(&uart_instance); } ``` 2. 配置蓝牙nrf52832上配置一个蓝牙连接,使其可以与电脑的蓝牙进行通信。你可以使用nrfx库或者SDK自带的蓝牙库来实现。下面是使用SDK自带的蓝牙库的示例代码: ```c #define DEVICE_NAME "Nordic_UART" #define APP_BLE_OBSERVER_PRIO 3 #define APP_ADV_INTERVAL 64 #define APP_ADV_TIMEOUT_IN_SECONDS 180 static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) { switch (p_ble_evt->header.evt_id) { case BLE_GAP_EVT_CONNECTED: break; case BLE_GAP_EVT_DISCONNECTED: break; case BLE_GAP_EVT_PHY_UPDATE_REQUEST: { ble_gap_phys_t phys = { .rx_phys = BLE_GAP_PHY_AUTO, .tx_phys = BLE_GAP_PHY_AUTO, }; sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys); } break; default: break; } } void ble_init(void) { uint32_t err_code; ble_stack_init(); gap_params_init(); gatt_init(); services_init(); advertising_init(); conn_params_init(); err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_ADV, 0, TX_POWER); // 设置广播功率 APP_ERROR_CHECK(err_code); err_code = sd_ble_gap_adv_start(m_adv_handle, APP_BLE_CONN_CFG_TAG); APP_ERROR_CHECK(err_code); ble_advertising_start(BLE_ADV_MODE_FAST); NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL); } ``` 3. 通过UART发送和接收数据 当蓝牙连接成功后,你可以通过UART向电脑发送数据,也可以通过UART接收电脑发送的数据。下面是使用nrfx库的示例代码: ```c void uart_send_data(uint8_t * data, size_t length) { nrfx_uart_tx(&uart_instance, data, length); } void uart_receive_data(uint8_t * data, size_t length) { nrfx_uart_rx(&uart_instance, data, length); } ``` 你也可以使用SDK自带的UART库来实现UART的发送和接收。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

焦不得

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

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

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

打赏作者

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

抵扣说明:

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

余额充值