Settings | Sign in | Sign up

There are currently 19 posts.

【ble_remote工程】给蓝牙设备添加Manufacturer Name String(0x2A29)属性

Floor 1 巨大八爪鱼 1/9/26 17:09
打开vendor/ble_remote/app_att.c文件,找到static const attribute_t my_Attributes[]数组:
    // 0x000C - 0x000E  Device Information Service
    {3,ATT_PERMISSIONS_READ,2,2,(u8*)(&my_primaryServiceUUID),     (u8*)(&my_devServiceUUID), 0, 0},
    {0,ATT_PERMISSIONS_READ,2,sizeof(my_PnCharVal),(u8*)(&my_characterUUID), (u8*)(my_PnCharVal), 0, 0},
    {0,ATT_PERMISSIONS_READ,2,sizeof (my_PnPtrs),(u8*)(&my_PnPUUID), (u8*)(my_PnPtrs), 0, 0},
把后面两行改成:
    {0,ATT_PERMISSIONS_READ,2,sizeof(my_ManufacturerNameStringVal),(u8*)(&my_characterUUID), (u8*)(my_ManufacturerNameStringVal), 0, 0},
    {0,ATT_PERMISSIONS_READ,2,15,(u8*)&my_ManufacturerNameStringVal[3],(u8*)"Hello Purasbar!",0,0},
其中15是字符串"Hello Purasbar!"的长度。

找到static const u8 my_PnCharVal[5]数组,在下面再定义一个类似的数组:
static const u8 my_ManufacturerNameStringVal[5] = {
    CHAR_PROP_READ,
    U16_LO(DeviceInformation_pnpID_DP_H), U16_HI(DeviceInformation_pnpID_DP_H),
    U16_LO(CHARACTERISTIC_UUID_MANU_NAME_STRING), U16_HI(CHARACTERISTIC_UUID_MANU_NAME_STRING)
};
其中CHARACTERISTIC_UUID_MANU_NAME_STRING的值是0x2A29。
Floor 3 巨大八爪鱼 1/9/26 17:13

改完之后,编译工程并烧录到开发板上。

手机如果之前已经配对了蓝牙设备,一定要先删除,不然看不到新增的属性或服务!!!

Floor 4 巨大八爪鱼 1/9/26 17:14

手机上安装一个名叫nRF Connect的软件:

Floor 5 巨大八爪鱼 1/9/26 17:17

打开nRF Connect软件,找到蓝牙设备,点进去。

开发板的蓝牙设备名为vhid(扫描设备时的名称)、VRemote(扫描设备时的名称)或tRemote(配对后的名称),三个名字都有可能。

Floor 6 巨大八爪鱼 1/9/26 17:19
可以看到有Human Interface Device和Battery Service两个服务。点一下右上角的Connect。

Floor 7 巨大八爪鱼 1/9/26 17:21
点了Connect后,配对一下,就能看到Manufacturer Name String(0x2A29)的属性值为Hello Purasbar!了。

Floor 8 巨大八爪鱼 1/9/26 17:25
如果只修改了属性值的话,不需要配对,重新连接就可以看到新内容。

但如果添加了新的属性或服务的话,那就必须重新配对才行,不然完全看不到新添加的属性或服务。

Floor 9 巨大八爪鱼 1/9/26 17:29

{0,ATT_PERMISSIONS_READ,2,12,(u8*)&my_ManufacturerNameStringVal[3],(u8*)"Hello World!",0,0},

长度12就是字符串的总长度,不需要在末尾加\0。

Floor 10 巨大八爪鱼 1/9/26 17:53

my_Attributes数组每个项目的最后两个0,0分别是写函数和读函数,0表示没有。

typedef int (*att_readwrite_callback_t)(void* p);

typedef struct attribute
{
  u16  attNum;
  u8   perm;
  u8   uuidLen;
  u32  attrLen;    //4 bytes aligned
  u8* uuid;
  u8* pAttrValue;
  att_readwrite_callback_t w;
  att_readwrite_callback_t r;
} attribute_t;


关于写函数和读函数的格式,可参阅官方文档:https://doc.telink-semi.cn/doc/zh/software/res/sdk/ble/b85m_ble_cn/b85m_ble_single_connection_cn/

Floor 11 巨大八爪鱼 1/9/26 17:55
写函数的固定格式:
int my_WriteCallback (void *p)
{
    rf_packet_att_data_t *pw = (rf_packet_att_data_t *)p;
    int len = pw->l2cap - 3;
    //add your code
    //valid data is pw->dat[0] ~ pw->dat[len-1]
    return 1;
}   
要写入的数据内容是pw->dat,要写入的长度是len。
返回值固定为1。

Content converter:

Reply the post
Content:
User: You are currently anonymous.
Captcha:
Unclear? Try another one.