Find My
Apple推出的Find My功能允许用户的设备使用此功能定位和寻找物品。通过数十亿Apple产品的Find My网络,用户可以激活私密安全的搜索功能并找到自己的物品。
Realtek基于RTL87x2x系列BLE SoC的Find My解决方案具有高集成度和出色的功耗指标等特点,方便用户对特定的Find My产品进行二次开发。
本文介绍了Find My相关信息,旨在帮助用户搭建Find My环境。
术语
Apple设备:指iPhone、iPad、iPod touch、Apple Watch或Mac(运行iOS、iPadOS、watchOS或macOS)
配件:指任何旨在通过本规范中描述的方式与设备交互的产品
Apple ID:Apple用于iPhone、iPad、Mac和其他Apple设备和服务的身份验证方法。当使用Apple ID登录Apple设备时,设备将自动使用与Apple ID关联的设置。
实用案例
下图显示了Find My应用包含的模块概览。
支持功能
Realtek Find My应用为Find My功能提供全面支持。
支持Unwanted Tracking Detection (UT)功能
支持播放声音功能
支持电池电压检测
支持Unified Accessory Restore Protocol (UARP)
支持硬件SHA256加密
RTL87x2x 系列支持BLE 5.3协议,具有 1.8V 至 3.3V 的宽电源范围,开发人员可以更灵活地选用适配的外设。
环境需求
RTL87x2G EVB
G-sensor 模块(DA213B)
Buzzer 模块
ARM Keil MDK: https://developer.arm.com
BeeMPTool_kits: RealMCU
DebugAnalyzer: RealMCU
Token_Decode:
SDK\tools\findmy\findmy_token_decode\TOKEN_DECODE.exe
mfigr2: MFi Portal
至少一台安装iOS 14.5及以上版本的Apple设备
至少一份获批的“Find My Network产品计划”和对应的软件身份验证 token 及 UUID
已注册用于 MFi 程序系统的企业Apple ID
Find My应用(Apple 设备原生应用)
Find My Certification Assistant应用
软件身份验证 Token/UUID
被许可方必须将预配置的软件身份验证Token及UUID烧录到Realtek非易失性存储器 (Flash) 中,以便Find My Network服务器进行验证配对。 根据 FMNA 规范,软件身份验证Token仅在每次配对中有效。 将第一个软件身份验证令牌写入配件Flash,在配对期间从iOS设备收到新Token时,将在Flash中更新,更新后的Token即使在系统重启后仍需要保留。
请参阅 Software Token Authentication Server Specification 以获取更多详细信息。
硬件连线
G-sensor模块
DA213B是FMNA中运动检测模块的MEMS加速度计,它通过 I2C 接口连接到RTL87x2x芯片。
Buzzer模块
蜂鸣器作为FMNA的发声器模块,由 PWM 波形驱动。
配置选项
SDK中Find My功能的默认配置如下:
#define APP_MAX_LINKS 2
#define DEBUG /* enable FMNA debug control point procedures */
#define SUPPORT_CUSTOMIZED_APP 0 /* set 1 to support customized app, not GFPS */
#define USE_UARP /* enable UARP firmware update function */
#ifdef USE_UARP
/* Notice: Can not enable both SUPPORT_DYNAMIC_SERVICE and SUPPORT_CUSTOMIZED_APP */
#define SUPPORT_DYNAMIC_SERVICE 1 /* set 1 to support Service Availability feature */
#endif
#define IS_RELEASE_VERSION 0 /* 1: close all log 0: open log */
#define FMNA_DISABLE_LOGS 0 /* 1: close fmna log 0: open fmna log */
- APP_MAX_LINKS:
最小配置为2,最大配置为3(RTL87x2G支持的最大slave link个数为3)。必须与 Find My config file 中的slave link数保持一致。
- DEBUG:
配置是否支持FMNA debug control point流程,认证测试时必须开启。
- SUPPORT_CUSTOMIZED_APP:
配置是否支持 自定义广播 用于与自定义APP建立BLE连接。
- USE_UARP:
配置是否支持UARP,详情请参考 OTA 。
- SUPPORT_DYNAMIC_SERVICE:
配置是否支持 动态更新服务功能 用于认证测试。
- IS_RELEASE_VERSION:
配置是否关闭日志输出串口。
- FMNA_DISABLE_LOGS:
配置是否禁用FMNA ADK日志,用于节省flash代码空间。
编译和下载
可以使用 SDK\applications\findmy\default_bin
路径下的文件进行烧录测试。
如需调整,请参阅 快速入门 进行编译和下载。值得注意的是:
在 生成Flash Map 步骤中,由于Find My application的Flash layout是特殊的,开发人员需要使用
SDK\applications\findmy\default_bin\flash_map.ini
。在 生成System Config File 步骤中,FMNA需要至少2条slave links,需要支持LE AE ADV功能。其他功能可根据需要进行配置。
在 编译APP Image 步骤中,Find My application keil工程的路径为:
SDK\applications\findmy\proj\mdk
。APP image由该工程编译得到。生成和下载Apple软件身份验证Token及UUID。
请使用路径
sdk\tools\findmy_token_decode
下的TOKEN_DECODE.exe
,生成用于下载的token.bin
。然后输入Apple发布的 base64 编码的Token字符串和对应的UUID。请使用MP Tool的 User Data 功能下载
token.bin
。在点击 User Data 按钮后,开发者可以浏览并选择Token image。写入地址是flash map中APP Defined Section的地址。危险
Find My配对后重新下载固件时,Erase All for Download 和 User Data 不可被勾选。否则,最新的Token会被删除或覆盖,永远不能再次配对。开发者可以使用MP Tool读取最新Token作为备份,或将其下载到另一台设备。
测试验证
SDK默认使用方法
在RTL87x2G EVB V2 model A上, KEY4 连接至 P0_6 。
它是与用户交互的默认接口,使用方法请参考 按键操作表。
配件状态 |
按键操作 |
配件行为 |
超时时间 |
---|---|---|---|
未配对 |
短按1次 |
发送配对广播 |
10min |
已配对 |
长按10s |
恢复出厂设置 |
N/A |
已配对 |
长按2s |
进入序列号读取状态 |
5min |
测试流程
从iOS设备启动【查找】应用程序时,您将看到如下图所示的 Items 页面。
点击 Add Item 添加一个新的设备。
点击 Other Supported Items 开始扫描配件发出的配对广播。
短按1次 EVB 上的 KEY4 发送配对广播。 当Apple设备扫描到配对广播时,将弹出如下图所示的窗口页面,然后点击 Connect 。
点击 Continue ,输入配件名,选择图标,等待完成配对流程。
完成Find My配件配对后,您可以使用【查找】应用程序测试以下功能。
配对,查看位置,移除配件。
尝试使用众包位置 -- 随附件四处移动。(确保附近有其他运行iOS 13或更高版本的iOS设备)
播放声音。
验证制造商名称、型号名称、图标等是否在页面上正确显示。
软件设计介绍
Realtek的Find My application基于Find My Network ADK V1.0, 并符合最新版本的 Find My Network Accessory Specification 。
本章主要介绍RTL87x2x Apple Find My解决方案的软件相关技术参数和行为规范,为Find My的所有功能提供软件概述,包括“FMNA状态机”、“BLE事件”、“待机和唤醒机制”、“配对流程”、“外设”等行为规范,用于指导FMNA的开发和追踪软件测试中遇到的问题。
源代码目录
工程文件目录:
sdk\application\findmy\proj
源代码目录:
sdk\application\findmy\src
Find My application中的源文件目前分为以下几类:
└── Project: findmy
├── include
└── Device includes startup code
├── startup_rtl.c
└── system_rtl.c
├── CMSE Library Non-secure callable lib
├── Lib includes all binary symbol files that user application is built on
├── Peripheral includes all peripheral drivers and module code used by the application
└── Profile includes BLE profiles or services used by the find my application
├── accessory_info_service.c
├── findmy_network_service.c
├── firmware_update_service.c
└── tps.c tx power service
└── APP includes the find my user application implementation
├── app_task.c
├── findmy_app.c
├── main.c
├── reset_watch_dog_timer.c
└── dfu_common.c
└── FMNA_peripheral includes other peripherals used by find my application
├── da213b.c
└── key_handle.c
├── FMNA_adk includes find my source code provided by Apple
├── FMNA_platform includes Realtek platform layer source code based on FMNA ADK
├── UARPDK includes UARP source code provided by Apple
├── crypto includes the algorithm used by the find my application
└── MbedTLS includes the algorithm source code of the mbedtls open source library
Flash布局
应用程序默认的flash布局头文件: sdk\application\findmy\proj\flash_map.h
Example layout with a total flash size of 1MB |
Size(byte) |
Start Address |
---|---|---|
Reserved |
4K |
0x04000000 |
OEM Header |
4K |
0x04001000 |
Bank0 Boot Patch |
32K |
0x04002000 |
Bank1 Boot Patch |
32K |
0x0400A000 |
OTA Bank0 |
612K |
0x04012000 |
|
4K |
0x04012000 |
|
32K |
0x04013000 |
|
60K |
0x0401B000 |
|
212K |
0x0402A000 |
|
304K |
0x0405F000 |
|
4K |
0x040AB000 |
|
0K |
0x040AC000 |
|
0K |
0x040AC000 |
|
0K |
0x040AC000 |
|
0K |
0x040AC000 |
|
0K |
0x040AC000 |
|
0K |
0x040AC000 |
OTA Bank1 |
0K |
0x040AC000 |
Bank0 Secure APP code |
0K |
0x040AC000 |
Bank0 Secure APP Data |
0K |
0x040AC000 |
Bank1 Secure APP code |
0K |
0x040AC000 |
Bank1 Secure APP Data |
0K |
0x040AC000 |
OTA Temp |
308K |
0x040AC000 |
FTL |
16K |
0x040F9000 |
APP Defined Section1 |
8K |
0x040FD000 |
APP Defined Section2 |
0K |
0x040FF000 |
重要
如需调整Flash布局,请参考 快速入门 中 生成Flash Map 的步骤。
调整Flash布局后,必须使用新的
flash_map.ini
重新进行 生成OTA header 和 生成System Config File 步骤。调整Flash布局后,必须使用新的
flash_map.h
替换SDK\applications\findmy\proj\flash_map.h
重新进行 编译APP Image 步骤。
开发先决条件
开发者必须在 MFi Portal 上注册才能获得所有开发文档和工具。 以下部分将说明 Realtek SDK 中所需的信息。
MFi Portal
要获得 Apple 批准的产品计划以测试您的配件设备,请确保以下项目:
确保 MFi Portal 中 Certification 选项卡下的 Find My Data Form 已填写完整。
确保 MFi Portal 中 Certification 选项卡下的 Accessory App Information Form 已填写完整。
获得批准后,开发人员将能够获取以下数据:
Product Data
Apple服务器public keys
软件身份验证Token及UUID
被许可方用于发放Token的软件认证服务器需要根据 Software Token Authentication Server Specification 进行实现。
集成Product Plan
开发者必须将产品相关数据导入SDK中的Accessory Information Service。关于每个数据的详细信息,请参阅最新版本的 Find My Network Accessory Specification 。
下文将说明RTL87x2x Find My application中需要配置的数据。
- Product Data
一旦开发者的产品计划获得批准,该值就会在MFi Portal中提供。
备注
Product Data与产品计划ID(PPID)不同。
#define PRODUCT_DATA_VAL {0xf8, 0x6a, 0xe4, 0x3a, 0x3f, 0xbb, 0xcb, 0xb2}
- Manufacturer Name
将在【查找】应用程序中显示的制造商名称。
#define FMNA_MANUFACTURER_NAME "Realtek"
- Model Name
将在【查找】应用程序中显示的型号名称。
#define FMNA_MODEL_NAME "Realtek Reference Implementation"
- Accessory Category
请参阅最新版本 Find My Network Accessory Specification 中的Accessory Category章节。
#define ACCESSORY_CATEGORY {1}
- Accessory Capability
请参阅最新版本 Find My Network Accessory Specification 中Accessory Capability章节的进行配置。以下是 Realtek Find My application中默认支持的功能。
// Accessory capabilities bitmask as defined in Find My Network specification. // SDK supports play sound,Firmware update service,..motion detection and serial number lookup by BLE & NFC. // The capabilities must be the same as that of the Product Plan registered on MFI. SET_BIT(acc_capability, ACC_CAPABILITY_PLAY_SOUND_BIT_POS); SET_BIT(acc_capability, ACC_CAPABILITY_SRNM_LOOKUP_BLE_BIT_POS); SET_BIT(acc_capability, ACC_CAPABILITY_FW_UPDATE_SERVICE_BIT_POS); SET_BIT (acc_capability, ACC_CAPABILITY_SRNM_LOOKUP_NFC_BIT_POS); SET_BIT(acc_capability, ACC_CAPABILITY_UT_MOTION_DETECT_BIT_POS);
- Firmware Version
请参阅最新版本 Find My Network Accessory Specification 中Firmware Version章节指定的格式进行配置。
#define FW_VERSION_MAJOR_NUMBER 1 #define FW_VERSION_MINOR_NUMBER 0 #define FW_VERSION_REVISION_NUMBER 0
- Find My Network Version
必须按照最新版本 Find My Network Accessory Specification 中Find My Network version章节指定的值进行配置。
const uint32_t findmy_vers = 0x00010000; //FMN version 1.0.0
- Battery Type
请参阅最新版本 Find My Network Accessory Specification 中Battery Type章节进行配置。
#define BATTERY_TYPE 0 //0 = Powered, 1 = Non-rechargeable battery, 2 = Rechargeable battery
Apple服务器public keys
一旦开发者的产品计划获得批准,该值就会在MFi Portal中提供。
//Hardcoded values eventually read these on boot from provisioned keys; #define FMNA_SERVER_ENCRYPT_KEY "BJzFrd3QKbdTXTDm5dFtt6jSGxtItVsZ1bEQ6VvzFUXndM9Rjeu+ PHFoM+RD8RRHblpLBU42dQcFbjmVzGuWkJY=" #define FMNA_SIGN_VERIFY_KEY "BDNMWnP9Yd82Qz+8aZI245jklBLzwP3E5doLQRh3lRcIcSCIjpeSN3a6SNxRfA+ oe5xiqf7paw84QD9mnh5nVWA="
上述数据需要与 Find My Data Form 中提供的数据相匹配,以使【查找】应用程序功能正常运行。
FMNA配对中发送的软件身份验证Token及对应的UUID,对于每个物理配件都需要是唯一的。
使用唯一的软件身份验证Token及对应的UUID。
必须将第一个软件身份验证Token及对应的UUID写入配件的Flash。配对流程期间从iOS设备收到新Token时,后续Token将在Flash中更新。即使配件重新启动后,更新后的Token仍会保留。
危险
请注意,存储Token的Flash区域不得被擦除。
Token及UUID在Flash中的存储地址以及备份如下图所示。
#define APPLE_AUTH_TOKEN_SAVE_ADDRESS (BKP_DATA1_ADDR) #define APPLE_AUTH_TOKEN_BACKUP_ADDRESS (BKP_DATA1_ADDR + 0x1000)
软件架构
系统软件架构如下图所示:
- Platform:
包括OTA、Flash、FTL 等。
- IO Drivers:
提供对RTL87x2G外设接口的应用层访问。
- OSIF:
实时操作系统的抽象层。
- GAP:
用户应用程序与BLE协议栈通信的抽象层。
任务和优先级
如下图所示,用户应用程序共创建了七个任务:
各任务描述及优先级如下表:
任务 |
描述 |
优先级 |
---|---|---|
Timer |
实现FreeRTOS所需的软件定时器 |
6 |
BT Controller stack |
实现 HCI 以下的BLE协议栈 |
6 |
BT Host stack |
实现 HCI 以上的BLE协议栈 |
5 |
Application |
处理用户应用程序需求、与BLE协议栈交互 |
2 |
Idle |
运行后台任务,包括 DLPS |
0 |
备注
可以创建多个应用任务,并相应地分配内存资源。
FreeRTOS提供Idle任务和Timer任务。
已使用 SysTick 中断将任务配置为根据其优先级进行抢占。
中断服务例程 (ISR) 已由供应商实施。
程序处理流程
系统在 main()
函数中对Board、Peripherals、BT Stack、FMNA platform、Profile、Power Mechanism、Task等进行初始化。
在APP Task中对BT Stack、Profiles和Peripheral drivers进行初始化,并实现IO消息机制。
所有功能都封装为IO事件,在相应的消息处理函数中进行处理。
当系统调度成功后,APP Task会收到GAP设备状态变为ready的事件,此时会在 app_handle_dev_state_evt()
中继续进行相关的初始化流程。
功能描述 |
|
---|---|
app_global_data_init() |
初始化 |
board_init() |
初始化所需的 PAD 和 PINMUX |
bat_init_data() |
初始化电池电量数据和 ADC |
fmna_version_init() |
初始化FMNA版本数据 |
fmna_connection_init() |
初始化FMNA连接数据 |
fnma_ble_platform_init() |
|
fnma_sound_platform_init() |
初始化FMNA声音模块 |
fnma_motion_detection_init() |
初始化FMNA运动检测模块 |
pwr_mgr_init() |
初始化RTL87x2x的电源管理模块 |
sw_timer_init() |
初始化FMNA所需的软件定时器 |
task_init() |
初始化APP/BLE相关的任务 |
os_sched_init() |
开始操作系统调度 |
driver_init() |
|
fmna_crypto_init() |
依赖于配件配对状态来初始化加密信息 |
fmna_bond_info_restore() |
当 FTL 中存有绑定信息时进行初始化 |
fmna_log_serial_number() |
将此设备的序列号输出到日志中 |
le_adv_read_tx_power() |
读取Config File中配置的 TX 功率值 |
bat_update_battery_info() |
获取当前Vbat电压信息 |
fmna_state_machine_init() |
初始化FMNA状态机 |
fmna_ble_platform_init()
的详细说明:
用于初始化 gap lib以处理与BLE 关的事件。
调用 app_le_gap_init()
进行BLE参数设置,如 Device name 、 Device appearance 、 GAP Bond Manager parameters 等,并注册回调函数以处理所有 GAP 事件。
调用 fmna_gatt_platform_services_init()
将所需的BLE服务注册到APP回调函数,例如 Find My Network service 、 Find My Accessory service 和 Find My firmware update service 。有关服务的更多详细信息,请参阅 BLE服务 。
fmna_crypto_init()
的详细说明:
读取Token的前16个字节和UUID,用于在启动时输出调试日志以验证Token是否成功烧录。
如果FMNA处于配对状态,应用程序将从 FTL 区域加载保存的加密信息;否则,将初始化key context以进行进一步的配对操作。
最后,根据配置文件中配置的BT地址和当前IC型号计算出此设备的序列号。
消息和事件处理流程
对于通用外设的 ISR 或BT Stack发送的原始MSG,处理流程如下:
外设发送的MSG由MSG Distributer转发给IO MSG Handler进行处理。
BT Stack发送的MSG由MSG Distributer转发给BT State Machine,BT State Machine处理MSG并发送BT IOMSG,MSG Distributer接收BT IOMSG后转发给IO MSG Handler进行处理。
IO MSG Handler收到Message后进行判断,并调用相关Event Handler。
开发者应实现:
消息类型 |
消息描述 |
---|---|
IO_MSG_TYPE_BT_STATUS |
蓝牙状态改变事件 |
IO_MSG_TYPE_GPIO |
RTL87x2x Find My application的按键事件,详情请参阅 按键 |
IO_MSG_TYPE_DFU_VALID_FW |
验证 DFU 固件事件 |
IO_MSG_TYPE_OTHERS |
此事件将处理APP Task需要执行的函数 |
IO_MSG_TYPE_FMNA |
该事件将处理FMNA所需的所有操作 |
GAP层通过MSG和Event机制通知APP层,APP层通过API调用GAP层函数。
gap_handle_msg()
中详细的GAP消息/事件描述。
FMNA状态机
FMNA 的应用程序是单线程和事件驱动的。BLE 事件由应用程序处理并分派到 FMNA 状态机。
FMNA状态
在FMNA事件的驱动下,FMNA状态机在以下状态之间切换。
状态 |
描述 |
---|---|
FMNA_SM_BOOT |
根据配对状态启动到Pairing或Separated状态。 |
FMNA_SM_PAIR |
未配对状态,此状态下可以开始发送配对广播。 |
FMNA_SM_SEPARATED |
配件已经配对并断开连接,在重启或处于Nearby状态并超时时,进入此状态。 |
FMNA_SM_NEARBY |
配件已经配对并与所有者设备断开连接后立即进入此状态。 |
FMNA_SM_CONNECTING |
BLE连接并绑定成功,但Find My配对流程尚未开始时,配件进入此状态。 |
FMNA_SM_FMNA_PAIR |
配对流程的开始状态。当配件通过pairing control point从所有者设备接收到INITIATE_PAIRING操作码时,进入此状态。 |
FMNA_SM_FMNA_PAIR_COMPLETE |
配对流程的完成状态。当配件通过pairing control point从所有者设备接收到PAIRING_COMPLETE操作码时,进入此状态。 |
FMNA_SM_CONNECTED |
BLE连接并且配对流程完成后,配件进入此状态。 |
FMNA_SM_DISCONNECTING |
BLE断开连接的临时状态。 |
FMNA_SM_NOCHANGE |
没有变化的状态。 |
FMNA事件
事件 |
描述 |
---|---|
FMNA_SM_EVENT_BOOT |
启动事件。 |
FMNA_SM_EVENT_NEARBY_SEPARATED_TIMEOUT |
Nearby状态超时事件,切换到Separated状态。 |
FMNA_SM_EVENT_KEY_ROTATE |
关于key rotation事件的详细描述,请参阅 Find My Network Accessory Specification 的第6.3章节。 |
FMNA_SM_EVENT_BONDED |
BLE配对成功并完成链路加密的绑定事件。 |
FMNA_SM_EVENT_CONNECTED |
BLE连接事件。 |
FMNA_SM_EVENT_DISCONNECTED |
BLE断开事件。 |
FMNA_SM_EVENT_NEARBY |
BLE断开后进入Nearby状态的事件。 |
FMNA_SM_EVENT_SEPARATED |
BLE断开后进入Separated状态的事件。 |
FMNA_SM_EVENT_PAIR |
开始发送配对广播的事件。 |
FMNA_SM_EVENT_SOUND_START |
开始播放声音事件。 |
FMNA_SM_EVENT_SOUND_STOP |
停止播放声音事件。 |
FMNA_SM_EVENT_SOUND_COMPLETE |
完成播放声音事件。 |
FMNA_SM_EVENT_LOST_UT_SPEAKER_START |
未使用,与FMNA_SM_EVENT_SOUND_START事件相同。 |
FMNA_SM_EVENT_FMNA_PAIRING_INITIATE |
从所有者设备接收INITIATE_PAIRING操作码的事件。 |
FMNA_SM_EVENT_FMNA_PAIRING_FINALIZE |
从所有者设备接收FINALIZE_PAIRING操作码的事件。 |
FMNA_SM_EVENT_FMNA_PAIRING_COMPLETE |
从所有者设备接收PAIRING_COMPLETE操作码的事件。 |
FMNA_SM_EVENT_FMNA_PAIRING_MFITOKEN |
在Find My配对流程中存储所有者设备发送的新Token的事件。 |
FMNA_SM_EVENT_MOTION_DETECTED |
检测到运动的事件。 |
FMNA_SM_EVENT_DEBUG_RESET_INTO_SEPARATED |
可选。从所有者设备接收RESET操作码的事件。 |
软件定时器
Find My application中的软件定时器包含了Find My network ADK所需的定时器和Realtek平台所需的定时器。
在 otp_config.h
中,软件定时器的最大数量和软件定时器任务堆栈的大小的设置如下。
/*default software timer number is 32*/
#define TIMER_MAX_NUMBER 32
/*default software timer task stack size is 1KB*/
#define TIMER_TASK_STACK_SIZE (256 * 4)
ADK 的软件定时器
Find My Network ADK依靠多个软件定时器来驱动密钥轮换和状态机转换流程。FMNA应用程序开发人员无需更改ADK定时器逻辑。
软件定时器 |
描述 |
---|---|
m_fmna_sound_timeout_timer_id |
单次触发、默认10秒定时。 用于停止播放声音。 |
m_fmna_nearby_separated_timeout_timer_id |
单次触发、iOS可配置(默认15分钟)定时。 从Nearby状态到向状态机发送事件以进入Separated状态的超时时长。 |
m_fmna_key_rotation_timer_id |
重复触发、15分钟周期的定时。 当此定时器触发时,所有的密钥都会轮换。 |
m_fmna_one_time_key_rotation_timer_id |
单次触发、iOS配置定时。 iOS设备在执行“Latch Separated Key Config Control Point”写操作时,指定下一次密钥轮换剩余的时间,该时间少于15分钟。用于对齐密钥轮换时间为现实时间的整点整刻,如:xx:00、xx:15、xx:30、xx:48。 |
m_fmna_non_owner_connection_timeout_timer_id |
单次触发、默认10分钟定时。 配对后,BLE连接时,如果在定时时间内未完成加密链路,则配件将断开BLE连接。 |
m_fmna_pair_connection_timeout_timer_id |
单次触发、默认10分钟定时。 未配对状态下,BLE连接时,如果在定时时间内未收到iOS设备发送的INITIATE_PAIRING操作码,则配件将断开BLE连接。 |
m_fmna_persistent_connection_disconnection_timer_id |
单次触发、默认3秒定时。 用于长连接断开时的发送回连广播定时。 |
m_separated_ut_timeout_timer_id |
单次触发、默认3天定时。 启用 UT 运动检测之前处于Separated状态的定时。 |
m_motion_poll_timer_id |
重复触发、TSEPARATED_UT_SAMPLING_RATE1 或 TSEPARATED_UT_SAMPLING_RATE2 周期的定时。 在Separated状态的 UT 模式下,周期轮询检测运动。 |
m_motion_active_poll_duration_timer_id |
单次触发、默认20秒定时。 配件在首次检测到运动后,轮询检测运动的周期切换为 TSEPARATED_UT_SAMPLING_RATE2 。当定时器到期时,停止运动检测。 |
m_motion_backoff_timer_id |
单次触发、默认6小时定时。 如果配件仍在Separated状态下,则在停止运动检测时启动该定时器。当定时器到期时,配件仍在Separated状态下,则重新开始Separated UT 运动检测。 |
sn_lookup_timer |
单次触发、默认5分钟定时。 用于序列号读取状态持续时间。 |
平台层的软件定时器
FMNA开发人员可以根据产品要求修改Realtek平台层的软件定时器。
软件定时器 |
描述 |
---|---|
sn_trig_timer |
单次触发、用于按下触发加密序列号的按键的持续时间。 |
gpio_key_debounce_timer |
单次触发、用于 PAD 从 DLPS 唤醒系统时进行软件去抖动。 |
factory_reset_timer |
单次触发、用于按下触发恢复出厂设置的按键的持续时间。 |
service_chg_timer |
单次触发、用于防止动态更新服务期间出现异常导致卡死。 |
rtk_gap_timer |
单次触发、使用同步 BLE 广播接口时,用于 APP 层发出 GAP 命令到收到 GAP 异步callback的延迟。 |
aon_watch_dog_wake_up_dlps_timer |
重复触发、用于AON看门狗。 |
BLE广播
RTL87x2x Find My application 使用蓝牙5.0的 Extended Advertising 功能。
Extended Advertising包含 Advertising Set 功能,使设备能够同时支持 2 种不同的广播配置,并根据Advertising Set中定义的时间间隔交错每个广播。
使用此功能,开发人员可以轻松管理 FMNA 广播和其他自定义广播。
备注
Find My config file 中必须使能 Suppot LE AE ADV 。
广播包格式
FMNA 的广播类型为 ADV_IND,有三种广播数据:pairing、nearby和separated广播。 有关广播的详细格式定义,请参阅最新版本的 Find My Network Accessory Specification 中的Advertisements章节。
AdvA 字段是发送广播数据包的设备地址。三种 FMNA 广播均使用静态随机地址。 pairing广播的地址是随机生成的。nearby和separated的广播地址必须根据 Find My Network Accessory Specification 进行配置。
广播流程
GAP层API为异步API,如 le_adv_start()
等,不建议开发者使用。
因为,在前一个广播操作的异步结果还未完成的情况下,调用下一个API会导致操作失败,进而导致广播状态机异常。
FMNA需要频繁更改广播参数、切换广播状态,因此RTL87x2x Find My application将GAP层API封装成同步API。 实现方式是使用FIFO队列,将需要的广播操作push到列表中,当收到当前操作成功或超时的异步消息时,弹出下一个广播操作并执行。
首先,需要调用 app_le_gap_init()
来启用 GAP_PARAM_USE_EXTENDED_ADV 以使用 LE Advertising Extensions。
其次,调用 rtk_gap_task_init()
来初始化 FIFO 队列和所需的软件定时器。
然后,调用 fmna_ext_adv_init()
创建一个广播句柄来标识此Advertising Set,并在结构体 T_EXT_ADV
中初始化相关的广播参数。
结构体 T_EXT_ADV
定义如下:
typedef struct
{
uint8_t adv_event_prop;
uint32_t primary_adv_interval_min;
uint32_t primary_adv_interval_max;
uint8_t primary_adv_channel_map;
T_GAP_LOCAL_ADDR_TYPE own_address_type;
T_GAP_REMOTE_ADDR_TYPE peer_address_type;
uint8_t peer_address[6];
T_GAP_ADV_FILTER_POLICY filter_policy;
int8_t tx_power;
T_GAP_PHYS_PRIM_ADV_TYPE primary_adv_phy;
uint8_t secondary_adv_max_skip; //ignore by lagecy adv PDUs
T_GAP_PHYS_TYPE secondary_adv_phy; //ignore by lagecy adv PDUs
uint8_t adv_sid;
bool scan_req_notification_enable;
} T_EXT_ADV_PARAM;
typedef struct
{
uint8_t *p_adv_data;
uint8_t adv_data_len;
uint8_t *p_scan_rsp_data;
uint8_t scan_rsp_data_len;
bool bd_addr_update;
T_EXT_ADV_PARAM adv_param;
} T_EXT_ADV;
最后需要调用同步广播API,在 同步广播APIs 中有详细介绍。
同步广播APIs
设置广播参数
Function Name |
fmble_gap_adv_param_set |
---|---|
Function Prototype |
T_GAP_CAUSE fmble_gap_adv_param_set(uint8_t adv_handle, T_EXT_ADV adv) |
Function Description |
Set the parameters of an Extended Advertising |
Input Parameter1 |
adv_handle: The handle of the Extended Advertising |
Input Parameter2 |
The structure of the Extended Advertising parameters |
Output Parameter |
None |
Return Value |
Operation result in the |
Prerequisite |
None |
Functions Called |
|
备注
首次启动广播前必须调用
fmble_gap_adv_param_set()
设置广播参数、广播地址、广播数据和扫描响应数据。再次启动广播时,如果T_EXT_ADV
中的广播参数没有改变,则无需调用。广播参数设置成功后,GAP层的异步回调函数消息为
GAP_MSG_LE_EXT_ADV_START_SETTING
,APP层会自动调用fmble_gap_adv_cb()
,标志设置广播参数事件的完成。如果需要改变广播地址,必须将结构体
T_EXT_ADV
中的 bd_addr_update 设置为 true 。
发送广播
Function Name |
fmble_gap_adv_start |
---|---|
Function Prototype |
T_GAP_CAUSE fmble_gap_adv_start(uint8_t adv_handle, uint16_t duration) |
Function Description |
Enable an Extended Advertising in the Advertising Sets |
Input Parameter1 |
adv_handle: The handle of the Extended Advertising |
Input Parameter2 |
duration: If non-zero, indicates the duration that advertising set is enabled 0x0000: No advertising duration 0x0001-0xFFFF: Advertising duration, in units of 10ms |
Output Parameter |
None |
Return Value |
Operation result in the |
Prerequisite |
None |
Functions Called |
|
备注
成功建立BLE连接后,可连接广播会自动停止。
停止广播
Function Name |
fmble_gap_adv_stop |
---|---|
Function Prototype |
T_GAP_CAUSE fmble_gap_adv_stop(uint8_t adv_handle) |
Function Description |
Disable an Extended Advertising in the Advertising Sets |
Input Parameter |
adv_handle: The handle of the Extended Advertising |
Output Parameter |
None |
Return Value |
Operation result in the |
Prerequisite |
None |
Functions Called |
|
备注
当广播开启或者关闭成功时,GAP层异步回调函数消息为 GAP_MSG_LE_EXT_ADV_STATE_CHANGE
,APP层会自动调用函数 fmble_gap_dev_state_change()
,标志设置广播开关事件的完成。
自定义广播
RTL87x2x Find My application 中包含自定义广播的参考 demo,使用 board.h
中的宏 SUPPORT_CUSTOMIZED_APP 来开启/关闭该功能。
demo 中包含自定义广播的初始化 cust_ext_adv_init()
:创建自定义广播句柄,初始化广播参数。另外, CUST_ADV_PIN 的下降沿可以触发发送自定义广播的API cust_ext_adv_set()
。
BLE 连线时,开发者可以使用广播句柄来确认连接了哪个应用,并需要记录对应的 conn_id
。BLE 断开时,通过 conn_id
来识别断开了哪个应用。
参考代码如下:
void app_handle_conn_state_evt(uint8_t conn_id, T_GAP_CONN_STATE new_state, uint16_t disc_cause)
{
APP_PRINT_INFO4("app_handle_conn_state_evt: conn_id %d old_state %d new_state %d, disc_cause 0x%x",
conn_id, app_global_data.gap_conn_state[conn_id], new_state, disc_cause);
switch (new_state)
{
case GAP_CONN_STATE_DISCONNECTED:
{
if ((disc_cause != (HCI_ERR | HCI_ERR_REMOTE_USER_TERMINATE))
&& (disc_cause != (HCI_ERR | HCI_ERR_LOCAL_HOST_TERMINATE)))
{
APP_PRINT_ERROR1("app_handle_conn_state_evt: connection lost cause 0x%x", disc_cause);
}
if (fmna_handle_ble_evt(FMNA_DISCONNECTED, conn_id))
{
return;
}
#if SUPPORT_CUSTOMIZED_APP
//add customized disconnection event handler
#endif
......
}
break;
case GAP_CONN_STATE_CONNECTED:
{
......
uint8_t adv_handle = le_ext_adv_get_adv_handle_by_conn_id(conn_id);
APP_PRINT_INFO2("GAP_CONN_STATE_CONNECTED:conn_id=%d -> adv_handle=%d", conn_id, adv_handle);
if (app_global_data.ext_adv[FINDMY_APP].adv_handle == adv_handle)
{
fmna_handle_ble_evt(FMNA_CONNECTED, conn_id);
}
else
{
if (fmna_connection_is_fmna_paired())
{
fmna_change_pairing_mode(false);
}
#if SUPPORT_CUSTOMIZED_APP
if (app_global_data.ext_adv[CUSTOMIZED_APP].adv_handle == adv_handle)
{
//add customized connection event handler
}
......
}
break;
default:
break;
}
app_global_data.gap_conn_state[conn_id] = new_state;
}
连接和配对
链路加密密钥
配件使用 BLE Just Work 配对模式与 Apple 设备配对。
配件必须使用“查找我的网络”协议生成的 LTK 在每个后续连接上加密 BLE 链路。 有关 LTK 生成和使用的详细信息,请参阅最新版 Find My Network Accessory Specification 中的 Key Management 章节。
多链路和绑定
配件默认支持同时作为2个外设角色与central建立连线。
在RTL87x2G上,最大支持slave link数为3,因此当需要与自定义APP建立BLE连线时,对Apple Find My的2条链路没有影响。
需要在 Find My config file 中配置正确的slave link数,同时需要修改 board.h
中的宏 APP_MAX_LINKS 。
#define APP_MAX_LINKS 2
配件与同一个Apple ID的不同所有者设备使用相同的 LTK ,因此只需存储一个绑定信息。
如果开发者想要将配件与其他主角色设备连接并绑定,可以通过以下宏定义更改存储的最大绑定信息数量。
/** @brief FMNA only needs 1 bond information, GFPS does not need to bond */
#define BLE_BOND_NUM (1 + SUPPORT_CUSTOMIZED_APP)
/**
* @brief Config bt stack related feature
* @return void
*/
#ifdef BT_STACK_CONFIG_ENABLE
#include "app_section.h"
#include "gap_config.h"
APP_FLASH_TEXT_SECTION void bt_stack_config_init(void)
{
#if SUPPORT_CUSTOMIZED_APP
gap_config_max_le_paired_device(BLE_BOND_NUM);
#endif
}
#endif
app_handle_bond_modify_msg()
的作用是管理绑定信息。
demo中通过 T_LE_KEY_ENTRY
中的 local_bd_type 来区分 FMNA 和自定义APP的绑定信息。
FMNA广播的地址类型为random static,自定义广播的地址类型默认为public。
当两者相同时,开发者还可以通过 local_bd_addr 来区分绑定的APP。
开发者需要根据定制APP的索引来管理其绑定信息,比如增加、替换、删除绑定信息的逻辑。具体请参考 绑定信息存储。
BLE服务
RTL87x2x Find My application 支持以下 BLE 服务。
服务 |
源文件 |
描述 |
---|---|---|
Find My Network service |
|
As per the Find My Network service chapter in Find My Network Accessory Specification |
Accessory Information service |
|
As per the Accessory Information service chapter in Find My Network Accessory Specification |
Firmware Update service |
|
As per the Firmware Update service chapter in Find My Network Accessory Specification |
|
Transmit power service |
Find My Network服务
APP层必须处理Find My Network服务中的以下事件。
消息类型 |
消息描述 |
---|---|
FMNA_FNS_PAIRING_CP_INDEX |
pairing control point使用户能够将配件与所有者设备配对。 |
FMNA_FNS_CONFIG_CP_INDEX |
configuration control point 使用户能够在配件上配置“查找我的网络”功能并启用“查找我的网络”交互。 |
FMNA_FNS_NON_OWNER_CP_INDEX |
non-owner control point使非所有者设备能够通过播放声音来定位配件。 |
FMNA_FNS_PAIRED_OWNER_CP_INDEX |
pairing status control point使 Apple 设备能够读取配件的“查找我的网络”配对状态。 |
Accessory Information服务
此服务为移动应用程序提供必要的配件信息。 有关此参考应用程序中的数据,请参阅 集成Product Plan 。
消息类型 |
消息描述 |
---|---|
FMNA_AIS_PRODUCT_DATA_INDEX |
Product Data特征表示在提交产品计划时分配给MFi Portal中每个产品计划的 8 字节产品数据值。 |
FMNA_AIS_MANU_NAME_INDEX |
manufacturer name特征包含其品牌将出现在配件上的公司名称。 |
FMNA_AIS_MODEL_NAME_INDEX |
model name特征包含配件的制造商特定型号。 |
FMNA_AIS_ACCESSORY_CATEGORY_INDEX |
accessory category特征描述配件最相似的类别。 |
FMNA_AIS_ACCESSORY_CAPABILITY_INDEX |
accessory capability特征描述配件上支持的各种“查找我的”网络协议功能。 |
FMNA_AIS_FIRMWARE_VERSION_INDEX |
Firmware version特征描述产品上的当前固件版本。 |
FMNA_AIS_FINDMY_VERSION_INDEX |
Find My network特性表示产品符合的“查找我的网络”规范版本。 |
FMNA_AIS_BATTERY_TYPE_INDEX |
Battery type特性描述配件中使用的电池类型。 |
FMNA_AIS_BATTERY_LEVEL_INDEX |
Battery state特性表示当前电池电量。 |
动态更新服务功能
为了实现最新版本 Find My Network Accessory Specification 中Service availability章节的功能,RTL87x2x Find My application提供了动态更新服务的功能。
需要将宏 SUPPORT_DYNAMIC_SERVICE 设置为1以启用该功能。
RTL87x2x FMNA支持两种服务模式,所有者服务模式和非所有者服务模式。非所有者服务模式比所有者服务模式少一个Firmware update服务。
当进入FMNA状态机的DISCONNECTING状态时,清除服务注册表中的所有服务,并将服务模式更改为非所有者服务。
当发生BONDED事件时,注册Firmware update服务以将服务模式更改为所有者服务,因为只有所有者设备与FMNA之间的链接才能成功加密并产生BONDED事件。
FMNA外设操作流程
按键
RTL87x2x FMNA 使用按键作为物理触发机制来实现 Find My Network Accessory Specification 中定义的用户行为。
SDK 中 GPIO 按键的默认配置如下:
#if (FMNA_HD_PLATFORM_SEL == COMMON_FMNA)
#define TRIGGER_BUTTON P0_6
#define TRIG_BUTTON_IRQ GPIOA6_IRQn
#define trig_button_handler GPIOA6_Handler
#endif
/* customized adv trig pin define*/
#if SUPPORT_CUSTOMIZED_APP
#define CUST_ADV_PIN P1_2
#define CUST_ADV_PIN_IRQ GPIOA10_IRQn
#define cust_adv_pin_handler GPIOA10_Handler
#endif
按键防抖和事件处理流程
按键模块针对活动模式和睡眠模式有两种去抖机制:硬件 GPIO 去抖和软件定时器去抖。
系统处于活动模式。
如果 GPIO 处于活动模式,则将使用 GPIO 硬件去抖。
一旦硬件去抖时间到期,系统将触发中断以指示 GPIO 状态的变化。
trig_button_int_handler()
将执行按键状态处理流程。
系统处于休眠模式:GPIO 未处于工作模式。
PAD 将唤醒系统,并调用
System_Handler()
处理中断。启用软件防抖定时器gpio_key_debounce_timer。
当定时器到期时,
gpio_key_debounce_timeout_cb()
将调用trig_button_int_handler()
并执行按键状态处理流程。
按键状态处理流程。
trig_button_int_handler()
会将事件 IO_MSG_TYPE_GPIO 和子事件(包括按键状态)发布到APP Task以处理用户操作。每个子事件的含义的描述如下。
- IO_MSG_GPIO_RESET
设备恢复出厂设置,这将清除此配件中的所有“查找我的网络”数据和绑定信息,但 FTL 中存在的重要数据除外。
- IO_MSG_GPIO_TRIG_PRESS
将取决于应用程序当前状态来触发“查找我的设备”状态机的不同事件。
- IO_MSG_GPIO_TRIG_RELEASE
处理按键释放事件。
配置 GPIO 极性以检测即将到来的按下/释放事件。
按键行为
可以根据开发人员的具体项目要求调整按键操作行为。
请参阅 按键操作表 了解 RTL87x2x Find My application 中的默认操作行为。
进入DLPS状态前的PAD配置
在 gpio_key_enter_dlps_config()
中,应用程序必须依赖当前的GPIO状态来配置系统进入DLPS之前的唤醒极性。
有关更多信息,请参阅 GPIO 和 低功耗模式 。
蜂鸣器
RTL87x2x FMNA 通过 TIM2 的 PWM 驱动蜂鸣器。 通过设置宏 USE_ACTIVE_BUZZER 来开启/关闭该功能,PWM 频率可以通过宏 PWM_FREQ 配置。 如果开发者不使用 BUZZER,可以设置宏 SOUND_LED_EN 来开启 LED 模拟声音功能。
关于Sound maker的要求,请参考最新版 Find My Network Accessory Specification 中的Sound maker章节。
/* Choose one of the following functions */
#define USE_ACTIVE_BUZZER 1 /* set 1 to use active buzzer function */
#define SOUND_LED_EN 0 /* set 1 to enable LED to simulate SOUND feature */
#define PWM_FREQ 0
#if USE_ACTIVE_BUZZER
#define PWM_DEFAULT_FREQ 500
#define PWM_LOW_FREQ 200
#define PWM_MEDIUM_FREQ PWM_DEFAULT_FREQ
#define PWM_HIGH_FREQ 1000
#endif
#if SOUND_LED_EN
#define SOUND_LED_PIN P1_0
#elif USE_ACTIVE_BUZZER
#define PWM_OUT_PIN P4_0
#undef PWM_FREQ
#define PWM_FREQ PWM_DEFAULT_FREQ /* unit: Hz*/
#endif
蜂鸣器初始化
蜂鸣器的初始化代码如下:
void buzzer_init(bool enable, uint16_t pwm_freq)
{
if (enable && pwm_freq > 0)
{
Pad_Config(PWM_OUT_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_ENABLE, PAD_OUT_HIGH);
Pinmux_Config(PWM_OUT_PIN, PWM_OUT_PIN_PINMUX);
driver_pwm_init(pwm_freq);
sound_en = true;
TIM_Cmd(PWM_TIMER_NUM, ENABLE);
}
else
{
TIM_Cmd(PWM_TIMER_NUM, DISABLE);
Pad_Config(PWM_OUT_PIN, PAD_SW_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_DISABLE, PAD_OUT_HIGH);
sound_en = false;
}
}
备注
当输入参数enable为true,并且pwm_freq大于0时,蜂鸣器就会启动。
DLPS 相关处理
DLPS状态时系统会关闭外设,因此蜂鸣器打开时禁止进入DLPS状态。
相关代码如下:
static POWER_CheckResult app_dlps_check_cb(void)
{
if ((!sound_en) && is_gpio_button_allow_enter_dlps)
{
return POWER_CHECK_PASS;
}
else
{
return POWER_CHECK_FAIL;
}
}
G-Sensor
RTL87x2x FMNA 使用 MEMS 加速度计 DA213B 作为 UT 运动检测器。通过设置宏 USE_DA213B SENSOR 以启用/禁用此功能。
G-Sensor 设备的默认引脚分配如下:
#define USE_DA213B_SENSOR 1 /* set 1 to use DA213B to detect motion */
#define ACTIVE_DUR 4 /* active duration time = (ACTIVE_DUR + 1)* 1ms */
#define ACTIVE_TH 1 /* Threshold of active interrupt = ACTIVE_TH * 3.91mg (2g range) */
#if USE_DA213B_SENSOR
#define I2C_DA213B_SCL_PIN P2_4
#define I2C_DA213B_SDA_PIN P2_5
#endif
关于其行为和具体实现,请参考最新版本 Find My Network Accessory Specification 中 Unwanted Tracking Detection 章节。
G-Sensor初始化
RTL87x2x FMNA通过配置的 I2C 初始化DA213B。有关DA213B的寄存器定义,请参考DA213B的data sheet。
开发人员必须根据硬件设计在初始化时设置DA213B的范围、ODR、带宽、活动持续时间和活动阈值并启用自动睡眠功能以节省功耗。
初始化和取消初始化的参考代码如下:
bool da213b_init(void)
{
if (da213b_get_chipid() != DA213B_ID)
{
APP_PRINT_ERROR0("da213b init failed, chip id mismatch");
return false;
}
da213b_write_one_byte(DA213B_CONFIG, 0x24); //soft reset
os_delay(50);
da213b_write_one_byte(DA213B_RANGE, 0x00); //full scale = 2g
da213b_write_one_byte(DA213B_ODR_AXIS, 0x09); //ODR = 500hz
da213b_write_one_byte(DA213B_MODE_BW, 0x05); //normal mode, 100Hz Bandwidth, autosleep enable
da213b_active_detect_init();
return true;
}
bool da213b_deinit(void)
{
#if USE_ACTIVE_BUZZER
if (sound_en)
{
buzzer_init(DISABLE, 0);
}
#endif
if (da213b_get_chipid() != DA213B_ID)
{
APP_PRINT_ERROR0("da213b deinit failed, chip id mismatch");
return false;
}
da213b_write_one_byte(DA213B_MODE_BW, 0x9E); //switch to suspend mode
os_delay(50);
da213b_write_one_byte(DA213B_CONFIG, 0x24); //soft reset
return true;
}
G-Sensor中断处理
RTL87x2x FMNA 以 TSEPARATED_UT_SAMPLING_RATE1 和 TSEPARATED_UT_SAMPLING_RATE2 的采样率轮询 DA213B 的中断寄存器。
当采样率为 TSEPARATED_UT_SAMPLING_RATE1 时,将 DA213B 的中断设置配置为锁存模式。 当检测到第一个运动时,采样率将降低到 TSEPARATED_UT_SAMPLING_RATE2,并且 DA213B 的中断设置将更改为临时锁存25ms的模式 。
备注
目前的设计考虑到若蜂鸣器与G-Sensor在同一块小型 PCB 上,因每次检测到动作时需要播放声音,而第一次检测到动作时蜂鸣器的震动可能会触发后续的G-Sensor中断。因此需要每次轮询中断寄存器时都停止蜂鸣器,改为停止蜂鸣器后再暂时锁存延迟时间产生的中断。
检测运动的代码如下:
bool da213b_check_motion_flag(void)
{
uint8_t motion_flag;
if (da213b_get_chipid() != DA213B_ID)
{
APP_PRINT_ERROR0("da213b check failed, chip id mismatch");
return false;
}
#if USE_ACTIVE_BUZZER
if (sound_en)
{
APP_PRINT_INFO0("stop sound for motion detection");
da213b_write_one_byte(DA213B_INT_CONFIG, 0x80); //reset all latched int
buzzer_init(DISABLE, 0);
os_delay(30);
da213b_read_one_byte(DA213B_MOTION_FLAG, &motion_flag);
}
else
#endif
{
os_delay(30);
da213b_read_one_byte(DA213B_MOTION_FLAG, &motion_flag);
}
if (motion_flag & BIT2)
{
uint8_t active_status;
da213b_read_one_byte(DA213B_ACTIVE_STATUS, &active_status);
da213b_write_one_byte(DA213B_INT_CONFIG, 0x80); //reset all latched int
APP_PRINT_INFO1("motion detected! active status = %#x", active_status & 0x0f);
da213b_write_one_byte(DA213B_INT_LATCH, 0x0C); //after firstly MT, int latched 25ms
return true;
}
return false;
}
OTA
RTL87x2x Find My application 为配件的 OTA 提供了可选的 Unified Accessory Restore Protocol (UARP) 功能。 此协议使用Firmware update服务在配件和所有者设备之间传输 UARP 消息。有关 UARP 的详细信息,请参阅 Unified Accessory Restore Protocol Development Guide 。
设置宏 USE_UARP 以启用/禁用此功能。
此版本仅支持 FLASH 布局中不切换 bank 的 OTA 模式,也就是说,通过 UARP 传输的固件存储在 FLASH 中的 OTA Temp 区域中。固件传输完成后,RTL87x2x FMNA 将重新启动并运行新固件。
UARP 仍处于开发过程中,未来版本可能包含其他更改或修复。
备注
当开发者想要同时更新patch和app image时,请勿使用 Realtek 的 pack 工具进行打包。 需要在 mfigr2 生成的 plist 和 compose 指令中都需要填写两个 payloadsFilepath,如下所示。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC.."-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SuperBinary Firmware Version</key>
<string>1.0.4</string>
<key>SuperBinary Format Version</key>
<integer>2</integer>
<key>SuperBinary Payloads</key>
<array>
<dict>
<key>Payload 4CC</key>
<string>A104</string>
<key>Payload Filepath</key>
<string>app104.bin</string>
<key>Payload Long Name</key>
<string>bee3app</string>
<key>Payload Version</key>
<string>1.0.4</string>
</dict>
<dict>
<key>Payload 4CC</key>
<string>P611</string>
<key>Payload Filepath</key>
<string>patch611.bin</string>
<key>Payload Long Name</key>
<string>bee3patch</string>
<key>Payload Version</key>
<string>1.0.4</string>
</dict>
</array>
</dict>
</plist>
./mfigr2 superbinarycompose metaDataFilepath=UARPMFiMetaDataTable.plist plistFilepath=mfiplist.plist payloadsFilepath=app104.bin payloadsFilepath=patch611.bin superBinaryFilepath=bee3_pack_104.uarp
电池电量检测
RTL87x2x Find My application 支持 ADC 电池电压检测和低电保护功能。 通过设置宏 SUPPORT_BAT_DETECT_FEATURE 以启用/禁用内部电池电压检测过程。
FMNA 状态机触发电池检测,通常在广播数据初始化时触发,最多每 15 分钟更新一次。
电池电量检测阈值
RTL87x2x Find My application 的电源检测部分定义了以下阈值。
BAT_ENTER_LOW_POWER_THRESHOLD:从正常模式到低功耗模式的阈值(2.0V)。
当电池电压低于此阈值时,RTL87x2x FMNA 停止所有类型的广播。
BAT_ENTER_NORMAL_MODE_THRESHOLD
从低功耗模式到正常模式的阈值(2.2V)。
保留以备将来使用。
BAT_ENTER_OTA_MODE_THRESHOLD
允许进入 OTA 模式的最小阈值(2.5V)。
保留以备将来使用。
外部锂电池电量检测
如果开发者想要检测外部锂电池的电压,需要通过设置宏 SUPPORT_LITHIUM_BAT_DETECT_FEATURE 来开启/关闭该功能,并设置引脚及分压系数。
#define SUPPORT_LITHIUM_BAT_DETECT_FEATURE 0 /* set 1 to detect the lithium battery power */
#if SUPPORT_LITHIUM_BAT_DETECT_FEATURE
#define ADC_PIN P2_1
#define ADC_CHANNEL 1
#define VOLTAGE_DIVIDER 4.0 /* Vbat:Vadc = 4:1 */
#endif
常见问题
配对失败,Apple设备提示“无法继续”
需要查看log,确定断线时间点是否在Accessory端send pairing data后,Apple设备立即发起断线(断线原因0x113)。如果与上述断线时间点相同,可以确定是E2不被Apple服务器认可导致的。E2主要由software auth token及其UUID、product data组成,详见 Find My Nerwork Accessory Specification 中Table 6-1。
解决方法:
检查product data是否与使用token相匹配。
如果使用SDK中默认product data,则烧录的token必须为realtek提供的test token。 如果使用从Apple申请获取的token,则必须将SDK中product data各参数改为与申请的MFi Product Plan一致,详见 集成Product Plan 。
检查token是否正确获取并解码。
初始的token为base64编码的字符串,字符串长度为261,每个token都有其对应的UUID。需要用SDK中提供的
TOKEN_DECODE.exe
进行base64解码,生成相应的bin文件。检查token是否成功烧录
烧录成功后上电可以从firmware log中查看当前flash中token的UUID和前16字节数据,和烧录文件进行对比以检查是否正确。
log示例:
[APP] !**token and UUID address:0x40fd000 [APP] !**m_software_auth_token preview: 31 81 BF 30 4F 02 01 01 02 01 01 04 47 30 45 02 [APP] !**m_software_auth_uuid: CC E0 1A 04 71 C7 49 82 9B E6 DA D3 D0 0E 13 BF
备注
Apple设备出现“无法继续”弹窗后,必须在设置界面内关闭、开启蓝牙后才可以进行下一次配对,下滑框内开关蓝牙无效。
参考文档
Find My Network Accessory Specification R2
UARP Development Guide R2
Software Token Authentication Server Specification R2.1
Find My Network ADK Integration Guide - For ADK 1.0