EVVA Abrevva iOS SDK 是一套用于处理 EVVA 电子门禁组件的工具集。 它允许通过 BLE 进行扫描和连接。
平台 | 最低 Swift 版本 | 安装 | 状态 |
---|---|---|---|
iOS 15.0+ | 5.7.1 / Xcode 14.1 | CocoaPods | 完全测试 |
watchOS 10.0+ | 5.7.1 / Xcode 14.1 | CocoaPods | 完全测试 |
Android | 请参阅 EVVA Abrevva Android SDK |
CocoaPods 是 Cocoa 项目的依赖管理工具。有关使用和安装说明,请访问其网站。 要使用 CocoaPods 将 EVVA Abrevva iOS SDK 集成到您的 Xcode 项目中,请在您的 Podfile
中指定 pod。
pod 'AbrevvaSDK'
首先初始化 SDK BleManager。您可以传递一个初始化回调闭包以指示成功。
import AbrevvaSDK
public class Example {
private var bleManager: BleManager?
private var bleDeviceMap = [String: BleDevice]()
func initialize() {
self.bleManager = BleManager { success, message in
debugPrint("BleManager initialized /w success=\(success)")
}
}
}
使用 BleManager 扫描范围内的组件。您可以传递多个回调闭包,以便在扫描或连接到组件时对不同的事件做出反应。
func scanForDevices() {
let timeout = 10_000
self.bleManager?.startScan(
{ device in
debugPrint("Found device /w address=\(device.address)")
self.bleDeviceMap[device.address] = device
},
{ error in
debugPrint("Scan started /w \(error ?? "success")")
},
{ error in
debugPrint("Scan stopped /w \(error ?? "success")")
},
nil, // mac filter
false, // allow duplicates
timeout
)
}
从扫描到的 EVVA 组件获取 EVVA 广播数据。
let ad = device.advertisementData
debugPrint(ad?.rssi)
debugPrint(ad?.isConnectable)
let md = ad?.manufacturerData
debugPrint(md?.batteryStatus)
debugPrint(md?.isOnline)
debugPrint(md?.officeModeEnabled)
debugPrint(md?.officeModeActive)
// ...
可以从广播信息中访问多个属性。
public struct BleDeviceAdvertisementData {
public let rssi: Int
public let isConnectable: Bool?
public let manufacturerData: BleDeviceManufacturerData?
}
public struct BleDeviceManufacturerData {
public let companyIdentifier: UInt16
public let version: UInt8
public let componentType: UInt8
public let mainFirmwareVersionMajor: UInt8
public let mainFirmwareVersionMinor: UInt8
public let mainFirmwareVersionPatch: UInt16
public let componentHAL: Int
public let batteryStatus: Bool
public let mainConstructionMode: Bool
public let subConstructionMode: Bool
public let isOnline: Bool
public let officeModeEnabled: Bool
public let twoFactorRequired: Bool
public let officeModeActive: Bool
public let reservedBits: Int?
public let identifier: String
public let subFirmwareVersionMajor: UInt8?
public let subFirmwareVersionMinor: UInt8?
public let subFirmwareVersionPatch: UInt16?
public let subComponentIdentifier: String?
}
通过 signalize 方法,您可以定位已扫描到的 EVVA 组件。成功发出信号后,组件将发出一段旋律来指示其位置。
func signalizeDevice(_ deviceId: String) async {
guard let device = self.bleDeviceMap[deviceId] else { return }
let success = await self.bleManager?.signalize(device)
debugPrint("Signalized /w success=\(success)")
}
要解除组件锁定,您必须提供 EVVA 组件的访问凭据。这些凭据通常以访问介质元数据的形式从 Xesar 软件获取。
func disengageDevice(_ deviceId: String) async {
guard let device = self.bleDeviceMap[deviceId] else { return }
let mobileId = "" // sha256-hashed hex-encoded version of `xsMobileId` found in blob data.
let mobileDeviceKey = "" // mobileDeviceKey mobile device key string from `xsMOBDK` found in blob data.
let mobileGroupId = "" // mobileGroupId mobile group id string from `xsMOBGID` found in blob data.
let mediumAccessData = "" // mediumAccessData access data string from `mediumDataFrame` found in blob data.
let isPermanentRelease = false // office mode flag.
let timeout = 10_000
let status = await self.bleManager?.disengage(
device,
mobileId,
mobileDeviceKey,
mobileGroupId,
mediumAccessData,
isPermanentRelease,
timeout
)
debugPrint("Disengage /w status=\(status)")
}
尝试解除组件锁定时,会遇到几种访问状态类型。
public enum DisengageStatusType: String {
/// Component
case AUTHORIZED
case AUTHORIZED_PERMANENT_ENGAGE
case AUTHORIZED_PERMANENT_DISENGAGE
case AUTHORIZED_BATTERY_LOW
case AUTHORIZED_OFFLINE
case UNAUTHORIZED
case UNAUTHORIZED_OFFLINE
case SIGNAL_LOCALIZATION
case MEDIUM_DEFECT_ONLINE
case MEDIUM_BLACKLISTED
case ERROR
/// Interface
case UNKNOWN_STATUS_CODE
case UNABLE_TO_CONNECT
case TIMEOUT
case UNABLE_TO_SET_NOTIFICATIONS
case UNABLE_TO_READ_CHALLENGE
case ACCESS_CIPHER_ERROR
}