fix: 增加日志
This commit is contained in:
parent
f73943785f
commit
a4892633a3
@ -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);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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) {
|
||||||
// 锁支持H264,发送H264视频和G711音频期望
|
// 锁支持H264,发送H264视频和G711音频期望
|
||||||
startChartManage.sendOnlyH264VideoTalkExpectData();
|
startChartManage.sendOnlyH264VideoTalkExpectData();
|
||||||
print(
|
print('app收到的对讲请求后,发送的预期数据=========锁支持H264,发送H264视频格式期望数据,peerID=${lockPeerID}');
|
||||||
'app收到的对讲请求后,发送的预期数据=========锁支持H264,发送H264视频格式期望数据,peerID=${lockPeerID}');
|
|
||||||
} else if (isMJpeg) {
|
} else if (isMJpeg) {
|
||||||
// 锁只支持MJPEG,发送图像视频和G711音频期望
|
// 锁只支持MJPEG,发送图像视频和G711音频期望
|
||||||
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) {
|
||||||
// 锁支持H264,发送H264视频和G711音频期望
|
// 锁支持H264,发送H264视频和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) {
|
||||||
// 锁只支持MJPEG,发送图像视频和G711音频期望
|
// 锁只支持MJPEG,发送图像视频和G711音频期望
|
||||||
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}');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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}');
|
||||||
// 优先使用H264,其次是MJPEG
|
// 优先使用H264,其次是MJPEG
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 发送远程开锁
|
/// 发送远程开锁
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user