Files
OrcaSlicer/resources/web/flutter_web/index.html
2025-12-08 11:35:07 +08:00

1196 lines
70 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html>
<head>
<!--
If you are serving your web app in a path other than the root, change the
href value below to reflect the base path you are serving from.
The path provided below has to start and end with a slash "/" in order for
it to work correctly.
For more details:
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base
This is a placeholder for base href that will be replaced by the value of
the `--base-href` argument provided to `flutter build`.
-->
<base href="/web/flutter_web/">
<!-- <base href="/web/flutter_web/"> --> <!-- --base-href=/knowledge.io/ -->
<!-- <script src="https://unpkg.com/mqtt/dist/mqtt.min.js"></script> -->
<meta charset="UTF-8">
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
<meta name="description" content="Snapmaker Orca">
<!-- 添加权限策略 -->
<meta http-equiv="Permissions-Policy" content="local-files-write=*">
<meta http-equiv="Access-Control-Allow-Origin" content="*">
<meta http-equiv="Access-Control-Allow-Methods" content="GET, POST, PUT, DELETE, OPTIONS">
<meta http-equiv="Access-Control-Allow-Headers" content="Content-Type, Authorization, x-amz-checksum-sha256">
<!-- iOS meta tags & icons -->
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-title" content="web">
<link rel="apple-touch-icon" href="icons/Icon-192.png">
<!-- Favicon -->
<link rel="icon" type="image/png" href="favicon.png"/>
<title>Snapmaker Orca</title>
<link rel="manifest" href="manifest.json">
<!-- 针对 macOS 的优化 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<!-- 在head中添加 -->
<meta name="theme-color" content="#ffffff">
<link rel="apple-touch-startup-image" href="splash.png">
</head>
<body>
<script src="flutter_bootstrap.js" async></script>
<script>
if ('application/octet-stream' in MimeType) {
MimeType['image/webp'] = 'webp';
}
</script>
<script>
function open_browser() {
const message = JSON.stringify({
sequence_id: 1222222,
command: "homepage_test_browser",
params: {
url: "https://snapmaker.com",
title: "Snapmaker",
},
});
// 调用 window.postMessage 传递消息给 flutter
window.wx && window.wx.postMessage(message); // 调用 window.postMessage 传递消息给 原生系统
///模拟收到响应结果5000
if(!window.wx) {
// 我不能发现 window.wx
console.log('i dont find window.wx, so i simulate a return by postMessage, message: ', message)
}
}
async function test_sava_file(suggestedName, content) {
try {
const options = {
suggestedName: suggestedName,
types: [{
description: 'G-code 文件',
accept: {
'application/x-gcode': ['.gcode']
}
}],
};
// 必须直接在点击事件处理函数中调用
const handle = await window.showSaveFilePicker(options);
const writable = await handle.createWritable();
await writable.write(content);
await writable.close();
console.log('文件保存成功!');
} catch (err) {
if (err.name === 'AbortError') {
console.log('用户取消了保存操作');
} else {
console.error('保存文件时出错:', err);
// 现代浏览器的polyfill可选
}
}
}
function test_mqtt_unsubscribe() {
body = {
header:{
sequenceId: 202519,
},
payload:{
cmd: "sw_StopMachineStateSubscription",
params: {},
}
};
window.wx.postMessage(JSON.stringify(body));
}
function test_call_flutter_add_device() {
body = {
header:{
sequenceId: 202519,
},
payload:{
method: "call_flutter",
cmd: "devicepage_add_device",
params: {
"event": "onResume",
"device_id": "1234567890",
},
}
};
window.postMessage(JSON.stringify(body), '*');
}
function test_mqtt_subscribe() {
body = {
header:{
sequenceId: 202503,
},
payload:{
cmd: "sw_SubscribeMachineState",
params: {},
event_id: "subscribe1",
}
};
window.wx.postMessage(JSON.stringify(body));
}
function test_mqtt_subscribe_filter(){
body = {
header:{
sequenceId: 202510,
},
payload:{
cmd: "sw_SetSubscribeFilter",
params: {
"targets":{
"gcode_move": null,
"toolhead": ["position", "status"]
}
}
}
};
window.wx.postMessage(JSON.stringify(body));
}
function test_mqtt_send_gcodes(){
body = {
header:{
sequenceId: 202592,
},
payload:{
cmd: "sw_SendGCodes",
params: {
"script":[
"T0",
"T1",
"T2",
"T3",
]
}
}
};
window.wx.postMessage(JSON.stringify(body));
}
function test_mqtt_machine_info(){
body = {
header:{
sequenceId: 202502,
},
payload:{
cmd: "sw_GetMachineState",
params: {
"targets":{
"gcode_move": null,
"toolhead": ["position", "status"]
}
}
}
};
window.wx.postMessage(JSON.stringify(body));
}
function test_mqtt_machine_objects(){
body = {
header:{
sequenceId: 202504,
},
payload:{
cmd: "sw_GetMachineObjects",
}
};
window.wx.postMessage(JSON.stringify(body));
}
function test_mqtt_disconnect() {
body = {
header:{
sequenceId: 202500,
},
payload:{
cmd: "sw_DisConnect",
}
}
window.wx.postMessage(JSON.stringify(body));
}
function test_mqtt_connect() {
body = {
header:{
sequenceId: 202501,
},
payload:{
cmd: "sw_Connect",
params: {
ip: "172.18.1.66",
port: 1883,
sn: "BE667E5F8A060BDF",
}
}
}
window.wx.postMessage(JSON.stringify(body));
}
var testtime = 1.0;
function test_mqtt_subscribe_response_message_timer() {
var timer = setInterval(function() {
testtime += 1.0;
test_mqtt_subscribe_response(testtime);
}, 2000);
// setTimeout(function() {
// clearInterval(timer);
// }, 10000);
}
function test_mqtt_subscribe_response(time) {
var body = {
"header": {
"event_id": "subscribeMachineState"
},
"payload": {
"code": 200,
"data": {
"data": [
{
"display_status": {
"message": null,
"progress": 0.45
},
"extruder": {
"can_extrude": true,
"power": 0.4824050874358382,
"pressure_advance": 0.015,
"smooth_time": 0.04,
"target": 230,
"temperature": time
},
"extruder1": {
"can_extrude": false,
"power": 0,
"pressure_advance": 0.015,
"smooth_time": 0.04,
"target": 0,
"temperature": 29.82
},
"extruder2": {
"can_extrude": false,
"power": 0,
"pressure_advance": 0.015,
"smooth_time": 0.04,
"target": 0,
"temperature": 29.96
},
"extruder3": {
"can_extrude": false,
"power": 0,
"pressure_advance": 0.015,
"smooth_time": 0.04,
"target": 0,
"temperature": 30.71
},
"fan": {
"rpm": null,
"speed": 1
},
"fan_generic cavity_fan": {
"rpm": 2293.8530734755464,
"speed": 0.7
},
"gcode_move": {
"absolute_coordinates": true,
"absolute_extrude": false,
"extrude_factor": 1,
"gcode_position": [
128.125,
144.559,
6.8,
4179.2542500048585
],
"homing_origin": [
0,
0,
0,
0
],
"position": [
128.125,
144.559,
6.8,
169664.43720992337
],
"speed": 11054.348,
"speed_factor": 1
},
"heater_bed": {
"can_extrude": null,
"power": 0.07280463005309298,
"pressure_advance": null,
"smooth_time": null,
"target": 55,
"temperature": 54.97
},
"led cavity_led": {
"color_data": [
[
0,
0,
0,
1
]
]
},
"print_stats": {
"filament_used": 4079.2542500048585,
"filename": "1/1指尖陀螺_PLA_1h17m.gcode",
"info": {
"current_layer": null,
"total_layer": null
},
"message": "",
"print_duration": 2296.5128470530035,
"state": "printing",
"total_duration": 2305.2522525569657
},
"print_task_config": {
"auto_bed_leveling": true,
"extruder_map_table": [
0,
1,
2,
3
],
"filament_color": [
16711680,
65280,
255,
16777215
],
"filament_type": [
"NONE",
"NONE",
"NONE",
"NONE"
],
"time_lapse_camera": false
},
"temperature_sensor cavity": {
"measured_max_temp": 0,
"measured_min_temp": -109.28,
"temperature": -40.4
},
"toolhead": {
"axis_maximum": [
270,
335,
280,
0
],
"axis_minimum": [
0,
0,
0,
0
],
"estimated_print_time": 189077.40531407812,
"extruder": "extruder",
"homed_axes": "xyz",
"max_accel": 10000,
"max_velocity": 500,
"minimum_cruise_ratio": 0.5,
"position": [
128.125,
144.559,
10.52774598675305,
169664.43720992337
],
"print_time": 189079.63617631845,
"square_corner_velocity": 5,
"stalls": 1
},
"virtual_sdcard": {
"file_path": "/userdata/printer_data/gcodes/1/1指尖陀螺_PLA_1h17m.gcode",
"file_position": 3584284,
"file_size": 8457526,
"is_active": true,
"progress": 0.4237981650898856
},
"webhooks": {
"state": "ready",
"state_message": "Printer is ready"
}
},
// 541096.928877337, //获取当前的时间 代码获取 new Date().getTime()
new Date().getTime(), //获取当前的时间 代码获取 541096.928877337,
],
"method": "html.test.subscribeMachineState",
},
"msg": "OK"
}
};
console.log("subscribeMachineState response message: " + JSON.stringify(body) );
!window.wx && window.postMessage(JSON.stringify(body), '*'); // 调用 window.postMessage 传递消息给 flutter
}
function getDeviceData() {
var devices = {
'90F3A2F30063C233': {
'ip': '172.18.1.34',
'port': 1883,
'name': 'lava-90F-233',
'device_name': '90F-233',
'sn': '90F3A2F30063C233',
'connected': false,
'userid': '',
'link_mode': 'lan'
},
'A4C0111397B11BBB': {
'ip': '172.18.1.31',
'port': 1883,
'name': 'lava-A4C-BBB',
'device_name': 'A4C-BBB',
'sn': 'A4C0111397B11BBB',
'connected': false,
'userid': 'all-pro',
'link_mode': 'wan'
},
'A4C0111397B11dddd': {
'ip': '172.18.0.98',
'port': 1883,
'name': 'lava-12C5C804F3DAB37B-12C',
'device_name': '12C-37B',
'sn': '12C5C804F3DAB37B',
'connected': true,
'userid': '',
'link_mode': 'lan'
}
};
return devices;
}
function getFileFilamentMapping() {
return {
"estimated_time": 333.11,
"filament_color": [16777088,'#808080',0,16711680,'#808080', '#FF0000', '#00FF00', '#808080'],
"filament_color_rgba": ['#ff223311','#808080','#ff000000','#ffffffff','#808080', '#FF0000', '#00FF00', '#808080'],
"filament_type": ["PLA","PLET","PAL","PLA","PLET","PLA","PLA","PLA"],
// "filament_used": [1.002, 1.150, 0, 1.2, 1.002, 1.002, 11.1, 11.05],
"filament_weight": [1.002, 1.150, 0, 1.2, 1.002, 1.002, 11.1, 11.05],
"file_cover": {
"url": null,
"base64": "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id3BFStGOX+VV91D32a7hSI9efvtldnYsaaDufbcc/NMC0W68+ij0+wO5t3kyVe2/frX9yZ1YYlUOsePt2UTJ15hdzDv4v1Yr712R1IXl0il853vLMjOO+9DQwvkX1vbjZ2/+93apC4wkUolFttbW8fuK5CGyy4bNPL73zfKksZMjK6uuOK8cQXSsW7djZ3WsqTREmtXRlcJMsqSRszzz88zukpVjLKcy5JGyS9/ucboKmUxytqzZ3725z87/S71n+3bZ2SXXPLPIwuka8mS67e89daKpC48kTPN668vzZYtG9lZIH07d87usgAv9ZpYaP/c58Y71V4vbr75spbvfneRqaHUZb7+9dmeGaw3d989psPUUOotL720OFu1ykJ73YlHdnbsmNl19Og9SV2QIqdK7Ao+9NAkj+DUq2uvvXBcnFPx2I6knnj8ZuvWqdmwYc5c1bXYNbSeJakn1q1aWuwKNoQ4ULpv37KkLlCRUjo7F1q3aiSxnvXEEzO73nzTIryklR/9aHnxCIMDog0mTsFHaf3853cndcFK4+add1qLi+zWrRpULMJ/85vzMs8bSt5T2hFUVg0uXqkcpXXkiOMOks+UymrWrI9sKUAcKlVakseUysqOIH0oLclbSmVlR5CTKpWWNS2pdXrKaqKyon933TWmY9eu2zK7h1KrxNEFZUXZFi++fsuuXXOyN99cnvnqe6lmXnzx9uzLX56YLVhwna+Yp3xjxgxujtKKC0hpSTUSz7lGWd1006VtBThT11xz4bjt22d0xaMQ77+/LqmLX9JJvIDvqadmFcvKF0hwTi69dNDIzZsnH3/uubnZoUMW46WyicX1KKrPfvaWLmVFRcSzh7EY//TTc4oLoqaIUonE19BFWcU33XinFRUXi/FRWt/73u3Zb3/rnVpydonvFyhNAZ1eZ0DFutbjj0/v2r37tuxnP7srqRtFap833lheLCrrVVRNrGutXDm6o6OjOXvhhUXZH/5gQV76T7whNHYBv/QlU0BqZNKkYW2PPTa969lne0Zb1rbkZIlRVRRV5NZbr2gvQK3EaOveez/eWRptWduSUt57797sySdnnRhVeekeuVEabUVxvfzyYtPEBk5M//bsWZB98Yu3FsvKQVByKUZbd945umPnztnZM8/MyX76U9PERssbb7QUiypyxx0jOq1VkXtRXBs3jjsU32wSj/f0FNf9Sd14cmbZt68le/TRacWiuu++jx+yA0hympoubemeEhyP4oqT8j/5yUrFVYdFtW3btOwLX+gZVY0ZM7ilACmbOHFY21e/OrUrDgsqrvorqojdP+pO90VdLK7YOfrGN5qzt95aobgSL6oJExQVdS6Ka+vWnuKKXcVXX12SHTt2X1I3biPlvff+O/v2t+dnn//8hGIUFQ0piuuBB/7z0I4dM7MnnphZ3Ap/+23Txbzkxz++s/gDpVRU69c3HW9qGuKIAo1tyJB/Gbl69Q2dW7ZM6Yri2rnTqKtW+cUvVmff+tb87MEHJ5woqnnzPtpx+eV2/aCPCy748NDuqUZb901yPIor8vzz/1V8pc1vfqO8BrKkXnllSbZ165RiUZUyYcLl7eed949DC0D/YtTV0jKyI0ZdX/vazCwSD8+Wysu08dxy+PDq4ii2exMk27Rp/InMnWs0BefkE58Y0rJq1Q2djzwS5TUji8TZrnh28cCBu5VXmYlvQorP7OGHJ/UZSc2de23HqFHOT0HFjRjxb83Llo3oeOSRyX3Ka8+e+cXR169+dY8C+2sOHGjNXnvtjuIRktjZK61JRWIkNXq0koKqufrqC8aNH39526c//clDpfIqFVhMH3/wg6XFEVgjrH/FFzm8805r8bXD8VbY0utcSuel2tvHdcVRhMGDvTEBciFGXzNmXN3eu8C2b+/JU0/NLp4lihLbv39l0utg8cUNcfzj9deXZs88c9uJN3iWEkW1ceMtXXH6vKnJmxIgCVFgpRFYTCFL5dU7MRqJIoubf//+O4tTyiiz3/9+Xc0KLUZLR46syQ4ebC0W7MsvL8mefXZusYBj/Sny0EMfJEpq/vzrOiZOvKL9uusuai4A6bvggg8NLZXY0qUjOnoX2eOPT/+7xEn8p59uznbvnpvt3bswe+mlxcUpVyQOVUbiTavvvrsqO3r0npMmvhqtlHhrRSQeSfrhD5cVd+liETyer4zs2DEr6/79nMjmzX0TRfWpT918fMGC4R2TJg1rHzv2kpYC0Fh6iuziYpFNn35Ve5RZdzEc2rx5UlcU12OPfZB4hcqpEs/YlRLHBXpn69YP8pWvTOmTLVs+SBTV/ff/x6FFi4Z3TJ48rD2Kafjwi5rPP997pYAzEKV2/fUXN99yy9C2yLRpV7X/baZO7Z0rT2TKlL752Mf+vSVy5ZXnj1NGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAbv0/PiKpXulmiAgAAAAASUVORK5CYII=",
},
"thumbnails": [
{
"width": 32,
"height": 32,
"url": ".thumbs/S200-5K_14m28s-32x32.png",
},
{
"width": 64,
"height": 64,
"url": "data:image/jpeg;base64,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",
},
{
"width": 200,
"height": 200,
"url": "data:image/png;base64,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id3BFStGOX+VV91D32a7hSI9efvtldnYsaaDufbcc/NMC0W68+ij0+wO5t3kyVe2/frX9yZ1YYlUOsePt2UTJ15hdzDv4v1Yr712R1IXl0il853vLMjOO+9DQwvkX1vbjZ2/+93apC4wkUolFttbW8fuK5CGyy4bNPL73zfKksZMjK6uuOK8cQXSsW7djZ3WsqTREmtXRlcJMsqSRszzz88zukpVjLKcy5JGyS9/ucboKmUxytqzZ3725z87/S71n+3bZ2SXXPLPIwuka8mS67e89daKpC48kTPN668vzZYtG9lZIH07d87usgAv9ZpYaP/c58Y71V4vbr75spbvfneRqaHUZb7+9dmeGaw3d989psPUUOotL720OFu1ykJ73YlHdnbsmNl19Og9SV2QIqdK7Ao+9NAkj+DUq2uvvXBcnFPx2I6knnj8ZuvWqdmwYc5c1bXYNbSeJakn1q1aWuwKNoQ4ULpv37KkLlCRUjo7F1q3aiSxnvXEEzO73nzTIryklR/9aHnxCIMDog0mTsFHaf3853cndcFK4+add1qLi+zWrRpULMJ/85vzMs8bSt5T2hFUVg0uXqkcpXXkiOMOks+UymrWrI9sKUAcKlVakseUysqOIH0oLclbSmVlR5CTKpWWNS2pdXrKaqKyon933TWmY9eu2zK7h1KrxNEFZUXZFi++fsuuXXOyN99cnvnqe6lmXnzx9uzLX56YLVhwna+Yp3xjxgxujtKKC0hpSTUSz7lGWd1006VtBThT11xz4bjt22d0xaMQ77+/LqmLX9JJvIDvqadmFcvKF0hwTi69dNDIzZsnH3/uubnZoUMW46WyicX1KKrPfvaWLmVFRcSzh7EY//TTc4oLoqaIUonE19BFWcU33XinFRUXi/FRWt/73u3Zb3/rnVpydonvFyhNAZ1eZ0DFutbjj0/v2r37tuxnP7srqRtFap833lheLCrrVVRNrGutXDm6o6OjOXvhhUXZH/5gQV76T7whNHYBv/QlU0BqZNKkYW2PPTa969lne0Zb1rbkZIlRVRRV5NZbr2gvQK3EaOveez/eWRptWduSUt57797sySdnnRhVeekeuVEabUVxvfzyYtPEBk5M//bsWZB98Yu3FsvKQVByKUZbd945umPnztnZM8/MyX76U9PERssbb7QUiypyxx0jOq1VkXtRXBs3jjsU32wSj/f0FNf9Sd14cmbZt68le/TRacWiuu++jx+yA0hympoubemeEhyP4oqT8j/5yUrFVYdFtW3btOwLX+gZVY0ZM7ilACmbOHFY21e/OrUrDgsqrvorqojdP+pO90VdLK7YOfrGN5qzt95aobgSL6oJExQVdS6Ka+vWnuKKXcVXX12SHTt2X1I3biPlvff+O/v2t+dnn//8hGIUFQ0piuuBB/7z0I4dM7MnnphZ3Ap/+23Txbzkxz++s/gDpVRU69c3HW9qGuKIAo1tyJB/Gbl69Q2dW7ZM6Yri2rnTqKtW+cUvVmff+tb87MEHJ5woqnnzPtpx+eV2/aCPCy748NDuqUZb901yPIor8vzz/1V8pc1vfqO8BrKkXnllSbZ165RiUZUyYcLl7eed949DC0D/YtTV0jKyI0ZdX/vazCwSD8+Wysu08dxy+PDq4ii2exMk27Rp/InMnWs0BefkE58Y0rJq1Q2djzwS5TUji8TZrnh28cCBu5VXmYlvQorP7OGHJ/UZSc2de23HqFHOT0HFjRjxb83Llo3oeOSRyX3Ka8+e+cXR169+dY8C+2sOHGjNXnvtjuIRktjZK61JRWIkNXq0koKqufrqC8aNH39526c//clDpfIqFVhMH3/wg6XFEVgjrH/FFzm8805r8bXD8VbY0utcSuel2tvHdcVRhMGDvTEBciFGXzNmXN3eu8C2b+/JU0/NLp4lihLbv39l0utg8cUNcfzj9deXZs88c9uJN3iWEkW1ceMtXXH6vKnJmxIgCVFgpRFYTCFL5dU7MRqJIoubf//+O4tTyiiz3/9+Xc0KLUZLR46syQ4ebC0W7MsvL8mefXZusYBj/Sny0EMfJEpq/vzrOiZOvKL9uusuai4A6bvggg8NLZXY0qUjOnoX2eOPT/+7xEn8p59uznbvnpvt3bswe+mlxcUpVyQOVUbiTavvvrsqO3r0npMmvhqtlHhrRSQeSfrhD5cVd+liETyer4zs2DEr6/79nMjmzX0TRfWpT918fMGC4R2TJg1rHzv2kpYC0Fh6iuziYpFNn35Ve5RZdzEc2rx5UlcU12OPfZB4hcqpEs/YlRLHBXpn69YP8pWvTOmTLVs+SBTV/ff/x6FFi4Z3TJ48rD2Kafjwi5rPP997pYAzEKV2/fUXN99yy9C2yLRpV7X/baZO7Z0rT2TKlL752Mf+vSVy5ZXnj1NGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAbv0/PiKpXulmiAgAAAAASUVORK5CYII=",
},
],
"filename": "test.gocde",
"filament_extruder_map":{
"0": "0",
"1": "2", // 设计稿中的2号耗材选择的是3号头
},
"preferences": {
"bed_level": 1,
"flow_calibrate":0,
"shaper_calibrate":0,
"time_lapse_camera":0,
}
}
}
//sw_GetMachineFilamentMapping
function getMachineFilamentMapping() {
return {
"filament_color": [16777088,8388672,'#FF808080','#FF0000',16777084,16777088,'#838867',16711680],
"filament_color_rgba": ["#ffdddddd","#22222222",'#FF808080','#FF0000',"#dddddd","#ff000000",'#838867',"#eeffcc"],
"filament_type": ["PLA","PLA","PLET","PLA","PLA","PLET","NONE","PLA"],
"extruder_map_table": [0, 1, 2, 3, 4, 5, 6, 7],
}
}
function sw_MachineFilesMetadata() {
return {
"chamber_temp": 0,
"estimated_time": 868.00,
"filament_colour": "#0000FF;#FF0000;#FFFFFF;#804000",
"filament_name": "彩色打印;\"My Generic PLA @MyToolChanger\";\"My Generic PLA @MyToolChanger\";\"My Generic PLA @MyToolChanger",
"filament_total": 4656.38,
"filament_type": "PLA;PLA;PLA;PLA",
"filament_weight": [
13.89,
0,
0,
0
],
"filename": "1.gcode",
"first_layer_bed_temp": 60,
"first_layer_extr_temp": 220,
"first_layer_height": 0.2,
"gcode_end_byte": 326713,
"gcode_start_byte": 5203,
"job_id": null,
"layer_count": 250,
"layer_height": 0.2,
"modified": 1736475230.27094,
"nozzle_diameter": 0.4,
"object_height": 50,
"print_start_time": null,
"size": 344795,
"slicer": "OrcaSlicer",
"slicer_version": "2.1.1",
"thumbnails": [
{
"height": 32,
"relative_path": ".thumbs/S200-5K_14m28s-32x32.png",
"size": 811,
"width": 32
},
{
"height": 48,
"relative_path": ".thumbs/S200-5K_14m28s-48x48.png",
"size": 385,
"width": 48
},
{
"height": 300,
"relative_path": ".thumbs/S200-5K_14m28s-300x300.png",
"size": 2792,
"width": 300
}
],
"uuid": "c255b47f-62b8-495b-ac94-1a68675d393f"
};
}
function sw_GetConnectedMachine() {
return {
"dev_id":"172.18.0.98",
"dev_name":"172.18.0.98",
"img":"http://localhost:13619/profiles/Snapmaker/Snapmaker A250 BKit_cover.png",
"ip":"172.18.0.98",
"model_name":"Snapmaker A250 BKit",
"nozzle_sizes":["0.4"],
"preset_name":"Snapmaker A250 BKit (0.4 nozzle)",
"sn":"12C5C804F3DAB37B",
"port": 1884,
"name": "Snapmaker 0.61",
"connected":true,
"id": "44",
"clientId": "172.18.0.98",
"ca": "------ca------",
"cert": "------cert------",
"key": "------key------",
"link_mode": "lan"
};
}
function sw_GetLocalDevices() {
return [
{
"api_key": "",
"ca": "-----BEGIN CERTIFICATE-----MIIDwTCCAqmgAwIBAgIUNA2s7R3LmI2DITpR4fjaO0VCVSUwDQYJKoZIhvcNAQELBQAwaDEUMBIGA1UEAwwLbXF0dC1icm9rZXIxFjAUBgNVBAoMDXNuYXBtYWtlci5jb20xETAPBgNVBAsMCHNvZnR3YXJlMSUwIwYJKoZIhvcNAQkBFhZzb2Z0d2FyZUBzbmFwbWFrZXIuY29tMB4XDTI1MDYxMzAwMDAwMFoXDTM1MDYxMTAwMDAwMFowaDEUMBIGA1UEAwwLbXF0dC1icm9rZXIxFjAUBgNVBAoMDXNuYXBtYWtlci5jb20xETAPBgNVBAsMCHNvZnR3YXJlMSUwIwYJKoZIhvcNAQkBFhZzb2Z0d2FyZUBzbmFwbWFrZXIuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqpeKQ5Khf1AgqMA56ZnVoroJ12s1QR498F9ddE9aQ7N3CihvFL5h+v9gtXMXMe/+MddCHmbkIxZTdeXQrR/splsVRB/u9nMNREZgd6yEysE3msiwqn1zpfIm+hsg/zOvhGMZEVVSA9zrgmbAhZKkoykfVBZ2HXpDWlysNfreZLMOvRjtciJ1Kwqp3jAKMXKH5xU2NS8FYKEgkdKlq2IK8478947ovicRSZk454QOlpbJpk4TIZQMU9fZbTM7t0wCfVdSlkGiB2oiAK4mSmx0WJhEjZmWQgID1U/2ECXOo8o92Qt2MvWZP1nqfaP3PFXifwW9mqqxO2/+Xt1YI4p7CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBxjAdBgNVHQ4EFgQUr/YO+2JshHKFbvvMVRBNcwBZyhwwHwYDVR0jBBgwFoAUr/YO+2JshHKFbvvMVRBNcwBZyhwwDQYJKoZIhvcNAQELBQADggEBACpZI31bGfnQmncZQXfUREuJMvSRGIBgBebgOCU9kSJ5pf2nZj4ycICWFz8lEd7+jWEcx0+CSZtsosP48GwYas/CvazU7RgzTYwDk3ZPb1Gc+JCXO7RWcKAd5x1sj6vXmnCpdntWfVgYW3fbg6cx4JiyA39rtGo+su3vBijizouRnrQV/hhiEnu60r4FWPehBcIaBHyPjl5EU6BpJKBkMx1CYABvcwhQ9xeK5l6S+wIZEsKl6c8GMlixQH0sCJM+jYruiqUOhbVy6sYz+SZcYOcfXe2tCWAY3Q6FtBLr2brxeI9Tbc6Sf45yxR5efAtdinxlgv0/257QJUPbk0thnZA=-----END CERTIFICATE-----",
"cert": "-----BEGIN CERTIFICATE-----MIIDuTCCAqGgAwIBAgIUda0rZOToskohrJJ1uviTzse9OkEwDQYJKoZIhvcNAQELBQAwaDEUMBIGA1UEAwwLbXF0dC1icm9rZXIxFjAUBgNVBAoMDXNuYXBtYWtlci5jb20xETAPBgNVBAsMCHNvZnR3YXJlMSUwIwYJKoZIhvcNAQkBFhZzb2Z0d2FyZUBzbmFwbWFrZXIuY29tMB4XDTI1MDYxMzAwMDAwMFoXDTM1MDYxMTAwMDAwMFowFDESMBAGA1UEAwwJbXF0dF9jbGkyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/xMcTp4BoEn9lj+qd4ldYGIO5VpM2CpG3oc8HM1nLrLlZcMw5xSeaXK0zG/i/X43znJKzIWSYIFZYZvU5MkX2dDvRVMQbmML01jG/n8FfLCTRQ76eAOCz11Ilhur5wvp7Er+QAg17bLIt6qX41IN2Lm5lELJq7CkreEfcQniZ1EfaRnsdv2xMkJ9vN/hFhc+Sm4DtNklctWuZVPTB3wDQnD2XlqBc1bG+10Nn1Pt/lNudOPMj1RxB3akDKb1bDFiidCB9S87rrZfJFjIChdzUvVdF+v4r2RiTsZ8DPHkrA48xoCXhEPQR+KyV4O4VeKFXYh3tGV3bNmGkuVhZGzFnQIDAQABo4GuMIGrMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgOoMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDAdBgNVHQ4EFgQUrXar8N/Ek2lR49/mordIGaYaS6AwHwYDVR0jBBgwFoAUr/YO+2JshHKFbvvMVRBNcwBZyhwwLAYDVR0RBCUwI4IJbG9jYWxob3N0hwR/AAABhxAAAAAAAAAAAAAAAAAAAAABMA0GCSqGSIb3DQEBCwUAA4IBAQAWHBiJipmVhHwmkfatBdUqVfNo7GGPvZQXMPrU1fxKnXHb2NdsKxE4+Q4P9nFlYtq5SkB4yu8fYE2Add2dknXj4D2S5Zo1MhNHMPh0rUDDu8P8abV3t8FhUh71QxwTv1HDiTy7uCGPZXnRhIIL9hlzQoUF4OjpwXN2vLSiTCaYj/BlJMM8a3u2zeaHHQ8fPhHSem97aTW4cLsotmGfVrbliL9uuKb7/0eEb6sYMpKU00+7HIke0BeejAkUgsqDqXZS3ZTmWxa0kmmkhVUwUR/I0siiXFhkLkB70Ics9fGI72Jg9TvYUdllCvF3USuJFWjJMrrQgpIy/aONrNTwb92f-----END CERTIFICATE-----",
"clientId": "172.18.0.119",
"connected": false,
"dev_id": "BE003F28DE84E00E",
"name": "name:BE003F28DE84E00E",
"dev_name": "BE003F28DE84E00E",
"img": "http://localhost:13619/profiles/Snapmaker/Snapmaker test_cover.png",
"ip": "172.18.1.19",
"key": "-----BEGIN RSA PRIVATE KEY-----MIIEpAIBAAKCAQEA/xMcTp4BoEn9lj+qd4ldYGIO5VpM2CpG3oc8HM1nLrLlZcMw5xSeaXK0zG/i/X43znJKzIWSYIFZYZvU5MkX2dDvRVMQbmML01jG/n8FfLCTRQ76eAOCz11Ilhur5wvp7Er+QAg17bLIt6qX41IN2Lm5lELJq7CkreEfcQniZ1EfaRnsdv2xMkJ9vN/hFhc+Sm4DtNklctWuZVPTB3wDQnD2XlqBc1bG+10Nn1Pt/lNudOPMj1RxB3akDKb1bDFiidCB9S87rrZfJFjIChdzUvVdF+v4r2RiTsZ8DPHkrA48xoCXhEPQR+KyV4O4VeKFXYh3tGV3bNmGkuVhZGzFnQIDAQABAoIBACiUZ385Y3xW8R1HZS0NwTl9eC20Sz/jn/E0lhNl+Smkg9rH7h6BOP+BJHLWxQe7nhC9vZkikepBAdGFy12XgXAhbYN7psRNBRtbRxNDbYHMDK3ip2XS9ytaxZq97b/89Prm5mKU+9FkTUrs/KuJSRMm3vePlYp3OIfCJjCjWC3D2JrhBV8AuIzRFALeQ7OW1ZBv+h616HMjvnZnaCjqdXU3GV/Ddz5M2P4/2QY+vvKVa5t5I2HqdWSAuNOy5gG/D30zCvBkT64by3Eu80A2gkGqilXZ9W8xFDRVWXW8VEdhZGVrm+fpTe2SjIUQlnTpsyfy4ntU96hIwxpwhx8oZHECgYEA/+XBtzX0fM7SYAH1baqrcMd/FS82zEuwrEKsg3WWlBBeOJe6K8q24QcrZFBKUlBkOkRkdDydKZnTWLDpDRe6n96k+NXh+0qahsYJPPeipRedxQAlf4q7moJ5UMYoU4rAksDcSaM9POF1NpQGtrNGOrzu93UGI8VEiAWAbbhPNY0CgYEA/y1E/SSNPtXBZ4hqOzImPs52+YFLLgFYkWgyusr5Tqua5Nf+4ivcP924IKX36BG8JxMLtUfvS9MEHmi+U3cWtTT80cJOQzkJXIJeuyyi2A+ng/MPixT4JuOxgWhk1hCVngUgRcN7lskNmzOUAAh3bEF3Z3Sfsy+N/LMhNR1pJFECgYEAvy6ler65yWEvtYDhHyzqZxj07hvXIezOsvQhNRnuBPLxofBhrAQIe7jCh3ChBjx/lTSxpFIAzSraxqFtjFWVHYnW0P3ilr7XEif0kPMmNZeeTKdeXJqGrNobzugtCrVYSIwESJPH1atPyhXvqiHoL0wmcQSiMKlaGRGbMN4Jd6UCgYBWniE65Htlht19rVqR+XXt/9t22iKQ3TgZM4t0yI1T3QBZCdClKUo8C6ECxBOgnNSHVvm0cVSTIm/VeqyQXG5C2FexRAmY2/WHh2Fsm7wzJy0vpwPxrA6H9OY+DRedake/OfI4fCCpkFmkAyAL2tPe1WIYpgfHpS7HRm7RPsh/4QKBgQD5rtZ3hIbXz+AsdvZEsA2fZTxxfKtR8Ept5IAuc43RrH4yRPhnaGDa16CPQuhq6zeD4hsQNRQ822hVQrJT5Kx3tw6qaExJ+1dEUAEbBbkc0vAuagbWwI6H7SZQQ+EYQ/hOqkszrP1JVYCErk64pKC1wQU3Xxe2rTfuHCaOxJ3cVA==-----END RSA PRIVATE KEY-----",
"link_mode": "lan",
"model_name": "Snapmaker test",
"nozzle_sizes": [
0.4,
0.4,
0.4,
0.4
],
"password": "cuzw3WaCiBgt5WQ4",
"port": 8883,
"preset_name": "Snapmaker test (0.4 nozzle)",
"protocol": 0,
"sn": "BE003F28DE84E00E",
"user": "cli2",
"userid": ""
}
]
}
function simulateResponse(jsonMessage) {
try {
// 反序列化 header 和 payload
const data = JSON.parse(jsonMessage);
var header = data.header;
var payload = data.payload;
// 反序列化 header 和 payload
header['event_id'] = payload['event_id'];
header['cmd'] = payload['cmd']
// 开始机器发现
var result;
if (header['cmd'] == 'sw_SaveFile'){
//saveFile();
// 检查点击事件绑定
return;
}
if(header['cmd'] =='sw_GetPincode'){
var mokeData={
"header": header,
"payload": {
'code': 200,
'method': 'html.test.sw_GetPincode',
'data': {
"pin_code": "12345678",
"state": "success"
},
'message': 'ok',
}
};
window.postMessage(JSON.stringify(mokeData), '*'); // 调用 window.postMessage 传递消息给 flutter
return;
} else if(header['cmd'] =='sw_StartMachineFind'){
if(header['event_id'] != null) {
header['cmd'] = null;
}
result = getDeviceData();
var mokeData={
"header": header,
"payload": {
'code': 200,
'method': 'html.test',
'data': result,
'message': 'ok',
}
};
window.postMessage(JSON.stringify(mokeData), '*'); // 调用 window.postMessage 传递消息给 flutter
return;
} else if(header['cmd'] =='sw_GetMachineState'){
result = {
"eventtime": 578243.57824499,
"status": {
"gcode_move": {
"absolute_coordinates": true,
"absolute_extrude": true,
"extrude_factor": 1,
"gcode_position": [0, 0, 0, 0],
"homing_origin": [0, 0, 0, 0],
"position": [0, 0, 0, 0],
"speed": 1500,
"speed_factor": 1
},
"toolhead": {
"position": [0, 0, 0, 0],
"status": "Ready"
},
"print_stats": {
"filename": "1.gocde"
},
"print_task_config": getMachineFilamentMapping(),
}
};
} else if(header['cmd'] =='sw_GetConnectedMachine'){
result = sw_GetConnectedMachine();
var mokeData={
"header": header,
"payload": {
'code': 200,
'method': 'html.test.sw_GetConnectedMachine',
'data': result,
'message': 'ok',
}
};
window.postMessage(JSON.stringify(mokeData), '*'); // 调用 window.postMessage 传递消息给 flutter
return;
} else if (header['cmd'] =='sw_MachineFilesMetadata') {
result = sw_MachineFilesMetadata();
} else if (header['cmd'] == 'sw_GetPrinterInfo') {
result = {
"state": "ready",
"state_message": "Printer is ready",
"hostname": "lava, klipper_path: /oem/klipper",
"python_path": "/oem/klippy-env/bin/python",
"process_id": 826,
"user_id": 1000,
"group_id": 1000,
"log_file": "/userdata/printer_data/logs/klippy.log",
"config_file": "/userdata/printer_data/config/printer.cfg",
"software_version": "e60ce92d-dirty",
"cpu_info": "4 core ?"
};
} else if(header['cmd'] == 'sw_GetMachineObjects') {
result = {
"objects": [
"gcode",
"webhooks",
"configfile",
"mcu",
"mcu linux",
"heaters",
"bme280 chamber",
"temperature_sensor chamber",
"filament_switch_sensor extruder_sensor",
"output_pin sensor_toggle",
"gcode_move",
"bed_mesh",
"exclude_object",
"temperature_host RPi",
"temperature_sensor RPi",
"gcode_macro TURN_OFF_MOTORS",
"gcode_macro SET_HOMING_CURRENT",
"temperature_sensor ambient",
"gcode_macro query_bme280",
"pause_resume",
"print_stats",
"virtual_sdcard",
"probe",
"stepper_enable",
"tmc2130 stepper_x",
"tmc2130 stepper_y",
"tmc2130 stepper_z",
"tmc2130 extruder",
"heater_bed",
"heater_fan nozzle_cooling_fan",
"fan",
"menu",
"display_status",
"output_pin BEEPER_pin",
"idle_timeout",
"motion_report",
"query_endstops",
"system_stats",
"manual_probe",
"toolhead",
"extruder"
]
};
} else if (header['cmd'] == 'sw_GetMachineSystemInfo') {
result = {
"system_info": {
"provider": "systemd_dbus",
"cpu_info": {
"cpu_count": 4,
"bits": "32bit",
"processor": "armv7l",
"cpu_desc": "ARMv7 Processor rev 4 (v7l)",
"serial_number": "b898bdb4",
"hardware_desc": "BCM2835",
"model": "Raspberry Pi 3 Model B Rev 1.2",
"total_memory": 945364,
"memory_units": "kB"
},
"sd_info": {
"manufacturer_id": "03",
"manufacturer": "Sandisk",
"oem_id": "5344",
"product_name": "SU32G",
"product_revision": "8.0",
"serial_number": "46ba46",
"manufacturer_date": "4/2018",
"capacity": "29.7 GiB",
"total_bytes": 31914983424
},
"distribution": {
"name": "Raspbian GNU/Linux 10 (buster)",
"id": "raspbian",
"version": "10",
"version_parts": {
"major": "10",
"minor": "",
"build_number": ""
},
"like": "debian",
"codename": "buster"
},
"available_services": [
"klipper",
"klipper_mcu",
"moonraker"
],
"instance_ids": {
"moonraker": "moonraker",
"klipper": "klipper"
},
"service_state": {
"klipper": {
"active_state": "active",
"sub_state": "running"
},
"klipper_mcu": {
"active_state": "active",
"sub_state": "running"
},
"moonraker": {
"active_state": "active",
"sub_state": "running"
}
},
"virtualization": {
"virt_type": "none",
"virt_identifier": "none"
},
"python": {
"version": [
3,
9,
2,
"final",
0
],
"version_string": "3.9.2 (default, Feb 28 2021, 17:03:44) [GCC 10.2.1 20210110]"
},
"network": {
"wlan0": {
"mac_address": "<redacted_mac>",
"ip_addresses": [
{
"family": "ipv4",
"address": "192.168.1.127",
"is_link_local": false
},
{
"family": "ipv6",
"address": "<redacted_ipv6>",
"is_link_local": false
},
{
"family": "ipv6",
"address": "fe80::<redacted>",
"is_link_local": true
}
]
}
},
"canbus": {
"can0": {
"tx_queue_len": 128,
"bitrate": 500000,
"driver": "mcp251x"
},
"can1": {
"tx_queue_len": 128,
"bitrate": 500000,
"driver": "gs_usb"
}
}
}
};
} else if (header['cmd'] == 'camera.start_monitor') {
result = {
'code': -1,
'data': null,
'message': 'failure to start monitor'
};
var mokeData={
"header": {
"seqid": header['seqid']
},
"payload": result
};
// console.log("simulateResponse message: " + JSON.stringify(mokeData) );
window.postMessage(JSON.stringify(mokeData), '*'); // 调用 window.postMessage 传递消息给 flutter
return;
} else if (header['cmd'] == 'camera.stop_monitor') {
result = {
'code': -1,
'data': null,
'message': 'failure to stop monitor'
};
var mokeData={
"header": {
"seqid": header['seqid']
},
"payload": result
};
// console.log("simulateResponse message: " + JSON.stringify(mokeData) );
window.postMessage(JSON.stringify(mokeData), '*'); // 调用 window.postMessage 传递消息给 flutter
return;
} else if (header['cmd'].startsWith('server.')) {
result = {
'code': -1,
'data': null,
'message': 'failure to ' + header['cmd']
};
var mokeData={
"header": {
"seqid": header['seqid']
},
"payload": result
};
// console.log("simulateResponse message: " + JSON.stringify(mokeData) );
window.postMessage(JSON.stringify(mokeData), '*'); // 调用 window.postMessage 传递消息给 flutter
return;
} else if (header['cmd'] == 'sw_GetFileFilamentMapping') {
result = getFileFilamentMapping();
var mokeData={
"header": {
"seqid": header['seqid']
},
"payload": {
'code': 200,
'data': result,
'message': 'ok',
}
};
window.postMessage(JSON.stringify(mokeData), '*');
return;
} else if (header['cmd'] == 'sw_SetFilamentMappingComplete') {
result = null;
} else if (header['cmd'] == 'sw_GetMachineFilamentMapping') {
result = getMachineFilamentMapping();
} else if (header['cmd'] == 'sw_GetLocalDevices') {
result = sw_GetLocalDevices();
var mokeData={
"header": {
"seqid": header['seqid']
},
"payload": {
'code': 200,
'data': result,
'message': 'ok',
}
};
window.postMessage(JSON.stringify(mokeData), '*');
return;
}
var mokeData={
"header": {
"seqid": header['seqid']
},
"payload": {
'code': 200,
'data': {
'data': result,
'method': 'html.test.' + header['cmd'],
},
'message': 'ok',
}
};
window.postMessage(JSON.stringify(mokeData), '*'); // 调用 window.postMessage 传递消息给 flutter
} catch (error) {
console.error("Error parsing JSON:", error);
}
}
function ackResponse(jsonMessage) {
try {
// 反序列化 header 和 payload
const data = JSON.parse(jsonMessage);
var header = data.header;
var payload = data.payload;
// 反序列化 header 和 payload
// header['event_id'] = payload['event_id'];
if(payload['event_id'] != null) {
// alert(jsonMessage);
// header['event_id'] = payload['event_id'];
header['event_id'] = null;
header['cmd'] = null;
var mokeData={
"header": header,
"payload": {
'code': 200,
'data': null,
'message': 'ok',
}
};
window.postMessage(JSON.stringify(mokeData), '*'); // 调用 window.postMessage 传递消息给 flutter
}
} catch (error) {
console.error("Error parsing JSON:", error);
}
}
window.sendMessage = function (message) {
// console.log("I am proxy in html to send message to container: " + message);
// 调用 window.postMessage 传递消息给 flutter
window.wx && window.wx.postMessage(message); // 调用 window.postMessage 传递消息给 原生系统
///模拟收到响应结果5000
if(!window.wx) {
// 我不能发现 window.wx
console.log('i dont find window.wx, so i simulate a return by postMessage, debug 模式可以使用 debug_server.js 打开orca')
//收到请求后,模拟收到响应结果
// ackResponse(message);
// setTimeout(simulateResponse(message), 5000)
}
}
</script>
<!-- <img src="http://127.0.0.1:13619/profiles/Snapmaker/Snapmaker Artisan_cover.png" alt="Snapmaker Orca" style="width: 100px; height: 100px;"> -->
<!-- 测试 -->
<script>
function Get_WCP_Body(seqid, cmd, params, eventid){
let wcp_body = {
header: {
seqId: seqid,
},
payload: {
cmd: cmd,
params: params,
event_id: eventid,
}
}
// return JSON.stringify(wcp_body);
return wcp_body;
}
function Send_to_WCP(wcp_body){
window.wx.postMessage(JSON.stringify(wcp_body));
}
window.addEventListener("message", function(event){
console.log(event.data);
});
document.getElementById("btn_newproject").addEventListener("click", function() {
let wcp_body = Get_WCP_Body(1, "sw_NewProject", {}, "");
Send_to_WCP(wcp_body);
});
document.getElementById("btn_openproject").addEventListener("click", function() {
let wcp_body = Get_WCP_Body(2, "sw_OpenProject", {}, "");
Send_to_WCP(wcp_body);
});
document.getElementById("btn_getrecentprojects").addEventListener("click", function() {
let wcp_body = Get_WCP_Body(3, "sw_GetRecentProjects", {}, "");
Send_to_WCP(wcp_body);
});
document.getElementById("btn_openrecentfile").addEventListener("click", function() {
let path = "C:\\Users\\Administrator\\Downloads\\matte耗材参数包.3mf";
let wcp_body = Get_WCP_Body(4, "sw_OpenRecentFile", {path: path}, "");
Send_to_WCP(wcp_body);
});
document.getElementById("btn_deleterecentfiles").addEventListener("click", function() {
let paths = ["C:\\Users\\Administrator\\Downloads\\111.3mf"];
let wcp_body = Get_WCP_Body(5, "sw_DeleteRecentFiles", {paths: paths}, "");
Send_to_WCP(wcp_body);
});
document.getElementById("btn_subscriberecentfiles").addEventListener("click", function() {
let event_id = "2025";
let wcp_body = Get_WCP_Body(6, "sw_SubscribeRecentFiles", {}, event_id);
Send_to_WCP(wcp_body);
});
document.getElementById("btn_setcache").addEventListener("click", function() {
// 弹出输入框输入key和value
let key = prompt("请输入key");
let value = prompt("请输入value");
let objects = [
{
key: key,
value: value,
},
]
let wcp_body = Get_WCP_Body(7, "sw_SetCache", {objects: objects}, "");
Send_to_WCP(wcp_body);
});
document.getElementById("btn_getcache").addEventListener("click", function() {
// 弹出输入框 输入key
let key = prompt("请输入key");
let keys = [key];
let wcp_body = Get_WCP_Body(8, "sw_GetCache", {keys: keys}, "");
Send_to_WCP(wcp_body);
});
document.getElementById("btn_deletecache").addEventListener("click", function() {
// 弹出输入框 输入key
let key = prompt("请输入key");
let keys = [key];
let wcp_body = Get_WCP_Body(9, "sw_RemoveCache", {keys: keys}, "");
Send_to_WCP(wcp_body);
});
document.getElementById("btn_login").addEventListener("click", function() {
let wcp_body = Get_WCP_Body(10, "sw_UserLogin", {}, "");
Send_to_WCP(wcp_body);
});
document.getElementById("btn_logout").addEventListener("click", function() {
let wcp_body = Get_WCP_Body(11, "sw_UserLogout", {}, "");
Send_to_WCP(wcp_body);
});
document.getElementById("btn_getloginstate").addEventListener("click", function() {
let wcp_body = Get_WCP_Body(12, "sw_GetUserLoginState", {}, "");
Send_to_WCP(wcp_body);
});
document.getElementById("btn_subscribeloginstate").addEventListener("click", function() {
let event_id = "2026";
let wcp_body = Get_WCP_Body(13, "sw_SubscribeUserLoginState", {}, event_id);
Send_to_WCP(wcp_body);
});
document.getElementById("btn_getlocaldevices").addEventListener("click", function() {
let wcp_body = Get_WCP_Body(14, "sw_GetLocalDevices", {}, "");
Send_to_WCP(wcp_body);
});
document.getElementById("btn_addDevice").addEventListener("click", function() {
let wcp_body = Get_WCP_Body(15, "sw_AddDevice", {}, "");
Send_to_WCP(wcp_body);
});
document.getElementById("btn_subscribelocaldevices").addEventListener("click", function() {
let event_id = "2027";
let wcp_body = Get_WCP_Body(16, "sw_SubscribeLocalDevices", {}, event_id);
Send_to_WCP(wcp_body);
});
document.getElementById("btn_renamedevice").addEventListener("click", function() {
let dev_id = "58317961E7DBEF34";
let wcp_body = Get_WCP_Body(17, "sw_RenameDevice", {dev_id: dev_id, dev_name: "test"}, "");
Send_to_WCP(wcp_body);
});
document.getElementById("btn_switchmodel").addEventListener("click", function() {
let dev_id = "58317961E7DBEF34";
let wcp_body = Get_WCP_Body(18, "sw_SwitchModel", {dev_id: dev_id}, "");
Send_to_WCP(wcp_body);
});
document.getElementById("btn_deletedevices").addEventListener("click", function() {
let dev_ids = ["58317961E7DBEF34"];
let wcp_body = Get_WCP_Body(19, "sw_DeleteDevices", {dev_ids: dev_ids}, "");
Send_to_WCP(wcp_body);
});
</script>
</body>
</html>