import { voiceService } from '../../service/voiceService'; import { faceCompare } from '../../api/userInfo'; import FileUtil from '../../common/utils/File'; import common from '@ohos.app.ability.common'; import { string2Bytes } from '../../common/utils/tools'; import { takePhoto } from '../../service/videoService'; import { GlobalConfig } from '../../config/index'; import { VideoConfigData } from '../../mock'; import { VideoConfig } from '../../model'; @Component export default struct FaceCompare { @State imageBase64: string = 'data:image/jpeg;base64,' @State base64: string = '' @Prop sfzh: string; @Prop lsh: string; @Prop firstImage: string; @Link faceCompareSucess: number; @Link showFaceCompare: boolean; @Link getqkFlag: boolean; @Link faceCatchImg: string; @State imageThumbnail: string = ''; @State callBackFlag: boolean = false; @State @Watch('clearIntervalFn') showFaceCompareFlag: Boolean = false; @State video_url: string = 'rtsp://admin:12345qwe@192.168.5.41:8000/h264/ch2/main/av_stream' @State previewUri: Resource = $r('app.media.2_nor') @State curRate: PlaybackSpeed = PlaybackSpeed.Speed_Forward_1_00_X @State showControls: boolean = false @State isAutoPlay: boolean = true @State signNum: number = 0; @State param: VideoConfig = VideoConfigData private times = 1; //人脸比对失败次数, 超过3次将不会自动比对,需要点击重新打开重新触发 private vocObj = null; private controller: VideoController = new VideoController() private fileUtil: FileUtil private interval: any private context = getContext(this) as common.UIAbilityContext; constructor() { super() } build() { Column() { Column() { Text('照片比对')// .lineHeight('16%') .height('16%') .fontWeight(FontWeight.Bold) .fontSize(24) Row() { Row() { Video({ src: this.showFaceCompare ? `rtsp://${this.param.userName}:${this.param.pwd}@${this.param.ip}:${this.param.port}/h264/ch${this.param.rlls}/main/av_stream` : '', previewUri: this.previewUri, currentProgressRate: PlaybackSpeed.Speed_Forward_1_00_X, controller: this.controller, }) .muted(true) .width('100%') .height('100%') .autoPlay(this.isAutoPlay) .controls(this.showControls) } .width('48%') .height('100%') Row() { Image(this.base64) .width('100%') .height('100%') .backgroundColor(Color.Black) } .width('48%') .height('100%') } .width('88.9%') .height('52%') .justifyContent(FlexAlign.SpaceBetween) Text('正在等待拍照…')// .lineHeight('16%') .height('16%') .fontWeight(FontWeight.Bold) .fontColor('#CC7E00') Column() { Row() { Text('若验证无响应,点击此处') .lineHeight('100%') .height('100%') .fontColor('#000000') Column() { Text('重新打开') .lineHeight('100%') .height('100%') .fontColor(Color.White) .fontSize(23) } .width('22.8%') .height('89.9%') .backgroundImage($r('app.media.nor')) .backgroundImageSize({ width: '100%', height: '100%' }) .onClick(async () => { this.times = 1; this.controller.stop() this.vocObj && this.vocObj.releasePlayer() this.showFaceCompare = !this.showFaceCompare this.showFaceCompareFlag = !this.showFaceCompareFlag this.faceCompareSucess = -1 globalThis.statue = 2 }) } .width('88.9%') .height('100%') .justifyContent(FlexAlign.SpaceBetween) } .width('100%') .height('16%') .position({ y: '84%' }) .borderRadius({ topLeft: 0, topRight: 0, bottomLeft: 15, bottomRight: 15 }) .backgroundColor('#CCC4B8') } .width('68.75%') .height('73.2%') .backgroundColor('#E5E3DF') .borderRadius(15) .margin({ top: '4%' }) Column() { } .width('8.5%') .height('15.1%') .backgroundImage($r('app.media.close')) .backgroundImageSize({ width: '100%', height: '100%' }) .onClick(() => { this.controller.stop() clearInterval(this.interval) this.vocObj && this.vocObj.releasePlayer() this.showFaceCompare = !this.showFaceCompare this.showFaceCompareFlag = !this.showFaceCompareFlag this.faceCompareSucess = -1 globalThis.statue = 2 }) } .width('100%') .height('100%') .backgroundColor('rgba(0, 0, 0, 0.8)') .position({ x: 0, y: 0 }) } onPageShow() { } async aboutToAppear() { const fileUtil = new FileUtil(this.context) this.fileUtil = fileUtil this.getVideoConfig() } clearIntervalFn() { this.callBackFlag = false clearInterval(this.interval) this.vocObj && this.vocObj.releasePlayer() } getqkFn() { let tmpList = []; tmpList.push(string2Bytes(globalThis.signNum, 1 * 8)[0]) const param = { id: 41, list: tmpList, carNo: globalThis.carInfo.carNo, placeId: globalThis.carInfo.examinationRoomId } globalThis.udpClient2.sendMsgExt(param, this.context) } async faceComparFn() { console.log('mmmmm0', 2) this.param.pztd = this.param.rlls const data = await takePhoto(this.param, this.context, 'jt/', 1,) this.base64 = this.imageBase64 + data.base64 console.log('mmmmt', this.base64) faceCompare({ sfzh: this.sfzh, firstImage: this.firstImage.substr(22), secondImage: data.base64, type: 2, verifyType: 1 }) .then(res => { console.log('mmmmm8', JSON.stringify(res)) // @ts-ignore if (res.imageCompareRsp.head.resultCode == '0') { this.controller.stop() this.showFaceCompare = !this.showFaceCompare this.showFaceCompareFlag = !this.showFaceCompareFlag this.faceCompareSucess = 1; // this.faceCatchImg = result this.vocObj.playAudio({ type: 1, name: 'yzcg.wav' }) } else { this.times++; //3s后开始语音提示 this.vocObj.playAudio({ type: 1, name: 'face_fail.mp3' }) } }) console.log('mmmmm8', 9) } async heartMsg(context) { let tmpList = [] const str = this.lsh console.log('this.lshbitbit', this.lsh, globalThis.carInfo.carNo, globalThis.carInfo.examinationRoomId) for (let i = 0; i < str.length; i++) { tmpList.push(string2Bytes(str.charCodeAt(i), 1 * 8)[0]) } const param = { id: 46, list: tmpList, carNo: globalThis.carInfo.carNo, placeId: globalThis.carInfo.examinationRoomId, sendCallback: () => { this.callBackFlag = true } } globalThis.udpClient2 && globalThis.udpClient2.sendMsgExt(param, this.context) clearInterval(this.interval) this.interval = setInterval(() => { if (this.callBackFlag) { const param2 = { id: 47, list: tmpList, carNo: globalThis.carInfo.carNo, placeId: globalThis.carInfo.examinationRoomId, } globalThis.udpClient2 && globalThis.udpClient2.sendMsgExt(param2, this.context) } }, 1000) globalThis.udpClient2.setMsgCallBack((val) => { console.log('valvalval', globalThis.statue, JSON.stringify(val)) if (globalThis.statue != 3) { return } if (val.id == '48') { if (val.body[13] == '1') { this.showFaceCompareFlag = !this.showFaceCompareFlag this.showFaceCompare = !this.showFaceCompare this.vocObj && this.vocObj.releasePlayer() this.faceCompareSucess = 1 clearInterval(this.interval) } else if (val.body[13] == '0' && this.callBackFlag) { globalThis.statue = 2 this.vocObj && this.vocObj.playAudio({ type: 1, name: 'face_chekc_fail.wav' }) } } }) } async getVideoConfig() { console.log('faceEnterIn') this.vocObj = new voiceService(async (status, val, next) => { if (status == 'idle') { if (val == 'face_check.mp3' || val == 'face_fail.mp3') { if (this.times >= 3) { globalThis.statue = 3 this.faceCompareSucess = -1; this.vocObj && this.vocObj.playAudio({ type: 1, name: 'face_checking.wav' }) this.heartMsg(this.context) } else { setTimeout(() => { this.faceComparFn() }, 2000) } } else if (val == 'yzcg.wav') { this.showFaceCompare = !this.showFaceCompare this.showFaceCompareFlag = !this.showFaceCompareFlag globalThis.statue = 4 this.faceCompareSucess = 1; this.vocObj && this.vocObj.releasePlayer() } else if (val == 'face_chekc_fail.wav') { this.vocObj && this.vocObj.releasePlayer() this.faceCompareSucess = -1 this.showFaceCompare = !this.showFaceCompare this.showFaceCompareFlag = !this.showFaceCompareFlag } } }); const data = await this.fileUtil.readFile(GlobalConfig.comoonfileWriteAddress + '/config/config3.txt'); console.log('faceEnterIn,data', data) setTimeout(() => { this.vocObj && this.vocObj.playAudio({ type: 1, name: 'face_check.mp3' }) }, 1000) this.param = JSON.parse(data) this.param.userName = JSON.parse(data).userName this.param.ip = this.param.ip this.param.pwd = this.param.pwd this.param.port = this.param.port this.param.rlls = this.param.rlls this.controller.start() } async aboutToDisappear() { clearInterval(this.interval) } }