add:增加文档和上位机

This commit is contained in:
2026-05-21 12:56:29 +08:00
parent 8ee0849831
commit a1d1f19585
95 changed files with 8594 additions and 43 deletions

BIN
Core.zip

Binary file not shown.

View File

@@ -6,9 +6,7 @@ packDir: .pack/Keil/STM32H7xx_DFP.4.1.0
srcDirs: []
virtualFolder:
name: <virtual_root>
files:
- path: ../README.md
- path: ../../Doc/云快充平台协议V1.6.pdf
files: []
folders:
- name: Application
files: []
@@ -116,14 +114,14 @@ virtualFolder:
- path: ../User/Protocol/Ykc/server_to_charger.h
- path: ../User/Protocol/Ykc/ykc_router.c
folders: []
- name: Point
files:
- path: ../User/Protocol/Point/point_protocol.c
folders: []
- name: Host Computer
files:
- path: ../User/Protocol/Host Computer/host_computer_protocol.c
folders: []
- name: Point
files:
- path: ../User/Protocol/Point/point_protocol.c
folders: []
- name: Drivers
files: []
folders:

View File

@@ -1,2 +0,0 @@
### 生产代码设置
- /User/Global/g_decpile -> void init_chargers(void) 需要修改预设 ,从电桩全局结构体拿

View File

@@ -92,11 +92,11 @@ void drv_air724_set_server(const char *ip, uint16_t port)
void drv_air724_connect_channel(uint8_t channel)
{
if (channel < 1 || channel > AIR724_SOCKET_MAX) {
printf("4G: 通道 %d 无效 \r\n", channel);
printf("[ 4G ] 通道 %d 无效 \r\n", channel);
return;
}
drv_air724_send_cmd(0x03, 0x01, &channel, 1);
printf("4G: 通道 %d 连接请求已发送 \r\n", channel);
printf("[ 4G ] 通道 %d 连接请求已发送 \r\n", channel);
}
/**
@@ -108,11 +108,11 @@ void drv_air724_connect_channel(uint8_t channel)
void drv_air724_disconnect_channel(uint8_t channel)
{
if (channel < 1 || channel > AIR724_SOCKET_MAX) {
printf("4G: 通道 %d 无效\r\n", channel);
printf("[ 4G ] 通道 %d 无效\r\n", channel);
return;
}
drv_air724_send_cmd(0x03, 0x02, &channel, 1);
printf("4G: 通道 %d 断开请求已发送\r\n", channel);
printf("[ 4G ] 通道 %d 断开请求已发送\r\n", channel);
}
/**
@@ -186,15 +186,15 @@ void drv_air724_parse_response(const uint8_t *frame, uint16_t len)
switch (sub_cmd) {
case 0x01:
g_air724_info.socket_connected[socket_id - 1] = 1;
printf("4G: 通道 %d 连接成功\r\n", socket_id);
printf("[ 4G ] 通道 %d 连接成功\r\n", socket_id);
break;
case 0x02:
g_air724_info.socket_connected[socket_id - 1] = 0;
printf("4G: 通道 %d 已断开\r\n", socket_id);
printf("[ 4G ] 通道 %d 已断开\r\n", socket_id);
break;
case 0x03:
g_air724_info.socket_connected[socket_id - 1] = 0;
printf("4G: 通道 %d 连接失败\r\n", socket_id);
printf("[ 4G ] 通道 %d 连接失败\r\n", socket_id);
break;
}
}
@@ -210,17 +210,17 @@ void drv_air724_parse_response(const uint8_t *frame, uint16_t len)
case 0x01:
memcpy(g_air724_info.iccid, &frame[5], data_len < 23 ? data_len : 23);
g_air724_info.iccid[data_len < 23 ? data_len : 23] = '\0';
printf("4G: ICCID=%s\r\n", g_air724_info.iccid);
printf("[ 4G ] ICCID=%s\r\n", g_air724_info.iccid);
break;
case 0x02:
memcpy(g_air724_info.imsi, &frame[5], data_len < 15 ? data_len : 15);
g_air724_info.imsi[data_len < 15 ? data_len : 15] = '\0';
printf("4G: IMSI=%s\r\n", g_air724_info.imsi);
printf("[ 4G ] IMSI=%s\r\n", g_air724_info.imsi);
break;
case 0x03:
memcpy(g_air724_info.imei, &frame[5], data_len < 15 ? data_len : 15);
g_air724_info.imei[data_len < 15 ? data_len : 15] = '\0';
printf("4G: IMEI=%s\r\n", g_air724_info.imei);
printf("[ 4G ] IMEI=%s\r\n", g_air724_info.imei);
break;
}
break;
@@ -231,7 +231,7 @@ void drv_air724_parse_response(const uint8_t *frame, uint16_t len)
if (len >= 7) {
g_air724_info.csq = frame[4];
g_air724_info.ber = frame[5];
printf("4G: CSQ=%d, BER=%d\r\n", g_air724_info.csq, g_air724_info.ber);
printf("[ 4G ] CSQ=%d, BER=%d\r\n", g_air724_info.csq, g_air724_info.ber);
}
break;
@@ -241,7 +241,7 @@ void drv_air724_parse_response(const uint8_t *frame, uint16_t len)
for (uint8_t i = 0; i < count; i++) {
g_air724_info.socket_connected[i] = frame[4 + i];
}
printf("4G: 链路[");
printf("[ 4G ] 链路[");
for (uint8_t i = 0; i < AIR724_SOCKET_MAX; i++) {
printf("%d", g_air724_info.socket_connected[i]);
}
@@ -252,7 +252,7 @@ void drv_air724_parse_response(const uint8_t *frame, uint16_t len)
/* ── 0x87: 服务器配置结果 ── */
case 0x87:
if (len >= 6) {
printf("4G: 服务器配置%s\r\n", frame[4] == 0 ? "成功" : "失败");
printf("[ 4G ] 服务器配置%s\r\n", frame[4] == 0 ? "成功" : "失败");
}
break;
}

View File

@@ -134,7 +134,7 @@ void host_computer_on_get_status(uint8_t id, cJSON *json_pack)
udp_send_to_server(str, strlen(str));
free(str);
cJSON_Delete(root);
printf("get_status 回复已发送 \r\n");
printf("[ 上位机 ] get_status 回复已发送 \r\n");
}
/**
@@ -146,7 +146,7 @@ void host_computer_on_get_status(uint8_t id, cJSON *json_pack)
void host_computer_on_reboot(uint8_t id, cJSON *json)
{
(void) id;
printf("host_computer_on_reboot\r\n");
printf("[ 上位机 ] host_computer_on_reboot\r\n");
__ASM volatile("cpsid i");
HAL_NVIC_SystemReset();
}
@@ -285,11 +285,11 @@ void host_computer_report_data(uint8_t stake_index, uint8_t gun_id)
{
udp_send_to_server(str, strlen(str));
free(str);
printf("南向:主动上报桩 %d 枪 %d 主动上报数据成功 \r\n", stake_index, gun_id);
printf("[ 上位机 ] 南向:主动上报桩 %d 枪 %d 主动上报数据成功 \r\n", stake_index, gun_id);
}
else
{
printf("Failed to print JSON for report_data\r\n");
printf("[ 上位机 ] Failed to print JSON for report_data\r\n");
}
cJSON_Delete(root);

View File

@@ -30,7 +30,7 @@ void charger_to_server_0X01(uint8_t stake_index)
data.net_conn_type = g_charger_manager.charger_piles[stake_index - 1].login_info.net_conn_type;
data.tele_factory = g_charger_manager.charger_piles[stake_index - 1].login_info.tele_factory;
memcpy(data.sim, g_charger_manager.charger_piles[stake_index - 1].login_info.sim, 10);
printf("北向:对电桩 %d 发送登录认证\r\n", stake_index);
printf("[ 北向 ] 对电桩 %d 发送登录认证\r\n", stake_index);
pack_and_send_server_data(FRAME_TYPE_0X01, (uint8_t *)&data, sizeof(PACK_DATA_0X01), stake_index);
}
@@ -47,7 +47,7 @@ void charger_to_server_0X03(uint8_t stake_index, uint8_t gun_index)
load_charger_serial(stake_index, data.charger_serial); // 加载充电桩序列号
data.gun_index = ((gun_index / 10) << 4) | (gun_index % 10);
data.gun_status = g_charger_manager.charger_piles[stake_index - 1].guns[gun_index - 1].heartbeat_status_data.gun_status;
printf("北向:对电桩 %d 发送心跳请求,枪号:%d状态%d\r\n", stake_index, gun_index, data.gun_status);
printf("[ 北向 ] 对电桩 %d 发送心跳请求,枪号:%d状态%d\r\n", stake_index, gun_index, data.gun_status);
pack_and_send_server_data(FRAME_TYPE_0X03, (uint8_t *)&data, sizeof(PACK_DATA_0X03), stake_index);
}
@@ -63,7 +63,7 @@ void charger_to_server_0X05(uint16_t num, uint8_t stake_index)
load_charger_serial(stake_index, data.charger_serial); // 加载充电桩序列号
data.fee_model_no = num;
printf("北向:对电桩 %d 计费模型验证请求,模型号:%d\r\n", stake_index, num);
printf("[ 北向 ] 对电桩 %d 计费模型验证请求,模型号:%d\r\n", stake_index, num);
pack_and_send_server_data(FRAME_TYPE_0X05, (uint8_t *)&data, sizeof(PACK_DATA_0X05), stake_index);
}
@@ -76,7 +76,7 @@ void charger_to_server_0X09(uint8_t stake_index)
{
PACK_DATA_0X09 data = {0};
load_charger_serial(stake_index, data.charger_serial); // 加载充电桩序列号
printf("北向:对电桩 %d 计费模型请求\r\n", stake_index);
printf("[ 北向 ] 对电桩 %d 计费模型请求\r\n", stake_index);
pack_and_send_server_data(FRAME_TYPE_0X09, (uint8_t *)&data, sizeof(PACK_DATA_0X09), stake_index);
}
@@ -123,7 +123,7 @@ void charger_to_server_0X19(uint8_t stake_index, uint8_t gun_index)
load_charger_serial(stake_index, data.charger_serial);
load_trade_serial(stake_index, gun_index, data.trade_serial);
data.gun_index = ((gun_index / 10) << 4) | (gun_index % 10);
printf("北向:对电桩 %d 枪 %d 的充电结束上报 \r\n", stake_index, gun_index);
printf("[ 北向 ] 对电桩 %d 枪 %d 的充电结束上报 \r\n", stake_index, gun_index);
pack_and_send_server_data(FRAME_TYPE_0X19, (uint8_t *)&data, sizeof(PACK_DATA_0X19), stake_index);
}
@@ -164,7 +164,7 @@ void charger_to_server_0X35(uint8_t stake_index, uint8_t gun_index, uint8_t resu
data.result = result;
data.err_code = err_code;
printf("北向:对电桩 %d 的平台停机回复,结果:%d错误码%d\r\n", stake_index, result, err_code);
printf("[ 北向 ] 对电桩 %d 的平台停机回复,结果:%d错误码%d\r\n", stake_index, result, err_code);
pack_and_send_server_data(FRAME_TYPE_0X35, (uint8_t *)&data, sizeof(PACK_DATA_0X35), stake_index);
}
@@ -219,7 +219,7 @@ void charger_to_server_0X3B(uint8_t stake_index, uint8_t gun_index)
memcpy(data.phy_cardid, gun->fee_data.phy_cardid, 8); // 物理卡号
printf("========================================\r\n");
printf("北向:对电桩 %d 枪 %d 上传交易记录(0x3B),电量:%.2f,金额:%.2f\r\n",
printf("[ 北向 ] 对电桩 %d 枪 %d 上传交易记录(0x3B),电量:%.2f,金额:%.2f\r\n",
stake_index, gun_index, data.total_energy / 10000.0f, data.consumption / 10000.0f);
printf("\r\n========================================\r\n");
pack_and_send_server_data(FRAME_TYPE_0X3B, (uint8_t *)&data, sizeof(PACK_DATA_0X3B), stake_index);
@@ -237,6 +237,6 @@ void charger_to_server_0x57(uint8_t stake_index)
load_charger_serial(stake_index, data.charger_serial);
data.result = 0x01;
printf("北向:对电桩 %d 的计费模型主动更新回复\r\n", stake_index);
printf("[ 北向 ] 对电桩 %d 的计费模型主动更新回复\r\n", stake_index);
pack_and_send_server_data(FRAME_TYPE_0X57, (uint8_t *)&data, sizeof(PACK_DATA_0X57), stake_index);
}

View File

@@ -27,7 +27,7 @@ void on_cmd_frame_type_0X02(uint8_t stake_index, SERVER_PACK *pack)
{
g_charger_manager.charger_piles[stake_index - 1].is_online = 1;
#ifdef DEBUG
printf("北向:桩ID %d 登陆成功!\r\n", stake_index);
printf("[ 北向 ] 桩ID %d 登陆成功!\r\n", stake_index);
#endif
}
}
@@ -43,7 +43,7 @@ void on_cmd_frame_type_0X04(uint8_t stake_index, SERVER_PACK *pack)
PACK_DATA_0X04 data;
memcpy(&data, pack->data, sizeof(PACK_DATA_0X04));
#ifdef DEBUG
printf("北向:桩ID %d 收到心跳应答!\r\n", stake_index);
printf("[ 北向 ] 桩ID %d 收到心跳应答!\r\n", stake_index);
#endif
}
@@ -59,7 +59,7 @@ void on_cmd_frame_type_0X06(uint8_t stake_index, SERVER_PACK *pack)
if (is_my_charger_serial(stake_index, data.charger_serial))
{
#ifdef DEBUG
printf("北向:接收到计费模型验证应答模型ID%d, 验证结果:%d\r\n", data.fee_model_no, data.result);
printf("[ 北向 ] 接收到计费模型验证应答模型ID%d, 验证结果:%d\r\n", data.fee_model_no, data.result);
#endif
}
}
@@ -81,7 +81,7 @@ void on_cmd_frame_type_0X0A(uint8_t stake_index, SERVER_PACK *pack)
#ifdef DEBUG
printf("北向:接收到计费模型应答,模型ID:%d\r\n", g_charger_manager.fee_model_global.fee_model_no);
printf("[ 北向 ] 接收到计费模型应答,模型ID:%d\r\n", g_charger_manager.fee_model_global.fee_model_no);
printf("尖电费率:%d 服务费:%d\r\n", g_charger_manager.fee_model_global.shark_fee_ratio, g_charger_manager.fee_model_global.shark_service_ratio);
printf("峰电费率:%d 服务费:%d\r\n", g_charger_manager.fee_model_global.peak_fee_ratio, g_charger_manager.fee_model_global.peak_service_ratio);
printf("平电费率:%d 服务费:%d\r\n", g_charger_manager.fee_model_global.flat_fee_ratio, g_charger_manager.fee_model_global.flat_service_ratio);
@@ -167,7 +167,7 @@ void on_cmd_frame_type_0X58(uint8_t stake_index, SERVER_PACK *pack)
#ifdef DEBUG
printf("北向:接收到计费模型应答,模型ID:%d\r\n", g_charger_manager.fee_model_global.fee_model_no);
printf("[ 北向 ] 接收到计费模型应答,模型ID:%d\r\n", g_charger_manager.fee_model_global.fee_model_no);
printf("尖电费率:%d 服务费:%d\r\n", g_charger_manager.fee_model_global.shark_fee_ratio, g_charger_manager.fee_model_global.shark_service_ratio);
printf("峰电费率:%d 服务费:%d\r\n", g_charger_manager.fee_model_global.peak_fee_ratio, g_charger_manager.fee_model_global.peak_service_ratio);
printf("平电费率:%d 服务费:%d\r\n", g_charger_manager.fee_model_global.flat_fee_ratio, g_charger_manager.fee_model_global.flat_service_ratio);
@@ -275,7 +275,7 @@ void on_cmd_frame_type_0X36(uint8_t stake_index, SERVER_PACK *pack)
uint8_t result = TRUE; // 默认停止结果成功
uint8_t err_code = 0; // 默认错误码为0
memcpy(&data, pack->data, sizeof(PACK_DATA_0X36));
printf("北向:平台控制停止充电,桩ID:%d, 枪ID:%d\r\n", stake_index, data.gun_index);
printf("[ 北向 ] 平台控制停止充电,桩ID:%d, 枪ID:%d\r\n", stake_index, data.gun_index);
if (!is_my_charger_serial(stake_index, data.charger_serial))
{
@@ -305,7 +305,7 @@ void on_cmd_frame_type_0X40(uint8_t stake_index, SERVER_PACK *pack)
memcpy(&data, pack->data, sizeof(PACK_DATA_0X40));
if (data.result == 0)
{
printf("北向:平台接收到交易记录,桩ID:%d, 交易记录:%s\r\n", stake_index, data.trade_serial);
printf("[ 北向 ] 平台接收到交易记录,桩ID:%d, 交易记录:%s\r\n", stake_index, data.trade_serial);
return;
}
}

671
Doc/README.md Normal file
View File

@@ -0,0 +1,671 @@
# BR_YKC 充电桩网关
基于 STM32H743 + AIR724 4G模块 的充电桩网关方案,对接**云快充**平台,支持通过**4G TCP**和**以太网UDP**双通道通信。
---
## 目录
- [硬件架构](#硬件架构)
- [软件架构](#软件架构)
- [目录结构](#目录结构)
- [通信拓扑](#通信拓扑)
- [三层状态机](#三层状态机)
- [通信协议](#通信协议)
- [南向协议(网关 ↔ 桩)](#南向协议网关--桩)
- [上位机协议(网关 ↔ 上位机APP](#上位机协议网关--上位机app)
- [北向协议(网关 ↔ 云快充)](#北向协议网关--云快充)
- [4G链路协议STM32 ↔ AIR724](#4g链路协议stm32--air724)
- [上位机 C# 客户端](#上位机-c-客户端)
- [项目结构](#项目结构)
- [页面功能](#页面功能)
- [通信机制](#通信机制)
- [数据存储](#数据存储)
- [配置参数](#配置参数)
- [配置指南](#配置指南)
- [修改桩编码(序列号)](#修改桩编码序列号)
- [修改桩数量](#修改桩数量)
- [修改每桩枪数](#修改每桩枪数)
- [配置云快充服务器地址](#配置云快充服务器地址)
- [Flash组件使用说明](#flash组件使用说明)
- [框架层 drv_flash](#框架层-drv_flash)
- [应用层 flash_config](#应用层-flash_config)
- [使用示例](#使用示例)
- [任务列表](#任务列表)
- [日志格式](#日志格式)
---
## 硬件架构
```
┌──────────────────────────────────────────────┐
│ STM32H743 │
│ │
│ UART1 ─── 4G模块(AIR724) ──→ 云快充平台 (TCP)│
│ UART3 ─── RS485 │
│ ETH ──── LAN (UDP, 桩1~6 + 上位机) │
│ UART6 ─── 调试串口(printf) │
└──────────────────────────────────────────────┘
```
| 外设 | 用途 |
|------|------|
| UART1 (115200) | 与AIR724 4G模块通信 |
| UART3 | RS485接口 |
| ETH (LWIP) | 以太网桩1~6 UDP通信 + 上位机 |
| UART6 | printf调试输出 |
---
## 软件架构
```
Os/ 任务/队列/信号量/定时器管理
├─ os_task.c 5个任务的创建
├─ os_queue.c 3个消息队列
├─ os_timer.c 软件定时器
└─ os_semaphore.c 信号量/互斥量
App/ 应用层任务
├─ task_air724 4G下行数据解析任务
├─ task_udp UDP收发 + 解析任务
├─ task_ykc 云快充核心状态机任务
└─ task_sys 系统任务(心跳指示、喂狗)
Driver/ 驱动层
├─ drv_air724 AIR724命令收发 + 响应解析
├─ drv_usart 串口收发(含互斥锁)
├─ drv_flash 通用Flash读写框架
└─ flash_config 应用层Flash配置
Network/ 网络层
├─ udp_manager UDP报文发送
└─ udp_router UDP路由分发
Protocol/ 协议层
├─ Point/ 南向(充电桩JSON)
├─ Host Computer/ 上位机JSON通信
└─ Ykc/ 北向(云快充字节协议)
├─ charger_to_server 上行帧
├─ server_to_charger 下行帧
├─ server_common 公共(组包/解包/CRC)
└─ ykc_router 帧类型路由分发
Global/ 全局数据
├─ g_dcpile 桩/枪 结构体 + 管理器
├─ g_init 全局初始化
├─ g_runtime 运行时统计
└─ board_config 板级配置IP/端口)
4G/ 4G模块Lua固件
├─ core/main.lua 入口:初始化+串口+网络
├─ core/cmd.lua 命令解析+分发
└─ core/linksocket.lua 多路TCP socket管理
```
---
## 通信拓扑
```
云快充服务器(TCP)
│ 4G
AIR724模块
↑ UART1
┌─────────┴──────────┐
│ STM32H743 网关 │
│ (协议转换器) │
└─────────┬──────────┘
UDP │ 以太网
┌─────────────┼─────────────┐
│ │ │
桩1~6 上位机 RS485设备
(10.12.19.101~106) (107) (触摸屏等)
```
**数据路径:**
- **云快充 → 桩**云快充TCP → 4G → UART1 → STM32解析 → 填充数据到桩结构体
- **桩上报 → 云快充**:桩 → UDP → STM32 → 打包Ykc帧 → UART1 → 4G → TCP → 云快充
- **上位机查询**:上位机 → UDP → STM32 → 查询桩数据 → 回复
---
## 三层状态机
[task_ykc.c](file:///d:/公司项目/BR_YKC/Core/User/App/task_ykc.c) 实现了 **桩层 + 枪层** 两层非阻塞时间片状态机:
### 桩层初始化桩0~2通用只做一次
```
step 0 ── 等待桩UDP上电 → 连接4G通道(i+1)
↓ (socket_connected[i] == true)
step 1 ── 发送云快充登录(0x01)
↓ (is_online == true)
step 2 ── 发送计费模型验证(0x05) + 请求(0x09)
↓ (get_model == true)
step 3 ── 进入枪层运行态
```
### 枪层运行(每把枪独立)
```
gun_step 0 ── 每5秒上传实时数据(0x13) + 主动上报到上位机
如有账单(is_get_bill==true),上传交易记录(0x3B)
```
### 非阻塞机制
所有 `osDelay()` 已被替换为**时间戳轮询**
```c
now = HAL_GetTick();
if (now < pile->step_tick) // 时间没到,立即跳过,不阻塞
continue;
// 执行动作
pile->step_tick = now + 5000; // 设定5秒后的下次超时
```
6个桩每轮循环只需微秒级完成互不阻塞。
---
## 通信协议
### 南向协议(网关 ↔ 桩)
- **传输**:以太网 UDP
- **端口**Server=6001, Stake=6001, App=6002
- **桩IP**10.12.19.101 ~ 106
- **格式**JSON
**路由表** [udp_router.c](file:///d:/公司项目/BR_YKC/Core/User/Network/udp_router.c)
| cmd | 桩ID来源 | 处理函数 | 说明 |
|-----|---------|----------|------|
| `online` | 桩1~6 | `point_callback_power_on` | 上电,设置 is_udp_online |
| `heartbeat` | 桩1~6 | `point_callback_heartbeat` | 心跳 |
| `start charging` | 桩1~6 | `point_callback_start_charging` | 开始充电反馈 |
| `end charging` | 桩1~6 | `point_callback_end_charging` | 停止充电反馈 |
| `realtime data` | 桩1~6 | `point_callback_realtime_data` | 实时数据 |
| `settlement bill` | 桩1~6 | `point_callback_settlement_bill` | 结算账单 |
| `proactive end charging` | 桩1~6 | `point_callback_proactive_end_charging` | 桩主动停止 |
| `charge process real` | 桩1~6 | `point_callback_charge_process` | BMS需求 |
| `bms info real` | 桩1~6 | `point_callback_bms_info` | BMS信息 |
**桩未上电拦截**:除 `online` 外,所有桩指令都会检查 `is_udp_online`,未上电的桩指令将被静默丢弃。
### 上位机协议(网关 ↔ 上位机APP
- **传输**:以太网 UDP同一通道
- **端口**Server=6001, App=6002
- **上位机ID**7
- **格式**JSON`request_id` + `success`
**指令表** [host_computer_protocol.h](file:///d:/公司项目/BR_YKC/Core/User/Protocol/Host%20Computer/host_computer_protocol.h)
| cmd | 功能 | 处理函数 | 回复字段 |
|-----|------|----------|----------|
| `server_login` | 登录 | `host_computer_on_login` | success |
| `server_get_status` | 获取所有桩状态 | `host_computer_on_get_status` | piles[].serial/is_online/guns[].status |
| `server_reboot` | 重启网关 | `host_computer_on_reboot` | 无(立即重启) |
| `gateway_get_info` | 查询网关信息 | `host_computer_on_get_gw_info` | device_id, software_ver, hardware_ver, uptime |
| `gateway_get_4g_status` | 查询4G状态 | `host_computer_on_get_4g_status` | iccid, net_status, signal, isp |
| `gateway_get_cloud_config` | 查询云配置 | `host_computer_on_get_cloud_config` | host, port |
| `gateway_set_cloud_config` | 设置云配置 | `host_computer_on_set_cloud_config` | host, port触发重连 |
| `gateway_get_net_config` | 查询网络配置 | `host_computer_on_get_net_config` | ip, mask, gateway, dns |
| `gateway_set_net_config` | 设置网络配置 | `host_computer_on_set_net_config` | success重启生效 |
| `server_get_pile_info` | 查询单个桩信息 | `host_computer_on_get_pile_info` | serial, type, gun_num, protocol_ver, software_ver, sim |
### 北向协议(网关 ↔ 云快充)
- **传输**4G TCP
- **数据格式**字节流含CRC16校验
- **封装**`55 AA 01 socketId len [ykc_frame] AA 55`
#### YKC帧格式
```
┌────────┬──────┬────────┬─────────┬────────┬──────────┬──────┐
│ 0x68 │ len │ serial │encrypt │type │ data │ crc │
│ (起始) │(1字节)│ (2字节)│ (1字节) │(1字节) │ (n字节) │2字节│
└────────┴──────┴────────┴─────────┴────────┴──────────┴──────┘
```
#### 帧类型(上行 → 云快充)
| type | 函数 | 说明 |
|------|------|------|
| 0x01 | `charger_to_server_0X01` | 登录认证 |
| 0x03 | `charger_to_server_0X03` | 心跳 |
| 0x05 | `charger_to_server_0X05` | 计费模型验证 |
| 0x09 | `charger_to_server_0X09` | 计费模型请求 |
| 0x13 | `charger_to_server_0X13` | 实时监测数据 |
| 0x19 | `charger_to_server_0X19` | 充电结束 |
| 0x33 | `charger_to_server_0X33` | 远程启动回复 |
| 0x35 | `charger_to_server_0X35` | 远程停机回复 |
| 0x3B | `charger_to_server_0X3B` | 交易记录 |
| 0x57 | `charger_to_server_0x57` | 计费模型应答 |
#### 帧类型(下行 ← 云快充)
| type | 处理函数 | 说明 |
|------|----------|------|
| 0x02 | `on_cmd_frame_type_0X02` | 登录认证应答 |
| 0x04 | `on_cmd_frame_type_0X04` | 心跳应答 |
| 0x06 | `on_cmd_frame_type_0X06` | 计费模型验证应答 |
| 0x0A | `on_cmd_frame_type_0X0A` | 获取计费模型 |
| 0x58 | `on_cmd_frame_type_0X58` | 计费模型设置 |
| 0x34 | `on_cmd_frame_type_0X34` | 平台启动充电 |
| 0x36 | `on_cmd_frame_type_0X36` | 平台控制停止充电 |
| 0x40 | `on_cmd_frame_type_0X40` | 交易记录确认 |
### 4G链路协议STM32 ↔ AIR724
AIR724模块内部运行Lua脚本 [cmd.lua](file:///d:/公司项目/BR_YKC/4G/code/core/cmd.lua) + [linksocket.lua](file:///d:/公司项目/BR_YKC/4G/code/core/linksocket.lua)
```
55 AA mainCmd subCmd [payload] AA 55
```
| mainCmd | subCmd | 功能 |
|---------|--------|------|
| 0x01 | socketId | 数据发送到指定Socket |
| 0x02 | - | 系统重启 |
| 0x03 | 0x01/0x02 | 连接/断开Socket |
| 0x04 | 0x00 | 设置服务器地址 |
| 0x05 | 0x01~0x03 | 查询ICCID/IMSI/IMEI |
| 0x06 | 0x00 | 查询信号强度 |
| 0x07 | 0x00 | 查询链路状态 |
**上行响应4G → STM32**
| mainCmd | subCmd | 含义 |
|---------|--------|------|
| 0x83 | 0x01 | TCP已连接 |
| 0x83 | 0x02 | TCP已断开 |
| 0x83 | 0x03 | TCP连接失败 |
| 0x84 | 0x01~0x03 | SIM信息ICCID/IMSI/IMEI |
| 0x85 | - | 信号强度 |
| 0x86 | - | 链路状态 |
---
## 上位机 C# 客户端
C# 上位机客户端项目位于 `C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC`,基于 **.NET Framework 4.7.2** + **WPF** 框架开发,通过 **UDP** 与网关通信。
### 项目结构
```
YKC/
├── App.xaml(.cs) 程序入口
├── MainWindow.xaml(.cs) 主窗口(导航框架)
├── LoginWindow.xaml(.cs) 登录窗口
├── Config.cs 配置参数 + 指令字典
├── UdpClient.cs UDP通信客户端同步/异步)
├── PilesDataStore.cs 充电桩历史数据存储(含图表数据)
├── Pages/
│ ├── DashboardPage.xaml(.cs) 总览页面
│ ├── RealtimePage.xaml(.cs) 实时监控含OxyPlot图表
│ ├── ChargerPage.xaml(.cs) 充电桩管理
│ └── GatewayPage.xaml(.cs) 网关管理
├── bin/Debug/
│ ├── OxyPlot.dll 波形图库
│ ├── OxyPlot.Wpf.dll
│ ├── OxyPlot.Wpf.Shared.dll
│ └── Newtonsoft.Json.dll JSON库
└── Properties/ 项目属性
```
### 页面功能
#### 1. 登录页面 (LoginWindow)
- 用户名/密码认证
- 发送 `server_login` → 网关返回 `success: true/false`
- 默认账号:`admin` / `123456`
#### 2. 总览页面 (DashboardPage)
- **连接状态**:显示网关在线/离线
- **在线/充电统计**:在线桩数、充电中枪数
- **表格列表**:每桩的序列号、在线状态、每枪状态
-**5秒** 自动轮询 `server_get_status`
| 枪状态 | 含义 |
|--------|------|
| 0 | 离线 |
| 1 | 故障 |
| 2 | 空闲 |
| 3 | 充电中 |
#### 3. 实时监控页面 (RealtimePage)
- 选择桩号(1~N) + 枪号(1~N)
- 实时显示:电流(A)、电压(V)、功率(kW)、电量(kWh)、总金额、SOC、累计时间、剩余时间
- **OxyPlot 实时曲线**
- 电流/电压/功率 折线图含时间轴最多300个点
- 电费/服务费/总金额 柱状图
-**2秒** 自动轮询 `report_data` 主动上报数据来自PilesDataStore历史记录
#### 4. 充电桩管理页面 (ChargerPage)
**查询桩信息**
- 按桩索引查询
- 回复显示:序列号、类型(直流/交流)、枪数、协议版本、软件版本、SIM
**设置桩ID**
- 输入桩索引 + 14位HEX序列号
**重启网关**
- 发送 `server_reboot`(确认弹窗)
#### 5. 网关管理页面 (GatewayPage)
**网关信息卡片**
- 设备ID、软件版本、硬件版本、运行时长
- 调用 `gateway_get_info`
**4G状态卡片**
- ICCID、网络状态、信号强度(dBm)、运营商
- 调用 `gateway_get_4g_status`
**云平台配置卡片**
- 查询(`gateway_get_cloud_config`) / 保存(`gateway_set_cloud_config`)
- 保存时验证IP格式或域名格式端口 1~65535
**网络配置卡片**
- IP/掩码/网关/DNS 查询 + 设置
- 调用 `gateway_get_net_config` / `gateway_set_net_config`
- 支持IP地址格式校验
### 通信机制
UDP通信封装在 [UdpClient.cs](file:///C:/Users/Administrator/PycharmProjects/PythonProject/C%23/YKC/UdpClient.cs)
**消息格式**
```json
{
"id": 7, // 固定ID=7上位机
"cmd": "server_login",
"request_id": "server_login_1700000000000",
......
}
```
**回复格式**
```json
{
"request_id": "server_login_...",
"success": true,
......
}
```
**两种发送模式**
| 方法 | 说明 |
|------|------|
| `Send(payload, callback)` | 异步发送,通过回调接收回复 |
| `SendSync(payload, timeoutSec?)` | 同步发送阻塞等待回复或超时默认4秒 |
**超时机制**:异步请求启动定时器,超时后自动回调 `{ success: false, error: "timeout" }`
**主动上报接收**`OnActiveReport` 事件监听 `cmd == "report_data"` / `"pile_metrics"` / `"real_time_data"`,由 `PilesDataStore` 订阅存储。
**监听端口**`Config.LocalPort = 6002`,目标网关 `Config.TargetIp:Config.TargetPort`(默认 `10.12.19.100:6001`
### 数据存储
[PilesDataStore.cs](file:///C:/Users/Administrator/PycharmProjects/PythonProject/C%23/YKC/PilesDataStore.cs) 单例模式管理:
- **实时数据**`GetLatest(pile, gun)` → 最新一条 `JObject`
- **图表数据**`GetChartData(pile, gun)``GunData` 对象内含最多300个历史点的电流/电压/功率/电量/金额等序列
- **历史清理**超过300个点自动移除旧数据
### 配置参数
[Config.cs](file:///C:/Users/Administrator/PycharmProjects/PythonProject/C%23/YKC/Config.cs)
```csharp
TargetIp = "10.12.19.100"; // 网关IP
TargetPort = 6001; // 网关UDP端口
LocalPort = 6002; // 本机监听端口
UdpTimeout = 3; // 超时时间(秒)
```
**指令字典**(与网关 `udp_router.c` 路由表对应):
| 常量 | cmd | 对应网关处理函数 |
|------|-----|------------------|
| `LOGIN` | `server_login` | `host_computer_on_login` |
| `GET_STATUS` | `server_get_status` | `host_computer_on_get_status` |
| `REBOOT` | `server_reboot` | `host_computer_on_reboot` |
| `GET_PILE_INFO` | `server_get_pile_info` | `host_computer_on_get_pile_info` |
| `GET_GW_INFO` | `gateway_get_info` | `host_computer_on_get_gw_info` |
| `GET_4G_STATUS` | `gateway_get_4g_status` | `host_computer_on_get_4g_status` |
| `GET_CLOUD_CONFIG` | `gateway_get_cloud_config` | `host_computer_on_get_cloud_config` |
| `SET_CLOUD_CONFIG` | `gateway_set_cloud_config` | `host_computer_on_set_cloud_config` |
| `GET_NET_CONFIG` | `gateway_get_net_config` | `host_computer_on_get_net_config` |
| `SET_NET_CONFIG` | `gateway_set_net_config` | `host_computer_on_set_net_config` |
| `SET_PILE_ID` | `server_set_pile_id` | 待开发 |
| `REPORT_DATA` | `report_data` | 主动上报(南向) |
---
## 配置指南
### 修改桩编码(序列号)
修改 [g_dcpile.c](file:///d:/公司项目/BR_YKC/Core/User/Global/g_dcpile.c) 中的 `piles_serial` 数组每个桩编码为7字节十六进制
```c
/*充电桩序列号*/
const uint8_t piles_serial[6][7] = {
{0x32, 0x01, 0x06, 0x01, 0x16, 0x92, 0x45}, // 桩1
{0x32, 0x01, 0x06, 0x01, 0x16, 0x92, 0x44}, // 桩2
{0x32, 0x01, 0x06, 0x01, 0x16, 0x92, 0x43}, // 桩3
{0x32, 0x01, 0x06, 0x01, 0x16, 0x92, 0x42}, // 桩4
{0x32, 0x01, 0x06, 0x01, 0x11, 0x15, 0x58}, // 桩5
{0x32, 0x01, 0x06, 0x01, 0x11, 0x15, 0x54}, // 桩6
};
```
> `init_chargers()` 中通过 `memcpy(ctx->charger_serial, piles_serial[i], CHARGER_SERIAL_LENGTH)` 加载。
序列号转换为字符串显示时表现为14位HEX码例如 `32010601169244`
### 修改桩数量
**两步:**
**①** 修改 [g_dcpile.h](file:///d:/公司项目/BR_YKC/Core/User/Global/g_dcpile.h) 中的宏:
```c
#define MAX_CHARGER_COUNT 2 // ← 改为实际桩数量
```
**②** 确保 [g_dcpile.c](file:///d:/公司项目/BR_YKC/Core/User/Global/g_dcpile.c) 中的 `piles_serial` 数组有对应数量的序列号。
同时需要修改 [udp_router.c](file:///d:/公司项目/BR_YKC/Core/User/Network/udp_router.c) 中 `ROUTE_TABLE` 的路由数量(如果新增桩路由),以及 [task_ykc.c](file:///d:/公司项目/BR_YKC/Core/User/App/task_ykc.c) 中状态机的循环 `for (int i = 0; i < g_charger_manager.charger_count; i++)` 已自动适配。
> 桩1~6的UDP IP地址在 [udp_manager.c](file:///d:/公司项目/BR_YKC/Core/User/Network/udp_manager.c) 中硬编码:
> ```c
> static ip4_addr_t s_point_ip[6] = {
> IPADDR4_INIT_BYTES(10, 12, 19, 101), /* 桩1 */
> IPADDR4_INIT_BYTES(10, 12, 19, 102), /* 桩2 */
> ...
> };
> ```
> 如果桩数量变化,需要同步更新此数组。
### 修改每桩枪数
修改 [g_dcpile.h](file:///d:/公司项目/BR_YKC/Core/User/Global/g_dcpile.h)
```c
#define MAX_GUN_PER_CHARGER 2 // ← 改为实际枪数
```
状态机中的枪循环已自动适配:
```c
for (int g = 0; g < MAX_GUN_PER_CHARGER; g++)
```
### 配置云快充服务器地址
默认在 [linksocket.lua](file:///d:/公司项目/BR_YKC/4G/code/core/linksocket.lua) 中:
```lua
local server_config = {
ip = "129.211.170.245",
port = 9002
}
```
可通过上位机指令 `gateway_set_cloud_config` 动态修改 `s_cloud_host` / `s_cloud_port`,修改后调用 `drv_air724_set_server` 触发AIR724重新连接。
---
## Flash组件使用说明
Flash存储组件分为**两层**
### 框架层 drv_flash
[drv_flash.h](file:///d:/公司项目/BR_YKC/Core/User/Driver/drv_flash.h) / [drv_flash.c](file:///d:/公司项目/BR_YKC/Core/User/Driver/drv_flash.c)
提供通用Flash读写管理支持按帧类型存取、覆写模式、多帧管理。
#### 帧格式
```
┌──────┬──────┬──────┬──────┬──────────┬──────┐
│ HEAD │ size_low │size_high│type│ DATA │ TAIL │
│(0xA5)│ (2字节 小端) │(1字节)│(n字节) │(0x5A)│
└──────┴──────┴──────┴──────┴──────────┴──────┘
```
#### 核心API
| 函数 | 说明 |
|------|------|
| `flash_manage_init(flash_manage_t *fm)` | 初始化遍历Flash重建可读帧表 |
| `flash_manage_read(fm, *pbuf, frame_type)` | 读取指定类型的帧数据 |
| `flash_manage_write(fm, *pbuf, size, frame_type)` | 写入指定类型的帧数据 |
#### flash_manage_t 配置
```c
typedef struct {
uint8_t align_num; // 地址对齐数STM32H7一般为32
flash_write_read_mode_t flash_write_mode; // 写模式
flash_write_read_mode_t flash_read_mode; // 读模式
uint32_t flash_start_address; // 管理起始地址(按扇区对齐)
uint32_t manage_sector_num; // 管理的扇区数
uint32_t sector_size; // 扇区大小H743=128KB
void (*read_flash)(...); // 读函数指针
void (*write_flash)(...); // 写函数指针
uint8_t (*erase_sector)(...); // 擦除函数指针
} flash_manage_t;
```
### 应用层 flash_config
[flash_config.h](file:///d:/公司项目/BR_YKC/Core/User/Driver/flash_config.h) / [flash_config.c](file:///d:/公司项目/BR_YKC/Core/User/Driver/flash_config.c)
基于框架层的封装提供开箱即用的API
```c
// 单例,地址=0x081800001个Sector(128KB)32字节对齐
void stm_flash_init(void);
// 读取,传入缓冲区 + 帧类型成功返回1
int8_t stm_flash_read(uint8_t *pbuf, uint8_t frame_type);
// 写入,传入数据 + 大小 + 帧类型成功返回1
int8_t stm_flash_write(uint8_t *pbuf, uint16_t size, uint8_t frame_type);
```
> **注意**STM32H743 Bank2 的 Sector 擦除规则:
> - 起始地址 `0x08100000`每Sector = 128KB
> - 写入必须 **32字节对齐**不满32字节补 `0xFF`
> - `flash_config.c` 使用 `0x08180000`Bank2的第4个Sector
### 使用示例
```c
#include "flash_config.h"
// 初始化在main中调用一次
stm_flash_init();
// 写入配置数据
uint8_t config_data[] = {0x01, 0x02, 0x03, 0x04};
stm_flash_write(config_data, sizeof(config_data), 0x01); // 帧类型1
// 读取配置数据
uint8_t read_buf[64] = {0};
if (stm_flash_read(read_buf, 0x01) == 1) {
// 读取成功read_buf中为数据
} else {
// 无数据
}
```
**写模式**
| 模式 | 值 | 说明 |
|------|----|------|
| `FLASH_NO_OVERWRITING_MODE` | 0x00 | 只追加,不覆盖旧帧 |
| `FLASH_OVERWRITING_MODE` | 0x01 | 将旧帧头置为无效,写新帧(默认) |
**读模式**
| 模式 | 值 | 说明 |
|------|----|------|
| `FLASH_NO_CLEAR_MODE` | 0x02 | 读取后不清除(默认) |
| `FLASH_CLEAR_MODE` | 0x03 | 读取后将帧标记为无效 |
---
## 任务列表
| 任务 | 函数 | 栈大小 | 优先级 | 说明 |
|------|------|--------|--------|------|
| SysTask | `sys_task_function` | 128 | Low | 指示灯、蜂鸣器、喂狗 |
| Air724RecvTask | `air724_recv_task_function` | 1024 | AboveNormal | 解析4G下行数据 |
| UDPRecvTask | `udp_recv_task_function` | 1536 | High | UDP接收入队 |
| UDPParseTask | `udp_parse_task_function` | 2048 | AboveNormal | UDP数据解析+路由分发 |
| YkcTask | `ykc_task_function` | 1024 | AboveNormal | 云快充状态机+数据上报 |
### 消息队列
| 队列 | 长度 | 消息大小 | 用途 |
|------|------|----------|------|
| Air724_Message_Queue | 20 | 512 | 4G接收数据 |
| RS485_Message_Queue | 5 | 256 | RS485接收数据 |
| UDP_Message_Queue | 20 | sizeof(UdpMsg_t) | UDP接收数据 |
---
## 日志格式
```
[YKC Router] frame=0x02 │ stake=1 │ 登录认证应答 ← 4G下行路由
[ UDP 接收路由 ] 指令: realtime data │ 桩ID: 1 │ 实时数据 ← 南向UDP
[ UDP 路由拦截 ] 桩ID: 2 未上电,忽略指令: heartbeat ← 上电过滤
[ 北向 ] 对电桩 1 发送登录认证 ← 4G上行
[ 北向 ] 对电桩 1 枪 1 上传交易记录(0x3B)电量0.00金额0.00 ← 4G上行
[ 4G ] 通道 1 连接成功 ← 4G链路通知
[ 上位机 ] get_status 回复已发送 ← 上位机回复
```

View File

@@ -0,0 +1,974 @@
# 充电桩与网关 UDP JSON 通讯协议
## 概述
充电桩与网关之间通过 **以太网 UDP** 通信,使用 **JSON** 格式进行数据交换。
| 项目 | 说明 |
|------|------|
| 传输层 | UDP |
| 网关端口 | 6001 |
| 桩IP范围 | 10.12.19.101 ~ 106 |
| 数据格式 | JSON |
| 编码 | UTF-8 |
---
## 通讯流程
```
充电桩上电
发送 online上电 ──────→ 网关回复 charger_id
正常运行时,每 5~10 秒
发送 heartbeat心跳 ──→ 网关回复
┌─── 网关下发 start charging启动充电
充电桩周期上报实时数据 ←──── 网关可下发 end charging停止充电
(realtime data / charge process real / bms info real)
└─── 充电结束 → 上报 settlement bill结算账单
```
---
## 指令列表
| # | 标题 | cmd | 方向 | 触发方式 |
|---|------|-----|------|----------|
| 1 | 桩上电 | `online` | 桩 → 网关 → 桩 | 上电即发 |
| 2 | 心跳 | `heartbeat` | 桩 → 网关 → 桩 | 5~10秒周期 |
| 3 | 启动充电 | `start charging` | 网关 → 桩 → 网关 | 网关主动下发 |
| 4 | 停止充电 | `end charging` | 网关 → 桩 → 网关 | 网关主动下发 |
| 5 | 主动停止充电 | `proactive end charging` | 桩 → 网关 → 桩 | 桩主动上报 |
| 6 | 实时数据上报 | `realtime data` | 桩 → 网关 → 桩 | 周期上送 |
| 7 | BMS信息上报 | `bms info` | 桩 → 网关 → 桩 | 桩主动上报 |
| 8 | 充电参数配置 | `charge config` | 桩 → 网关 → 桩 | 桩主动上报 |
| 9 | 充电错误报文 | `charge error` | 桩 → 网关 → 桩 | 桩主动上报 |
| 10 | BMS中止充电 | `bms stop` | 桩 → 网关 → 桩 | 桩主动上报 |
| 11 | 充电机中止充电 | `charger stop` | 桩 → 网关 → 桩 | 桩主动上报 |
| 12 | 充电过程BMS需求与输出 | `charge process real` | 桩 → 网关 → 桩 | 15秒周期 |
| 13 | 充电过程BMS信息 | `bms info real` | 桩 → 网关 → 桩 | 15秒周期 |
| 14 | 结算账单上传 | `settlement bill` | 桩 → 网关 → 桩 | 桩主动上报 |
---
## 通用字段说明
所有 JSON 消息均包含以下固定字段:
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | Number | 桩编码 (1~6) |
| `cmd` | String | 指令标识,见指令列表 |
| `type` | String | `"request"` 请求帧 / `"response"` 回复帧 |
---
## 1. 桩上电
> **方向**:充电桩 → 网关 → 充电桩
充电桩上电后立即发送网关回复桩的唯一ID。
**Request (充电桩 → 网关)**
```json
{
"id": 1,
"cmd": "online",
"type": "request"
}
```
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | Number | 是 | 桩编码 |
| cmd | String | 是 | "online" |
| type | String | 是 | "request" |
**Response (网关 → 充电桩)**
```json
{
"id": 1,
"cmd": "online",
"charger_id": "32010203040506",
"type": "response"
}
```
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | Number | 是 | 桩编码 |
| cmd | String | 是 | "online" |
| charger_id | String | 是 | 桩唯一ID |
| type | String | 是 | "response" |
---
## 2. 心跳
> **方向**:充电桩 → 网关 → 充电桩
> **周期**5~10 秒
桩定期上报各枪实时状态。
**Request (充电桩 → 网关)**
```json
{
"id": 1,
"cmd": "heartbeat",
"gun": [
{ "id": 1, "state": 0 },
{ "id": 2, "state": 0 }
],
"type": "request"
}
```
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | Number | 是 | 桩编码 (1~6) |
| cmd | String | 是 | "heartbeat" |
| gun | Array | 是 | 枪口列表 |
| gun[].id | Number | 是 | 枪编号 (1~N) |
| gun[].state | Number | 是 | 枪状态0 离线1 故障2 空闲3 充电 |
| type | String | 是 | "request" |
**Response (网关 → 充电桩)**
```json
{
"id": 1,
"cmd": "heartbeat",
"gun_id": 1,
"type": "response"
}
```
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | Number | 是 | 桩编码 (1~6) |
| cmd | String | 是 | "heartbeat" |
| gun_id | Number | 是 | 枪编号 (1~N) |
| type | String | 是 | "response" |
---
## 3. 启动充电
> **方向**:网关 → 充电桩 → 网关
网关向充电桩下发启动充电指令,同步下发**计费模型**。
**Request (网关 → 充电桩)**
```json
{
"id": 1,
"cmd": "start charging",
"transaction_id": "32010200000000111511161555350260",
"gun_id": 1,
"fee": [
[1, 0, 6, 0.3, 0.5],
[2, 6, 10, 0.8, 0.8],
[3, 10, 15, 1.2, 0.8],
[4, 15, 24, 0.6, 0.6]
],
"limit_amount": 0,
"type": "request"
}
```
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | Number | 是 | 桩编码 (1~6) |
| cmd | String | 是 | "start charging" |
| transaction_id | String | 是 | 订单编码 32位 |
| gun_id | Number | 是 | 枪编码 (1~N) |
| fee | Array | 是 | 计费模型数组,每行:[计费段, 开始时间, 结束时间, 电费, 服务费] |
| limit_amount | Float | 是 | 停止金额。0 为不限制 |
| type | String | 是 | "request" |
**fee 数组格式:**
每行固定5个元素
```
[计费段, 开始时间(小时), 结束时间(小时), 电费单价, 服务费单价]
```
| 计费段 | 含义 |
|--------|------|
| 1 | 尖 |
| 2 | 峰 |
| 3 | 平 |
| 4 | 谷 |
**Response (充电桩 → 网关)**
```json
{
"id": 1,
"cmd": "start charging",
"transaction_id": "32010200000000111511161555350260",
"gun_id": 1,
"result": 0,
"error_code": 0,
"type": "response"
}
```
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | Number | 是 | 桩编码 (1~6) |
| cmd | String | 是 | "start charging" |
| transaction_id | String | 是 | 订单编码 32位 |
| gun_id | Number | 是 | 枪编码 (1~N) |
| result | Number | 是 | 启动结果0=失败1=成功 |
| error_code | Number | 是 | 错误码0=无1=设备编号不匹配2=枪已在充电3=设备故障4=设备离线5=未插枪 |
| type | String | 是 | "response" |
---
## 4. 停止充电
> **方向**:网关 → 充电桩 → 网关
**Request (网关 → 充电桩)**
```json
{
"id": 1,
"cmd": "end charging",
"transaction_id": "32010200000000111511161555350260",
"gun_id": 1,
"type": "request"
}
```
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | Number | 是 | 桩编码 (1~6) |
| cmd | String | 是 | "end charging" |
| transaction_id | String | 是 | 订单编码 32位 |
| gun_id | Number | 是 | 枪编码 (1~N) |
| type | String | 是 | "request" |
**Response (充电桩 → 网关)**
```json
{
"id": 1,
"cmd": "end charging",
"transaction_id": "32010200000000111511161555350260",
"gun_id": 1,
"result": 0,
"error_code": 0,
"type": "response"
}
```
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | Number | 是 | 桩编码 (1~6) |
| cmd | String | 是 | "end charging" |
| transaction_id | String | 是 | 订单编码 32位 |
| gun_id | Number | 是 | 枪编码 (1~N) |
| result | Number | 是 | 停止结果0 失败1 成功 |
| error_code | Number | 是 | 错误码0 无1 枪未在充电2 其他故障 |
| type | String | 是 | "response" |
---
## 5. 主动停止充电
> **方向**:充电桩 → 网关 → 充电桩
充电桩主动上报停止充电如用户刷卡停止、车辆BMS中止等
**Request (充电桩 → 网关)**
```json
{
"id": 1,
"cmd": "proactive end charging",
"transaction_id": "32010200000000111511161555350260",
"gun_id": 1,
"type": "request"
}
```
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | Number | 是 | 桩编码 (1~6) |
| cmd | String | 是 | "proactive end charging" |
| transaction_id | String | 是 | 订单编码 32位 |
| gun_id | Number | 是 | 枪编码 (1~N) |
| type | String | 是 | "request" |
**Response (网关 → 充电桩)**
```json
{
"id": 1,
"cmd": "proactive end charging",
"transaction_id": "32010200000000111511161555350260",
"gun_id": 1,
"type": "response"
}
```
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | Number | 是 | 桩编码 (1~6) |
| cmd | String | 是 | "end charging" |
| transaction_id | String | 是 | 订单编码 32位 |
| gun_id | Number | 是 | 枪编码 (1~N) |
| type | String | 是 | "response" |
---
## 6. 充电桩实时数据上报
> **方向**:充电桩 → 网关 → 充电桩
> **周期**:待机 5 分钟、充电 15 秒
**Request (充电桩 → 网关)**
```json
{
"id": 1,
"cmd": "realtime data",
"transaction_id": "32010200000000111511161555350260",
"gun_id": 1,
"state": 0,
"gun_back": 0,
"gun_insert": 1,
"voltage": 2222,
"current": 2222,
"cable_temp": 85,
"cable_code": "1234567890123456",
"soc": 85,
"battery_temp": 95,
"charge_time": 45,
"remain_time": 30,
"charge_kwh": 12.3456,
"loss_kwh": 12.4567,
"charge_amount": 18.6851,
"fault": 0,
"type": "request"
}
```
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | Number | 是 | 桩编码 (1~6) |
| cmd | String | 是 | "realtime data" |
| transaction_id | String | 是 | 交易流水号 32位待机时填充0 |
| gun_id | Number | 是 | 枪编号 (1~N) |
| state | Number | 是 | 枪状态0 离线1 故障2 空闲3 充电 |
| gun_back | Number | 是 | 枪是否归位0 否1 是2 未知 |
| gun_insert | Number | 是 | 是否插枪0 否1 是 |
| voltage | Float | 是 | 输出电压单位0.1V。待机时为0 |
| current | Float | 是 | 输出电流单位0.1A。待机时为0 |
| cable_temp | Number | 是 | 枪线温度,单位℃,偏移量-50。待机时为0 |
| cable_code | String | 是 | 枪线编码 16位没有时填充0 |
| soc | Number | 是 | 电池SOC百分比 0~100待机/交流桩为0 |
| battery_temp | Number | 是 | 电池组最高温度,单位℃,偏移量-50。待机/交流桩为0 |
| charge_time | Number | 是 | 累计充电时间单位分钟。待机时为0 |
| remain_time | Number | 是 | 剩余时间,单位分钟。待机/交流桩为0 |
| charge_kwh | Float | 是 | 充电度数(kWh)精确到小数点后4位。待机时为0 |
| loss_kwh | Float | 是 | 计损充电度数(kWh)。未设置计损比例时等于charge_kwh |
| charge_amount | Float | 是 | 已充金额(元)精确到小数点后4位 |
| fault | Number | 是 | 硬件故障位图16bit见下方说明 |
| type | String | 是 | "request" |
**fault 故障位图:**
| Bit | 故障 |
|-----|------|
| 1 | 急停 |
| 2 | 无模块 |
| 3 | 温度高 |
| 4 | 防雷故障 |
| 5 | DC20中断 |
| 6 | FC08中断 |
| 7 | 电表中断 |
| 8 | 读卡器中断 |
| 9 | RC10中断 |
| 10 | 风扇故障 |
| 11 | 熔断器故障 |
| 12 | 接触器故障 |
| 13 | 门打开 |
**Response (网关 → 充电桩)**
```json
{
"id": 1,
"cmd": "realtime data",
"transaction_id": "32010200000000111511161555350260",
"gun_id": 1,
"type": "response"
}
```
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | Number | 是 | 桩编码 (1~6) |
| cmd | String | 是 | "realtime data" |
| transaction_id | String | 是 | 交易流水号 32位 |
| gun_id | Number | 是 | 枪编号 (1~N) |
| type | String | 是 | "response" |
---
## 7. BMS信息上报
> **方向**:充电桩 → 网关 → 充电桩
**Request (充电桩 → 网关)**
```json
{
"id": 1,
"cmd": "bms info",
"transaction_id": "32010200000000111511161555350260",
"gun_id": 1,
"protocol_version": "0001.01",
"battery_type": 3,
"rated_capacity": 600.0,
"rated_voltage": 3600.0,
"manufacturer": "CATL",
"battery_sn": "BT123456",
"production_year": 2023,
"production_month": 6,
"production_day": 15,
"charge_count": 1250,
"ownership": 1,
"reserved": 0,
"vin": "LSVAA4182E2123456",
"software_version": "FFFFFF.07DF.0B.0A.10",
"type": "request"
}
```
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | Number | 是 | 桩编码 (1~6) |
| cmd | String | 是 | "bms info" |
| transaction_id | String | 是 | 交易流水号 32位 |
| gun_id | Number | 是 | 枪编号 (1~N) |
| protocol_version | String | 是 | BMS通信协议版本号。格式`byte3.byte2-byte1`,例:"0001.01"=V1.1 |
| battery_type | Number | 是 | 电池类型1铅酸2氢电池3磷酸铁锂4锰酸锂5钴酸锂6三元材料7聚合物锂离子8钛酸锂255其他 |
| rated_capacity | Float | 是 | 额定容量单位0.1Ah。例600.0=60.0Ah |
| rated_voltage | Float | 是 | 额定总电压单位0.1V。例3600.0=360.0V |
| manufacturer | String | 是 | 电池生产厂商名称最长4字节 |
| battery_sn | String | 是 | 电池组序号最长4字节 |
| production_year | Number | 是 | 生产年份1985偏移量。例2023=1985+38 |
| production_month | Number | 是 | 生产月份1~12 |
| production_day | Number | 是 | 生产日1~31 |
| charge_count | Number | 是 | 电池组充电次数0次偏移量 |
| ownership | Number | 是 | 电池产权标识0租赁1车自有 |
| reserved | Number | 是 | 预留位 |
| vin | String | 是 | 车辆识别码VIN17位字符 |
| software_version | String | 是 | BMS软件版本号。格式`byte8.byte7-byte5.byte4-byte3-byte2-byte1` |
| type | String | 是 | "request" |
**Response (网关 → 充电桩)**
```json
{
"id": 1,
"cmd": "bms info",
"gun_id": 1,
"type": "response"
}
```
---
## 8. 充电参数配置
> **方向**:充电桩 → 网关 → 充电桩
> **依据**GBT-27930 充电桩与BMS参数配置阶段报文
**Request (充电桩 → 网关)**
```json
{
"id": 1,
"cmd": "charge config",
"transaction_id": "32010200000000111511161555350260",
"gun_id": 1,
"bms_max_cell_voltage": 4.20,
"bms_max_current": 250.0,
"bms_rated_energy": 60.0,
"bms_max_voltage": 750.0,
"bms_max_temp": 95,
"bms_soc": 85.0,
"bms_current_voltage": 680.0,
"pile_max_voltage": 750.0,
"pile_min_voltage": 200.0,
"pile_max_current": 250.0,
"pile_min_current": 10.0,
"type": "request"
}
```
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | Number | 是 | 桩编码 (1~6) |
| cmd | String | 是 | "charge config" |
| transaction_id | String | 是 | 交易流水号 32位 |
| gun_id | Number | 是 | 枪编号 (1~N) |
| bms_max_cell_voltage | Float | 是 | BMS单体最高允许充电电压单位0.01V范围0~24V |
| bms_max_current | Float | 是 | BMS最高允许充电电流单位0.1A-400A偏移量 |
| bms_rated_energy | Float | 是 | BMS标称总能量单位0.1kWh范围0~1000kWh |
| bms_max_voltage | Float | 是 | BMS最高允许充电总电压单位0.1V |
| bms_max_temp | Number | 是 | BMS最高允许温度单位℃-50℃偏移量范围-50~200℃ |
| bms_soc | Float | 是 | BMS荷电状态SOC单位0.1%范围0~100% |
| bms_current_voltage | Float | 是 | BMS当前电池电压单位0.1V |
| pile_max_voltage | Float | 是 | 电桩最高输出电压单位0.1V |
| pile_min_voltage | Float | 是 | 电桩最低输出电压单位0.1V |
| pile_max_current | Float | 是 | 电桩最大输出电流单位0.1A-400A偏移量 |
| pile_min_current | Float | 是 | 电桩最小输出电流单位0.1A-400A偏移量 |
| type | String | 是 | "request" |
**Response (网关 → 充电桩)**
```json
{
"id": 1,
"cmd": "charge config",
"gun_id": 1,
"type": "response"
}
```
---
## 9. 充电错误报文
> **方向**:充电桩 → 网关 → 充电桩
> **依据**GBT-27930 充电桩与BMS充电错误报文
**Request (充电桩 → 网关)**
```json
{
"id": 1,
"cmd": "charge error",
"transaction_id": "32010200000000111511161555350260",
"gun_id": 1,
"charger_spn2560_00_timeout": 0,
"charger_spn2560_aa_timeout": 0,
"charger_time_sync_timeout": 0,
"charger_ready_timeout": 0,
"charger_status_timeout": 0,
"charger_stop_timeout": 0,
"charger_statistics_timeout": 0,
"bms_identify_timeout": 0,
"battery_param_timeout": 0,
"bms_ready_timeout": 0,
"battery_status_timeout": 0,
"battery_demand_timeout": 0,
"bms_stop_timeout": 0,
"bms_statistics_timeout": 0,
"type": "request"
}
```
所有超时字段取值0=正常1=超时2=不可信状态
| 字段 | 说明 |
|------|------|
| charger_spn2560_00_timeout | 接收SPN2560=0x00的充电机辨识报文超时 |
| charger_spn2560_aa_timeout | 接收SPN2560=0xAA的充电机辨识报文超时 |
| charger_time_sync_timeout | 接收时间同步和充电机最大输出能力报文超时 |
| charger_ready_timeout | 接收充电机完成充电准备报文超时 |
| charger_status_timeout | 接收充电机充电状态报文超时 |
| charger_stop_timeout | 接收充电机中止充电报文超时 |
| charger_statistics_timeout | 接收充电机充电统计报文超时 |
| bms_identify_timeout | 接收BMS和车辆的辨识报文超时 |
| battery_param_timeout | 接收电池充电参数报文超时 |
| bms_ready_timeout | 接收BMS完成充电准备报文超时 |
| battery_status_timeout | 接收电池充电总状态报文超时 |
| battery_demand_timeout | 接收电池充电要求报文超时 |
| bms_stop_timeout | 接收BMS中止充电报文超时 |
| bms_statistics_timeout | 接收BMS充电统计报文超时 |
**Response (网关 → 充电桩)**
```json
{
"id": 1,
"cmd": "charge error",
"gun_id": 1,
"type": "response"
}
```
---
## 10. BMS中止充电
> **方向**:充电桩 → 网关 → 充电桩
> **依据**GBT-27930 充电桩与BMS充电阶段BMS中止报文
**Request (充电桩 → 网关)**
```json
{
"id": 1,
"cmd": "bms stop",
"transaction_id": "32010200000000111511161555350260",
"gun_id": 1,
"stop_reason_soc": 0,
"stop_reason_total_voltage": 0,
"stop_reason_cell_voltage": 0,
"stop_reason_charger": 0,
"fault_insulation": 0,
"fault_connector_temp": 0,
"fault_bms_temp": 0,
"fault_connector": 0,
"fault_battery_temp": 0,
"fault_relay": 0,
"fault_voltage_detect": 0,
"fault_other": 0,
"error_current": 0,
"error_voltage": 0,
"type": "request"
}
```
所有字段取值0=正常1=中止/异常
| 字段 | 说明 |
|------|------|
| stop_reason_soc | 达到SOC目标值中止 |
| stop_reason_total_voltage | 达到总电压设定值中止 |
| stop_reason_cell_voltage | 达到单体电压设定值中止 |
| stop_reason_charger | 充电机主动中止 |
| fault_insulation | 绝缘故障 |
| fault_connector_temp | 输出连接器过温 |
| fault_bms_temp | BMS元件过温 |
| fault_connector | 充电连接器故障 |
| fault_battery_temp | 电池组温度过高 |
| fault_relay | 高压继电器故障 |
| fault_voltage_detect | 检测点2电压检测故障 |
| fault_other | 其他故障 |
| error_current | 电流过大 |
| error_voltage | 电压异常 |
**Response (网关 → 充电桩)**
```json
{
"id": 1,
"cmd": "bms stop",
"gun_id": 1,
"type": "response"
}
```
---
## 11. 充电机中止充电
> **方向**:充电桩 → 网关 → 充电桩
> **依据**GBT-27930 充电桩与BMS充电阶段充电机中止报文
**Request (充电桩 → 网关)**
```json
{
"id": 1,
"cmd": "charger stop",
"transaction_id": "32010200000000111511161555350260",
"gun_id": 1,
"stop_reason_condition": 0,
"stop_reason_manual": 0,
"stop_reason_abnormal": 0,
"stop_reason_bms": 0,
"fault_charger_temp": 0,
"fault_connector": 0,
"fault_internal_temp": 0,
"fault_power_transfer": 0,
"fault_emergency": 0,
"fault_other": 0,
"error_current": 0,
"error_voltage": 0,
"type": "request"
}
```
所有字段取值0=正常1=中止/异常
| 字段 | 说明 |
|------|------|
| stop_reason_condition | 达到充电机设定的条件 |
| stop_reason_manual | 人工中止 |
| stop_reason_abnormal | 异常中止 |
| stop_reason_bms | BMS主动中止 |
| fault_charger_temp | 充电机过温 |
| fault_connector | 充电连接器故障 |
| fault_internal_temp | 充电机内部过温 |
| fault_power_transfer | 所需电量不能传送 |
| fault_emergency | 充电机急停 |
| fault_other | 其他故障 |
| error_current | 电流不匹配 |
| error_voltage | 电压异常 |
**Response (网关 → 充电桩)**
```json
{
"id": 1,
"cmd": "charger stop",
"gun_id": 1,
"type": "response"
}
```
---
## 12. 充电过程BMS需求与充电机输出
> **方向**:充电桩 → 网关 → 充电桩
> **周期**15 秒
> **依据**GBT-27930 充电过程BMS需求、充电机输出报文
**Request (充电桩 → 网关)**
```json
{
"id": 1,
"cmd": "charge process real",
"transaction_id": "32010200000000111511161555350260",
"gun_id": 1,
"bms_voltage_demand": 680.0,
"bms_current_demand": 250.0,
"bms_charge_mode": 2,
"bms_voltage_measure": 678.5,
"bms_current_measure": 248.0,
"bms_max_cell_voltage": 4.15,
"bms_max_cell_group": 3,
"bms_soc": 85,
"bms_remain_time": 30,
"pile_voltage_output": 680.0,
"pile_current_output": 250.0,
"charge_time": 45,
"type": "request"
}
```
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | Number | 是 | 桩编码 (1~6) |
| cmd | String | 是 | "charge process real" |
| transaction_id | String | 是 | 交易流水号 32位 |
| gun_id | Number | 是 | 枪编号 (1~N) |
| bms_voltage_demand | Float | 是 | BMS电压需求单位0.1V |
| bms_current_demand | Float | 是 | BMS电流需求单位0.1A-400A偏移量 |
| bms_charge_mode | Number | 是 | 充电模式1恒压2恒流 |
| bms_voltage_measure | Float | 是 | BMS充电电压测量值单位0.1V |
| bms_current_measure | Float | 是 | BMS充电电流测量值单位0.1A-400A偏移量 |
| bms_max_cell_voltage | Float | 是 | 最高单体蓄电池电压单位0.01V范围0~24V |
| bms_max_cell_group | Number | 是 | 最高单体电压所在组号范围0~15 |
| bms_soc | Number | 是 | 当前SOC单位%范围0~100 |
| bms_remain_time | Number | 是 | 估算剩余充电时间单位分钟范围0~600 |
| pile_voltage_output | Float | 是 | 电桩电压输出值单位0.1V |
| pile_current_output | Float | 是 | 电桩电流输出值单位0.1A-400A偏移量 |
| charge_time | Number | 是 | 累计充电时间单位分钟范围0~600 |
| type | String | 是 | "request" |
**Response (网关 → 充电桩)**
```json
{
"id": 1,
"cmd": "charge process real",
"gun_id": 1,
"type": "response"
}
```
---
## 13. 充电过程BMS信息
> **方向**:充电桩 → 网关 → 充电桩
> **周期**15 秒
> **依据**GBT-27930 充电过程BMS信息报文
**Request (充电桩 → 网关)**
```json
{
"id": 1,
"cmd": "bms info real",
"transaction_id": "32010200000000111511161555350260",
"gun_id": 1,
"max_cell_voltage_no": 128,
"max_battery_temp": 45,
"max_temp_point_no": 8,
"min_battery_temp": 25,
"min_temp_point_no": 3,
"cell_voltage_status": 0,
"soc_status": 0,
"charge_current_status": 0,
"battery_temp_status": 0,
"insulation_status": 0,
"connector_status": 0,
"charge_enable": 1,
"type": "request"
}
```
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | Number | 是 | 桩编码 (1~6) |
| cmd | String | 是 | "bms info real" |
| transaction_id | String | 是 | 交易流水号 32位 |
| gun_id | Number | 是 | 枪编号 (1~N) |
| max_cell_voltage_no | Number | 是 | 最高单体电压所在编号1偏移量范围1~256 |
| max_battery_temp | Number | 是 | 最高电池温度,单位℃,-50℃偏移量范围-50~200℃ |
| max_temp_point_no | Number | 是 | 最高温度检测点编号1偏移量范围1~128 |
| min_battery_temp | Number | 是 | 最低电池温度,单位℃,-50℃偏移量 |
| min_temp_point_no | Number | 是 | 最低温度检测点编号1偏移量 |
| cell_voltage_status | Number | 是 | 单体电压过高/过低0正常1过高2过低 |
| soc_status | Number | 是 | SOC过高/过低0正常1过高2过低 |
| charge_current_status | Number | 是 | 充电过电流0正常1过流2不可信 |
| battery_temp_status | Number | 是 | 电池温度过高0正常1过高2不可信 |
| insulation_status | Number | 是 | 绝缘状态0正常1异常2不可信 |
| connector_status | Number | 是 | 输出连接器连接状态0正常1异常2不可信 |
| charge_enable | Number | 是 | 充电禁止0禁止1允许 |
| type | String | 是 | "request" |
**Response (网关 → 充电桩)**
```json
{
"id": 1,
"cmd": "bms info real",
"gun_id": 1,
"type": "response"
}
```
---
## 14. 结算账单上传
> **方向**:充电桩 → 网关 → 充电桩
充电结束生成结算账单上传。若未收到响应间隔30秒重试一次最多重试3次。收到成功响应后充电桩本地删除该账单。
**Request (充电桩 → 网关)**
```json
{
"id": 1,
"cmd": "settlement bill",
"transaction_id": "55031412782305012018061910262392",
"gun_id": 1,
"start_time": 1584349487,
"end_time": 1584349487,
"billing": [
[1.30000, 0.0000, 0.0000, 0.0000],
[1.30000, 0.0000, 0.0000, 0.0000],
[1.30000, 0.0000, 0.0000, 0.0000],
[1.30000, 0.0000, 0.0000, 0.0000]
],
"meter_start": 0.0000,
"meter_end": 0.0000,
"total_energy": 0.0000,
"total_energy_loss": 0.0000,
"total_amount": 0.0000,
"vin": "",
"trade_type": 2,
"trade_time": 1584349487,
"stop_reason": 0,
"card_physical_id": "D14B0A54",
"type": "request"
}
```
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | Number | 是 | 桩编码 (1~6) |
| cmd | String | 是 | "settlement bill" |
| transaction_id | String | 是 | 交易流水号 32位 |
| gun_id | Number | 是 | 枪编号 (1~N) |
| start_time | Number | 是 | 充电开始时间Unix时间戳 |
| end_time | Number | 是 | 充电结束时间Unix时间戳 |
| billing | Array | 是 | 尖峰平谷计费数组4行顺序[尖,峰,平,谷],每行:[单价(.5f), 电量(.4f), 计损电量(.4f), 金额(.4f)] |
| meter_start | Float | 是 | 电表总起值(kWh),四位小数 |
| meter_end | Float | 是 | 电表总止值(kWh),四位小数 |
| total_energy | Float | 是 | 总电量(kWh),四位小数 |
| total_energy_loss | Float | 是 | 计损总电量(kWh),四位小数 |
| total_amount | Float | 是 | 消费金额(元),含电费和服务费,四位小数 |
| vin | String | 是 | 电动汽车VIN码17位ASCII |
| trade_type | Number | 是 | 交易标识1=app启动2=卡启动4=离线卡启动5=VIN码启动 |
| trade_time | Number | 是 | 交易时间Unix时间戳 |
| stop_reason | Number | 是 | 停止原因见云快充附录13.1 |
| card_physical_id | String | 是 | 物理卡号,默认为空 |
| type | String | 是 | "request" |
**billing 数组格式:**
```
[尖, 峰, 平, 谷] ← 4行固定顺序
└─ [单价(.5f), 电量(.4f), 计损电量(.4f), 金额(.4f)]
```
**Response (网关 → 充电桩)**
```json
{
"id": 1,
"cmd": "settlement bill",
"transaction_id": "55031412782305012018061910262392",
"gun_id": 1,
"result": 1,
"type": "response"
}
```
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | Number | 是 | 桩编码 (1~6) |
| cmd | String | 是 | "settlement bill" |
| transaction_id | String | 是 | 交易流水号 32位 |
| gun_id | Number | 是 | 枪编号 (1~N) |
| result | Number | 是 | 账单上传结果1=成功0=失败 |
| type | String | 是 | "response" |
> **重试机制**若未收到响应间隔30秒重试一次最多重试3次。收到成功响应后本账单在充电桩本地删除。
---
## 附录:协议汇总表
| 编号 | cmd | 请求方 | 响应方 | 触发方式 |
|------|-----|--------|--------|----------|
| 1 | online | 充电桩 | 网关 | 上电 |
| 2 | heartbeat | 充电桩 | 网关 | 5~10s周期 |
| 3 | start charging | 网关 | 充电桩 | 网关下发 |
| 4 | end charging | 网关 | 充电桩 | 网关下发 |
| 5 | proactive end charging | 充电桩 | 网关 | 桩主动 |
| 6 | realtime data | 充电桩 | 网关 | 周期上送 |
| 7 | bms info | 充电桩 | 网关 | 桩主动 |
| 8 | charge config | 充电桩 | 网关 | 桩主动 |
| 9 | charge error | 充电桩 | 网关 | 桩主动 |
| 10 | bms stop | 充电桩 | 网关 | 桩主动 |
| 11 | charger stop | 充电桩 | 网关 | 桩主动 |
| 12 | charge process real | 充电桩 | 网关 | 15s周期 |
| 13 | bms info real | 充电桩 | 网关 | 15s周期 |
| 14 | settlement bill | 充电桩 | 网关 | 充电结束 |

View File

@@ -1,2 +1,2 @@
# BR_YKC
# 说明
文档请见/Doc 目录

View File

@@ -0,0 +1 @@
{"RootPath":"C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC","ProjectFileName":"YKC.csproj","Configuration":"Debug|AnyCPU","FrameworkPath":"","Sources":[{"SourceFile":"App.xaml.cs"},{"SourceFile":"MainWindow.xaml.cs"},{"SourceFile":"Properties\\AssemblyInfo.cs"},{"SourceFile":"Properties\\Resources.Designer.cs"},{"SourceFile":"Properties\\Settings.Designer.cs"},{"SourceFile":"obj\\Debug\\.NETFramework,Version=v4.7.2.AssemblyAttributes.cs"},{"SourceFile":"C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\obj\\Debug\\MainWindow.g.cs"},{"SourceFile":"C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\obj\\Debug\\App.g.cs"}],"References":[{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\Microsoft.CSharp.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\mscorlib.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\PresentationCore.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\PresentationFramework.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Core.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Data.DataSetExtensions.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Data.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Net.Http.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Xaml.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Xml.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Xml.Linq.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\WindowsBase.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""}],"Analyzers":[],"Outputs":[{"OutputItemFullPath":"C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\bin\\Debug\\YKC.exe","OutputItemRelativePath":"YKC.exe"},{"OutputItemFullPath":"","OutputItemRelativePath":""}],"CopyToOutputEntries":[]}

Binary file not shown.

View File

@@ -0,0 +1,228 @@
{
"Version": 1,
"WorkspaceRootPath": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\",
"Documents": [
{
"AbsoluteMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|c:\\users\\administrator\\pycharmprojects\\pythonproject\\c#\\ykc\\pages\\realtimepage.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
"RelativeMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|solutionrelative:pages\\realtimepage.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
},
{
"AbsoluteMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|c:\\users\\administrator\\pycharmprojects\\pythonproject\\c#\\ykc\\pages\\gatewaypage.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|solutionrelative:pages\\gatewaypage.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|c:\\users\\administrator\\pycharmprojects\\pythonproject\\c#\\ykc\\pages\\realtimepage.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|solutionrelative:pages\\realtimepage.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|c:\\users\\administrator\\pycharmprojects\\pythonproject\\c#\\ykc\\pages\\gatewaypage.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
"RelativeMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|solutionrelative:pages\\gatewaypage.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
},
{
"AbsoluteMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|c:\\users\\administrator\\pycharmprojects\\pythonproject\\c#\\ykc\\pages\\dashboardpage.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
"RelativeMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|solutionrelative:pages\\dashboardpage.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
},
{
"AbsoluteMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|c:\\users\\administrator\\pycharmprojects\\pythonproject\\c#\\ykc\\pages\\chargerpage.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
"RelativeMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|solutionrelative:pages\\chargerpage.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
},
{
"AbsoluteMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|c:\\users\\administrator\\pycharmprojects\\pythonproject\\c#\\ykc\\mainwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
"RelativeMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|solutionrelative:mainwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
},
{
"AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\AppData\\Local\\Temp\\.vsdbgsrc\\3714f74b82eacc6cf8dcf1e32980b0908d4f8b447d25d4eb08ff1424a7b57c02\\ResourcePart.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\app.config||{FA3CD31E-987B-443A-9B81-186104E8DAC1}",
"RelativeMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|solutionrelative:app.config||{FA3CD31E-987B-443A-9B81-186104E8DAC1}"
},
{
"AbsoluteMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|solutionrelative:mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\app.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
"RelativeMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|solutionrelative:app.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
},
{
"AbsoluteMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\app.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|solutionrelative:app.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{00000000-0000-0000-0000-000000000000}|\u003CSolution\u003E|YKC||{04B8AB82-A572-4FEF-95CE-5222444B6B64}|"
}
],
"DocumentGroupContainers": [
{
"Orientation": 0,
"VerticalTabListWidth": 256,
"DocumentGroups": [
{
"DockedWidth": 200,
"SelectedChildIndex": 0,
"Children": [
{
"$type": "Document",
"DocumentIndex": 0,
"Title": "RealtimePage.xaml",
"DocumentMoniker": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\Pages\\RealtimePage.xaml",
"RelativeDocumentMoniker": "Pages\\RealtimePage.xaml",
"ToolTip": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\Pages\\RealtimePage.xaml",
"RelativeToolTip": "Pages\\RealtimePage.xaml",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
"WhenOpened": "2026-05-20T03:56:55.66Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 2,
"Title": "RealtimePage.xaml.cs",
"DocumentMoniker": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\Pages\\RealtimePage.xaml.cs",
"RelativeDocumentMoniker": "Pages\\RealtimePage.xaml.cs",
"ToolTip": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\Pages\\RealtimePage.xaml.cs",
"RelativeToolTip": "Pages\\RealtimePage.xaml.cs",
"ViewState": "AgIAAFcAAAAAAAAAAAAowH8AAAAQAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-20T03:48:04.174Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 1,
"Title": "GatewayPage.xaml.cs",
"DocumentMoniker": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\Pages\\GatewayPage.xaml.cs",
"RelativeDocumentMoniker": "Pages\\GatewayPage.xaml.cs",
"ToolTip": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\Pages\\GatewayPage.xaml.cs",
"RelativeToolTip": "Pages\\GatewayPage.xaml.cs",
"ViewState": "AgIAAAAAAAAAAAAAAADwvwAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-20T03:56:52.729Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 4,
"Title": "DashboardPage.xaml",
"DocumentMoniker": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\Pages\\DashboardPage.xaml",
"RelativeDocumentMoniker": "Pages\\DashboardPage.xaml",
"ToolTip": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\Pages\\DashboardPage.xaml",
"RelativeToolTip": "Pages\\DashboardPage.xaml",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
"WhenOpened": "2026-05-20T03:55:04.048Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 5,
"Title": "ChargerPage.xaml",
"DocumentMoniker": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\Pages\\ChargerPage.xaml",
"RelativeDocumentMoniker": "Pages\\ChargerPage.xaml",
"ToolTip": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\Pages\\ChargerPage.xaml",
"RelativeToolTip": "Pages\\ChargerPage.xaml",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
"WhenOpened": "2026-05-20T03:55:01.467Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 9,
"Title": "MainWindow.xaml.cs",
"DocumentMoniker": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\MainWindow.xaml.cs",
"RelativeDocumentMoniker": "MainWindow.xaml.cs",
"ToolTip": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\MainWindow.xaml.cs",
"RelativeToolTip": "MainWindow.xaml.cs",
"ViewState": "AgIAADMAAAAAAAAAAAAewEoAAAAMAAAAAAAAAA==",
"Icon": "00000000-0000-0000-0000-000000000000.000000|iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJ7SURBVDhP7ZQ9aBNhGMef9y7t2eH0TOPHnbnzzmDjkpTqNSEdShDBpRbBQbEI/bCSRVA7iFWk1OpS0CGDH5OlgQgZihRioTgU0VzTEKhSTeLg2aYBLUIgzfUj17wuXptcQUFdBH/j83//P953eF4AE0eGZljXkLL4ZErFsY9LA\u002Bb8VyDz4NGUyiKARDJb5A7srMkc27Wcjr98DpFIBLxeL/A8Hx4cHAybewbkwZuvB9aPXvDrcqcfPJ3\u002BN2rBX1dDtMTUZeqbptfr\u002BgYqZd/G5ubmzrAs66Ioql6W5dL09PQ7swwAgGRaL/YVS5jTcZkDBBwug50kCelLoWQBQIAttbHJh7f6McadVqs1RdP0HoRQk8/n\u002B\u002BR0OnOzs7N6pXDbk1\u002B8/8oifSMxMrPECUzt8mmXdezsCfk6QRAJh8Nxw\u002BPxHNI07TIA6ABwslwufwgGg2tGn6jWAdyb\u002BAx3J7PgE2k43rD7Md5Re8XIenp6HnR3dwMAXAWAeoTQBEKotbJfdcPh4eHmdUz0TerusXMtDVoTX5f2OvZment7WYvFklhZWeHm5\u002BczuVwuzzCM50etXVGUccNh2dIBKIqyjyCI1v3kzLVA/7OcMW9sbCwUi8X70WiUVlUVAABWV1dfYYwvEcS2R24hSVKbKIo5nuc5c2ZGEARWFMVFSZJOVc5/ov89/gv/nH9MSFEU2Gw2aygUeppOp41N2EYqlWoOhUIjgiBYGYapyqpWLxAItJEkOW632yEej4eTyWSmMjdwu92HZVk\u002Bn8/nQdf19mAwuLl6VcLR0dFmTdNuRyIRWFhYgLW1zU\u002BkCpIkwWazQVdXF9A0faejoyNuPvPX\u002BA5Fb\u002BAHZWstowAAAABJRU5ErkJggg==",
"WhenOpened": "2026-05-13T09:04:45.364Z"
},
{
"$type": "Document",
"DocumentIndex": 11,
"Title": "App.xaml.cs",
"DocumentMoniker": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\App.xaml.cs",
"RelativeDocumentMoniker": "App.xaml.cs",
"ToolTip": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\App.xaml.cs",
"RelativeToolTip": "App.xaml.cs",
"ViewState": "AgIAAAAAAAAAAAAAAADwvwAAAAAAAAAAAAAAAA==",
"Icon": "00000000-0000-0000-0000-000000000000.000000|iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJ7SURBVDhP7ZQ9aBNhGMef9y7t2eH0TOPHnbnzzmDjkpTqNSEdShDBpRbBQbEI/bCSRVA7iFWk1OpS0CGDH5OlgQgZihRioTgU0VzTEKhSTeLg2aYBLUIgzfUj17wuXptcQUFdBH/j83//P953eF4AE0eGZljXkLL4ZErFsY9LA\u002Bb8VyDz4NGUyiKARDJb5A7srMkc27Wcjr98DpFIBLxeL/A8Hx4cHAybewbkwZuvB9aPXvDrcqcfPJ3\u002BN2rBX1dDtMTUZeqbptfr\u002BgYqZd/G5ubmzrAs66Ioql6W5dL09PQ7swwAgGRaL/YVS5jTcZkDBBwug50kCelLoWQBQIAttbHJh7f6McadVqs1RdP0HoRQk8/n\u002B\u002BR0OnOzs7N6pXDbk1\u002B8/8oifSMxMrPECUzt8mmXdezsCfk6QRAJh8Nxw\u002BPxHNI07TIA6ABwslwufwgGg2tGn6jWAdyb\u002BAx3J7PgE2k43rD7Md5Re8XIenp6HnR3dwMAXAWAeoTQBEKotbJfdcPh4eHmdUz0TerusXMtDVoTX5f2OvZment7WYvFklhZWeHm5\u002BczuVwuzzCM50etXVGUccNh2dIBKIqyjyCI1v3kzLVA/7OcMW9sbCwUi8X70WiUVlUVAABWV1dfYYwvEcS2R24hSVKbKIo5nuc5c2ZGEARWFMVFSZJOVc5/ov89/gv/nH9MSFEU2Gw2aygUeppOp41N2EYqlWoOhUIjgiBYGYapyqpWLxAItJEkOW632yEej4eTyWSmMjdwu92HZVk\u002Bn8/nQdf19mAwuLl6VcLR0dFmTdNuRyIRWFhYgLW1zU\u002BkCpIkwWazQVdXF9A0faejoyNuPvPX\u002BA5Fb\u002BAHZWstowAAAABJRU5ErkJggg==",
"WhenOpened": "2026-05-13T09:10:18.727Z"
},
{
"$type": "Document",
"DocumentIndex": 10,
"Title": "App.xaml",
"DocumentMoniker": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\App.xaml",
"RelativeDocumentMoniker": "App.xaml",
"ToolTip": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\App.xaml",
"RelativeToolTip": "App.xaml",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
"WhenOpened": "2026-05-13T09:08:55.359Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 6,
"Title": "MainWindow.xaml",
"DocumentMoniker": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\MainWindow.xaml",
"RelativeDocumentMoniker": "MainWindow.xaml",
"ToolTip": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\MainWindow.xaml",
"RelativeToolTip": "MainWindow.xaml",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
"WhenOpened": "2026-05-13T09:04:45.868Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 3,
"Title": "GatewayPage.xaml",
"DocumentMoniker": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\Pages\\GatewayPage.xaml",
"RelativeDocumentMoniker": "Pages\\GatewayPage.xaml",
"ToolTip": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\Pages\\GatewayPage.xaml",
"RelativeToolTip": "Pages\\GatewayPage.xaml",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
"WhenOpened": "2026-05-20T03:55:06.415Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 12,
"Title": "YKC",
"DocumentMoniker": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\YKC.csproj",
"RelativeDocumentMoniker": "YKC.csproj",
"ToolTip": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\YKC.csproj",
"RelativeToolTip": "YKC.csproj",
"Icon": "00000000-0000-0000-0000-000000000000.000000|iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALUSURBVDhP5ZRfSFNRHMe/5267zrur003TDJrTQJx/yGHRCMFAM3CTRHqoJ6EyiHyIyDdBHwoSRz340OpFihYMwzCD6GnkSOthD7aFuzhMJMUY5vXavNe7u9NLylwpPQZ94Lz8fr/P9xwOhwP8dxAA8Pl8J2ZmZkqmp6ehKEr2zIF0dnbCbrcLvb29AgDoAUCSpH69Xu/heV6RZXktW/oThBCd2Wy2Ukp1siwPAhgAAAYARkdHUVxcDK/XO6VpWuPfrK6urraRkZGEKIoIBAJ7d7PZbBPt7e3\u002BWCx2cm9nfwRByBEEodXlcn2orKwc2KkT/AoEEO5\u002B2u1PqslL/rknaDl6FscKKoL9TYNBR8DBM5J2jdGTV9o2LWOAsk9XY/5Md3FxcQAAdABQUFBwEcCK5Uy\u002BIqUkn8VoaTYZuOat1NbidlvqM01uuxVNvbMp/1BSVG2hhLQfOV\u002B6kNtpWkYQFwCsiKIYxM4d7jC\u002B8BKhr1PpW87b3yilK1PL7ySqqvVpiuHvypp5U5VurCtih7S9UQ9Kh/NSeeZMH9mBALCurCfG4i/OMZqhUaV4tMEkQ0m62Zam6QQFuQkCn6IpU5Tq2yLmSCLb/y2QZ03mjnLPPU2vPmQJcfOUr\u002BNgGiJgzCD0Oig8rI6tA9GGHKLj4BO6Slw4XtSQ8/rLZCtD4XFYaqp0KU0EQ2bzWF7NYXLinIFbztVxIkh6ViOamukjO/DU4dOr1ZbqyTEhMElBJmsKa4XZnjmBUP3dPEP\u002BeKmx5IGVLXzMs6Znkcsxb\u002BxKTMr0dykvL59oaGgYjkQiluzeflBKmfn5\u002BUNVVVVvbTbb7jtkAIDjOLjd7h6WZe/vsQ4gHo8XaZr2pra2timzTgCgr69vQhRFz9LS0mo0Gv2YObAfHMcZnU5nk9VqNRoMhkGv1zuAnc/Bbrc/D4VC4Wg0mu3tiyzLCIfD791uNyoqKoLZ/X\u002BXn25ERIg8ycqdAAAAAElFTkSuQmCC",
"WhenOpened": "2026-05-13T09:08:51.991Z"
},
{
"$type": "Document",
"DocumentIndex": 8,
"Title": "App.config",
"DocumentMoniker": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\App.config",
"RelativeDocumentMoniker": "App.config",
"ToolTip": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\App.config",
"RelativeToolTip": "App.config",
"ViewState": "AgIAAAAAAAAAAAAAAADwvwUAAAAQAAAAAAAAAA==",
"Icon": "00000000-0000-0000-0000-000000000000.000000|iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOhSURBVDhPrZRPSCNXHMe/LxNjTbquSYiLSYwV/1MwEEwFIWsOBQ/\u002BxS6ElUV6qiIG3ZNQSrGswQotu4i3QqkHXTCIYbeHFi9u2Wo1YhSNh7mkQaNpzWSMzDATNXm9OKIj2B76gXd53\u002B/vw\u002BM9eMD/DFFvzM3NGQG8DAaDpv39fWSz2Vu50\u002BlEY2NjeGJi4sWt4ApGveFwOIyJRGLK4XA0GY3G41gs9geA46vltVgsLSaTydbc3Fzo8Xj2VldXz2/O3zmhy\u002BUqA7A5ODiY8Hq9r2pra\u002BeVrKKi4k1lZWWd0\u002BnMAKgC8JxS\u002Buv09PRfSkdzbboilUohnU5jcnLyxU2ZQiaTeVtWVvYdpfSSEPIjIaRtaGjoQyW/I/w3Ojs7v\u002Bjr6/uMENJGKU0BeKnVageUXHu7DgQCAVBKAQD9/f23svb2diQSiQfDw8Ot0WjUaDKZHjIM8wGl9IHSuX6UcDjsbWpq\u002BnxmZsZrtVpbCgoKCn0\u002BH7e0tPSn0nny5Alisdje1tbWZj6fPxBF8XdBEKyCIOxlMpkV3HyUcDjcF4lERoPBoJvnebhcLpSXl8\u002BXlpa\u002BGhgYCCs9NRUVFW8AbMXj8XEA0ITD4TKWZQvdbve8wWD4sqen5\u002B\u002BLi4vc8vIydnd3\u002BwRB\u002BFotuQ8NIWQzk8k8BoDz8/P3sViszWKxpPR6PaLRKBYWFtQz98Kk0\u002Bnvj46O6rq7u8Xe3t6Cqqqqb1dWVmp5ntfKsgxJklie51\u002BrBxVKSkqeAjhW7pBhGGZclmVbKpUyb29vf3xwcNCzs7OjFUURVwWW47j/LNQ2NDSAZVkwDONNJpM4OTlBNpsFpRRarRZFRUWPRkdHP\u002BV5/v3s7KysFqrReL3eY6vVmhVFEYlEArIsgxACQgguLy\u002Bh0\u002BnckiTNGQyGer/fX6gWqNHkcrmmjo6O31pbW1FcXAyNRgOz2QydTgcA4DgOa2tr5lwu9wsh5LFaoEbj9/uP9Hr9VzqdrosQ0kUp7WIYpsvj8WzU1NQgn89DEAQmEok84jhuYmRk5CkAxONxI8uyP7W0tHxiMpmuhQwAhEKhxMbGBptMJtnT01P28PCQ9fl8IqXUrNFoPuI4DqIoglJqOzs728vn80ehUOi5LMvP9Hq9yW63v1tfX1/BfZ/D2NjY6\u002Brq6h/q6\u002BvDdrsdDMNAkiQIggAAD3mer1tcXHxnMBh\u002BdrvdrDJ35z9UMzU11SFJ0ttgMAi32w2bzfZNIBAYV/cU/gFl85csP2dGWAAAAABJRU5ErkJggg==",
"WhenOpened": "2026-05-13T09:08:54.548Z"
},
{
"$type": "Document",
"DocumentIndex": 7,
"Title": "ResourcePart.cs",
"DocumentMoniker": "C:\\Users\\Administrator\\AppData\\Local\\Temp\\.vsdbgsrc\\3714f74b82eacc6cf8dcf1e32980b0908d4f8b447d25d4eb08ff1424a7b57c02\\ResourcePart.cs",
"RelativeDocumentMoniker": "..\\..\\..\\..\\AppData\\Local\\Temp\\.vsdbgsrc\\3714f74b82eacc6cf8dcf1e32980b0908d4f8b447d25d4eb08ff1424a7b57c02\\ResourcePart.cs",
"ToolTip": "C:\\Users\\Administrator\\AppData\\Local\\Temp\\.vsdbgsrc\\3714f74b82eacc6cf8dcf1e32980b0908d4f8b447d25d4eb08ff1424a7b57c02\\ResourcePart.cs [\u53EA\u8BFB]",
"RelativeToolTip": "..\\..\\..\\..\\AppData\\Local\\Temp\\.vsdbgsrc\\3714f74b82eacc6cf8dcf1e32980b0908d4f8b447d25d4eb08ff1424a7b57c02\\ResourcePart.cs [\u53EA\u8BFB]",
"ViewState": "AgIAABMAAAAAAAAAAAAowCcAAAADAAAAAQAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-13T09:19:37.213Z",
"EditorCaption": " [\u53EA\u8BFB]"
}
]
}
]
}
]
}

View File

@@ -0,0 +1,228 @@
{
"Version": 1,
"WorkspaceRootPath": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\",
"Documents": [
{
"AbsoluteMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|c:\\users\\administrator\\pycharmprojects\\pythonproject\\c#\\ykc\\pages\\realtimepage.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
"RelativeMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|solutionrelative:pages\\realtimepage.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
},
{
"AbsoluteMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|c:\\users\\administrator\\pycharmprojects\\pythonproject\\c#\\ykc\\pages\\gatewaypage.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|solutionrelative:pages\\gatewaypage.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|c:\\users\\administrator\\pycharmprojects\\pythonproject\\c#\\ykc\\pages\\realtimepage.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|solutionrelative:pages\\realtimepage.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|c:\\users\\administrator\\pycharmprojects\\pythonproject\\c#\\ykc\\pages\\gatewaypage.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
"RelativeMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|solutionrelative:pages\\gatewaypage.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
},
{
"AbsoluteMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|c:\\users\\administrator\\pycharmprojects\\pythonproject\\c#\\ykc\\pages\\dashboardpage.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
"RelativeMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|solutionrelative:pages\\dashboardpage.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
},
{
"AbsoluteMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|c:\\users\\administrator\\pycharmprojects\\pythonproject\\c#\\ykc\\pages\\chargerpage.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
"RelativeMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|solutionrelative:pages\\chargerpage.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
},
{
"AbsoluteMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|c:\\users\\administrator\\pycharmprojects\\pythonproject\\c#\\ykc\\mainwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
"RelativeMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|solutionrelative:mainwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
},
{
"AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\AppData\\Local\\Temp\\.vsdbgsrc\\3714f74b82eacc6cf8dcf1e32980b0908d4f8b447d25d4eb08ff1424a7b57c02\\ResourcePart.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\app.config||{FA3CD31E-987B-443A-9B81-186104E8DAC1}",
"RelativeMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|solutionrelative:app.config||{FA3CD31E-987B-443A-9B81-186104E8DAC1}"
},
{
"AbsoluteMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|solutionrelative:mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\app.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
"RelativeMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|solutionrelative:app.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
},
{
"AbsoluteMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\app.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}|YKC.csproj|solutionrelative:app.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{00000000-0000-0000-0000-000000000000}|\u003CSolution\u003E|YKC||{04B8AB82-A572-4FEF-95CE-5222444B6B64}|"
}
],
"DocumentGroupContainers": [
{
"Orientation": 0,
"VerticalTabListWidth": 256,
"DocumentGroups": [
{
"DockedWidth": 200,
"SelectedChildIndex": 0,
"Children": [
{
"$type": "Document",
"DocumentIndex": 0,
"Title": "RealtimePage.xaml",
"DocumentMoniker": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\Pages\\RealtimePage.xaml",
"RelativeDocumentMoniker": "Pages\\RealtimePage.xaml",
"ToolTip": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\Pages\\RealtimePage.xaml",
"RelativeToolTip": "Pages\\RealtimePage.xaml",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
"WhenOpened": "2026-05-20T03:56:55.66Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 2,
"Title": "RealtimePage.xaml.cs",
"DocumentMoniker": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\Pages\\RealtimePage.xaml.cs",
"RelativeDocumentMoniker": "Pages\\RealtimePage.xaml.cs",
"ToolTip": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\Pages\\RealtimePage.xaml.cs",
"RelativeToolTip": "Pages\\RealtimePage.xaml.cs",
"ViewState": "AgIAAFcAAAAAAAAAAAAowH8AAAAQAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-20T03:48:04.174Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 1,
"Title": "GatewayPage.xaml.cs",
"DocumentMoniker": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\Pages\\GatewayPage.xaml.cs",
"RelativeDocumentMoniker": "Pages\\GatewayPage.xaml.cs",
"ToolTip": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\Pages\\GatewayPage.xaml.cs",
"RelativeToolTip": "Pages\\GatewayPage.xaml.cs",
"ViewState": "AgIAAAAAAAAAAAAAAADwvwAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-20T03:56:52.729Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 4,
"Title": "DashboardPage.xaml",
"DocumentMoniker": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\Pages\\DashboardPage.xaml",
"RelativeDocumentMoniker": "Pages\\DashboardPage.xaml",
"ToolTip": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\Pages\\DashboardPage.xaml",
"RelativeToolTip": "Pages\\DashboardPage.xaml",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
"WhenOpened": "2026-05-20T03:55:04.048Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 5,
"Title": "ChargerPage.xaml",
"DocumentMoniker": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\Pages\\ChargerPage.xaml",
"RelativeDocumentMoniker": "Pages\\ChargerPage.xaml",
"ToolTip": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\Pages\\ChargerPage.xaml",
"RelativeToolTip": "Pages\\ChargerPage.xaml",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
"WhenOpened": "2026-05-20T03:55:01.467Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 9,
"Title": "MainWindow.xaml.cs",
"DocumentMoniker": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\MainWindow.xaml.cs",
"RelativeDocumentMoniker": "MainWindow.xaml.cs",
"ToolTip": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\MainWindow.xaml.cs",
"RelativeToolTip": "MainWindow.xaml.cs",
"ViewState": "AgIAADMAAAAAAAAAAAAewEoAAAAMAAAAAAAAAA==",
"Icon": "00000000-0000-0000-0000-000000000000.000000|iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJ7SURBVDhP7ZQ9aBNhGMef9y7t2eH0TOPHnbnzzmDjkpTqNSEdShDBpRbBQbEI/bCSRVA7iFWk1OpS0CGDH5OlgQgZihRioTgU0VzTEKhSTeLg2aYBLUIgzfUj17wuXptcQUFdBH/j83//P953eF4AE0eGZljXkLL4ZErFsY9LA\u002Bb8VyDz4NGUyiKARDJb5A7srMkc27Wcjr98DpFIBLxeL/A8Hx4cHAybewbkwZuvB9aPXvDrcqcfPJ3\u002BN2rBX1dDtMTUZeqbptfr\u002BgYqZd/G5ubmzrAs66Ioql6W5dL09PQ7swwAgGRaL/YVS5jTcZkDBBwug50kCelLoWQBQIAttbHJh7f6McadVqs1RdP0HoRQk8/n\u002B\u002BR0OnOzs7N6pXDbk1\u002B8/8oifSMxMrPECUzt8mmXdezsCfk6QRAJh8Nxw\u002BPxHNI07TIA6ABwslwufwgGg2tGn6jWAdyb\u002BAx3J7PgE2k43rD7Md5Re8XIenp6HnR3dwMAXAWAeoTQBEKotbJfdcPh4eHmdUz0TerusXMtDVoTX5f2OvZment7WYvFklhZWeHm5\u002BczuVwuzzCM50etXVGUccNh2dIBKIqyjyCI1v3kzLVA/7OcMW9sbCwUi8X70WiUVlUVAABWV1dfYYwvEcS2R24hSVKbKIo5nuc5c2ZGEARWFMVFSZJOVc5/ov89/gv/nH9MSFEU2Gw2aygUeppOp41N2EYqlWoOhUIjgiBYGYapyqpWLxAItJEkOW632yEej4eTyWSmMjdwu92HZVk\u002Bn8/nQdf19mAwuLl6VcLR0dFmTdNuRyIRWFhYgLW1zU\u002BkCpIkwWazQVdXF9A0faejoyNuPvPX\u002BA5Fb\u002BAHZWstowAAAABJRU5ErkJggg==",
"WhenOpened": "2026-05-13T09:04:45.364Z"
},
{
"$type": "Document",
"DocumentIndex": 11,
"Title": "App.xaml.cs",
"DocumentMoniker": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\App.xaml.cs",
"RelativeDocumentMoniker": "App.xaml.cs",
"ToolTip": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\App.xaml.cs",
"RelativeToolTip": "App.xaml.cs",
"ViewState": "AgIAAAAAAAAAAAAAAADwvwAAAAAAAAAAAAAAAA==",
"Icon": "00000000-0000-0000-0000-000000000000.000000|iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJ7SURBVDhP7ZQ9aBNhGMef9y7t2eH0TOPHnbnzzmDjkpTqNSEdShDBpRbBQbEI/bCSRVA7iFWk1OpS0CGDH5OlgQgZihRioTgU0VzTEKhSTeLg2aYBLUIgzfUj17wuXptcQUFdBH/j83//P953eF4AE0eGZljXkLL4ZErFsY9LA\u002Bb8VyDz4NGUyiKARDJb5A7srMkc27Wcjr98DpFIBLxeL/A8Hx4cHAybewbkwZuvB9aPXvDrcqcfPJ3\u002BN2rBX1dDtMTUZeqbptfr\u002BgYqZd/G5ubmzrAs66Ioql6W5dL09PQ7swwAgGRaL/YVS5jTcZkDBBwug50kCelLoWQBQIAttbHJh7f6McadVqs1RdP0HoRQk8/n\u002B\u002BR0OnOzs7N6pXDbk1\u002B8/8oifSMxMrPECUzt8mmXdezsCfk6QRAJh8Nxw\u002BPxHNI07TIA6ABwslwufwgGg2tGn6jWAdyb\u002BAx3J7PgE2k43rD7Md5Re8XIenp6HnR3dwMAXAWAeoTQBEKotbJfdcPh4eHmdUz0TerusXMtDVoTX5f2OvZment7WYvFklhZWeHm5\u002BczuVwuzzCM50etXVGUccNh2dIBKIqyjyCI1v3kzLVA/7OcMW9sbCwUi8X70WiUVlUVAABWV1dfYYwvEcS2R24hSVKbKIo5nuc5c2ZGEARWFMVFSZJOVc5/ov89/gv/nH9MSFEU2Gw2aygUeppOp41N2EYqlWoOhUIjgiBYGYapyqpWLxAItJEkOW632yEej4eTyWSmMjdwu92HZVk\u002Bn8/nQdf19mAwuLl6VcLR0dFmTdNuRyIRWFhYgLW1zU\u002BkCpIkwWazQVdXF9A0faejoyNuPvPX\u002BA5Fb\u002BAHZWstowAAAABJRU5ErkJggg==",
"WhenOpened": "2026-05-13T09:10:18.727Z"
},
{
"$type": "Document",
"DocumentIndex": 10,
"Title": "App.xaml",
"DocumentMoniker": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\App.xaml",
"RelativeDocumentMoniker": "App.xaml",
"ToolTip": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\App.xaml",
"RelativeToolTip": "App.xaml",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
"WhenOpened": "2026-05-13T09:08:55.359Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 6,
"Title": "MainWindow.xaml",
"DocumentMoniker": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\MainWindow.xaml",
"RelativeDocumentMoniker": "MainWindow.xaml",
"ToolTip": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\MainWindow.xaml",
"RelativeToolTip": "MainWindow.xaml",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
"WhenOpened": "2026-05-13T09:04:45.868Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 3,
"Title": "GatewayPage.xaml",
"DocumentMoniker": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\Pages\\GatewayPage.xaml",
"RelativeDocumentMoniker": "Pages\\GatewayPage.xaml",
"ToolTip": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\Pages\\GatewayPage.xaml",
"RelativeToolTip": "Pages\\GatewayPage.xaml",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
"WhenOpened": "2026-05-20T03:55:06.415Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 12,
"Title": "YKC",
"DocumentMoniker": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\YKC.csproj",
"RelativeDocumentMoniker": "YKC.csproj",
"ToolTip": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\YKC.csproj",
"RelativeToolTip": "YKC.csproj",
"Icon": "00000000-0000-0000-0000-000000000000.000000|iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALUSURBVDhP5ZRfSFNRHMe/5267zrur003TDJrTQJx/yGHRCMFAM3CTRHqoJ6EyiHyIyDdBHwoSRz340OpFihYMwzCD6GnkSOthD7aFuzhMJMUY5vXavNe7u9NLylwpPQZ94Lz8fr/P9xwOhwP8dxAA8Pl8J2ZmZkqmp6ehKEr2zIF0dnbCbrcLvb29AgDoAUCSpH69Xu/heV6RZXktW/oThBCd2Wy2Ukp1siwPAhgAAAYARkdHUVxcDK/XO6VpWuPfrK6urraRkZGEKIoIBAJ7d7PZbBPt7e3\u002BWCx2cm9nfwRByBEEodXlcn2orKwc2KkT/AoEEO5\u002B2u1PqslL/rknaDl6FscKKoL9TYNBR8DBM5J2jdGTV9o2LWOAsk9XY/5Md3FxcQAAdABQUFBwEcCK5Uy\u002BIqUkn8VoaTYZuOat1NbidlvqM01uuxVNvbMp/1BSVG2hhLQfOV\u002B6kNtpWkYQFwCsiKIYxM4d7jC\u002B8BKhr1PpW87b3yilK1PL7ySqqvVpiuHvypp5U5VurCtih7S9UQ9Kh/NSeeZMH9mBALCurCfG4i/OMZqhUaV4tMEkQ0m62Zam6QQFuQkCn6IpU5Tq2yLmSCLb/y2QZ03mjnLPPU2vPmQJcfOUr\u002BNgGiJgzCD0Oig8rI6tA9GGHKLj4BO6Slw4XtSQ8/rLZCtD4XFYaqp0KU0EQ2bzWF7NYXLinIFbztVxIkh6ViOamukjO/DU4dOr1ZbqyTEhMElBJmsKa4XZnjmBUP3dPEP\u002BeKmx5IGVLXzMs6Znkcsxb\u002BxKTMr0dykvL59oaGgYjkQiluzeflBKmfn5\u002BUNVVVVvbTbb7jtkAIDjOLjd7h6WZe/vsQ4gHo8XaZr2pra2timzTgCgr69vQhRFz9LS0mo0Gv2YObAfHMcZnU5nk9VqNRoMhkGv1zuAnc/Bbrc/D4VC4Wg0mu3tiyzLCIfD791uNyoqKoLZ/X\u002BXn25ERIg8ycqdAAAAAElFTkSuQmCC",
"WhenOpened": "2026-05-13T09:08:51.991Z"
},
{
"$type": "Document",
"DocumentIndex": 8,
"Title": "App.config",
"DocumentMoniker": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\App.config",
"RelativeDocumentMoniker": "App.config",
"ToolTip": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\App.config",
"RelativeToolTip": "App.config",
"ViewState": "AgIAAAAAAAAAAAAAAADwvwUAAAAQAAAAAAAAAA==",
"Icon": "00000000-0000-0000-0000-000000000000.000000|iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOhSURBVDhPrZRPSCNXHMe/LxNjTbquSYiLSYwV/1MwEEwFIWsOBQ/\u002BxS6ElUV6qiIG3ZNQSrGswQotu4i3QqkHXTCIYbeHFi9u2Wo1YhSNh7mkQaNpzWSMzDATNXm9OKIj2B76gXd53\u002B/vw\u002BM9eMD/DFFvzM3NGQG8DAaDpv39fWSz2Vu50\u002BlEY2NjeGJi4sWt4ApGveFwOIyJRGLK4XA0GY3G41gs9geA46vltVgsLSaTydbc3Fzo8Xj2VldXz2/O3zmhy\u002BUqA7A5ODiY8Hq9r2pra\u002BeVrKKi4k1lZWWd0\u002BnMAKgC8JxS\u002Buv09PRfSkdzbboilUohnU5jcnLyxU2ZQiaTeVtWVvYdpfSSEPIjIaRtaGjoQyW/I/w3Ojs7v\u002Bjr6/uMENJGKU0BeKnVageUXHu7DgQCAVBKAQD9/f23svb2diQSiQfDw8Ot0WjUaDKZHjIM8wGl9IHSuX6UcDjsbWpq\u002BnxmZsZrtVpbCgoKCn0\u002BH7e0tPSn0nny5Alisdje1tbWZj6fPxBF8XdBEKyCIOxlMpkV3HyUcDjcF4lERoPBoJvnebhcLpSXl8\u002BXlpa\u002BGhgYCCs9NRUVFW8AbMXj8XEA0ITD4TKWZQvdbve8wWD4sqen5\u002B\u002BLi4vc8vIydnd3\u002BwRB\u002BFotuQ8NIWQzk8k8BoDz8/P3sViszWKxpPR6PaLRKBYWFtQz98Kk0\u002Bnvj46O6rq7u8Xe3t6Cqqqqb1dWVmp5ntfKsgxJklie51\u002BrBxVKSkqeAjhW7pBhGGZclmVbKpUyb29vf3xwcNCzs7OjFUURVwWW47j/LNQ2NDSAZVkwDONNJpM4OTlBNpsFpRRarRZFRUWPRkdHP\u002BV5/v3s7KysFqrReL3eY6vVmhVFEYlEArIsgxACQgguLy\u002Bh0\u002BnckiTNGQyGer/fX6gWqNHkcrmmjo6O31pbW1FcXAyNRgOz2QydTgcA4DgOa2tr5lwu9wsh5LFaoEbj9/uP9Hr9VzqdrosQ0kUp7WIYpsvj8WzU1NQgn89DEAQmEok84jhuYmRk5CkAxONxI8uyP7W0tHxiMpmuhQwAhEKhxMbGBptMJtnT01P28PCQ9fl8IqXUrNFoPuI4DqIoglJqOzs728vn80ehUOi5LMvP9Hq9yW63v1tfX1/BfZ/D2NjY6\u002Brq6h/q6\u002BvDdrsdDMNAkiQIggAAD3mer1tcXHxnMBh\u002BdrvdrDJ35z9UMzU11SFJ0ttgMAi32w2bzfZNIBAYV/cU/gFl85csP2dGWAAAAABJRU5ErkJggg==",
"WhenOpened": "2026-05-13T09:08:54.548Z"
},
{
"$type": "Document",
"DocumentIndex": 7,
"Title": "ResourcePart.cs",
"DocumentMoniker": "C:\\Users\\Administrator\\AppData\\Local\\Temp\\.vsdbgsrc\\3714f74b82eacc6cf8dcf1e32980b0908d4f8b447d25d4eb08ff1424a7b57c02\\ResourcePart.cs",
"RelativeDocumentMoniker": "..\\..\\..\\..\\AppData\\Local\\Temp\\.vsdbgsrc\\3714f74b82eacc6cf8dcf1e32980b0908d4f8b447d25d4eb08ff1424a7b57c02\\ResourcePart.cs",
"ToolTip": "C:\\Users\\Administrator\\AppData\\Local\\Temp\\.vsdbgsrc\\3714f74b82eacc6cf8dcf1e32980b0908d4f8b447d25d4eb08ff1424a7b57c02\\ResourcePart.cs [\u53EA\u8BFB]",
"RelativeToolTip": "..\\..\\..\\..\\AppData\\Local\\Temp\\.vsdbgsrc\\3714f74b82eacc6cf8dcf1e32980b0908d4f8b447d25d4eb08ff1424a7b57c02\\ResourcePart.cs [\u53EA\u8BFB]",
"ViewState": "AgIAABMAAAAAAAAAAAAowCcAAAADAAAAAQAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-13T09:19:37.213Z",
"EditorCaption": " [\u53EA\u8BFB]"
}
]
}
]
}
]
}

6
上位机/YKC/App.config Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
</configuration>

274
上位机/YKC/App.xaml Normal file
View File

@@ -0,0 +1,274 @@
<Application x:Class="YKC.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="LoginWindow.xaml">
<Application.Resources>
<!-- 颜色 -->
<SolidColorBrush x:Key="PrimaryBrush" Color="#3B82F6"/>
<SolidColorBrush x:Key="PrimaryDarkBrush" Color="#2563EB"/>
<SolidColorBrush x:Key="SidebarBrush" Color="#1E293B"/>
<SolidColorBrush x:Key="BgBrush" Color="#F0F2F5"/>
<SolidColorBrush x:Key="CardBrush" Color="#FFFFFF"/>
<SolidColorBrush x:Key="BorderBrush" Color="#E2E8F0"/>
<SolidColorBrush x:Key="TextBrush" Color="#1E293B"/>
<SolidColorBrush x:Key="TextDimBrush" Color="#64748B"/>
<SolidColorBrush x:Key="TextLightBrush" Color="#94A3B8"/>
<SolidColorBrush x:Key="SuccessBrush" Color="#10B981"/>
<SolidColorBrush x:Key="DangerBrush" Color="#EF4444"/>
<!-- 圆角输入框样式 -->
<Style x:Key="FormInput" TargetType="TextBox">
<Setter Property="Padding" Value="10,8"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="BorderBrush" Value="#E2E8F0"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBox">
<Border Background="White" BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="4">
<ScrollViewer x:Name="PART_ContentHost" Margin="{TemplateBinding Padding}"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- 密码框样式 -->
<Style x:Key="PwdInput" TargetType="PasswordBox">
<Setter Property="Padding" Value="10,8"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="BorderBrush" Value="#E2E8F0"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="PasswordBox">
<Border Background="White" BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="4">
<Grid>
<Rectangle Fill="Transparent"/>
<ScrollViewer x:Name="PART_ContentHost"
Margin="{TemplateBinding Padding}"
VerticalAlignment="Center"/>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- 蓝色主按钮 -->
<Style x:Key="BtnPrimary" TargetType="Button">
<Setter Property="Background" Value="#3B82F6"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="Padding" Value="20,9"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Background="{TemplateBinding Background}" CornerRadius="4"
Padding="{TemplateBinding Padding}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#2563EB"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Opacity" Value="0.5"/>
</Trigger>
</Style.Triggers>
</Style>
<!-- 白色边框按钮 -->
<Style x:Key="BtnOutline" TargetType="Button" BasedOn="{StaticResource BtnPrimary}">
<Setter Property="Background" Value="White"/>
<Setter Property="Foreground" Value="#3B82F6"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="BorderBrush" Value="#3B82F6"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#EFF6FF"/>
</Trigger>
</Style.Triggers>
</Style>
<!-- 红色危险按钮 -->
<Style x:Key="BtnDanger" TargetType="Button" BasedOn="{StaticResource BtnPrimary}">
<Setter Property="Background" Value="#EF4444"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#DC2626"/>
</Trigger>
</Style.Triggers>
</Style>
<!-- 侧边导航按钮 -->
<Style x:Key="NavBtn" TargetType="Button">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Foreground" Value="#8899AA"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="Height" Value="44"/>
<Setter Property="HorizontalContentAlignment" Value="Left"/>
<Setter Property="Padding" Value="22,0,0,0"/>
<Setter Property="BorderThickness" Value="3,0,0,0"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid>
<Border Background="{TemplateBinding Background}"
Padding="{TemplateBinding Padding}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="Center"/>
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#1A2433"/>
<Setter Property="Foreground" Value="#CCDDEE"/>
</Trigger>
</Style.Triggers>
</Style>
<!-- 表单标签(在输入框上方) -->
<Style x:Key="FieldLabel" TargetType="TextBlock">
<Setter Property="Foreground" Value="#64748B"/>
<Setter Property="FontSize" Value="13"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="Margin" Value="0,0,0,4"/>
</Style>
<!-- 信息行标签(灰色小字) -->
<Style x:Key="InfoLabel" TargetType="TextBlock">
<Setter Property="Foreground" Value="#94A3B8"/>
<Setter Property="FontSize" Value="12"/>
<Setter Property="Margin" Value="0,0,0,2"/>
</Style>
<!-- 信息行值 -->
<Style x:Key="InfoValue" TargetType="TextBlock">
<Setter Property="Foreground" Value="#1E293B"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="Margin" Value="0,0,0,8"/>
</Style>
<!-- 徽章 -->
<Style x:Key="Badge" TargetType="TextBlock">
<Setter Property="FontSize" Value="11"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="Padding" Value="8,3"/>
</Style>
<!-- 下拉框样式 -->
<Style x:Key="StyledCombo" TargetType="ComboBox">
<Setter Property="FontSize" Value="13"/>
<Setter Property="Height" Value="34"/>
<Setter Property="Foreground" Value="#1E293B"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Background" Value="White"/>
<Setter Property="Padding" Value="12,0,10,0"/>
<Setter Property="MinWidth" Value="60"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ComboBox">
<Grid>
<Border x:Name="border" Background="{TemplateBinding Background}"
BorderBrush="{StaticResource BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="4">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<ContentPresenter Grid.Column="0" Margin="{TemplateBinding Padding}"
VerticalAlignment="Center"
Content="{TemplateBinding SelectionBoxItem}"
ContentTemplate="{TemplateBinding ItemTemplate}"
IsHitTestVisible="False"/>
<Path Grid.Column="1" Data="M0,0 L7,0 L3.5,5 Z"
Fill="#94A3B8" Margin="0,0,10,0"
VerticalAlignment="Center" Stretch="Uniform"/>
</Grid>
</Border>
<Popup x:Name="PART_Popup" AllowsTransparency="True"
IsOpen="{TemplateBinding IsDropDownOpen}"
Placement="Bottom" Focusable="False"
PopupAnimation="Fade"
VerticalOffset="2">
<Border x:Name="dropDownBorder" Background="White"
BorderBrush="#E2E8F0" BorderThickness="1"
CornerRadius="6" Padding="4"
Effect="{Binding RelativeSource={RelativeSource Self}, Path=Tag}">
<ScrollViewer>
<ItemsPresenter/>
</ScrollViewer>
</Border>
</Popup>
<!-- 点击切换的 ToggleButton -->
<ToggleButton x:Name="toggleBtn"
IsChecked="{Binding IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}}"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Focusable="False"
Background="Transparent"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Property="BorderBrush" Value="#3B82F6"/>
<Setter TargetName="border" Property="Background" Value="#F8FAFC"/>
</Trigger>
<Trigger Property="IsDropDownOpen" Value="True">
<Setter TargetName="border" Property="BorderBrush" Value="#3B82F6"/>
<Setter TargetName="border" Property="Background" Value="White"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- 下拉框项样式 -->
<Style TargetType="ComboBoxItem">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Foreground" Value="#1E293B"/>
<Setter Property="FontSize" Value="13"/>
<Setter Property="Padding" Value="12,8"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ComboBoxItem">
<Border x:Name="border" Background="{TemplateBinding Background}"
Padding="{TemplateBinding Padding}" CornerRadius="3">
<ContentPresenter/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Property="Background" Value="#EFF6FF"/>
<Setter Property="Foreground" Value="#3B82F6"/>
</Trigger>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="border" Property="Background" Value="#DBEAFE"/>
<Setter Property="Foreground" Value="#1E40AF"/>
<Setter Property="FontWeight" Value="SemiBold"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Application.Resources>
</Application>

17
上位机/YKC/App.xaml.cs Normal file
View File

@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
namespace YKC
{
/// <summary>
/// App.xaml 的交互逻辑
/// </summary>
public partial class App : Application
{
}
}

31
上位机/YKC/Config.cs Normal file
View File

@@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
namespace YKC
{
public static class Config
{
public static string TargetIp { get; set; } = "10.12.19.100";
public static int TargetPort { get; set; } = 6001;
public static int LocalPort { get; set; } = 6002;
public static int UdpTimeout { get; set; } = 3;
public static readonly Dictionary<string, string> Cmd = new Dictionary<string, string>
{
["LOGIN"] = "server_login",
["GET_STATUS"] = "server_get_status",
["SET_PILE_ID"] = "server_set_pile_id",
["GET_PILE_INFO"] = "server_get_pile_info",
["REBOOT"] = "server_reboot",
["REPORT_DATA"] = "report_data",
["PILE_METRICS"] = "pile_metrics",
["REAL_TIME_DATA"] = "real_time_data",
["GET_GW_INFO"] = "gateway_get_info",
["GET_4G_STATUS"] = "gateway_get_4g_status",
["GET_CLOUD_CONFIG"] = "gateway_get_cloud_config",
["SET_CLOUD_CONFIG"] = "gateway_set_cloud_config",
["GET_NET_CONFIG"] = "gateway_get_net_config",
["SET_NET_CONFIG"] = "gateway_set_net_config",
};
}
}

View File

@@ -0,0 +1,39 @@
<Window x:Class="YKC.LoginWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="登录 - 百瑞充电桩网关管理" Height="420" Width="400"
WindowStartupLocation="CenterScreen"
WindowStyle="None" AllowsTransparency="True"
Background="Transparent"
ResizeMode="NoResize">
<Border Background="White" CornerRadius="8" Padding="40,36"
Margin="0" BorderBrush="#E2E8F0" BorderThickness="1"
Effect="{Binding RelativeSource={RelativeSource Self}, Path=Tag}">
<Border.Tag>
<DropShadowEffect BlurRadius="20" ShadowDepth="4" Color="#CC000000" Opacity="0.12"/>
</Border.Tag>
<StackPanel>
<TextBlock Text="充电桩管理系统" FontSize="22" FontWeight="Bold"
Foreground="#1E293B" HorizontalAlignment="Center" Margin="0,0,0,4"/>
<TextBlock Text="百瑞充电桩网关后台" FontSize="13" Foreground="#94A3B8"
HorizontalAlignment="Center" Margin="0,0,0,28"/>
<TextBlock Text="账号" Style="{StaticResource FieldLabel}"/>
<TextBox x:Name="txtUsername" Style="{StaticResource FormInput}"
Height="50" FontSize="14" Margin="0,0,0,16" Text="admin"/>
<TextBlock Text="密码" Style="{StaticResource FieldLabel}"/>
<PasswordBox x:Name="txtPassword" Style="{StaticResource PwdInput}"
Height="50" FontSize="14" Margin="0,0,0,24"/>
<Button x:Name="btnLogin" Content="登 录"
Style="{StaticResource BtnPrimary}"
Height="42" FontSize="15"
Click="Login_Click"/>
<TextBlock x:Name="txtError" Foreground="#EF4444" FontSize="13"
HorizontalAlignment="Center" Margin="0,12,0,0"/>
</StackPanel>
</Border>
</Window>

View File

@@ -0,0 +1,66 @@
using System;
using System.Windows;
using System.Windows.Input;
using Newtonsoft.Json.Linq;
namespace YKC
{
public partial class LoginWindow : Window
{
public LoginWindow()
{
InitializeComponent();
txtUsername.Focus();
KeyDown += (s, e) =>
{
if (e.Key == Key.Enter) Login();
};
}
private async void Login_Click(object sender, RoutedEventArgs e) => Login();
private async void Login()
{
string user = txtUsername.Text.Trim();
string pass = txtPassword.Password;
if (string.IsNullOrEmpty(user) || string.IsNullOrEmpty(pass))
{
txtError.Text = "请输入账号和密码";
return;
}
btnLogin.IsEnabled = false;
btnLogin.Content = "校验中...";
txtError.Text = "";
await System.Threading.Tasks.Task.Run(() =>
{
var result = UdpClientHolder.Instance.SendSync(new JObject
{
["cmd"] = Config.Cmd["LOGIN"],
["username"] = user,
["password"] = pass
});
Dispatcher.BeginInvoke(new Action(() =>
{
if (result.Value<bool>("success"))
{
var mainWin = new MainWindow();
mainWin.SetUser(user);
mainWin.Show();
Close();
}
else
{
txtError.Text = result.Value<string>("error") ?? "账号或密码错误";
btnLogin.IsEnabled = true;
btnLogin.Content = "登 录";
}
}));
});
}
}
}

View File

@@ -0,0 +1,77 @@
<Window x:Class="YKC.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="百瑞充电桩网关管理" Height="956" Width="1365"
MinHeight="640" MinWidth="1060"
WindowStartupLocation="CenterScreen"
Background="#F0F2F5">
<WindowChrome.WindowChrome>
<WindowChrome CaptionHeight="0" GlassFrameThickness="0" ResizeBorderThickness="4"/>
</WindowChrome.WindowChrome>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- 侧边栏 -->
<Border Grid.Column="0" Background="#1E293B">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="48"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Border Grid.Row="0" Background="#162033"
Padding="18,0" BorderBrush="#2A3A50" BorderThickness="0,0,0,1"
MouseLeftButtonDown="Header_MouseDown">
<TextBlock Text="百瑞充电桩网关" Foreground="White"
FontSize="14" FontWeight="SemiBold" VerticalAlignment="Center"/>
</Border>
<StackPanel Grid.Row="1" Margin="0,4,0,0">
<Button x:Name="btnDashboard" Content="&#x1F4CA; 总览"
Style="{StaticResource NavBtn}" Click="NavButton_Click"
Tag="dashboard"/>
<Button x:Name="btnRealtime" Content="&#x1F4C8; 实时监控"
Style="{StaticResource NavBtn}" Click="NavButton_Click"
Tag="realtime"/>
<Button x:Name="btnCharger" Content="&#x2699; 充电桩管理"
Style="{StaticResource NavBtn}" Click="NavButton_Click"
Tag="charger"/>
<Button x:Name="btnGateway" Content="&#x1F310; 网关管理"
Style="{StaticResource NavBtn}" Click="NavButton_Click"
Tag="gateway"/>
</StackPanel>
</Grid>
</Border>
<!-- 主内容区 -->
<Grid Grid.Column="1">
<Grid.RowDefinitions>
<RowDefinition Height="48"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!-- 顶栏 -->
<Border Grid.Row="0" Background="White" BorderBrush="#E2E8F0" BorderThickness="0,0,0,1"
Padding="16,0">
<Grid>
<TextBlock x:Name="txtPageTitle" Text="总览" FontSize="16"
FontWeight="SemiBold" Foreground="#1E293B" VerticalAlignment="Center"/>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right"
VerticalAlignment="Center">
<TextBlock x:Name="txtUser" Text="Admin" Foreground="#64748B" FontSize="13"
VerticalAlignment="Center" Margin="0,0,10,0"/>
<Button Content="退出登录" Style="{StaticResource BtnOutline}"
Padding="12,5" FontSize="12" Click="Logout_Click"/>
</StackPanel>
</Grid>
</Border>
<!-- 页面 Frame -->
<Frame x:Name="contentFrame" Grid.Row="1" NavigationUIVisibility="Hidden"/>
</Grid>
</Grid>
</Window>

View File

@@ -0,0 +1,110 @@
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace YKC
{
public partial class MainWindow : Window
{
private Dictionary<string, Button> _navButtons = new Dictionary<string, Button>();
private Dictionary<string, string> _navTitles = new Dictionary<string, string>();
private string _username = "Admin";
public void SetUser(string name)
{
_username = name;
if (txtUser != null) txtUser.Text = name;
}
public MainWindow()
{
InitializeComponent();
_navButtons["dashboard"] = btnDashboard;
_navButtons["realtime"] = btnRealtime;
_navButtons["charger"] = btnCharger;
_navButtons["gateway"] = btnGateway;
_navTitles["dashboard"] = "总览";
_navTitles["realtime"] = "实时监控";
_navTitles["charger"] = "充电桩管理";
_navTitles["gateway"] = "网关管理";
txtUser.Text = "Admin";
Loaded += (s, e) =>
{
UdpClientHolder.Instance.OnActiveReport += PilesStoreHolder.Instance.HandleReport;
NavigateTo("dashboard");
};
}
private void SetActiveNav(string key)
{
foreach (var kv in _navButtons)
{
var btn = kv.Value;
var border = btn.Template?.FindName("border", btn) as Border;
if (kv.Key == key)
{
btn.Foreground = new SolidColorBrush(Colors.White);
btn.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#1A3A5C"));
btn.BorderBrush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#3B82F6"));
btn.BorderThickness = new Thickness(3, 0, 0, 0);
}
else
{
btn.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#8899AA"));
btn.Background = new SolidColorBrush(Colors.Transparent);
btn.BorderBrush = new SolidColorBrush(Colors.Transparent);
btn.BorderThickness = new Thickness(3, 0, 0, 0);
}
}
}
private void NavigateTo(string key)
{
SetActiveNav(key);
txtPageTitle.Text = _navTitles.ContainsKey(key) ? _navTitles[key] : key;
Uri uri;
switch (key)
{
case "dashboard": uri = new Uri("Pages/DashboardPage.xaml", UriKind.Relative); break;
case "realtime": uri = new Uri("Pages/RealtimePage.xaml", UriKind.Relative); break;
case "charger": uri = new Uri("Pages/ChargerPage.xaml", UriKind.Relative); break;
case "gateway": uri = new Uri("Pages/GatewayPage.xaml", UriKind.Relative); break;
default: return;
}
contentFrame.Source = uri;
}
private void NavButton_Click(object sender, RoutedEventArgs e)
{
if (sender is Button btn && btn.Tag is string key)
{
NavigateTo(key);
}
}
private void Logout_Click(object sender, RoutedEventArgs e)
{
var result = MessageBox.Show("确认退出登录?", "退出", MessageBoxButton.YesNo, MessageBoxImage.Question);
if (result == MessageBoxResult.Yes)
{
var loginWin = new LoginWindow();
loginWin.Show();
Close();
}
}
private void Header_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
if (e.LeftButton == System.Windows.Input.MouseButtonState.Pressed)
DragMove();
}
}
}

View File

@@ -0,0 +1,96 @@
<Page x:Class="YKC.ChargerPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="充电桩管理" Background="#F0F2F5">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel Margin="24">
<TextBlock Text="充电桩管理" FontSize="16" FontWeight="SemiBold"
Foreground="#1E293B" Margin="0,0,0,20"/>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- 写入桩ID -->
<Border Grid.Column="0" Background="White" CornerRadius="6"
Margin="0,0,8,0" Padding="24">
<StackPanel>
<TextBlock Text="写入桩 ID" FontSize="14" FontWeight="SemiBold"
Foreground="#1E293B" Margin="0,0,0,16"/>
<TextBlock Text="桩编号" Style="{StaticResource FieldLabel}"/>
<TextBox x:Name="txtSetPileIdx" Text="1" Width="80"
Style="{StaticResource FormInput}" Margin="0,0,0,16"/>
<TextBlock Text="序列号 (HEX, 14位)" Style="{StaticResource FieldLabel}"/>
<TextBox x:Name="txtSetPileId" Width="240" MaxLength="14"
Style="{StaticResource FormInput}" FontFamily="Consolas"
Margin="0,0,0,16"/>
<WrapPanel>
<Button Content="写 入" Style="{StaticResource BtnPrimary}" Width="90"
Click="SetPileId_Click"/>
<TextBlock x:Name="txtSetResult" Foreground="#10B981"
FontSize="13" VerticalAlignment="Center" Margin="12,0,0,0"/>
</WrapPanel>
</StackPanel>
</Border>
<!-- 查询充电桩 -->
<Border Grid.Column="1" Background="White" CornerRadius="6"
Margin="8,0,0,0" Padding="24">
<StackPanel>
<TextBlock Text="查询充电桩信息" FontSize="14" FontWeight="SemiBold"
Foreground="#1E293B" Margin="0,0,0,16"/>
<TextBlock Text="桩编号" Style="{StaticResource FieldLabel}"/>
<WrapPanel Margin="0,0,0,14">
<TextBox x:Name="txtInfoPileIdx" Text="1" Width="80"
Style="{StaticResource FormInput}"/>
<Button Content="查 询" Style="{StaticResource BtnOutline}" Width="80"
Margin="10,0,0,0" Click="GetPileInfo_Click"/>
<TextBlock x:Name="txtInfoResult" VerticalAlignment="Center"
FontSize="13" Margin="10,0,0,0"/>
</WrapPanel>
<!-- 查询结果 -->
<Border x:Name="panelInfo" Background="#F8FAFC"
CornerRadius="4" Padding="14" Visibility="Collapsed">
<StackPanel>
<TextBlock Text="序列号" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtInfoSerial" Text="--" Style="{StaticResource InfoValue}"/>
<TextBlock Text="类型" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtInfoType" Text="--" Style="{StaticResource InfoValue}"/>
<TextBlock Text="枪数量" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtInfoGuns" Text="--" Style="{StaticResource InfoValue}"/>
<TextBlock Text="协议版本" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtInfoProto" Text="--" Style="{StaticResource InfoValue}"/>
<TextBlock Text="软件版本" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtInfoSw" Text="--" Style="{StaticResource InfoValue}"/>
<TextBlock Text="SIM 卡" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtInfoSim" Text="--" Style="{StaticResource InfoValue}"/>
</StackPanel>
</Border>
</StackPanel>
</Border>
</Grid>
<!-- 设备操作 -->
<Border Background="White" CornerRadius="6" Padding="24" Margin="0,14,0,0">
<StackPanel>
<TextBlock Text="设备操作" FontSize="14" FontWeight="SemiBold"
Foreground="#1E293B" Margin="0,0,0,14"/>
<WrapPanel>
<Button Content="重启设备" Style="{StaticResource BtnDanger}" Width="110"
Click="Reboot_Click"/>
<TextBlock x:Name="txtRebootResult" Foreground="#10B981"
FontSize="13" VerticalAlignment="Center" Margin="12,0,0,0"/>
</WrapPanel>
</StackPanel>
</Border>
</StackPanel>
</ScrollViewer>
</Page>

View File

@@ -0,0 +1,118 @@
using System;
using System.Windows;
using System.Windows.Controls;
using Newtonsoft.Json.Linq;
namespace YKC
{
public partial class ChargerPage : Page
{
public ChargerPage()
{
InitializeComponent();
}
private async void SetPileId_Click(object sender, RoutedEventArgs e)
{
string idx = txtSetPileIdx.Text.Trim();
string id = txtSetPileId.Text.Trim();
if (string.IsNullOrEmpty(id) || id.Length != 14)
{
ShowResult(txtSetResult, "序列号需14位HEX", false);
return;
}
ShowResult(txtSetResult, "发送中...", true);
await System.Threading.Tasks.Task.Run(() =>
{
var result = UdpClientHolder.Instance.SendSync(new JObject
{
["cmd"] = Config.Cmd["SET_PILE_ID"],
["pile_index"] = int.Parse(idx),
["pile_id"] = id
});
Dispatcher.BeginInvoke(new Action(() =>
{
if (result.Value<bool>("success"))
ShowResult(txtSetResult, "写入成功", true);
else
ShowResult(txtSetResult, result.Value<string>("error") ?? "失败", false);
}));
});
}
private async void GetPileInfo_Click(object sender, RoutedEventArgs e)
{
string idx = txtInfoPileIdx.Text.Trim();
panelInfo.Visibility = Visibility.Visible;
txtInfoResult.Text = "查询中...";
txtInfoResult.Foreground = new System.Windows.Media.SolidColorBrush(
(System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#64748B"));
await System.Threading.Tasks.Task.Run(() =>
{
var result = UdpClientHolder.Instance.SendSync(new JObject
{
["cmd"] = Config.Cmd["GET_PILE_INFO"],
["pile_index"] = int.Parse(idx)
});
Dispatcher.BeginInvoke(new Action(() =>
{
if (result.Value<bool>("success") && result["serial"] != null)
{
txtInfoSerial.Text = result.Value<string>("serial") ?? "--";
txtInfoType.Text = result.Value<string>("type") ?? "--";
txtInfoGuns.Text = result.Value<string>("gun_num") ?? "--";
txtInfoProto.Text = result.Value<string>("protocol_ver") ?? "--";
txtInfoSw.Text = result.Value<string>("software_ver") ?? "--";
txtInfoSim.Text = result.Value<string>("sim") ?? "--";
txtInfoResult.Text = "";
}
else
{
txtInfoSerial.Text = "--"; txtInfoType.Text = "--";
txtInfoGuns.Text = "--"; txtInfoProto.Text = "--";
txtInfoSw.Text = "--"; txtInfoSim.Text = "--";
ShowResult(txtInfoResult, result.Value<string>("error") ?? "查询失败", false);
}
}));
});
}
private async void Reboot_Click(object sender, RoutedEventArgs e)
{
var dialogResult = MessageBox.Show("确认重启设备?", "警告", MessageBoxButton.YesNo, MessageBoxImage.Warning);
if (dialogResult != MessageBoxResult.Yes) return;
ShowResult(txtRebootResult, "发送中...", true);
await System.Threading.Tasks.Task.Run(() =>
{
var result = UdpClientHolder.Instance.SendSync(new JObject
{
["cmd"] = Config.Cmd["REBOOT"]
});
Dispatcher.BeginInvoke(new Action(() =>
{
if (result.Value<bool>("success"))
ShowResult(txtRebootResult, "重启指令已发送", true);
else
ShowResult(txtRebootResult, result.Value<string>("error") ?? "失败", false);
}));
});
}
private void ShowResult(TextBlock el, string msg, bool ok)
{
el.Text = msg;
el.Foreground = new System.Windows.Media.SolidColorBrush(
(System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString(
ok ? "#10B981" : "#EF4444"));
var timer = new System.Windows.Threading.DispatcherTimer { Interval = TimeSpan.FromSeconds(4) };
timer.Tick += (s, _) => { el.Text = ""; timer.Stop(); };
timer.Start();
}
}
}

View File

@@ -0,0 +1,92 @@
<Page x:Class="YKC.DashboardPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="总览" Background="#F0F2F5">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel Margin="24">
<!-- 统计卡片行 -->
<WrapPanel Margin="0,0,0,20">
<Border Background="White" CornerRadius="6" Width="240"
Padding="20,18" Margin="0,0,16,16">
<StackPanel>
<TextBlock Text="设备连接" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtConnStatus" Text="--"
FontSize="20" FontWeight="SemiBold" Foreground="#1E293B"/>
</StackPanel>
</Border>
<Border Background="White" CornerRadius="6" Width="240"
Padding="20,18" Margin="0,0,16,16">
<StackPanel>
<TextBlock Text="在线充电桩" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtOnlineCount" Text="--"
FontSize="28" FontWeight="SemiBold" Foreground="#10B981"/>
</StackPanel>
</Border>
<Border Background="White" CornerRadius="6" Width="240"
Padding="20,18" Margin="0,0,16,16">
<StackPanel>
<TextBlock Text="充电中" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtChargingCount" Text="--"
FontSize="28" FontWeight="SemiBold" Foreground="#3B82F6"/>
</StackPanel>
</Border>
</WrapPanel>
<!-- 标题 + 按钮 -->
<Grid Margin="0,0,0,12">
<TextBlock Text="充电桩列表" FontSize="15" FontWeight="SemiBold"
Foreground="#1E293B" VerticalAlignment="Center"/>
<Button Content="刷新" Style="{StaticResource BtnPrimary}"
Width="90" HorizontalAlignment="Right"
Click="Refresh_Click"/>
</Grid>
<!-- 表格 -->
<Border Background="White" CornerRadius="6" Padding="0">
<DataGrid x:Name="dgPiles" AutoGenerateColumns="False" IsReadOnly="True"
HeadersVisibility="Column" CanUserAddRows="False"
CanUserDeleteRows="False" RowHeight="40"
GridLinesVisibility="Horizontal"
HorizontalGridLinesBrush="#F1F5F9"
BorderThickness="0" Background="White">
<DataGrid.ColumnHeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Background" Value="#F8FAFC"/>
<Setter Property="Foreground" Value="#64748B"/>
<Setter Property="FontSize" Value="12"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="Padding" Value="16,10"/>
<Setter Property="BorderBrush" Value="#E2E8F0"/>
<Setter Property="BorderThickness" Value="0,0,0,1"/>
</Style>
</DataGrid.ColumnHeaderStyle>
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="FontSize" Value="13"/>
<Setter Property="Padding" Value="16,8"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="DataGridCell">
<Border Background="{TemplateBinding Background}">
<ContentPresenter Margin="{TemplateBinding Padding}"
VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGrid.CellStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="#" Width="50" Binding="{Binding Index}"/>
<DataGridTextColumn Header="序列号" Width="*" Binding="{Binding Serial}"/>
<DataGridTextColumn Header="桩状态" Width="80" Binding="{Binding StatusText}"/>
<DataGridTextColumn Header="枪1" Width="80" Binding="{Binding Gun1Text}"/>
<DataGridTextColumn Header="枪2" Width="80" Binding="{Binding Gun2Text}"/>
</DataGrid.Columns>
</DataGrid>
</Border>
</StackPanel>
</ScrollViewer>
</Page>

View File

@@ -0,0 +1,105 @@
using System;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using Newtonsoft.Json.Linq;
using OxyPlot;
namespace YKC
{
public partial class DashboardPage : Page
{
private Timer _timer;
public class PileRow
{
public int Index { get; set; }
public string Serial { get; set; } = "--";
public string StatusText { get; set; } = "--";
public string Gun1Text { get; set; } = "--";
public string Gun2Text { get; set; } = "--";
}
public ObservableCollection<PileRow> Rows { get; } = new ObservableCollection<PileRow>();
public DashboardPage()
{
InitializeComponent();
dgPiles.ItemsSource = Rows;
Loaded += (s, e) =>
{
Dispatcher.BeginInvoke(new Action(() => RefreshData()),
System.Windows.Threading.DispatcherPriority.Background);
_timer = new Timer((_) => Dispatcher.BeginInvoke(new Action(RefreshData)), null, 5000, 5000);
};
Unloaded += (s, e) => _timer?.Dispose();
}
private void Refresh_Click(object sender, RoutedEventArgs e) => RefreshData();
private void RefreshData()
{
try
{
var result = UdpClientHolder.Instance.SendSync(new JObject
{
["cmd"] = Config.Cmd["GET_STATUS"]
});
if (result.Value<bool>("success") == false && result["piles"] == null)
{
Dispatcher.BeginInvoke(new Action(() => txtConnStatus.Text = "无响应"));
return;
}
Dispatcher.BeginInvoke(new Action(() => txtConnStatus.Text = "在线"));
var piles = result["piles"] as JArray ?? new JArray();
int online = 0, charging = 0;
var rows = new ObservableCollection<PileRow>();
foreach (var p in piles)
{
bool isOnline = p.Value<bool>("is_online");
if (isOnline) online++;
var guns = p["guns"] as JArray ?? new JArray();
foreach (var g in guns)
if (g.Value<int?>("status") == 3) charging++;
rows.Add(new PileRow
{
Index = rows.Count + 1,
Serial = p.Value<string>("serial") ?? "--",
StatusText = isOnline ? "在线" : "离线",
Gun1Text = guns.Count > 0 ? GunStatusText(guns[0].Value<int>("status")) : "--",
Gun2Text = guns.Count > 1 ? GunStatusText(guns[1].Value<int>("status")) : "--",
});
}
Dispatcher.BeginInvoke(new Action(() =>
{
txtOnlineCount.Text = online.ToString();
txtChargingCount.Text = charging.ToString();
Rows.Clear();
foreach (var r in rows) Rows.Add(r);
}));
}
catch { }
}
private string GunStatusText(int status)
{
switch (status)
{
case 0: return "离线";
case 1: return "故障";
case 2: return "空闲";
case 3: return "充电中";
default: return status.ToString();
}
}
}
}

View File

@@ -0,0 +1,145 @@
<Page x:Class="YKC.GatewayPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="网关管理" Background="#F0F2F5">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel Margin="24">
<TextBlock Text="网关管理" FontSize="16" FontWeight="SemiBold"
Foreground="#1E293B" Margin="0,0,0,20"/>
<Grid Margin="0,0,0,14">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- 网关基本信息 -->
<Border Grid.Column="0" Background="White" CornerRadius="6"
Margin="0,0,8,0" Padding="24">
<StackPanel>
<TextBlock Text="网关基本信息" FontSize="14" FontWeight="SemiBold"
Foreground="#1E293B" Margin="0,0,0,14"/>
<TextBlock Text="网关 ID" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtGwId" Text="--" Style="{StaticResource InfoValue}"
FontFamily="Consolas"/>
<TextBlock Text="软件版本" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtGwSw" Text="--" Style="{StaticResource InfoValue}"/>
<TextBlock Text="硬件版本" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtGwHw" Text="--" Style="{StaticResource InfoValue}"/>
<TextBlock Text="运行时间" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtGwUptime" Text="--" Style="{StaticResource InfoValue}"/>
<Grid>
<Button Content="刷新" Style="{StaticResource BtnPrimary}" Width="80"
Click="RefreshGwInfo_Click" Margin="0,4,0,0"/>
<TextBlock x:Name="txtGwStatus" FontSize="12"
VerticalAlignment="Center" Margin="92,4,0,0"/>
</Grid>
</StackPanel>
</Border>
<!-- 4G 状态 -->
<Border Grid.Column="1" Background="White" CornerRadius="6"
Margin="8,0,0,0" Padding="24">
<StackPanel>
<TextBlock Text="4G 状态" FontSize="14" FontWeight="SemiBold"
Foreground="#1E293B" Margin="0,0,0,14"/>
<TextBlock Text="SIM 卡号" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtSim" Text="--" Style="{StaticResource InfoValue}"
FontFamily="Consolas"/>
<TextBlock Text="网络状态" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtNetStatus" Text="--" Style="{StaticResource InfoValue}"
Foreground="#10B981"/>
<TextBlock Text="信号强度" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtSignal" Text="--" Style="{StaticResource InfoValue}"/>
<TextBlock Text="运营商" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtIsp" Text="--" Style="{StaticResource InfoValue}"/>
<Grid>
<Button Content="刷新" Style="{StaticResource BtnPrimary}" Width="80"
Click="Refresh4G_Click" Margin="0,4,0,0"/>
<TextBlock x:Name="txt4GStatus" FontSize="12"
VerticalAlignment="Center" Margin="92,4,0,0"/>
</Grid>
</StackPanel>
</Border>
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- 云服务器配置 -->
<Border Grid.Column="0" Background="White" CornerRadius="6"
Margin="0,0,8,0" Padding="24">
<StackPanel>
<TextBlock Text="云服务器配置" FontSize="14" FontWeight="SemiBold"
Foreground="#1E293B" Margin="0,0,0,14"/>
<TextBlock Text="服务器地址 (IP 或域名)" Style="{StaticResource FieldLabel}"/>
<TextBox x:Name="txtCloudHost" Width="220"
Style="{StaticResource FormInput}" Margin="0,0,0,12"/>
<TextBlock Text="端口号" Style="{StaticResource FieldLabel}"/>
<TextBox x:Name="txtCloudPort" Width="120"
Style="{StaticResource FormInput}" Margin="0,0,0,16"/>
<WrapPanel>
<Button Content="查 询" Style="{StaticResource BtnOutline}" Width="80"
Click="LoadCloudConfig_Click"/>
<Button Content="保 存" Style="{StaticResource BtnPrimary}" Width="80"
Click="SaveCloudConfig_Click" Margin="8,0,0,0"/>
<TextBlock x:Name="txtCloudResult" Foreground="#10B981"
FontSize="13" VerticalAlignment="Center" Margin="12,0,0,0"/>
</WrapPanel>
</StackPanel>
</Border>
<!-- 网络配置 -->
<Border Grid.Column="1" Background="White" CornerRadius="6"
Margin="8,0,0,0" Padding="24">
<StackPanel>
<TextBlock Text="有线网络配置" FontSize="14" FontWeight="SemiBold"
Foreground="#1E293B" Margin="0,0,0,14"/>
<TextBlock Text="IP 地址" Style="{StaticResource FieldLabel}"/>
<TextBox x:Name="txtNetIp" Width="200"
Style="{StaticResource FormInput}" Margin="0,0,0,10"/>
<TextBlock Text="子网掩码" Style="{StaticResource FieldLabel}"/>
<TextBox x:Name="txtNetMask" Width="200"
Style="{StaticResource FormInput}" Margin="0,0,0,10"/>
<TextBlock Text="默认网关" Style="{StaticResource FieldLabel}"/>
<TextBox x:Name="txtNetGw" Width="200"
Style="{StaticResource FormInput}" Margin="0,0,0,10"/>
<TextBlock Text="DNS 服务器" Style="{StaticResource FieldLabel}"/>
<TextBox x:Name="txtNetDns" Width="200"
Style="{StaticResource FormInput}" Margin="0,0,0,16"/>
<WrapPanel>
<Button Content="查 询" Style="{StaticResource BtnOutline}" Width="80"
Click="LoadNetConfig_Click"/>
<Button Content="保 存" Style="{StaticResource BtnPrimary}" Width="80"
Click="SaveNetConfig_Click" Margin="8,0,0,0"/>
<TextBlock x:Name="txtNetResult" Foreground="#10B981"
FontSize="13" VerticalAlignment="Center" Margin="12,0,0,0"/>
</WrapPanel>
</StackPanel>
</Border>
</Grid>
</StackPanel>
</ScrollViewer>
</Page>

View File

@@ -0,0 +1,227 @@
using System;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
using Newtonsoft.Json.Linq;
namespace YKC
{
public partial class GatewayPage : Page
{
private static readonly Regex IpRegex = new Regex(
@"^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)$");
private static readonly Regex DomainRegex = new Regex(
@"^(?!-)[A-Za-z0-9-]{1,63}(?<!-)(\.[A-Za-z]{2,})+$");
public GatewayPage()
{
InitializeComponent();
Loaded += (s, e) =>
{
Dispatcher.BeginInvoke(new Action(() =>
{
if (txtGwId != null) RefreshAll();
}), System.Windows.Threading.DispatcherPriority.Background);
};
}
private bool IsValidIp(string s) => IpRegex.IsMatch(s);
private bool IsValidDomain(string s) => DomainRegex.IsMatch(s);
private bool IsValidHost(string s) => IsValidIp(s) || IsValidDomain(s);
private void ShowResult(TextBlock el, string msg, bool ok)
{
el.Text = msg;
el.Foreground = new System.Windows.Media.SolidColorBrush(
(System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString(
ok ? "#10B981" : "#EF4444"));
var timer = new System.Windows.Threading.DispatcherTimer { Interval = TimeSpan.FromSeconds(3) };
timer.Tick += (s, _) => { el.Text = ""; timer.Stop(); };
timer.Start();
}
private string FormatUptime(int sec)
{
if (sec <= 0) return "--";
int d = sec / 86400;
int h = (sec % 86400) / 3600;
int m = (sec % 3600) / 60;
string result = "";
if (d > 0) result += d + "天";
if (h > 0) result += h + "时";
if (m > 0) result += m + "分";
return result.Length > 0 ? result : sec + "秒";
}
private void RefreshAll()
{
RefreshGwInfo();
Refresh4G();
}
private async void RefreshGwInfo()
{
txtGwStatus.Text = "加载中...";
txtGwStatus.Foreground = new System.Windows.Media.SolidColorBrush(
(System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#64748B"));
await System.Threading.Tasks.Task.Run(() =>
{
var result = UdpClientHolder.Instance.SendSync(new JObject { ["cmd"] = Config.Cmd["GET_GW_INFO"] });
Dispatcher.BeginInvoke(new Action(() =>
{
if (result.Value<bool>("success") && result["device_id"] != null)
{
txtGwId.Text = result.Value<string>("device_id") ?? "--";
txtGwSw.Text = result.Value<string>("software_ver") ?? result.Value<string>("sw_ver") ?? "--";
txtGwHw.Text = result.Value<string>("hardware_ver") ?? result.Value<string>("hw_ver") ?? "--";
txtGwUptime.Text = FormatUptime(result.Value<int?>("uptime") ?? 0);
txtGwStatus.Text = "";
}
else
{
txtGwId.Text = "--"; txtGwSw.Text = "--"; txtGwHw.Text = "--"; txtGwUptime.Text = "--";
ShowResult(txtGwStatus, result.Value<string>("error") ?? "查询超时", false);
}
}));
});
}
private async void Refresh4G()
{
txt4GStatus.Text = "加载中...";
txt4GStatus.Foreground = new System.Windows.Media.SolidColorBrush(
(System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#64748B"));
await System.Threading.Tasks.Task.Run(() =>
{
var result = UdpClientHolder.Instance.SendSync(new JObject { ["cmd"] = Config.Cmd["GET_4G_STATUS"] });
Dispatcher.BeginInvoke(new Action(() =>
{
if (result.Value<bool>("success") && result["sim"] != null)
{
txtSim.Text = result.Value<string>("sim") ?? result.Value<string>("iccid") ?? "--";
txtNetStatus.Text = result.Value<string>("net_status") ?? result.Value<string>("status_text") ?? "--";
txtSignal.Text = result.Value<string>("signal") != null ? result.Value<int>("signal") + " dBm" : "--";
txtIsp.Text = result.Value<string>("isp") ?? result.Value<string>("operator") ?? "--";
txt4GStatus.Text = "";
}
else
{
txtSim.Text = "--"; txtNetStatus.Text = "--"; txtSignal.Text = "--"; txtIsp.Text = "--";
ShowResult(txt4GStatus, result.Value<string>("error") ?? "查询超时", false);
}
}));
});
}
private void RefreshGwInfo_Click(object sender, RoutedEventArgs e) => RefreshGwInfo();
private void Refresh4G_Click(object sender, RoutedEventArgs e) => Refresh4G();
private async void LoadCloudConfig_Click(object sender, RoutedEventArgs e)
{
txtCloudResult.Text = "加载中...";
txtCloudResult.Foreground = new System.Windows.Media.SolidColorBrush(
(System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#64748B"));
await System.Threading.Tasks.Task.Run(() =>
{
var result = UdpClientHolder.Instance.SendSync(new JObject { ["cmd"] = Config.Cmd["GET_CLOUD_CONFIG"] });
Dispatcher.BeginInvoke(new Action(() =>
{
txtCloudResult.Text = "";
if (result.Value<bool>("success") && result["host"] != null)
{
txtCloudHost.Text = result.Value<string>("host") ?? "";
txtCloudPort.Text = result.Value<string>("port") ?? result.Value<int?>("port")?.ToString() ?? "";
}
else
{
ShowResult(txtCloudResult, result.Value<string>("error") ?? "查询超时", false);
}
}));
});
}
private async void SaveCloudConfig_Click(object sender, RoutedEventArgs e)
{
string host = txtCloudHost.Text.Trim();
string port = txtCloudPort.Text.Trim();
if (string.IsNullOrEmpty(host)) { ShowResult(txtCloudResult, "请输入服务器地址", false); return; }
if (!IsValidHost(host)) { ShowResult(txtCloudResult, "地址格式错误", false); return; }
if (string.IsNullOrEmpty(port) || !int.TryParse(port, out int p) || p < 1 || p > 65535)
{ ShowResult(txtCloudResult, "端口范围 1-65535", false); return; }
ShowResult(txtCloudResult, "保存中...", true);
await System.Threading.Tasks.Task.Run(() =>
{
var result = UdpClientHolder.Instance.SendSync(new JObject
{
["cmd"] = Config.Cmd["SET_CLOUD_CONFIG"],
["host"] = host,
["port"] = p
});
Dispatcher.BeginInvoke(new Action(() =>
{
ShowResult(txtCloudResult, result.Value<bool>("success") ? "保存成功" : (result.Value<string>("error") ?? "失败"), result.Value<bool>("success"));
}));
});
}
private async void LoadNetConfig_Click(object sender, RoutedEventArgs e)
{
txtNetResult.Text = "加载中...";
txtNetResult.Foreground = new System.Windows.Media.SolidColorBrush(
(System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#64748B"));
await System.Threading.Tasks.Task.Run(() =>
{
var result = UdpClientHolder.Instance.SendSync(new JObject { ["cmd"] = Config.Cmd["GET_NET_CONFIG"] });
Dispatcher.BeginInvoke(new Action(() =>
{
txtNetResult.Text = "";
if (result.Value<bool>("success") && result["ip"] != null)
{
txtNetIp.Text = result.Value<string>("ip") ?? "";
txtNetMask.Text = result.Value<string>("mask") ?? result.Value<string>("netmask") ?? "";
txtNetGw.Text = result.Value<string>("gateway") ?? result.Value<string>("gw") ?? "";
txtNetDns.Text = result.Value<string>("dns") ?? "";
}
else
{
ShowResult(txtNetResult, result.Value<string>("error") ?? "查询超时", false);
}
}));
});
}
private async void SaveNetConfig_Click(object sender, RoutedEventArgs e)
{
string ip = txtNetIp.Text.Trim();
string mask = txtNetMask.Text.Trim();
string gw = txtNetGw.Text.Trim();
string dns = txtNetDns.Text.Trim();
if (string.IsNullOrEmpty(ip)) { ShowResult(txtNetResult, "请输入IP地址", false); return; }
if (!IsValidIp(ip)) { ShowResult(txtNetResult, "IP格式错误", false); return; }
if (string.IsNullOrEmpty(mask)) { ShowResult(txtNetResult, "请输入子网掩码", false); return; }
if (!IsValidIp(mask)) { ShowResult(txtNetResult, "掩码格式错误", false); return; }
if (!string.IsNullOrEmpty(gw) && !IsValidIp(gw)) { ShowResult(txtNetResult, "网关格式错误", false); return; }
if (!string.IsNullOrEmpty(dns) && !IsValidIp(dns)) { ShowResult(txtNetResult, "DNS格式错误", false); return; }
ShowResult(txtNetResult, "保存中...", true);
await System.Threading.Tasks.Task.Run(() =>
{
var result = UdpClientHolder.Instance.SendSync(new JObject
{
["cmd"] = Config.Cmd["SET_NET_CONFIG"],
["ip"] = ip,
["mask"] = mask,
["gateway"] = gw,
["dns"] = dns
});
Dispatcher.BeginInvoke(new Action(() =>
{
ShowResult(txtNetResult, result.Value<bool>("success") ? "保存成功,重启生效" : (result.Value<string>("error") ?? "失败"), result.Value<bool>("success"));
}));
});
}
}
}

View File

@@ -0,0 +1,170 @@
<Page x:Class="YKC.RealtimePage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:oxy="http://oxyplot.org/wpf"
Title="实时监控" Background="#F0F2F5">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel Margin="20">
<!-- 标题 + 选择器 -->
<Grid Margin="0,0,0,12">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="实时监控" FontSize="16" FontWeight="SemiBold"
Foreground="#1E293B"/>
</StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
<TextBlock Text="桩" Foreground="#64748B" FontSize="13"
VerticalAlignment="Center" Margin="0,0,6,0"/>
<ComboBox x:Name="cmbPile" Style="{StaticResource StyledCombo}" Width="80"
SelectedIndex="0" SelectionChanged="PileGun_Changed">
<ComboBoxItem>桩 01</ComboBoxItem><ComboBoxItem>桩 02</ComboBoxItem>
<ComboBoxItem>桩 03</ComboBoxItem><ComboBoxItem>桩 04</ComboBoxItem>
<ComboBoxItem>桩 05</ComboBoxItem><ComboBoxItem>桩 06</ComboBoxItem>
</ComboBox>
<TextBlock Text="枪" Foreground="#64748B" FontSize="13"
VerticalAlignment="Center" Margin="12,0,6,0"/>
<ComboBox x:Name="cmbGun" Style="{StaticResource StyledCombo}" Width="70"
SelectedIndex="0" SelectionChanged="PileGun_Changed">
<ComboBoxItem>枪 1</ComboBoxItem><ComboBoxItem>枪 2</ComboBoxItem>
</ComboBox>
</StackPanel>
</Grid>
<!-- 数值卡片行1 -->
<WrapPanel Margin="0,0,0,6">
<Border Background="White" CornerRadius="6" Width="170"
Padding="14,12" Margin="0,0,8,8">
<StackPanel>
<TextBlock Text="电流 (A)" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtCurrent" Text="--" FontSize="22"
FontWeight="SemiBold" Foreground="#10B981"/>
</StackPanel>
</Border>
<Border Background="White" CornerRadius="6" Width="170"
Padding="14,12" Margin="0,0,8,8">
<StackPanel>
<TextBlock Text="电压 (V)" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtVoltage" Text="--" FontSize="22"
FontWeight="SemiBold" Foreground="#1E293B"/>
</StackPanel>
</Border>
<Border Background="White" CornerRadius="6" Width="170"
Padding="14,12" Margin="0,0,8,8">
<StackPanel>
<TextBlock Text="功率 (kW)" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtPower" Text="--" FontSize="22"
FontWeight="SemiBold" Foreground="#1E293B"/>
</StackPanel>
</Border>
<Border Background="White" CornerRadius="6" Width="170"
Padding="14,12" Margin="0,0,8,8">
<StackPanel>
<TextBlock Text="度数 (kWh)" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtEnergy" Text="--" FontSize="22"
FontWeight="SemiBold" Foreground="#1E293B"/>
</StackPanel>
</Border>
<Border Background="White" CornerRadius="6" Width="170"
Padding="14,12" Margin="0,0,8,8">
<StackPanel>
<TextBlock Text="总金额 (元)" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtTotalAmount" Text="--" FontSize="22"
FontWeight="SemiBold" Foreground="#FF5722"/>
</StackPanel>
</Border>
<Border Background="White" CornerRadius="6" Width="150"
Padding="14,12" Margin="0,0,8,8">
<StackPanel>
<TextBlock Text="状态" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtStatus" Text="--" FontSize="22"
FontWeight="SemiBold" Foreground="#3B82F6"/>
</StackPanel>
</Border>
</WrapPanel>
<!-- 订单信息行 -->
<WrapPanel Margin="0,0,0,10">
<Border Background="White" CornerRadius="6" Width="280"
Padding="14,12" Margin="0,0,8,8">
<StackPanel>
<TextBlock Text="订单编号" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtOrderNo" Text="--" FontSize="13"
FontWeight="SemiBold" Foreground="#1E293B"
FontFamily="Consolas" TextWrapping="Wrap"/>
</StackPanel>
</Border>
<Border Background="White" CornerRadius="6" Width="140"
Padding="14,12" Margin="0,0,8,8">
<StackPanel>
<TextBlock Text="目标 SOC" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtSoc" Text="--" FontSize="22"
FontWeight="SemiBold" Foreground="#1E293B"/>
</StackPanel>
</Border>
<Border Background="White" CornerRadius="6" Width="180"
Padding="14,12" Margin="0,0,8,8">
<StackPanel>
<TextBlock Text="累计充电时间" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtCumTime" Text="--" FontSize="18"
FontWeight="SemiBold" Foreground="#1E293B"
FontFamily="Consolas"/>
</StackPanel>
</Border>
<Border Background="White" CornerRadius="6" Width="180"
Padding="14,12" Margin="0,0,8,8">
<StackPanel>
<TextBlock Text="剩余时间" Style="{StaticResource InfoLabel}"/>
<TextBlock x:Name="txtRemTime" Text="--" FontSize="18"
FontWeight="SemiBold" Foreground="#1E293B"
FontFamily="Consolas"/>
</StackPanel>
</Border>
</WrapPanel>
<!-- 图表 2x2 -->
<Grid Height="580">
<Grid.RowDefinitions>
<RowDefinition Height="290"/>
<RowDefinition Height="290"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Border Grid.Row="0" Grid.Column="0" Background="White" CornerRadius="6"
Margin="0,0,7,7">
<Grid>
<TextBlock Text="电流曲线 (A)" Foreground="#94A3B8" FontSize="12"
Margin="14,10,0,0" VerticalAlignment="Top"/>
<oxy:PlotView x:Name="plotCurrent" Margin="8,32,8,8"/>
</Grid>
</Border>
<Border Grid.Row="0" Grid.Column="1" Background="White" CornerRadius="6"
Margin="7,0,0,7">
<Grid>
<TextBlock Text="电压曲线 (V)" Foreground="#94A3B8" FontSize="12"
Margin="14,10,0,0" VerticalAlignment="Top"/>
<oxy:PlotView x:Name="plotVoltage" Margin="8,32,8,8"/>
</Grid>
</Border>
<Border Grid.Row="1" Grid.Column="0" Background="White" CornerRadius="6"
Margin="0,7,7,0">
<Grid>
<TextBlock Text="功率曲线 (kW)" Foreground="#94A3B8" FontSize="12"
Margin="14,10,0,0" VerticalAlignment="Top"/>
<oxy:PlotView x:Name="plotPower" Margin="8,32,8,8"/>
</Grid>
</Border>
<Border Grid.Row="1" Grid.Column="1" Background="White" CornerRadius="6"
Margin="7,7,0,0">
<Grid>
<TextBlock Text="费用明细 (元)" Foreground="#94A3B8" FontSize="12"
Margin="14,10,0,0" VerticalAlignment="Top"/>
<oxy:PlotView x:Name="plotAmount" Margin="8,32,8,8"/>
</Grid>
</Border>
</Grid>
</StackPanel>
</ScrollViewer>
</Page>

View File

@@ -0,0 +1,214 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using Newtonsoft.Json.Linq;
using OxyPlot;
using OxyPlot.Axes;
using OxyPlot.Series;
namespace YKC
{
public partial class RealtimePage : Page
{
private Timer _pollTimer;
private int _currentPile = 1;
private int _currentGun = 1;
public RealtimePage()
{
InitializeComponent();
InitLinePlot(plotCurrent, OxyColor.Parse("#3B82F6"));
InitLinePlot(plotVoltage, OxyColor.Parse("#8B5CF6"));
InitLinePlot(plotPower, OxyColor.Parse("#F59E0B"));
InitBarPlot(plotAmount);
Loaded += (s, e) =>
{
Dispatcher.BeginInvoke(new Action(RefreshData),
System.Windows.Threading.DispatcherPriority.Background);
_pollTimer = new Timer((_) =>
Dispatcher.BeginInvoke(new Action(RefreshData)), null, 2000, 2000);
};
Unloaded += (s, e) => _pollTimer?.Dispose();
}
private void InitLinePlot(OxyPlot.Wpf.PlotView pv, OxyColor color)
{
var model = new PlotModel { PlotAreaBorderColor = OxyColors.Transparent };
model.Axes.Add(new DateTimeAxis
{
Position = AxisPosition.Bottom,
TextColor = OxyColor.Parse("#94A3B8"),
AxislineColor = OxyColor.Parse("#E2E8F0"),
TicklineColor = OxyColor.Parse("#E2E8F0"),
MajorGridlineColor = OxyColor.Parse("#F1F5F9"),
StringFormat = "HH:mm:ss",
FontSize = 10
});
model.Axes.Add(new LinearAxis
{
Position = AxisPosition.Left,
TextColor = OxyColor.Parse("#94A3B8"),
AxislineColor = OxyColors.Transparent,
TicklineColor = OxyColors.Transparent,
MajorGridlineStyle = LineStyle.Dash,
MajorGridlineColor = OxyColor.Parse("#F1F5F9"),
FontSize = 10,
MinimumPadding = 0.1,
MaximumPadding = 0.1
});
model.Series.Add(new LineSeries
{
Color = color,
StrokeThickness = 2,
MarkerType = MarkerType.None,
CanTrackerInterpolatePoints = false
});
pv.Model = model;
}
private void InitBarPlot(OxyPlot.Wpf.PlotView pv)
{
var model = new PlotModel { PlotAreaBorderColor = OxyColors.Transparent };
var catAxis = new CategoryAxis
{
Position = AxisPosition.Bottom,
TextColor = OxyColor.Parse("#64748B"),
FontSize = 12,
AxislineColor = OxyColor.Parse("#E2E8F0"),
TicklineColor = OxyColor.Parse("#E2E8F0")
};
catAxis.Labels.Add("服务费");
catAxis.Labels.Add("电费");
catAxis.Labels.Add("总金额");
model.Axes.Add(catAxis);
model.Axes.Add(new LinearAxis
{
Position = AxisPosition.Left,
Title = "元",
TextColor = OxyColor.Parse("#94A3B8"),
FontSize = 10,
AxislineColor = OxyColors.Transparent,
TicklineColor = OxyColors.Transparent,
MajorGridlineStyle = LineStyle.Dash,
MajorGridlineColor = OxyColor.Parse("#F1F5F9"),
MinimumPadding = 0,
MaximumPadding = 0.15
});
model.Series.Add(new RectangleBarSeries { FillColor = OxyColor.Parse("#1E9FFF") });
model.Series.Add(new RectangleBarSeries { FillColor = OxyColor.Parse("#10B981") });
model.Series.Add(new RectangleBarSeries { FillColor = OxyColor.Parse("#6366F1") });
pv.Model = model;
}
private void PileGun_Changed(object sender, SelectionChangedEventArgs e)
{
try
{
if (cmbPile == null || cmbGun == null) return;
_currentPile = cmbPile.SelectedIndex + 1;
_currentGun = cmbGun.SelectedIndex + 1;
RefreshData();
}
catch { }
}
private void RefreshData()
{
try
{
if (txtCurrent == null || plotCurrent == null || plotCurrent.Model == null) return;
var latest = PilesStoreHolder.Instance.GetLatest(_currentPile, _currentGun);
if (latest == null) return;
txtCurrent.Text = FormatValue(latest.Value<double?>("current")) + " A";
txtVoltage.Text = FormatValue(latest.Value<double?>("voltage")) + " V";
txtPower.Text = FormatValue(latest.Value<double?>("power")) + " kW";
txtEnergy.Text = FormatValue(latest.Value<double?>("energy")) + " kWh";
txtTotalAmount.Text = "¥ " + FormatValue(latest.Value<double?>("total_amount"));
int? st = latest.Value<int?>("status");
if (st == 0) { txtStatus.Text = "离线"; txtStatus.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#909399")); }
else if (st == 1) { txtStatus.Text = "故障"; txtStatus.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#EF4444")); }
else if (st == 2) { txtStatus.Text = "空闲"; txtStatus.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#10B981")); }
else if (st == 3) { txtStatus.Text = "充电中"; txtStatus.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#3B82F6")); }
else { txtStatus.Text = "--"; }
txtOrderNo.Text = latest.Value<string>("order_no") ?? "--";
txtSoc.Text = latest.Value<double?>("soc") != null ? latest.Value<double>("soc").ToString("F1") + "%" : "--";
txtCumTime.Text = FormatMin(latest.Value<double?>("cumulative_time"));
txtRemTime.Text = FormatMin(latest.Value<double?>("remaining_time"));
UpdateCharts();
}
catch { }
}
private void UpdateCharts()
{
try
{
if (plotCurrent == null || plotCurrent.Model == null || plotCurrent.Model.Series.Count == 0) return;
if (plotAmount == null || plotAmount.Model == null || plotAmount.Model.Series.Count == 0) return;
var chartData = PilesStoreHolder.Instance.GetChartData(_currentPile, _currentGun);
if (chartData == null || chartData.Count == 0) return;
var curPoints = new List<DataPoint>();
var volPoints = new List<DataPoint>();
var powPoints = new List<DataPoint>();
foreach (var item in chartData)
{
long unixTs = item.Value<long>("t");
var dt = DateTimeOffset.FromUnixTimeSeconds(unixTs).DateTime;
double oxyTime = DateTimeAxis.ToDouble(dt);
curPoints.Add(new DataPoint(oxyTime, item.Value<double?>("current") ?? 0));
volPoints.Add(new DataPoint(oxyTime, item.Value<double?>("voltage") ?? 0));
powPoints.Add(new DataPoint(oxyTime, item.Value<double?>("power") ?? 0));
}
((LineSeries)plotCurrent.Model.Series[0]).Points.Clear();
((LineSeries)plotCurrent.Model.Series[0]).Points.AddRange(curPoints);
((LineSeries)plotVoltage.Model.Series[0]).Points.Clear();
((LineSeries)plotVoltage.Model.Series[0]).Points.AddRange(volPoints);
((LineSeries)plotPower.Model.Series[0]).Points.Clear();
((LineSeries)plotPower.Model.Series[0]).Points.AddRange(powPoints);
plotCurrent.InvalidatePlot(true);
plotVoltage.InvalidatePlot(true);
plotPower.InvalidatePlot(true);
var latest = PilesStoreHolder.Instance.GetLatest(_currentPile, _currentGun);
if (latest != null)
{
double sf = latest.Value<double?>("service_fee") ?? 0;
double ef = latest.Value<double?>("electricity_fee") ?? 0;
double ta = latest.Value<double?>("total_amount") ?? 0;
((RectangleBarSeries)plotAmount.Model.Series[0]).Items.Clear();
((RectangleBarSeries)plotAmount.Model.Series[0]).Items.Add(new RectangleBarItem(-0.25, 0, 0.25, sf));
((RectangleBarSeries)plotAmount.Model.Series[1]).Items.Clear();
((RectangleBarSeries)plotAmount.Model.Series[1]).Items.Add(new RectangleBarItem(0.75, 0, 1.25, ef));
((RectangleBarSeries)plotAmount.Model.Series[2]).Items.Clear();
((RectangleBarSeries)plotAmount.Model.Series[2]).Items.Add(new RectangleBarItem(1.75, 0, 2.25, ta));
plotAmount.InvalidatePlot(true);
}
}
catch { }
}
private string FormatValue(double? v)
{
return v.HasValue ? v.Value.ToString("F2") : "--";
}
private string FormatMin(double? v)
{
return v.HasValue ? Math.Round(v.Value).ToString() + " min" : "--";
}
}
}

View File

@@ -0,0 +1,174 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json.Linq;
namespace YKC
{
public class GunData
{
public List<double> Current { get; set; } = new List<double>();
public List<double> Voltage { get; set; } = new List<double>();
public List<double> Power { get; set; } = new List<double>();
public List<double> Energy { get; set; } = new List<double>();
public List<double> ServiceFee { get; set; } = new List<double>();
public List<double> ElectricityFee { get; set; } = new List<double>();
public List<double> TotalAmount { get; set; } = new List<double>();
public List<int> Status { get; set; } = new List<int>();
public List<DateTime> Timestamps { get; set; } = new List<DateTime>();
public string OrderNo { get; set; } = "";
public double? Soc { get; set; } = null;
public double? CumulativeTime { get; set; } = 0;
public double? RemainingTime { get; set; } = 0;
private const int MaxPoints = 300;
private void AddToList<T>(List<T> list, T value)
{
list.Add(value);
if (list.Count > MaxPoints)
list.RemoveAt(0);
}
public void Append(JObject g)
{
AddToList(Timestamps, DateTime.Now);
AddToList(Current, g.Value<double?>("current") ?? double.NaN);
AddToList(Voltage, g.Value<double?>("voltage") ?? double.NaN);
AddToList(Power, g.Value<double?>("power") ?? double.NaN);
AddToList(Energy, g.Value<double?>("energy") ?? double.NaN);
AddToList(ServiceFee, g.Value<double?>("service_fee") ?? double.NaN);
AddToList(ElectricityFee, g.Value<double?>("electricity_fee") ?? double.NaN);
double? total = g.Value<double?>("total_amount");
if (total == null)
{
double? sf = g.Value<double?>("service_fee");
double? ef = g.Value<double?>("electricity_fee");
if (sf != null && ef != null)
total = sf + ef;
}
AddToList(TotalAmount, total ?? double.NaN);
AddToList(Status, g.Value<int?>("status") ?? 0);
OrderNo = g.Value<string>("order_no") ?? OrderNo;
Soc = g.Value<double?>("soc") ?? Soc;
CumulativeTime = g.Value<double?>("cumulative_time") ?? CumulativeTime;
RemainingTime = g.Value<double?>("remaining_time") ?? RemainingTime;
}
public double? LatestOrNull(List<double> list)
{
for (int i = list.Count - 1; i >= 0; i--)
if (!double.IsNaN(list[i])) return list[i];
return null;
}
public int? LatestStatus()
{
for (int i = Status.Count - 1; i >= 0; i--)
return Status[i];
return null;
}
}
public class PileData
{
public GunData Gun1 { get; set; } = new GunData();
public GunData Gun2 { get; set; } = new GunData();
}
public class PilesDataStore
{
private readonly object _lock = new object();
public Dictionary<int, PileData> Piles { get; } = new Dictionary<int, PileData>();
private const int PileCount = 6;
public PilesDataStore()
{
for (int i = 1; i <= PileCount; i++)
Piles[i] = new PileData();
}
public void HandleReport(JObject msg)
{
var pilesArr = msg["piles"] as JArray ?? msg["data"] as JArray;
if (pilesArr == null) return;
lock (_lock)
{
foreach (var p in pilesArr)
{
int idx = p.Value<int?>("index") ?? p.Value<int?>("pile_index") ?? p.Value<int?>("id") ?? 0;
if (idx < 1 || idx > PileCount) continue;
var gunsArr = p["guns"] as JArray;
if (gunsArr == null)
{
Piles[idx].Gun1.Append((JObject)p);
continue;
}
foreach (var g in gunsArr)
{
int gunNum = g.Value<int?>("gun") ?? g.Value<int?>("gun_no") ?? g.Value<int?>("id") ?? 0;
if (gunNum == 1) Piles[idx].Gun1.Append((JObject)g);
else if (gunNum == 2) Piles[idx].Gun2.Append((JObject)g);
}
}
}
}
public JObject GetLatest(int pileIndex, int gunNum)
{
lock (_lock)
{
if (!Piles.ContainsKey(pileIndex)) return null;
var gun = gunNum == 1 ? Piles[pileIndex].Gun1 : Piles[pileIndex].Gun2;
return new JObject
{
["current"] = gun.LatestOrNull(gun.Current),
["voltage"] = gun.LatestOrNull(gun.Voltage),
["power"] = gun.LatestOrNull(gun.Power),
["energy"] = gun.LatestOrNull(gun.Energy),
["service_fee"] = gun.LatestOrNull(gun.ServiceFee),
["electricity_fee"] = gun.LatestOrNull(gun.ElectricityFee),
["total_amount"] = gun.LatestOrNull(gun.TotalAmount),
["status"] = gun.LatestStatus(),
["order_no"] = gun.OrderNo,
["soc"] = gun.Soc,
["cumulative_time"] = gun.CumulativeTime,
["remaining_time"] = gun.RemainingTime,
};
}
}
public JArray GetChartData(int pileIndex, int gunNum)
{
lock (_lock)
{
if (!Piles.ContainsKey(pileIndex)) return null;
var gun = gunNum == 1 ? Piles[pileIndex].Gun1 : Piles[pileIndex].Gun2;
var arr = new JArray();
for (int i = 0; i < gun.Timestamps.Count; i++)
{
arr.Add(new JObject
{
["t"] = new DateTimeOffset(gun.Timestamps[i]).ToUnixTimeSeconds(),
["current"] = double.IsNaN(gun.Current[i]) ? (JToken)null : gun.Current[i],
["voltage"] = double.IsNaN(gun.Voltage[i]) ? (JToken)null : gun.Voltage[i],
["power"] = double.IsNaN(gun.Power[i]) ? (JToken)null : gun.Power[i],
});
}
return arr;
}
}
}
public static class PilesStoreHolder
{
public static readonly PilesDataStore Instance = new PilesDataStore();
}
}

View File

@@ -0,0 +1,52 @@
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("YKC")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("YKC")]
[assembly: AssemblyCopyright("Copyright © 2026")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
//若要开始生成可本地化的应用程序,请设置
//.csproj 文件中的 <UICulture>CultureYouAreCodingWith</UICulture>
//在 <PropertyGroup> 中。例如,如果你使用的是美国英语。
//使用的是美国英语,请将 <UICulture> 设置为 en-US。 然后取消
//对以下 NeutralResourceLanguage 特性的注释。 更新
//以下行中的“en-US”以匹配项目文件中的 UICulture 设置。
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //主题特定资源词典所处位置
//(未在页面中找到资源时使用,
//或应用程序资源字典中找到时使用)
ResourceDictionaryLocation.SourceAssembly //常规资源词典所处位置
//(未在页面中找到资源时使用,
//、应用程序或任何主题专用资源字典中找到时使用)
)]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,71 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本: 4.0.30319.42000
//
// 对此文件的更改可能导致不正确的行为,如果
// 重新生成代码,则所做更改将丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace YKC.Properties
{
/// <summary>
/// 强类型资源类,用于查找本地化字符串等。
/// </summary>
// 此类是由 StronglyTypedResourceBuilder
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
}
/// <summary>
/// 返回此类使用的缓存 ResourceManager 实例。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("YKC.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// 重写当前线程的 CurrentUICulture 属性,对
/// 使用此强类型资源类的所有资源查找执行重写。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
}
}

View File

@@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,30 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace YKC.Properties
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default
{
get
{
return defaultInstance;
}
}
}
}

View File

@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

170
上位机/YKC/UdpClient.cs Normal file
View File

@@ -0,0 +1,170 @@
using System;
using System.Collections.Concurrent;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace YKC
{
public class UdpClient : IDisposable
{
private Socket _sock;
private readonly object _lock = new object();
private readonly ConcurrentDictionary<string, Action<JObject>> _callbacks = new ConcurrentDictionary<string, Action<JObject>>();
private bool _running;
private const int FixedId = 7;
public event Action<JObject> OnActiveReport;
public UdpClient()
{
try
{
_sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
_sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
_sock.Bind(new IPEndPoint(IPAddress.Any, Config.LocalPort));
_sock.ReceiveTimeout = 1000;
_running = true;
Console.WriteLine($"[UDP] 监听端口 {Config.LocalPort}");
Task.Run(() => ListenLoop());
}
catch (Exception e)
{
Console.WriteLine($"[UDP] 初始化失败: {e.Message}");
}
}
private void ListenLoop()
{
var buffer = new byte[4096];
EndPoint remoteEp = new IPEndPoint(IPAddress.Any, 0);
while (_running)
{
try
{
int recv = _sock.ReceiveFrom(buffer, ref remoteEp);
string json = Encoding.UTF8.GetString(buffer, 0, recv);
var msg = JObject.Parse(json);
Dispatch(msg);
}
catch (SocketException) { }
catch (Exception e)
{
Console.WriteLine($"[UDP] 接收异常: {e.Message}");
}
}
}
private void Dispatch(JObject msg)
{
string reqId = msg.Value<string>("request_id");
Console.WriteLine($"[UDP] 收到回复: {msg}");
if (reqId != null && _callbacks.TryRemove(reqId, out var cb))
{
try { cb(msg); }
catch (Exception e) { Console.WriteLine($"[UDP] 回调异常: {e.Message}"); }
}
else
{
HandleActiveReport(msg);
}
}
private void HandleActiveReport(JObject msg)
{
string cmd = msg.Value<string>("cmd");
if (cmd == "report_data" || cmd == "pile_metrics" || cmd == "real_time_data")
{
Console.WriteLine($"[UDP] 收到主动上报, cmd={cmd}");
OnActiveReport?.Invoke(msg);
}
}
public void Send(JObject payload, Action<JObject> callback = null, string requestId = null)
{
if (requestId == null)
requestId = $"{payload.Value<string>("cmd")}_{DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}";
payload["id"] = FixedId;
payload["request_id"] = requestId;
if (callback != null)
{
_callbacks[requestId] = callback;
StartTimeoutCleaner(requestId);
}
try
{
if (_sock == null)
{
Console.WriteLine("[UDP] 套接字未就绪");
callback?.Invoke(new JObject { ["success"] = false, ["error"] = "socket_not_ready", ["request_id"] = requestId });
return;
}
byte[] data = Encoding.UTF8.GetBytes(payload.ToString(Formatting.None));
_sock.SendTo(data, new IPEndPoint(IPAddress.Parse(Config.TargetIp), Config.TargetPort));
Console.WriteLine($"[UDP] 发送: {payload}");
}
catch (Exception e)
{
Console.WriteLine($"[UDP] 发送失败: {e.Message}");
_callbacks.TryRemove(requestId, out _);
}
}
public JObject SendSync(JObject payload, int timeoutSec = 4)
{
JObject result = null;
var evt = new ManualResetEvent(false);
Send(payload, (msg) =>
{
result = msg;
evt.Set();
});
evt.WaitOne(TimeSpan.FromSeconds(timeoutSec));
return result ?? new JObject { ["success"] = false, ["error"] = "设备无响应" };
}
private void StartTimeoutCleaner(string requestId)
{
Task.Run(async () =>
{
await Task.Delay(TimeSpan.FromSeconds(Config.UdpTimeout));
if (_callbacks.TryRemove(requestId, out var cb))
{
Console.WriteLine($"[UDP] 请求超时: {requestId}");
try
{
cb(new JObject
{
["success"] = false,
["error"] = "timeout",
["request_id"] = requestId
});
}
catch { }
}
});
}
public void Dispose()
{
_running = false;
_sock?.Close();
}
}
public static class UdpClientHolder
{
public static readonly UdpClient Instance = new UdpClient();
}
}

152
上位机/YKC/YKC.csproj Normal file
View File

@@ -0,0 +1,152 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{9F34DD1F-FB6D-4E13-9270-13C7A9A87AAA}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>YKC</RootNamespace>
<AssemblyName>YKC</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WarningLevel>4</WarningLevel>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xaml">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference Include="WindowsBase" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="OxyPlot.Wpf">
<Version>2.2.0</Version>
</PackageReference>
<PackageReference Include="Newtonsoft.Json">
<Version>13.0.3</Version>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Page Include="MainWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="MainWindow.xaml.cs">
<DependentUpon>MainWindow.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Page Include="LoginWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Compile Include="LoginWindow.xaml.cs">
<DependentUpon>LoginWindow.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Page Include="Pages\DashboardPage.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Compile Include="Pages\DashboardPage.xaml.cs">
<DependentUpon>Pages\DashboardPage.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Page Include="Pages\RealtimePage.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Compile Include="Pages\RealtimePage.xaml.cs">
<DependentUpon>Pages\RealtimePage.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Page Include="Pages\ChargerPage.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Compile Include="Pages\ChargerPage.xaml.cs">
<DependentUpon>Pages\ChargerPage.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Page Include="Pages\GatewayPage.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Compile Include="Pages\GatewayPage.xaml.cs">
<DependentUpon>Pages\GatewayPage.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<Compile Include="Config.cs" />
<Compile Include="UdpClient.cs" />
<Compile Include="PilesDataStore.cs" />
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

3
上位机/YKC/YKC.slnx Normal file
View File

@@ -0,0 +1,3 @@
<Solution>
<Project Path="YKC.csproj" Id="9f34dd1f-fb6d-4e13-9270-13c7a9a87aaa" />
</Solution>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
</configuration>

Binary file not shown.

BIN
上位机/YKC/nuget.exe Normal file

Binary file not shown.

View File

@@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]

Binary file not shown.

View File

@@ -0,0 +1,82 @@
#pragma checksum "..\..\App.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "6AD4E2C6807A155B5F2677B4A8772DA510C0A9A2F8A7C4909C202DC219BF4813"
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
namespace YKC {
/// <summary>
/// App
/// </summary>
public partial class App : System.Windows.Application {
private bool _contentLoaded;
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
#line 4 "..\..\App.xaml"
this.StartupUri = new System.Uri("LoginWindow.xaml", System.UriKind.Relative);
#line default
#line hidden
System.Uri resourceLocater = new System.Uri("/YKC;component/app.xaml", System.UriKind.Relative);
#line 1 "..\..\App.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
/// <summary>
/// Application Entry Point.
/// </summary>
[System.STAThreadAttribute()]
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public static void Main() {
YKC.App app = new YKC.App();
app.InitializeComponent();
app.Run();
}
}
}

View File

@@ -0,0 +1,82 @@
#pragma checksum "..\..\App.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "6AD4E2C6807A155B5F2677B4A8772DA510C0A9A2F8A7C4909C202DC219BF4813"
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
namespace YKC {
/// <summary>
/// App
/// </summary>
public partial class App : System.Windows.Application {
private bool _contentLoaded;
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
#line 4 "..\..\App.xaml"
this.StartupUri = new System.Uri("LoginWindow.xaml", System.UriKind.Relative);
#line default
#line hidden
System.Uri resourceLocater = new System.Uri("/YKC;component/app.xaml", System.UriKind.Relative);
#line 1 "..\..\App.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
/// <summary>
/// Application Entry Point.
/// </summary>
[System.STAThreadAttribute()]
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public static void Main() {
YKC.App app = new YKC.App();
app.InitializeComponent();
app.Run();
}
}
}

Binary file not shown.

View File

@@ -0,0 +1,127 @@
#pragma checksum "..\..\LoginWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "0FC0E565435A8BC0FBD8D62E4120A53F6C01B21198BAFAC45DE921A44D172582"
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
namespace YKC {
/// <summary>
/// LoginWindow
/// </summary>
public partial class LoginWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
#line 24 "..\..\LoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtUsername;
#line default
#line hidden
#line 28 "..\..\LoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.PasswordBox txtPassword;
#line default
#line hidden
#line 30 "..\..\LoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnLogin;
#line default
#line hidden
#line 35 "..\..\LoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtError;
#line default
#line hidden
private bool _contentLoaded;
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/YKC;component/loginwindow.xaml", System.UriKind.Relative);
#line 1 "..\..\LoginWindow.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
switch (connectionId)
{
case 1:
this.txtUsername = ((System.Windows.Controls.TextBox)(target));
return;
case 2:
this.txtPassword = ((System.Windows.Controls.PasswordBox)(target));
return;
case 3:
this.btnLogin = ((System.Windows.Controls.Button)(target));
#line 33 "..\..\LoginWindow.xaml"
this.btnLogin.Click += new System.Windows.RoutedEventHandler(this.Login_Click);
#line default
#line hidden
return;
case 4:
this.txtError = ((System.Windows.Controls.TextBlock)(target));
return;
}
this._contentLoaded = true;
}
}
}

View File

@@ -0,0 +1,127 @@
#pragma checksum "..\..\LoginWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "0FC0E565435A8BC0FBD8D62E4120A53F6C01B21198BAFAC45DE921A44D172582"
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
namespace YKC {
/// <summary>
/// LoginWindow
/// </summary>
public partial class LoginWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
#line 24 "..\..\LoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtUsername;
#line default
#line hidden
#line 28 "..\..\LoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.PasswordBox txtPassword;
#line default
#line hidden
#line 30 "..\..\LoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnLogin;
#line default
#line hidden
#line 35 "..\..\LoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtError;
#line default
#line hidden
private bool _contentLoaded;
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/YKC;component/loginwindow.xaml", System.UriKind.Relative);
#line 1 "..\..\LoginWindow.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
switch (connectionId)
{
case 1:
this.txtUsername = ((System.Windows.Controls.TextBox)(target));
return;
case 2:
this.txtPassword = ((System.Windows.Controls.PasswordBox)(target));
return;
case 3:
this.btnLogin = ((System.Windows.Controls.Button)(target));
#line 33 "..\..\LoginWindow.xaml"
this.btnLogin.Click += new System.Windows.RoutedEventHandler(this.Login_Click);
#line default
#line hidden
return;
case 4:
this.txtError = ((System.Windows.Controls.TextBlock)(target));
return;
}
this._contentLoaded = true;
}
}
}

Binary file not shown.

View File

@@ -0,0 +1,194 @@
#pragma checksum "..\..\MainWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "971CC5B57AF7C8C90EEFD1CD5BF5F4033C0F29A3DDEBC4D68144258B257B7158"
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
namespace YKC {
/// <summary>
/// MainWindow
/// </summary>
public partial class MainWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
#line 34 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnDashboard;
#line default
#line hidden
#line 37 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnRealtime;
#line default
#line hidden
#line 40 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnCharger;
#line default
#line hidden
#line 43 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnGateway;
#line default
#line hidden
#line 61 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtPageTitle;
#line default
#line hidden
#line 65 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtUser;
#line default
#line hidden
#line 74 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Frame contentFrame;
#line default
#line hidden
private bool _contentLoaded;
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/YKC;component/mainwindow.xaml", System.UriKind.Relative);
#line 1 "..\..\MainWindow.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
switch (connectionId)
{
case 1:
#line 28 "..\..\MainWindow.xaml"
((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.Header_MouseDown);
#line default
#line hidden
return;
case 2:
this.btnDashboard = ((System.Windows.Controls.Button)(target));
#line 35 "..\..\MainWindow.xaml"
this.btnDashboard.Click += new System.Windows.RoutedEventHandler(this.NavButton_Click);
#line default
#line hidden
return;
case 3:
this.btnRealtime = ((System.Windows.Controls.Button)(target));
#line 38 "..\..\MainWindow.xaml"
this.btnRealtime.Click += new System.Windows.RoutedEventHandler(this.NavButton_Click);
#line default
#line hidden
return;
case 4:
this.btnCharger = ((System.Windows.Controls.Button)(target));
#line 41 "..\..\MainWindow.xaml"
this.btnCharger.Click += new System.Windows.RoutedEventHandler(this.NavButton_Click);
#line default
#line hidden
return;
case 5:
this.btnGateway = ((System.Windows.Controls.Button)(target));
#line 44 "..\..\MainWindow.xaml"
this.btnGateway.Click += new System.Windows.RoutedEventHandler(this.NavButton_Click);
#line default
#line hidden
return;
case 6:
this.txtPageTitle = ((System.Windows.Controls.TextBlock)(target));
return;
case 7:
this.txtUser = ((System.Windows.Controls.TextBlock)(target));
return;
case 8:
#line 68 "..\..\MainWindow.xaml"
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Logout_Click);
#line default
#line hidden
return;
case 9:
this.contentFrame = ((System.Windows.Controls.Frame)(target));
return;
}
this._contentLoaded = true;
}
}
}

View File

@@ -0,0 +1,194 @@
#pragma checksum "..\..\MainWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "971CC5B57AF7C8C90EEFD1CD5BF5F4033C0F29A3DDEBC4D68144258B257B7158"
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
namespace YKC {
/// <summary>
/// MainWindow
/// </summary>
public partial class MainWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
#line 34 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnDashboard;
#line default
#line hidden
#line 37 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnRealtime;
#line default
#line hidden
#line 40 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnCharger;
#line default
#line hidden
#line 43 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnGateway;
#line default
#line hidden
#line 61 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtPageTitle;
#line default
#line hidden
#line 65 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtUser;
#line default
#line hidden
#line 74 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Frame contentFrame;
#line default
#line hidden
private bool _contentLoaded;
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/YKC;component/mainwindow.xaml", System.UriKind.Relative);
#line 1 "..\..\MainWindow.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
switch (connectionId)
{
case 1:
#line 28 "..\..\MainWindow.xaml"
((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.Header_MouseDown);
#line default
#line hidden
return;
case 2:
this.btnDashboard = ((System.Windows.Controls.Button)(target));
#line 35 "..\..\MainWindow.xaml"
this.btnDashboard.Click += new System.Windows.RoutedEventHandler(this.NavButton_Click);
#line default
#line hidden
return;
case 3:
this.btnRealtime = ((System.Windows.Controls.Button)(target));
#line 38 "..\..\MainWindow.xaml"
this.btnRealtime.Click += new System.Windows.RoutedEventHandler(this.NavButton_Click);
#line default
#line hidden
return;
case 4:
this.btnCharger = ((System.Windows.Controls.Button)(target));
#line 41 "..\..\MainWindow.xaml"
this.btnCharger.Click += new System.Windows.RoutedEventHandler(this.NavButton_Click);
#line default
#line hidden
return;
case 5:
this.btnGateway = ((System.Windows.Controls.Button)(target));
#line 44 "..\..\MainWindow.xaml"
this.btnGateway.Click += new System.Windows.RoutedEventHandler(this.NavButton_Click);
#line default
#line hidden
return;
case 6:
this.txtPageTitle = ((System.Windows.Controls.TextBlock)(target));
return;
case 7:
this.txtUser = ((System.Windows.Controls.TextBlock)(target));
return;
case 8:
#line 68 "..\..\MainWindow.xaml"
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Logout_Click);
#line default
#line hidden
return;
case 9:
this.contentFrame = ((System.Windows.Controls.Frame)(target));
return;
}
this._contentLoaded = true;
}
}
}

Binary file not shown.

View File

@@ -0,0 +1,244 @@
#pragma checksum "..\..\..\Pages\ChargerPage.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "C0301C7F4B365AA464333B677A7BAC04916A4E141B083003114E616F02126402"
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
namespace YKC {
/// <summary>
/// ChargerPage
/// </summary>
public partial class ChargerPage : System.Windows.Controls.Page, System.Windows.Markup.IComponentConnector {
#line 25 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtSetPileIdx;
#line default
#line hidden
#line 29 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtSetPileId;
#line default
#line hidden
#line 36 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtSetResult;
#line default
#line hidden
#line 51 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtInfoPileIdx;
#line default
#line hidden
#line 55 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtInfoResult;
#line default
#line hidden
#line 60 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Border panelInfo;
#line default
#line hidden
#line 64 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtInfoSerial;
#line default
#line hidden
#line 66 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtInfoType;
#line default
#line hidden
#line 68 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtInfoGuns;
#line default
#line hidden
#line 70 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtInfoProto;
#line default
#line hidden
#line 72 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtInfoSw;
#line default
#line hidden
#line 74 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtInfoSim;
#line default
#line hidden
#line 89 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtRebootResult;
#line default
#line hidden
private bool _contentLoaded;
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/YKC;component/pages/chargerpage.xaml", System.UriKind.Relative);
#line 1 "..\..\..\Pages\ChargerPage.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
switch (connectionId)
{
case 1:
this.txtSetPileIdx = ((System.Windows.Controls.TextBox)(target));
return;
case 2:
this.txtSetPileId = ((System.Windows.Controls.TextBox)(target));
return;
case 3:
#line 35 "..\..\..\Pages\ChargerPage.xaml"
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.SetPileId_Click);
#line default
#line hidden
return;
case 4:
this.txtSetResult = ((System.Windows.Controls.TextBlock)(target));
return;
case 5:
this.txtInfoPileIdx = ((System.Windows.Controls.TextBox)(target));
return;
case 6:
#line 54 "..\..\..\Pages\ChargerPage.xaml"
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.GetPileInfo_Click);
#line default
#line hidden
return;
case 7:
this.txtInfoResult = ((System.Windows.Controls.TextBlock)(target));
return;
case 8:
this.panelInfo = ((System.Windows.Controls.Border)(target));
return;
case 9:
this.txtInfoSerial = ((System.Windows.Controls.TextBlock)(target));
return;
case 10:
this.txtInfoType = ((System.Windows.Controls.TextBlock)(target));
return;
case 11:
this.txtInfoGuns = ((System.Windows.Controls.TextBlock)(target));
return;
case 12:
this.txtInfoProto = ((System.Windows.Controls.TextBlock)(target));
return;
case 13:
this.txtInfoSw = ((System.Windows.Controls.TextBlock)(target));
return;
case 14:
this.txtInfoSim = ((System.Windows.Controls.TextBlock)(target));
return;
case 15:
#line 88 "..\..\..\Pages\ChargerPage.xaml"
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Reboot_Click);
#line default
#line hidden
return;
case 16:
this.txtRebootResult = ((System.Windows.Controls.TextBlock)(target));
return;
}
this._contentLoaded = true;
}
}
}

View File

@@ -0,0 +1,244 @@
#pragma checksum "..\..\..\Pages\ChargerPage.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "C0301C7F4B365AA464333B677A7BAC04916A4E141B083003114E616F02126402"
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
namespace YKC {
/// <summary>
/// ChargerPage
/// </summary>
public partial class ChargerPage : System.Windows.Controls.Page, System.Windows.Markup.IComponentConnector {
#line 25 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtSetPileIdx;
#line default
#line hidden
#line 29 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtSetPileId;
#line default
#line hidden
#line 36 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtSetResult;
#line default
#line hidden
#line 51 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtInfoPileIdx;
#line default
#line hidden
#line 55 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtInfoResult;
#line default
#line hidden
#line 60 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Border panelInfo;
#line default
#line hidden
#line 64 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtInfoSerial;
#line default
#line hidden
#line 66 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtInfoType;
#line default
#line hidden
#line 68 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtInfoGuns;
#line default
#line hidden
#line 70 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtInfoProto;
#line default
#line hidden
#line 72 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtInfoSw;
#line default
#line hidden
#line 74 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtInfoSim;
#line default
#line hidden
#line 89 "..\..\..\Pages\ChargerPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtRebootResult;
#line default
#line hidden
private bool _contentLoaded;
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/YKC;component/pages/chargerpage.xaml", System.UriKind.Relative);
#line 1 "..\..\..\Pages\ChargerPage.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
switch (connectionId)
{
case 1:
this.txtSetPileIdx = ((System.Windows.Controls.TextBox)(target));
return;
case 2:
this.txtSetPileId = ((System.Windows.Controls.TextBox)(target));
return;
case 3:
#line 35 "..\..\..\Pages\ChargerPage.xaml"
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.SetPileId_Click);
#line default
#line hidden
return;
case 4:
this.txtSetResult = ((System.Windows.Controls.TextBlock)(target));
return;
case 5:
this.txtInfoPileIdx = ((System.Windows.Controls.TextBox)(target));
return;
case 6:
#line 54 "..\..\..\Pages\ChargerPage.xaml"
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.GetPileInfo_Click);
#line default
#line hidden
return;
case 7:
this.txtInfoResult = ((System.Windows.Controls.TextBlock)(target));
return;
case 8:
this.panelInfo = ((System.Windows.Controls.Border)(target));
return;
case 9:
this.txtInfoSerial = ((System.Windows.Controls.TextBlock)(target));
return;
case 10:
this.txtInfoType = ((System.Windows.Controls.TextBlock)(target));
return;
case 11:
this.txtInfoGuns = ((System.Windows.Controls.TextBlock)(target));
return;
case 12:
this.txtInfoProto = ((System.Windows.Controls.TextBlock)(target));
return;
case 13:
this.txtInfoSw = ((System.Windows.Controls.TextBlock)(target));
return;
case 14:
this.txtInfoSim = ((System.Windows.Controls.TextBlock)(target));
return;
case 15:
#line 88 "..\..\..\Pages\ChargerPage.xaml"
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Reboot_Click);
#line default
#line hidden
return;
case 16:
this.txtRebootResult = ((System.Windows.Controls.TextBlock)(target));
return;
}
this._contentLoaded = true;
}
}
}

Binary file not shown.

View File

@@ -0,0 +1,129 @@
#pragma checksum "..\..\..\Pages\DashboardPage.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "1508FCA098B53360DD176713F2E4977308A7F57161CCE5CD2E7FF08AF66F460C"
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
namespace YKC {
/// <summary>
/// DashboardPage
/// </summary>
public partial class DashboardPage : System.Windows.Controls.Page, System.Windows.Markup.IComponentConnector {
#line 14 "..\..\..\Pages\DashboardPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtConnStatus;
#line default
#line hidden
#line 22 "..\..\..\Pages\DashboardPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtOnlineCount;
#line default
#line hidden
#line 30 "..\..\..\Pages\DashboardPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtChargingCount;
#line default
#line hidden
#line 47 "..\..\..\Pages\DashboardPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.DataGrid dgPiles;
#line default
#line hidden
private bool _contentLoaded;
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/YKC;component/pages/dashboardpage.xaml", System.UriKind.Relative);
#line 1 "..\..\..\Pages\DashboardPage.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
switch (connectionId)
{
case 1:
this.txtConnStatus = ((System.Windows.Controls.TextBlock)(target));
return;
case 2:
this.txtOnlineCount = ((System.Windows.Controls.TextBlock)(target));
return;
case 3:
this.txtChargingCount = ((System.Windows.Controls.TextBlock)(target));
return;
case 4:
#line 42 "..\..\..\Pages\DashboardPage.xaml"
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Refresh_Click);
#line default
#line hidden
return;
case 5:
this.dgPiles = ((System.Windows.Controls.DataGrid)(target));
return;
}
this._contentLoaded = true;
}
}
}

View File

@@ -0,0 +1,129 @@
#pragma checksum "..\..\..\Pages\DashboardPage.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "1508FCA098B53360DD176713F2E4977308A7F57161CCE5CD2E7FF08AF66F460C"
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
namespace YKC {
/// <summary>
/// DashboardPage
/// </summary>
public partial class DashboardPage : System.Windows.Controls.Page, System.Windows.Markup.IComponentConnector {
#line 14 "..\..\..\Pages\DashboardPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtConnStatus;
#line default
#line hidden
#line 22 "..\..\..\Pages\DashboardPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtOnlineCount;
#line default
#line hidden
#line 30 "..\..\..\Pages\DashboardPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtChargingCount;
#line default
#line hidden
#line 47 "..\..\..\Pages\DashboardPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.DataGrid dgPiles;
#line default
#line hidden
private bool _contentLoaded;
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/YKC;component/pages/dashboardpage.xaml", System.UriKind.Relative);
#line 1 "..\..\..\Pages\DashboardPage.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
switch (connectionId)
{
case 1:
this.txtConnStatus = ((System.Windows.Controls.TextBlock)(target));
return;
case 2:
this.txtOnlineCount = ((System.Windows.Controls.TextBlock)(target));
return;
case 3:
this.txtChargingCount = ((System.Windows.Controls.TextBlock)(target));
return;
case 4:
#line 42 "..\..\..\Pages\DashboardPage.xaml"
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Refresh_Click);
#line default
#line hidden
return;
case 5:
this.dgPiles = ((System.Windows.Controls.DataGrid)(target));
return;
}
this._contentLoaded = true;
}
}
}

Binary file not shown.

View File

@@ -0,0 +1,323 @@
#pragma checksum "..\..\..\Pages\GatewayPage.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "AD46577C7B1F8341FA8948443614B6661F41BCF60263F7064FF2BFEBAFA9DC81"
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
namespace YKC {
/// <summary>
/// GatewayPage
/// </summary>
public partial class GatewayPage : System.Windows.Controls.Page, System.Windows.Markup.IComponentConnector {
#line 25 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtGwId;
#line default
#line hidden
#line 29 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtGwSw;
#line default
#line hidden
#line 32 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtGwHw;
#line default
#line hidden
#line 35 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtGwUptime;
#line default
#line hidden
#line 40 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtGwStatus;
#line default
#line hidden
#line 54 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtSim;
#line default
#line hidden
#line 58 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtNetStatus;
#line default
#line hidden
#line 62 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtSignal;
#line default
#line hidden
#line 65 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtIsp;
#line default
#line hidden
#line 70 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txt4GStatus;
#line default
#line hidden
#line 91 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtCloudHost;
#line default
#line hidden
#line 95 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtCloudPort;
#line default
#line hidden
#line 103 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtCloudResult;
#line default
#line hidden
#line 117 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtNetIp;
#line default
#line hidden
#line 121 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtNetMask;
#line default
#line hidden
#line 125 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtNetGw;
#line default
#line hidden
#line 129 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtNetDns;
#line default
#line hidden
#line 137 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtNetResult;
#line default
#line hidden
private bool _contentLoaded;
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/YKC;component/pages/gatewaypage.xaml", System.UriKind.Relative);
#line 1 "..\..\..\Pages\GatewayPage.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
switch (connectionId)
{
case 1:
this.txtGwId = ((System.Windows.Controls.TextBlock)(target));
return;
case 2:
this.txtGwSw = ((System.Windows.Controls.TextBlock)(target));
return;
case 3:
this.txtGwHw = ((System.Windows.Controls.TextBlock)(target));
return;
case 4:
this.txtGwUptime = ((System.Windows.Controls.TextBlock)(target));
return;
case 5:
#line 39 "..\..\..\Pages\GatewayPage.xaml"
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.RefreshGwInfo_Click);
#line default
#line hidden
return;
case 6:
this.txtGwStatus = ((System.Windows.Controls.TextBlock)(target));
return;
case 7:
this.txtSim = ((System.Windows.Controls.TextBlock)(target));
return;
case 8:
this.txtNetStatus = ((System.Windows.Controls.TextBlock)(target));
return;
case 9:
this.txtSignal = ((System.Windows.Controls.TextBlock)(target));
return;
case 10:
this.txtIsp = ((System.Windows.Controls.TextBlock)(target));
return;
case 11:
#line 69 "..\..\..\Pages\GatewayPage.xaml"
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Refresh4G_Click);
#line default
#line hidden
return;
case 12:
this.txt4GStatus = ((System.Windows.Controls.TextBlock)(target));
return;
case 13:
this.txtCloudHost = ((System.Windows.Controls.TextBox)(target));
return;
case 14:
this.txtCloudPort = ((System.Windows.Controls.TextBox)(target));
return;
case 15:
#line 100 "..\..\..\Pages\GatewayPage.xaml"
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.LoadCloudConfig_Click);
#line default
#line hidden
return;
case 16:
#line 102 "..\..\..\Pages\GatewayPage.xaml"
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.SaveCloudConfig_Click);
#line default
#line hidden
return;
case 17:
this.txtCloudResult = ((System.Windows.Controls.TextBlock)(target));
return;
case 18:
this.txtNetIp = ((System.Windows.Controls.TextBox)(target));
return;
case 19:
this.txtNetMask = ((System.Windows.Controls.TextBox)(target));
return;
case 20:
this.txtNetGw = ((System.Windows.Controls.TextBox)(target));
return;
case 21:
this.txtNetDns = ((System.Windows.Controls.TextBox)(target));
return;
case 22:
#line 134 "..\..\..\Pages\GatewayPage.xaml"
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.LoadNetConfig_Click);
#line default
#line hidden
return;
case 23:
#line 136 "..\..\..\Pages\GatewayPage.xaml"
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.SaveNetConfig_Click);
#line default
#line hidden
return;
case 24:
this.txtNetResult = ((System.Windows.Controls.TextBlock)(target));
return;
}
this._contentLoaded = true;
}
}
}

View File

@@ -0,0 +1,323 @@
#pragma checksum "..\..\..\Pages\GatewayPage.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "AD46577C7B1F8341FA8948443614B6661F41BCF60263F7064FF2BFEBAFA9DC81"
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
namespace YKC {
/// <summary>
/// GatewayPage
/// </summary>
public partial class GatewayPage : System.Windows.Controls.Page, System.Windows.Markup.IComponentConnector {
#line 25 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtGwId;
#line default
#line hidden
#line 29 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtGwSw;
#line default
#line hidden
#line 32 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtGwHw;
#line default
#line hidden
#line 35 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtGwUptime;
#line default
#line hidden
#line 40 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtGwStatus;
#line default
#line hidden
#line 54 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtSim;
#line default
#line hidden
#line 58 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtNetStatus;
#line default
#line hidden
#line 62 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtSignal;
#line default
#line hidden
#line 65 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtIsp;
#line default
#line hidden
#line 70 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txt4GStatus;
#line default
#line hidden
#line 91 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtCloudHost;
#line default
#line hidden
#line 95 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtCloudPort;
#line default
#line hidden
#line 103 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtCloudResult;
#line default
#line hidden
#line 117 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtNetIp;
#line default
#line hidden
#line 121 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtNetMask;
#line default
#line hidden
#line 125 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtNetGw;
#line default
#line hidden
#line 129 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtNetDns;
#line default
#line hidden
#line 137 "..\..\..\Pages\GatewayPage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtNetResult;
#line default
#line hidden
private bool _contentLoaded;
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/YKC;component/pages/gatewaypage.xaml", System.UriKind.Relative);
#line 1 "..\..\..\Pages\GatewayPage.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
switch (connectionId)
{
case 1:
this.txtGwId = ((System.Windows.Controls.TextBlock)(target));
return;
case 2:
this.txtGwSw = ((System.Windows.Controls.TextBlock)(target));
return;
case 3:
this.txtGwHw = ((System.Windows.Controls.TextBlock)(target));
return;
case 4:
this.txtGwUptime = ((System.Windows.Controls.TextBlock)(target));
return;
case 5:
#line 39 "..\..\..\Pages\GatewayPage.xaml"
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.RefreshGwInfo_Click);
#line default
#line hidden
return;
case 6:
this.txtGwStatus = ((System.Windows.Controls.TextBlock)(target));
return;
case 7:
this.txtSim = ((System.Windows.Controls.TextBlock)(target));
return;
case 8:
this.txtNetStatus = ((System.Windows.Controls.TextBlock)(target));
return;
case 9:
this.txtSignal = ((System.Windows.Controls.TextBlock)(target));
return;
case 10:
this.txtIsp = ((System.Windows.Controls.TextBlock)(target));
return;
case 11:
#line 69 "..\..\..\Pages\GatewayPage.xaml"
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Refresh4G_Click);
#line default
#line hidden
return;
case 12:
this.txt4GStatus = ((System.Windows.Controls.TextBlock)(target));
return;
case 13:
this.txtCloudHost = ((System.Windows.Controls.TextBox)(target));
return;
case 14:
this.txtCloudPort = ((System.Windows.Controls.TextBox)(target));
return;
case 15:
#line 100 "..\..\..\Pages\GatewayPage.xaml"
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.LoadCloudConfig_Click);
#line default
#line hidden
return;
case 16:
#line 102 "..\..\..\Pages\GatewayPage.xaml"
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.SaveCloudConfig_Click);
#line default
#line hidden
return;
case 17:
this.txtCloudResult = ((System.Windows.Controls.TextBlock)(target));
return;
case 18:
this.txtNetIp = ((System.Windows.Controls.TextBox)(target));
return;
case 19:
this.txtNetMask = ((System.Windows.Controls.TextBox)(target));
return;
case 20:
this.txtNetGw = ((System.Windows.Controls.TextBox)(target));
return;
case 21:
this.txtNetDns = ((System.Windows.Controls.TextBox)(target));
return;
case 22:
#line 134 "..\..\..\Pages\GatewayPage.xaml"
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.LoadNetConfig_Click);
#line default
#line hidden
return;
case 23:
#line 136 "..\..\..\Pages\GatewayPage.xaml"
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.SaveNetConfig_Click);
#line default
#line hidden
return;
case 24:
this.txtNetResult = ((System.Windows.Controls.TextBlock)(target));
return;
}
this._contentLoaded = true;
}
}
}

Binary file not shown.

View File

@@ -0,0 +1,266 @@
#pragma checksum "..\..\..\Pages\RealtimePage.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "5EED3EEEA729DC8EA1B9280A5B02D0300579DE890C7796C5C8C4CF0D736781DD"
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
using OxyPlot.Wpf;
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
namespace YKC {
/// <summary>
/// RealtimePage
/// </summary>
public partial class RealtimePage : System.Windows.Controls.Page, System.Windows.Markup.IComponentConnector {
#line 18 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.ComboBox cmbPile;
#line default
#line hidden
#line 26 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.ComboBox cmbGun;
#line default
#line hidden
#line 39 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtCurrent;
#line default
#line hidden
#line 47 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtVoltage;
#line default
#line hidden
#line 55 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtPower;
#line default
#line hidden
#line 63 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtEnergy;
#line default
#line hidden
#line 71 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtTotalAmount;
#line default
#line hidden
#line 79 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtStatus;
#line default
#line hidden
#line 91 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtOrderNo;
#line default
#line hidden
#line 100 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtSoc;
#line default
#line hidden
#line 108 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtCumTime;
#line default
#line hidden
#line 117 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtRemTime;
#line default
#line hidden
#line 140 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal OxyPlot.Wpf.PlotView plotCurrent;
#line default
#line hidden
#line 148 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal OxyPlot.Wpf.PlotView plotVoltage;
#line default
#line hidden
#line 156 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal OxyPlot.Wpf.PlotView plotPower;
#line default
#line hidden
#line 164 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal OxyPlot.Wpf.PlotView plotAmount;
#line default
#line hidden
private bool _contentLoaded;
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/YKC;component/pages/realtimepage.xaml", System.UriKind.Relative);
#line 1 "..\..\..\Pages\RealtimePage.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
switch (connectionId)
{
case 1:
this.cmbPile = ((System.Windows.Controls.ComboBox)(target));
#line 19 "..\..\..\Pages\RealtimePage.xaml"
this.cmbPile.SelectionChanged += new System.Windows.Controls.SelectionChangedEventHandler(this.PileGun_Changed);
#line default
#line hidden
return;
case 2:
this.cmbGun = ((System.Windows.Controls.ComboBox)(target));
#line 27 "..\..\..\Pages\RealtimePage.xaml"
this.cmbGun.SelectionChanged += new System.Windows.Controls.SelectionChangedEventHandler(this.PileGun_Changed);
#line default
#line hidden
return;
case 3:
this.txtCurrent = ((System.Windows.Controls.TextBlock)(target));
return;
case 4:
this.txtVoltage = ((System.Windows.Controls.TextBlock)(target));
return;
case 5:
this.txtPower = ((System.Windows.Controls.TextBlock)(target));
return;
case 6:
this.txtEnergy = ((System.Windows.Controls.TextBlock)(target));
return;
case 7:
this.txtTotalAmount = ((System.Windows.Controls.TextBlock)(target));
return;
case 8:
this.txtStatus = ((System.Windows.Controls.TextBlock)(target));
return;
case 9:
this.txtOrderNo = ((System.Windows.Controls.TextBlock)(target));
return;
case 10:
this.txtSoc = ((System.Windows.Controls.TextBlock)(target));
return;
case 11:
this.txtCumTime = ((System.Windows.Controls.TextBlock)(target));
return;
case 12:
this.txtRemTime = ((System.Windows.Controls.TextBlock)(target));
return;
case 13:
this.plotCurrent = ((OxyPlot.Wpf.PlotView)(target));
return;
case 14:
this.plotVoltage = ((OxyPlot.Wpf.PlotView)(target));
return;
case 15:
this.plotPower = ((OxyPlot.Wpf.PlotView)(target));
return;
case 16:
this.plotAmount = ((OxyPlot.Wpf.PlotView)(target));
return;
}
this._contentLoaded = true;
}
}
}

View File

@@ -0,0 +1,266 @@
#pragma checksum "..\..\..\Pages\RealtimePage.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "5EED3EEEA729DC8EA1B9280A5B02D0300579DE890C7796C5C8C4CF0D736781DD"
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
using OxyPlot.Wpf;
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
namespace YKC {
/// <summary>
/// RealtimePage
/// </summary>
public partial class RealtimePage : System.Windows.Controls.Page, System.Windows.Markup.IComponentConnector {
#line 18 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.ComboBox cmbPile;
#line default
#line hidden
#line 26 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.ComboBox cmbGun;
#line default
#line hidden
#line 39 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtCurrent;
#line default
#line hidden
#line 47 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtVoltage;
#line default
#line hidden
#line 55 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtPower;
#line default
#line hidden
#line 63 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtEnergy;
#line default
#line hidden
#line 71 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtTotalAmount;
#line default
#line hidden
#line 79 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtStatus;
#line default
#line hidden
#line 91 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtOrderNo;
#line default
#line hidden
#line 100 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtSoc;
#line default
#line hidden
#line 108 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtCumTime;
#line default
#line hidden
#line 117 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtRemTime;
#line default
#line hidden
#line 140 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal OxyPlot.Wpf.PlotView plotCurrent;
#line default
#line hidden
#line 148 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal OxyPlot.Wpf.PlotView plotVoltage;
#line default
#line hidden
#line 156 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal OxyPlot.Wpf.PlotView plotPower;
#line default
#line hidden
#line 164 "..\..\..\Pages\RealtimePage.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal OxyPlot.Wpf.PlotView plotAmount;
#line default
#line hidden
private bool _contentLoaded;
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/YKC;component/pages/realtimepage.xaml", System.UriKind.Relative);
#line 1 "..\..\..\Pages\RealtimePage.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
switch (connectionId)
{
case 1:
this.cmbPile = ((System.Windows.Controls.ComboBox)(target));
#line 19 "..\..\..\Pages\RealtimePage.xaml"
this.cmbPile.SelectionChanged += new System.Windows.Controls.SelectionChangedEventHandler(this.PileGun_Changed);
#line default
#line hidden
return;
case 2:
this.cmbGun = ((System.Windows.Controls.ComboBox)(target));
#line 27 "..\..\..\Pages\RealtimePage.xaml"
this.cmbGun.SelectionChanged += new System.Windows.Controls.SelectionChangedEventHandler(this.PileGun_Changed);
#line default
#line hidden
return;
case 3:
this.txtCurrent = ((System.Windows.Controls.TextBlock)(target));
return;
case 4:
this.txtVoltage = ((System.Windows.Controls.TextBlock)(target));
return;
case 5:
this.txtPower = ((System.Windows.Controls.TextBlock)(target));
return;
case 6:
this.txtEnergy = ((System.Windows.Controls.TextBlock)(target));
return;
case 7:
this.txtTotalAmount = ((System.Windows.Controls.TextBlock)(target));
return;
case 8:
this.txtStatus = ((System.Windows.Controls.TextBlock)(target));
return;
case 9:
this.txtOrderNo = ((System.Windows.Controls.TextBlock)(target));
return;
case 10:
this.txtSoc = ((System.Windows.Controls.TextBlock)(target));
return;
case 11:
this.txtCumTime = ((System.Windows.Controls.TextBlock)(target));
return;
case 12:
this.txtRemTime = ((System.Windows.Controls.TextBlock)(target));
return;
case 13:
this.plotCurrent = ((OxyPlot.Wpf.PlotView)(target));
return;
case 14:
this.plotVoltage = ((OxyPlot.Wpf.PlotView)(target));
return;
case 15:
this.plotPower = ((OxyPlot.Wpf.PlotView)(target));
return;
case 16:
this.plotAmount = ((OxyPlot.Wpf.PlotView)(target));
return;
}
this._contentLoaded = true;
}
}
}

View File

@@ -0,0 +1 @@
b70b92aee237e65b6ea21cb2cfff89384ebd80dce4b9ea16adc79dd9cef2fdf5

View File

@@ -0,0 +1,30 @@
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\bin\Debug\YKC.exe.config
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\bin\Debug\YKC.exe
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\bin\Debug\YKC.pdb
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\obj\Debug\YKC.csproj.AssemblyReference.cache
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\obj\Debug\MainWindow.baml
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\obj\Debug\App.baml
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\obj\Debug\MainWindow.g.cs
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\obj\Debug\App.g.cs
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\obj\Debug\YKC_MarkupCompile.cache
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\obj\Debug\YKC.g.resources
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\obj\Debug\YKC.Properties.Resources.resources
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\obj\Debug\YKC.csproj.GenerateResource.cache
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\obj\Debug\YKC.csproj.CoreCompileInputs.cache
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\obj\Debug\YKC.exe
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\obj\Debug\YKC.pdb
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\obj\Debug\Pages\DashboardPage.baml
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\obj\Debug\Pages\RealtimePage.baml
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\obj\Debug\Pages\ChargerPage.baml
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\obj\Debug\Pages\GatewayPage.baml
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\obj\Debug\Pages\DashboardPage.g.cs
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\obj\Debug\Pages\RealtimePage.g.cs
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\obj\Debug\Pages\ChargerPage.g.cs
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\obj\Debug\Pages\GatewayPage.g.cs
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\bin\Debug\OxyPlot.dll
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\bin\Debug\OxyPlot.Wpf.dll
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\bin\Debug\OxyPlot.Wpf.Shared.dll
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\obj\Debug\YKC.csproj.Up2Date
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\bin\Debug\Newtonsoft.Json.dll
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\obj\Debug\LoginWindow.baml
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\obj\Debug\LoginWindow.g.cs

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,20 @@
YKC
winexe
C#
.cs
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\obj\Debug\
YKC
none
false
DEBUG;TRACE
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\App.xaml
6469827525
13-721072773
19-2120478581
MainWindow.xaml;LoginWindow.xaml;Pages\DashboardPage.xaml;Pages\RealtimePage.xaml;Pages\ChargerPage.xaml;Pages\GatewayPage.xaml;
False

View File

@@ -0,0 +1,20 @@
YKC
winexe
C#
.cs
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\obj\Debug\
YKC
none
false
DEBUG;TRACE
C:\Users\Administrator\PycharmProjects\PythonProject\C#\YKC\App.xaml
6469827525
141491805905
19-2120478581
MainWindow.xaml;LoginWindow.xaml;Pages\DashboardPage.xaml;Pages\RealtimePage.xaml;Pages\ChargerPage.xaml;Pages\GatewayPage.xaml;
False

View File

@@ -0,0 +1,72 @@
{
"format": 1,
"restore": {
"C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\YKC.csproj": {}
},
"projects": {
"C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\YKC.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\YKC.csproj",
"projectName": "YKC",
"projectPath": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\YKC.csproj",
"packagesPath": "C:\\Users\\Administrator\\.nuget\\packages\\",
"outputPath": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\obj\\",
"projectStyle": "PackageReference",
"skipContentFileWrite": true,
"UsingMicrosoftNETSdk": false,
"configFilePaths": [
"C:\\Users\\Administrator\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net472"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net472": {
"framework": "net472",
"projectReferences": {}
}
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
}
},
"frameworks": {
"net472": {
"framework": "net472",
"dependencies": {
"Newtonsoft.Json": {
"target": "Package",
"version": "[13.0.3, )"
},
"OxyPlot.Wpf": {
"target": "Package",
"version": "[2.2.0, )"
}
}
}
},
"runtimes": {
"win": {
"#import": []
},
"win-arm64": {
"#import": []
},
"win-x64": {
"#import": []
},
"win-x86": {
"#import": []
}
}
}
}
}

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\Administrator\.nuget\packages\</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">7.0.0</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\Administrator\.nuget\packages\" />
</ItemGroup>
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<PkgOxyPlot_Wpf Condition=" '$(PkgOxyPlot_Wpf)' == '' ">C:\Users\Administrator\.nuget\packages\oxyplot.wpf\2.2.0</PkgOxyPlot_Wpf>
</PropertyGroup>
</Project>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />

View File

@@ -0,0 +1,972 @@
{
"version": 3,
"targets": {
".NETFramework,Version=v4.7.2": {
"Microsoft.NETFramework.ReferenceAssemblies/1.0.2": {
"type": "package",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies.net472": "1.0.2"
}
},
"Microsoft.NETFramework.ReferenceAssemblies.net472/1.0.2": {
"type": "package",
"build": {
"build/_._": {}
}
},
"Newtonsoft.Json/13.0.3": {
"type": "package",
"compile": {
"lib/net45/Newtonsoft.Json.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net45/Newtonsoft.Json.dll": {
"related": ".xml"
}
}
},
"OxyPlot.Core/2.2.0": {
"type": "package",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies": "1.0.2"
},
"compile": {
"lib/net462/OxyPlot.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net462/OxyPlot.dll": {
"related": ".xml"
}
}
},
"OxyPlot.Wpf/2.2.0": {
"type": "package",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies": "1.0.2",
"OxyPlot.Core": "2.2.0",
"OxyPlot.Wpf.Shared": "2.2.0"
},
"frameworkAssemblies": [
"ReachFramework",
"System.Printing"
],
"compile": {
"lib/net462/OxyPlot.Wpf.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net462/OxyPlot.Wpf.dll": {
"related": ".xml"
}
}
},
"OxyPlot.Wpf.Shared/2.2.0": {
"type": "package",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies": "1.0.2",
"OxyPlot.Core": "2.2.0"
},
"compile": {
"lib/net462/OxyPlot.Wpf.Shared.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net462/OxyPlot.Wpf.Shared.dll": {
"related": ".xml"
}
}
}
},
".NETFramework,Version=v4.7.2/win": {
"Microsoft.NETFramework.ReferenceAssemblies/1.0.2": {
"type": "package",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies.net472": "1.0.2"
}
},
"Microsoft.NETFramework.ReferenceAssemblies.net472/1.0.2": {
"type": "package",
"build": {
"build/_._": {}
}
},
"Newtonsoft.Json/13.0.3": {
"type": "package",
"compile": {
"lib/net45/Newtonsoft.Json.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net45/Newtonsoft.Json.dll": {
"related": ".xml"
}
}
},
"OxyPlot.Core/2.2.0": {
"type": "package",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies": "1.0.2"
},
"compile": {
"lib/net462/OxyPlot.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net462/OxyPlot.dll": {
"related": ".xml"
}
}
},
"OxyPlot.Wpf/2.2.0": {
"type": "package",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies": "1.0.2",
"OxyPlot.Core": "2.2.0",
"OxyPlot.Wpf.Shared": "2.2.0"
},
"frameworkAssemblies": [
"ReachFramework",
"System.Printing"
],
"compile": {
"lib/net462/OxyPlot.Wpf.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net462/OxyPlot.Wpf.dll": {
"related": ".xml"
}
}
},
"OxyPlot.Wpf.Shared/2.2.0": {
"type": "package",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies": "1.0.2",
"OxyPlot.Core": "2.2.0"
},
"compile": {
"lib/net462/OxyPlot.Wpf.Shared.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net462/OxyPlot.Wpf.Shared.dll": {
"related": ".xml"
}
}
}
},
".NETFramework,Version=v4.7.2/win-arm64": {
"Microsoft.NETFramework.ReferenceAssemblies/1.0.2": {
"type": "package",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies.net472": "1.0.2"
}
},
"Microsoft.NETFramework.ReferenceAssemblies.net472/1.0.2": {
"type": "package",
"build": {
"build/_._": {}
}
},
"Newtonsoft.Json/13.0.3": {
"type": "package",
"compile": {
"lib/net45/Newtonsoft.Json.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net45/Newtonsoft.Json.dll": {
"related": ".xml"
}
}
},
"OxyPlot.Core/2.2.0": {
"type": "package",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies": "1.0.2"
},
"compile": {
"lib/net462/OxyPlot.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net462/OxyPlot.dll": {
"related": ".xml"
}
}
},
"OxyPlot.Wpf/2.2.0": {
"type": "package",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies": "1.0.2",
"OxyPlot.Core": "2.2.0",
"OxyPlot.Wpf.Shared": "2.2.0"
},
"frameworkAssemblies": [
"ReachFramework",
"System.Printing"
],
"compile": {
"lib/net462/OxyPlot.Wpf.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net462/OxyPlot.Wpf.dll": {
"related": ".xml"
}
}
},
"OxyPlot.Wpf.Shared/2.2.0": {
"type": "package",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies": "1.0.2",
"OxyPlot.Core": "2.2.0"
},
"compile": {
"lib/net462/OxyPlot.Wpf.Shared.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net462/OxyPlot.Wpf.Shared.dll": {
"related": ".xml"
}
}
}
},
".NETFramework,Version=v4.7.2/win-x64": {
"Microsoft.NETFramework.ReferenceAssemblies/1.0.2": {
"type": "package",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies.net472": "1.0.2"
}
},
"Microsoft.NETFramework.ReferenceAssemblies.net472/1.0.2": {
"type": "package",
"build": {
"build/_._": {}
}
},
"Newtonsoft.Json/13.0.3": {
"type": "package",
"compile": {
"lib/net45/Newtonsoft.Json.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net45/Newtonsoft.Json.dll": {
"related": ".xml"
}
}
},
"OxyPlot.Core/2.2.0": {
"type": "package",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies": "1.0.2"
},
"compile": {
"lib/net462/OxyPlot.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net462/OxyPlot.dll": {
"related": ".xml"
}
}
},
"OxyPlot.Wpf/2.2.0": {
"type": "package",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies": "1.0.2",
"OxyPlot.Core": "2.2.0",
"OxyPlot.Wpf.Shared": "2.2.0"
},
"frameworkAssemblies": [
"ReachFramework",
"System.Printing"
],
"compile": {
"lib/net462/OxyPlot.Wpf.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net462/OxyPlot.Wpf.dll": {
"related": ".xml"
}
}
},
"OxyPlot.Wpf.Shared/2.2.0": {
"type": "package",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies": "1.0.2",
"OxyPlot.Core": "2.2.0"
},
"compile": {
"lib/net462/OxyPlot.Wpf.Shared.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net462/OxyPlot.Wpf.Shared.dll": {
"related": ".xml"
}
}
}
},
".NETFramework,Version=v4.7.2/win-x86": {
"Microsoft.NETFramework.ReferenceAssemblies/1.0.2": {
"type": "package",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies.net472": "1.0.2"
}
},
"Microsoft.NETFramework.ReferenceAssemblies.net472/1.0.2": {
"type": "package",
"build": {
"build/_._": {}
}
},
"Newtonsoft.Json/13.0.3": {
"type": "package",
"compile": {
"lib/net45/Newtonsoft.Json.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net45/Newtonsoft.Json.dll": {
"related": ".xml"
}
}
},
"OxyPlot.Core/2.2.0": {
"type": "package",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies": "1.0.2"
},
"compile": {
"lib/net462/OxyPlot.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net462/OxyPlot.dll": {
"related": ".xml"
}
}
},
"OxyPlot.Wpf/2.2.0": {
"type": "package",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies": "1.0.2",
"OxyPlot.Core": "2.2.0",
"OxyPlot.Wpf.Shared": "2.2.0"
},
"frameworkAssemblies": [
"ReachFramework",
"System.Printing"
],
"compile": {
"lib/net462/OxyPlot.Wpf.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net462/OxyPlot.Wpf.dll": {
"related": ".xml"
}
}
},
"OxyPlot.Wpf.Shared/2.2.0": {
"type": "package",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies": "1.0.2",
"OxyPlot.Core": "2.2.0"
},
"compile": {
"lib/net462/OxyPlot.Wpf.Shared.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net462/OxyPlot.Wpf.Shared.dll": {
"related": ".xml"
}
}
}
}
},
"libraries": {
"Microsoft.NETFramework.ReferenceAssemblies/1.0.2": {
"sha512": "5/cSEVld+px/CuRrbohO/djfg6++eR6zGpy88MgqloXvkj//WXWpFZyu/OpkXPN0u5m+dN/EVwLNYFUxD4h2+A==",
"type": "package",
"path": "microsoft.netframework.referenceassemblies/1.0.2",
"files": [
".nupkg.metadata",
".signature.p7s",
"microsoft.netframework.referenceassemblies.1.0.2.nupkg.sha512",
"microsoft.netframework.referenceassemblies.nuspec"
]
},
"Microsoft.NETFramework.ReferenceAssemblies.net472/1.0.2": {
"sha512": "ryAuwkvjMC9xYQ0VXsG7ZBo62y5tBmYaCnovOL5IXfnQPQqjvJGRkLMDyUx+dnCb96UVLJv83R6XK+sRnDnaZg==",
"type": "package",
"path": "microsoft.netframework.referenceassemblies.net472/1.0.2",
"files": [
".nupkg.metadata",
".signature.p7s",
"build/.NETFramework/v4.7.2/Accessibility.dll",
"build/.NETFramework/v4.7.2/Accessibility.xml",
"build/.NETFramework/v4.7.2/CustomMarshalers.dll",
"build/.NETFramework/v4.7.2/CustomMarshalers.xml",
"build/.NETFramework/v4.7.2/Facades/Microsoft.Win32.Primitives.dll",
"build/.NETFramework/v4.7.2/Facades/System.AppContext.dll",
"build/.NETFramework/v4.7.2/Facades/System.Collections.Concurrent.dll",
"build/.NETFramework/v4.7.2/Facades/System.Collections.NonGeneric.dll",
"build/.NETFramework/v4.7.2/Facades/System.Collections.Specialized.dll",
"build/.NETFramework/v4.7.2/Facades/System.Collections.dll",
"build/.NETFramework/v4.7.2/Facades/System.ComponentModel.Annotations.dll",
"build/.NETFramework/v4.7.2/Facades/System.ComponentModel.EventBasedAsync.dll",
"build/.NETFramework/v4.7.2/Facades/System.ComponentModel.Primitives.dll",
"build/.NETFramework/v4.7.2/Facades/System.ComponentModel.TypeConverter.dll",
"build/.NETFramework/v4.7.2/Facades/System.ComponentModel.dll",
"build/.NETFramework/v4.7.2/Facades/System.Console.dll",
"build/.NETFramework/v4.7.2/Facades/System.Data.Common.dll",
"build/.NETFramework/v4.7.2/Facades/System.Diagnostics.Contracts.dll",
"build/.NETFramework/v4.7.2/Facades/System.Diagnostics.Debug.dll",
"build/.NETFramework/v4.7.2/Facades/System.Diagnostics.FileVersionInfo.dll",
"build/.NETFramework/v4.7.2/Facades/System.Diagnostics.Process.dll",
"build/.NETFramework/v4.7.2/Facades/System.Diagnostics.StackTrace.dll",
"build/.NETFramework/v4.7.2/Facades/System.Diagnostics.TextWriterTraceListener.dll",
"build/.NETFramework/v4.7.2/Facades/System.Diagnostics.Tools.dll",
"build/.NETFramework/v4.7.2/Facades/System.Diagnostics.TraceSource.dll",
"build/.NETFramework/v4.7.2/Facades/System.Drawing.Primitives.dll",
"build/.NETFramework/v4.7.2/Facades/System.Dynamic.Runtime.dll",
"build/.NETFramework/v4.7.2/Facades/System.Globalization.Calendars.dll",
"build/.NETFramework/v4.7.2/Facades/System.Globalization.Extensions.dll",
"build/.NETFramework/v4.7.2/Facades/System.Globalization.dll",
"build/.NETFramework/v4.7.2/Facades/System.IO.Compression.ZipFile.dll",
"build/.NETFramework/v4.7.2/Facades/System.IO.FileSystem.DriveInfo.dll",
"build/.NETFramework/v4.7.2/Facades/System.IO.FileSystem.Primitives.dll",
"build/.NETFramework/v4.7.2/Facades/System.IO.FileSystem.Watcher.dll",
"build/.NETFramework/v4.7.2/Facades/System.IO.FileSystem.dll",
"build/.NETFramework/v4.7.2/Facades/System.IO.IsolatedStorage.dll",
"build/.NETFramework/v4.7.2/Facades/System.IO.MemoryMappedFiles.dll",
"build/.NETFramework/v4.7.2/Facades/System.IO.Pipes.dll",
"build/.NETFramework/v4.7.2/Facades/System.IO.UnmanagedMemoryStream.dll",
"build/.NETFramework/v4.7.2/Facades/System.IO.dll",
"build/.NETFramework/v4.7.2/Facades/System.Linq.Expressions.dll",
"build/.NETFramework/v4.7.2/Facades/System.Linq.Parallel.dll",
"build/.NETFramework/v4.7.2/Facades/System.Linq.Queryable.dll",
"build/.NETFramework/v4.7.2/Facades/System.Linq.dll",
"build/.NETFramework/v4.7.2/Facades/System.Net.Http.Rtc.dll",
"build/.NETFramework/v4.7.2/Facades/System.Net.NameResolution.dll",
"build/.NETFramework/v4.7.2/Facades/System.Net.NetworkInformation.dll",
"build/.NETFramework/v4.7.2/Facades/System.Net.Ping.dll",
"build/.NETFramework/v4.7.2/Facades/System.Net.Primitives.dll",
"build/.NETFramework/v4.7.2/Facades/System.Net.Requests.dll",
"build/.NETFramework/v4.7.2/Facades/System.Net.Security.dll",
"build/.NETFramework/v4.7.2/Facades/System.Net.Sockets.dll",
"build/.NETFramework/v4.7.2/Facades/System.Net.WebHeaderCollection.dll",
"build/.NETFramework/v4.7.2/Facades/System.Net.WebSockets.Client.dll",
"build/.NETFramework/v4.7.2/Facades/System.Net.WebSockets.dll",
"build/.NETFramework/v4.7.2/Facades/System.ObjectModel.dll",
"build/.NETFramework/v4.7.2/Facades/System.Reflection.Emit.ILGeneration.dll",
"build/.NETFramework/v4.7.2/Facades/System.Reflection.Emit.Lightweight.dll",
"build/.NETFramework/v4.7.2/Facades/System.Reflection.Emit.dll",
"build/.NETFramework/v4.7.2/Facades/System.Reflection.Extensions.dll",
"build/.NETFramework/v4.7.2/Facades/System.Reflection.Primitives.dll",
"build/.NETFramework/v4.7.2/Facades/System.Reflection.dll",
"build/.NETFramework/v4.7.2/Facades/System.Resources.Reader.dll",
"build/.NETFramework/v4.7.2/Facades/System.Resources.ResourceManager.dll",
"build/.NETFramework/v4.7.2/Facades/System.Resources.Writer.dll",
"build/.NETFramework/v4.7.2/Facades/System.Runtime.CompilerServices.VisualC.dll",
"build/.NETFramework/v4.7.2/Facades/System.Runtime.Extensions.dll",
"build/.NETFramework/v4.7.2/Facades/System.Runtime.Handles.dll",
"build/.NETFramework/v4.7.2/Facades/System.Runtime.InteropServices.RuntimeInformation.dll",
"build/.NETFramework/v4.7.2/Facades/System.Runtime.InteropServices.WindowsRuntime.dll",
"build/.NETFramework/v4.7.2/Facades/System.Runtime.InteropServices.dll",
"build/.NETFramework/v4.7.2/Facades/System.Runtime.Numerics.dll",
"build/.NETFramework/v4.7.2/Facades/System.Runtime.Serialization.Formatters.dll",
"build/.NETFramework/v4.7.2/Facades/System.Runtime.Serialization.Json.dll",
"build/.NETFramework/v4.7.2/Facades/System.Runtime.Serialization.Primitives.dll",
"build/.NETFramework/v4.7.2/Facades/System.Runtime.Serialization.Xml.dll",
"build/.NETFramework/v4.7.2/Facades/System.Runtime.dll",
"build/.NETFramework/v4.7.2/Facades/System.Security.Claims.dll",
"build/.NETFramework/v4.7.2/Facades/System.Security.Cryptography.Algorithms.dll",
"build/.NETFramework/v4.7.2/Facades/System.Security.Cryptography.Csp.dll",
"build/.NETFramework/v4.7.2/Facades/System.Security.Cryptography.Encoding.dll",
"build/.NETFramework/v4.7.2/Facades/System.Security.Cryptography.Primitives.dll",
"build/.NETFramework/v4.7.2/Facades/System.Security.Cryptography.X509Certificates.dll",
"build/.NETFramework/v4.7.2/Facades/System.Security.Principal.dll",
"build/.NETFramework/v4.7.2/Facades/System.Security.SecureString.dll",
"build/.NETFramework/v4.7.2/Facades/System.ServiceModel.Duplex.dll",
"build/.NETFramework/v4.7.2/Facades/System.ServiceModel.Http.dll",
"build/.NETFramework/v4.7.2/Facades/System.ServiceModel.NetTcp.dll",
"build/.NETFramework/v4.7.2/Facades/System.ServiceModel.Primitives.dll",
"build/.NETFramework/v4.7.2/Facades/System.ServiceModel.Security.dll",
"build/.NETFramework/v4.7.2/Facades/System.Text.Encoding.Extensions.dll",
"build/.NETFramework/v4.7.2/Facades/System.Text.Encoding.dll",
"build/.NETFramework/v4.7.2/Facades/System.Text.RegularExpressions.dll",
"build/.NETFramework/v4.7.2/Facades/System.Threading.Overlapped.dll",
"build/.NETFramework/v4.7.2/Facades/System.Threading.Tasks.Parallel.dll",
"build/.NETFramework/v4.7.2/Facades/System.Threading.Tasks.dll",
"build/.NETFramework/v4.7.2/Facades/System.Threading.Thread.dll",
"build/.NETFramework/v4.7.2/Facades/System.Threading.ThreadPool.dll",
"build/.NETFramework/v4.7.2/Facades/System.Threading.Timer.dll",
"build/.NETFramework/v4.7.2/Facades/System.Threading.dll",
"build/.NETFramework/v4.7.2/Facades/System.ValueTuple.dll",
"build/.NETFramework/v4.7.2/Facades/System.Xml.ReaderWriter.dll",
"build/.NETFramework/v4.7.2/Facades/System.Xml.XDocument.dll",
"build/.NETFramework/v4.7.2/Facades/System.Xml.XPath.XDocument.dll",
"build/.NETFramework/v4.7.2/Facades/System.Xml.XPath.dll",
"build/.NETFramework/v4.7.2/Facades/System.Xml.XmlDocument.dll",
"build/.NETFramework/v4.7.2/Facades/System.Xml.XmlSerializer.dll",
"build/.NETFramework/v4.7.2/Facades/netstandard.dll",
"build/.NETFramework/v4.7.2/ISymWrapper.dll",
"build/.NETFramework/v4.7.2/ISymWrapper.xml",
"build/.NETFramework/v4.7.2/Microsoft.Activities.Build.dll",
"build/.NETFramework/v4.7.2/Microsoft.Activities.Build.xml",
"build/.NETFramework/v4.7.2/Microsoft.Build.Conversion.v4.0.dll",
"build/.NETFramework/v4.7.2/Microsoft.Build.Conversion.v4.0.xml",
"build/.NETFramework/v4.7.2/Microsoft.Build.Engine.dll",
"build/.NETFramework/v4.7.2/Microsoft.Build.Engine.xml",
"build/.NETFramework/v4.7.2/Microsoft.Build.Framework.dll",
"build/.NETFramework/v4.7.2/Microsoft.Build.Framework.xml",
"build/.NETFramework/v4.7.2/Microsoft.Build.Tasks.v4.0.dll",
"build/.NETFramework/v4.7.2/Microsoft.Build.Tasks.v4.0.xml",
"build/.NETFramework/v4.7.2/Microsoft.Build.Utilities.v4.0.dll",
"build/.NETFramework/v4.7.2/Microsoft.Build.Utilities.v4.0.xml",
"build/.NETFramework/v4.7.2/Microsoft.Build.dll",
"build/.NETFramework/v4.7.2/Microsoft.Build.xml",
"build/.NETFramework/v4.7.2/Microsoft.CSharp.dll",
"build/.NETFramework/v4.7.2/Microsoft.CSharp.xml",
"build/.NETFramework/v4.7.2/Microsoft.JScript.dll",
"build/.NETFramework/v4.7.2/Microsoft.JScript.xml",
"build/.NETFramework/v4.7.2/Microsoft.VisualBasic.Compatibility.Data.dll",
"build/.NETFramework/v4.7.2/Microsoft.VisualBasic.Compatibility.Data.xml",
"build/.NETFramework/v4.7.2/Microsoft.VisualBasic.Compatibility.dll",
"build/.NETFramework/v4.7.2/Microsoft.VisualBasic.Compatibility.xml",
"build/.NETFramework/v4.7.2/Microsoft.VisualBasic.dll",
"build/.NETFramework/v4.7.2/Microsoft.VisualBasic.xml",
"build/.NETFramework/v4.7.2/Microsoft.VisualC.STLCLR.dll",
"build/.NETFramework/v4.7.2/Microsoft.VisualC.STLCLR.xml",
"build/.NETFramework/v4.7.2/Microsoft.VisualC.dll",
"build/.NETFramework/v4.7.2/Microsoft.VisualC.xml",
"build/.NETFramework/v4.7.2/PermissionSets/FullTrust.xml",
"build/.NETFramework/v4.7.2/PermissionSets/Internet.xml",
"build/.NETFramework/v4.7.2/PermissionSets/LocalIntranet.xml",
"build/.NETFramework/v4.7.2/PresentationBuildTasks.dll",
"build/.NETFramework/v4.7.2/PresentationBuildTasks.xml",
"build/.NETFramework/v4.7.2/PresentationCore.dll",
"build/.NETFramework/v4.7.2/PresentationCore.xml",
"build/.NETFramework/v4.7.2/PresentationFramework.Aero.dll",
"build/.NETFramework/v4.7.2/PresentationFramework.Aero.xml",
"build/.NETFramework/v4.7.2/PresentationFramework.Aero2.dll",
"build/.NETFramework/v4.7.2/PresentationFramework.Aero2.xml",
"build/.NETFramework/v4.7.2/PresentationFramework.AeroLite.dll",
"build/.NETFramework/v4.7.2/PresentationFramework.AeroLite.xml",
"build/.NETFramework/v4.7.2/PresentationFramework.Classic.dll",
"build/.NETFramework/v4.7.2/PresentationFramework.Classic.xml",
"build/.NETFramework/v4.7.2/PresentationFramework.Luna.dll",
"build/.NETFramework/v4.7.2/PresentationFramework.Luna.xml",
"build/.NETFramework/v4.7.2/PresentationFramework.Royale.dll",
"build/.NETFramework/v4.7.2/PresentationFramework.Royale.xml",
"build/.NETFramework/v4.7.2/PresentationFramework.dll",
"build/.NETFramework/v4.7.2/PresentationFramework.xml",
"build/.NETFramework/v4.7.2/ReachFramework.dll",
"build/.NETFramework/v4.7.2/ReachFramework.xml",
"build/.NETFramework/v4.7.2/RedistList/FrameworkList.xml",
"build/.NETFramework/v4.7.2/System.Activities.Core.Presentation.dll",
"build/.NETFramework/v4.7.2/System.Activities.Core.Presentation.xml",
"build/.NETFramework/v4.7.2/System.Activities.DurableInstancing.dll",
"build/.NETFramework/v4.7.2/System.Activities.DurableInstancing.xml",
"build/.NETFramework/v4.7.2/System.Activities.Presentation.dll",
"build/.NETFramework/v4.7.2/System.Activities.Presentation.xml",
"build/.NETFramework/v4.7.2/System.Activities.dll",
"build/.NETFramework/v4.7.2/System.Activities.xml",
"build/.NETFramework/v4.7.2/System.AddIn.Contract.dll",
"build/.NETFramework/v4.7.2/System.AddIn.Contract.xml",
"build/.NETFramework/v4.7.2/System.AddIn.dll",
"build/.NETFramework/v4.7.2/System.AddIn.xml",
"build/.NETFramework/v4.7.2/System.ComponentModel.Composition.Registration.dll",
"build/.NETFramework/v4.7.2/System.ComponentModel.Composition.Registration.xml",
"build/.NETFramework/v4.7.2/System.ComponentModel.Composition.dll",
"build/.NETFramework/v4.7.2/System.ComponentModel.Composition.xml",
"build/.NETFramework/v4.7.2/System.ComponentModel.DataAnnotations.dll",
"build/.NETFramework/v4.7.2/System.ComponentModel.DataAnnotations.xml",
"build/.NETFramework/v4.7.2/System.Configuration.Install.dll",
"build/.NETFramework/v4.7.2/System.Configuration.Install.xml",
"build/.NETFramework/v4.7.2/System.Configuration.dll",
"build/.NETFramework/v4.7.2/System.Configuration.xml",
"build/.NETFramework/v4.7.2/System.Core.dll",
"build/.NETFramework/v4.7.2/System.Core.xml",
"build/.NETFramework/v4.7.2/System.Data.DataSetExtensions.dll",
"build/.NETFramework/v4.7.2/System.Data.DataSetExtensions.xml",
"build/.NETFramework/v4.7.2/System.Data.Entity.Design.dll",
"build/.NETFramework/v4.7.2/System.Data.Entity.Design.xml",
"build/.NETFramework/v4.7.2/System.Data.Entity.dll",
"build/.NETFramework/v4.7.2/System.Data.Entity.xml",
"build/.NETFramework/v4.7.2/System.Data.Linq.dll",
"build/.NETFramework/v4.7.2/System.Data.Linq.xml",
"build/.NETFramework/v4.7.2/System.Data.OracleClient.dll",
"build/.NETFramework/v4.7.2/System.Data.OracleClient.xml",
"build/.NETFramework/v4.7.2/System.Data.Services.Client.dll",
"build/.NETFramework/v4.7.2/System.Data.Services.Client.xml",
"build/.NETFramework/v4.7.2/System.Data.Services.Design.dll",
"build/.NETFramework/v4.7.2/System.Data.Services.Design.xml",
"build/.NETFramework/v4.7.2/System.Data.Services.dll",
"build/.NETFramework/v4.7.2/System.Data.Services.xml",
"build/.NETFramework/v4.7.2/System.Data.SqlXml.dll",
"build/.NETFramework/v4.7.2/System.Data.SqlXml.xml",
"build/.NETFramework/v4.7.2/System.Data.dll",
"build/.NETFramework/v4.7.2/System.Data.xml",
"build/.NETFramework/v4.7.2/System.Deployment.dll",
"build/.NETFramework/v4.7.2/System.Deployment.xml",
"build/.NETFramework/v4.7.2/System.Design.dll",
"build/.NETFramework/v4.7.2/System.Design.xml",
"build/.NETFramework/v4.7.2/System.Device.dll",
"build/.NETFramework/v4.7.2/System.Device.xml",
"build/.NETFramework/v4.7.2/System.Diagnostics.Tracing.dll",
"build/.NETFramework/v4.7.2/System.Diagnostics.Tracing.xml",
"build/.NETFramework/v4.7.2/System.DirectoryServices.AccountManagement.dll",
"build/.NETFramework/v4.7.2/System.DirectoryServices.AccountManagement.xml",
"build/.NETFramework/v4.7.2/System.DirectoryServices.Protocols.dll",
"build/.NETFramework/v4.7.2/System.DirectoryServices.Protocols.xml",
"build/.NETFramework/v4.7.2/System.DirectoryServices.dll",
"build/.NETFramework/v4.7.2/System.DirectoryServices.xml",
"build/.NETFramework/v4.7.2/System.Drawing.Design.dll",
"build/.NETFramework/v4.7.2/System.Drawing.Design.xml",
"build/.NETFramework/v4.7.2/System.Drawing.dll",
"build/.NETFramework/v4.7.2/System.Drawing.xml",
"build/.NETFramework/v4.7.2/System.Dynamic.dll",
"build/.NETFramework/v4.7.2/System.EnterpriseServices.Thunk.dll",
"build/.NETFramework/v4.7.2/System.EnterpriseServices.Wrapper.dll",
"build/.NETFramework/v4.7.2/System.EnterpriseServices.dll",
"build/.NETFramework/v4.7.2/System.EnterpriseServices.xml",
"build/.NETFramework/v4.7.2/System.IO.Compression.FileSystem.dll",
"build/.NETFramework/v4.7.2/System.IO.Compression.FileSystem.xml",
"build/.NETFramework/v4.7.2/System.IO.Compression.dll",
"build/.NETFramework/v4.7.2/System.IO.Compression.xml",
"build/.NETFramework/v4.7.2/System.IO.Log.dll",
"build/.NETFramework/v4.7.2/System.IO.Log.xml",
"build/.NETFramework/v4.7.2/System.IdentityModel.Selectors.dll",
"build/.NETFramework/v4.7.2/System.IdentityModel.Selectors.xml",
"build/.NETFramework/v4.7.2/System.IdentityModel.Services.dll",
"build/.NETFramework/v4.7.2/System.IdentityModel.Services.xml",
"build/.NETFramework/v4.7.2/System.IdentityModel.dll",
"build/.NETFramework/v4.7.2/System.IdentityModel.xml",
"build/.NETFramework/v4.7.2/System.Linq.xml",
"build/.NETFramework/v4.7.2/System.Management.Instrumentation.dll",
"build/.NETFramework/v4.7.2/System.Management.Instrumentation.xml",
"build/.NETFramework/v4.7.2/System.Management.dll",
"build/.NETFramework/v4.7.2/System.Management.xml",
"build/.NETFramework/v4.7.2/System.Messaging.dll",
"build/.NETFramework/v4.7.2/System.Messaging.xml",
"build/.NETFramework/v4.7.2/System.Net.Http.WebRequest.dll",
"build/.NETFramework/v4.7.2/System.Net.Http.WebRequest.xml",
"build/.NETFramework/v4.7.2/System.Net.Http.dll",
"build/.NETFramework/v4.7.2/System.Net.Http.xml",
"build/.NETFramework/v4.7.2/System.Net.dll",
"build/.NETFramework/v4.7.2/System.Net.xml",
"build/.NETFramework/v4.7.2/System.Numerics.dll",
"build/.NETFramework/v4.7.2/System.Numerics.xml",
"build/.NETFramework/v4.7.2/System.Printing.dll",
"build/.NETFramework/v4.7.2/System.Printing.xml",
"build/.NETFramework/v4.7.2/System.Reflection.Context.dll",
"build/.NETFramework/v4.7.2/System.Reflection.Context.xml",
"build/.NETFramework/v4.7.2/System.Runtime.Caching.dll",
"build/.NETFramework/v4.7.2/System.Runtime.Caching.xml",
"build/.NETFramework/v4.7.2/System.Runtime.DurableInstancing.dll",
"build/.NETFramework/v4.7.2/System.Runtime.DurableInstancing.xml",
"build/.NETFramework/v4.7.2/System.Runtime.Remoting.dll",
"build/.NETFramework/v4.7.2/System.Runtime.Remoting.xml",
"build/.NETFramework/v4.7.2/System.Runtime.Serialization.Formatters.Soap.dll",
"build/.NETFramework/v4.7.2/System.Runtime.Serialization.Formatters.Soap.xml",
"build/.NETFramework/v4.7.2/System.Runtime.Serialization.dll",
"build/.NETFramework/v4.7.2/System.Runtime.Serialization.xml",
"build/.NETFramework/v4.7.2/System.Security.dll",
"build/.NETFramework/v4.7.2/System.Security.xml",
"build/.NETFramework/v4.7.2/System.ServiceModel.Activation.dll",
"build/.NETFramework/v4.7.2/System.ServiceModel.Activation.xml",
"build/.NETFramework/v4.7.2/System.ServiceModel.Activities.dll",
"build/.NETFramework/v4.7.2/System.ServiceModel.Activities.xml",
"build/.NETFramework/v4.7.2/System.ServiceModel.Channels.dll",
"build/.NETFramework/v4.7.2/System.ServiceModel.Channels.xml",
"build/.NETFramework/v4.7.2/System.ServiceModel.Discovery.dll",
"build/.NETFramework/v4.7.2/System.ServiceModel.Discovery.xml",
"build/.NETFramework/v4.7.2/System.ServiceModel.Routing.dll",
"build/.NETFramework/v4.7.2/System.ServiceModel.Routing.xml",
"build/.NETFramework/v4.7.2/System.ServiceModel.Web.dll",
"build/.NETFramework/v4.7.2/System.ServiceModel.Web.xml",
"build/.NETFramework/v4.7.2/System.ServiceModel.dll",
"build/.NETFramework/v4.7.2/System.ServiceModel.xml",
"build/.NETFramework/v4.7.2/System.ServiceProcess.dll",
"build/.NETFramework/v4.7.2/System.ServiceProcess.xml",
"build/.NETFramework/v4.7.2/System.Speech.dll",
"build/.NETFramework/v4.7.2/System.Speech.xml",
"build/.NETFramework/v4.7.2/System.Threading.Tasks.Dataflow.xml",
"build/.NETFramework/v4.7.2/System.Transactions.dll",
"build/.NETFramework/v4.7.2/System.Transactions.xml",
"build/.NETFramework/v4.7.2/System.Web.Abstractions.dll",
"build/.NETFramework/v4.7.2/System.Web.ApplicationServices.dll",
"build/.NETFramework/v4.7.2/System.Web.ApplicationServices.xml",
"build/.NETFramework/v4.7.2/System.Web.DataVisualization.Design.dll",
"build/.NETFramework/v4.7.2/System.Web.DataVisualization.dll",
"build/.NETFramework/v4.7.2/System.Web.DataVisualization.xml",
"build/.NETFramework/v4.7.2/System.Web.DynamicData.Design.dll",
"build/.NETFramework/v4.7.2/System.Web.DynamicData.Design.xml",
"build/.NETFramework/v4.7.2/System.Web.DynamicData.dll",
"build/.NETFramework/v4.7.2/System.Web.DynamicData.xml",
"build/.NETFramework/v4.7.2/System.Web.Entity.Design.dll",
"build/.NETFramework/v4.7.2/System.Web.Entity.Design.xml",
"build/.NETFramework/v4.7.2/System.Web.Entity.dll",
"build/.NETFramework/v4.7.2/System.Web.Entity.xml",
"build/.NETFramework/v4.7.2/System.Web.Extensions.Design.dll",
"build/.NETFramework/v4.7.2/System.Web.Extensions.Design.xml",
"build/.NETFramework/v4.7.2/System.Web.Extensions.dll",
"build/.NETFramework/v4.7.2/System.Web.Extensions.xml",
"build/.NETFramework/v4.7.2/System.Web.Mobile.dll",
"build/.NETFramework/v4.7.2/System.Web.Mobile.xml",
"build/.NETFramework/v4.7.2/System.Web.RegularExpressions.dll",
"build/.NETFramework/v4.7.2/System.Web.RegularExpressions.xml",
"build/.NETFramework/v4.7.2/System.Web.Routing.dll",
"build/.NETFramework/v4.7.2/System.Web.Services.dll",
"build/.NETFramework/v4.7.2/System.Web.Services.xml",
"build/.NETFramework/v4.7.2/System.Web.dll",
"build/.NETFramework/v4.7.2/System.Web.xml",
"build/.NETFramework/v4.7.2/System.Windows.Controls.Ribbon.dll",
"build/.NETFramework/v4.7.2/System.Windows.Controls.Ribbon.xml",
"build/.NETFramework/v4.7.2/System.Windows.Forms.DataVisualization.Design.dll",
"build/.NETFramework/v4.7.2/System.Windows.Forms.DataVisualization.dll",
"build/.NETFramework/v4.7.2/System.Windows.Forms.DataVisualization.xml",
"build/.NETFramework/v4.7.2/System.Windows.Forms.dll",
"build/.NETFramework/v4.7.2/System.Windows.Forms.xml",
"build/.NETFramework/v4.7.2/System.Windows.Input.Manipulations.dll",
"build/.NETFramework/v4.7.2/System.Windows.Input.Manipulations.xml",
"build/.NETFramework/v4.7.2/System.Windows.Presentation.dll",
"build/.NETFramework/v4.7.2/System.Windows.Presentation.xml",
"build/.NETFramework/v4.7.2/System.Windows.dll",
"build/.NETFramework/v4.7.2/System.Workflow.Activities.dll",
"build/.NETFramework/v4.7.2/System.Workflow.Activities.xml",
"build/.NETFramework/v4.7.2/System.Workflow.ComponentModel.dll",
"build/.NETFramework/v4.7.2/System.Workflow.ComponentModel.xml",
"build/.NETFramework/v4.7.2/System.Workflow.Runtime.dll",
"build/.NETFramework/v4.7.2/System.Workflow.Runtime.xml",
"build/.NETFramework/v4.7.2/System.WorkflowServices.dll",
"build/.NETFramework/v4.7.2/System.WorkflowServices.xml",
"build/.NETFramework/v4.7.2/System.Xaml.dll",
"build/.NETFramework/v4.7.2/System.Xaml.xml",
"build/.NETFramework/v4.7.2/System.Xml.Linq.dll",
"build/.NETFramework/v4.7.2/System.Xml.Linq.xml",
"build/.NETFramework/v4.7.2/System.Xml.Serialization.dll",
"build/.NETFramework/v4.7.2/System.Xml.dll",
"build/.NETFramework/v4.7.2/System.Xml.xml",
"build/.NETFramework/v4.7.2/System.dll",
"build/.NETFramework/v4.7.2/System.xml",
"build/.NETFramework/v4.7.2/UIAutomationClient.dll",
"build/.NETFramework/v4.7.2/UIAutomationClient.xml",
"build/.NETFramework/v4.7.2/UIAutomationClientsideProviders.dll",
"build/.NETFramework/v4.7.2/UIAutomationClientsideProviders.xml",
"build/.NETFramework/v4.7.2/UIAutomationProvider.dll",
"build/.NETFramework/v4.7.2/UIAutomationProvider.xml",
"build/.NETFramework/v4.7.2/UIAutomationTypes.dll",
"build/.NETFramework/v4.7.2/UIAutomationTypes.xml",
"build/.NETFramework/v4.7.2/WindowsBase.dll",
"build/.NETFramework/v4.7.2/WindowsBase.xml",
"build/.NETFramework/v4.7.2/WindowsFormsIntegration.dll",
"build/.NETFramework/v4.7.2/WindowsFormsIntegration.xml",
"build/.NETFramework/v4.7.2/XamlBuildTask.dll",
"build/.NETFramework/v4.7.2/XamlBuildTask.xml",
"build/.NETFramework/v4.7.2/mscorlib.dll",
"build/.NETFramework/v4.7.2/mscorlib.xml",
"build/.NETFramework/v4.7.2/namespaces.xml",
"build/.NETFramework/v4.7.2/sysglobl.dll",
"build/.NETFramework/v4.7.2/sysglobl.xml",
"build/Microsoft.NETFramework.ReferenceAssemblies.net472.targets",
"microsoft.netframework.referenceassemblies.net472.1.0.2.nupkg.sha512",
"microsoft.netframework.referenceassemblies.net472.nuspec"
]
},
"Newtonsoft.Json/13.0.3": {
"sha512": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==",
"type": "package",
"path": "newtonsoft.json/13.0.3",
"files": [
".nupkg.metadata",
".signature.p7s",
"LICENSE.md",
"README.md",
"lib/net20/Newtonsoft.Json.dll",
"lib/net20/Newtonsoft.Json.xml",
"lib/net35/Newtonsoft.Json.dll",
"lib/net35/Newtonsoft.Json.xml",
"lib/net40/Newtonsoft.Json.dll",
"lib/net40/Newtonsoft.Json.xml",
"lib/net45/Newtonsoft.Json.dll",
"lib/net45/Newtonsoft.Json.xml",
"lib/net6.0/Newtonsoft.Json.dll",
"lib/net6.0/Newtonsoft.Json.xml",
"lib/netstandard1.0/Newtonsoft.Json.dll",
"lib/netstandard1.0/Newtonsoft.Json.xml",
"lib/netstandard1.3/Newtonsoft.Json.dll",
"lib/netstandard1.3/Newtonsoft.Json.xml",
"lib/netstandard2.0/Newtonsoft.Json.dll",
"lib/netstandard2.0/Newtonsoft.Json.xml",
"newtonsoft.json.13.0.3.nupkg.sha512",
"newtonsoft.json.nuspec",
"packageIcon.png"
]
},
"OxyPlot.Core/2.2.0": {
"sha512": "QhXNdXR5FPpro/VoLx3BOp6AhQo7YrbfmWEZ9cgY+pnYM7RYORZjnu+aDMA8ka9A1r8hLkX//NbCPZNUv+l8qA==",
"type": "package",
"path": "oxyplot.core/2.2.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"OxyPlot_128.png",
"README.md",
"lib/net462/OxyPlot.dll",
"lib/net462/OxyPlot.xml",
"lib/net6.0/OxyPlot.dll",
"lib/net6.0/OxyPlot.xml",
"lib/net8.0/OxyPlot.dll",
"lib/net8.0/OxyPlot.xml",
"lib/netstandard2.0/OxyPlot.dll",
"lib/netstandard2.0/OxyPlot.xml",
"oxyplot.core.2.2.0.nupkg.sha512",
"oxyplot.core.nuspec"
]
},
"OxyPlot.Wpf/2.2.0": {
"sha512": "69KzgsMWpJSZmeXZt07FwfV7B1D4CM1nl0MWMj4wjrCsb3USBMo32up1+fQIjxp5tHCPdGwX9VWhSxW8nsY7pQ==",
"type": "package",
"path": "oxyplot.wpf/2.2.0",
"hasTools": true,
"files": [
".nupkg.metadata",
".signature.p7s",
"OxyPlot_128.png",
"README.md",
"lib/net462/OxyPlot.Wpf.dll",
"lib/net462/OxyPlot.Wpf.xml",
"lib/net6.0-windows7.0/OxyPlot.Wpf.dll",
"lib/net6.0-windows7.0/OxyPlot.Wpf.xml",
"lib/net8.0-windows7.0/OxyPlot.Wpf.dll",
"lib/net8.0-windows7.0/OxyPlot.Wpf.xml",
"oxyplot.wpf.2.2.0.nupkg.sha512",
"oxyplot.wpf.nuspec",
"tools/VisualStudioToolsManifest.xml"
]
},
"OxyPlot.Wpf.Shared/2.2.0": {
"sha512": "JoOD/feTOlKFmgXqeTNrl4Ze0i0L6WizPapNw9pXwot+cnI0qhFgYv3tFjlSdu51hZw0EgmcgeRXMtm5bkueYA==",
"type": "package",
"path": "oxyplot.wpf.shared/2.2.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"OxyPlot_128.png",
"README.md",
"lib/net462/OxyPlot.Wpf.Shared.dll",
"lib/net462/OxyPlot.Wpf.Shared.xml",
"lib/net6.0-windows7.0/OxyPlot.Wpf.Shared.dll",
"lib/net6.0-windows7.0/OxyPlot.Wpf.Shared.xml",
"lib/net8.0-windows7.0/OxyPlot.Wpf.Shared.dll",
"lib/net8.0-windows7.0/OxyPlot.Wpf.Shared.xml",
"oxyplot.wpf.shared.2.2.0.nupkg.sha512",
"oxyplot.wpf.shared.nuspec"
]
}
},
"projectFileDependencyGroups": {
".NETFramework,Version=v4.7.2": [
"Newtonsoft.Json >= 13.0.3",
"OxyPlot.Wpf >= 2.2.0"
]
},
"packageFolders": {
"C:\\Users\\Administrator\\.nuget\\packages\\": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\YKC.csproj",
"projectName": "YKC",
"projectPath": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\YKC.csproj",
"packagesPath": "C:\\Users\\Administrator\\.nuget\\packages\\",
"outputPath": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\obj\\",
"projectStyle": "PackageReference",
"skipContentFileWrite": true,
"UsingMicrosoftNETSdk": false,
"configFilePaths": [
"C:\\Users\\Administrator\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net472"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net472": {
"framework": "net472",
"projectReferences": {}
}
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
}
},
"frameworks": {
"net472": {
"framework": "net472",
"dependencies": {
"Newtonsoft.Json": {
"target": "Package",
"version": "[13.0.3, )"
},
"OxyPlot.Wpf": {
"target": "Package",
"version": "[2.2.0, )"
}
}
}
},
"runtimes": {
"win": {
"#import": []
},
"win-arm64": {
"#import": []
},
"win-x64": {
"#import": []
},
"win-x86": {
"#import": []
}
}
}
}

View File

@@ -0,0 +1,15 @@
{
"version": 2,
"dgSpecHash": "isVL+vjG9Iw=",
"success": true,
"projectFilePath": "C:\\Users\\Administrator\\PycharmProjects\\PythonProject\\C#\\YKC\\YKC.csproj",
"expectedPackageFiles": [
"C:\\Users\\Administrator\\.nuget\\packages\\microsoft.netframework.referenceassemblies\\1.0.2\\microsoft.netframework.referenceassemblies.1.0.2.nupkg.sha512",
"C:\\Users\\Administrator\\.nuget\\packages\\microsoft.netframework.referenceassemblies.net472\\1.0.2\\microsoft.netframework.referenceassemblies.net472.1.0.2.nupkg.sha512",
"C:\\Users\\Administrator\\.nuget\\packages\\newtonsoft.json\\13.0.3\\newtonsoft.json.13.0.3.nupkg.sha512",
"C:\\Users\\Administrator\\.nuget\\packages\\oxyplot.core\\2.2.0\\oxyplot.core.2.2.0.nupkg.sha512",
"C:\\Users\\Administrator\\.nuget\\packages\\oxyplot.wpf\\2.2.0\\oxyplot.wpf.2.2.0.nupkg.sha512",
"C:\\Users\\Administrator\\.nuget\\packages\\oxyplot.wpf.shared\\2.2.0\\oxyplot.wpf.shared.2.2.0.nupkg.sha512"
],
"logs": []
}