diff --git a/star_lock/ios/Runner/XSTalkManager/Utils/Talk/talk_Class.m b/star_lock/ios/Runner/XSTalkManager/Utils/Talk/talk_Class.m index 8d1ee810..5fdbe11e 100755 --- a/star_lock/ios/Runner/XSTalkManager/Utils/Talk/talk_Class.m +++ b/star_lock/ios/Runner/XSTalkManager/Utils/Talk/talk_Class.m @@ -97,6 +97,7 @@ static bool isVedioStop; [arecord AudioEnd]; } +// 保持连接 - (void)connect_ini { _connect_reg_time = [Sformat timestamp]; Byte connect_bb[512]; @@ -642,22 +643,24 @@ static bool isVedioStop; isVedioStop= NO; - + // 呼叫应答,呼叫成功 memcpy(bbsend, bb, 62); bbsend[7] = 1; bbsend[8] = 4; NSLog(@"replay talk ip=%@;port=%d", ip, port); [[Pub getApp].udp sendDataInMain:bbsend length:512 toHost:ip toPort:port]; + // 门锁发送视频 memcpy(bbsend, bb, 62); bbsend[7] = 1; bbsend[8] = 5; NSLog(@"replay talk ip=%@;port=%d", ip, port); [[Pub getApp].udp sendDataInMain:bbsend length:512 toHost:ip toPort:port]; - //定时报告 + // 定时报告 [self connect_ini]; [self connect]; + // 设置定时器,得到连接时间 timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(connect) userInfo:nil repeats:YES]; @@ -855,13 +858,19 @@ static char cnt; } else{//视频数据 NSData *data1 = [[NSData alloc] initWithBytes:bb length:60+32]; + // 音视频数据开始下标 BAGLEN = [Pub getShortFromByte:bb at:POS_blen + 2]; + // 获取帧序号 63 iframe_index = [Pub getShortFromByte:bb at:POS_iframe_index]; + // 获取帧长度 65 alen = [Pub getShortFromByte:bb at:POS_alen]; - blen = [Pub getShortFromByte:bb at:POS_blen]; + // 当前包号 71 bag_index = bb[POS_bag_index]&0xff ; + // 总包数 69 bag_num = bb[POS_bag_num]&0xff; - + // 数据长度 73 + blen = [Pub getShortFromByte:bb at:POS_blen]; + if(iframe_index != iframe.iframe_index){ iframe = [[IframeInfo alloc] init]; iframe.iframe_index = iframe_index; diff --git a/star_lock/lib/main.dart b/star_lock/lib/main.dart index 24fbff70..8ca5a4fb 100644 --- a/star_lock/lib/main.dart +++ b/star_lock/lib/main.dart @@ -129,9 +129,9 @@ class _MyAppState extends State with WidgetsBindingObserver, BaseWidget { // playLocalAudio(); - Uint8List uint8List = Uint8List.fromList([]); - CallTalk talkClass = CallTalk(); - talkClass.getAVData(uint8List, 90); + // Uint8List uint8List = Uint8List.fromList([]); + // CallTalk talkClass = CallTalk(); + // talkClass.getAVData(uint8List, 90); } //初始化阿里云推送 diff --git a/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart index 4ddd39ef..8efa1e76 100644 --- a/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart +++ b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart @@ -1,9 +1,43 @@ +import 'dart:async'; + import '../../../../tools/baseGetXController.dart'; +import '../../../../tools/eventBusEventManage.dart'; import 'lockMonitoring_state.dart'; class LockMonitoringLogic extends BaseGetXController { final LockMonitoringState state = LockMonitoringState(); + /// 收到视频流数据 + StreamSubscription? _getTVDataRefreshUIEvent; + void _getTVDataRefreshUIAction() { + // 蓝牙协议通知传输跟蓝牙之外的数据传输类不一样 eventBus + _getTVDataRefreshUIEvent = eventBus.on().listen((event) { + state.listData.value = event.tvList; + }); + } + + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + print("onReady()"); + + _getTVDataRefreshUIAction(); + } + + @override + void onInit() { + // TODO: implement onInit + super.onInit(); + + } + + @override + void onClose() { + // TODO: implement onClose + print("锁详情界面销毁了"); + _getTVDataRefreshUIEvent!.cancel(); + } } \ No newline at end of file diff --git a/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart index 74128614..e2b0b3f5 100644 --- a/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart +++ b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -28,9 +29,9 @@ class _LockMonitoringPageState extends State { Stack( // alignment: Alignment.bottomCenter, children: [ - // Image.asset("images/icon_test20231113.png", width: 1.sw, height: 1.sh, fit: BoxFit.cover), + state.listData.value.isEmpty ? Image.asset("images/icon_test20231113.png", width: 1.sw, height: 1.sh, fit: BoxFit.cover) : Image.memory( - state.imageData, + Uint8List.fromList(state.listData.value), width: 1.sw, height: 1.sh, fit: BoxFit.cover, diff --git a/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart index a38b76f1..ed1135ca 100644 --- a/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart +++ b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart @@ -5,7 +5,9 @@ import 'package:get/get.dart'; class LockMonitoringState { var isOpenVoice = false.obs; - Uint8List imageData = Uint8List.fromList([ + var listData = [].obs; + + Uint8List imageData = Uint8List.fromList([ 255, 216, 255, diff --git a/star_lock/lib/talk/call/callTalk.dart b/star_lock/lib/talk/call/callTalk.dart index cf4985b9..6ef84521 100644 --- a/star_lock/lib/talk/call/callTalk.dart +++ b/star_lock/lib/talk/call/callTalk.dart @@ -6,6 +6,8 @@ import 'package:star_lock/main/lockDetail/monitoring/monitoring/lockMonitoring_p import 'package:star_lock/talk/call/g711Decoder.dart'; import 'package:star_lock/talk/call/iFrameInfo.dart'; +import '../../tools/eventBusEventManage.dart'; + class CallTalk { static int POS_iframe_index = 63; static int POS_alen = 65; @@ -27,9 +29,9 @@ class CallTalk { // '5858584349449601075439415f396333613730323264346364a5a5a5a5c0a809a3503138363832313530323337000000000000000030303030420e000002000000b33300001f000100b301b301ffd8ffe000114a4649460001010000'; // Uint8List bb = Uint8List.fromList(hex.decode(hexData)); //音频数据 - String hexData = - '5858584349449601075439415f396333613730323264346364a5a5a5a5c0a809a3503138363832313530323337000000000000000030303030e02900000100050080020000010001004001b30145444444444444444445454444444444444444444444434343434443434344444444444544454545444444444444454545454545454545454445444545454545454545444444444343434344444443434344444444444343434343434343434443434343434343424343434343434242424242424242424243434343434242424242424343434342424343434242424242434243434343434344454344444444444444444444444444454545454544444444444444444445454545454545454545454545454546454545454545454545454545454545454646464646464645454545464646454545454545454545454545454544444444444444444443434343434343434343434343434343434343434242424242424242424242424242424343434242434343434343434343434343434343434343434444444343434343430000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024001d044000000000001d080001000000001d18c03000000000'; - Uint8List bb = Uint8List.fromList(hex.decode(hexData)); + // String hexData = + // '5858584349449601075439415f396333613730323264346364a5a5a5a5c0a809a3503138363832313530323337000000000000000030303030e02900000100050080020000010001004001b30145444444444444444445454444444444444444444444434343434443434344444444444544454545444444444444454545454545454545454445444545454545454545444444444343434344444443434344444444444343434343434343434443434343434343424343434343434242424242424242424243434343434242424242424343434342424343434242424242434243434343434344454344444444444444444444444444454545454544444444444444444445454545454545454545454545454546454545454545454545454545454545454646464646464645454545464646454545454545454545454545454544444444444444444443434343434343434343434343434343434343434242424242424242424242424242424343434242434343434343434343434343434343434343434444444343434343430000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024001d044000000000001d080001000000001d18c03000000000'; + // Uint8List bb = Uint8List.fromList(hex.decode(hexData)); // 音频数据 if (bb[61] == 1) { @@ -68,14 +70,25 @@ class CallTalk { iframe.bb = Uint8List(end); } - copyBytes(iframe!.bb!, start, bb, POS_data, blen); + print('bbbbbb111: ${bb}'); + iframe.bb!.addAll(bb.sublist(76, bb.length)); + + // copyBytes(iframe!.bb!, start, bb, POS_data, blen); // 打印输出看看字节数组的内容 print('Copied Bytes: ${iframe.bb}'); - Uint8List data = iframe.bb!.sublist(0, iframe.cur_len); + if(iframe.bagNum == iframe.bagReceive){ + Uint8List data = iframe.bb!.sublist(0, iframe.cur_len); + print('播放第%d帧:${iframe.iframeIndex} 一帧图片的Data: $data'); + eventBus.fire(GetTVDataRefreshUI(data)); + } + + // Get.toNamed(Routers.lockMonitoringPage, arguments: { + // "lockId": "111" + // }); // 打印拷贝后的目标数据 - print(iframe.bb); + // print(iframe.bb); } } diff --git a/star_lock/lib/talk/udp/udp_manage.dart b/star_lock/lib/talk/udp/udp_manage.dart index 35922f14..573dedfd 100644 --- a/star_lock/lib/talk/udp/udp_manage.dart +++ b/star_lock/lib/talk/udp/udp_manage.dart @@ -68,7 +68,7 @@ class UDPManage{ if(event == RawSocketEvent.read){ Datagram? dg = socket.receive(); try { - print('Did received data on the stream (length --> ${dg!.data.length}) dg!.data:${dg!.data}'); + // print('Did received data on the stream (length --> ${dg!.data.length}) dg!.data:${dg!.data}'); // EventBusManager().eventBusFir(EventReceiveModel(data: dg?.data,sendChannel: DataChannel.udp)); CommandUDPReciverManager.appDataReceive(dg!.data); } catch (e) { @@ -87,7 +87,7 @@ class UDPManage{ return; } try { - print("sendData:$data"); + // print("sendData:$data"); var result = _udpSocket?.send(data, InternetAddress(host!), port!); if(result != data.length) { print('❌Udp ----> send data $result ${data.length}'); diff --git a/star_lock/lib/talk/udp/udp_reciverData.dart b/star_lock/lib/talk/udp/udp_reciverData.dart index 3ff49c54..f01a8137 100644 --- a/star_lock/lib/talk/udp/udp_reciverData.dart +++ b/star_lock/lib/talk/udp/udp_reciverData.dart @@ -2,6 +2,7 @@ import 'dart:typed_data'; import '../../tools/toast.dart'; +import '../call/callTalk.dart'; import 'udp_talkClass.dart'; class CommandUDPReciverManager { @@ -15,7 +16,7 @@ class CommandUDPReciverManager { if(dataSize < 4){ return; } - // print("appDataReceiveData:$data"); + print("appDataReceiveData:$data"); Uint8List data1 = Uint8List.fromList(data); if(data1.length==1){ @@ -27,7 +28,7 @@ class CommandUDPReciverManager { if (data[6] == 4) { if(data[7] == 2){ - print("心跳包反馈 在线状态"); + // print("心跳包反馈 在线状态"); } else if(data[7]==3) { [Toast.show(msg: "您已在其他设备登录")]; } @@ -38,9 +39,8 @@ class CommandUDPReciverManager { // } // 对讲命令 - // var beiCallType = data[8] & 0xff; - var beiCallType = 1 & 0xff; - print("被呼叫2 类型$beiCallType"); + var beiCallType = data[8] & 0xff; + print("被呼叫类型$beiCallType"); switch (beiCallType) { case 1:{ //被叫 @@ -57,8 +57,9 @@ class CommandUDPReciverManager { break; case 7: case 8:{//音视频数据 - //print("音视频数据"); - + print("音视频数据"); + CallTalk cllTalk = CallTalk(); + cllTalk.getAVData(data1, data1.length); } break; case 9:{ @@ -66,8 +67,7 @@ class CommandUDPReciverManager { //print("对方保持连接"); data[7] = 2; - } - else{ + } else{ //print("保持连接反馈"); } diff --git a/star_lock/lib/talk/udp/udp_talkClass.dart b/star_lock/lib/talk/udp/udp_talkClass.dart index 0d5463f7..05d0739b 100644 --- a/star_lock/lib/talk/udp/udp_talkClass.dart +++ b/star_lock/lib/talk/udp/udp_talkClass.dart @@ -19,18 +19,16 @@ class UDPTalkClass{ factory UDPTalkClass() => _share(); UDPTalkClass get manager => _share(); - UDPTalkClass._init() { - - } + UDPTalkClass._init(); var status = 0;// 0空闲 - var remoteEquid; + var remoteEquid;// 手机号 late Timer timer; // 该字段是为了判断是否跳转到接听界面 挂断或者退出接听界面要记得变更状态 var isBeCall = false; beCallW({List? data, String? ip, int? port}) async { - print("beCall"); + // print("beCall"); // if (await isCallMe(data)) { // return; // } @@ -42,10 +40,12 @@ class UDPTalkClass{ remoteEquid = getEquidFrombb(data, 9); status = 6; + // 呼叫应答,呼叫成功 data![7] = 1; data[8] = 4; UDPManage().sendData(data); + // 门锁发送视频 data[7] = 1; data[8] = 5; UDPManage().sendData(data); @@ -59,6 +59,7 @@ class UDPTalkClass{ if(UDPTalkClass().isBeCall == false){ UDPTalkClass().isBeCall = true; + // 保持连接 timer = Timer.periodic(1.seconds, (timer) { data[7] = 1; data[8] = 9; diff --git a/star_lock/lib/tools/eventBusEventManage.dart b/star_lock/lib/tools/eventBusEventManage.dart index 8f1d6546..7958e493 100644 --- a/star_lock/lib/tools/eventBusEventManage.dart +++ b/star_lock/lib/tools/eventBusEventManage.dart @@ -54,4 +54,10 @@ class LockSetChangeSetRefreshLockDetailWithType{ int type;// 0 考勤 1开锁时是否需联网 int setResult; LockSetChangeSetRefreshLockDetailWithType(this.type, this.setResult); +} + +/// 获取到视频流数据然后刷新界面 +class GetTVDataRefreshUI{ + List tvList; + GetTVDataRefreshUI(this.tvList); } \ No newline at end of file