930电子网

 找回密码
 立即注册
艾克姆科技推出最新产品STC32G12K128开发板
查看: 15887|回复: 5

nrf52840蓝牙主机控制从机进入dfu升级问题

[复制链接]

3

主题

9

帖子

57

积分

注册会员

Rank: 2

积分
57
发表于 2021-1-20 10:28:02 | 显示全部楼层 |阅读模式
本帖最后由 lolifrog 于 2021-1-20 10:46 编辑

现在手上有个项目,用的都是nrf52840。现需其中一个做蓝牙主机,以蓝牙方式升级其他的从机设备,因此需要主机控制从机空中升级。

现有几个疑问:
1.是否需要额外定义一个实例?
我参考nrf52840开发指南-下册(主机部分)第八章 串口透传主机 部分代码,发现进行数据收发用了一个实例(BLE_UARTS_C_DEF(m_ble_uarts_c)),那么如果我想控制从机进入BootLoader,从而实现空中升级,是否还需要再创建一个实例?

2.如何发现从机的primary 服务、特征等?我看nrf52840开发指南-下册(主机部分)第八章 串口透传主机部分只有发现服务,发现特征的流程以及读取请求和响应数据格式,这些内容是db发现模块自动做好的吗?开发人员是不是只用关注db_disc_handler,使db发现模块得到的服务、特征等转发给对应实例?

3.蓝牙主机怎么让从机升级?
目前思路是让蓝牙主机按服务UUID发现从机0xfe59服务,找到 buttonless DFU这个特征,然后发送0x01重启进入BootLoader,然后发送升级文件到从机。由于android端这部分内容不开源,开发指南上也没有说明这部分,因此自己十分迷惑,想请教哪里有详细教程。

十分感谢!


回复

使用道具 举报

52

主题

339

帖子

6487

积分

版主

Rank: 7Rank: 7Rank: 7

积分
6487
发表于 2021-1-22 09:29:52 | 显示全部楼层
1:可以增加一个服务专门用来发送升级命令和数据,也可以利用现有的服务完成这样的操作,不过增加一个服务 会更方便合理一些。
2:发现的过程是自动完成的,可以理解为由协议栈自动完成的。开发人员无需关系发现的过程,只需关心发现的结果,也就是发现模块提交给应用程序的事件(事件回调函数)。
3:这一部分需要自己去了解DFU的数据流,不一定非要和Nordic的一样。
回复 支持 反对

使用道具 举报

3

主题

9

帖子

57

积分

注册会员

Rank: 2

积分
57
 楼主| 发表于 2021-1-22 10:24:57 | 显示全部楼层
本帖最后由 lolifrog 于 2021-1-22 10:58 编辑
强光手电 发表于 2021-1-22 09:29
1:可以增加一个服务专门用来发送升级命令和数据,也可以利用现有的服务完成这样的操作,不过增加一个服务  ...

感谢回复,在发现特征的时候遇到个问题:从机用的是“串口透传中加入dfu的例子”,蓝牙主机可以发现dfu服务(0xfe59),但找不到它下面的buttonless DFU特征,只找到一个uuid=0的特征。使用原例子可以查到串口透传服务下的000b和000c两个特征。蓝牙主机使用的是串口透传例子,暂时没用重新创建dfu的实例,在uarts实例上修改的,只改了ble_uarts_c_init函数中的两个UUID的值,在ble_uarts_c_on_db_disc_evt函数中打印收到的uuid和characteistics。
  1. ble_uarts_c_init函数内配置
  2. //DFU_BASE_UUID:用手机发现的完整128位dfu UUID :0000fe59-0000-1000-8000-00805f9b34fb
  3. ble_uuid128_t uarts_base_uuid = DFU_BASE_UUID;
  4. uart_uuid.uuid = 0xfe59

  5. ble_uarts_c_on_db_disc_evt函数中
  6. p_evt->params.discovered_db.srv_uuid.uuid可以得到0xfe59,但p_evt->params.discovered_db.charateristics 里只有一个值为0的特征
复制代码


按照串口透传例子,服务和特征好像是用一个基本的UUID,只是其中2个字节不一样,这里dfu服务的UUID和下面特征的UUID完全不同,是不是还需在从机dfu服务中添加收发特征?谢谢!
回复 支持 反对

使用道具 举报

52

主题

339

帖子

6487

积分

版主

Rank: 7Rank: 7Rank: 7

积分
6487
发表于 2021-1-23 10:20:29 | 显示全部楼层
lolifrog 发表于 2021-1-22 10:24
感谢回复,在发现特征的时候遇到个问题:从机用的是“串口透传中加入dfu的例子”,蓝牙主机可以发现dfu服 ...

是的,从机加入DFU可以参考  开发指南下册DFU章节。
回复 支持 反对

使用道具 举报

3

主题

9

帖子

57

积分

注册会员

Rank: 2

积分
57
 楼主| 发表于 2021-1-25 11:24:35 | 显示全部楼层
本帖最后由 lolifrog 于 2021-1-25 11:27 编辑
强光手电 发表于 2021-1-23 10:20
是的,从机加入DFU可以参考  开发指南下册DFU章节。

请问一下蓝牙主机可以找到DFU服务,却发现不了下面的特征是什么原因?
我用hrs的一个例子并把它的UUID改成DFU的
初始化函数:
  1. uint32_t ble_hrs_c_init(ble_hrs_c_t * p_ble_hrs_c, ble_hrs_c_init_t * p_ble_hrs_c_init)
  2. {
  3.         uint32_t      err_code;
  4.     VERIFY_PARAM_NOT_NULL(p_ble_hrs_c);
  5.     VERIFY_PARAM_NOT_NULL(p_ble_hrs_c_init);

  6.         uint8_t dfu_uuid_type;
  7.     ble_uuid_t dfu_uuid;
  8.         ble_uuid_t dfu_nus_uuid;
  9.         //DFU_BASE_UUID = {{0xfb,0x34,0x9b,0x5f,0x80,0x00,0x00,0x80,0x00,0x10,0x00,0x00,0x0,0x0,0x00,0x00}};
  10.         // 从Android Studio找到的128位dfu base UUID
  11.         ble_uuid128_t dfu_base_uuid = DFU_BASE_UUID;
  12.     err_code = sd_ble_uuid_vs_add(&dfu_base_uuid, &dfu_uuid_type);
  13.         VERIFY_SUCCESS(err_code);
  14.     dfu_uuid.type = dfu_uuid_type;            
  15.     dfu_uuid.uuid = BLE_DFU_SERVER_UUID;         //0xFE59        
  16.     p_ble_hrs_c->evt_handler                 = p_ble_hrs_c_init->evt_handler;
  17.     p_ble_hrs_c->error_handler               = p_ble_hrs_c_init->error_handler;
  18.     p_ble_hrs_c->p_gatt_queue                = p_ble_hrs_c_init->p_gatt_queue;
  19.     p_ble_hrs_c->conn_handle                 = BLE_CONN_HANDLE_INVALID;
  20.     p_ble_hrs_c->peer_hrs_db.hrm_cccd_handle = BLE_GATT_HANDLE_INVALID;
  21.     p_ble_hrs_c->peer_hrs_db.hrm_handle      = BLE_GATT_HANDLE_INVALID;

  22.     return ble_db_discovery_evt_register(&dfu_uuid);
  23. }
复制代码


发现到服务的处理函数里只是输出当前的服务uuid和特征uuid
  1. void ble_hrs_on_db_disc_evt(ble_hrs_c_t * p_ble_hrs_c, const ble_db_discovery_evt_t * p_evt)
  2. {
  3.         NRF_LOG_INFO("discovered_db.srv_uuid.uuid :%x",p_evt->params.discovered_db.srv_uuid.uuid);
  4.             // Check if the Heart Rate Service was discovered.
  5.     if (p_evt->evt_type == BLE_DB_DISCOVERY_COMPLETE &&
  6.         p_evt->params.discovered_db.srv_uuid.uuid == BLE_DFU_SERVER_UUID &&
  7.         p_evt->params.discovered_db.srv_uuid.type == BLE_UUID_TYPE_BLE)
  8.     {
  9.                 NRF_LOG_INFO("discovered_db.char_count:%x",p_evt->params.discovered_db.char_count);
  10.                 NRF_LOG_INFO("discovered_db.charateristics[i].uuid:%d",p_evt->params.discovered_db.charateristics[0].characteristic.uuid.uuid);
  11.                
  12.     }
  13. }
复制代码


结果就是可以发现DFU的服务0xfe59,但找不到它下面的特征,只有一个uuid=0的特征。请问这该怎么解决?
谢谢!




回复 支持 反对

使用道具 举报

52

主题

339

帖子

6487

积分

版主

Rank: 7Rank: 7Rank: 7

积分
6487
发表于 2021-1-30 09:45:36 | 显示全部楼层
DFU服务是自定义服务,服务的类型不能是:BLE_UUID_TYPE_BLE(这是标准服务),而应该是:BLE_UUID_TYPE_VENDOR_BEGIN类型。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|官方淘宝店|930电子网 ( 皖ICP备16000695号-2 )

GMT+8, 2024-4-20 21:13 , Processed in 0.068865 second(s), 21 queries .

快速回复 返回顶部 返回列表