import 'dart:async'; import 'dart:convert'; import 'package:EasyDartModule/EasyDartModule.dart' as edm; import 'package:easydevice/easydevice.dart'; import 'package:easyweb/base/easyws.dart'; import 'package:easyweb/base/minisdk.dart'; import 'package:easyweb/easyweb.dart'; import 'package:ef/ef.dart'; import 'package:flutter/material.dart'; import 'package:vbvs_app/common/color/ServiceConstant.dart'; import 'package:vbvs_app/common/util/FitTool.dart'; import 'package:vbvs_app/common/util/requestWithLog.dart'; import 'package:vbvs_app/controller/user_info_controller.dart'; import 'package:vbvs_app/pages/mh_page/homepage/controller/mht_home_controller.dart'; class WebviewTestModel { WebviewTestModel(); //EasyFlutter Start[Model] //EasyFlutter End } class WebviewTestController extends GetControllerEx { var selectDevice = {}; var lastSelectDevice = {}; var bluetooth = 0; List personList = []; List instantData = []; WebviewTestController() : super(WebviewTestModel()) { web = WebviewHelper( jsbridge: buildsdk( // father: this, // clientId: '494641114', // dbgserverUrl: 'ws://192.168.1.2:9001', ), settings: buildsettings(), params: PlatformHeadlessInAppWebViewCreationParams( initialUrlRequest: URLRequest( url: WebUri( 'https://wyf.it.real.he-info.cn:94/goods-front/index.html'), // url: WebUri( // 'http://192.168.1.2:8888'), ), onLoadStop: (controller, url) { setState(() => ready.value = true); MHTHomeController deviceController = Get.find(); web.jsbridge!.dart .updateDeviceList(deviceController.deviceList.values); }, ), ); try { web.jsbridge!.bind((bridge) { var minible = Minibleapp(bridge: bridge); // ef.kvroot.devicelist.listen((x) {}); bridge.sdk.updateDeviceRoute((args) async { ef.log('updateDeviceRoute: $args'); selectDevice['blueToothStatus'] = bluetooth; Get.toNamed("${args[0]}", arguments: selectDevice); return true; }); bridge.sdk.selectDevice((args) async { try { ef.log('selectDevice: $args'); selectDevice = args[0]; await queryPersonInfoByMac(); if (selectDevice != null && selectDevice.isNotEmpty && selectDevice['mac'] != null && (selectDevice['mac'] != args[0]['mac'])) { lastSelectDevice = selectDevice; } dealInstantData(selectDevice); } catch (e) { ef.log("[aaaa]$e"); } //查询人员信息 return true; }); bridge.sdk.updateBlueToothStatus((args) async { ef.log('updateBlueToothStatus: $args'); bluetooth = args[0]; return true; }); //sdk定义接口 bridge.sdk.querySelectDevice((args) async { ef.log('updateBlueToothStatus: $args'); // bluetooth = args[0]; MHTHomeController deviceController = Get.find(); await deviceController.getDeviceList(group: 'room'); final allDevices = deviceController.deviceList.values .expand((list) => list) .toList(); return allDevices; }); //请求token信息 bridge.sdk.queryUserToken((args) async { ef.log('queryUserToken: $args'); // bluetooth = args[0]; return edm.EasyDartModule.dio.token; }); //请求设备人员信息 bridge.sdk.queryPersonInfo((args) async { ef.log('queryPersonInfo: $args'); // bluetooth = args[0]; return personList; }); //请求实时体征数据 bridge.sdk.queryInstantData((args) async { ef.log('queryInstantData: $args'); // bluetooth = args[0]; return instantData; }); bridge.sdk.startTimer((args) async { ef.log('queryInstantData: $args'); MHTHomeController homeController = Get.find(); homeController.startTimer(args); return true; }); bridge.sdk.cancelTimer((args) async { ef.log('queryInstantData: $args'); MHTHomeController homeController = Get.find(); homeController.cancelTimer(args); return true; }); bridge.sdk.restoreTimer((args) async { ef.log('queryInstantData: $args'); MHTHomeController homeController = Get.find(); var data = await homeController.restoreTimer(args); return data; }); }); } catch (e, s) { ef.log('$e,$s'); } } late WebviewHelper web; var ready = false.obs; var cnt = 0.obs; Future queryPersonInfoByMac() async { UserInfoController userInfoController = Get.find(); String serviceAddress = ServiceConstant.service_address; String serviceName = ServiceConstant.server_service; String serviceApi = ServiceConstant.person_info; String queryUrl = "${serviceAddress}${serviceName}${serviceApi}?mac=${selectDevice['mac']}"; try { final res = await requestWithLog( logTitle: "查询设备绑定人员列表", method: MyHttpMethod.get, queryUrl: queryUrl, onSuccess: (res) { personList = res.data; }); } catch (e) { print("查询设备绑定列表失败: $e"); } } void dealInstantData(selectDevice) { //处理实时数据 // edm.EasyDartModule.websocket.sendData( // jsonEncode(WebSocketMessage(path: "/vsbs/web/rt/marttress", type: 2))); lastSelectDevice; var ws; ws = Easyws( url: ServiceConstant.webSocketService, onData: (data) { ef.log("ws recv =>$data"); try { var tmp; if (data is String) { tmp = jsonDecode(data); // 只有是 String 才 decode } else if (data is Map) { tmp = data; // 直接用 } else { print("未知数据格式"); } if (tmp['data'] != null && tmp['data'] is Map) { var newData = tmp['data']; var mac = newData['mac']; if (mac != null) { // 删除已有的同 mac 项 instantData.removeWhere((element) => element['mac'] == mac); // 添加新的数据 instantData.add(newData); } } } catch (e) { ef.log("ws error =>$e"); } }, onStateChange: (x) { ef.log("ws =>$x"); if (x == EasywsState.connected) { try { if (lastSelectDevice != null && lastSelectDevice.isNotEmpty) { List oldMacList = [ lastSelectDevice['bind_mac_a'], lastSelectDevice['bind_mac_b'], ]; for (String? mac in oldMacList) { if (mac != null && mac.isNotEmpty) { bool success = ws.send({ "type": 2, "path": "/vsbs/web/rt/marttress", "data": {"mac": mac}, }); if (success) { ef.log("✅ 已取消监听:$mac"); } } } } } catch (e) { ef.log("❌ 取消旧设备监听失败: $e"); } try { // 2. 开始监听新设备(A/B 都监听) if (selectDevice != null && selectDevice.isNotEmpty) { List newMacList = [ selectDevice['bind_mac_a'], selectDevice['bind_mac_b'], ]; for (String? mac in newMacList) { if (mac != null && mac.isNotEmpty) { bool success = ws.send({ "type": 1, "path": "/vsbs/web/rt/marttress", "data": {"mac": mac}, }); if (success) { ef.log("✅ 开始监听新设备:$mac"); } } } // 更新记录 lastSelectDevice = selectDevice; } } catch (e) { ef.log("❌ 监听新设备失败: $e"); } } }, ); ws.connect(); } //EasyFlutter End @override void onInit() { ef.log("webview test init =>${DateTime.now()}"); super.onInit(); try { ef.kvRoot.appmanger.find("mhtControl").then((x) { x!.load().then((y) { ef.log("webview test res init loaded =>${DateTime.now()}"); web .file( url: 'https://wyf.it.real.he-info.cn:94/goods-front/index.html', pretag: 'https://wyf.it.real.he-info.cn:94/goods-front/', raw: y, ) //.network() .then((value) { if (value) { //资源准备完成.. setState(() { ready.value = true; }); } }); }); }); } catch (e, s) { ef.log('$e,$s'); } } } class WebviewTestView extends GetComponent { WebviewTestView({super.key, super.oncreate}); @override Widget build(BuildContext context) { UserInfoController userInfoController = Get.find(); MHTHomeController deviceController = Get.find(); deviceController.getDeviceList().then((x) { if (controller.web.jsbridge!.inited) { //发送测试消息给webview controller.web.jsbridge!.dart .updateDeviceList(deviceController.deviceList.values); } }); return Scaffold( backgroundColor: Colors.black12, body: Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.max, mainAxisAlignment: (userInfoController.model.login! != null && userInfoController.model.login! == 1) ? MainAxisAlignment.start : MainAxisAlignment.center, children: [ Obx(() { if (userInfoController.model.login! == null || userInfoController.model.login! == 0) { return Center( // 包一层 Center,强制水平和垂直都居中 child: Text( "登录进行设备控制".tr, style: TextStyle(color: Colors.white, fontSize: 30.rpx), ), ); } return Expanded( child: Align( alignment: Alignment.topLeft, child: controller.ready.value ? ((controller.cnt.value % 2 == 0) ? controller.web.build( key: ValueKey("A"), headless: false, ) : controller.web.build( key: ValueKey("B"), headless: false, )) : Container(), ), ); }), ], ), ); } }