扫描设备二维码配网

更新时间:2024-05-20 03:47:42下载pdf

该功能只适用于已连接互联网的设备。

IActivator 初始化

参数说明

参数名 类型 是否必填 说明
mode ActivatorMode 配网模式

代码示例

self.pair = ActivatorService.shared.activator(.QRScan)

扫描二维码获取 Code 示例

属性说明

属性名 类型 是否必填 说明
session AVCaptureSession 捕捉视频和音频数据的会话对象
callBack CallBack 扫描完成后的回调方法

方法说明

方法名 参数 返回值 说明
addScaningVideo() 添加视频扫描功能
metadataOutput(_:didOutput:from:) output: AVCaptureMetadataOutput, metadataObjects: [AVMetadataObject], connection: AVCaptureConnection 处理扫描到的元数据

代码示例

typealias CallBack = (_ code : String? ) -> ()

class QRScanViewController: UIViewController {
    let session = AVCaptureSession()
    var callBack:CallBack?

    override func viewDidLoad() {
        self.addScaningVideo()
    }

    private func addScaningVideo(){
        guard let device = AVCaptureDevice.default(for: .video) else { return }

        guard let deviceInput = try? AVCaptureDeviceInput(device: device) else { return }

        let metadataOutput = AVCaptureMetadataOutput()

        metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)

        if session.canAddInput(deviceInput) {
            session.addInput(deviceInput)
        }
        if session.canAddOutput(metadataOutput) {
            session.addOutput(metadataOutput)
        }

        metadataOutput.metadataObjectTypes = [.qr, .code128, .code39, .code93, .code39Mod43, .ean8, .ean13, .upce, .pdf417, .aztec]

        let previewLayer: AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer(session: session)
        previewLayer.videoGravity = .resizeAspectFill
        previewLayer.frame = view.bounds
        view.layer.insertSublayer(previewLayer, at: 0)

        session.startRunning()
    }
}

extension QRScanViewController: AVCaptureMetadataOutputObjectsDelegate {
    func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
        AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))

        session.stopRunning()

        for result in metadataObjects {
            if let code = result as? AVMetadataMachineReadableCodeObject {
                self.callBack?(code.stringValue ?? "")
            }
        }

        self.navigationController?.popViewController(animated: true)
    }
}

注册 IActivatorListener 监听配网结果

参数说明

参数名 类型 是否必填 说明
deviceModel IActivatedDevice? 若操作成功,表示被激活的设备信息,否则为 nil
params ActivatorParams? 操作相关的参数信息

回调函数说明

函数名 参数 说明
onSuccess deviceModel: IActivatedDevice?, params: ActivatorParams? 操作成功回调函数,返回被激活的设备信息
onError error: Error, params: ActivatorParams? 操作失败回调函数,返回错误信息

代码示例

private func start() {
    pair.listener = self
}

extension ViewController: IActivatorListener {
    func onSuccess(deviceModel: IActivatedDevice?, params: ActivatorParams?) {
        SVProgressHUD.dismiss()
        self.navigationController?.popToRootViewController(animated: true)
    }

    func onError(error: Error, params: ActivatorParams?) {
        SVProgressHUD.dismiss()
        SVProgressHUD.showInfo(withStatus: error.localizedDescription)
    }
}

开始配网

该方法用于开始设备配网操作。

参数说明

参数名 类型 是否必填 说明
params ActivatorParams 配网操作相关的参数信息,见代码示例

代码示例

// 创建 QRScanActivatorParams 实例
let params = QRScanActivatorParams(code: "code_from_scan_image", assetId: "assetId", longitude: nil, latitude: nil)

// 开始设备配网操作,pair 是在初始化过程中生成的
// self.pair = ActivatorService.shared.activator(.QRScan)
pair.startPair(params)

停止配网

该方法用于停止设备配网操作。

代码示例

// 停止设备配网操作,pair 是在初始化过程中生成的
// self.pair = ActivatorService.shared.activator(.QRScan)
pair.stopPair()