使用gattc_client_demo 打开 hj580的notify 失败

FengXinan
Posts: 14
Joined: Tue Mar 01, 2022 2:21 am

使用gattc_client_demo 打开 hj580的notify 失败

Postby FengXinan » Tue Mar 01, 2022 2:31 am

1. hj580 是宏佳电子的基于DA14580 (蓝牙4.2)的透传芯片, ESP32(蓝牙4.2) 作为Client, 使用ESP-IDF (v4.2)的gattc_client 二次开发。
2. ESP32目前是可以发送 以及read 消息, 但不能打开notify 。 tx uuid rx uuid 以及handle 值和hj580的文档确认过。
3. 这个demo 测试过TB03F (蓝牙5.0) 以及DA14531(蓝牙5.0), 均是可以打开notify并通信的。
4. 我将ESP32 烧录官方的factory_WROOM-32.bin AT 固件, 通过AT指令写0x2902, 成功打开hj580的notify。
5. 后续测试了官方的另几个client example, 均不能打开notify。

ESP_XuLZ
Posts: 173
Joined: Fri Mar 26, 2021 6:04 am

Re: 使用gattc_client_demo 打开 hj580的notify 失败

Postby ESP_XuLZ » Tue Mar 01, 2022 8:15 am

gatt_client 是特定与gatt_server 或者 gatt_server_service_table 相配合使用的,对其他 gatt server 并不适合

通过AT固件和 AT指令写0x2902,能成功打开hj580的notify,那在gatt_client 也能够实现,AT 中也是调用相应 gatt_client 中使用的 API 进行打开 hj580 的notify的
企业微信截图_20220301160625.png
企业微信截图_20220301160625.png (14.98 KiB) Viewed 7267 times
1. 你可以打印下 esp_ble_gattc_write_char_descr 的输入参数和返回值
2. gatt_client 写入时 和 AT 写入时的 hj580 打印的 log 有什么差异,hj580 应该加下对端写入 handle、connect_id 的 log
3.如果有条件也可以使用 抓包卡 进行抓包看下

FengXinan
Posts: 14
Joined: Tue Mar 01, 2022 2:21 am

Re: 使用gattc_client_demo 打开 hj580的notify 失败

Postby FengXinan » Tue Mar 01, 2022 10:04 am

ESP_XuLZ wrote:
Tue Mar 01, 2022 8:15 am
gatt_client 是特定与gatt_server 或者 gatt_server_service_table 相配合使用的,对其他 gatt server 并不适合

通过AT固件和 AT指令写0x2902,能成功打开hj580的notify,那在gatt_client 也能够实现,AT 中也是调用相应 gatt_client 中使用的 API 进行打开 hj580 的notify的
企业微信截图_20220301160625.png
1. 你可以打印下 esp_ble_gattc_write_char_descr 的输入参数和返回值
2. gatt_client 写入时 和 AT 写入时的 hj580 打印的 log 有什么差异,hj580 应该加下对端写入 handle、connect_id 的 log
3.如果有条件也可以使用 抓包卡 进行抓包看下
hj580使用透传固件, 没有串口及源码, esp32源码的参数已经比对过好几次,返回值及回调均显示写入成功。
今天下午以使用AT指令完成通信

ESP_XuLZ
Posts: 173
Joined: Fri Mar 26, 2021 6:04 am

Re: 使用gattc_client_demo 打开 hj580的notify 失败

Postby ESP_XuLZ » Wed Mar 02, 2022 3:41 am

这个我向 AT 开发人员确认了 在 AT 中也是调用 esp_ble_gattc_write_char_descr 这个 API 使能的 notify
所以还是参数不对导致的,但是 AT 命令返回的不是 属性的 handle,是通过 service 和 char 的索引确定待操作的对象,而 gatt_client 的 API很多是通过 handle 来进行读写的, 所以很可能存在参数对应不上的问题

可以将使用 AT 固件打开 hj580 的 notify 的AT 指令完整的发下吗,如果能够抓包最好了
也可以使用手机 app nrf connect 连上 hj580 来确认 service 的结构

FengXinan
Posts: 14
Joined: Tue Mar 01, 2022 2:21 am

Re: 使用gattc_client_demo 打开 hj580的notify 失败

Postby FengXinan » Sat Mar 05, 2022 8:19 am

ESP_XuLZ wrote:
Wed Mar 02, 2022 3:41 am
这个我向 AT 开发人员确认了 在 AT 中也是调用 esp_ble_gattc_write_char_descr 这个 API 使能的 notify
所以还是参数不对导致的,但是 AT 命令返回的不是 属性的 handle,是通过 service 和 char 的索引确定待操作的对象,而 gatt_client 的 API很多是通过 handle 来进行读写的, 所以很可能存在参数对应不上的问题

可以将使用 AT 固件打开 hj580 的 notify 的AT 指令完整的发下吗,如果能够抓包最好了
也可以使用手机 app nrf connect 连上 hj580 来确认 service 的结构
AT 固件使用的是factory_WROOM-32.bin
命令 AT+BLEGATTCWR=<conn_index>,<srv_index>,<char_index>[,<desc_index>],<length>
直接像notify的uuid 的0x2902 写了两个字节的0x0100(大端顺序), 然后notify 就打开了。或者直接使用AT+SPP命令也是可以打开notify的。

ret_status = esp_ble_gattc_write_char_descr( gattc_if,
gl_profile_tab[PROFILE_A_APP_ID].conn_id,
descr_elem_result.handle,
sizeof(notify_en),
(uint8_t *)&notify_en,
ESP_GATT_WRITE_TYPE_RSP,
ESP_GATT_AUTH_REQ_NONE);
代码是使用这一行操作的, 返回结果是ok, 回调的显示也是ok , notify_en 是uint16_t notify_en = 1;
我现在可能需要学一下蓝牙抓包, 这边也没人会用。

ESP_XuLZ
Posts: 173
Joined: Fri Mar 26, 2021 6:04 am

Re: 使用gattc_client_demo 打开 hj580的notify 失败

Postby ESP_XuLZ » Mon Mar 07, 2022 1:45 am

可能需要你抓下包来确认下 AT 指令和 这个 API 空中包的区别了。很大可能仍然是 handle 值不对, 比如如果使用这个 esp_ble_gattc_write_char_descr 去写 characteristic value 属性的 handle 也不会返回错误,因为本质都是对属性值写的一个 write request

或者你可以试试 handle + 1 看看是不是可以写入notify

Jachin
Posts: 11
Joined: Fri Mar 18, 2022 9:06 pm

Re: 使用gattc_client_demo 打开 hj580的notify 失败

Postby Jachin » Fri Mar 18, 2022 9:20 pm

您好 对不起打扰您了 请问您是如何实现读和写的呢

FengXinan
Posts: 14
Joined: Tue Mar 01, 2022 2:21 am

Re: 使用gattc_client_demo 打开 hj580的notify 失败

Postby FengXinan » Mon Mar 21, 2022 5:02 am

Jachin wrote:
Fri Mar 18, 2022 9:20 pm
您好 对不起打扰您了 请问您是如何实现读和写的呢
做从机还是主机呢? 做主机的话可以参考esp-idf\examples\bluetooth\bluedroid\ble\gatt_client, 做从机可以参考esp-idf\examples\bluetooth\bluedroid\ble\gatt_server

Jachin
Posts: 11
Joined: Fri Mar 18, 2022 9:06 pm

Re: 使用gattc_client_demo 打开 hj580的notify 失败

Postby Jachin » Mon Mar 21, 2022 12:01 pm

Gatt_client看了之后还是没搞明白 不清楚怎么可以往FF10Service中的FF11写数据 FF12读数据

FengXinan
Posts: 14
Joined: Tue Mar 01, 2022 2:21 am

Re: 使用gattc_client_demo 打开 hj580的notify 失败

Postby FengXinan » Tue Mar 22, 2022 4:12 am

Jachin wrote:
Mon Mar 21, 2022 12:01 pm
Gatt_client看了之后还是没搞明白 不清楚怎么可以往FF10Service中的FF11写数据 FF12读数据
在连接成功的回调里会首先发起一个寻找服务的请求,然后在找到服务的回调里查询需要的服务特征值esp_ble_gattc_search_service(gattc_if, param->cfg_mtu.conn_id, NULL); 可以使用过滤或者在所有结果里匹配, 结果在ESP_GATTC_SEARCH_RES_EVT 得到。
status = esp_ble_gattc_get_all_char( gattc_if,
p_data->search_cmpl.conn_id,
gl_profile_tab[PROFILE_A_APP_ID].service_start_handle,
gl_profile_tab[PROFILE_A_APP_ID].service_end_handle,
char_elem_result,
&count, 0);
可以寻找该服务特征值的所有子特征值。 若需打开notify 可调用 esp_ble_gattc_register_for_notify(gattc_if, gl_profile_tab[PROFILE_A_APP_ID].remote_bda, gl_profile_tab[PROFILE_A_APP_ID].char_handle);
打开notify。 写特征值需要调用esp_err_t state = esp_ble_gattc_write_char( gl_send_arg.gattc_if,
gl_send_arg.conn_id,
gl_send_arg.char_handle,
len,
buf,
gl_send_arg.write_type,
ESP_GATT_AUTH_REQ_NONE);

Who is online

Users browsing this forum: No registered users and 83 guests