NRF52832主机发现从机服务

代码编写

说明:本例在主机PHY物理层配置的基础上添加代码。

main.c添加:

BLE_NUS_C_DEF(m_ble_nus_c);  
static void ble_nus_c_evt_handler(ble_nus_c_t * p_ble_nus_c, ble_nus_c_evt_t const * p_ble_nus_evt)
{

}
static void nus_c_init(void)//主机客户端初始化
{
    ret_code_t       err_code;
    ble_nus_c_init_t init;

    init.evt_handler = ble_nus_c_evt_handler;

    err_code = ble_nus_c_init(&m_ble_nus_c, &init);
    APP_ERROR_CHECK(err_code);
}
static void db_disc_handler(ble_db_discovery_evt_t * p_evt)
{
    ble_nus_c_on_db_disc_evt(&m_ble_nus_c, p_evt);
}

static void db_discovery_init(void)//发现从机服务添加--初始化 DB 发现模块
{
    ret_code_t err_code = ble_db_discovery_init(db_disc_handler);
    APP_ERROR_CHECK(err_code);
}

主函数添加代码:

int main(void)
{
    // Initialize.
    log_init();//LOG输出
    timer_init();//定时器初始化
    buttons_leds_init();//板级设备初始化
    db_discovery_init();//发现从机服务添加--初始化 DB 发现模块
    power_management_init();//功耗管理
    ble_stack_init();//协议栈初始化
    gatt_init();//MTU参数协商添加
	nus_c_init();//发现从机服务添加//主机客户端初始化
    scan_init();//扫描初始化

    // Start execution.
    NRF_LOG_INFO("BLE central template example started.");
    scan_start();//开始扫描

    // Enter main loop.
    for (;;)
    {
        idle_state_handle();
    }
}

蓝牙事件处理函数添加:

 case BLE_GAP_EVT_CONNECTED:
				//================发现从机服务添加===START
            err_code = ble_nus_c_handles_assign(&m_ble_nus_c, p_ble_evt->evt.gap_evt.conn_handle, NULL);
            APP_ERROR_CHECK(err_code);
				//================发现从机服务添加===END

           //连接的时候指示灯亮
            err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
				    NRF_LOG_INFO("conn_handle: 0x%x",
                         p_gap_evt->conn_handle
                        );
            APP_ERROR_CHECK(err_code);
				    NRF_LOG_INFO("connect OK!");
						//主机发起PHY更新请求
				    err_code = sd_ble_gap_phy_update(p_gap_evt->conn_handle, &phys);
            APP_ERROR_CHECK(err_code);
						//打印更新请求的参数值

				    NRF_LOG_INFO("LL_PHY_REQ!");
				    NRF_LOG_INFO("rx_phys: %d",phys.rx_phys);
					  NRF_LOG_INFO("tx_phys: %d",phys.tx_phys);
				
				//================发现从机服务添加===START
            NRF_LOG_INFO("start discovery services");//添加开始发现服务提示
            // 添加主服务数据发现汗水//开启发现服务,nus客户端等地啊发现结果
            err_code = ble_db_discovery_start(&m_db_disc, p_ble_evt->evt.gap_evt.conn_handle);
            APP_ERROR_CHECK(err_code);
				//================发现从机服务添加===END
            break;

错误及解决

错误1:ERROR 8 [NRF_ERROR_INVALID_STATE]

现象:

代码段:


    ret_code_t       err_code;
    ble_nus_c_init_t init;

    init.evt_handler = ble_nus_c_evt_handler;

    err_code = ble_nus_c_init(&m_ble_nus_c, &init);
    APP_ERROR_CHECK(err_code);

中err_code = ble_nus_c_init(&m_ble_nus_c, &init);调试log打印:

原因:

未进行初始化 DB 发现模块;

解决:

添加代码:

static void db_disc_handler(ble_db_discovery_evt_t * p_evt)
{
    ble_nus_c_on_db_disc_evt(&m_ble_nus_c, p_evt);
}

static void db_discovery_init(void)//发现从机服务添加--初始化 DB 发现模块
{
    ret_code_t err_code = ble_db_discovery_init(db_disc_handler);
    APP_ERROR_CHECK(err_code);
}

并在主函数里面协议栈初始化之前调用 db_discovery_init();函数。

错误2:无法获取服务

现象:

log打印如下:

原因:

没有将主机查询的基础UUID和服务UUID改成和从机一样;

解决方法:

进入ble_nus_c_init(&m_ble_nus_c, &init);函数修改参数设置:如下图

找到基础UUID和服务uuid改成和从机UUID一样的值;

从机的基础UUID和服务UUID示意图:

修改代码段位置如下:

主机查询的基础UUID修改如下:

 

#define NUS_BASE_UUID                   {{0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x00, 0x00, 0x40, 0x6E}} /**< Used vendor specific UUID. */

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值