fix: 增加日志

This commit is contained in:
liyi 2025-10-22 15:52:53 +08:00
parent f73943785f
commit a4892633a3
4 changed files with 101 additions and 194 deletions

View File

@ -32,12 +32,10 @@ class LockListLogic extends BaseGetXController {
final ShowTipView showTipView = ShowTipView(); final ShowTipView showTipView = ShowTipView();
List<GroupList> get groupDataListFiltered { List<GroupList> get groupDataListFiltered {
final List<GroupList> list = final List<GroupList> list = groupDataList.map((GroupList e) => e.copy()).toList();
groupDataList.map((GroupList e) => e.copy()).toList();
if (state.searchStr.value != '' && state.showSearch.value) { if (state.searchStr.value != '' && state.showSearch.value) {
list.forEach((GroupList element) { list.forEach((GroupList element) {
element.lockList?.removeWhere((LockListInfoItemEntity element) => element.lockList?.removeWhere((LockListInfoItemEntity element) => !(element.lockAlias?.contains(state.searchStr.value) ?? true));
!(element.lockAlias?.contains(state.searchStr.value) ?? true));
}); });
} }
if (list.length > 0) { if (list.length > 0) {
@ -46,8 +44,7 @@ class LockListLogic extends BaseGetXController {
final lockList = element.lockList; final lockList = element.lockList;
if (lockList != null && lockList.length > 0) { if (lockList != null && lockList.length > 0) {
lockList.forEach((element) { lockList.forEach((element) {
if (element.network?.peerId != null && if (element.network?.peerId != null && element.network?.peerId != '') {
element.network?.peerId != '') {
StartChartManage().lockListPeerId.add(element); StartChartManage().lockListPeerId.add(element);
} }
}); });
@ -68,8 +65,7 @@ class LockListLogic extends BaseGetXController {
late StreamSubscription _setLockListInfoGroupEntity; late StreamSubscription _setLockListInfoGroupEntity;
void _initReplySubscription() { void _initReplySubscription() {
_replySubscription = _replySubscription = EventBusManager().eventBus!.on<Reply>().listen((Reply reply) async {
EventBusManager().eventBus!.on<Reply>().listen((Reply reply) async {
// //
if ((reply is FactoryDataResetReply)) { if ((reply is FactoryDataResetReply)) {
_replyFactoryDataResetKey(reply); _replyFactoryDataResetKey(reply);
@ -100,10 +96,8 @@ class LockListLogic extends BaseGetXController {
userID: await Storage.getUid(), userID: await Storage.getUid(),
keyID: '1', keyID: '1',
needAuthor: 1, needAuthor: 1,
publicKey: publicKey: state.lockListInfoItemEntity.bluetooth!.publicKey!.cast<int>(),
state.lockListInfoItemEntity.bluetooth!.publicKey!.cast<int>(), privateKey: state.lockListInfoItemEntity.bluetooth!.privateKey!.cast<int>(),
privateKey:
state.lockListInfoItemEntity.bluetooth!.privateKey!.cast<int>(),
token: getTokenList); token: getTokenList);
break; break;
case 0x07: case 0x07:
@ -145,8 +139,7 @@ class LockListLogic extends BaseGetXController {
keyInfo.keyType == XSConstantMacro.keyTypeLong || keyInfo.keyType == XSConstantMacro.keyTypeLong ||
keyInfo.keyType == XSConstantMacro.keyTypeLoop) { keyInfo.keyType == XSConstantMacro.keyTypeLoop) {
// 使 // 使
if (keyInfo.keyStatus == XSConstantMacro.keyStatusNormalUse || if (keyInfo.keyStatus == XSConstantMacro.keyStatusNormalUse || keyInfo.keyStatus == XSConstantMacro.keyStatusWaitReceive) {
keyInfo.keyStatus == XSConstantMacro.keyStatusWaitReceive) {
return "${"".tr}${DateTool().compareTimeGetDaysFromNow(keyInfo.endDate!)}${"".tr}"; return "${"".tr}${DateTool().compareTimeGetDaysFromNow(keyInfo.endDate!)}${"".tr}";
} else { } else {
return XSConstantMacro.getKeyStatusStr(keyInfo.keyStatus!); return XSConstantMacro.getKeyStatusStr(keyInfo.keyStatus!);
@ -159,11 +152,7 @@ class LockListLogic extends BaseGetXController {
// //
bool getShowType(LockListInfoItemEntity keyInfo) { bool getShowType(LockListInfoItemEntity keyInfo) {
final List<int> keyTypes = <int>[ final List<int> keyTypes = <int>[XSConstantMacro.keyTypeTime, XSConstantMacro.keyTypeOnce, XSConstantMacro.keyTypeLoop];
XSConstantMacro.keyTypeTime,
XSConstantMacro.keyTypeOnce,
XSConstantMacro.keyTypeLoop
];
final List<int> keyStatus = <int>[ final List<int> keyStatus = <int>[
XSConstantMacro.keyStatusWaitIneffective, XSConstantMacro.keyStatusWaitIneffective,
XSConstantMacro.keyStatusFrozen, XSConstantMacro.keyStatusFrozen,
@ -171,18 +160,14 @@ class LockListLogic extends BaseGetXController {
]; ];
//--&& //--&&
final bool isLongFrozenStatus = final bool isLongFrozenStatus = keyInfo.keyType == XSConstantMacro.keyTypeLong && keyInfo.keyStatus == XSConstantMacro.keyStatusFrozen;
keyInfo.keyType == XSConstantMacro.keyTypeLong && final DateTime endDate = DateTime.fromMillisecondsSinceEpoch(keyInfo.endDate ?? 0);
keyInfo.keyStatus == XSConstantMacro.keyStatusFrozen;
final DateTime endDate =
DateTime.fromMillisecondsSinceEpoch(keyInfo.endDate ?? 0);
final DateTime now = DateTime.now(); final DateTime now = DateTime.now();
final bool isKeyType = keyTypes.contains(keyInfo.keyType); final bool isKeyType = keyTypes.contains(keyInfo.keyType);
final bool isKeyStatus = keyStatus.contains(keyInfo.keyStatus); final bool isKeyStatus = keyStatus.contains(keyInfo.keyStatus);
final Duration difference = endDate.difference(now); final Duration difference = endDate.difference(now);
final bool isExpirationSoon = isKeyType && difference.inDays <= 15; final bool isExpirationSoon = isKeyType && difference.inDays <= 15;
final bool isShow = final bool isShow = isKeyType && isKeyStatus || isExpirationSoon || isLongFrozenStatus;
isKeyType && isKeyStatus || isExpirationSoon || isLongFrozenStatus;
return isShow; return isShow;
} }
@ -194,13 +179,11 @@ class LockListLogic extends BaseGetXController {
// //
AppLog.log('调用了删除锁'); AppLog.log('调用了删除锁');
showTipView.resetGetController(); showTipView.resetGetController();
showTipView.showTFViewAlertDialog( showTipView.showTFViewAlertDialog(state.passwordTF, '请输入登录密码'.tr, '请输入登录密码'.tr, checkLoginPassword);
state.passwordTF, '请输入登录密码'.tr, '请输入登录密码'.tr, checkLoginPassword);
}); });
} else if (state.lockListInfoItemEntity.keyRight == 1) { } else if (state.lockListInfoItemEntity.keyRight == 1) {
// //
showTipView.showDeleteAdministratorIsHaveAllDataDialog( showTipView.showDeleteAdministratorIsHaveAllDataDialog('同时删除其发送的所有钥匙,钥匙删除后不能恢复'.tr, (bool a) {
'同时删除其发送的所有钥匙,钥匙删除后不能恢复'.tr, (bool a) {
// //
state.deleteAdministratorIsHaveAllData.value = a; state.deleteAdministratorIsHaveAllData.value = a;
deletKeyData(); deletKeyData();
@ -240,8 +223,7 @@ class LockListLogic extends BaseGetXController {
final LockListInfoEntity entity = await ApiRepository.to.deletOwnerKeyData( final LockListInfoEntity entity = await ApiRepository.to.deletOwnerKeyData(
lockId: state.lockListInfoItemEntity.lockId.toString(), lockId: state.lockListInfoItemEntity.lockId.toString(),
keyId: state.lockListInfoItemEntity.keyId.toString(), keyId: state.lockListInfoItemEntity.keyId.toString(),
includeUnderlings: includeUnderlings: state.deleteAdministratorIsHaveAllData.value == true ? 1 : 0);
state.deleteAdministratorIsHaveAllData.value == true ? 1 : 0);
if (entity.errorCode!.codeIsSuccessful) { if (entity.errorCode!.codeIsSuccessful) {
BlueManage().connectDeviceMacAddress = ''; BlueManage().connectDeviceMacAddress = '';
SchedulerBinding.instance.addPostFrameCallback((_) { SchedulerBinding.instance.addPostFrameCallback((_) {
@ -259,42 +241,38 @@ class LockListLogic extends BaseGetXController {
dismissEasyLoading(); dismissEasyLoading();
showDeletAlertTipDialog(); showDeletAlertTipDialog();
}); });
BlueManage().blueSendData(state.lockListInfoItemEntity.lockName!, BlueManage().blueSendData(state.lockListInfoItemEntity.lockName!, (BluetoothConnectionState connectionState) async {
(BluetoothConnectionState connectionState) async {
if (connectionState == BluetoothConnectionState.connected) { if (connectionState == BluetoothConnectionState.connected) {
final List<int> publicKeyData = final List<int> publicKeyData = state.lockListInfoItemEntity.bluetooth!.publicKey!.cast<int>();
state.lockListInfoItemEntity.bluetooth!.publicKey!.cast<int>(); final List<String> saveStrList = changeIntListToStringList(publicKeyData);
final List<String> saveStrList =
changeIntListToStringList(publicKeyData);
await Storage.setStringList(saveBluePublicKey, saveStrList); await Storage.setStringList(saveBluePublicKey, saveStrList);
// //
final List<int> privateKeyData = final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
state.lockListInfoItemEntity.bluetooth!.privateKey!.cast<int>(); final List<int> privateKeyData = state.lockListInfoItemEntity.bluetooth!.privateKey!.cast<int>();
final List<String> savePrivateKeyList = final List<String> savePrivateKeyList = changeIntListToStringList(privateKeyData);
changeIntListToStringList(privateKeyData);
await Storage.setStringList(saveBluePrivateKey, savePrivateKeyList); await Storage.setStringList(saveBluePrivateKey, savePrivateKeyList);
// signKey // signKey
final List<int> signKeyData = final List<int> signKeyData = state.lockListInfoItemEntity.bluetooth!.signKey!.cast<int>();
state.lockListInfoItemEntity.bluetooth!.signKey!.cast<int>(); final List<String> saveSignKeyList = changeIntListToStringList(signKeyData);
final List<String> saveSignKeyList =
changeIntListToStringList(signKeyData);
await Storage.setStringList(saveBlueSignKey, saveSignKeyList); await Storage.setStringList(saveBlueSignKey, saveSignKeyList);
final List<String> saveTokenList = final List<String> saveTokenList = changeIntListToStringList(<int>[0, 0, 0, 0]);
changeIntListToStringList(<int>[0, 0, 0, 0]);
await Storage.setStringList(saveBlueToken, saveTokenList); await Storage.setStringList(saveBlueToken, saveTokenList);
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
final List<String>? publicKey = await Storage.getStringList(saveBluePublicKey);
final List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
IoSenderManage.senderFactoryDataReset( IoSenderManage.senderFactoryDataReset(
lockID: BlueManage().connectDeviceName, lockID: BlueManage().connectDeviceName,
userID: await Storage.getUid(), userID: await Storage.getUid(),
keyID: '1', keyID: '1',
needAuthor: 1, needAuthor: 1,
publicKey: publicKey: publicKeyDataList,
state.lockListInfoItemEntity.bluetooth!.publicKey!.cast<int>(), privateKey: getPrivateKeyList,
privateKey:
state.lockListInfoItemEntity.bluetooth!.privateKey!.cast<int>(),
token: <int>[0, 0, 0, 0]); token: <int>[0, 0, 0, 0]);
} else if (connectionState == BluetoothConnectionState.disconnected) { } else if (connectionState == BluetoothConnectionState.disconnected) {
dismissEasyLoading(); dismissEasyLoading();
@ -352,9 +330,7 @@ class LockListLogic extends BaseGetXController {
} }
void _initEventHandler() { void _initEventHandler() {
_setLockListInfoGroupEntity = eventBus _setLockListInfoGroupEntity = eventBus.on<SetLockListInfoGroupEntity>().listen((SetLockListInfoGroupEntity event) async {
.on<SetLockListInfoGroupEntity>()
.listen((SetLockListInfoGroupEntity event) async {
setLockListInfoGroupEntity(event.lockListInfoGroupEntity); setLockListInfoGroupEntity(event.lockListInfoGroupEntity);
}); });
} }

View File

@ -14,8 +14,7 @@ import 'package:star_lock/talk/starChart/proto/talk_data_h264_frame.pb.dart';
// class UdpTalkDataHandler extends ScpMessageBaseHandle // class UdpTalkDataHandler extends ScpMessageBaseHandle
// implements ScpMessageHandler { // implements ScpMessageHandler {
class UdpTalkDataHandler extends ScpMessageBaseHandle class UdpTalkDataHandler extends ScpMessageBaseHandle implements ScpMessageHandler {
implements ScpMessageHandler {
// //
static final UdpTalkDataHandler instance = UdpTalkDataHandler(); static final UdpTalkDataHandler instance = UdpTalkDataHandler();
@ -37,7 +36,7 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
if (scpMessage.Payload != null) { if (scpMessage.Payload != null) {
final TalkData talkData = scpMessage.Payload; final TalkData talkData = scpMessage.Payload;
AppLog.log('收到数据');
_handleTalkData( _handleTalkData(
talkData: talkData, talkData: talkData,
scpMessage: scpMessage, scpMessage: scpMessage,
@ -73,10 +72,7 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
// _asyncLog( // _asyncLog(
// '分包数据:messageId:$messageId [$spIndex/$spTotal] PayloadLength:$PayloadLength'); // '分包数据:messageId:$messageId [$spIndex/$spTotal] PayloadLength:$PayloadLength');
if (messageType == MessageTypeConstant.RealTimeData) { if (messageType == MessageTypeConstant.RealTimeData) {
if (spTotal != null && if (spTotal != null && spTotal > 1 && messageId != null && spIndex != null) {
spTotal > 1 &&
messageId != null &&
spIndex != null) {
// //
return handleFragmentedPayload( return handleFragmentedPayload(
messageId: messageId, messageId: messageId,
@ -129,13 +125,11 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
talkDataH264Frame.mergeFromBuffer(talkData.content); talkDataH264Frame.mergeFromBuffer(talkData.content);
// AppLog.log('处理H264帧: frameType=${talkDataH264Frame.frameType}, frameSeq=${talkDataH264Frame.frameSeq},MessageId:${scpMessage.MessageId}'); // AppLog.log('处理H264帧: frameType=${talkDataH264Frame.frameType}, frameSeq=${talkDataH264Frame.frameSeq},MessageId:${scpMessage.MessageId}');
frameHandler.handleFrame(talkDataH264Frame, talkData, scpMessage); frameHandler.handleFrame(talkDataH264Frame, talkData, scpMessage);
} }
/// ///
void _handleVideoImage(TalkData talkData) async { void _handleVideoImage(TalkData talkData) async {
final List<Uint8List> processCompletePayload = final List<Uint8List> processCompletePayload = await _processCompletePayload(Uint8List.fromList(talkData.content));
await _processCompletePayload(Uint8List.fromList(talkData.content));
processCompletePayload.forEach((element) { processCompletePayload.forEach((element) {
talkData.content = element; talkData.content = element;
talkDataRepository.addTalkData( talkDataRepository.addTalkData(
@ -177,8 +171,7 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
startIdx = i; startIdx = i;
i++; // Skip the next byte i++; // Skip the next byte
} else if (nextByte == 0xD9 && startIdx != -1) { } else if (nextByte == 0xD9 && startIdx != -1) {
frames frames.add(Uint8List.view(payload.buffer, startIdx, i + 2 - startIdx));
.add(Uint8List.view(payload.buffer, startIdx, i + 2 - startIdx));
startIdx = -1; startIdx = -1;
i++; // Skip the next byte i++; // Skip the next byte
} }

View File

@ -18,20 +18,18 @@ import 'package:star_lock/tools/push/xs_jPhush.dart';
import 'package:star_lock/tools/storage.dart'; import 'package:star_lock/tools/storage.dart';
import 'package:star_lock/translations/current_locale_tool.dart'; import 'package:star_lock/translations/current_locale_tool.dart';
class UdpTalkRequestHandler extends ScpMessageBaseHandle class UdpTalkRequestHandler extends ScpMessageBaseHandle implements ScpMessageHandler {
implements ScpMessageHandler { RxString currentLanguage = CurrentLocaleTool.getCurrentLocaleString().obs; //
RxString currentLanguage =
CurrentLocaleTool.getCurrentLocaleString().obs; //
@override @override
void handleReq(ScpMessage scpMessage) async { void handleReq(ScpMessage scpMessage) async {
// //
final loginData = await Storage.getLoginData(); final loginData = await Storage.getLoginData();
// //
if (loginData != null && if (loginData != null && (talkStatus.status != TalkStatus.passiveCallWaitingAnswer || talkStatus.status != TalkStatus.answeredSuccessfully)) {
(talkStatus.status != TalkStatus.passiveCallWaitingAnswer ||
talkStatus.status != TalkStatus.answeredSuccessfully)) {
// //
AppLog.log('收到对讲请求ToPeerId${scpMessage.ToPeerId}');
AppLog.log('收到对讲请求FromPeerId${scpMessage.FromPeerId}');
final TalkReq talkReq = scpMessage.Payload; final TalkReq talkReq = scpMessage.Payload;
startChartManage.FromPeerId = scpMessage.ToPeerId!; startChartManage.FromPeerId = scpMessage.ToPeerId!;
startChartManage.ToPeerId = scpMessage.FromPeerId!; startChartManage.ToPeerId = scpMessage.FromPeerId!;
@ -97,8 +95,7 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
} }
// //
Future<void> _showTalkRequestNotification( Future<void> _showTalkRequestNotification({required String talkObjectName}) async {
{required String talkObjectName}) async {
if (Platform.isAndroid) { if (Platform.isAndroid) {
final Map<String, dynamic> message = { final Map<String, dynamic> message = {
'platform': 'all', 'platform': 'all',
@ -167,14 +164,12 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
void _handleRequestSendExpect({ void _handleRequestSendExpect({
required String lockPeerID, required String lockPeerID,
}) async { }) async {
final LockListInfoItemEntity currentKeyInfo = final LockListInfoItemEntity currentKeyInfo = CommonDataManage().currentKeyInfo;
CommonDataManage().currentKeyInfo;
var isH264 = currentKeyInfo.lockFeature?.isH264 == 1; var isH264 = currentKeyInfo.lockFeature?.isH264 == 1;
var isMJpeg = currentKeyInfo.lockFeature?.isMJpeg == 1; var isMJpeg = currentKeyInfo.lockFeature?.isMJpeg == 1;
final LockListInfoGroupEntity? lockListInfoGroupEntity = final LockListInfoGroupEntity? lockListInfoGroupEntity = await Storage.getLockMainListData();
await Storage.getLockMainListData();
if (lockListInfoGroupEntity != null) { if (lockListInfoGroupEntity != null) {
lockListInfoGroupEntity!.groupList?.forEach((element) { lockListInfoGroupEntity!.groupList?.forEach((element) {
final lockList = element.lockList; final lockList = element.lockList;
@ -195,18 +190,15 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
if (isH264) { if (isH264) {
// H264H264视频和G711音频期望 // H264H264视频和G711音频期望
startChartManage.sendOnlyH264VideoTalkExpectData(); startChartManage.sendOnlyH264VideoTalkExpectData();
print( print('app收到的对讲请求后发送的预期数据=========锁支持H264发送H264视频格式期望数据,peerID=${lockPeerID}');
'app收到的对讲请求后发送的预期数据=========锁支持H264发送H264视频格式期望数据,peerID=${lockPeerID}');
} else if (isMJpeg) { } else if (isMJpeg) {
// MJPEGG711音频期望 // MJPEGG711音频期望
startChartManage.sendOnlyImageVideoTalkExpectData(); startChartManage.sendOnlyImageVideoTalkExpectData();
print( print('app收到的对讲请求后发送的预期数据=========锁不支持H264支持MJPEG发送MJPEG视频格式期望数据,peerID=${lockPeerID}');
'app收到的对讲请求后发送的预期数据=========锁不支持H264支持MJPEG发送MJPEG视频格式期望数据,peerID=${lockPeerID}');
} else { } else {
// 使 // 使
startChartManage.sendOnlyImageVideoTalkExpectData(); startChartManage.sendOnlyImageVideoTalkExpectData();
print( print('app收到的对讲请求后发送的预期数据=========锁不支持H264和MJPEG默认发送MJPEG视频格式期望数据,peerID=${lockPeerID}');
'app收到的对讲请求后发送的预期数据=========锁不支持H264和MJPEG默认发送MJPEG视频格式期望数据,peerID=${lockPeerID}');
} }
} }
@ -214,14 +206,12 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
void _handleResponseSendExpect({ void _handleResponseSendExpect({
required String lockPeerID, required String lockPeerID,
}) async { }) async {
final LockListInfoItemEntity currentKeyInfo = final LockListInfoItemEntity currentKeyInfo = CommonDataManage().currentKeyInfo;
CommonDataManage().currentKeyInfo;
var isH264 = currentKeyInfo.lockFeature?.isH264 == 1; var isH264 = currentKeyInfo.lockFeature?.isH264 == 1;
var isMJpeg = currentKeyInfo.lockFeature?.isMJpeg == 1; var isMJpeg = currentKeyInfo.lockFeature?.isMJpeg == 1;
final LockListInfoGroupEntity? lockListInfoGroupEntity = final LockListInfoGroupEntity? lockListInfoGroupEntity = await Storage.getLockMainListData();
await Storage.getLockMainListData();
if (lockListInfoGroupEntity != null) { if (lockListInfoGroupEntity != null) {
lockListInfoGroupEntity!.groupList?.forEach((element) { lockListInfoGroupEntity!.groupList?.forEach((element) {
final lockList = element.lockList; final lockList = element.lockList;
@ -242,18 +232,15 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
if (isH264) { if (isH264) {
// H264H264视频和G711音频期望 // H264H264视频和G711音频期望
startChartManage.sendH264VideoAndG711AudioTalkExpectData(); startChartManage.sendH264VideoAndG711AudioTalkExpectData();
AppLog.log( AppLog.log('app主动发对讲请求收到回复后发送的预期数据=======锁支持H264发送H264视频格式期望数据,peerID=${lockPeerID}');
'app主动发对讲请求收到回复后发送的预期数据=======锁支持H264发送H264视频格式期望数据,peerID=${lockPeerID}');
} else if (isMJpeg) { } else if (isMJpeg) {
// MJPEGG711音频期望 // MJPEGG711音频期望
startChartManage.sendImageVideoAndG711AudioTalkExpectData(); startChartManage.sendImageVideoAndG711AudioTalkExpectData();
AppLog.log( AppLog.log('app主动发对讲请求收到回复后发送的预期数据=======锁不支持H264支持MJPEG发送MJPEG视频格式期望数据,peerID=${lockPeerID}');
'app主动发对讲请求收到回复后发送的预期数据=======锁不支持H264支持MJPEG发送MJPEG视频格式期望数据,peerID=${lockPeerID}');
} else { } else {
// 使 // 使
startChartManage.sendImageVideoAndG711AudioTalkExpectData(); startChartManage.sendImageVideoAndG711AudioTalkExpectData();
AppLog.log( AppLog.log('app主动发对讲请求收到回复后发送的预期数据=======锁不支持H264和MJPEG默认发送MJPEG视频格式期望数据,peerID=${lockPeerID}');
'app主动发对讲请求收到回复后发送的预期数据=======锁不支持H264和MJPEG默认发送MJPEG视频格式期望数据,peerID=${lockPeerID}');
} }
} }
} }

View File

@ -61,12 +61,9 @@ class StartChartManage {
// //
static final StartChartManage _instance = StartChartManage._internal(); static final StartChartManage _instance = StartChartManage._internal();
final TalkeRequestOverTimeTimerManager talkeRequestOverTimeTimerManager = final TalkeRequestOverTimeTimerManager talkeRequestOverTimeTimerManager = TalkeRequestOverTimeTimerManager();
TalkeRequestOverTimeTimerManager(); final TalkePingOverTimeTimerManager talkePingOverTimeTimerManager = TalkePingOverTimeTimerManager();
final TalkePingOverTimeTimerManager talkePingOverTimeTimerManager = final TalkDataOverTimeTimerManager talkDataOverTimeTimerManager = TalkDataOverTimeTimerManager();
TalkePingOverTimeTimerManager();
final TalkDataOverTimeTimerManager talkDataOverTimeTimerManager =
TalkDataOverTimeTimerManager();
// //
factory StartChartManage() { factory StartChartManage() {
@ -171,8 +168,7 @@ class StartChartManage {
FromPeerId = loginData?.starchart?.starchartId ?? ''; FromPeerId = loginData?.starchart?.starchartId ?? '';
} else { } else {
_log(text: '开始注册客户端'); _log(text: '开始注册客户端');
final StarChartRegisterNodeEntity requestStarChartRegisterNode = final StarChartRegisterNodeEntity requestStarChartRegisterNode = await _requestStarChartRegisterNode();
await _requestStarChartRegisterNode();
await _saveStarChartRegisterNodeToStorage(requestStarChartRegisterNode); await _saveStarChartRegisterNodeToStorage(requestStarChartRegisterNode);
FromPeerId = requestStarChartRegisterNode.peer!.id ?? ''; FromPeerId = requestStarChartRegisterNode.peer!.id ?? '';
bindUserStarchart(requestStarChartRegisterNode); bindUserStarchart(requestStarChartRegisterNode);
@ -180,18 +176,14 @@ class StartChartManage {
} }
// //
Future<void> bindUserStarchart( Future<void> bindUserStarchart(StarChartRegisterNodeEntity requestStarChartRegisterNode) async {
StarChartRegisterNodeEntity requestStarChartRegisterNode) async {
try { try {
final LoginEntity entity = await ApiRepository.to.bindUserStarchart( final LoginEntity entity = await ApiRepository.to.bindUserStarchart(
starchartId: requestStarChartRegisterNode.peer?.id ?? '', starchartId: requestStarChartRegisterNode.peer?.id ?? '',
starchartPeerPublicKey: starchartPeerPublicKey: requestStarChartRegisterNode.peer?.publicKey ?? '',
requestStarChartRegisterNode.peer?.publicKey ?? '', starchartPeerPrivateKey: requestStarChartRegisterNode.peer?.privateKey ?? '',
starchartPeerPrivateKey:
requestStarChartRegisterNode.peer?.privateKey ?? '',
); );
requestStarChartRegisterNode.peer?.id = requestStarChartRegisterNode.peer?.id = entity.data?.starchart?.starchartId;
entity.data?.starchart?.starchartId;
if (entity.errorCode!.codeIsSuccessful) { if (entity.errorCode!.codeIsSuccessful) {
AppLog.log('绑定成功'); AppLog.log('绑定成功');
} else { } else {
@ -204,14 +196,12 @@ class StartChartManage {
// //
Future<void> _relayQuery() async { Future<void> _relayQuery() async {
final RelayInfoEntity relayInfoEntity = final RelayInfoEntity relayInfoEntity = await StartChartApi.to.relayQueryInfo();
await StartChartApi.to.relayQueryInfo();
_saveRelayInfoEntityToStorage(relayInfoEntity); _saveRelayInfoEntityToStorage(relayInfoEntity);
if (relayInfoEntity.client_addr != null) { if (relayInfoEntity.client_addr != null) {
localPublicHost = relayInfoEntity.client_addr!; localPublicHost = relayInfoEntity.client_addr!;
} }
if (relayInfoEntity.relay_list != null && if (relayInfoEntity.relay_list != null && relayInfoEntity.relay_list!.length > 0) {
relayInfoEntity.relay_list!.length > 0) {
for (int i = 0; i <= relayInfoEntity.relay_list!.length; i++) { for (int i = 0; i <= relayInfoEntity.relay_list!.length; i++) {
final data = relayInfoEntity.relay_list?[i]; final data = relayInfoEntity.relay_list?[i];
if (data?.peerID != FromPeerId) { if (data?.peerID != FromPeerId) {
@ -239,8 +229,7 @@ class StartChartManage {
// udp // udp
Future<void> _onlineRelayService() async { Future<void> _onlineRelayService() async {
var addressIListenFrom = InternetAddress.anyIPv4; var addressIListenFrom = InternetAddress.anyIPv4;
await RawDatagramSocket.bind(addressIListenFrom, localPort) await RawDatagramSocket.bind(addressIListenFrom, localPort).then((RawDatagramSocket socket) {
.then((RawDatagramSocket socket) {
// (SO_RCVBUF = 8) // (SO_RCVBUF = 8)
if (AppPlatform.isAndroid) { if (AppPlatform.isAndroid) {
socket.setRawOption( socket.setRawOption(
@ -291,15 +280,13 @@ class StartChartManage {
} }
// RbcuInfo // RbcuInfo
void _sendRbcuInfoMessage( void _sendRbcuInfoMessage({required String ToPeerId, bool isResp = false}) async {
{required String ToPeerId, bool isResp = false}) async {
final uuid = _uuid.v1(); final uuid = _uuid.v1();
final int timestamp = DateTime.now().millisecondsSinceEpoch; final int timestamp = DateTime.now().millisecondsSinceEpoch;
final Int64 int64Timestamp = Int64(timestamp); // 使 final Int64 int64Timestamp = Int64(timestamp); // 使
// ip地址和中继返回的外网地址 // ip地址和中继返回的外网地址
final List<ListenAddrData> listenAddrDataList = final List<ListenAddrData> listenAddrDataList = await _makeListenAddrDataList();
await _makeListenAddrDataList();
listenAddrDataList.insert( listenAddrDataList.insert(
0, // 0, //
ListenAddrData( ListenAddrData(
@ -309,15 +296,13 @@ class StartChartManage {
); );
final address = listenAddrDataList final address = listenAddrDataList
.where((element) => .where((element) => element.type == ListenAddrTypeConstant.local) //
element.type == ListenAddrTypeConstant.local) //
.map((e) => e.address) // List<String?> .map((e) => e.address) // List<String?>
.where((addr) => addr != null) // null .where((addr) => addr != null) // null
.map( .map(
(addr) => addr!.replaceAll(IpConstant.udpUrl, ''), (addr) => addr!.replaceAll(IpConstant.udpUrl, ''),
) // "udp://" ) // "udp://"
.cast< .cast<String>(); // Iterable<String>// Iterable<String?> Iterable<String>
String>(); // Iterable<String>// Iterable<String?> Iterable<String>
_rbcuSessionId = uuid; _rbcuSessionId = uuid;
final RbcuInfo rbcuInfo = RbcuInfo( final RbcuInfo rbcuInfo = RbcuInfo(
sessionId: uuid, sessionId: uuid,
@ -340,28 +325,21 @@ class StartChartManage {
void _sendRbcuProbeMessage() async { void _sendRbcuProbeMessage() async {
// //
String generateRandomString(int length) { String generateRandomString(int length) {
const chars = const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
final random = Random(); final random = Random();
return String.fromCharCodes( return String.fromCharCodes(
List.generate( List.generate(length, (index) => chars.codeUnitAt(random.nextInt(chars.length))),
length, (index) => chars.codeUnitAt(random.nextInt(chars.length))),
); );
} }
if (rbcuInfo != null && if (rbcuInfo != null && rbcuInfo!.address != null && rbcuInfo!.address.length > 0) {
rbcuInfo!.address != null &&
rbcuInfo!.address.length > 0) {
rbcuInfo!.address.forEach((element) { rbcuInfo!.address.forEach((element) {
// element // element
final parts = element.split(':'); final parts = element.split(':');
final host = parts[0]; // IP final host = parts[0]; // IP
final port = int.tryParse(parts[1]) ?? 0; // 0 final port = int.tryParse(parts[1]) ?? 0; // 0
final RbcuProbe rbcuProbe = RbcuProbe( final RbcuProbe rbcuProbe = RbcuProbe(sessionId: _rbcuSessionId, data: generateRandomString(100), targetAddress: element);
sessionId: _rbcuSessionId,
data: generateRandomString(100),
targetAddress: element);
final rbcuProBeBuffer = rbcuProbe.writeToBuffer(); final rbcuProBeBuffer = rbcuProbe.writeToBuffer();
_sendNatMessage(message: rbcuProBeBuffer, host: host, port: port); _sendNatMessage(message: rbcuProBeBuffer, host: host, port: port);
}); });
@ -378,8 +356,7 @@ class StartChartManage {
// //
void startSendingRbcuInfoMessages({required String ToPeerId}) { void startSendingRbcuInfoMessages({required String ToPeerId}) {
// 1 _sendRbcuInfoMessage // 1 _sendRbcuInfoMessage
rbcuInfoTimer ??= rbcuInfoTimer ??= Timer.periodic(Duration(seconds: _defaultIntervalTime), (timer) {
Timer.periodic(Duration(seconds: _defaultIntervalTime), (timer) {
// RbcuInfo // RbcuInfo
_log(text: '发送RbcuInfo 地址交换消息'); _log(text: '发送RbcuInfo 地址交换消息');
_sendRbcuInfoMessage(ToPeerId: ToPeerId); _sendRbcuInfoMessage(ToPeerId: ToPeerId);
@ -389,8 +366,7 @@ class StartChartManage {
// //
void startSendingRbcuProbeTMessages() { void startSendingRbcuProbeTMessages() {
// 1 _sendRbcuInfoMessage // 1 _sendRbcuInfoMessage
rbcuProbeTimer ??= rbcuProbeTimer ??= Timer.periodic(Duration(seconds: _defaultIntervalTime), (timer) {
Timer.periodic(Duration(seconds: _defaultIntervalTime), (timer) {
// RbcuProbe // RbcuProbe
_sendRbcuProbeMessage(); _sendRbcuProbeMessage();
}); });
@ -398,8 +374,7 @@ class StartChartManage {
// //
void startSendingRbcuConfirmTMessages() { void startSendingRbcuConfirmTMessages() {
rbcuConfirmTimer ??= rbcuConfirmTimer ??= Timer.periodic(Duration(seconds: _defaultIntervalTime), (timer) {
Timer.periodic(Duration(seconds: _defaultIntervalTime), (timer) {
// RbcuProbe // RbcuProbe
_sendRbcuConfirmMessage(); _sendRbcuConfirmMessage();
}); });
@ -458,11 +433,11 @@ class StartChartManage {
// ); // );
// } // }
// } // }
final LockListInfoItemEntity currentKeyInfo = final LockListInfoItemEntity currentKeyInfo = CommonDataManage().currentKeyInfo;
CommonDataManage().currentKeyInfo;
final isH264 = currentKeyInfo.lockFeature?.isH264 == 1; final isH264 = currentKeyInfo.lockFeature?.isH264 == 1;
final isMJpeg = currentKeyInfo.lockFeature?.isMJpeg == 1; final isMJpeg = currentKeyInfo.lockFeature?.isMJpeg == 1;
AppLog.log('isH264:${isH264}');
AppLog.log('isMJpeg:${isMJpeg}');
// 使H264MJPEG // 使H264MJPEG
if (isH264) { if (isH264) {
Get.toNamed( Get.toNamed(
@ -483,6 +458,7 @@ class StartChartManage {
seconds: _defaultIntervalTime, seconds: _defaultIntervalTime,
), ),
(Timer timer) async { (Timer timer) async {
AppLog.log('发送对讲请求:${ToPeerId}');
await sendCallRequestMessage(ToPeerId: ToPeerId); await sendCallRequestMessage(ToPeerId: ToPeerId);
}, },
); );
@ -526,8 +502,7 @@ class StartChartManage {
List<int> packetTalkData = payload.sublist(start, end); List<int> packetTalkData = payload.sublist(start, end);
// messageID // messageID
final messageId = final messageId = MessageCommand.getNextMessageId(toPeerId, increment: false);
MessageCommand.getNextMessageId(toPeerId, increment: false);
// //
final message = MessageCommand.talkDataMessage( final message = MessageCommand.talkDataMessage(
ToPeerId: toPeerId, ToPeerId: toPeerId,
@ -562,8 +537,7 @@ class StartChartManage {
final List<int> message = MessageCommand.heartbeatMessage( final List<int> message = MessageCommand.heartbeatMessage(
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: relayPeerId, ToPeerId: relayPeerId,
MessageId: MessageId: MessageCommand.getNextMessageId(relayPeerId, increment: true),
MessageCommand.getNextMessageId(relayPeerId, increment: true),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
}, },
@ -572,8 +546,7 @@ class StartChartManage {
} }
// //
void sendEchoMessage( void sendEchoMessage({required List<int> payload, required String toPeerId}) async {
{required List<int> payload, required String toPeerId}) async {
// //
final int totalPackets = (payload.length / _maxPayloadSize).ceil(); final int totalPackets = (payload.length / _maxPayloadSize).ceil();
// //
@ -587,8 +560,7 @@ class StartChartManage {
List<int> packet = payload.sublist(start, end); List<int> packet = payload.sublist(start, end);
// messageID // messageID
final messageId = final messageId = MessageCommand.getNextMessageId(toPeerId, increment: false);
MessageCommand.getNextMessageId(toPeerId, increment: false);
// //
final message = MessageCommand.echoMessage( final message = MessageCommand.echoMessage(
ToPeerId: toPeerId, ToPeerId: toPeerId,
@ -606,8 +578,7 @@ class StartChartManage {
} }
// //
void sendGatewayResetMessage( void sendGatewayResetMessage({required String ToPeerId, required int gatewayId}) async {
{required String ToPeerId, required int gatewayId}) async {
final message = MessageCommand.gatewayResetMessage( final message = MessageCommand.gatewayResetMessage(
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
@ -728,8 +699,7 @@ class StartChartManage {
} }
// //
Future<void> sendTalkPingMessage( Future<void> sendTalkPingMessage({required String ToPeerId, required String FromPeerId}) async {
{required String ToPeerId, required String FromPeerId}) async {
final message = MessageCommand.talkPingMessage( final message = MessageCommand.talkPingMessage(
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
@ -825,11 +795,9 @@ class StartChartManage {
// //
Future<void> _sendMessage({required List<int> message}) async { Future<void> _sendMessage({required List<int> message}) async {
var result = await _udpSocket?.send( var result = await _udpSocket?.send(message, InternetAddress(remoteHost), remotePort);
message, InternetAddress(remoteHost), remotePort);
if (result != message.length) { if (result != message.length) {
throw StartChartMessageException( throw StartChartMessageException('❌Udp send data error----> $result ${message.length}');
'❌Udp send data error----> $result ${message.length}');
// _udpSocket = null; // _udpSocket = null;
} }
@ -846,15 +814,11 @@ class StartChartManage {
} }
// //
Future<void> _sendNatMessage( Future<void> _sendNatMessage({required List<int> message, required String host, required int port}) async {
{required List<int> message,
required String host,
required int port}) async {
_log(text: '发送nat消息'); _log(text: '发送nat消息');
var result = await _udpSocket?.send(message, InternetAddress(host), port); var result = await _udpSocket?.send(message, InternetAddress(host), port);
if (result != message.length) { if (result != message.length) {
throw StartChartMessageException( throw StartChartMessageException('❌Udp send data error----> $result ${message.length}');
'❌Udp send data error----> $result ${message.length}');
// _udpSocket = null; // _udpSocket = null;
} }
} }
@ -864,8 +828,7 @@ class StartChartManage {
// //
final Map<String, String> deviceInfo = await _getDeviceInfo(); final Map<String, String> deviceInfo = await _getDeviceInfo();
// //
final StarChartRegisterNodeEntity response = final StarChartRegisterNodeEntity response = await StartChartApi.to.starChartRegisterNode(
await StartChartApi.to.starChartRegisterNode(
product: _productName, product: _productName,
model: '${deviceInfo['brand']}_${deviceInfo['model']}', model: '${deviceInfo['brand']}_${deviceInfo['model']}',
name: '${deviceInfo['id']}', name: '${deviceInfo['id']}',
@ -875,8 +838,7 @@ class StartChartManage {
} }
// //
Future<void> _saveStarChartRegisterNodeToStorage( Future<void> _saveStarChartRegisterNodeToStorage(StarChartRegisterNodeEntity starChartRegisterNodeEntity) async {
StarChartRegisterNodeEntity starChartRegisterNodeEntity) async {
if (starChartRegisterNodeEntity != null) { if (starChartRegisterNodeEntity != null) {
await Storage.saveStarChartRegisterNodeInfo(starChartRegisterNodeEntity); await Storage.saveStarChartRegisterNodeInfo(starChartRegisterNodeEntity);
final LoginData? loginData = await Storage.getLoginData(); final LoginData? loginData = await Storage.getLoginData();
@ -886,8 +848,7 @@ class StartChartManage {
} }
// //
Future<void> _saveRelayInfoEntityToStorage( Future<void> _saveRelayInfoEntityToStorage(RelayInfoEntity relayInfoEntity) async {
RelayInfoEntity relayInfoEntity) async {
if (relayInfoEntity != null) { if (relayInfoEntity != null) {
await Storage.saveRelayInfo(relayInfoEntity); await Storage.saveRelayInfo(relayInfoEntity);
} }
@ -909,8 +870,7 @@ class StartChartManage {
); );
// ip地址和中继返回的外网地址 // ip地址和中继返回的外网地址
final List<ListenAddrData> listenAddrDataList = final List<ListenAddrData> listenAddrDataList = await _makeListenAddrDataList();
await _makeListenAddrDataList();
// //
final RelayServiceData relayServiceData = RelayServiceData( final RelayServiceData relayServiceData = RelayServiceData(
@ -980,8 +940,7 @@ class StartChartManage {
ipAddress = ipAddress.split('%').first; ipAddress = ipAddress.split('%').first;
} }
// IP // IP
if (ipAddress.isNotEmpty && if (ipAddress.isNotEmpty && !IpConstant.reportExcludeIp.contains(ipAddress)) {
!IpConstant.reportExcludeIp.contains(ipAddress)) {
ipAddresses.add(ipAddress); ipAddresses.add(ipAddress);
} }
} }
@ -998,8 +957,7 @@ class StartChartManage {
/// ///
Future<Map<String, String>> _getDeviceInfo() async { Future<Map<String, String>> _getDeviceInfo() async {
final Map<String, String> deviceInfo = final Map<String, String> deviceInfo = await DeviceInfoUtils.getDeviceInfo();
await DeviceInfoUtils.getDeviceInfo();
return deviceInfo; return deviceInfo;
} }
@ -1016,8 +974,7 @@ class StartChartManage {
if (host != null && port != null) { if (host != null && port != null) {
try { try {
// DNS // DNS
final List<InternetAddress> addresses = final List<InternetAddress> addresses = await InternetAddress.lookup(host);
await InternetAddress.lookup(host);
if (addresses.isEmpty) { if (addresses.isEmpty) {
throw FormatException('DNS resolution failed for $host'); throw FormatException('DNS resolution failed for $host');
} }
@ -1082,8 +1039,7 @@ class StartChartManage {
final int payloadType = scpMessage.PayloadType ?? 0; final int payloadType = scpMessage.PayloadType ?? 0;
final int messageType = scpMessage.MessageType ?? 0; final int messageType = scpMessage.MessageType ?? 0;
try { try {
final ScpMessageHandler handler = final ScpMessageHandler handler = ScpMessageHandlerFactory.createHandler(payloadType);
ScpMessageHandlerFactory.createHandler(payloadType);
if (messageType == MessageTypeConstant.Req) { if (messageType == MessageTypeConstant.Req) {
handler.handleReq(scpMessage); handler.handleReq(scpMessage);
} else if (messageType == MessageTypeConstant.Resp) { } else if (messageType == MessageTypeConstant.Resp) {
@ -1170,8 +1126,7 @@ class StartChartManage {
} }
/// ///
void changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer( void changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer({required TalkExpectReq talkExpect}) {
{required TalkExpectReq talkExpect}) {
_defaultTalkExpect = talkExpect; _defaultTalkExpect = talkExpect;
reStartTalkExpectMessageTimer(); reStartTalkExpectMessageTimer();
} }
@ -1190,8 +1145,7 @@ class StartChartManage {
videoType: [VideoTypeE.IMAGE], videoType: [VideoTypeE.IMAGE],
audioType: [], audioType: [],
); );
changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer( changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer(talkExpect: talkExpectReq);
talkExpect: talkExpectReq);
} }
/// ///
@ -1200,20 +1154,17 @@ class StartChartManage {
videoType: [VideoTypeE.H264], videoType: [VideoTypeE.H264],
audioType: [], audioType: [],
); );
changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer( changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer(talkExpect: talkExpectReq);
talkExpect: talkExpectReq);
} }
/// ///
void sendImageVideoAndG711AudioTalkExpectData() { void sendImageVideoAndG711AudioTalkExpectData() {
changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer( changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer(talkExpect: TalkConstant.ImageExpect);
talkExpect: TalkConstant.ImageExpect);
} }
/// ///
void sendH264VideoAndG711AudioTalkExpectData() { void sendH264VideoAndG711AudioTalkExpectData() {
changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer( changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer(talkExpect: TalkConstant.H264Expect);
talkExpect: TalkConstant.H264Expect);
} }
/// ///