payfrit-beacon-ios/PayfritBeacon/Utils/BeaconShardPool.swift
Schwifty 38b4c987c9 fix: address all issues from koda's code review
🔴 Critical:
- DXSmartProvisioner: complete rewrite to match Android's new SDK protocol
  - Writes to FFE2 (not FFE1) using 4E4F protocol packets
  - Correct command IDs: 0x74 UUID, 0x75 Major, 0x76 Minor, 0x77 RSSI,
    0x78 AdvInt, 0x79 TxPower, 0x60 Save
  - Frame selection (0x11/0x12) + frame type (0x62 iBeacon)
  - Old SDK fallback (0x36-0x43 via FFE1 with 555555 re-auth per command)
  - Auth timing: 100ms delays (was 500ms, matches Android SDK)
- BeaconShardPool: replaced 71 pattern UUIDs with exact 64 from Android

🟡 Warnings:
- BlueCharmProvisioner: 3 fallback write methods matching Android
  (FEA3 direct → FEA1 raw → FEA1 indexed), legacy FFF0 support,
  added "minew123" and "bc04p" passwords (5 total, was 3)
- BeaconBanList: added 4 missing prefixes (8492E75F, A0B13730,
  EBEFD083, B5B182C7), full UUID ban list, getBanReason() helper
- BLEManager: documented MAC OUI limitation (48:87:2D not available
  on iOS via CoreBluetooth)

🔵 Info:
- APIClient: added get_beacon_config endpoint for server-configured values
- ScanView: unknown beacon type now tries KBeacon→DXSmart→BlueCharm
  fallback chain via new FallbackProvisioner
- DXSmartProvisioner: added readFrame2() for post-write verification

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 17:25:55 +00:00

78 lines
3.4 KiB
Swift

import Foundation
/// Pre-allocated Payfrit shard UUIDs for business namespace allocation
/// Exact copy of Android's BeaconShardPool.kt (64 UUIDs)
enum BeaconShardPool {
static let shardUUIDs: [String] = [
"f7826da6-4fa2-4e98-8024-bc5b71e0893e",
"2f234454-cf6d-4a0f-adf2-f4911ba9ffa6",
"b9407f30-f5f8-466e-aff9-25556b57fe6d",
"e2c56db5-dffb-48d2-b060-d0f5a71096e0",
"d0d3fa86-ca76-45ec-9bd9-6af4fac1e268",
"a7ae2eb7-1f00-4168-b99b-a749bac36c92",
"8deefbb9-f738-4297-8040-96668bb44281",
"5a4bcfce-174e-4bac-a814-092978f50e04",
"74278bda-b644-4520-8f0c-720eaf059935",
"e7eb6d67-2b4f-4c1b-8b6e-8c3b3f5d8b9a",
"1f3c5d7e-9a2b-4c8d-ae6f-0b1c2d3e4f5a",
"a1b2c3d4-e5f6-4789-abcd-ef0123456789",
"98765432-10fe-4cba-9876-543210fedcba",
"deadbeef-cafe-4bab-dead-beefcafebabe",
"c0ffee00-dead-4bee-f000-ba5eba11fade",
"0a1b2c3d-4e5f-4a6b-7c8d-9e0f1a2b3c4d",
"12345678-90ab-4def-1234-567890abcdef",
"fedcba98-7654-4210-fedc-ba9876543210",
"abcd1234-ef56-4789-abcd-1234ef567890",
"11111111-2222-4333-4444-555566667777",
"88889999-aaaa-4bbb-cccc-ddddeeeeefff",
"01234567-89ab-4cde-f012-3456789abcde",
"a0a0a0a0-b1b1-4c2c-d3d3-e4e4e4e4f5f5",
"f0e0d0c0-b0a0-4908-0706-050403020100",
"13579bdf-2468-4ace-1357-9bdf2468ace0",
"fdb97531-eca8-4642-0fdb-97531eca8642",
"aabbccdd-eeff-4011-2233-445566778899",
"99887766-5544-4332-2110-ffeeddccbbaa",
"a1a2a3a4-b5b6-4c7c-8d9d-e0e1f2f3f4f5",
"5f4f3f2f-1f0f-4efe-dfcf-bfaf9f8f7f6f",
"00112233-4455-4667-7889-9aabbccddeef",
"feeddccb-baa9-4887-7665-5443322110ff",
"1a2b3c4d-5e6f-4a0b-1c2d-3e4f5a6b7c8d",
"d8c7b6a5-9483-4726-1504-f3e2d1c0b9a8",
"0f1e2d3c-4b5a-4697-8879-6a5b4c3d2e1f",
"f1e2d3c4-b5a6-4978-8697-a5b4c3d2e1f0",
"12ab34cd-56ef-4789-0abc-def123456789",
"987654fe-dcba-4098-7654-321fedcba098",
"abcdef01-2345-4678-9abc-def012345678",
"876543fe-dcba-4210-9876-543fedcba210",
"0a0b0c0d-0e0f-4101-1121-314151617181",
"91a1b1c1-d1e1-4f10-2030-405060708090",
"a0b1c2d3-e4f5-4a6b-7c8d-9e0f1a2b3c4d",
"d4c3b2a1-0f9e-48d7-c6b5-a49382716050",
"50607080-90a0-4b0c-0d0e-0f1011121314",
"14131211-100f-4e0d-0c0b-0a0908070605",
"a1b2c3d4-e5f6-4718-293a-4b5c6d7e8f90",
"09f8e7d6-c5b4-4a39-2817-0615f4e3d2c1",
"11223344-5566-4778-899a-abbccddeeff0",
"ffeeddc0-bbaa-4988-7766-554433221100",
"a1a1b2b2-c3c3-4d4d-e5e5-f6f6a7a7b8b8",
"b8b8a7a7-f6f6-4e5e-5d4d-4c3c3b2b2a1a",
"12341234-5678-4567-89ab-89abcdefcdef",
"fedcfedc-ba98-4ba9-8765-87654321d321",
"0a1a2a3a-4a5a-4a6a-7a8a-9aaabacadaea",
"eadacaba-aa9a-48a7-a6a5-a4a3a2a1a0af",
"01020304-0506-4708-090a-0b0c0d0e0f10",
"100f0e0d-0c0b-4a09-0807-060504030201",
"aabbccdd-1122-4334-4556-6778899aabbc",
"cbba9988-7766-4554-4332-2110ddccbbaa",
"f0f1f2f3-f4f5-4f6f-7f8f-9fafbfcfdfef",
"efdfcfbf-af9f-48f7-f6f5-f4f3f2f1f0ee",
"a0a1a2a3-a4a5-4a6a-7a8a-9a0b1b2b3b4b",
"4b3b2b1b-0a9a-48a7-a6a5-a4a3a2a1a0ff",
]
/// Check if a UUID is a Payfrit shard
static func isPayfrit(_ uuid: String) -> Bool {
shardUUIDs.contains(where: { $0.caseInsensitiveCompare(uuid) == .orderedSame })
}
}