获取Read和Write服务属性handle值怎么获取

在使用例程中的蓝牙主机想要对从机进行读写操作,就是针对Read和Write服务属性,是要先获取到这个属性Read和Write的UUID的handle值,那如何获取这两个handle值怎么获取,获取到之后,又怎么处理发送数据给从机和接收从机的数据?麻烦解释一下

您好,留个邮箱,给您发获取所有服务和特征的demo

主机收发代码参考博客:CH573 CH582 CH579蓝牙从机(Peripheral)/主机(Central)例程讲解一(蓝牙主从机收发数据接口说明) - WCH蓝牙应用分享 - 博客园 (cnblogs.com)


个人信息保护,已隐藏,谢谢!


已发送至邮箱,请查收。


image.png

 我用您发的程序,测试过,是能获取到例程中从机的每一个服务的,但是我通过E1 FF进行收从机的数据,也想通过E3 FF发送数据给从机,这个程序中好像没有这个操作,这个怎么实现?


您好,您从机端也是用我司的MCU做吗,看获取服务的情况,是跑的EVT中的从机例程。

如果是的话,char1已经有read权限了,char3也有write权限,这样配合获取到的char_handle,可以直接在主机例程中修改发包(默认是写centralCharVal=0x5A一个字节)。

image.png

如果不是我司MCU做从机,是其他设备,那么先要确定从机端的各个特性下有读写权限,再配合获取到的char_handle发包。


用的你们公司的CH583M的开发板,从机就是例程,主机程序就是您发给我的程序,我把程序中那个读写任务开了,但是没有反应,还是没有读写的数据的操作,就是没有写centralCharVal=0x5A一个字节,串口打印那边没有打印出来

image.png


ffe3查看到handle值是0x29,已经枚举出来,接下来就是将该handle进行write。

可以先看下这些if语句是否满足执行,如果不满足,可以暂时先屏蔽掉。

其次是查看write函数的返回值是否发送成功(返回值为0),可以手动加个打印信息看看。

image.png


.


找到问题了,我注释了if(centralProcedureInProgress == FALSE)这程序,才能对ffe3进行

write操作数据,但是不明白,程序是从你们给的,我也没有改,为啥我注释那里就能进行写操作,


image.png

你们可以拿从机例程试一下,只要注释这个地方才能写数据,


麻烦再请教一个问题,如果我想对ffe1这个里面进行read和write进行操作,是不是只要改handle的值,


PRINT("char_properties  :%02x,%s\r\n",char_properties,(char_properties&(GATT_PROP_WRITE|GATT_PROP_WRITE_NO_RSP))?"wite handle":"");

                PRINT("char_value_handle:%04x\r\n",char_value_handle);  //特征的值句柄

                PRINT("char_uuid_length :%02d\r\n",char_uuid_length);  //特征UUID的长度

                PRINT("char_uuid        :");  //打印特征UUID的值

                hex_dump(char_uuid,char_uuid_length);



              if(char_properties&(GATT_PROP_WRITE|GATT_PROP_WRITE_NO_RSP))

                {

                    centralCharHdl = char_value_handle;

                    PRINT("wtite handle:%04x\r\n",char_value_handle);

                    tmos_start_task(centralTaskId, START_READ_OR_WRITE_EVT, 1600);

                }

是这里面需要更改参数么


根据5楼你打印出来的handle值,直接填写进行write就可以了。

默认的主机例程有centralProcedureInProgress的赋值,提供你的代码可能没有赋值,只是进行的枚举操作,可以直接将if判断去掉。

进行通信需要获取到handle值,uuid是获取handle的方式,也可以抓包获取。或者到handle值后进行收发函数调用就可以了。

参考博客:

蓝牙BLE主机Central讲解三(服务枚举) - SweetTea_lllpc - 博客园 (cnblogs.com)


看了博客,里面没有对READ的操作,还是没有实现READ的功能,能否指导一下,如何写,

就是对ffe1这个里面进行read和write数据,

个人信息保护,已隐藏,


默认的例程有read函数的配置,获取到handle值后进行read数据就可以了

image.png


image.png

我在你们发的程序中,添加了一个REDA的判断,但是好像没有读取到从机的任何数据?能否提供一个能够具有READ的函数,就是能读取到从机的数据


主机枚举服务之后,直接根据handle值进行read

image.png

默认的例程就可以实现。连接之后会读取char1。如果需要一直读取就重复调用tmos任务。


注意使用GATT_DiscCharsByUUID获取到的handle,进行收发的时候需要将handle+1;使用GATT_ReadUsingCharUUID获取到的handle,直接将handle填写进行收发就可以了。


只有登录才能回复,可以选择微信账号登录