Merge branch 'develop_liyi' of http://code.star-lock.cn/StarlockTeam/app-starlock into develop_liyi

# Conflicts:
#	lib/login/login/starLock_login_page.dart
This commit is contained in:
“DaisyWu” 2024-12-12 10:32:59 +08:00
commit 6cda1953ba
24 changed files with 2885 additions and 88 deletions

BIN
assets/demo.h264 Normal file

Binary file not shown.

2684
assets/html/h264.html Normal file

File diff suppressed because it is too large Load Diff

BIN
assets/talk.h264 Normal file

Binary file not shown.

View File

@ -2,6 +2,7 @@ import 'package:get/get.dart';
import 'package:star_lock/common/safetyVerification/safetyVerification_binding.dart'; import 'package:star_lock/common/safetyVerification/safetyVerification_binding.dart';
import 'package:star_lock/flavors.dart'; import 'package:star_lock/flavors.dart';
import 'package:star_lock/login/forgetPassword/starLock_forgetPassword_xhj_page.dart'; import 'package:star_lock/login/forgetPassword/starLock_forgetPassword_xhj_page.dart';
import 'package:star_lock/login/login/JMuxerApp.dart';
import 'package:star_lock/login/login/starLock_login_xhj_page.dart'; import 'package:star_lock/login/login/starLock_login_xhj_page.dart';
import 'package:star_lock/login/register/starLock_register_binding.dart'; import 'package:star_lock/login/register/starLock_register_binding.dart';
import 'package:star_lock/login/register/starLock_register_xhj_page.dart'; import 'package:star_lock/login/register/starLock_register_xhj_page.dart';
@ -397,6 +398,7 @@ abstract class Routers {
static const String ownedKeyListPage = '/ownedKeyListPage'; // static const String ownedKeyListPage = '/ownedKeyListPage'; //
static const String starLockLoginPage = '/StarLockLoginPage'; // static const String starLockLoginPage = '/StarLockLoginPage'; //
static const String LocalHtmlPage = '/LocalHtmlPage'; // LocalHtmlPage
static const String starLockRegisterPage = '/StarLockRegisterPage'; // static const String starLockRegisterPage = '/StarLockRegisterPage'; //
static const String starLockForgetPasswordPage = static const String starLockForgetPasswordPage =
'/StarLockForgetPasswordPage'; // '/StarLockForgetPasswordPage'; //
@ -638,6 +640,9 @@ abstract class AppRouters {
page: () => F.sw( page: () => F.sw(
skyCall: () => const StarLockLoginPage(), skyCall: () => const StarLockLoginPage(),
xhjCall: () => const StarLockLoginXHJPage()), xhjCall: () => const StarLockLoginXHJPage()),
),GetPage<dynamic>(
name: Routers.LocalHtmlPage,
page: () => LocalHtmlPage(),
), ),
GetPage<dynamic>( GetPage<dynamic>(
name: Routers.starLockRegisterPage, name: Routers.starLockRegisterPage,

View File

@ -0,0 +1,137 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show ByteData, Uint8List, rootBundle;
import 'package:webview_flutter/webview_flutter.dart';
class LocalHtmlPage extends StatefulWidget {
@override
_LocalHtmlPageState createState() => _LocalHtmlPageState();
}
class _LocalHtmlPageState extends State<LocalHtmlPage> {
late final WebViewController _controller;
@override
void initState() {
super.initState();
_controller = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted)
..enableZoom(false)
..addJavaScriptChannel(
'Flutter',
onMessageReceived: (message) {
print("来自 HTML 的消息: ${message.message}");
},
);
// HTML
_loadLocalHtml();
_sendFramesToHtml();
}
void _sendFramesToHtml() async {
// assets/demo.h264
final ByteData data = await rootBundle.load('assets/talk.h264');
final List<int> byteData = data.buffer.asUint8List();
int offset = 0;
int frameSize = 0;
// H.264
while (offset < byteData.length) {
//
frameSize = getFrameSize(byteData, offset);
if (frameSize == 0) {
print("No more frames or error in frame size calculation.");
break; // 退
}
//
List<int> frameData = byteData.sublist(offset, offset + frameSize);
// WebView feedDataFromFlutter
String jsCode = "feedDataFromFlutter(${frameData});";
await _controller.runJavaScript(jsCode);
//
offset += frameSize;
// 22
await Future.delayed(Duration(milliseconds: (1000 / 22).toInt()));
}
}
int getFrameSize(List<int> data, int offset) {
// Start Code (0x000001 0x00000001)
const List<int> startCode1 = [0, 0, 0, 1]; // Start Code: 0x000001
const List<int> startCode2 = [
0,
0,
1
]; // Start Code: 0x000001 (0x00000001 version)
// Start Code
int startCodeStart = -1;
int startCodeEnd = -1;
for (int i = offset; i < data.length - 3; i++) {
// Start Code (0x000001 0x00000001)
if (_matchesStartCode(data, i, startCode1)) {
startCodeStart = i;
startCodeEnd = i + startCode1.length;
break;
} else if (_matchesStartCode(data, i, startCode2)) {
startCodeStart = i;
startCodeEnd = i + startCode2.length;
break;
}
}
// Start Code 0
if (startCodeStart == -1) return 0;
// Start Code
int nextStartCodeStart = -1;
for (int i = startCodeEnd; i < data.length - 3; i++) {
if (_matchesStartCode(data, i, startCode1) ||
_matchesStartCode(data, i, startCode2)) {
nextStartCodeStart = i;
break;
}
}
// Start Code NAL
if (nextStartCodeStart == -1) {
return data.length - startCodeStart;
}
// NAL
return nextStartCodeStart - startCodeStart;
}
// Start Code
bool _matchesStartCode(List<int> data, int index, List<int> startCode) {
for (int i = 0; i < startCode.length; i++) {
if (data[index + i] != startCode[i]) {
return false;
}
}
return true;
}
Future<void> _loadLocalHtml() async {
final String fileHtmlContent =
await rootBundle.loadString('assets/html/h264.html');
_controller.loadHtmlString(fileHtmlContent);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("加载本地 HTML"),
),
body: WebViewWidget(controller: _controller),
);
}
}

View File

@ -250,6 +250,13 @@ class _StarLockLoginPageState extends State<StarLockLoginPage> {
// ); // );
// }, // },
// ), // ),
SubmitBtn(
btnName: '跳转至html',
onClick: () {
Get.toNamed(Routers.LocalHtmlPage);
},
),
SizedBox(height: 50.w), SizedBox(height: 50.w),
Row( Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,

View File

@ -10,9 +10,8 @@ import 'package:star_lock/talk/startChart/proto/generic.pb.dart';
import '../../start_chart_manage.dart'; import '../../start_chart_manage.dart';
class UdpBlePassThroughHandler extends ScpMessageBaseHandle implements ScpMessageHandler { class UdpBlePassThroughHandler extends ScpMessageBaseHandle
implements ScpMessageHandler {
@override @override
void handleReq(ScpMessage scpMessage) { void handleReq(ScpMessage scpMessage) {
final BleResp bleResp = scpMessage.Payload; final BleResp bleResp = scpMessage.Payload;
@ -25,12 +24,8 @@ class UdpBlePassThroughHandler extends ScpMessageBaseHandle implements ScpMessag
} }
@override @override
void handleInvalidReq(ScpMessage scpMessage) { void handleInvalidReq(ScpMessage scpMessage) {}
// TODO: implement handleInvalidReq
}
@override @override
void handleRealTimeData(ScpMessage scpMessage) { void handleRealTimeData(ScpMessage scpMessage) {}
// TODO: implement handleRealTimeData
}
} }

View File

@ -6,9 +6,8 @@ import 'package:star_lock/talk/startChart/handle/scp_message_handle.dart';
import '../../start_chart_manage.dart'; import '../../start_chart_manage.dart';
class UdpEchoTestHandler extends ScpMessageBaseHandle implements ScpMessageHandler { class UdpEchoTestHandler extends ScpMessageBaseHandle
implements ScpMessageHandler {
@override @override
void handleReq(ScpMessage scpMessage) { void handleReq(ScpMessage scpMessage) {
// TODO: // TODO:
@ -21,12 +20,8 @@ class UdpEchoTestHandler extends ScpMessageBaseHandle implements ScpMessageHandl
} }
@override @override
void handleInvalidReq(ScpMessage scpMessage) { void handleInvalidReq(ScpMessage scpMessage) {}
// TODO: implement handleInvalidReq
}
@override @override
void handleRealTimeData(ScpMessage scpMessage) { void handleRealTimeData(ScpMessage scpMessage) {}
// TODO: implement handleRealTimeData
}
} }

View File

@ -27,11 +27,11 @@ class UdpGateWayResetHandler extends ScpMessageBaseHandle implements ScpMessageH
@override @override
void handleInvalidReq(ScpMessage scpMessage) { void handleInvalidReq(ScpMessage scpMessage) {
// TODO: implement handleInvalidReq
} }
@override @override
void handleRealTimeData(ScpMessage scpMessage) { void handleRealTimeData(ScpMessage scpMessage) {
// TODO: implement handleRealTimeData
} }
} }

View File

@ -10,8 +10,6 @@ import '../../start_chart_manage.dart';
class UdpGateWayTransferHandler extends ScpMessageBaseHandle class UdpGateWayTransferHandler extends ScpMessageBaseHandle
implements ScpMessageHandler { implements ScpMessageHandler {
@override @override
void handleReq(ScpMessage scpMessage) { void handleReq(ScpMessage scpMessage) {
// TODO: // TODO:
@ -27,12 +25,8 @@ class UdpGateWayTransferHandler extends ScpMessageBaseHandle
} }
@override @override
void handleInvalidReq(ScpMessage scpMessage) { void handleInvalidReq(ScpMessage scpMessage) {}
// TODO: implement handleInvalidReq
}
@override @override
void handleRealTimeData(ScpMessage scpMessage) { void handleRealTimeData(ScpMessage scpMessage) {}
// TODO: implement handleRealTimeData
}
} }

View File

@ -31,12 +31,8 @@ class UdpGoOnlineHandler extends ScpMessageBaseHandle
} }
@override @override
void handleInvalidReq(ScpMessage scpMessage) { void handleInvalidReq(ScpMessage scpMessage) {}
// TODO: implement handleInvalidReq
}
@override @override
void handleRealTimeData(ScpMessage scpMessage) { void handleRealTimeData(ScpMessage scpMessage) {}
// TODO: implement handleRealTimeData
}
} }

View File

@ -7,9 +7,8 @@ import 'package:star_lock/talk/startChart/handle/scp_message_handle.dart';
import '../../start_chart_manage.dart'; import '../../start_chart_manage.dart';
class UdpHeartBeatHandler extends ScpMessageBaseHandle implements ScpMessageHandler { class UdpHeartBeatHandler extends ScpMessageBaseHandle
implements ScpMessageHandler {
@override @override
void handleReq(ScpMessage scpMessage) { void handleReq(ScpMessage scpMessage) {
// TODO: // TODO:
@ -32,12 +31,8 @@ class UdpHeartBeatHandler extends ScpMessageBaseHandle implements ScpMessageHand
} }
@override @override
void handleInvalidReq(ScpMessage scpMessage) { void handleInvalidReq(ScpMessage scpMessage) {}
// TODO: implement handleInvalidReq
}
@override @override
void handleRealTimeData(ScpMessage scpMessage) { void handleRealTimeData(ScpMessage scpMessage) {}
// TODO: implement handleRealTimeData
}
} }

View File

@ -25,11 +25,11 @@ class UdpRemoteUnLockHandler extends ScpMessageBaseHandle implements ScpMessageH
@override @override
void handleInvalidReq(ScpMessage scpMessage) { void handleInvalidReq(ScpMessage scpMessage) {
// TODO: implement handleInvalidReq
} }
@override @override
void handleRealTimeData(ScpMessage scpMessage) { void handleRealTimeData(ScpMessage scpMessage) {
// TODO: implement handleRealTimeData
} }
} }

View File

@ -36,18 +36,17 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
stopRingtone(); stopRingtone();
// //
talkStatus.setDuringCall(); talkStatus.setDuringCall();
stopRingtone();
} }
} }
@override @override
void handleInvalidReq(ScpMessage scpMessage) { void handleInvalidReq(ScpMessage scpMessage) {
// TODO: implement handleInvalidReq
} }
@override @override
void handleRealTimeData(ScpMessage scpMessage) { void handleRealTimeData(ScpMessage scpMessage) {
// TODO: implement handleRealTimeData
} }
// //
@ -63,6 +62,7 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
startChartManage.stopTalkPingMessageTimer(); startChartManage.stopTalkPingMessageTimer();
startChartManage.stopTalkExpectMessageTimer(); startChartManage.stopTalkExpectMessageTimer();
talkStatus.setNotTalkPing(); talkStatus.setNotTalkPing();
talkStatus.setEnd();
}); });
} }
@ -76,6 +76,7 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
startChartManage.stopTalkPingMessageTimer(); startChartManage.stopTalkPingMessageTimer();
startChartManage.stopTalkExpectMessageTimer(); startChartManage.stopTalkExpectMessageTimer();
talkStatus.setNotTalkData(); talkStatus.setNotTalkData();
talkStatus.setEnd();
}); });
} }

View File

@ -29,11 +29,11 @@ class UdpTalkExpectHandler extends ScpMessageBaseHandle
@override @override
void handleInvalidReq(ScpMessage scpMessage) { void handleInvalidReq(ScpMessage scpMessage) {
// TODO: implement handleInvalidReq
} }
@override @override
void handleRealTimeData(ScpMessage scpMessage) { void handleRealTimeData(ScpMessage scpMessage) {
// TODO: implement handleRealTimeData
} }
} }

View File

@ -38,11 +38,11 @@ class UdpTalkHangUpHandler extends ScpMessageBaseHandle
@override @override
void handleInvalidReq(ScpMessage scpMessage) { void handleInvalidReq(ScpMessage scpMessage) {
// TODO: implement handleInvalidReq
} }
@override @override
void handleRealTimeData(ScpMessage scpMessage) { void handleRealTimeData(ScpMessage scpMessage) {
// TODO: implement handleRealTimeData
} }
} }

View File

@ -6,7 +6,6 @@ import 'package:star_lock/talk/startChart/proto/generic.pb.dart';
class UdpTalkPingHandler extends ScpMessageBaseHandle class UdpTalkPingHandler extends ScpMessageBaseHandle
implements ScpMessageHandler { implements ScpMessageHandler {
@override @override
void handleReq(ScpMessage scpMessage) { void handleReq(ScpMessage scpMessage) {
// TODO: // TODO:
@ -19,17 +18,12 @@ class UdpTalkPingHandler extends ScpMessageBaseHandle
if (checkGenericRespSuccess(genericResp)) { if (checkGenericRespSuccess(genericResp)) {
// //
talkePingOverTimeTimerManager.receiveMessage(); talkePingOverTimeTimerManager.receiveMessage();
} }
} }
@override @override
void handleInvalidReq(ScpMessage scpMessage) { void handleInvalidReq(ScpMessage scpMessage) {}
// TODO: implement handleInvalidReq
}
@override @override
void handleRealTimeData(ScpMessage scpMessage) { void handleRealTimeData(ScpMessage scpMessage) {}
// TODO: implement handleRealTimeData
}
} }

View File

@ -10,7 +10,6 @@ import '../../start_chart_manage.dart';
class UdpTalkPushHandler extends ScpMessageBaseHandle class UdpTalkPushHandler extends ScpMessageBaseHandle
implements ScpMessageHandler { implements ScpMessageHandler {
@override @override
void handleReq(ScpMessage scpMessage) { void handleReq(ScpMessage scpMessage) {
// TODO: // TODO:
@ -24,13 +23,8 @@ class UdpTalkPushHandler extends ScpMessageBaseHandle
} }
@override @override
void handleInvalidReq(ScpMessage scpMessage) { void handleInvalidReq(ScpMessage scpMessage) {}
// TODO: implement handleInvalidReq
}
@override @override
void handleRealTimeData(ScpMessage scpMessage void handleRealTimeData(ScpMessage scpMessage) {}
) {
// TODO: implement handleRealTimeData
}
} }

View File

@ -24,11 +24,11 @@ class UdpTalkReceiverTransferHandler extends ScpMessageBaseHandle
@override @override
void handleInvalidReq(ScpMessage scpMessage) { void handleInvalidReq(ScpMessage scpMessage) {
// TODO: implement handleInvalidReq
} }
@override @override
void handleRealTimeData(ScpMessage scpMessage) { void handleRealTimeData(ScpMessage scpMessage) {
// TODO: implement handleRealTimeData
} }
} }

View File

@ -13,7 +13,6 @@ class UdpTalkRejectHandler extends ScpMessageBaseHandle
@override @override
void handleReq(ScpMessage scpMessage) { void handleReq(ScpMessage scpMessage) {
// //
print('收到接听拒绝请求');
startChartManage.sendGenericRespSuccessMessage( startChartManage.sendGenericRespSuccessMessage(
ToPeerId: scpMessage.FromPeerId!, ToPeerId: scpMessage.FromPeerId!,
FromPeerId: scpMessage.ToPeerId!, FromPeerId: scpMessage.ToPeerId!,
@ -23,25 +22,26 @@ class UdpTalkRejectHandler extends ScpMessageBaseHandle
startChartManage.stopTalkExpectMessageTimer(); startChartManage.stopTalkExpectMessageTimer();
talkStatus.setRejected(); talkStatus.setRejected();
stopRingtone(); stopRingtone();
talkStatus.setEnd();
} }
@override @override
void handleResp(ScpMessage scpMessage) { void handleResp(ScpMessage scpMessage) {
print('收到接听拒绝回复');
// //
talkStatus.setRejected(); talkStatus.setRejected();
startChartManage.stopTalkPingMessageTimer(); startChartManage.stopTalkPingMessageTimer();
startChartManage.stopTalkExpectMessageTimer(); startChartManage.stopTalkExpectMessageTimer();
stopRingtone(); stopRingtone();
talkStatus.setEnd();
} }
@override @override
void handleInvalidReq(ScpMessage scpMessage) { void handleInvalidReq(ScpMessage scpMessage) {
// TODO: implement handleInvalidReq
} }
@override @override
void handleRealTimeData(ScpMessage scpMessage) { void handleRealTimeData(ScpMessage scpMessage) {
// TODO: implement handleRealTimeData
} }
} }

View File

@ -30,15 +30,6 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
// //
_talkRequestEvent(talkObjectName: talkReq.callerName); _talkRequestEvent(talkObjectName: talkReq.callerName);
// Future.delayed(Duration(seconds: 1), () {
// startChartManage.sendTalkAcceptMessage();
// // startChartManage.sendTalkRejectMessage();
// });
//
// Future.delayed(Duration(seconds: 5), () {
// startChartManage.sendTalkHangupMessage();
// // startChartManage.sendTalkRejectMessage();
// });
} }
@override @override
@ -46,7 +37,7 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
// //
final GenericResp genericResp = scpMessage.Payload; final GenericResp genericResp = scpMessage.Payload;
if (genericResp.code == 0) { if (genericResp.code == 0) {
print('发送对讲成功'); print('发送对讲成功,已经收到对方的回复');
} }
} }

View File

@ -204,6 +204,7 @@ class StartChartManage {
// 线 // 线
Future<void> _sendOnlineMessage() async { Future<void> _sendOnlineMessage() async {
_log(text: '发送上线消息');
if (isOnlineStartChartServer) { if (isOnlineStartChartServer) {
_log(text: '星图已上线,请勿重复发送上线消息'); _log(text: '星图已上线,请勿重复发送上线消息');
return; return;
@ -218,6 +219,10 @@ class StartChartManage {
// //
Future<void> sendCallRequestMessage({required String ToPeerId}) async { Future<void> sendCallRequestMessage({required String ToPeerId}) async {
if (talkStatus.status == TalkStatus.duringCall) {
_log(text: '已经在通话中,请勿重复发送对讲请求');
return;
}
// 线 // 线
final message = MessageCommand.talkRequestMessage( final message = MessageCommand.talkRequestMessage(
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
@ -248,12 +253,13 @@ class StartChartManage {
} }
// //
void sendEchoMessage({required String ToPeerId}) async { void sendEchoMessage() async {
final message = MessageCommand.echoMessage( final message = MessageCommand.echoMessage(
ToPeerId: ToPeerId, ToPeerId: echoPeerId,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
); );
await _sendMessage(message: message); await _sendMessage(message: message);
_log(text: '发送回声测试消息');
} }
// //
@ -732,7 +738,6 @@ class StartChartManage {
seconds: talkPingIntervalTime, seconds: talkPingIntervalTime,
), ),
(Timer timer) async { (Timer timer) async {
// 线
await sendTalkPingMessage( await sendTalkPingMessage(
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,

View File

@ -4,6 +4,7 @@ import 'package:star_lock/talk/startChart/events/talk_status_change_event.dart';
enum TalkStatus { enum TalkStatus {
waitingAnswer, // waitingAnswer, //
waitingData, //
duringCall, // duringCall, //
rejected, // rejected, //
uninitialized, // uninitialized, //
@ -106,6 +107,6 @@ class StartChartTalkStatus {
/// ///
void setEnd() { void setEnd() {
_setStatus(TalkStatus.end); _setStatus(TalkStatus.end);
// "error" // "end"
} }
} }

View File

@ -298,6 +298,9 @@ flutter:
- images/mine/ - images/mine/
- images/lockType/ - images/lockType/
- assets/ - assets/
- assets/html/h264.html
- assets/demo.h264
- assets/talk.h264
- lan/ - lan/
# An image asset can refer to one or more resolution-specific "variants", see # An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.dev/assets-and-images/#resolution-aware # https://flutter.dev/assets-and-images/#resolution-aware