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应用包含的模块概览。

../../../../_images/find_my_application_case.png

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 的宽电源范围,开发人员可以更灵活地选用适配的外设。

环境需求

  1. RTL87x2G EVB

  2. G-sensor 模块(DA213B)

  3. Buzzer 模块

  1. ARM Keil MDK: https://developer.arm.com

  2. BeeMPTool_kits: RealMCU

  3. DebugAnalyzer: RealMCU

  4. Token_Decode: SDK\tools\findmy\findmy_token_decode\TOKEN_DECODE.exe

  5. mfigr2: MFi Portal

  1. 至少一台安装iOS 14.5及以上版本的Apple设备

  2. 至少一份获批的“Find My Network产品计划”和对应的软件身份验证 token 及 UUID

  3. 已注册用于 MFi 程序系统的企业Apple ID

  4. Find My应用(Apple 设备原生应用)

  5. 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 以获取更多详细信息。

备注

Find My配对不等同于BLE配对。

Find My配对包含了BLE配对、绑定以及Find My特有的在BLE GATT 层的一系列数据交互过程,本文中提到的配对是指Find My配对。

硬件连线

G-sensor模块

DA213B是FMNA中运动检测模块的MEMS加速度计,它通过 I2C 接口连接到RTL87x2x芯片。

../../../../_images/G-sensor_module_board.png

G-sensor Module Board

Buzzer模块

蜂鸣器作为FMNA的发声器模块,由 PWM 波形驱动。

../../../../_images/Buzzer_module_board.png

Buzzer Module Board

配置选项

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 路径下的文件进行烧录测试。

如需调整,请参阅 快速入门 进行编译和下载。值得注意的是:

  1. 生成Flash Map 步骤中,由于Find My application的Flash layout是特殊的,开发人员需要使用 SDK\applications\findmy\default_bin\flash_map.ini

  2. 生成System Config File 步骤中,FMNA需要至少2条slave links,需要支持LE AE ADV功能。其他功能可根据需要进行配置。

../../../../_images/config_file_stack1.png

Find My config file

  1. 编译APP Image 步骤中,Find My application keil工程的路径为: SDK\applications\findmy\proj\mdk 。APP image由该工程编译得到。

  2. 生成和下载Apple软件身份验证Token及UUID。

    1. 请使用路径 sdk\tools\findmy_token_decode 下的 TOKEN_DECODE.exe ,生成用于下载的 token.bin 。然后输入Apple发布的 base64 编码的Token字符串和对应的UUID。

    2. 请使用MP Tool的 User Data 功能下载 token.bin。在点击 User Data 按钮后,开发者可以浏览并选择Token image。写入地址是flash map中APP Defined Section的地址。

      危险

      Find My配对后重新下载固件时,Erase All for DownloadUser Data 不可被勾选。否则,最新的Token会被删除或覆盖,永远不能再次配对。开发者可以使用MP Tool读取最新Token作为备份,或将其下载到另一台设备。

      ../../../../_images/MP_tool_download.png

      Configure for Flash Token

      ../../../../_images/MP_tool_user_data.png

      Select Token Image

测试验证

SDK默认使用方法

在RTL87x2G EVB V2 model A上, KEY4 连接至 P0_6

它是与用户交互的默认接口,使用方法请参考 按键操作表

按键操作表

配件状态

按键操作

配件行为

超时时间

未配对

短按1次

发送配对广播

10min

已配对

长按10s

恢复出厂设置

N/A

已配对

长按2s

进入序列号读取状态

5min

测试流程

  1. 从iOS设备启动【查找】应用程序时,您将看到如下图所示的 Items 页面。

    1. 点击 Add Item 添加一个新的设备。

      ../../../../_images/iOS_find_my_app1.png
    2. 点击 Other Supported Items 开始扫描配件发出的配对广播。

      ../../../../_images/iOS_find_my_app2.png
    3. 短按1次 EVB 上的 KEY4 发送配对广播。 当Apple设备扫描到配对广播时,将弹出如下图所示的窗口页面,然后点击 Connect

      ../../../../_images/iOS_find_my_app3.png
    4. 点击 Continue ,输入配件名,选择图标,等待完成配对流程。

      ../../../../_images/iOS_find_my_app4.png
  2. 完成Find My配件配对后,您可以使用【查找】应用程序测试以下功能。

    1. 配对,查看位置,移除配件。

      ../../../../_images/iOS_find_my_app5.png
    2. 尝试使用众包位置 -- 随附件四处移动。(确保附近有其他运行iOS 13或更高版本的iOS设备)

      ../../../../_images/iOS_find_my_app6.png
    3. 播放声音。

      ../../../../_images/iOS_find_my_app7.png
    4. 验证制造商名称、型号名称、图标等是否在页面上正确显示。

      ../../../../_images/iOS_find_my_app8.png

软件设计介绍

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

Flash布局

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

  • OTA Header

4K

0x04012000

  • System Patch code

32K

0x04013000

  • BT Lowerstack Patch code

60K

0x0401B000

  • BT Host code

212K

0x0402A000

  • APP code

304K

0x0405F000

  • APP Config File

4K

0x040AB000

  • APP data1

0K

0x040AC000

  • APP data2

0K

0x040AC000

  • APP data3

0K

0x040AC000

  • APP data4

0K

0x040AC000

  • APP data5

0K

0x040AC000

  • APP data6

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

重要

开发先决条件

开发者必须在 MFi Portal 上注册才能获得所有开发文档和工具。 以下部分将说明 Realtek SDK 中所需的信息。

MFi Portal

要获得 Apple 批准的产品计划以测试您的配件设备,请确保以下项目:

  • 确保 MFi PortalCertification 选项卡下的 Find My Data Form 已填写完整。

  • 确保 MFi PortalCertification 选项卡下的 Accessory App Information Form 已填写完整。

获得批准后,开发人员将能够获取以下数据:

  • Product Data

  • Apple服务器public keys

  • 软件身份验证Token及UUID

被许可方用于发放Token的软件认证服务器需要根据 Software Token Authentication Server Specification 进行实现。

集成Product Plan

  1. 开发者必须将产品相关数据导入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
    
  1. 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="
    
  2. 上述数据需要与 Find My Data Form 中提供的数据相匹配,以使【查找】应用程序功能正常运行。

  3. FMNA配对中发送的软件身份验证Token及对应的UUID,对于每个物理配件都需要是唯一的。

    1. 使用唯一的软件身份验证Token及对应的UUID。

    2. 必须将第一个软件身份验证Token及对应的UUID写入配件的Flash。配对流程期间从iOS设备收到新Token时,后续Token将在Flash中更新。即使配件重新启动后,更新后的Token仍会保留。

      危险

      请注意,存储Token的Flash区域不得被擦除。

    3. Token及UUID在Flash中的存储地址以及备份如下图所示。

      #define APPLE_AUTH_TOKEN_SAVE_ADDRESS       (BKP_DATA1_ADDR)
      #define APPLE_AUTH_TOKEN_BACKUP_ADDRESS     (BKP_DATA1_ADDR + 0x1000)
      
      ../../../../_images/flash_layout_for_token_and_uuid.png

      Flash Layout for Token and UUID

软件架构

系统软件架构如下图所示:

../../../../_images/find_my_sw_architecture.png

Software Architecture

Platform:

包括OTA、Flash、FTL 等。

IO Drivers:

提供对RTL87x2G外设接口的应用层访问。

OSIF:

实时操作系统的抽象层。

GAP:

用户应用程序与BLE协议栈通信的抽象层。

任务和优先级

如下图所示,用户应用程序共创建了七个任务:

../../../../_images/find_my_task.png

Tasks

各任务描述及优先级如下表:

任务

描述

优先级

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() 中继续进行相关的初始化流程。

../../../../_images/find_my_app_flow.png

Application Process Flow

系统初始化过程相关函数

API

功能描述

app_global_data_init()

初始化 app_global_data 中的数据

board_init()

初始化所需的 PADPINMUX

bat_init_data()

初始化电池电量数据和 ADC

fmna_version_init()

初始化FMNA版本数据

fmna_connection_init()

初始化FMNA连接数据

fnma_ble_platform_init()

初始化 GAPGATT 参数

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()

在APP Task初始化完成后,进行 GPIOADC 驱动程序的初始化,以避免在处理程序准备好之前产生中断

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 nameDevice appearanceGAP Bond Manager parameters 等,并注册回调函数以处理所有 GAP 事件。

调用 fmna_gatt_platform_services_init() 将所需的BLE服务注册到APP回调函数,例如 Find My Network serviceFind My Accessory serviceFind My firmware update service 。有关服务的更多详细信息,请参阅 BLE服务

fmna_crypto_init() 的详细说明:

读取Token的前16个字节和UUID,用于在启动时输出调试日志以验证Token是否成功烧录。

如果FMNA处于配对状态,应用程序将从 FTL 区域加载保存的加密信息;否则,将初始化key context以进行进一步的配对操作。

最后,根据配置文件中配置的BT地址和当前IC型号计算出此设备的序列号。

消息和事件处理流程

../../../../_images/find_my_msg_flow.png

Message Handling Flow

  1. 对于通用外设的 ISR 或BT Stack发送的原始MSG,处理流程如下:

    1. 外设发送的MSG由MSG Distributer转发给IO MSG Handler进行处理。

    2. BT Stack发送的MSG由MSG Distributer转发给BT State Machine,BT State Machine处理MSG并发送BT IOMSG,MSG Distributer接收BT IOMSG后转发给IO MSG Handler进行处理。

    3. IO MSG Handler收到Message后进行判断,并调用相关Event Handler。

  2. 开发者应实现:

    1. 实现外设 ISR ,在 ISR 中完成初步处理,如需进一步处理,则打包 MSG 发送给 APP task。

    2. 维护 IO MSG Handler API app_handle_io_msg(),接收并处理开发者定义的MSG。

    3. 实现APP的事件处理程序。SDK中默认的事件如下:

I/O消息

消息类型

消息描述

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所需的所有操作

  1. GAP层通过MSG和Event机制通知APP层,APP层通过API调用GAP层函数。gap_handle_msg() 中详细的GAP消息/事件描述。

FMNA状态机

FMNA 的应用程序是单线程和事件驱动的。BLE 事件由应用程序处理并分派到 FMNA 状态机。

../../../../_images/fmna_state_machine.png

FMNA State Machine

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事件

事件

描述

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定时器逻辑。

Software timers of 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平台层的软件定时器。

Software Timers of the Platform

软件定时器

描述

sn_trig_timer

单次触发、用于按下触发加密序列号的按键的持续时间。

gpio_key_debounce_timer

单次触发、用于 PADDLPS 唤醒系统时进行软件去抖动。

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章节。

../../../../_images/adv_pdu.png

ADV_IND PDU Payload

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到列表中,当收到当前操作成功或超时的异步消息时,弹出下一个广播操作并执行。

../../../../_images/adv_set_process.png

Advertising Process

首先,需要调用 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 T_GAP_CAUSE

Prerequisite

None

Functions Called

le_ext_adv_set_adv_param() le_ext_adv_set_adv_data() le_ext_adv_set_scan_response_data() rtk_gap_task_try()

备注

  • 首次启动广播前必须调用 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 T_GAP_CAUSE

Prerequisite

None

Functions Called

rtk_gap_task_try()

备注

成功建立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 T_GAP_CAUSE

Prerequisite

None

Functions Called

rtk_gap_task_try()

备注

当广播开启或者关闭成功时,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 服务。

List of the BLE services

服务

源文件

描述

Find My Network service

findmy_network_service.c

As per the Find My Network service chapter in Find My Network Accessory Specification

Accessory Information service

accessory_info_service.c

As per the Accessory Information service chapter in Find My Network Accessory Specification

Firmware Update service

firmware_update_service.c

As per the Firmware Update service chapter in Find My Network Accessory Specification

TPS

tps.c

Transmit power service

Find My Network服务

APP层必须处理Find My Network服务中的以下事件。

Find My Network Service Events

消息类型

消息描述

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

Accessory Information Service Events

消息类型

消息描述

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 去抖和软件定时器去抖。

  1. 系统处于活动模式。

    1. 如果 GPIO 处于活动模式,则将使用 GPIO 硬件去抖。

    2. 一旦硬件去抖时间到期,系统将触发中断以指示 GPIO 状态的变化。

    3. trig_button_int_handler() 将执行按键状态处理流程。

  2. 系统处于休眠模式:GPIO 未处于工作模式。

    1. PAD 将唤醒系统,并调用 System_Handler() 处理中断。

    2. 启用软件防抖定时器gpio_key_debounce_timer。

    3. 当定时器到期时,gpio_key_debounce_timeout_cb() 将调用 trig_button_int_handler() 并执行按键状态处理流程。

  3. 按键状态处理流程。

    1. trig_button_int_handler() 会将事件 IO_MSG_TYPE_GPIO 和子事件(包括按键状态)发布到APP Task以处理用户操作。

      每个子事件的含义的描述如下。

      1. IO_MSG_GPIO_RESET

        设备恢复出厂设置,这将清除此配件中的所有“查找我的网络”数据和绑定信息,但 FTL 中存在的重要数据除外。

      2. IO_MSG_GPIO_TRIG_PRESS

        将取决于应用程序当前状态来触发“查找我的设备”状态机的不同事件。

      3. IO_MSG_GPIO_TRIG_RELEASE

        处理按键释放事件。

    2. 配置 GPIO 极性以检测即将到来的按下/释放事件。

../../../../_images/key_detect_flow.png

按键检测流程

按键行为

可以根据开发人员的具体项目要求调整按键操作行为。

请参阅 按键操作表 了解 RTL87x2x Find My application 中的默认操作行为。

../../../../_images/key_solutions.png

按键行为和解决方案

进入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

常见问题

  1. 配对失败,Apple设备提示“无法继续

    ../../../../_images/iOS_find_my_app9.jpg

    需要查看log,确定断线时间点是否在Accessory端send pairing data后,Apple设备立即发起断线(断线原因0x113)。如果与上述断线时间点相同,可以确定是E2不被Apple服务器认可导致的。E2主要由software auth token及其UUID、product data组成,详见 Find My Nerwork Accessory Specification 中Table 6-1。

    解决方法:

    1. 检查product data是否与使用token相匹配。

      如果使用SDK中默认product data,则烧录的token必须为realtek提供的test token。 如果使用从Apple申请获取的token,则必须将SDK中product data各参数改为与申请的MFi Product Plan一致,详见 集成Product Plan

    2. 检查token是否正确获取并解码。

      初始的token为base64编码的字符串,字符串长度为261,每个token都有其对应的UUID。需要用SDK中提供的 TOKEN_DECODE.exe 进行base64解码,生成相应的bin文件。

    3. 检查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设备出现“无法继续”弹窗后,必须在设置界面内关闭、开启蓝牙后才可以进行下一次配对,下滑框内开关蓝牙无效。

参考文档

  1. Find My Network Accessory Specification R2

  2. UARP Development Guide R2

  3. Software Token Authentication Server Specification R2.1

  4. Find My Network ADK Integration Guide - For ADK 1.0