EVVA Abrevva iOS SDK

Package managers Package managers EVVA License Package managers Package managers

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

CocoaPods 是 Cocoa 项目的依赖管理工具。有关使用和安装说明,请访问其网站。 要使用 CocoaPods 将 EVVA Abrevva iOS SDK 集成到您的 Xcode 项目中,请在您的 Podfile 中指定 pod。

pod 'AbrevvaSDK'

Swift Package Manager

请参阅 swiftpackageindex.com

示例

初始化 BleManager

首先初始化 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)")
        }
    }
}

扫描 EVVA 组件

使用 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 组件获取 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?
}

定位 EVVA 组件

通过 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 组件的锁定

要解除组件锁定,您必须提供 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
}