找回密码
 立即注册

使用微信账号登录

只需一步,快速开始

查看: 10|回复: 0

[Nordic] 谷歌查找我的设备配件(Google Find My Device Accessory)详解和应用(7) 

[复制链接]
连续签到天数:1天
签到总天数:8天
签到总奖励:36金币
发表于 昨天 09:11 | 显示全部楼层 |阅读模式
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定义了一些推荐的参数:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册  

×
楼主热帖
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
您需要登录后才可以回帖 登录 | 立即注册  

本版积分规则

小黑屋|手机版|我爱蓝牙网 - 52Bluetooth

GMT+8, 2025-8-14 04:00 , Processed in 1.810199 second(s), 13 queries , Gzip On, MemCached On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表