• 芯科蓝牙BG27开发笔记7-配置蓝牙参数


    基础的要求

    1. 设置广播参数为间隔1000ms,不停止

    2. 添加广播消息,含01、03、09、FF TYPE

    3. 设置蓝牙通信间隔参数为320ms、400ms、2、4000ms超时

    3. 配置发射功率为较低

    4. 配置GATT所有数据与原Nordic 配置一致

    为了解决以上疑问,需要多看一些示例代码。目前还没有看到有价值的例程。但是可以查看代码中的API接口说明,多试几次,可以找到。

    1. // 自定义的广播数据
    2. uint8_t advData[] = {0x02, 0x01, 0x06, 0x03, 0x03, 0x30, 0xFF, 0x03, 0xFF, 0xAA, 0x55, 0x0B, 0x09, 0x53, 0x55, 0x4E, 0x4C, 0x41, 0x4E, 0x54, 0x30, 0x30, 0x31};//0x02 01 06 03 03 30 FF 03 FF AA 55 0B 09 53 55 4E 4C 41 4E 54 30 30 31
    3. /**************************************************************************//**
    4. * Bluetooth stack event handler.
    5. * This overrides the dummy weak implementation.
    6. *
    7. * @param[in] evt Event coming from the Bluetooth stack.
    8. *****************************************************************************/
    9. void sl_bt_on_event(sl_bt_msg_t *evt)
    10. {
    11. sl_status_t sc;
    12. static int cntt = 0;
    13. bd_addr address;
    14. uint8_t address_type;
    15. switch (SL_BT_MSG_ID(evt->header)) {
    16. // -------------------------------
    17. // This event indicates the device has started and the radio is ready.
    18. // Do not call any stack command before receiving this boot event!
    19. case sl_bt_evt_system_boot_id:
    20. // Extract unique ID from BT Address.
    21. sc = sl_bt_system_get_identity_address(&address, &address_type);
    22. app_assert_status(sc);
    23. app_log_info("Bluetooth %s address: %02X:%02X:%02X:%02X:%02X:%02X\n",
    24. address_type ? "static random" : "public device",
    25. address.addr[5],
    26. address.addr[4],
    27. address.addr[3],
    28. address.addr[2],
    29. address.addr[1],
    30. address.addr[0]);
    31. // Create an advertising set.
    32. sc = sl_bt_advertiser_create_set(&advertising_set_handle);
    33. app_assert_status(sc);
    34. // 查找API,可以发现多个函数可以被使用
    35. //sl_bt_advertiser_set_data(advertising_set_handle, 0, sizeof(advData), advData);
    36. //sl_bt_advertiser_set_tx_power
    37. //sl_bt_legacy_advertiser_set_data
    38. // Generate data for advertising
    39. sc = sl_bt_legacy_advertiser_generate_data(advertising_set_handle,
    40. sl_bt_advertiser_general_discoverable);
    41. app_assert_status(sc);
    42. // Set advertising interval to 100ms.
    43. // 设置广播间隔为1000ms,一直广播不停止
    44. sc = sl_bt_advertiser_set_timing(
    45. advertising_set_handle,
    46. 1600, // min. adv. interval (milliseconds * 1.6) 320ms
    47. 1600, // max. adv. interval (milliseconds * 1.6) 400ms
    48. 0, // adv. duration
    49. 0); // max. num. adv. events
    50. app_assert_status(sc);
    51. // 设置广播消息,放在此处有效而不能紧靠放在sl_bt_advertiser_create_set之后
    52. sc = sl_bt_legacy_advertiser_set_data(advertising_set_handle, sl_bt_advertiser_advertising_data_packet, sizeof(advData), advData);
    53. app_assert_status(sc);
    54. // Start advertising and enable connections.
    55. sc = sl_bt_legacy_advertiser_start(advertising_set_handle,
    56. sl_bt_advertiser_connectable_scannable);
    57. app_assert_status(sc);

    注意,广播消息的设置,要有正确的顺序才行;

    由于完整有用的例程不多,所以只能阅读【sl_bt_api.h】文件,除了函数,也需要看看结构体定义,多试是能将接口用起来。

    蓝牙属性配置UI的使用

    ID必须要有,不然event中找不到此信号

    代码中对属性数据的设置:

    在这里,似乎只能不使用Generic Attribute服务,而不能使其为空,这是UI配置工具的局限吧,具体如何设置为空暂不考虑。

    蓝牙参数的初始化配置,顺便地,,看下其他所有可配置的组件:

    设置连接参数

    广播参数在上边代码中已经说明。那连接参数呢?

    经过测试,需要放到连接打开时间中,调用“sl_bt_connection_set_parameters”

    1. // -------------------------------
    2. // This event indicates that a new connection was opened.
    3. case sl_bt_evt_connection_opened_id:
    4. app_log_info("Connection opened.\n");
    5. // evt_connection_opened发生之后
    6. sl_bt_connection_set_parameters(evt->data.evt_connection_opened.connection, 256, 320, 0, 400, 0, 0x7FFF); //320ms-400ms的通信间隔
    7. //sl_bt_connection_set_parameters(evt->data.evt_connection_opened.connection, 10, 20, 0, 400, 0, 0x7FFF); //12.5ms-25ms的通信间隔
    8. break;

    如何验证这个链接参数设置成功呢?

    借助ssv5集成的功率监控:

    放大电流曲线图,可以清晰识别出通信阶段的蓝牙连接间隔。

    注意,连接间隔受APP侧的控制,调试app可以调整此参数。此处设置相当于设置了一个默认值。具体的内容还有待了解。

    (补充):此处遇到了手机不兼容的情况,刷机的红米,连接之后自动将间隔设置为最短!可能那些能刷机的手机在蓝牙稳定性上有更多不确定,需要注意。

    使用app_timer

    添加timer模块:

    参考吞吐量例程,可知其用法:

    1. #include "app_timer.h"
    2. static app_timer_t refresh_timer;
    3. static void refresh_timer_callback(app_timer_t *timer,
    4. void *data)
    5. {
    6. (void)timer;
    7. (void)data;
    8. timer_on_refresh_rssi();
    9. }
    10. /**************************************************************************//**
    11. * Start RSSI refresh timer
    12. *****************************************************************************/
    13. void timer_refresh_rssi_start(void)
    14. {
    15. // Start refresh timer
    16. sl_status_t sc;
    17. sc = app_timer_start(&refresh_timer,
    18. THROUGHPUT_CENTRAL_REFRESH_TIMER_PERIOD,
    19. refresh_timer_callback,
    20. NULL,
    21. true);
    22. app_assert_status(sc);
    23. }
    24. /**************************************************************************//**
    25. * Stop RSSI refresh timer
    26. *****************************************************************************/
    27. void timer_refresh_rssi_stop(void)
    28. {
    29. // Stop refresh timer
    30. sl_status_t sc;
    31. sc = app_timer_stop(&refresh_timer);
    32. app_assert_status(sc);
    33. }
    34. /**************************************************************************//**
    35. * Event handler for timer
    36. *****************************************************************************/
    37. void timer_on_refresh_rssi(void)
    38. {
    39. sl_status_t sc;
    40. if (connection_handle_central != SL_BT_INVALID_CONNECTION_HANDLE && central_state.state != THROUGHPUT_STATE_TEST) {
    41. sc = sl_bt_connection_get_rssi(connection_handle_central);
    42. app_assert_status(sc);
    43. }
    44. }

  • 相关阅读:
    水浸监测新方法,简单实用,你值得拥有!
    发展之路是怎么样? 防爆机器人的未来发展之路是怎么样
    解决库存扣减及订单创建时防止并发死锁的问题
    leetcode-136. 只出现一次的数字
    NPI加速器在烽火科技SMT车间的应用:贴片机程序制作效率的革新
    【FAQ】本地录像视频文件如何推送到视频监控平台EasyCVR进行AI视频智能分析?
    基于PaddlePaddle训练中文标点符号模型
    软考140-上午题-【软件工程】-软件工具
    【SpringCloud-学习笔记】DockerCompose
    C++核心编程类的总结封装案例
  • 原文地址:https://blog.csdn.net/hxkrrzq/article/details/132855770