設置 | 登錄 | 註冊

目前共有20篇帖子。

【ble_remote工程】給藍牙設備添加Manufacturer Name String(0x2A29)屬性

1樓 巨大八爪鱼 2026-1-9 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。
3樓 巨大八爪鱼 2026-1-9 17:13

改完之後,編譯工程並燒錄到開發板上。

手機如果之前已經配對了藍牙設備,一定要先刪除,不然看不到新增的屬性或服務!!!

4樓 巨大八爪鱼 2026-1-9 17:14

手機上安裝一個名叫nRF Connect的軟體:

5樓 巨大八爪鱼 2026-1-9 17:17

打開nRF Connect軟體,找到藍牙設備,點進去。

開發板的藍牙設備名為vhid(掃描設備時的名稱)、VRemote(掃描設備時的名稱)或tRemote(配對後的名稱),三個名字都有可能。

6樓 巨大八爪鱼 2026-1-9 17:19
可以看到有Human Interface Device和Battery Service兩個服務。點一下右上角的Connect。

7樓 巨大八爪鱼 2026-1-9 17:21
點了Connect後,配對一下,就能看到Manufacturer Name String(0x2A29)的屬性值為Hello Purasbar!了。

8樓 巨大八爪鱼 2026-1-9 17:25
如果只修改了屬性值的話,不需要配對,重新連接就可以看到新內容。

但如果添加了新的屬性或服務的話,那就必須重新配對才行,不然完全看不到新添加的屬性或服務。

9樓 巨大八爪鱼 2026-1-9 17:29

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

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

10樓 巨大八爪鱼 2026-1-9 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/

11樓 巨大八爪鱼 2026-1-9 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。

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張