fix: 增加日志
This commit is contained in:
parent
f73943785f
commit
a4892633a3
@ -32,12 +32,10 @@ class LockListLogic extends BaseGetXController {
|
||||
final ShowTipView showTipView = ShowTipView();
|
||||
|
||||
List<GroupList> get groupDataListFiltered {
|
||||
final List<GroupList> list =
|
||||
groupDataList.map((GroupList e) => e.copy()).toList();
|
||||
final List<GroupList> list = groupDataList.map((GroupList e) => e.copy()).toList();
|
||||
if (state.searchStr.value != '' && state.showSearch.value) {
|
||||
list.forEach((GroupList element) {
|
||||
element.lockList?.removeWhere((LockListInfoItemEntity element) =>
|
||||
!(element.lockAlias?.contains(state.searchStr.value) ?? true));
|
||||
element.lockList?.removeWhere((LockListInfoItemEntity element) => !(element.lockAlias?.contains(state.searchStr.value) ?? true));
|
||||
});
|
||||
}
|
||||
if (list.length > 0) {
|
||||
@ -46,8 +44,7 @@ class LockListLogic extends BaseGetXController {
|
||||
final lockList = element.lockList;
|
||||
if (lockList != null && lockList.length > 0) {
|
||||
lockList.forEach((element) {
|
||||
if (element.network?.peerId != null &&
|
||||
element.network?.peerId != '') {
|
||||
if (element.network?.peerId != null && element.network?.peerId != '') {
|
||||
StartChartManage().lockListPeerId.add(element);
|
||||
}
|
||||
});
|
||||
@ -68,8 +65,7 @@ class LockListLogic extends BaseGetXController {
|
||||
late StreamSubscription _setLockListInfoGroupEntity;
|
||||
|
||||
void _initReplySubscription() {
|
||||
_replySubscription =
|
||||
EventBusManager().eventBus!.on<Reply>().listen((Reply reply) async {
|
||||
_replySubscription = EventBusManager().eventBus!.on<Reply>().listen((Reply reply) async {
|
||||
// 恢复出厂设置
|
||||
if ((reply is FactoryDataResetReply)) {
|
||||
_replyFactoryDataResetKey(reply);
|
||||
@ -100,10 +96,8 @@ class LockListLogic extends BaseGetXController {
|
||||
userID: await Storage.getUid(),
|
||||
keyID: '1',
|
||||
needAuthor: 1,
|
||||
publicKey:
|
||||
state.lockListInfoItemEntity.bluetooth!.publicKey!.cast<int>(),
|
||||
privateKey:
|
||||
state.lockListInfoItemEntity.bluetooth!.privateKey!.cast<int>(),
|
||||
publicKey: state.lockListInfoItemEntity.bluetooth!.publicKey!.cast<int>(),
|
||||
privateKey: state.lockListInfoItemEntity.bluetooth!.privateKey!.cast<int>(),
|
||||
token: getTokenList);
|
||||
break;
|
||||
case 0x07:
|
||||
@ -145,8 +139,7 @@ class LockListLogic extends BaseGetXController {
|
||||
keyInfo.keyType == XSConstantMacro.keyTypeLong ||
|
||||
keyInfo.keyType == XSConstantMacro.keyTypeLoop) {
|
||||
// 当是正常使用跟待接收状态的时候
|
||||
if (keyInfo.keyStatus == XSConstantMacro.keyStatusNormalUse ||
|
||||
keyInfo.keyStatus == XSConstantMacro.keyStatusWaitReceive) {
|
||||
if (keyInfo.keyStatus == XSConstantMacro.keyStatusNormalUse || keyInfo.keyStatus == XSConstantMacro.keyStatusWaitReceive) {
|
||||
return "${"余".tr}${DateTool().compareTimeGetDaysFromNow(keyInfo.endDate!)}${"天".tr}";
|
||||
} else {
|
||||
return XSConstantMacro.getKeyStatusStr(keyInfo.keyStatus!);
|
||||
@ -159,11 +152,7 @@ class LockListLogic extends BaseGetXController {
|
||||
|
||||
//判断是否要显示提示
|
||||
bool getShowType(LockListInfoItemEntity keyInfo) {
|
||||
final List<int> keyTypes = <int>[
|
||||
XSConstantMacro.keyTypeTime,
|
||||
XSConstantMacro.keyTypeOnce,
|
||||
XSConstantMacro.keyTypeLoop
|
||||
];
|
||||
final List<int> keyTypes = <int>[XSConstantMacro.keyTypeTime, XSConstantMacro.keyTypeOnce, XSConstantMacro.keyTypeLoop];
|
||||
final List<int> keyStatus = <int>[
|
||||
XSConstantMacro.keyStatusWaitIneffective,
|
||||
XSConstantMacro.keyStatusFrozen,
|
||||
@ -171,18 +160,14 @@ class LockListLogic extends BaseGetXController {
|
||||
];
|
||||
|
||||
//新增以上组合未包含--永久&&冻结状态 显示
|
||||
final bool isLongFrozenStatus =
|
||||
keyInfo.keyType == XSConstantMacro.keyTypeLong &&
|
||||
keyInfo.keyStatus == XSConstantMacro.keyStatusFrozen;
|
||||
final DateTime endDate =
|
||||
DateTime.fromMillisecondsSinceEpoch(keyInfo.endDate ?? 0);
|
||||
final bool isLongFrozenStatus = keyInfo.keyType == XSConstantMacro.keyTypeLong && keyInfo.keyStatus == XSConstantMacro.keyStatusFrozen;
|
||||
final DateTime endDate = DateTime.fromMillisecondsSinceEpoch(keyInfo.endDate ?? 0);
|
||||
final DateTime now = DateTime.now();
|
||||
final bool isKeyType = keyTypes.contains(keyInfo.keyType);
|
||||
final bool isKeyStatus = keyStatus.contains(keyInfo.keyStatus);
|
||||
final Duration difference = endDate.difference(now);
|
||||
final bool isExpirationSoon = isKeyType && difference.inDays <= 15;
|
||||
final bool isShow =
|
||||
isKeyType && isKeyStatus || isExpirationSoon || isLongFrozenStatus;
|
||||
final bool isShow = isKeyType && isKeyStatus || isExpirationSoon || isLongFrozenStatus;
|
||||
return isShow;
|
||||
}
|
||||
|
||||
@ -194,13 +179,11 @@ class LockListLogic extends BaseGetXController {
|
||||
// 删除锁
|
||||
AppLog.log('调用了删除锁');
|
||||
showTipView.resetGetController();
|
||||
showTipView.showTFViewAlertDialog(
|
||||
state.passwordTF, '请输入登录密码'.tr, '请输入登录密码'.tr, checkLoginPassword);
|
||||
showTipView.showTFViewAlertDialog(state.passwordTF, '请输入登录密码'.tr, '请输入登录密码'.tr, checkLoginPassword);
|
||||
});
|
||||
} else if (state.lockListInfoItemEntity.keyRight == 1) {
|
||||
// 授权管理员弹框提示
|
||||
showTipView.showDeleteAdministratorIsHaveAllDataDialog(
|
||||
'同时删除其发送的所有钥匙,钥匙删除后不能恢复'.tr, (bool a) {
|
||||
showTipView.showDeleteAdministratorIsHaveAllDataDialog('同时删除其发送的所有钥匙,钥匙删除后不能恢复'.tr, (bool a) {
|
||||
// 授权管理员删除
|
||||
state.deleteAdministratorIsHaveAllData.value = a;
|
||||
deletKeyData();
|
||||
@ -240,8 +223,7 @@ class LockListLogic extends BaseGetXController {
|
||||
final LockListInfoEntity entity = await ApiRepository.to.deletOwnerKeyData(
|
||||
lockId: state.lockListInfoItemEntity.lockId.toString(),
|
||||
keyId: state.lockListInfoItemEntity.keyId.toString(),
|
||||
includeUnderlings:
|
||||
state.deleteAdministratorIsHaveAllData.value == true ? 1 : 0);
|
||||
includeUnderlings: state.deleteAdministratorIsHaveAllData.value == true ? 1 : 0);
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
BlueManage().connectDeviceMacAddress = '';
|
||||
SchedulerBinding.instance.addPostFrameCallback((_) {
|
||||
@ -259,42 +241,38 @@ class LockListLogic extends BaseGetXController {
|
||||
dismissEasyLoading();
|
||||
showDeletAlertTipDialog();
|
||||
});
|
||||
BlueManage().blueSendData(state.lockListInfoItemEntity.lockName!,
|
||||
(BluetoothConnectionState connectionState) async {
|
||||
BlueManage().blueSendData(state.lockListInfoItemEntity.lockName!, (BluetoothConnectionState connectionState) async {
|
||||
if (connectionState == BluetoothConnectionState.connected) {
|
||||
final List<int> publicKeyData =
|
||||
state.lockListInfoItemEntity.bluetooth!.publicKey!.cast<int>();
|
||||
final List<String> saveStrList =
|
||||
changeIntListToStringList(publicKeyData);
|
||||
final List<int> publicKeyData = state.lockListInfoItemEntity.bluetooth!.publicKey!.cast<int>();
|
||||
final List<String> saveStrList = changeIntListToStringList(publicKeyData);
|
||||
await Storage.setStringList(saveBluePublicKey, saveStrList);
|
||||
|
||||
// 私钥
|
||||
final List<int> privateKeyData =
|
||||
state.lockListInfoItemEntity.bluetooth!.privateKey!.cast<int>();
|
||||
final List<String> savePrivateKeyList =
|
||||
changeIntListToStringList(privateKeyData);
|
||||
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
|
||||
final List<int> privateKeyData = state.lockListInfoItemEntity.bluetooth!.privateKey!.cast<int>();
|
||||
final List<String> savePrivateKeyList = changeIntListToStringList(privateKeyData);
|
||||
await Storage.setStringList(saveBluePrivateKey, savePrivateKeyList);
|
||||
|
||||
// signKey
|
||||
final List<int> signKeyData =
|
||||
state.lockListInfoItemEntity.bluetooth!.signKey!.cast<int>();
|
||||
final List<String> saveSignKeyList =
|
||||
changeIntListToStringList(signKeyData);
|
||||
final List<int> signKeyData = state.lockListInfoItemEntity.bluetooth!.signKey!.cast<int>();
|
||||
final List<String> saveSignKeyList = changeIntListToStringList(signKeyData);
|
||||
await Storage.setStringList(saveBlueSignKey, saveSignKeyList);
|
||||
|
||||
final List<String> saveTokenList =
|
||||
changeIntListToStringList(<int>[0, 0, 0, 0]);
|
||||
final List<String> saveTokenList = changeIntListToStringList(<int>[0, 0, 0, 0]);
|
||||
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(
|
||||
lockID: BlueManage().connectDeviceName,
|
||||
userID: await Storage.getUid(),
|
||||
keyID: '1',
|
||||
needAuthor: 1,
|
||||
publicKey:
|
||||
state.lockListInfoItemEntity.bluetooth!.publicKey!.cast<int>(),
|
||||
privateKey:
|
||||
state.lockListInfoItemEntity.bluetooth!.privateKey!.cast<int>(),
|
||||
publicKey: publicKeyDataList,
|
||||
privateKey: getPrivateKeyList,
|
||||
token: <int>[0, 0, 0, 0]);
|
||||
} else if (connectionState == BluetoothConnectionState.disconnected) {
|
||||
dismissEasyLoading();
|
||||
@ -352,9 +330,7 @@ class LockListLogic extends BaseGetXController {
|
||||
}
|
||||
|
||||
void _initEventHandler() {
|
||||
_setLockListInfoGroupEntity = eventBus
|
||||
.on<SetLockListInfoGroupEntity>()
|
||||
.listen((SetLockListInfoGroupEntity event) async {
|
||||
_setLockListInfoGroupEntity = eventBus.on<SetLockListInfoGroupEntity>().listen((SetLockListInfoGroupEntity event) async {
|
||||
setLockListInfoGroupEntity(event.lockListInfoGroupEntity);
|
||||
});
|
||||
}
|
||||
|
||||
@ -14,8 +14,7 @@ import 'package:star_lock/talk/starChart/proto/talk_data_h264_frame.pb.dart';
|
||||
|
||||
// class UdpTalkDataHandler extends ScpMessageBaseHandle
|
||||
// implements ScpMessageHandler {
|
||||
class UdpTalkDataHandler extends ScpMessageBaseHandle
|
||||
implements ScpMessageHandler {
|
||||
class UdpTalkDataHandler extends ScpMessageBaseHandle implements ScpMessageHandler {
|
||||
// 单例实现
|
||||
static final UdpTalkDataHandler instance = UdpTalkDataHandler();
|
||||
|
||||
@ -37,7 +36,7 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
|
||||
|
||||
if (scpMessage.Payload != null) {
|
||||
final TalkData talkData = scpMessage.Payload;
|
||||
|
||||
AppLog.log('收到数据');
|
||||
_handleTalkData(
|
||||
talkData: talkData,
|
||||
scpMessage: scpMessage,
|
||||
@ -73,10 +72,7 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
|
||||
// _asyncLog(
|
||||
// '分包数据:messageId:$messageId [$spIndex/$spTotal] PayloadLength:$PayloadLength');
|
||||
if (messageType == MessageTypeConstant.RealTimeData) {
|
||||
if (spTotal != null &&
|
||||
spTotal > 1 &&
|
||||
messageId != null &&
|
||||
spIndex != null) {
|
||||
if (spTotal != null && spTotal > 1 && messageId != null && spIndex != null) {
|
||||
// 分包处理
|
||||
return handleFragmentedPayload(
|
||||
messageId: messageId,
|
||||
@ -129,13 +125,11 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
|
||||
talkDataH264Frame.mergeFromBuffer(talkData.content);
|
||||
// AppLog.log('处理H264帧: frameType=${talkDataH264Frame.frameType}, frameSeq=${talkDataH264Frame.frameSeq},MessageId:${scpMessage.MessageId}');
|
||||
frameHandler.handleFrame(talkDataH264Frame, talkData, scpMessage);
|
||||
|
||||
}
|
||||
|
||||
/// 处理图片数据
|
||||
void _handleVideoImage(TalkData talkData) async {
|
||||
final List<Uint8List> processCompletePayload =
|
||||
await _processCompletePayload(Uint8List.fromList(talkData.content));
|
||||
final List<Uint8List> processCompletePayload = await _processCompletePayload(Uint8List.fromList(talkData.content));
|
||||
processCompletePayload.forEach((element) {
|
||||
talkData.content = element;
|
||||
talkDataRepository.addTalkData(
|
||||
@ -177,8 +171,7 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
|
||||
startIdx = i;
|
||||
i++; // Skip the next byte
|
||||
} else if (nextByte == 0xD9 && startIdx != -1) {
|
||||
frames
|
||||
.add(Uint8List.view(payload.buffer, startIdx, i + 2 - startIdx));
|
||||
frames.add(Uint8List.view(payload.buffer, startIdx, i + 2 - startIdx));
|
||||
startIdx = -1;
|
||||
i++; // Skip the next byte
|
||||
}
|
||||
|
||||
@ -18,20 +18,18 @@ import 'package:star_lock/tools/push/xs_jPhush.dart';
|
||||
import 'package:star_lock/tools/storage.dart';
|
||||
import 'package:star_lock/translations/current_locale_tool.dart';
|
||||
|
||||
class UdpTalkRequestHandler extends ScpMessageBaseHandle
|
||||
implements ScpMessageHandler {
|
||||
RxString currentLanguage =
|
||||
CurrentLocaleTool.getCurrentLocaleString().obs; // 当前选择语言
|
||||
class UdpTalkRequestHandler extends ScpMessageBaseHandle implements ScpMessageHandler {
|
||||
RxString currentLanguage = CurrentLocaleTool.getCurrentLocaleString().obs; // 当前选择语言
|
||||
|
||||
@override
|
||||
void handleReq(ScpMessage scpMessage) async {
|
||||
// 判断是否登录账户
|
||||
final loginData = await Storage.getLoginData();
|
||||
// 如果登录账户不为空,且不是被动接听状态,且不是接听成功状态
|
||||
if (loginData != null &&
|
||||
(talkStatus.status != TalkStatus.passiveCallWaitingAnswer ||
|
||||
talkStatus.status != TalkStatus.answeredSuccessfully)) {
|
||||
if (loginData != null && (talkStatus.status != TalkStatus.passiveCallWaitingAnswer || talkStatus.status != TalkStatus.answeredSuccessfully)) {
|
||||
// 收到对讲请求
|
||||
AppLog.log('收到对讲请求ToPeerId:${scpMessage.ToPeerId}');
|
||||
AppLog.log('收到对讲请求FromPeerId:${scpMessage.FromPeerId}');
|
||||
final TalkReq talkReq = scpMessage.Payload;
|
||||
startChartManage.FromPeerId = scpMessage.ToPeerId!;
|
||||
startChartManage.ToPeerId = scpMessage.FromPeerId!;
|
||||
@ -97,8 +95,7 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
|
||||
}
|
||||
|
||||
// 收到来电请求时进行本地通知
|
||||
Future<void> _showTalkRequestNotification(
|
||||
{required String talkObjectName}) async {
|
||||
Future<void> _showTalkRequestNotification({required String talkObjectName}) async {
|
||||
if (Platform.isAndroid) {
|
||||
final Map<String, dynamic> message = {
|
||||
'platform': 'all',
|
||||
@ -167,14 +164,12 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
|
||||
void _handleRequestSendExpect({
|
||||
required String lockPeerID,
|
||||
}) async {
|
||||
final LockListInfoItemEntity currentKeyInfo =
|
||||
CommonDataManage().currentKeyInfo;
|
||||
final LockListInfoItemEntity currentKeyInfo = CommonDataManage().currentKeyInfo;
|
||||
|
||||
var isH264 = currentKeyInfo.lockFeature?.isH264 == 1;
|
||||
var isMJpeg = currentKeyInfo.lockFeature?.isMJpeg == 1;
|
||||
|
||||
final LockListInfoGroupEntity? lockListInfoGroupEntity =
|
||||
await Storage.getLockMainListData();
|
||||
final LockListInfoGroupEntity? lockListInfoGroupEntity = await Storage.getLockMainListData();
|
||||
if (lockListInfoGroupEntity != null) {
|
||||
lockListInfoGroupEntity!.groupList?.forEach((element) {
|
||||
final lockList = element.lockList;
|
||||
@ -195,18 +190,15 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
|
||||
if (isH264) {
|
||||
// 锁支持H264,发送H264视频和G711音频期望
|
||||
startChartManage.sendOnlyH264VideoTalkExpectData();
|
||||
print(
|
||||
'app收到的对讲请求后,发送的预期数据=========锁支持H264,发送H264视频格式期望数据,peerID=${lockPeerID}');
|
||||
print('app收到的对讲请求后,发送的预期数据=========锁支持H264,发送H264视频格式期望数据,peerID=${lockPeerID}');
|
||||
} else if (isMJpeg) {
|
||||
// 锁只支持MJPEG,发送图像视频和G711音频期望
|
||||
startChartManage.sendOnlyImageVideoTalkExpectData();
|
||||
print(
|
||||
'app收到的对讲请求后,发送的预期数据=========锁不支持H264,支持MJPEG,发送MJPEG视频格式期望数据,peerID=${lockPeerID}');
|
||||
print('app收到的对讲请求后,发送的预期数据=========锁不支持H264,支持MJPEG,发送MJPEG视频格式期望数据,peerID=${lockPeerID}');
|
||||
} else {
|
||||
// 默认使用图像视频
|
||||
startChartManage.sendOnlyImageVideoTalkExpectData();
|
||||
print(
|
||||
'app收到的对讲请求后,发送的预期数据=========锁不支持H264和MJPEG,默认发送MJPEG视频格式期望数据,peerID=${lockPeerID}');
|
||||
print('app收到的对讲请求后,发送的预期数据=========锁不支持H264和MJPEG,默认发送MJPEG视频格式期望数据,peerID=${lockPeerID}');
|
||||
}
|
||||
}
|
||||
|
||||
@ -214,14 +206,12 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
|
||||
void _handleResponseSendExpect({
|
||||
required String lockPeerID,
|
||||
}) async {
|
||||
final LockListInfoItemEntity currentKeyInfo =
|
||||
CommonDataManage().currentKeyInfo;
|
||||
final LockListInfoItemEntity currentKeyInfo = CommonDataManage().currentKeyInfo;
|
||||
|
||||
var isH264 = currentKeyInfo.lockFeature?.isH264 == 1;
|
||||
var isMJpeg = currentKeyInfo.lockFeature?.isMJpeg == 1;
|
||||
|
||||
final LockListInfoGroupEntity? lockListInfoGroupEntity =
|
||||
await Storage.getLockMainListData();
|
||||
final LockListInfoGroupEntity? lockListInfoGroupEntity = await Storage.getLockMainListData();
|
||||
if (lockListInfoGroupEntity != null) {
|
||||
lockListInfoGroupEntity!.groupList?.forEach((element) {
|
||||
final lockList = element.lockList;
|
||||
@ -242,18 +232,15 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
|
||||
if (isH264) {
|
||||
// 锁支持H264,发送H264视频和G711音频期望
|
||||
startChartManage.sendH264VideoAndG711AudioTalkExpectData();
|
||||
AppLog.log(
|
||||
'app主动发对讲请求,收到回复后发送的预期数据=======锁支持H264,发送H264视频格式期望数据,peerID=${lockPeerID}');
|
||||
AppLog.log('app主动发对讲请求,收到回复后发送的预期数据=======锁支持H264,发送H264视频格式期望数据,peerID=${lockPeerID}');
|
||||
} else if (isMJpeg) {
|
||||
// 锁只支持MJPEG,发送图像视频和G711音频期望
|
||||
startChartManage.sendImageVideoAndG711AudioTalkExpectData();
|
||||
AppLog.log(
|
||||
'app主动发对讲请求,收到回复后发送的预期数据=======锁不支持H264,支持MJPEG,发送MJPEG视频格式期望数据,peerID=${lockPeerID}');
|
||||
AppLog.log('app主动发对讲请求,收到回复后发送的预期数据=======锁不支持H264,支持MJPEG,发送MJPEG视频格式期望数据,peerID=${lockPeerID}');
|
||||
} else {
|
||||
// 默认使用图像视频
|
||||
startChartManage.sendImageVideoAndG711AudioTalkExpectData();
|
||||
AppLog.log(
|
||||
'app主动发对讲请求,收到回复后发送的预期数据=======锁不支持H264和MJPEG,默认发送MJPEG视频格式期望数据,peerID=${lockPeerID}');
|
||||
AppLog.log('app主动发对讲请求,收到回复后发送的预期数据=======锁不支持H264和MJPEG,默认发送MJPEG视频格式期望数据,peerID=${lockPeerID}');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -61,12 +61,9 @@ class StartChartManage {
|
||||
|
||||
// 单例对象
|
||||
static final StartChartManage _instance = StartChartManage._internal();
|
||||
final TalkeRequestOverTimeTimerManager talkeRequestOverTimeTimerManager =
|
||||
TalkeRequestOverTimeTimerManager();
|
||||
final TalkePingOverTimeTimerManager talkePingOverTimeTimerManager =
|
||||
TalkePingOverTimeTimerManager();
|
||||
final TalkDataOverTimeTimerManager talkDataOverTimeTimerManager =
|
||||
TalkDataOverTimeTimerManager();
|
||||
final TalkeRequestOverTimeTimerManager talkeRequestOverTimeTimerManager = TalkeRequestOverTimeTimerManager();
|
||||
final TalkePingOverTimeTimerManager talkePingOverTimeTimerManager = TalkePingOverTimeTimerManager();
|
||||
final TalkDataOverTimeTimerManager talkDataOverTimeTimerManager = TalkDataOverTimeTimerManager();
|
||||
|
||||
// 工厂构造函数,返回单例对象
|
||||
factory StartChartManage() {
|
||||
@ -171,8 +168,7 @@ class StartChartManage {
|
||||
FromPeerId = loginData?.starchart?.starchartId ?? '';
|
||||
} else {
|
||||
_log(text: '开始注册客户端');
|
||||
final StarChartRegisterNodeEntity requestStarChartRegisterNode =
|
||||
await _requestStarChartRegisterNode();
|
||||
final StarChartRegisterNodeEntity requestStarChartRegisterNode = await _requestStarChartRegisterNode();
|
||||
await _saveStarChartRegisterNodeToStorage(requestStarChartRegisterNode);
|
||||
FromPeerId = requestStarChartRegisterNode.peer!.id ?? '';
|
||||
bindUserStarchart(requestStarChartRegisterNode);
|
||||
@ -180,18 +176,14 @@ class StartChartManage {
|
||||
}
|
||||
|
||||
//绑定星图配置
|
||||
Future<void> bindUserStarchart(
|
||||
StarChartRegisterNodeEntity requestStarChartRegisterNode) async {
|
||||
Future<void> bindUserStarchart(StarChartRegisterNodeEntity requestStarChartRegisterNode) async {
|
||||
try {
|
||||
final LoginEntity entity = await ApiRepository.to.bindUserStarchart(
|
||||
starchartId: requestStarChartRegisterNode.peer?.id ?? '',
|
||||
starchartPeerPublicKey:
|
||||
requestStarChartRegisterNode.peer?.publicKey ?? '',
|
||||
starchartPeerPrivateKey:
|
||||
requestStarChartRegisterNode.peer?.privateKey ?? '',
|
||||
starchartPeerPublicKey: requestStarChartRegisterNode.peer?.publicKey ?? '',
|
||||
starchartPeerPrivateKey: requestStarChartRegisterNode.peer?.privateKey ?? '',
|
||||
);
|
||||
requestStarChartRegisterNode.peer?.id =
|
||||
entity.data?.starchart?.starchartId;
|
||||
requestStarChartRegisterNode.peer?.id = entity.data?.starchart?.starchartId;
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
AppLog.log('绑定成功');
|
||||
} else {
|
||||
@ -204,14 +196,12 @@ class StartChartManage {
|
||||
|
||||
// 中继查询
|
||||
Future<void> _relayQuery() async {
|
||||
final RelayInfoEntity relayInfoEntity =
|
||||
await StartChartApi.to.relayQueryInfo();
|
||||
final RelayInfoEntity relayInfoEntity = await StartChartApi.to.relayQueryInfo();
|
||||
_saveRelayInfoEntityToStorage(relayInfoEntity);
|
||||
if (relayInfoEntity.client_addr != null) {
|
||||
localPublicHost = relayInfoEntity.client_addr!;
|
||||
}
|
||||
if (relayInfoEntity.relay_list != null &&
|
||||
relayInfoEntity.relay_list!.length > 0) {
|
||||
if (relayInfoEntity.relay_list != null && relayInfoEntity.relay_list!.length > 0) {
|
||||
for (int i = 0; i <= relayInfoEntity.relay_list!.length; i++) {
|
||||
final data = relayInfoEntity.relay_list?[i];
|
||||
if (data?.peerID != FromPeerId) {
|
||||
@ -239,8 +229,7 @@ class StartChartManage {
|
||||
// 初始化udp
|
||||
Future<void> _onlineRelayService() async {
|
||||
var addressIListenFrom = InternetAddress.anyIPv4;
|
||||
await RawDatagramSocket.bind(addressIListenFrom, localPort)
|
||||
.then((RawDatagramSocket socket) {
|
||||
await RawDatagramSocket.bind(addressIListenFrom, localPort).then((RawDatagramSocket socket) {
|
||||
// 设置接收缓冲区大小 (SO_RCVBUF = 8)
|
||||
if (AppPlatform.isAndroid) {
|
||||
socket.setRawOption(
|
||||
@ -291,15 +280,13 @@ class StartChartManage {
|
||||
}
|
||||
|
||||
// 发送RbcuInfo 地址交换消息
|
||||
void _sendRbcuInfoMessage(
|
||||
{required String ToPeerId, bool isResp = false}) async {
|
||||
void _sendRbcuInfoMessage({required String ToPeerId, bool isResp = false}) async {
|
||||
final uuid = _uuid.v1();
|
||||
final int timestamp = DateTime.now().millisecondsSinceEpoch;
|
||||
final Int64 int64Timestamp = Int64(timestamp); // 使用构造函数
|
||||
|
||||
// 获取本机所有ip地址和中继返回的外网地址
|
||||
final List<ListenAddrData> listenAddrDataList =
|
||||
await _makeListenAddrDataList();
|
||||
final List<ListenAddrData> listenAddrDataList = await _makeListenAddrDataList();
|
||||
listenAddrDataList.insert(
|
||||
0, // 插入到头部
|
||||
ListenAddrData(
|
||||
@ -309,15 +296,13 @@ class StartChartManage {
|
||||
);
|
||||
|
||||
final address = listenAddrDataList
|
||||
.where((element) =>
|
||||
element.type == ListenAddrTypeConstant.local) // 过滤出本地地址
|
||||
.where((element) => element.type == ListenAddrTypeConstant.local) // 过滤出本地地址
|
||||
.map((e) => e.address) // 转换为 List<String?>
|
||||
.where((addr) => addr != null) // 过滤掉 null 值
|
||||
.map(
|
||||
(addr) => addr!.replaceAll(IpConstant.udpUrl, ''),
|
||||
) // 去除 "udp://" 前缀
|
||||
.cast<
|
||||
String>(); // 转换为 Iterable<String>// 将 Iterable<String?> 转换为 Iterable<String>
|
||||
.cast<String>(); // 转换为 Iterable<String>// 将 Iterable<String?> 转换为 Iterable<String>
|
||||
_rbcuSessionId = uuid;
|
||||
final RbcuInfo rbcuInfo = RbcuInfo(
|
||||
sessionId: uuid,
|
||||
@ -340,28 +325,21 @@ class StartChartManage {
|
||||
void _sendRbcuProbeMessage() async {
|
||||
// 随机字符串数据
|
||||
String generateRandomString(int length) {
|
||||
const chars =
|
||||
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
|
||||
const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
|
||||
final random = Random();
|
||||
return String.fromCharCodes(
|
||||
List.generate(
|
||||
length, (index) => chars.codeUnitAt(random.nextInt(chars.length))),
|
||||
List.generate(length, (index) => chars.codeUnitAt(random.nextInt(chars.length))),
|
||||
);
|
||||
}
|
||||
|
||||
if (rbcuInfo != null &&
|
||||
rbcuInfo!.address != null &&
|
||||
rbcuInfo!.address.length > 0) {
|
||||
if (rbcuInfo != null && rbcuInfo!.address != null && rbcuInfo!.address.length > 0) {
|
||||
rbcuInfo!.address.forEach((element) {
|
||||
// 拆分 element 字符串
|
||||
final parts = element.split(':');
|
||||
final host = parts[0]; // IP 地址
|
||||
final port = int.tryParse(parts[1]) ?? 0; // 端口号,如果解析失败则默认为 0
|
||||
|
||||
final RbcuProbe rbcuProbe = RbcuProbe(
|
||||
sessionId: _rbcuSessionId,
|
||||
data: generateRandomString(100),
|
||||
targetAddress: element);
|
||||
final RbcuProbe rbcuProbe = RbcuProbe(sessionId: _rbcuSessionId, data: generateRandomString(100), targetAddress: element);
|
||||
final rbcuProBeBuffer = rbcuProbe.writeToBuffer();
|
||||
_sendNatMessage(message: rbcuProBeBuffer, host: host, port: port);
|
||||
});
|
||||
@ -378,8 +356,7 @@ class StartChartManage {
|
||||
// 启动定时任务
|
||||
void startSendingRbcuInfoMessages({required String ToPeerId}) {
|
||||
// 每隔 1 秒执行一次 _sendRbcuInfoMessage
|
||||
rbcuInfoTimer ??=
|
||||
Timer.periodic(Duration(seconds: _defaultIntervalTime), (timer) {
|
||||
rbcuInfoTimer ??= Timer.periodic(Duration(seconds: _defaultIntervalTime), (timer) {
|
||||
// 发送RbcuInfo 地址交换消息
|
||||
_log(text: '发送RbcuInfo 地址交换消息');
|
||||
_sendRbcuInfoMessage(ToPeerId: ToPeerId);
|
||||
@ -389,8 +366,7 @@ class StartChartManage {
|
||||
// 发送打洞包
|
||||
void startSendingRbcuProbeTMessages() {
|
||||
// 每隔 1 秒执行一次 _sendRbcuInfoMessage
|
||||
rbcuProbeTimer ??=
|
||||
Timer.periodic(Duration(seconds: _defaultIntervalTime), (timer) {
|
||||
rbcuProbeTimer ??= Timer.periodic(Duration(seconds: _defaultIntervalTime), (timer) {
|
||||
// 发送RbcuProbe
|
||||
_sendRbcuProbeMessage();
|
||||
});
|
||||
@ -398,8 +374,7 @@ class StartChartManage {
|
||||
|
||||
// 发送打洞确认包
|
||||
void startSendingRbcuConfirmTMessages() {
|
||||
rbcuConfirmTimer ??=
|
||||
Timer.periodic(Duration(seconds: _defaultIntervalTime), (timer) {
|
||||
rbcuConfirmTimer ??= Timer.periodic(Duration(seconds: _defaultIntervalTime), (timer) {
|
||||
// 发送RbcuProbe
|
||||
_sendRbcuConfirmMessage();
|
||||
});
|
||||
@ -458,11 +433,11 @@ class StartChartManage {
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
final LockListInfoItemEntity currentKeyInfo =
|
||||
CommonDataManage().currentKeyInfo;
|
||||
final LockListInfoItemEntity currentKeyInfo = CommonDataManage().currentKeyInfo;
|
||||
final isH264 = currentKeyInfo.lockFeature?.isH264 == 1;
|
||||
final isMJpeg = currentKeyInfo.lockFeature?.isMJpeg == 1;
|
||||
|
||||
AppLog.log('isH264:${isH264}');
|
||||
AppLog.log('isMJpeg:${isMJpeg}');
|
||||
// 优先使用H264,其次是MJPEG
|
||||
if (isH264) {
|
||||
Get.toNamed(
|
||||
@ -483,6 +458,7 @@ class StartChartManage {
|
||||
seconds: _defaultIntervalTime,
|
||||
),
|
||||
(Timer timer) async {
|
||||
AppLog.log('发送对讲请求:${ToPeerId}');
|
||||
await sendCallRequestMessage(ToPeerId: ToPeerId);
|
||||
},
|
||||
);
|
||||
@ -526,8 +502,7 @@ class StartChartManage {
|
||||
List<int> packetTalkData = payload.sublist(start, end);
|
||||
|
||||
// 分包数据不递增messageID
|
||||
final messageId =
|
||||
MessageCommand.getNextMessageId(toPeerId, increment: false);
|
||||
final messageId = MessageCommand.getNextMessageId(toPeerId, increment: false);
|
||||
// 组装分包数据
|
||||
final message = MessageCommand.talkDataMessage(
|
||||
ToPeerId: toPeerId,
|
||||
@ -562,8 +537,7 @@ class StartChartManage {
|
||||
final List<int> message = MessageCommand.heartbeatMessage(
|
||||
FromPeerId: FromPeerId,
|
||||
ToPeerId: relayPeerId,
|
||||
MessageId:
|
||||
MessageCommand.getNextMessageId(relayPeerId, increment: true),
|
||||
MessageId: MessageCommand.getNextMessageId(relayPeerId, increment: true),
|
||||
);
|
||||
await _sendMessage(message: message);
|
||||
},
|
||||
@ -572,8 +546,7 @@ class StartChartManage {
|
||||
}
|
||||
|
||||
// 发送回声测试消息
|
||||
void sendEchoMessage(
|
||||
{required List<int> payload, required String toPeerId}) async {
|
||||
void sendEchoMessage({required List<int> payload, required String toPeerId}) async {
|
||||
// 计算需要分多少个包发送
|
||||
final int totalPackets = (payload.length / _maxPayloadSize).ceil();
|
||||
// 循环遍历
|
||||
@ -587,8 +560,7 @@ class StartChartManage {
|
||||
List<int> packet = payload.sublist(start, end);
|
||||
|
||||
// 分包数据不递增messageID
|
||||
final messageId =
|
||||
MessageCommand.getNextMessageId(toPeerId, increment: false);
|
||||
final messageId = MessageCommand.getNextMessageId(toPeerId, increment: false);
|
||||
// 组装分包数据
|
||||
final message = MessageCommand.echoMessage(
|
||||
ToPeerId: toPeerId,
|
||||
@ -606,8 +578,7 @@ class StartChartManage {
|
||||
}
|
||||
|
||||
// 发送网关初始化消息
|
||||
void sendGatewayResetMessage(
|
||||
{required String ToPeerId, required int gatewayId}) async {
|
||||
void sendGatewayResetMessage({required String ToPeerId, required int gatewayId}) async {
|
||||
final message = MessageCommand.gatewayResetMessage(
|
||||
ToPeerId: ToPeerId,
|
||||
FromPeerId: FromPeerId,
|
||||
@ -728,8 +699,7 @@ class StartChartManage {
|
||||
}
|
||||
|
||||
// 发送通话保持消息
|
||||
Future<void> sendTalkPingMessage(
|
||||
{required String ToPeerId, required String FromPeerId}) async {
|
||||
Future<void> sendTalkPingMessage({required String ToPeerId, required String FromPeerId}) async {
|
||||
final message = MessageCommand.talkPingMessage(
|
||||
ToPeerId: ToPeerId,
|
||||
FromPeerId: FromPeerId,
|
||||
@ -825,11 +795,9 @@ class StartChartManage {
|
||||
|
||||
// 发送消息
|
||||
Future<void> _sendMessage({required List<int> message}) async {
|
||||
var result = await _udpSocket?.send(
|
||||
message, InternetAddress(remoteHost), remotePort);
|
||||
var result = await _udpSocket?.send(message, InternetAddress(remoteHost), remotePort);
|
||||
if (result != message.length) {
|
||||
throw StartChartMessageException(
|
||||
'❌Udp send data error----> $result ${message.length}');
|
||||
throw StartChartMessageException('❌Udp send data error----> $result ${message.length}');
|
||||
// _udpSocket = null;
|
||||
}
|
||||
|
||||
@ -846,15 +814,11 @@ class StartChartManage {
|
||||
}
|
||||
|
||||
// 发送消息
|
||||
Future<void> _sendNatMessage(
|
||||
{required List<int> message,
|
||||
required String host,
|
||||
required int port}) async {
|
||||
Future<void> _sendNatMessage({required List<int> message, required String host, required int port}) async {
|
||||
_log(text: '发送nat消息');
|
||||
var result = await _udpSocket?.send(message, InternetAddress(host), port);
|
||||
if (result != message.length) {
|
||||
throw StartChartMessageException(
|
||||
'❌Udp send data error----> $result ${message.length}');
|
||||
throw StartChartMessageException('❌Udp send data error----> $result ${message.length}');
|
||||
// _udpSocket = null;
|
||||
}
|
||||
}
|
||||
@ -864,8 +828,7 @@ class StartChartManage {
|
||||
// 获取设备信息
|
||||
final Map<String, String> deviceInfo = await _getDeviceInfo();
|
||||
// 发送注册节点请求
|
||||
final StarChartRegisterNodeEntity response =
|
||||
await StartChartApi.to.starChartRegisterNode(
|
||||
final StarChartRegisterNodeEntity response = await StartChartApi.to.starChartRegisterNode(
|
||||
product: _productName,
|
||||
model: '${deviceInfo['brand']}_${deviceInfo['model']}',
|
||||
name: '${deviceInfo['id']}',
|
||||
@ -875,8 +838,7 @@ class StartChartManage {
|
||||
}
|
||||
|
||||
// 保存星图注册节点信息至缓存
|
||||
Future<void> _saveStarChartRegisterNodeToStorage(
|
||||
StarChartRegisterNodeEntity starChartRegisterNodeEntity) async {
|
||||
Future<void> _saveStarChartRegisterNodeToStorage(StarChartRegisterNodeEntity starChartRegisterNodeEntity) async {
|
||||
if (starChartRegisterNodeEntity != null) {
|
||||
await Storage.saveStarChartRegisterNodeInfo(starChartRegisterNodeEntity);
|
||||
final LoginData? loginData = await Storage.getLoginData();
|
||||
@ -886,8 +848,7 @@ class StartChartManage {
|
||||
}
|
||||
|
||||
// 保存星图中继服务器信息至缓存
|
||||
Future<void> _saveRelayInfoEntityToStorage(
|
||||
RelayInfoEntity relayInfoEntity) async {
|
||||
Future<void> _saveRelayInfoEntityToStorage(RelayInfoEntity relayInfoEntity) async {
|
||||
if (relayInfoEntity != null) {
|
||||
await Storage.saveRelayInfo(relayInfoEntity);
|
||||
}
|
||||
@ -909,8 +870,7 @@ class StartChartManage {
|
||||
);
|
||||
|
||||
// 获取本机所有ip地址和中继返回的外网地址
|
||||
final List<ListenAddrData> listenAddrDataList =
|
||||
await _makeListenAddrDataList();
|
||||
final List<ListenAddrData> listenAddrDataList = await _makeListenAddrDataList();
|
||||
|
||||
//
|
||||
final RelayServiceData relayServiceData = RelayServiceData(
|
||||
@ -980,8 +940,7 @@ class StartChartManage {
|
||||
ipAddress = ipAddress.split('%').first;
|
||||
}
|
||||
// 确保 IP 地址不为空且不在排除列表中
|
||||
if (ipAddress.isNotEmpty &&
|
||||
!IpConstant.reportExcludeIp.contains(ipAddress)) {
|
||||
if (ipAddress.isNotEmpty && !IpConstant.reportExcludeIp.contains(ipAddress)) {
|
||||
ipAddresses.add(ipAddress);
|
||||
}
|
||||
}
|
||||
@ -998,8 +957,7 @@ class StartChartManage {
|
||||
|
||||
/// 获取设备信息
|
||||
Future<Map<String, String>> _getDeviceInfo() async {
|
||||
final Map<String, String> deviceInfo =
|
||||
await DeviceInfoUtils.getDeviceInfo();
|
||||
final Map<String, String> deviceInfo = await DeviceInfoUtils.getDeviceInfo();
|
||||
return deviceInfo;
|
||||
}
|
||||
|
||||
@ -1016,8 +974,7 @@ class StartChartManage {
|
||||
if (host != null && port != null) {
|
||||
try {
|
||||
// 尝试进行 DNS 解析
|
||||
final List<InternetAddress> addresses =
|
||||
await InternetAddress.lookup(host);
|
||||
final List<InternetAddress> addresses = await InternetAddress.lookup(host);
|
||||
if (addresses.isEmpty) {
|
||||
throw FormatException('DNS resolution failed for $host');
|
||||
}
|
||||
@ -1082,8 +1039,7 @@ class StartChartManage {
|
||||
final int payloadType = scpMessage.PayloadType ?? 0;
|
||||
final int messageType = scpMessage.MessageType ?? 0;
|
||||
try {
|
||||
final ScpMessageHandler handler =
|
||||
ScpMessageHandlerFactory.createHandler(payloadType);
|
||||
final ScpMessageHandler handler = ScpMessageHandlerFactory.createHandler(payloadType);
|
||||
if (messageType == MessageTypeConstant.Req) {
|
||||
handler.handleReq(scpMessage);
|
||||
} else if (messageType == MessageTypeConstant.Resp) {
|
||||
@ -1170,8 +1126,7 @@ class StartChartManage {
|
||||
}
|
||||
|
||||
/// 修改预期接收到的数据
|
||||
void changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer(
|
||||
{required TalkExpectReq talkExpect}) {
|
||||
void changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer({required TalkExpectReq talkExpect}) {
|
||||
_defaultTalkExpect = talkExpect;
|
||||
reStartTalkExpectMessageTimer();
|
||||
}
|
||||
@ -1190,8 +1145,7 @@ class StartChartManage {
|
||||
videoType: [VideoTypeE.IMAGE],
|
||||
audioType: [],
|
||||
);
|
||||
changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer(
|
||||
talkExpect: talkExpectReq);
|
||||
changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer(talkExpect: talkExpectReq);
|
||||
}
|
||||
|
||||
/// 修改预期接收到的数据
|
||||
@ -1200,20 +1154,17 @@ class StartChartManage {
|
||||
videoType: [VideoTypeE.H264],
|
||||
audioType: [],
|
||||
);
|
||||
changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer(
|
||||
talkExpect: talkExpectReq);
|
||||
changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer(talkExpect: talkExpectReq);
|
||||
}
|
||||
|
||||
/// 修改预期接收到的数据
|
||||
void sendImageVideoAndG711AudioTalkExpectData() {
|
||||
changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer(
|
||||
talkExpect: TalkConstant.ImageExpect);
|
||||
changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer(talkExpect: TalkConstant.ImageExpect);
|
||||
}
|
||||
|
||||
/// 修改预期接收到的数据
|
||||
void sendH264VideoAndG711AudioTalkExpectData() {
|
||||
changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer(
|
||||
talkExpect: TalkConstant.H264Expect);
|
||||
changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer(talkExpect: TalkConstant.H264Expect);
|
||||
}
|
||||
|
||||
/// 发送远程开锁
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user