nrf52832學習筆記(6)添加uuid總結

uuid是通用唯一標識碼的意思,保證同一時空同一時空中所有機器標識唯一(百度這樣說的)

下面總結下nrf52832怎麼添加uuid.
可以做一下分類

  • 添加藍牙技術聯盟定義的uuid
  • 添加自定義的uuid

這2類又各可以分成下面2個

  • 添加服務的uuid
  • 添加特性的uuid

在總結之前先看下nordic提供的關於uuid的2個結構體

typedef struct
{ 
  uint8_t uuid128[16]; /**< Little-Endian UUID bytes. */
} ble_uuid128_t;
typedef struct
{
  uint16_t    uuid; /**< 16-bit UUID value or octets 12-13 of 128-bit UUID. */
  uint8_t     type; /**< UUID type, see @ref BLE_UUID_TYPES. If type is @ref BLE_UUID_TYPE_UNKNOWN, the value of uuid is undefined. */
} ble_uuid_t;

ble_uuid128_t 是定義128bit(16字節)uuid的結構體,採用小端模式
ble_uuid_t 是定義16bit(2字節)uuid的結構體,還用一個type元素標識是那種類型的uuid,type可以取以下值,

#define BLE_UUID_TYPE_UNKNOWN       0x00 /**< Invalid UUID type. */
#define BLE_UUID_TYPE_BLE           0x01 /**< Bluetooth SIG UUID (16-bit). */
#define BLE_UUID_TYPE_VENDOR_BEGIN  0x02 /**< Vendor UUID types start at this index (128-bit). */

1.添加藍牙技術聯盟定義的uuid

比如心電的例子中

a.添加服務的uuid

心電服務是SIG定義好的服務,所以添加SIG定義uuid

  • 定義16bit uuid
ble_uuid_t ble_uuid;
  • 對結構體賦值
BLE_UUID_BLE_ASSIGN(ble_uuid, BLE_UUID_HEART_RATE_SERVICE);

這個宏展開如下

#define BLE_UUID_BLE_ASSIGN(instance, value) do {\
            instance.type = BLE_UUID_TYPE_BLE; \
            instance.uuid = value;} while(0)

就是把結構體裏的type賦值成BLE_UUID_TYPE_BLE (SIG),16bit uuid賦值成BLE_UUID_HEART_RATE_SERVICE

  • 調用添加服務申明的api,把uuid添加到屬性表中
err_code = sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY,
                                        &ble_uuid,
                                        &p_hrs->service_handle);

BLE_GATTS_SRVC_TYPE_PRIMARY 標識該申明的服務是首要服務
&ble_uuid 就是16bit uuid 結構體地址
&p_hrs->service_handle 是這個申明服務的操作句柄

b.添加特性的uuid
  • 定義16bit uuid
ble_uuid_t ble_uuid;
  • 對結構體賦值
BLE_UUID_BLE_ASSIGN(ble_uuid, BLE_UUID_HEART_RATE_MEASUREMENT_CHAR);

就是把結構體裏的type賦值成BLE_UUID_TYPE_BLE (SIG),16bit uuid賦值成BLE_UUID_HEART_RATE_MEASUREMENT_CHAR

  • 調用添加特性申明的api,把uuid添加到屬性表中
		//屬性值
    memset(&attr_char_value, 0, sizeof(attr_char_value));

    attr_char_value.p_uuid    = &ble_uuid;
    attr_char_value.p_attr_md = &attr_md;
    attr_char_value.init_len  = hrm_encode(p_hrs, INITIAL_VALUE_HRM, encoded_initial_hrm);
    attr_char_value.init_offs = 0;
    attr_char_value.max_len   = MAX_HRM_LEN;
    attr_char_value.p_value   = NULL;//encoded_initial_hrm;

    return sd_ble_gatts_characteristic_add(p_hrs->service_handle,
                                           &char_md,
                                           &attr_char_value,
                                           &p_hrs->hrm_handles);

p_hrs->service_handle 是這個特性所屬服務的句柄
&char_md 是特性標識符結構體地址
&attr_char_value 是特性值結構體地址,其中attr_char_value.p_uuid就是指向ble_uuid(16bit uuid)的地址
&p_hrs->hrm_handles 是這個特性的句柄

2.添加自定義的uuid

藍牙串口的例子就是自定義的uuid

a.添加服務的uuid
  • 定義128bit uuid
#define NUS_BASE_UUID  {{0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x00, 0x00, 0x40, 0x6E}} 
/**< Used vendor specific UUID. */
ble_uuid128_t nus_base_uuid = NUS_BASE_UUID;

這裏定義的同時賦值了,注意是小端字節序

  • 把基礎uuid添加進協議棧
err_code = sd_ble_uuid_vs_add(&nus_base_uuid, &p_nus->uuid_type);

&p_nus->uuid_type 會返回添加進去的uuid類型

  • 調用添加服務申明的api,把uuid添加到屬性表中
    這裏還要用定義16bit uuid 用於服務申明api的入口參數
    ble_uuid.type = p_nus->uuid_type; //類型
    ble_uuid.uuid = BLE_UUID_NUS_SERVICE;//服務的uuid

    // Add the service.
    err_code = sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY,
                                        &ble_uuid,
                                        &p_nus->service_handle);
a.添加特性的uuid

和前面特性uuid添加一樣,如下

//1.定義16bit uuid結構體
ble_uuid_t          ble_uuid; 
//2.賦值
ble_uuid.type = p_nus->uuid_type;
ble_uuid.uuid = BLE_UUID_NUS_RX_CHARACTERISTIC; 
//3.特性申明
memset(&attr_char_value, 0, sizeof(attr_char_value));

attr_char_value.p_uuid    = &ble_uuid;
attr_char_value.p_attr_md = &attr_md;
attr_char_value.init_len  = sizeof(uint8_t);
attr_char_value.init_offs = 0;
attr_char_value.max_len   = BLE_NUS_MAX_RX_CHAR_LEN;

return sd_ble_gatts_characteristic_add(p_nus->service_handle,
                                           &char_md,
                                           &attr_char_value,
                                           &p_nus->rx_handles);

總結下,

  • 官方的uuid就是定義16bit uuid結構體,賦值uuid類型和uuid值,是服務的uuid就調用服務申明api,是特性uuid就調用特性申明api
  • 自定義uuid就要先定義128bit uuid結構體,調用sd_ble_uuid_vs_add把基礎uuid添加進協議棧中並獲得uuid類型,然後再定義16bit uuid結構體,賦值uuid類型和uuid值,是服務的uuid就調用服務申明api,是特性uuid就調用特性申明api

還有不管是官方還是自定義的uuid都不要忘了在廣播初始化時添加uuid列表,不然手機掃描的話掃描不出uuid信息
在這裏插入圖片描述

m_adv_uuids是一個結構體數組
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章