From adcb0972054dd89c1dd251b212278be4d84c3d58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AD=8F=E5=B0=91=E9=98=B3?= <786612630@qq.com> Date: Tue, 19 Dec 2023 18:33:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E8=AE=B2=E8=A7=86=E9=A2=91=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E6=95=B0=E6=8D=AE=E6=8E=A5=E6=94=B6=E6=B8=B2=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../monitoring/lockMonitoring_page.dart | 27 ++- .../demoModeLockDetail_logic.dart | 5 - .../demoModeLockDetail_page.dart | 2 +- .../demoModeLockDetail_state.dart | 5 - .../lockMian/lockMain/lockMain_logic.dart | 1 + .../lockAddress/lockAddress_logic.dart | 3 - .../lockAddress/lockAddress_state.dart | 5 - star_lock/lib/nav/navLogic.dart | 3 - star_lock/lib/nav/navState.dart | 5 - star_lock/lib/talk/call/callTalk.dart | 129 ++++++++++--- star_lock/lib/talk/call/iFrameInfo.dart | 2 +- star_lock/lib/talk/udp/udp_reciverData.dart | 175 +++++++++--------- 12 files changed, 203 insertions(+), 159 deletions(-) delete mode 100644 star_lock/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_state.dart delete mode 100644 star_lock/lib/mine/addLock/lockAddress/lockAddress/lockAddress_state.dart delete mode 100644 star_lock/lib/nav/navState.dart 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 e2b0b3f5..2a554264 100644 --- a/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart +++ b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart @@ -20,22 +20,23 @@ class _LockMonitoringPageState extends State { @override Widget build(BuildContext context) { - return Container( + return SizedBox( width: 1.sw, height: 1.sh, - color: Colors.white, - child: Column( - children: [ - Stack( + // color: Colors.transparent, + child: Stack( // alignment: Alignment.bottomCenter, children: [ - state.listData.value.isEmpty ? Image.asset("images/icon_test20231113.png", width: 1.sw, height: 1.sh, fit: BoxFit.cover) : - Image.memory( - Uint8List.fromList(state.listData.value), - 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) : + Obx(() => + state.listData.value.isEmpty + ? Container(color: Colors.red) + :Image.memory( + Uint8List.fromList(state.listData.value), + width: 1.sw, + height: 1.sh, + fit: BoxFit.cover, + )), Positioned( top: ScreenUtil().statusBarHeight + 30.h, child: Row(children: [ @@ -79,8 +80,6 @@ class _LockMonitoringPageState extends State { )) ], ), - ], - ), ); } diff --git a/star_lock/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_logic.dart b/star_lock/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_logic.dart index 11d4b09b..b2cbf02d 100644 --- a/star_lock/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_logic.dart +++ b/star_lock/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_logic.dart @@ -1,13 +1,8 @@ - import '../../../../tools/baseGetXController.dart'; import '../../../../tools/storage.dart'; -import 'demoModeLockDetail_state.dart'; class DemoModeLockDetailLogic extends BaseGetXController { - DemoModeLockDetailState state = DemoModeLockDetailState(); - - @override void onReady() { diff --git a/star_lock/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_page.dart b/star_lock/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_page.dart index 8da69913..50fe2a3e 100644 --- a/star_lock/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_page.dart +++ b/star_lock/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_page.dart @@ -19,7 +19,7 @@ class DemoModeLockDetailPage extends StatefulWidget { class _DemoModeLockDetailPageState extends State { final logic = Get.put(DemoModeLockDetailLogic()); - final state = Get.find().state; + // final state = Get.find().state; @override void initState() { diff --git a/star_lock/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_state.dart b/star_lock/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_state.dart deleted file mode 100644 index 4e3b435f..00000000 --- a/star_lock/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_state.dart +++ /dev/null @@ -1,5 +0,0 @@ - - -class DemoModeLockDetailState { - -} \ No newline at end of file diff --git a/star_lock/lib/main/lockMian/lockMain/lockMain_logic.dart b/star_lock/lib/main/lockMian/lockMain/lockMain_logic.dart index 3c670828..6ee4cff0 100644 --- a/star_lock/lib/main/lockMian/lockMain/lockMain_logic.dart +++ b/star_lock/lib/main/lockMian/lockMain/lockMain_logic.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'dart:typed_data'; import 'package:get/get.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:star_lock/talk/udp/udp_senderManage.dart'; diff --git a/star_lock/lib/mine/addLock/lockAddress/lockAddress/lockAddress_logic.dart b/star_lock/lib/mine/addLock/lockAddress/lockAddress/lockAddress_logic.dart index b3589a61..d36aa1be 100644 --- a/star_lock/lib/mine/addLock/lockAddress/lockAddress/lockAddress_logic.dart +++ b/star_lock/lib/mine/addLock/lockAddress/lockAddress/lockAddress_logic.dart @@ -1,11 +1,8 @@ import '../../../../tools/baseGetXController.dart'; -import 'lockAddress_state.dart'; class LockAddressLogic extends BaseGetXController { - final LockAddressState state = LockAddressState(); - @override void onReady() { // TODO: implement onReady diff --git a/star_lock/lib/mine/addLock/lockAddress/lockAddress/lockAddress_state.dart b/star_lock/lib/mine/addLock/lockAddress/lockAddress/lockAddress_state.dart deleted file mode 100644 index 3926eed4..00000000 --- a/star_lock/lib/mine/addLock/lockAddress/lockAddress/lockAddress_state.dart +++ /dev/null @@ -1,5 +0,0 @@ - - -class LockAddressState { - -} \ No newline at end of file diff --git a/star_lock/lib/nav/navLogic.dart b/star_lock/lib/nav/navLogic.dart index b74d9453..ed2bd480 100644 --- a/star_lock/lib/nav/navLogic.dart +++ b/star_lock/lib/nav/navLogic.dart @@ -1,9 +1,6 @@ - import '../tools/baseGetXController.dart'; -import 'navState.dart'; class NavLogic extends BaseGetXController { - final NavState state = NavState(); } \ No newline at end of file diff --git a/star_lock/lib/nav/navState.dart b/star_lock/lib/nav/navState.dart deleted file mode 100644 index ec631f3e..00000000 --- a/star_lock/lib/nav/navState.dart +++ /dev/null @@ -1,5 +0,0 @@ - - -class NavState{ - -} \ No newline at end of file diff --git a/star_lock/lib/talk/call/callTalk.dart b/star_lock/lib/talk/call/callTalk.dart index 6ef84521..39af7425 100644 --- a/star_lock/lib/talk/call/callTalk.dart +++ b/star_lock/lib/talk/call/callTalk.dart @@ -1,4 +1,5 @@ import 'dart:typed_data'; +import 'package:flutter/material.dart'; import 'package:convert/convert.dart'; import 'package:flutter_sound/flutter_sound.dart'; // import 'package:just_audio/just_audio.dart'; @@ -9,6 +10,7 @@ import 'package:star_lock/talk/call/iFrameInfo.dart'; import '../../tools/eventBusEventManage.dart'; class CallTalk { + static CallTalk? _manager; static int POS_iframe_index = 63; static int POS_alen = 65; static int POS_blen = 73; @@ -19,10 +21,23 @@ class CallTalk { static int FIRSTINDEX = 1; int status = 0; // 假设有这个成员变量 - IframeInfo iframe = IframeInfo(); // 假设有这个成员变量 + IframeInfo? iframe; // 假设有这个成员变量 + var growableList; LockMonitoringPage callOut = const LockMonitoringPage(); late FlutterSoundPlayer _player; + CallTalk._init() { + iframe = IframeInfo(); + } + + static CallTalk _share() { + _manager ??= CallTalk._init(); + return _manager!; + } + + factory CallTalk() => _share(); + CallTalk get manager => _share(); + Future getAVData(Uint8List bb, int len) async { //视频数据 // String hexData = @@ -46,44 +61,88 @@ class CallTalk { } // 视频数据 else { - int bagLen = getShortFromByte(bb, POS_blen + 2); - int getIframeIndex = getShortFromByte(bb, POS_iframe_index); - int alen = getShortFromByte(bb, POS_alen); - int blen = getShortFromByte(bb, POS_blen); - int getBagIndex = bb[POS_bag_index] & 0xff; - int getBagNum = bb[POS_bag_num] & 0xff; + // 音视频数据开始下标 + var bagLen = bb[POS_blen + 2] + bb[POS_blen + 3] * 256; + // print('音视频数据开始下标 bagLen:$bagLen'); - if (getIframeIndex != iframe.iframeIndex) { + // 获取帧序号 63 + int getIframeIndex = + bb[POS_iframe_index] + bb[POS_iframe_index + 1] * 256; + print('获取帧序号 getIframeIndex:$getIframeIndex'); + // 获取帧长度 65 + // int alen = bb[POS_alen] & 0xff; + // var alenList = bb.sublist(POS_alen, POS_alen + 4); + // int alen = ((0xff & alenList[(0)]) << 24 | + // (0xff & alenList[1]) << 16 | + // (0xff & alenList[2]) << 8 | + // (0xFF & alenList[3])); + // print('获取帧长度 alen:$alen'); + + // 当前包号 71 + int getBagIndex = bb[POS_bag_index] & 0xff; + print('当前包号 getBagIndex:$getBagIndex'); + // 总包数 69 + int getBagNum = bb[POS_bag_num] & 0xff; + print('总包数 getBagNum:$getBagNum'); + // 数据长度 73 + int blen = bb[POS_blen] + bb[POS_blen + 1] * 256; + print('数据长度 blen:$blen'); + + // 这里判断是否是同一帧,如果不是同一帧就重新创建一个 IframeInfo + if (getIframeIndex != iframe!.iframeIndex) { iframe = IframeInfo(); - iframe.iframeIndex = getIframeIndex; - iframe.bagNum = getBagNum; - iframe.cur_len = alen; - iframe.bb = Uint8List(alen); + // print('11111111change getIframeIndex:$getIframeIndex '); + // print('11111111change iframe.iframeIndex: ${iframe!.iframeIndex}'); + iframe!.iframeIndex = getIframeIndex; + iframe!.bagNum = getBagNum; + // iframe!.cur_len = alen; + // iframe!.bb = Uint8List(alen); + growableList = iframe!.bb!.toList(growable: true); } - iframe.bagReceive++; - int start = bagLen * (getBagIndex - FIRSTINDEX); - int end = start + blen; + iframe!.bagReceive++; + // int start = bagLen * (getBagIndex - FIRSTINDEX); + // int end = start + blen; // 确保 iframe!.bb 不为 null,并且足够长 - if (iframe.bb == null || iframe.bb!.length < end) { - iframe.bb = Uint8List(end); + // if (iframe.bb == null || iframe.bb!.length < end) { + // iframe.bb = Uint8List(end); + // } + + // print('22222222change getIframeIndex:$getIframeIndex '); + + // 如果是同一帧就添加起来 + if (getIframeIndex == iframe!.iframeIndex) { + // print('33333333change iframe.iframeIndex: ${iframe!.iframeIndex}'); + var getList = bb.sublist(77, bb.length); + print('getList:${getList}'); + growableList.addAll(getList); + // print('growableList: $growableList'); } - print('bbbbbb111: ${bb}'); - iframe.bb!.addAll(bb.sublist(76, bb.length)); - // copyBytes(iframe!.bb!, start, bb, POS_data, blen); // 打印输出看看字节数组的内容 - print('Copied Bytes: ${iframe.bb}'); - if(iframe.bagNum == iframe.bagReceive){ - Uint8List data = iframe.bb!.sublist(0, iframe.cur_len); - print('播放第%d帧:${iframe.iframeIndex} 一帧图片的Data: $data'); - eventBus.fire(GetTVDataRefreshUI(data)); + print( + 'iframe.bagNum: ${iframe!.bagNum} iframe.bagReceive: ${iframe!.bagReceive}'); + + // 如果收到的包数等于总包数,说明这一帧数据已经接收完毕 + if (iframe!.bagNum == iframe!.bagReceive) { + // List data = iframe!.bb!.sublist(0, iframe!.cur_len); + print('播放第${iframe!.iframeIndex}帧 一帧图片的Data: $growableList'); + String hexString = + uint8ListToHexString(Uint8List.fromList(growableList)); + // print('播放第${iframe!.iframeIndex}帧 hexStringLength:${hexString.length} 一帧图片的hexStringData: $hexString'); // 输出: 0a141e28 + + // if (iframe!.iframeIndex == 1) { + print('下面就是你要的'); + printByteArray('播放第${iframe!.iframeIndex}帧 一帧图片的hexStringData: ', + Uint8List.fromList(growableList)); + eventBus.fire(GetTVDataRefreshUI(growableList)); + // } + // eventBus.fire(GetTVDataRefreshUI(growableList)); } - // Get.toNamed(Routers.lockMonitoringPage, arguments: { // "lockId": "111" // }); @@ -92,6 +151,24 @@ class CallTalk { } } + void printByteArray(String printTitle, Uint8List byteArray) { + final int chunkSize = byteArray.length; // 每行显示的字节数 + int length = byteArray.length; + + for (int i = 0; i < length; i += chunkSize) { + int end = (i + chunkSize < length) ? i + chunkSize : length; + Uint8List chunk = byteArray.sublist(i, end); + + String hexString = + chunk.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join(' '); + debugPrint(hexString); + } + } + + String uint8ListToHexString(Uint8List uint8List) { + return hex.encode(uint8List); + } + int getShortFromByte(Uint8List bb, int pos) { ByteData byteData = ByteData.sublistView(bb, pos, pos + 2); return byteData.getInt16(0, Endian.little); diff --git a/star_lock/lib/talk/call/iFrameInfo.dart b/star_lock/lib/talk/call/iFrameInfo.dart index 89e0101b..f244b1c8 100644 --- a/star_lock/lib/talk/call/iFrameInfo.dart +++ b/star_lock/lib/talk/call/iFrameInfo.dart @@ -17,6 +17,6 @@ class IframeInfo { bagReceive = 0; isFull = false; cur_len = 0; - bb = Uint8List(512); + bb = Uint8List(0); } } diff --git a/star_lock/lib/talk/udp/udp_reciverData.dart b/star_lock/lib/talk/udp/udp_reciverData.dart index f01a8137..ab7b9fcd 100644 --- a/star_lock/lib/talk/udp/udp_reciverData.dart +++ b/star_lock/lib/talk/udp/udp_reciverData.dart @@ -1,4 +1,3 @@ - import 'dart:typed_data'; import '../../tools/toast.dart'; @@ -6,30 +5,28 @@ import '../call/callTalk.dart'; import 'udp_talkClass.dart'; class CommandUDPReciverManager { - static void appDataReceive(List data) async { ///解析数据 - if(data.isEmpty){ + if (data.isEmpty) { return; } int dataSize = data.length; - if(dataSize < 4){ + if (dataSize < 4) { return; } print("appDataReceiveData:$data"); Uint8List data1 = Uint8List.fromList(data); - if(data1.length==1){ - if(data[0]==0x30 || data[0]==0x31){ + if (data1.length == 1) { + if (data[0] == 0x30 || data[0] == 0x31) { print("p2p打洞"); - } } if (data[6] == 4) { - if(data[7] == 2){ + if (data[7] == 2) { // print("心跳包反馈 在线状态"); - } else if(data[7]==3) { + } else if (data[7] == 3) { [Toast.show(msg: "您已在其他设备登录")]; } } else if (data[6] == 150) { @@ -42,77 +39,78 @@ class CommandUDPReciverManager { var beiCallType = data[8] & 0xff; print("被呼叫类型$beiCallType"); switch (beiCallType) { - case 1:{ + case 1: + { //被叫 UDPTalkClass().beCallW(data: data); } break; - case 6:{ + case 6: + { //接听 - if((data[7] & 0x3) == 2){//被叫 接听反馈 + if ((data[7] & 0x3) == 2) { + //被叫 接听反馈 print("接听反馈"); - } } break; - case 7: - case 8:{//音视频数据 - print("音视频数据"); + case 7: + case 8: + { + //音视频数据 + // print("音视频数据"); CallTalk cllTalk = CallTalk(); cllTalk.getAVData(data1, data1.length); } break; - case 9:{ - if((data[7] & 0x3) == 1){//对方保持连接 + case 9: + { + if ((data[7] & 0x3) == 1) { + //对方保持连接 //print("对方保持连接"); data[7] = 2; - - } else{ + } else { //print("保持连接反馈"); - } } break; - case 10:{ + case 10: + { //开门反馈 - if((data[7] & 0x3) == 2){ + if ((data[7] & 0x3) == 2) { print("开门成功"); - - } - else{ - - } + } else {} } break; - case 30:{ + case 30: + { //开门反馈 - if((data[7] & 0x3) == 1){ + if ((data[7] & 0x3) == 1) { //对方结束对讲 print("对方结束对讲"); - - } else{ + } else { //结束对讲反馈 print("结束对讲反馈"); - } } break; - case 140:{ + case 140: + { // p2p测试 - } break; - case 141:{ + case 141: + { // p2p测试 - } break; - case 142:{ + case 142: + { // p2p测试 - } break; - case 143:{ + case 143: + { //p2p测试 NSAsk print("p2pNSAskNSAsk"); } @@ -123,65 +121,60 @@ class CommandUDPReciverManager { } else if (data[6] == 152) { // 监视命令 switch (data[8] & 0xff) { - case 2:{ - //被叫 - print("对方忙"); - } - break; - case 4:{ - //监视成功 - print("监视成功"); - - } - break; + case 2: + { + //被叫 + print("对方忙"); + } + break; + case 4: + { + //监视成功 + print("监视成功"); + } + break; case 7: - case 8:{//音视频数据 - //print("音视频数据"); - - } - break; - case 9:{ - //保持连接 - if((data[7] & 0x3) == 1){//对方保持连接 - //print("对方保持连接"); - data[7] = 2; - + case 8: + { + //音视频数据 + //print("音视频数据"); } - else{ - //print("保持连接反馈"); - + break; + case 9: + { + //保持连接 + if ((data[7] & 0x3) == 1) { + //对方保持连接 + //print("对方保持连接"); + data[7] = 2; + } else { + //print("保持连接反馈"); + } } - } - break; - case 10:{ - //开门反馈 - if((data[7] & 0x3) == 2){ - print("开门成功"); - + break; + case 10: + { + //开门反馈 + if ((data[7] & 0x3) == 2) { + print("开门成功"); + } else {} } - else{ - + break; + case 30: + { + // 监视结束 + if ((data[7] & 0x3) == 1) { + // 对方结束监视 + print("对方结束监视"); + } else { + //结束对讲反馈 + print("结束监视反馈"); + } } - } - break; - case 30:{ - // 监视结束 - if((data[7] & 0x3) == 1){ - // 对方结束监视 - print("对方结束监视"); - - } else{ - //结束对讲反馈 - print("结束监视反馈"); - - } - } - break; + break; default: break; } } } - - }