设为首页收藏本站

Discuz! Board

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 19862|回复: 6
打印 上一主题 下一主题

central无法发现主服务该怎么办?

[复制链接]

1

主题

8

帖子

30

积分

新手上路

Rank: 1

积分
30
跳转到指定楼层
楼主
XWZJWWSZ 发表于 2017-11-2 09:18:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题。
我用的开发板是nordic官方NRF52832开发板。(青风nrf52832也买了,但是还要几天才收到,抓包工具也还没有 )
我接到的任务是用开发板与公司的一款产品连接并通信。
具体来说就是:开发板做CENTRAL,产品做peripheral。产品通过notification的方式将自身状态信息发送给开发板,开发板将接到的信息通过串口或LED灯闪灯反应出来。

我的基础是第一次接触蓝牙和NRF52832,已经7天了。
1,我用手机和开发板peripheral例程\ble_app_uart通信成功过。
2,我用手机和产品通信成功过。如下图:

3,但是至今从没有用开发板的central例程和产品通信成功过。
我在官方例程\ble_central\ble_app_uart_c的基础上做修改。可以扫描到产品的广播包,并根据peer_addr建立连接。
然而在这之后discovery_start也返回成功,但是在往下发现主服务的时候出了问题。
在函数:on_primary_srv_discovery_rsp中打印出错误信息:p_ble_gattc_evt->gatt_status = 0x010a 。
#define BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_FOUND        0x010A  /**< ATT Error: Used in ATT as Attribute not found. */

试了2天没有解决这个问题。请有经验的前辈提供一下思路和方向,如果能直接解决问题,感激不尽。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

1

主题

8

帖子

30

积分

新手上路

Rank: 1

积分
30
沙发
 楼主| XWZJWWSZ 发表于 2017-11-2 09:36:00 | 只看该作者
下面我具体说一下我对官方例程的修改。我用的是S132\13.0.0版本的例程。

1,修改函数is_uuid_present。
我按照青风PDF 在 case BLE_GAP_EVT_ADV_REPORT: 处打印了 收到了广播包:
p_adv_report->type = 0;
adv_report->scan_rsp = 0 ;
data is  : 0x02 , 0x01,0x06,   0x02  ,0x 0a ,0xf6,   0x05, 0xff ,0x21,0x26,0x50,0x01

然后在函数is_uuid_present内部修改:
//        if (   (field_type == BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE)
//            || (field_type == BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_COMPLETE))
                if(field_type == BLE_GAP_AD_TYPE_MANUFACTURER_SPECIFIC_DATA)

总之就是直接确认了0XFF后面是不是0X2621。如果是就返回成功然后建立连接。

但是0X2621并不是产品的UUID。而是下图所示的东西:
我对于在这里调用sd_ble_uuid_decode会不会把0X2621作为UUID传进去也感到不安,但是也不懂,也就放在那里了。




回复 支持 反对

使用道具 举报

1

主题

8

帖子

30

积分

新手上路

Rank: 1

积分
30
板凳
 楼主| XWZJWWSZ 发表于 2017-11-2 09:45:46 | 只看该作者
接下来我注意到return ble_db_discovery_evt_register(&uart_uuid);这个函数。
我理解他是要对寻找主服务做一个信息注册。uart_uuid中包含了什么样的主服务呢?
我通过在ble_db_discovery_start中串口打印信息:
("Starting discovery of service with UUID 0x%x type %d on connection handle 0x%x.\r\n",
                  p_srv_being_discovered->srv_uuid.uuid,p_srv_being_discovered->srv_uuid.type, conn_handle));
结果显示他是要找一个  UUID 是0X1039,type是2,connection handle 是0的主服务。

这里面  UUID = 0x1039是我修改的。我是根据上面截图中的UUID猜测要用0X1039来寻找。
connection handle = 0 不知怎么来的。
type = 2 这个我也不太懂,用串口跟踪了他的变化,发现在初始化的时候type = 0 。但是经过了函数sd_ble_uuid_vs_add(&nus_base_uuid, &p_ble_nus_c->uuid_type);这个type就变成2了。
而且我特意在之后修改type = 0 。结果引发了异常的错误。开发板在建立连接之后总是复位。



另外我也试过修改被动扫描为主动扫描,重新刷固件,重新解压官方例程,都是无法找到主服务,p_ble_gattc_evt->gatt_status = 0x010a

回复 支持 反对

使用道具 举报

1

主题

8

帖子

30

积分

新手上路

Rank: 1

积分
30
地板
 楼主| XWZJWWSZ 发表于 2017-11-2 09:48:14 | 只看该作者

二楼落下一张图。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

1

主题

8

帖子

30

积分

新手上路

Rank: 1

积分
30
5#
 楼主| XWZJWWSZ 发表于 2017-11-3 09:06:56 | 只看该作者
解决了,原来我犯了一个低级错误,SERVICE的16位UUID不是0X1039,而是0XBB10。
今早细读青风BLE_LED任务详解,看到UUID的详细讲解部分,才发现这个错误!!!
回复 支持 反对

使用道具 举报

243

主题

1706

帖子

6151

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6151
6#
admin 发表于 2017-11-7 11:09:01 | 只看该作者
XWZJWWSZ 发表于 2017-11-3 09:06
解决了,原来我犯了一个低级错误,SERVICE的16位UUID不是0X1039,而是0XBB10。
今早细读青风BLE_LED任务详 ...

ok,成功就好
回复 支持 反对

使用道具 举报

0

主题

1

帖子

26

积分

新手上路

Rank: 1

积分
26
7#
k_轻胜马 发表于 2019-4-3 19:20:18 | 只看该作者

您好,我也遇到了这样的问题,我用的sdk是12.3,s130。做的是用nrf51822作为主机,连接另一个BLE设备,想从它的服务中读取数据。
在这个位置p_ble_gattc_evt->gatt_status不等于success,而是BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_FOUND即0x010A。
在此之前,我已经连接上了对应设备,现在想根据uuid找到对应服务。我还根据我准备连接的设备上对应服务的uuid进行了注册,不知道是不是注册的过程出了问题,
希望得到一些指点,万分感谢!


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

Archiver|手机版|小黑屋|Comsenz Inc.   

GMT+8, 2024-11-23 09:06 , Processed in 0.131179 second(s), 29 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

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