UNPKG

t-comm

Version:

专业、稳定、纯粹的工具库

87 lines (86 loc) 3.81 kB
/** * 蓝牙"碰一碰"对外类型定义 */ /** 扫描到的蓝牙设备(仅声明用得到的字段,避免污染) */ export interface BluetoothDeviceInfo { deviceId: string; RSSI: number; name?: string; localName?: string; advertisData?: ArrayBuffer; advertisServiceUUIDs?: string[]; serviceData?: Record<string, ArrayBuffer>; [key: string]: any; } /** 启动失败时通过 onError 抛出的错误信息 */ export interface BluetoothBumpError { errCode?: number; errMsg?: string; raw?: any; } /** * 匹配模式: * - 'simple' :默认行为。扫到对方且 RSSI 达标即触发(单向发现,简单快速)。 * - 'mutual' :前端自撮合。双向互认后才触发: * 我广播里带"我看到的对方 ID",对方广播里也带"它看到的对方 ID"; * 当双方广播里携带的 peerId 都指向对方时,才算配对成功。 */ export type BluetoothBumpMode = 'simple' | 'mutual'; /** 广播载荷(mutual 模式):固定长度 13 字节,myTempId|seenPeerId */ export interface BluetoothBumpPayload { /** 发送端自己的临时 ID(6 位大写) */ myTempId: string; /** 发送端当前"看到的对方 ID",未看到时为 '------' */ seenPeerId: string; } /** BluetoothBump 构造选项 */ export interface BluetoothBumpOptions { /** 服务 UUID,两端必须一致 */ serviceUuid?: string; /** 特征 UUID(仅外围模式使用) */ characteristicUuid?: string; /** RSSI 阈值,超过此值视为"碰到了" */ rssiThreshold?: number; /** 同一设备的去重冷却时间 */ cooldownMs?: number; /** 成功触发后保持广播的时长(让对方也能扫到自己) */ lingerBeforeStopMs?: number; /** iOS 兜底轮询间隔 */ pollIntervalMs?: number; /** 隐私协议弹窗内容(不传用默认文案) */ privacyContent?: string; /** * 匹配模式,默认 'simple'(保持向后兼容)。 * 选 'mutual' 开启前端自撮合(双向互认后才触发 onBump)。 */ mode?: BluetoothBumpMode; /** mutual 模式:候选 peer 信息的有效期(毫秒),过期则从候选池移除 */ peerTtlMs?: number; /** mutual 模式:更新自己广播里 seenPeerId 的最小间隔(毫秒),防抖 */ advertiseUpdateThrottleMs?: number; /** * 业务回调:碰到对方时触发 * - peerDeviceId:扫描层的设备地址(iOS 是本机视角的 UUID,Android 是 MAC)。 * ⚠️ 这个值是"扫描者本地"视角的,A 拿到的对方 deviceId 与 B 自己的 deviceId 不一定相同, * 不能用它跟对方的 myTempId 直接对比。 * - peerTempId:对方写在广播 payload 里的 myTempId(6 位字符串)。 * 这个值是"对方应用层产生的",A 看到的 peerTempId 与 B 的 myTempId **一定一致**, * 适合两台手机做配对核对("我方 ID" vs "对方 ID")。 * 若对方广播解析失败则为空字符串。 */ onBump?: (peerDeviceId: string, rssi: number, dev: BluetoothDeviceInfo, peerTempId: string) => void; /** 业务回调:启动失败时触发 */ onError?: (err: BluetoothBumpError) => void; /** 业务回调:日志/状态变化(用于打日志或 UI 更新) */ onLog?: (msg: string, data?: any) => void; /** 业务回调:每次扫到设备(不论是否碰到)时触发,用于调试/UI 展示 */ onDeviceFound?: (dev: BluetoothDeviceInfo) => void; } /** 触发碰一碰的判定参数(纯函数 shouldTriggerBump 使用) */ export interface ShouldTriggerBumpParams { rssi: number; threshold: number; lastBumpTime: number; now: number; cooldownMs: number; }