Overview
本文基於DA1458x SDK 5.0.4。
Device Information Service 以下簡稱DIS or DISS。DISS的代碼主要有以下兩個組C文件組成
另,DISS是依賴於APP_TASK任務來調度管理的。具體框架如下圖(摘自Dialog官方文檔)
Full DISS Database Description (DISS Database 分析)
DISS的Database的變量名爲 diss_att_db
由以下19個成員組成
No. | Name | Description |
---|---|---|
1 | DIS_IDX_SVC | Device Information Service Declaration |
2 | DIS_IDX_MANUFACTURER_NAME_CHAR | Manufacturer Name Characteristic Declaration |
3 | DIS_IDX_MANUFACTURER_NAME_VAL | Manufacturer Name Characteristic Value |
4 | DIS_IDX_MODEL_NB_STR_CHAR | Model Number String Characteristic Declaration |
5 | DIS_IDX_MODEL_NB_STR_VAL | Model Number String Characteristic Value |
6 | DIS_IDX_SERIAL_NB_STR_CHAR | Serial Number String Characteristic Declaration |
7 | DIS_IDX_SERIAL_NB_STR_VAL | Serial Number String Characteristic Value |
8 | DIS_IDX_HARD_REV_STR_CHAR | Hardware Revision String Characteristic Declaration |
9 | DIS_IDX_HARD_REV_STR_VAL | Hardware Revision String Characteristic Value |
10 | DIS_IDX_FIRM_REV_STR_CHAR | Firmware Revision String Characteristic Declaration |
11 | DIS_IDX_FIRM_REV_STR_VAL | Firmware Revision String Characteristic Value |
12 | DIS_IDX_SW_REV_STR_CHAR | Software Revision String Characteristic Declaration |
13 | DIS_IDX_SW_REV_STR_VAL | Software Revision String Characteristic Value |
14 | DIS_IDX_SYSTEM_ID_CHAR | System ID Characteristic Declaration |
15 | DIS_IDX_SYSTEM_ID_VAL | System ID Characteristic Value |
16 | DIS_IDX_IEEE_CHAR | IEEE 11073-20601 Regulatory Certification Data List Characteristic Declaration |
17 | DIS_IDX_IEEE_VAL | IEEE 11073-20601 Regulatory Certification Data List Characteristic Value |
18 | DIS_IDX_PNP_ID_CHAR | PnP ID Characteristic Declaration |
19 | DIS_IDX_PNP_ID_VAL | PnP ID Characteristic Value |
這個變量非常重要,本文我們就圍繞着它來一步步來分析。
diss_att_db結構體數組索引
首先這是一個結構體數組的索引,該索引採取的是枚舉類型,方便閱讀和理解。
///Attributes State Machine
enum
{
DIS_IDX_SVC,
DIS_IDX_MANUFACTURER_NAME_CHAR,
DIS_IDX_MANUFACTURER_NAME_VAL,
DIS_IDX_MODEL_NB_STR_CHAR,
DIS_IDX_MODEL_NB_STR_VAL,
DIS_IDX_SERIAL_NB_STR_CHAR,
DIS_IDX_SERIAL_NB_STR_VAL,
DIS_IDX_HARD_REV_STR_CHAR,
DIS_IDX_HARD_REV_STR_VAL,
DIS_IDX_FIRM_REV_STR_CHAR,
DIS_IDX_FIRM_REV_STR_VAL,
DIS_IDX_SW_REV_STR_CHAR,
DIS_IDX_SW_REV_STR_VAL,
DIS_IDX_SYSTEM_ID_CHAR,
DIS_IDX_SYSTEM_ID_VAL,
DIS_IDX_IEEE_CHAR,
DIS_IDX_IEEE_VAL,
DIS_IDX_PNP_ID_CHAR,
DIS_IDX_PNP_ID_VAL,
DIS_IDX_NB,
};
接下來我們看下attm_desc這個結構體的定義
struct attm_desc 結構體的定義
這個結構體的定義如下
/// Attribute description (used to create database)
struct attm_desc
{
/// Element UUID
uint16_t uuid;
/// Attribute permission
uint16_t perm;
/// Maximum length of the element
att_size_t max_length;
/// Current length of the element
att_size_t length;
/// Element value array
uint8_t* value;
};
我們可以看到,第一個成員是16位UUID,用來記錄這個Attribute(屬性)的UUID;
第二個成員是Attribute permission(屬性權限);
第三個成員是Maximum length of the element(元素的最大長度);
第四個成員是Current length of the element(當前元素的長處);
第五個成員是Element Value array(元素數組)。
uuid和perm爲16bit無符號整型變量,value爲uint8_t數組指針,att_size_t類型其實uint16_t
/// Attribute length type
typedef uint16_t att_size_t;
diss_att_db定義
定義如下(diss.c文件中)
/*
* DIS ATTRIBUTES
****************************************************************************************
*/
/// Full DIS Database Description - Used to add attributes into the database
const struct attm_desc diss_att_db[DIS_IDX_NB] =
{
// Device Information Service Declaration
[DIS_IDX_SVC] = {ATT_DECL_PRIMARY_SERVICE, PERM(RD, ENABLE), sizeof(diss_dis_svc),
sizeof(diss_dis_svc), (uint8_t *)&diss_dis_svc},
// Manufacturer Name Characteristic Declaration
[DIS_IDX_MANUFACTURER_NAME_CHAR] = {ATT_DECL_CHARACTERISTIC, PERM(RD, ENABLE), sizeof(diss_manufacturer_name_char),
sizeof(diss_manufacturer_name_char), (uint8_t *)&diss_manufacturer_name_char},
// Manufacturer Name Characteristic Value
[DIS_IDX_MANUFACTURER_NAME_VAL] = {ATT_CHAR_MANUF_NAME, PERM(RD, ENABLE), DIS_VAL_MAX_LEN, 0, NULL},
// Model Number String Characteristic Declaration
[DIS_IDX_MODEL_NB_STR_CHAR] = {ATT_DECL_CHARACTERISTIC, PERM(RD, ENABLE), sizeof(diss_model_nb_str_char),
sizeof(diss_model_nb_str_char), (uint8_t *)&diss_model_nb_str_char},
// Model Number String Characteristic Value
[DIS_IDX_MODEL_NB_STR_VAL] = {ATT_CHAR_MODEL_NB, PERM(RD, ENABLE), DIS_VAL_MAX_LEN, 0, NULL},
// Serial Number String Characteristic Declaration
[DIS_IDX_SERIAL_NB_STR_CHAR] = {ATT_DECL_CHARACTERISTIC, PERM(RD, ENABLE), sizeof(diss_serial_nb_str_char),
sizeof(diss_serial_nb_str_char), (uint8_t *)&diss_serial_nb_str_char},
// Serial Number String Characteristic Value
[DIS_IDX_SERIAL_NB_STR_VAL] = {ATT_CHAR_SERIAL_NB, PERM(RD, ENABLE), DIS_VAL_MAX_LEN, 0, NULL},
// Hardware Revision String Characteristic Declaration
[DIS_IDX_HARD_REV_STR_CHAR] = {ATT_DECL_CHARACTERISTIC, PERM(RD, ENABLE), sizeof(diss_hard_rev_str_char),
sizeof(diss_hard_rev_str_char), (uint8_t *)&diss_hard_rev_str_char},
// Hardware Revision String Characteristic Value
[DIS_IDX_HARD_REV_STR_VAL] = {ATT_CHAR_HW_REV, PERM(RD, ENABLE), DIS_VAL_MAX_LEN, 0, NULL},
// Firmware Revision String Characteristic Declaration
[DIS_IDX_FIRM_REV_STR_CHAR] = {ATT_DECL_CHARACTERISTIC, PERM(RD, ENABLE), sizeof(diss_firm_rev_str_char),
sizeof(diss_firm_rev_str_char), (uint8_t *)&diss_firm_rev_str_char},
// Firmware Revision String Characteristic Value
[DIS_IDX_FIRM_REV_STR_VAL] = {ATT_CHAR_FW_REV, PERM(RD, ENABLE), DIS_VAL_MAX_LEN, 0, NULL},
// Software Revision String Characteristic Declaration
[DIS_IDX_SW_REV_STR_CHAR] = {ATT_DECL_CHARACTERISTIC, PERM(RD, ENABLE), sizeof(diss_sw_rev_str_char),
sizeof(diss_sw_rev_str_char), (uint8_t *)&diss_sw_rev_str_char},
// Software Revision String Characteristic Value
[DIS_IDX_SW_REV_STR_VAL] = {ATT_CHAR_SW_REV, PERM(RD, ENABLE), DIS_VAL_MAX_LEN, 0, NULL},
// System ID Characteristic Declaration
[DIS_IDX_SYSTEM_ID_CHAR] = {ATT_DECL_CHARACTERISTIC, PERM(RD, ENABLE), sizeof(diss_system_id_char),
sizeof(diss_system_id_char), (uint8_t *)&diss_system_id_char},
// System ID Characteristic Value
[DIS_IDX_SYSTEM_ID_VAL] = {ATT_CHAR_SYS_ID, PERM(RD, ENABLE), DIS_SYS_ID_LEN, 0, NULL},
// IEEE 11073-20601 Regulatory Certification Data List Characteristic Declaration
[DIS_IDX_IEEE_CHAR] = {ATT_DECL_CHARACTERISTIC, PERM(RD, ENABLE), sizeof(diss_ieee_char),
sizeof(diss_ieee_char), (uint8_t *)&diss_ieee_char},
// IEEE 11073-20601 Regulatory Certification Data List Characteristic Value
[DIS_IDX_IEEE_VAL] = {ATT_CHAR_IEEE_CERTIF, PERM(RD, ENABLE), DIS_VAL_MAX_LEN, 0, NULL},
// PnP ID Characteristic Declaration
[DIS_IDX_PNP_ID_CHAR] = {ATT_DECL_CHARACTERISTIC, PERM(RD, ENABLE), sizeof(diss_pnp_id_char),
sizeof(diss_pnp_id_char), (uint8_t *)&diss_pnp_id_char},
// PnP ID Characteristic Value
[DIS_IDX_PNP_ID_VAL] = {ATT_CHAR_PNP_ID, PERM(RD, ENABLE), DIS_PNP_ID_LEN, 0, NULL},
};
由上述定義我們來一個個分析bas_att_db的五個成員變量。
[DIS_IDX_SVC]
首先是[DIS_IDX_SVC]成員變量。
DIS_IDX_SVC的value是diss_dis_svc變量,具體如下:
const att_svc_desc_t diss_dis_svc = ATT_SVC_BATTERY_SERVICE;
我們可以看到diss_dis_svc被賦值爲一個枚舉類型變量,具體值爲0x180A。
類似的還有ATT_SVC_GENERIC_ACCESS、ATT_SVC_GENERIC_ATTRIBUTE、ATT_SVC_BATTERY_SERVICE、ATT_SVC_HID等。
具體定義如下:
/// Common 16-bit Universal Unique Identifier
enum {
ATT_INVALID_UUID = 0,
/*----------------- SERVICES ---------------------*/
/// Generic Access Profile
ATT_SVC_GENERIC_ACCESS = 0x1800,
/// Attribute Profile
ATT_SVC_GENERIC_ATTRIBUTE,
...
/// Device Information Service
ATT_SVC_DEVICE_INFO = 0x180A,
...
/// Battery Service
ATT_SVC_BATTERY_SERVICE,
/// Blood Pressure Service
ATT_SVC_BLOOD_PRESSURE = 0x1810,
/// Alert Notification Service
ATT_SVC_ALERT_NTF = 0x1811,
/// HID Service
ATT_SVC_HID = 0x1812,
...
}
小結
DISS Database類型總結
No. | Index | enum | 類型 | UUID |
---|---|---|---|---|
1 | DIS_IDX_SVC | ATT_DECL_PRIMARY_SERVICE | DECLARATIONS | 0x2800 |
2 | DIS_IDX_MANUFACTURER_NAME_CHAR | ATT_DECL_CHARACTERISTIC | DECLARATIONS | 0x2803 |
3 | DIS_IDX_MANUFACTURER_NAME_VAL | ATT_CHAR_MANUF_NAME | CHARACTERISTICS | 0x2A29 |
4 | DIS_IDX_MODEL_NB_STR_CHAR | ATT_DECL_CHARACTERISTIC | DECLARATIONS | 0x2803 |
5 | DIS_IDX_MODEL_NB_STR_VAL | ATT_CHAR_MODEL_NB | CHARACTERISTICS | 0x2A24 |
6 | DIS_IDX_SERIAL_NB_STR_CHAR | ATT_DECL_CHARACTERISTIC | DECLARATIONS | 0x2803 |
7 | DIS_IDX_SERIAL_NB_STR_VAL | ATT_CHAR_SERIAL_NB | CHARACTERISTICS | 0x2A25 |
8 | DIS_IDX_HARD_REV_STR_CHAR | ATT_DECL_CHARACTERISTIC | DECLARATIONS | 0x2803 |
9 | DIS_IDX_HARD_REV_STR_VAL | ATT_CHAR_HW_REV | CHARACTERISTICS | 0x2A27 |
10 | DIS_IDX_FIRM_REV_STR_CHAR | ATT_DECL_CHARACTERISTIC | DECLARATIONS | 0x2803 |
11 | DIS_IDX_FIRM_REV_STR_VAL | ATT_CHAR_FW_REV | CHARACTERISTICS | 0x2A26 |
12 | DIS_IDX_SW_REV_STR_CHAR | ATT_DECL_CHARACTERISTIC | DECLARATIONS | 0x2803 |
13 | DIS_IDX_SW_REV_STR_VAL | ATT_CHAR_SW_REV | CHARACTERISTICS | 0x2A28 |
14 | DIS_IDX_SYSTEM_ID_CHAR | ATT_DECL_CHARACTERISTIC | DECLARATIONS | 0x2803 |
15 | DIS_IDX_SYSTEM_ID_VAL | ATT_CHAR_SYS_ID | CHARACTERISTICS | 0x2A23 |
16 | DIS_IDX_IEEE_CHAR | ATT_DECL_CHARACTERISTIC | DECLARATIONS | 0x2803 |
17 | DIS_IDX_IEEE_VAL | ATT_CHAR_IEEE_CERTIF | CHARACTERISTICS | 0x2A2A |
18 | DIS_IDX_PNP_ID_CHAR | ATT_DECL_CHARACTERISTIC | DECLARATIONS | 0x2803 |
19 | DIS_IDX_PNP_ID_VAL | ATT_CHAR_PNP_ID | CHARACTERISTICS | 0x2A50 |