2.2 DULT在Nordic平台上的实现 DULT的模块位于: nrf\subsys\dult,通过设置CONFIG_DULT=y可以添加此模块。 Bluetooth LE服务定义如下: /* Accessory non-owner GATT service UUIDs defined by the DULT specification. */#define BT_UUID_ACCESSORY_NON_OWNER_SERVICE \ BT_UUID_DECLARE_128(BT_UUID_128_ENCODE(0x15190001, 0x12F4, 0xC226, 0x88ED, 0x2AC5579F2A85))#define BT_UUID_ACCESSORY_NON_OWNER_CHARACTERISTIC \ BT_UUID_DECLARE_128(BT_UUID_128_ENCODE(0x8E0C0001, 0x1D68, 0xFB92, 0xBF61, 0x48377421680E))BT_GATT_SERVICE_DEFINE(dult_accessory_non_owner_svc, BT_GATT_PRIMARY_SERVICE(BT_UUID_ACCESSORY_NON_OWNER_SERVICE), BT_GATT_CHARACTERISTIC(BT_UUID_ACCESSORY_NON_OWNER_CHARACTERISTIC, BT_GATT_CHRC_WRITE | BT_GATT_CHRC_INDICATE, BT_GATT_PERM_WRITE, NULL, write_accessory_non_owner, NULL), BT_GATT_CCC(NULL, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE),);通过Bluetooth LE特性作为逻辑通道,手机设备和配件设备(Accessory)之间完成信息的交互。 1)手机通过Accessory Information write commands获取Accessory的信息。Accessory通过Indication的方式返回数据。 2)手机通过Accessory Information write commands给Accessory发送控制命令。Accessory通过Indication的方式返回命令响应。 NON-OWNER CHARACTERISTIC只有在DULT功能使能的情况下才能被访问。FMDN frame广播的第7个字节的数据指示了配件设备是否支持DULT功能。 /* FMDN Frame type with Unwanted Tracking Protection Mode indication. */#define FMDN_FRAME_TYPE_UTP_MODE_OFF 0x40#define FMDN_FRAME_TYPE_UTP_MODE_ON 0x412.2.1 获取配件设备信息手机需要从配件设备上获取这些信息:产品数据(Product data),制造商名称(Manufacturer name),型号名称(Model name),配件类别(Accessory category),协议实现版本(Protocol implementation version),配件功能(Accessory capabilities),网络标识(Network ID),固件版本(Firmware version),电池类型(Battery Type)和电池电量(Battery level) Bluetooth LE特性写操作发送的读取命令的操作码如下: /* Accessory non-owner GATT service UUIDs defined by the DULT specification. */#define BT_UUID_ACCESSORY_NON_OWNER_SERVICE \ BT_UUID_DECLARE_128(BT_UUID_128_ENCODE(0x15190001, 0x12F4, 0xC226, 0x88ED, 0x2AC5579F2A85))#define BT_UUID_ACCESSORY_NON_OWNER_CHARACTERISTIC \ BT_UUID_DECLARE_128(BT_UUID_128_ENCODE(0x8E0C0001, 0x1D68, 0xFB92, 0xBF61, 0x48377421680E))BT_GATT_SERVICE_DEFINE(dult_accessory_non_owner_svc, BT_GATT_PRIMARY_SERVICE(BT_UUID_ACCESSORY_NON_OWNER_SERVICE), BT_GATT_CHARACTERISTIC(BT_UUID_ACCESSORY_NON_OWNER_CHARACTERISTIC, BT_GATT_CHRC_WRITE | BT_GATT_CHRC_INDICATE, BT_GATT_PERM_WRITE, NULL, write_accessory_non_owner, NULL), BT_GATT_CCC(NULL, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE),);配件设备需要保存和维护这些信息。这些信息放在一个叫dult_user的全局变量里面。
static const struct dult_user dult_user = { .product_data = product_data, .manufacturer_name = CONFIG_BT_FAST_PAIR_FMDN_DULT_MANUFACTURER_NAME, .model_name = CONFIG_BT_FAST_PAIR_FMDN_DULT_MODEL_NAME, .accessory_category = CONFIG_BT_FAST_PAIR_FMDN_DULT_ACCESSORY_CATEGORY, .accessory_capabilities = ( (IS_ENABLED(CONFIG_BT_FAST_PAIR_FMDN_DULT_CAPABILITY_PLAY_SOUND) ? BIT(DULT_ACCESSORY_CAPABILITY_PLAY_SOUND_BIT_POS) : 0) | (IS_ENABLED(CONFIG_BT_FAST_PAIR_FMDN_DULT_CAPABILITY_MOTION_DETECTOR_UT) ? BIT(DULT_ACCESSORY_CAPABILITY_MOTION_DETECTOR_UT_BIT_POS) : 0) | (IS_ENABLED(CONFIG_BT_FAST_PAIR_FMDN_DULT_CAPABILITY_ID_LOOKUP_BLE) ? BIT(DULT_ACCESSORY_CAPABILITY_ID_LOOKUP_BLE_BIT_POS) : 0)), .network_id = DULT_NETWORK_ID_GOOGLE, .firmware_version = { .major = CONFIG_BT_FAST_PAIR_FMDN_DULT_FIRMWARE_VERSION_MAJOR, .minor = CONFIG_BT_FAST_PAIR_FMDN_DULT_FIRMWARE_VERSION_MINOR, .revision = CONFIG_BT_FAST_PAIR_FMDN_DULT_FIRMWARE_VERSION_REVISION, },除了Product data是Google注册时的model ID,存储在数据区,电池电量是读取的实际值,其余的数据基本都是宏的形式赋值。客户可以通过修改或配置宏来配置适合自己产品的数据。 配置宏的Kconfig文件位于:nrf\subsys\bluetooth\services\fast_pair\fmdn\Kconfig 2.2.2控制设备命令控制命令主要用来控制声音(sound start和sound stop)和获取识别码(get Identifier) Bluetooth LE特性写操作发送的控制命令的操作码如下: /* DULT opcodes for Non-owner control writes. */enum anos_chrc_non_owner_control_write_opcode { ANOS_CHRC_NON_OWNER_CONTROL_WRITE_OPCODE_SOUND_START = 0x300, ANOS_CHRC_NON_OWNER_CONTROL_WRITE_OPCODE_SOUND_STOP = 0x301, ANOS_CHRC_NON_OWNER_CONTROL_WRITE_OPCODE_GET_ID = 0x404,};非所有者(Non-Owner)读取设备Identifier有个前提条件,就是设备要进入标识符读取状态(identifier read state),也就是前面提到的Identification mode。这需要用户执行一个用户操作。我们例子是按下DK上的button4,按键时间要小于3秒。 Identifier的值是EID的前 10 个字节,拼接使用 HMAC-SHA256 算法(基于恢复密钥recover key和截断后的EID)生成结果的前 8 个字节。 对应的函数是static int dult_id_payload_get(uint8_t *buf, size_t *len) 2.2.3 运动探测器(Motion Detector)DULT规定配件应配备一个能够可靠检测配件运动的运动探测器(例如,加速度计)。如果配件包含加速度计,则必须对其进行配置,使其能够检测配件任意两个轴上 ±10° 的方向变化。 当配件设备与所有者分离足够长的时间时Motion Detector模式将被激活。在此状态下,如果检测到有运动,配件就会启动响铃动作。发出的声音有助于提醒非所有者,他们携带的这个配件不属于他们,原所有者可能会利用该配件来追踪他们的位置。 在 Thingy:53 设备上,内置的加速度计用于检测运动。在DK上,可以通过按钮操作来模拟产生运动。在播放 10 次声音后,或者在检测到运动且 20 秒过去之后,运动探测器将在 CONFIG_DULT_MOTION_DETECTOR_SEPARATED_UT_BACKOFF_PERIOD 中设置的时间段内停用。如果配件再次出现在其所有者附近,运动探测器也会停用。 DULT规范里针对Motion Detector定义了一些推荐的参数:
|