Nordic 中心设备添加自定义服务处理

照搬ble_nus_c.cble_nus_c.h内容来完成自定义服务的处理。这里中心设备我采用的工程例子是 ble_app_uart_c

components\ble\ble_services\ble_nus_c中的 ble_nus_c.cble_nus_c.h 拷贝到我们的工程中。

修改文件名,避免文件重定义问题。然后就是依样画葫芦,照着 ble_nus_c.cble_nus_c.h 进行修改。

这里修改好的文件我放在 github上。

这里直接把所有的nus名字换成我们自定义的。

uuid 也换成自定义的,这里的三个 uuid 需要是连续的。

#define MYSERVICE_BASE_UUID                   {{0x66, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x00, 0x00, 0x40, 0x6E}} /**< Used vendor-specific UUID. */#define BLE_UUID_MYSERVICE_SERVICE            0x2221                      /**< The UUID of the Nordic UART Service. */
#define BLE_UUID_MYSERVICE_RX_CHARACTERISTIC  0X2222                      /**< The UUID of the RX Characteristic. */
#define BLE_UUID_MYSERVICE_TX_CHARACTERISTIC  0x2223                      /**< The UUID of the TX Characteristic. */

然后在 main 中对应的位置,添加我们自定义的服务处理。这里照着 nus 服务的代码来进行修改。

先定义服务实例。

BLE_MYSERVICE_C_DEF(m_ble_myservice_c);

然后定义服务初始化接口。

static void myservice_c_init(void)
{ret_code_t       err_code;ble_myservice_c_init_t init;init.evt_handler   = ble_myservice_c_evt_handler;init.error_handler = nus_error_handler;init.p_gatt_queue  = &m_ble_gatt_queue;err_code = ble_myservice_c_init(&m_ble_myservice_c, &init);if (err_code != NRF_SUCCESS){NRF_LOG_INFO("[%s] err_code: %d", __func__, err_code);}APP_ERROR_CHECK(err_code);
}

这里的服务初始化接口可能会报错。错误代码:0x04 ,原因:NRF_ERROR_NO_MEM

解决方案:

sdk_config.h 中为我们自定义的 uuid 分配内存空间。

运行时,根据提示RTT View打印修改 RAM 大小。

void bsp_event_handler(bsp_event_t event) 事件中添加 断连处理。

void bsp_event_handler(bsp_event_t event)
{ret_code_t err_code;switch (event){case BSP_EVENT_DISCONNECT:err_code = sd_ble_gap_disconnect(m_ble_nus_c.conn_handle, \BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
#if ENABLE_BLE_MYSERVICEerr_code = sd_ble_gap_disconnect(m_ble_myservice_c.conn_handle, \BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
#endifif (err_code != NRF_ERROR_INVALID_STATE){APP_ERROR_CHECK(err_code);}break;
}

static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) 中添加 连接处理。

经测试,这里不用添加也是可以的。

static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
{ret_code_t            err_code;ble_gap_evt_t const * p_gap_evt = &p_ble_evt->evt.gap_evt;switch (p_ble_evt->header.evt_id){case BLE_GAP_EVT_CONNECTED:// NRF_LOG_INFO("BLE_GAP_EVT_CONNECTED");err_code = ble_nus_c_handles_assign(&m_ble_nus_c, p_ble_evt->evt.gap_evt.conn_handle, NULL);
#if ENABLE_BLE_MYSERVICEerr_code = ble_myservice_c_handles_assign(&m_ble_myservice_c, p_ble_evt->evt.gap_evt.conn_handle, NULL);
#endifAPP_ERROR_CHECK(err_code);err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);APP_ERROR_CHECK(err_code);// start discovery of services. The NUS Client waits for a discovery resulterr_code = ble_db_discovery_start(&m_db_disc, p_ble_evt->evt.gap_evt.conn_handle);APP_ERROR_CHECK(err_code);break;
}

定义自定义服务的事件处理回调。照着 nus 服务的进行修改就好了。

static void ble_myservice_c_evt_handler(ble_myservice_c_t * p_ble_myservice_c, ble_myservice_c_evt_t const * p_ble_myservice_evt)
{DEBUG_INFO();ret_code_t err_code;switch (p_ble_myservice_evt->evt_type){case BLE_NUS_C_EVT_DISCOVERY_COMPLETE:NRF_LOG_INFO("Myservice Discovery complete.");err_code = ble_myservice_c_handles_assign(p_ble_myservice_c, p_ble_myservice_evt->conn_handle, &p_ble_myservice_evt->handles);APP_ERROR_CHECK(err_code);err_code = ble_myservice_c_tx_notif_enable(p_ble_myservice_c);APP_ERROR_CHECK(err_code);NRF_LOG_INFO("Connected to device with My Service.");break;case BLE_NUS_C_EVT_NUS_TX_EVT:ble_nus_chars_received_uart_print(p_ble_myservice_evt->p_data, p_ble_myservice_evt->data_len);break;case BLE_NUS_C_EVT_DISCONNECTED:NRF_LOG_INFO("Disconnected.");scan_start();break;}
}

uart_event_handle 回调中,将收到的串口数据发送到我们自定义服务的Notify 属性中。

void uart_event_handle(app_uart_evt_t * p_event)
{static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];static uint16_t index = 0;uint32_t ret_val;switch (p_event->evt_type){/**@snippet [Handling data from UART] */case APP_UART_DATA_READY:UNUSED_VARIABLE(app_uart_get(&data_array[index]));index++;if ((data_array[index - 1] == '\n') ||(data_array[index - 1] == '\r') ||(index >= (m_ble_nus_max_data_len))){NRF_LOG_DEBUG("Ready to send data over BLE NUS");NRF_LOG_HEXDUMP_DEBUG(data_array, index);do{/*****************自定义服务**********************/ret_val = ble_myservice_c_string_send(&m_ble_myservice_c, data_array, index);if ( (ret_val != NRF_ERROR_INVALID_STATE) && (ret_val != NRF_ERROR_RESOURCES) ){APP_ERROR_CHECK(ret_val);}/*******************end********************/ret_val = ble_nus_c_string_send(&m_ble_nus_c, data_array, index);if ( (ret_val != NRF_ERROR_INVALID_STATE) && (ret_val != NRF_ERROR_RESOURCES) ){APP_ERROR_CHECK(ret_val);}} while (ret_val == NRF_ERROR_RESOURCES);index = 0;}break;
}

在发现模块回调处理中添加我们自定义服务的处理函数。

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);ble_myservice_c_on_db_disc_evt(&m_ble_myservice_c, p_evt);
}

自此。我们在中心设备上的处理外围设备的自定义服务的代码就添加好了。

外围设备服务如下,都是 nus 服务基础上进行修改的。相当于我们自己新建了另外一个 nus 服务。

这里我的自定义服务是在 Nordic 52810 上跑的。然后将 Nordic 52840 作为中心设备来连接这个外围设备。UART Service 用工程中原有的。然后Unknown Service 采用我们自己的服务处理来进行连接和处理。

这里中心设备为Nordic Downgle ,通过串口连接PC, PC串口助手发送数据到 Downgle,然后 Downgle 会通过 NUSMYSERVICE 两个服务将串口接收到的数据发送到外围设备对应的两个服务上。

这里DB发现模块,会在建立连接后,按照我们设置的 uuid 来依次发现我们定义的服务,并建立连接。

这里,外围设备上对应服务的回数据处理回调(nus_new_data_handlernus_data_handler)接收到了来自中心设备的两个服务处理的数据。

Nordic 中心设备添加自定义服务处理相关推荐

  1. Android-低功耗蓝牙(BLE)-客户端(主机/中心设备)和服务端(从机/外围设备)

    参考: https://developer.android.com/guide/topics/connectivity/bluetooth-le http://a1anwang.com/post-47 ...

  2. 面对不同用户,数据中心如何将服务做到极致

    数据中心是一个面向特定人群提供服务的数据处理中心,当然,向互联网的数据中心往往受众面要广一些,几乎所有人都可以访问,并享受到优质服务.一个数据中心对外提供的服务质量直接决定了其未来发展的潜力,所以每个 ...

  3. Anroid BLE蓝牙(手机分别作为中心设备和外围设备)

    蓝牙是一种短距的无线通讯技术,可实现固定设备.移动设备之间的数据交换.一般将蓝牙3.0之前的BR/EDR蓝牙称为传统蓝牙,而将蓝牙4.0规范下的LE蓝牙称为低功耗蓝牙. BLE蓝牙模块主要应用领域 1 ...

  4. 世纪互联交付中心总监李少春:数据中心基础与服务探讨

    近日,TGO 鲲鹏会广州分会会员.世纪互联交付中心总监李少春作为 TGO 线上分享第五季的嘉宾,以直播的形式向大家分享了数据中心基础与服务探讨.本文根据当天直播内容整理.更多精彩内容请关注公众号:TG ...

  5. XENIRO 讯琥科技应用案例(七)| 边缘计算和区块链赋能设备即服务(EaaS)

    2020-2030年是机器经济蓬勃发展的十年,工业自动化程度会大幅提升,企业的服务模式也将经历重大变革. 需求决定未来.在以往的商业模式中,个人和企业用户习惯通过购买设备来获得所需要的服务,并承担相应 ...

  6. 我国数据中心产业发展“渐入佳境” 服务是重中之重

    "互联网"战略的提出,为我国数据中心产业的发展注入了新的动力.2015年,我国数据中心产业规模不断扩大,建设布局趋于合理,而在产业界的共同推动下,数据中心的应用技术创新加速,行业标 ...

  7. 微服务 注册中心_4.微服务架构的第二个组件:注册中心

    在微服务架构下,主要有三种角色: 服务提供者(RPC Server) 服务消费者(RPC Client) 服务注册中心(Registry) RPC Server:服务提供者,启动时根据服务发布文件se ...

  8. 设备接入服务,看完这篇给你整的明明白白

    摘要:设备接入服务能够帮助物联网行业用户快速完成设备联网及行业应用集成. 本文分享自华为云社区<华为云IoT设备接入服务都有哪些功能?看完给你整的明明白白>,作者:Super.雯. 设备接 ...

  9. 支付宝也跟上了!免费办理ETC 还提供设备包邮服务

    7月1日消息,根据交通运输部政策,今天起,全国ETC车载装置设备进入免费时代.与此同时,支付宝也方面宣布,从今天起,可以免费办理ETC了.根据支付宝官位发布的信息显示,目前,中国邮政储蓄银行已联合支付 ...

最新文章

  1. 使用squid配置透明代理并对上网行为进行控制
  2. 曼哈顿距离java实现_基于javascript实现获取最短路径算法代码实例
  3. 在Mac下SVN(Cornerstone)迁出代码
  4. Log4j Bug –减慢您的应用程序
  5. sqlserver 如何把一列分为一行显示_SqlServer数据库如何快速修改表的一列值
  6. c语言程序执行完main函数后,一个c程序在执行main函数之前和main之后都做了那些事情啊该如何解决...
  7. Java 目录操作二(获取文件的上级目录、获取目录最后修改时间、打印目录结构、遍历指定目录下的所有目录)
  8. 前端 HTML 获取自定义标签tag 的值方法
  9. java正则学习笔记
  10. gdb调试daemon程序
  11. Javascript常见设计模式解析
  12. 6842. 【2020.11.5提高组模拟】淘淘蓝蓝之扮猪吃愉悦
  13. 【双轨】分销+量碰+返利+加权分红源码系统 演示网站
  14. 【计算机网络】计算机网络的体系结构
  15. JLabel.setBounds的四个参数
  16. 两步就能使用pyqt制作软件界面,写一个基于you-get的windows端app
  17. 扫地机器人作文说明文提纲_关于物品的说明文:扫地机器人的自述
  18. 使用 spring 集成 dbcp 数据库连接池到 Wowza 插件
  19. matlab这么画三维函数图,matlab 画三维图函数
  20. Android聊天软件的开发(七)--聊天通信

热门文章

  1. linux下使用异步通知
  2. RoboCom大赛——7-1懂得都懂
  3. 通用实时日志分类统计实践
  4. 百度发力AI药物发现领域,“AI生态型”公司“名副其实”?
  5. GCN (Graph Convolutional Network) 图卷积网络
  6. Uusi 的 Kickstarter 成功秘诀
  7. OpenCV学习笔记——HSV颜色空间超极详解inRange函数用法及实战
  8. Ubuntu 19 忘记登陆密码重设密码
  9. php中strpos(), stripos(),strrpos(), strripos()的区别
  10. sqoop 安装配置