Compare commits

..

791 Commits

Author SHA1 Message Date
Kimdiego2098
211a8e093e 更新版本号 2023-12-01 21:23:51 +08:00
Kimdiego2098
84010a51d6 更改方法参数原;现由,分割 2023-12-01 21:22:27 +08:00
Kimdiego2098
e9700ea19b 更新依赖包 2023-12-01 19:55:17 +08:00
Kimdiego2098
e81ec68072 添加解决方案项 2023-11-30 17:44:26 +08:00
Kimdiego2098
6096e97708 modbusDtu更名 2023-11-30 10:47:37 +08:00
Kimdiego2098
6f302b66b4 添加ModbusRtu格式的DTU驱动 2023-11-30 10:16:26 +08:00
Kimdiego2098
b6e41890f7 同步TouchSocket 2023-11-30 10:16:20 +08:00
Kimdiego2098
be5332a048 添加离线后恢复间隔时间选项,添加重试次数选项 2023-11-29 20:47:23 +08:00
Kimdiego2098
4d72aeb0cd 修复种子数据带转义字符串时错误解析的问题 2023-11-29 19:04:56 +08:00
Kimdiego2098
c7c3c35100 补充git漏掉的props文件 2023-11-29 13:37:52 +08:00
Kimdiego2098
2f0df3c552 修复aop拦截不生效的问题,更新版本号,整理props文件 2023-11-29 12:43:05 +08:00
Kimdiego2098
e6effcd921 更新依赖包 2023-11-28 22:06:43 +08:00
Kimdiego2098
cd462b9523 修正导出设备表的sheet名称 2023-11-28 09:30:47 +08:00
Kimdiego2098
7e2e17d38b 整理部分底层代码 2023-11-27 16:17:12 +08:00
Kimdiego2098
665d616a06 整理部分项目项 2023-11-27 11:11:15 +08:00
Kimdiego2098
ced90f5bb9 更新版本号 2023-11-24 14:48:53 +08:00
Kimdiego2098
ca0ddb6cb4 10功能码写入时 修改需判断的crc长度 2023-11-24 14:48:28 +08:00
Kimdiego2098
3d733813e1 修复 modbusTcpDtu 初始化 空指针错误 2023-11-24 09:44:47 +08:00
Kimdiego2098
45ddc0b154 OPCUA插件afterStop方法重写时需执行父类方法 2023-11-23 20:51:08 +08:00
Kimdiego2098
87294497f3 调整网关状态页面 2023-11-23 20:49:35 +08:00
Kimdiego2098
5f45f9c0d0 修改内存缓存mapster选项 2023-11-23 15:22:39 +08:00
Kimdiego2098
7f78c06793 添加kafka的SecurityProtocol与SaslMechanism参数说明 2023-11-22 21:29:08 +08:00
Kimdiego2098
8ea5b7eebc 修复上个提交导致的excel导入产生空指针错误 2023-11-22 20:52:58 +08:00
Kimdiego2098
e49cd511af excel导入导出设备表时,去除多余的字段 2023-11-22 16:09:41 +08:00
Kimdiego2098
15c88646df socktClient重载toString 2023-11-22 15:28:04 +08:00
Kimdiego2098
f47919543d 更新版本号 2023-11-22 14:06:52 +08:00
Kimdiego2098
a95291d9cd 代码文件编码更改 2023-11-22 14:02:41 +08:00
Kimdiego2098
033deb3d29 修复变量上传属性在编辑页面不显示的问题 2023-11-22 13:35:44 +08:00
Kimdiego2098
923994c1f4 修复变量上传属性在编辑页面不显示的问题 2023-11-22 13:30:42 +08:00
Kimdiego2098
3d45b839b4 去除不存在的菜单 2023-11-21 18:19:14 +08:00
Kimdiego2098
55d1efa212 调整循环延时时间限值 2023-11-21 16:27:11 +08:00
Kimdiego2098
21d794a0e5 调试mqtt依赖 2023-11-21 15:07:07 +08:00
Kimdiego2098
614022a78c 去除上传间隔1s限制 2023-11-21 11:46:33 +08:00
Kimdiego2098
c00688e23a 整理代码 2023-11-21 11:41:44 +08:00
Kimdiego2098
5c69917d19 更新依赖 2023-11-21 08:44:47 +08:00
Kimdiego2098
6a5eb75b6c 更新版本号 2023-11-20 23:05:12 +08:00
Kimdiego2098
727c55eaa2 去除treeview 2023-11-20 23:04:54 +08:00
Kimdiego2098
9b03173ec5 去除treeview显示 2023-11-20 22:53:34 +08:00
Kimdiego2098
ab95855d6d 更新版本号 2023-11-20 22:47:18 +08:00
Kimdiego2098
bb84594c6b mqttserver/client插件支持websocket通道,直接对接前端 2023-11-20 22:42:08 +08:00
Kimdiego2098
97392c76b1 mqttserver/client插件支持websocket通道,直接对接前端 2023-11-20 22:33:26 +08:00
Kimdiego2098
53aec2b306 modbusTcpServer最大连接数设为3w 2023-11-20 19:46:07 +08:00
Kimdiego2098
a0a381dc63 更新依赖 2023-11-20 17:35:42 +08:00
Kimdiego2098
4fa95edeec 添加admin-解决方案 2023-11-20 15:38:33 +08:00
Kimdiego2098
b944f1d70e 修复设备curd服务aop失效的问题 2023-11-19 23:30:11 +08:00
Kimdiego2098
0f1a5d0085 更新版本号 2023-11-19 22:32:53 +08:00
Kimdiego2098
e7e10222e7 modbus server 添加是否立即写入内存的选项 2023-11-19 22:32:13 +08:00
Kimdiego2098
87c4fda588 默认开启多标签 2023-11-19 22:31:47 +08:00
Kimdiego2098
0ff820de6f 添加历史报警插件 2023-11-19 22:19:05 +08:00
Kimdiego2098
0dcf55e6d9 修复4.0代码 s7协议未设置适配器导致初始化/读写失败的问题 2023-11-19 21:49:32 +08:00
Kimdiego2098
a69842c910 增加上传插件 缓存基类 2023-11-19 15:20:01 +08:00
Kimdiego2098
318f635e4d 获取插件继承属性时,去除不重写特性的属性 2023-11-19 14:15:58 +08:00
Kimdiego2098
abf0d72316 整理文件 2023-11-18 23:04:51 +08:00
Kimdiego2098
5cd89c8844 整理文件 2023-11-18 23:04:25 +08:00
Kimdiego2098
501c1af38c 整理文件 2023-11-18 23:03:24 +08:00
Kimdiego2098
8526e130d9 整理文件 2023-11-18 23:03:02 +08:00
Kimdiego2098
76fd08eade 整理文件 2023-11-18 23:02:28 +08:00
Kimdiego2098
bfe48ae9d2 整理文件 2023-11-18 23:01:56 +08:00
Kimdiego2098
8547cdba7c 去除不必要的文件 2023-11-18 22:52:26 +08:00
Kimdiego2098
00d0cd631d 去除不必要的文件 2023-11-18 22:50:03 +08:00
Kimdiego2098
04460d13cd 迁移4.0 2023-11-18 22:45:24 +08:00
Kimdiego2098
a17a15e5d7 迁移4.0 2023-11-18 22:43:36 +08:00
Kimdiego2098
bfe2465658 添加停止线程等待时间 2023-11-16 22:32:22 +08:00
Kimdiego2098
4568987785 s7握手失败后,手动关闭连接 2023-11-11 10:26:05 +08:00
Kimdiego2098
c0e5a1419d fix:修复线程阻塞检测触发重启时,后台变量列表不再刷新的问题! 2023-11-10 09:00:50 +08:00
Kimdiego2098
23ac7ab748 历史数据上传成功后,才上传缓存数据 2023-11-09 18:55:56 +08:00
Kimdiego2098
5622dc74a8 update 2023-11-08 16:19:46 +08:00
Kimdiego2098
528986f4f0 发布3.0.1版本 2023-11-03 11:32:13 +08:00
Kimdiego2098
e6b8ff3f91 update touchsocket 2023-11-03 11:27:12 +08:00
Kimdiego2098
3fc3c5296f update touchsocket 2023-11-03 11:19:26 +08:00
Kimdiego2098
f4f2a14a31 不存在插件时,报错内容优化 2023-11-01 14:51:08 +08:00
Kimdiego2098
fa3f464cb6 update webapiClient 2023-11-01 14:21:53 +08:00
Kimdiego2098
bed20538ae 调整Timeout属性为int数据类型 2023-10-31 23:49:46 +08:00
Kimdiego2098
3da461c6e6 更新发布版3.0.0.28 2023-10-31 17:47:07 +08:00
Kimdiego2098
9c73e8452a 更新OPCUAClient,订阅模式适配 分组 2023-10-31 10:55:50 +08:00
Kimdiego2098
750dab69d3 update 2023-10-31 00:24:00 +08:00
Kimdiego2098
702d0da47c tcpservice停止时执行shutdown方法,修复demo发布不显示页面的问题 2023-10-30 21:31:30 +08:00
Kimdiego2098
3a955b1e53 添加部分Pro内容 2023-10-29 19:39:38 +08:00
Kimdiego2098
d408bd93e8 添加部分Pro内容 2023-10-29 19:34:17 +08:00
Kimdiego2098
63fd9eb1de 更新文档 2023-10-28 22:06:58 +08:00
Kimdiego2098
4718ab6ddf 发布3.0.0.27版本;
优化设备线程启停逻辑
添加winform(blazor) demo
部分页面显示内容优化
2023-10-28 22:03:52 +08:00
Kimdiego2098
affd4b3a26 发布3.0.0.27版本;
优化设备线程启停逻辑
添加winform(blazor) demo
部分页面显示内容优化
2023-10-28 22:00:35 +08:00
Kimdiego2098
6a660dbcda 优化设备线程启停逻辑 2023-10-28 21:58:09 +08:00
Kimdiego2098
5ff3af8b48 添加部分Pro内容 2023-10-28 21:21:03 +08:00
Kimdiego2098
9d49070f93 添加winform(blazor) demo 2023-10-28 15:20:12 +08:00
Kimdiego2098
5b3994a1dd 调整pro类库 2023-10-28 10:54:26 +08:00
Diego2098
bb1e62c580 设备状态页面显示优化 2023-10-27 20:19:26 +08:00
Diego2098
29cc776908 状态显示:已退出自动更新 2023-10-27 20:18:57 +08:00
Kimdiego2098
d2ef60b2ec 报文显示限长500 2023-10-27 14:53:19 +08:00
Kimdiego2098
41ea496d41 tcpserver 报文输出 添加 ip端口 提示 2023-10-27 14:41:35 +08:00
Kimdiego2098
c69bb38929 update the tcpserver class and add log output for start and stop 2023-10-27 14:24:26 +08:00
Kimdiego2098
23b3f8494e 优化线程上下文转换 2023-10-26 19:16:24 +08:00
Kimdiego2098
0ff94eec1b 添加ConfigureAwait 2023-10-26 18:06:33 +08:00
Kimdiego2098
f67a638565 优化设备导出逻辑 2023-10-26 15:15:43 +08:00
Kimdiego2098
778cf71c61 优化设备导出逻辑 2023-10-26 15:10:26 +08:00
Kimdiego2098
e2da083b48 3.0.0.25 2023-10-26 13:21:40 +08:00
Kimdiego2098
dcc48c0d4b Merge branch 'master' of https://gitee.com/dotnetchina/ThingsGateway 2023-10-26 13:20:54 +08:00
Kimdiego2098
2446b4a591 3.0.0.25 2023-10-26 13:20:31 +08:00
Kimdiego2098
a973d633c8 update 2023-10-26 13:19:18 +08:00
Kimdiego2098
c3b11e6e0f s7添加错误返回码提示,组包处理 2023-10-26 13:05:06 +08:00
Kimdiego2098
44bec2d99e 增加硬件信息 相关json配置 2023-10-26 10:54:48 +08:00
Kimdiego2098
0d59d0a3f6 更新nuget依赖 2023-10-26 09:37:01 +08:00
Kimdiego2098
ddc8372b09 硬件信息页面添加刷新条件 2023-10-26 09:20:25 +08:00
Kimdiego2098
ea7325f4e0 更新文档 2023-10-25 00:53:27 +08:00
Kimdiego2098
6048f95415 update touchsocket 2023-10-25 00:53:17 +08:00
Kimdiego2098
5682705b8d <Version>3.0.0.24</Version> 2023-10-24 23:48:20 +08:00
Kimdiego2098
6c3b82607d 更改S7协议 设备属性,注意删除了DstTSAP,改为较直观的 机架号/槽位号 2023-10-24 23:47:35 +08:00
Kimdiego2098
486c9f4ebf 添加属性识别 16进制写入 2023-10-24 23:46:50 +08:00
Kimdiego2098
7c8adebf2d 添加nuget依赖包 2023-10-24 20:50:39 +08:00
Kimdiego2098
ce98bb0dc1 更新nuget包 2023-10-24 00:37:46 +08:00
Kimdiego2098
60b49a4296 调整解决方案文件夹 2023-10-24 00:13:03 +08:00
Kimdiego2098
5d0a2ffae0 暂时屏蔽mqttserver 遗留消息错误 2023-10-23 20:51:11 +08:00
Kimdiego2098
bbcf7c722a 调整编码 2023-10-23 20:47:00 +08:00
Kimdiego2098
66574eec6d 调整mqttlog 2023-10-23 20:46:17 +08:00
Kimdiego2098
305df3a42c 调整mqttlog 2023-10-23 20:43:58 +08:00
Kimdiego2098
323c6f4270 添加部分兼容方法 2023-10-22 02:42:16 +08:00
Kimdiego2098
c056b2b14c 添加部分兼容方法 2023-10-22 02:26:18 +08:00
Kimdiego2098
02ebb07fd8 update touchsocket 2023-10-22 02:26:04 +08:00
Kimdiego2098
59db0890c3 调整代码格式 2023-10-21 19:15:26 +08:00
Kimdiego2098
3ea0d9ed3a update touchsocket 2023-10-21 19:08:21 +08:00
Kimdiego2098
0371d11dd5 调整代码格式 2023-10-21 19:03:15 +08:00
Kimdiego2098
12f1ebaee9 调整代码格式 2023-10-21 19:02:58 +08:00
Kimdiego2098
5202cc22d1 3.0.0.23 2023-10-20 21:38:22 +08:00
Kimdiego2098
07a34bdcbf 优化SQLDB实时表模式,插入/更新 2023-10-20 21:38:07 +08:00
Kimdiego2098
27806da4be sqlsugar提示默认中文 2023-10-20 21:37:42 +08:00
Kimdiego2098
a15dd1a3ce update touchsocket 2023-10-20 21:03:29 +08:00
Kimdiego2098
6cc7451c7c 优化 ModbusServer 内存占用 2023-10-20 01:53:48 +08:00
Kimdiego2098
652aeee782 3.0.0.21 2023-10-20 01:19:18 +08:00
Kimdiego2098
8e1e887b8f 优化OPCUAServer,取消注册,提供多url写入 2023-10-20 01:19:05 +08:00
Kimdiego2098
6601a2de64 更新赞助名单 2023-10-19 21:15:35 +08:00
Kimdiego2098
75a42ffc32 更新文档 2023-10-19 20:36:28 +08:00
Kimdiego2098
8a80a52f5f 更新版本:3.0.0.20 2023-10-19 20:27:31 +08:00
Kimdiego2098
b373a434ba 优化modbusServer内存管理 2023-10-19 20:24:39 +08:00
Kimdiego2098
cd78fdafe6 update touchsocket 2023-10-19 20:23:43 +08:00
Kimdiego2098
7a1b4c6db7 update toucksocket 2023-10-18 21:51:49 +08:00
Kimdiego2098
f2c7664033 更新文档 2023-10-18 20:42:10 +08:00
Kimdiego2098
12b295f067 发布驱动包 2023-10-18 18:04:37 +08:00
Diego2098
3ee46da40f !12 【轻量级 PR】:修正心跳事件中的参数
Merge pull request !12 from youthalan/N/A
2023-10-18 06:59:17 +00:00
youthalan
beadaa7212 修正心跳事件中的参数
Signed-off-by: youthalan <youthalan@126.com>
2023-10-18 06:58:03 +00:00
Kimdiego2098
16ef09426f 更新版本号 2023-10-18 13:13:03 +08:00
Kimdiego2098
b8c1f1f5a9 初始化 采集/上传线程时 直接返回线程控制 2023-10-18 13:11:59 +08:00
Kimdiego2098
e027b5cbd6 更新OPCUAClient类库 2023-10-18 13:09:25 +08:00
Kimdiego2098
bf1bd73ad1 更新OPCUAClient类库 2023-10-18 12:45:26 +08:00
Kimdiego2098
86fc95119a 更新OPCUAClient类库 2023-10-18 12:44:58 +08:00
Kimdiego2098
b3a76ea17b 更新版本号与nuget发布 2023-10-18 12:39:42 +08:00
Kimdiego2098
bababd9d53 更新OPCUAClient类库 2023-10-18 12:38:20 +08:00
Diego2098
8cd5180531 !11 补充OPCClient类库事件的缺失文件
Merge pull request !11 from youthalan/N/A
2023-10-18 04:34:34 +00:00
youthalan
f1ccbade8c 补充OPCClient类库事件的缺失文件
Signed-off-by: youthalan <youthalan@126.com>
2023-10-18 04:32:39 +00:00
Diego2098
a66f4b0417 !10 添加连接或断开事件
Merge pull request !10 from youthalan/N/A
2023-10-18 04:20:22 +00:00
youthalan
ff495b2261 修改OPCUAClient类添加连接或断开事件,修改注入时不需要带参数
Signed-off-by: youthalan <youthalan@126.com>
2023-10-18 03:48:05 +00:00
Kimdiego2098
90e5824212 update 3.0.0.16 2023-10-18 00:38:36 +08:00
Kimdiego2098
3d64021062 opcuaClient浏览空间 添加是否显示子变量的选项 2023-10-18 00:36:44 +08:00
Kimdiego2098
fb8ed7428d 更改日志输出内容 2023-10-18 00:15:07 +08:00
Kimdiego2098
bdc273c10a update 3.0.0.15 2023-10-18 00:07:24 +08:00
Kimdiego2098
2d96cffdc7 增加不支持单文件发布的说明 2023-10-17 23:47:24 +08:00
Kimdiego2098
4356fccbcd update tdengineDB plugin 2023-10-17 23:43:48 +08:00
Kimdiego2098
a169fd4ce7 update touchsocket 2023-10-17 23:12:19 +08:00
Kimdiego2098
dcd418139e TD时序库插件,创建时间更改为主键 2023-10-17 23:08:09 +08:00
Kimdiego2098
0cac2062d3 update touchsocket 2023-10-17 23:06:21 +08:00
Kimdiego2098
854c5d4ade 更新nuget包 2023-10-17 21:00:50 +08:00
Kimdiego2098
0f96c6ec84 update SQLDB 2023-10-16 20:50:10 +08:00
Kimdiego2098
b219bd66c1 update touchsocket and other 2023-10-16 20:36:51 +08:00
Kimdiego2098
cb52f2c0b3 3.0.0.13 2023-10-16 17:44:09 +08:00
Kimdiego2098
d3273e03ef 增加关系库存储插件; 2023-10-16 17:40:17 +08:00
Kimdiego2098
afbfd963f3 增加时序库存储插件; 2023-10-16 17:40:13 +08:00
Kimdiego2098
2cd101c5f3 更新pro用户列表 2023-10-16 17:39:14 +08:00
Kimdiego2098
b10bc24dee 3.0.0.12 2023-10-16 08:47:39 +08:00
Kimdiego2098
51a23df861 opcuaclient添加是否加载服务端数据类型的选项 2023-10-16 08:46:46 +08:00
Kimdiego2098
03a0a9dad9 fix:tcpservice dispose err 2023-10-16 08:46:32 +08:00
Diego2098
362c0affbe !9 增加可选择安全订阅
Merge pull request !9 from youthalan/N/A
2023-10-16 00:33:19 +00:00
youthalan
d5b523479f 增加可选择安全订阅,以加快订阅速度
Signed-off-by: youthalan <youthalan@126.com>
2023-10-16 00:26:59 +00:00
Kimdiego2098
7719b8f6d7 更新3.0.0.11 2023-10-15 20:26:18 +08:00
Diego2098
3656c0d524 读取数据类型方法改为批量 2023-10-15 20:21:23 +08:00
Kimdiego2098
8b9e0dd6ea 同步Pro版本 2023-10-13 20:14:35 +08:00
Kimdiego2098
b3921b1037 update touchsocket 2023-10-13 19:16:12 +08:00
Kimdiego2098
d7d96e5dbf update nuget 2023-10-13 16:14:42 +08:00
Kimdiego2098
3934395b7b update 3.0.0.7 2023-10-13 11:54:27 +08:00
Kimdiego2098
04fbe9a529 添加三菱mc 3e帧二进制通讯协议文档 2023-10-13 11:51:51 +08:00
Kimdiego2098
badd6dd9a2 update demo 2023-10-12 18:52:44 +08:00
Kimdiego2098
059082456d 参数名称修改 2023-10-12 14:57:58 +08:00
Kimdiego2098
405b68e22f fix:mqtt保留消息未更新/更新错误 2023-10-12 14:57:36 +08:00
Kimdiego2098
c90bf6692c 3.0.0.6 2023-10-11 16:35:10 +08:00
Kimdiego2098
b5ea5d0cc5 update nuget 2023-10-11 16:28:18 +08:00
Kimdiego2098
243617a1e1 调整代码执行顺序 2023-10-11 16:19:34 +08:00
Kimdiego2098
9e703edd59 update ManageGateway 2023-10-11 10:59:33 +08:00
Kimdiego2098
d6c2cf2810 update ManageGateway 2023-10-11 10:41:09 +08:00
Kimdiego2098
ae7811acfa update 3.0.0.5 2023-10-10 21:09:34 +08:00
Kimdiego2098
e55731c099 fix:modbusRtu写入返回报文缓存逻辑修复 2023-10-10 21:08:42 +08:00
Kimdiego2098
9df5c74da4 update touchsocket 2023-10-10 20:03:40 +08:00
Kimdiego2098
8b75f9f785 update touchsocket 2023-10-10 20:02:15 +08:00
Kimdiego2098
bf12428cf4 fix:signalR razor dispose接口 2023-10-09 18:11:23 +08:00
Kimdiego2098
b551df978b update uaparser 2023-10-09 10:56:22 +08:00
Kimdiego2098
c91d85d2f0 添加MqttRpcDemo 2023-10-07 12:04:17 +08:00
Kimdiego2098
965237fa1f 添加清理日志任务配置参数 2023-10-06 18:28:06 +08:00
Kimdiego2098
24cd9afc06 update 3.0.0.2 2023-10-05 15:32:50 +08:00
Diego2098
602fdefebd update Directory.Build.props 2023-10-05 15:21:51 +08:00
Kimdiego2098
7e7818aa17 修复重启共享通道中的单个设备时,导致通道内其他设备变量异常 2023-10-05 00:34:12 +08:00
Kimdiego2098
27a6023a6a update opcuaclient 2023-10-04 17:12:47 +08:00
Kimdiego2098
3861879900 update opcuaclient 2023-10-04 16:59:15 +08:00
Kimdiego2098
807eeb8351 update nuget 2023-10-04 02:04:09 +08:00
Kimdiego2098
045fa53d58 update 3.0.0.1 2023-10-04 01:42:27 +08:00
Kimdiego2098
69d405ece7 实时报警列表线程同步 2023-10-04 01:27:03 +08:00
Kimdiego2098
d3dc4d0c5b modbusRtu 适配器 过滤干扰头部数据 2023-10-04 01:26:44 +08:00
Kimdiego2098
7beba1188e 更新种子数据 2023-10-04 01:24:34 +08:00
Kimdiego2098
9779ebe12c update windowsService bat 2023-10-03 19:11:42 +08:00
Kimdiego2098
f72cfaa093 update demo 2023-10-03 18:54:01 +08:00
Kimdiego2098
cf8ccafb4a rpc调用提示优化 2023-10-03 18:20:39 +08:00
Kimdiego2098
7fe281b0b8 fix:rpc 特殊方法分类错误 2023-10-03 17:05:49 +08:00
Kimdiego2098
5f70e9574f update demo 2023-10-02 22:37:50 +08:00
Kimdiego2098
4be51923ba update driverDebugPage 2023-10-02 18:34:55 +08:00
Kimdiego2098
a72c78f4a4 update opcuaClient 2023-10-02 18:30:58 +08:00
Diego2098
b4d32a6de1 add s7 wstring addressSign 2023-10-01 16:54:42 +08:00
Diego2098
8a6b2d5daa add s7 wstring addressSign 2023-10-01 16:49:07 +08:00
Diego2098
bebadeef14 更新demo 2023-10-01 13:33:25 +08:00
Kimdiego2098
3551be67f0 update demo csproj 2023-10-01 00:33:33 +08:00
Kimdiego2098
1103950b25 add EncodingMapper 2023-10-01 00:25:04 +08:00
Kimdiego2098
9d06e01cec 更新文档 2023-09-30 23:28:50 +08:00
Kimdiego2098
24be946b7e 默认不启用远程更新 2023-09-30 23:23:44 +08:00
Kimdiego2098
f56d2fc60f 更新readme 2023-09-30 23:09:48 +08:00
Kimdiego2098
9f8356f409 同步3.0.0版本代码 2023-09-30 23:05:53 +08:00
Kimdiego2098
8e6345d938 更新文档 2023-09-26 20:03:58 +08:00
Kimdiego2098
0eac78bd1c 2.1.0.15 2023-09-20 11:50:06 +08:00
Kimdiego2098
21db2502d0 2.1.0.15 2023-09-20 11:47:10 +08:00
Kimdiego2098
38c3492123 添加kafka/mq/iotsharp的间隔上传 2023-09-20 11:46:17 +08:00
Diego2098
6376bff476 fix:上传设备选择驱动时没有正确刷新 2023-09-18 00:10:02 +08:00
Kimdiego2098
38495a3ebc 2.1.0.14 2023-09-15 14:02:15 +08:00
Kimdiego2098
cf00897be2 ExpressionEvaluator改为多实例 2023-09-15 14:01:54 +08:00
Kimdiego2098
da640f24ec 2.1.0.13 2023-09-15 13:23:59 +08:00
Kimdiego2098
ed6a777c42 add dispose() 2023-09-15 13:23:39 +08:00
Kimdiego2098
81af4485d3 2.1.0.12 2023-09-15 13:20:29 +08:00
Kimdiego2098
94d8f0237d 更新多个依赖包版本 2023-09-15 13:19:04 +08:00
Kimdiego2098
c5e579dd38 修复因重复注册cancellationToken.Register导致的内存暴涨! 2023-09-15 13:17:36 +08:00
Kimdiego2098
7865e76ee2 CancellationToken代替CancellationTokenSource传入 2023-09-15 13:16:56 +08:00
Kimdiego2098
4d37212cc0 2.1.0.11 2023-09-11 09:35:24 +08:00
Kimdiego2098
9ca43f0bb4 feat:ManageGatewayWorker part 2023-09-11 09:31:26 +08:00
Kimdiego2098
fe8d262175 feat:ManageGatewayWorker part 2023-09-11 09:09:48 +08:00
Kimdiego2098
493d6e7165 feat:ManageGatewayWorker part 2023-09-11 09:09:03 +08:00
Kimdiego2098
17b630bcd8 TGAPPInfp更名APPInfo 2023-09-11 08:57:13 +08:00
Kimdiego2098
018c5ad3b4 Merge branch 'master' of https://gitee.com/dotnetchina/ThingsGateway 2023-09-11 08:54:01 +08:00
Kimdiego2098
a14b4da977 feat:ManageGatewayWorker part 2023-09-11 08:53:52 +08:00
Diego2098
01b4597cc7 !7 修复无法修改变量值问题
Merge pull request !7 from 如阳如木/master
2023-09-07 10:14:45 +00:00
如阳如木
0b083ccc1c 删除&& LastSetValue?.ToString() != data?.ToString()
Signed-off-by: 如阳如木 <970143933@qq.com>
2023-09-07 08:42:49 +00:00
Kimdiego2098
ca22cb0eae ManageGatewayConfig.json 2023-09-06 17:29:58 +08:00
Kimdiego2098
bcbb8e5f8c fix:_mqttServer null error 2023-09-06 17:27:36 +08:00
Kimdiego2098
bea286cdd4 2.1.0.10 2023-09-06 17:16:28 +08:00
Kimdiego2098
892d2ee8d2 从数据库取原属性 2023-09-06 17:14:24 +08:00
Kimdiego2098
7440608c14 更改变量 最近一次值 为 上次值 2023-09-06 16:44:58 +08:00
Kimdiego2098
6246f0295b 更改 变量最近一次值 为 上次值 2023-09-06 16:44:42 +08:00
Kimdiego2098
53c39d9b43 2.1.0.9 2023-09-06 16:30:50 +08:00
Kimdiego2098
9a50b60031 fix:串口断连/拔出/断电等情况,重新连接 2023-09-06 16:29:48 +08:00
Kimdiego2098
fd74527320 feat:ManageGatewayWorker part 2023-09-06 16:15:38 +08:00
Kimdiego2098
f91fb522ac feat:ManageGatewayWorker part 2023-09-06 16:10:29 +08:00
Kimdiego2098
7019c02b18 feat:ManageGatewayWorker part 2023-09-05 23:59:18 +08:00
Kimdiego2098
94f8422b9b feat:ManageGatewayWorker part 2023-09-05 23:37:02 +08:00
Kimdiego2098
b25c01567a feat:ManageGatewayWorker part 2023-09-05 23:33:02 +08:00
Kimdiego2098
b9329885de 2.1.0.8 2023-09-05 09:19:58 +08:00
Kimdiego2098
ac88c4cff9 fix:PeriodicTimer dispose 2023-09-05 09:17:26 +08:00
Kimdiego2098
9674f2d238 2.1.0.7 2023-09-05 09:06:39 +08:00
Kimdiego2098
38c9ecb6f1 fix:error!the stream dispose 2023-09-05 09:04:34 +08:00
Kimdiego2098
be9e9cdd5a Revert "fix:error!the stearm dispose"
This reverts commit a6d99fe227.
2023-09-05 09:03:49 +08:00
Kimdiego2098
afdaf07446 feat:mqttBroker part 2023-09-05 08:58:49 +08:00
Kimdiego2098
5caaf10225 fix:error!the stearm dispose 2023-09-05 08:57:42 +08:00
Diego2098
daffc3a776 feat:mqttBroker part 2023-09-04 22:34:31 +08:00
Diego2098
34c9748ce5 fix:uploadDeivce复制多个,ID重复问题 2023-09-04 22:11:50 +08:00
Diego2098
f17acbf4d1 刷新后选择行清空 2023-09-04 22:09:26 +08:00
Diego2098
229f56ce2f fix:采集设备线程初始化时更新活跃时间 2023-09-04 20:13:49 +08:00
Diego2098
0847bedc51 fix:特殊情况下无法获取程序集文件修改日期,所以去除 页脚-编译时间显示 2023-09-04 19:49:17 +08:00
Kimdiego2098
9e4546c305 fix:sqlsugar json支持类型改为bigstring 2023-09-04 17:09:38 +08:00
Kimdiego2098
97b01bf26a 更新文档 2023-09-04 15:03:03 +08:00
Kimdiego2098
e7011628d0 恢复Sqlite默认数据库 2023-09-02 19:17:32 +08:00
Kimdiego2098
044ffdecbd fix: page取消注入瞬时服务,改为App.GetService 2023-09-02 19:13:57 +08:00
Kimdiego2098
1a06a3543b feat:mqttBroker part 2023-09-02 13:55:21 +08:00
Kimdiego2098
5fedc0bf1e 更新文档 2023-08-31 09:17:59 +08:00
Kimdiego2098
7a881f867e 更新 变量管理-上传设备筛选功能 2023-08-31 08:58:30 +08:00
Kimdiego2098
dfe73a6cfb 2.1.0.6 2023-08-30 17:19:18 +08:00
Kimdiego2098
45d0fb27ad add windows service create/delete bat 2023-08-30 17:18:35 +08:00
Kimdiego2098
31890af61d update statusPage; 2023-08-30 14:12:50 +08:00
Kimdiego2098
a54b3ecc15 默认检测重连频率为10分钟 2023-08-29 17:56:59 +08:00
Kimdiego2098
c37cd1bd51 2.1.0.5 2023-08-29 17:44:28 +08:00
Kimdiego2098
0e3ee89cbf 添加报文日志入库选项 2023-08-29 17:42:56 +08:00
Kimdiego2098
a049176c14 添加 页脚 编译时间显示 2023-08-29 17:01:46 +08:00
Kimdiego2098
5ef2b0089e 调整导入excel错误提示 2023-08-29 16:45:54 +08:00
Kimdiego2098
1cc4899593 update opcdaclient null error 2023-08-29 15:24:29 +08:00
Kimdiego2098
26d1390be9 update GetBoolValue 2023-08-29 12:40:21 +08:00
Kimdiego2098
dc65584fb3 调整种子文件,增加Pro版本种子文件录入 2023-08-29 09:42:54 +08:00
Kimdiego2098
b3d5a708d5 更新2.1.0.4 2023-08-28 19:31:00 +08:00
Kimdiego2098
904a5d296b 修复串口基类 缓存包 失效错误;完善modbusrtu长度校验 2023-08-28 19:25:22 +08:00
Kimdiego2098
cc82e6a47a 更新touchsocket版本,更新2.1.0.3 2023-08-28 18:12:18 +08:00
Kimdiego2098
a9d02ec854 修复浏览大量节点空间时,BrowseNext方法参数releaseContinuationPoints改为false 2023-08-28 17:44:02 +08:00
Kimdiego2098
6b5a2d3767 修复调试界面-opcuaclient浏览节点展开逻辑错误 2023-08-28 10:51:35 +08:00
Kimdiego2098
10d9060b94 更新小版本2.1.0.2 2023-08-27 17:17:37 +08:00
Kimdiego2098
8441839c01 更新dlt645地址说明 2023-08-27 17:16:59 +08:00
Kimdiego2098
b669f5838f 添加日志查询 时间区间条件 2023-08-27 16:58:45 +08:00
Kimdiego2098
1a942f9ce1 2.1.0.1 2023-08-27 16:31:03 +08:00
Kimdiego2098
ae840758f7 dlt645添加数据标识校验 2023-08-27 16:30:32 +08:00
Kimdiego2098
082c08e5f9 更新dlt645,添加地址/控制码的校验规则 2023-08-27 16:15:51 +08:00
Kimdiego2098
74a43557ab 更新touchsocket 2023-08-27 15:59:57 +08:00
Kimdiego2098
184271789d 更新 Opc.Ua Version="1.4.372.56" 2023-08-27 14:33:24 +08:00
Kimdiego2098
fa61b0cad8 opcda/ua浏览地址空间 初始只加载首层节点 2023-08-27 14:14:47 +08:00
Kimdiego2098
7b197a90d1 opcuaclient浏览地址空间 初始只加载首层节点 2023-08-27 13:06:03 +08:00
Diego2098
62384af2f6 update MqttNetLogger 2023-08-26 21:38:14 +08:00
Diego2098
b466202a1a update MqttNetLogger 2023-08-26 20:40:23 +08:00
Diego2098
7ab38c18d8 添加在线/离线方法参数 2023-08-26 17:18:47 +08:00
Diego2098
39841ee43e 更新opcuaclient 2023-08-26 15:38:22 +08:00
Diego2098
e419800d98 更新opcuaclient,添加checkDomain属性,去除多余代码,更新SelectEndpoint方法 2023-08-26 15:33:03 +08:00
Kimdiego2098
63c99ab69a 更新文档 2023-08-25 19:49:02 +08:00
Kimdiego2098
e2a8fd2279 更新版本2.1.0 2023-08-25 19:45:28 +08:00
Kimdiego2098
bbde520471 更新解决方案 2023-08-25 19:38:47 +08:00
Kimdiego2098
45fb12f98e 更新DLT645文档 2023-08-25 19:33:33 +08:00
Kimdiego2098
4be3dcce50 添加DLT645_2007协议插件 2023-08-25 19:33:08 +08:00
Kimdiego2098
d12a41c769 调整Test位置 2023-08-25 19:32:27 +08:00
Kimdiego2098
ed9a58c9ed 调整非主从协议的状态判断策略;OPCUA去除主动连接 2023-08-25 17:23:00 +08:00
Kimdiego2098
4389cea5a1 crc校验优化 2023-08-22 17:01:10 +08:00
Kimdiego2098
d24854920b OPCUAClient添加是否使用SourceTime的选项 2023-08-22 16:15:34 +08:00
Kimdiego2098
9902443bee 更新文档 2023-08-22 12:21:45 +08:00
Kimdiego2098
8040b2ef16 2.0.9.3 2023-08-22 11:31:36 +08:00
Kimdiego2098
4533680b10 去除mqtt throw an _MqttConnectingFailedException_.报错信息 2023-08-22 11:26:22 +08:00
Kimdiego2098
3b28175135 更新批量写入方法,注意rpc入口参数变化,mqtt等RPC接口参数变化 2023-08-22 11:23:03 +08:00
Kimdiego2098
8e22812265 修正部分代码格式 2023-08-21 19:59:07 +08:00
Kimdiego2098
409bc91b9e 2.0.9.2 2023-08-19 12:08:49 +08:00
Kimdiego2098
61fe543a2a xml 2023-08-19 11:06:05 +08:00
Kimdiego2098
8a949a7e64 修复TcpClient重复释放导致锁异常 2023-08-19 11:05:29 +08:00
Kimdiego2098
b0dc9fb97a mas1.0.2默认中文 2023-08-18 18:36:30 +08:00
Kimdiego2098
83114d1002 更新masa1.0.2 2023-08-18 13:59:17 +08:00
Kimdiego2098
94a25a903f 2.0.9.1 2023-08-18 13:33:45 +08:00
Kimdiego2098
4f402f9e55 修改锁为EasyLock 2023-08-18 12:07:01 +08:00
Kimdiego2098
27bb2e3dcc 代码文件编码统一utf-8 2023-08-18 09:57:03 +08:00
Kimdiego2098
66cc52f6ec 更换DEMO Include为PackageReference 2023-08-17 15:30:35 +08:00
Kimdiego2098
ed1367b116 底层驱动添加netstandard输出 2023-08-17 15:24:07 +08:00
Kimdiego2098
5c055352e4 2.0.8 2023-08-17 10:58:48 +08:00
Kimdiego2098
8dcff5ada1 调整readme,方便copy账密 2023-08-17 10:28:47 +08:00
Kimdiego2098
4b8b23d7d5 优化变量地址输入分割方法;s7读写字符串添加默认编码 2023-08-17 09:50:10 +08:00
Kimdiego2098
e576f6aed3 优化s7读写字符串,更改特殊方法为读写共用 2023-08-16 17:20:20 +08:00
Kimdiego2098
97ab04da91 修复写入返回结果时的解析,0XFF为成功 2023-08-16 15:56:25 +08:00
Kimdiego2098
c6361bb36e 修复s7字符串打包读取 2023-08-16 15:47:37 +08:00
Kimdiego2098
b0b3dc225d 修复s7字符串读取 2023-08-16 15:35:15 +08:00
Kimdiego2098
9cbaba192a 主动释放锁 2023-08-16 14:56:47 +08:00
Kimdiego2098
f511598e13 OPCUA死区不再固定传入 2023-08-16 14:21:19 +08:00
Kimdiego2098
5ffff3b7aa fix: 优化JsonUtils中的获取type语句顺序 2023-08-16 08:59:18 +08:00
Kimdiego2098
24c4fa1c4f OPC系列增加导出excel/导入系统双选项 2023-08-15 17:38:40 +08:00
Kimdiego2098
7f312c1273 OPCUA采集设备写入字符串,不再需要传入双引号 2023-08-15 14:15:39 +08:00
Kimdiego2098
ef5c226c81 历史数据/报警 线程初始化时不再阻塞 2023-08-15 12:12:00 +08:00
Kimdiego2098
3f029cf799 更改ItemGroup Condition条件 2023-08-14 17:36:59 +08:00
Kimdiego2098
5bf64a8bec 传播token;
更新admin解决方案
2023-08-14 16:43:30 +08:00
Kimdiego2098
89f9c537f8 优化适配器解析代码 2023-08-14 14:21:00 +08:00
Kimdiego2098
e8d7f57818 2.0.6 2023-08-13 16:57:12 +08:00
Kimdiego2098
9b42fa78e7 OPCUACClient订阅初始化添加trycatch 2023-08-13 16:29:59 +08:00
Kimdiego2098
96d98e8f39 Merge branch 'master' of https://gitee.com/dotnetchina/ThingsGateway 2023-08-13 15:53:33 +08:00
Kimdiego2098
1f3a281e78 更新opcuaclient,初始读取server类型改为动态读取 2023-08-13 15:50:47 +08:00
Diego2098
dab4b66ee0 更新nuget包 2023-08-12 12:09:50 +08:00
Kimdiego2098
64dd192ddb 修复批量令牌强退失效 2023-08-11 15:15:50 +08:00
Kimdiego2098
b0a5c383d0 中间变量导入时添加标识 2023-08-11 14:15:22 +08:00
Kimdiego2098
4836cc99eb 2.0.5 2023-08-10 18:23:40 +08:00
Kimdiego2098
ba33873354 去除不需要的模板 2023-08-10 16:28:52 +08:00
Kimdiego2098
12c838cab0 修改详情模板 2023-08-10 11:23:18 +08:00
Kimdiego2098
a83a1c83a7 添加自定义详情模板 2023-08-10 10:35:19 +08:00
Kimdiego2098
2234f47170 底层修改:如果连接端口断开,停止等待返回 2023-08-10 10:35:01 +08:00
Kimdiego2098
4bae1b17fc 上传DTO添加 单位 参数 2023-08-10 09:09:09 +08:00
Kimdiego2098
6a7a0e0fa6 调整调试页面 2023-08-09 23:45:53 +08:00
Kimdiego2098
bff987c55f 添加单文件发布配置 2023-08-09 15:12:55 +08:00
Kimdiego2098
e467006913 去除页面多余引号 2023-08-09 13:45:27 +08:00
Kimdiego2098
1d646d4a6d 更新2.0.4 2023-08-09 13:00:10 +08:00
Kimdiego2098
70bd4936a1 更新opcua写入 2023-08-09 12:43:05 +08:00
Kimdiego2098
5ae7add6d2 更新opcua调试页面 2023-08-09 12:01:23 +08:00
Kimdiego2098
02b206ce7c 更新opcua 2023-08-09 11:47:04 +08:00
Kimdiego2098
2ea626a567 修复中间变量导入错误 2023-08-09 09:00:49 +08:00
Kimdiego2098
653909ec11 修正错误注释 2023-08-08 18:09:23 +08:00
Kimdiego2098
1d7c148eaf opcua添加初始化连接错误重试 2023-08-08 18:04:24 +08:00
Kimdiego2098
94a7e130ca 更新readme 2023-08-08 16:14:06 +08:00
Kimdiego2098
609abacdf0 优化大量设备线程重启的耗时 2023-08-08 14:02:00 +08:00
Kimdiego2098
033ff2e49a 2.0.3 2023-08-08 12:59:14 +08:00
Kimdiego2098
00a9bf0641 底层部分方法更改 2023-08-08 12:31:42 +08:00
Kimdiego2098
100f322456 报警/历史值查询时区转换 2023-08-08 09:05:15 +08:00
Kimdiego2098
2251e08d30 时间最小最大值时不再转换时区 2023-08-08 08:39:20 +08:00
Kimdiego2098
14e9beef53 Merge branch 'master' of https://gitee.com/dotnetchina/ThingsGateway 2023-08-08 08:28:37 +08:00
Kimdiego2098
c7cce23d54 默认不启用单用户登录 2023-08-08 08:28:27 +08:00
Diego2098
7becf32352 更新文档 2023-08-07 22:31:51 +08:00
Diego2098
741eda9f4e 去除DateTimeOffset类型 2023-08-07 22:30:38 +08:00
Kimdiego2098
473f51481c 更新文档 2023-08-07 17:38:53 +08:00
Kimdiego2098
684f9bd11b 更新readme 2023-08-07 17:34:32 +08:00
Kimdiego2098
b4b7f0c360 更新文件 2023-08-07 17:24:28 +08:00
Kimdiego2098
cf42d02628 更新文件 2023-08-07 17:16:53 +08:00
Kimdiego2098
cc9a9eab7b 更新文件 2023-08-07 16:56:45 +08:00
Kimdiego2098
784d6abc9b 更新文件 2023-08-07 16:33:36 +08:00
Kimdiego2098
0eafc07184 更新文件 2023-08-07 16:30:23 +08:00
Kimdiego2098
7e9499bd2e 更新文件 2023-08-07 15:46:30 +08:00
Kimdiego2098
d01a52aa95 更新文件 2023-08-07 15:36:49 +08:00
Kimdiego2098
6bcd492980 去除多余解决方案配置 2023-08-07 15:31:22 +08:00
Kimdiego2098
96b15da04b 添加发布脚本 2023-08-07 15:23:53 +08:00
Kimdiego2098
e0f1801693 更新readme 2023-08-07 15:18:42 +08:00
Kimdiego2098
d195ad85c5 更新readme 2023-08-07 15:13:21 +08:00
Kimdiego2098
773f7b6c1b 更新文档 2023-08-07 15:10:42 +08:00
Kimdiego2098
40f29fe399 2.0.0 2023-08-07 15:09:53 +08:00
Kimdiego2098
b19eb117c1 调试更新Blazor代码时不再跳转登录界面 2023-07-25 22:00:27 +08:00
Kimdiego2098
f930ba5eff 取消不必要的错误日志 2023-07-25 20:50:33 +08:00
Kimdiego2098
fbbda6c230 变量值更新错误提示; 2023-07-25 20:48:17 +08:00
Kimdiego2098
47db4968e5 优化大批量excel变量表导入效率 2023-07-25 18:26:48 +08:00
Kimdiego2098
1aff2e518c 删除不必要延时 2023-07-25 16:52:56 +08:00
Kimdiego2098
24134ca49e 发布1.7.6 2023-07-25 14:22:11 +08:00
Kimdiego2098
aadbe05a5e 优化导入excel效率 2023-07-25 14:21:17 +08:00
Kimdiego2098
18eddf4700 添加上传插件获取采集设备属性值的快捷方法 2023-07-23 13:44:37 +08:00
Kimdiego2098
0869ba7e70 Merge branch 'master' of https://gitee.com/dotnetchina/ThingsGateway 2023-07-23 09:59:11 +08:00
Kimdiego2098
cba5db1c53 线程完成时不再需要全局数据移除,有可能会导致偶发全局数据丢失 2023-07-23 09:58:43 +08:00
Kimdiego2098
0aa5430e23 线程完成时不要需要全局数据移除,有可能会导致偶发全局数据丢失 2023-07-23 09:57:03 +08:00
Kimdiego2098
88a91828cb 更新icon包版本 2023-07-23 00:03:46 +08:00
Kimdiego2098
27af89f5fe 更新icon包版本 2023-07-22 23:59:03 +08:00
Kimdiego2098
6f6d483bfe 修改插件日志为自定义日志 2023-07-22 23:34:09 +08:00
Kimdiego2098
915072c191 更新文档 2023-07-22 20:48:29 +08:00
Kimdiego2098
76077b92ae 发布1.7.4 2023-07-22 20:47:26 +08:00
Kimdiego2098
f0d1a527a5 修正错误名称 2023-07-22 20:32:34 +08:00
Kimdiego2098
fdb2a96d1c 添加上传插件最后错误原因 2023-07-22 20:10:45 +08:00
Kimdiego2098
849e3ac187 修复上传设备暂停按钮失效 2023-07-22 19:56:56 +08:00
Kimdiego2098
5c4cf21c59 OPCUAServer 数组维度不再写any;rpc写入添加延时 2023-07-22 17:02:44 +08:00
Kimdiego2098
40ee3e5d9b 更改假死检测间隔5分钟 2023-07-22 11:05:56 +08:00
Kimdiego2098
77a7cc034e 添加OPCUAServer线程间隔配置项,优化最后一次错误提示 2023-07-22 11:03:56 +08:00
Kimdiego2098
82b7881765 支持OPCUAServer数组类型,添加缓存文件存在判断 2023-07-21 21:28:39 +08:00
Kimdiego2098
3515775267 去除OPCUA写入数组维度校验 2023-07-20 17:37:49 +08:00
Kimdiego2098
10e12aa1c1 更新文档 2023-07-20 12:48:13 +08:00
Kimdiego2098
7fb4e62aa3 kafka尝试自动加载c库 2023-07-20 12:40:59 +08:00
Kimdiego2098
2605eaa614 修复中间变量Rpc写入 2023-07-20 10:55:37 +08:00
Kimdiego2098
8e97b4820d ModbusServer添加自定义循环间隔,修复中间变量写入 2023-07-20 10:55:17 +08:00
Kimdiego2098
89af4cdb68 更新文档 2023-07-19 18:02:31 +08:00
Kimdiego2098
6099c1a25a 更新文档 2023-07-19 15:43:28 +08:00
Kimdiego2098
fd23758aea 更改左侧菜单为手风琴效果 2023-07-19 15:00:40 +08:00
Kimdiego2098
8ad0b89db1 更新文档 2023-07-19 14:34:27 +08:00
Kimdiego2098
e7dffa3ff4 修改OPCUAClient心跳频率默认3s 2023-07-18 14:49:27 +08:00
Kimdiego2098
2772b5d2e2 更改OPCUAClient心跳频率为30000 2023-07-18 14:15:02 +08:00
Kimdiego2098
df6d9b5f70 更新1.7.3版本 2023-07-18 12:16:33 +08:00
Kimdiego2098
c9622d6d57 更新masa 稳定版以及其他包 2023-07-18 12:11:37 +08:00
Kimdiego2098
1f0b7c3c7e 修复添加订阅时,值死区过滤逻辑 2023-07-18 11:13:21 +08:00
Kimdiego2098
c12245037e 修复异步锁上下文切换导致OPCUA 心跳事件出错 2023-07-18 09:58:01 +08:00
Kimdiego2098
fe6d2a50a5 修复OPCUAClient调试界面重复输出订阅值 2023-07-18 08:51:27 +08:00
Kimdiego2098
7be84950f8 修改OPCUAClient的心跳频率配置项 2023-07-18 08:48:18 +08:00
Kimdiego2098
ba212da222 添加重启锁 2023-07-17 21:40:47 +08:00
2248356998 qq.com
122b833256 Merge branch 'master' of https://gitee.com/diego2098/thingsgateway-docs 2023-07-17 20:59:53 +08:00
2248356998 qq.com
7c73479041 更新opcua心跳状态日志 2023-07-17 20:59:32 +08:00
Diego2098
151f2e99ae 更新文档 2023-07-16 20:46:16 +08:00
Diego2098
da367e813f 更新授权名单 2023-07-16 20:31:56 +08:00
2248356998 qq.com
9143dfe336 更新文档 2023-07-16 18:27:22 +08:00
2248356998 qq.com
29914d6a72 更新文档 2023-07-16 18:12:55 +08:00
2248356998 qq.com
0dbef72a97 更新文档 2023-07-16 18:07:31 +08:00
2248356998 qq.com
3bb118bfe1 更新文档 2023-07-16 17:49:33 +08:00
2248356998 qq.com
85ce3be077 更新文档 2023-07-16 17:48:22 +08:00
2248356998 qq.com
064c2bf0a8 更新文档 2023-07-16 17:41:52 +08:00
2248356998 qq.com
c96d06ccc5 更新文档 2023-07-16 17:35:04 +08:00
2248356998 qq.com
a658dbb753 更新文档地址 2023-07-16 17:32:49 +08:00
2248356998 qq.com
bf5d5b629e 迁移文档 2023-07-16 17:28:26 +08:00
2248356998 qq.com
241d576519 冗余设备删除后会导致后台出错 2023-07-16 11:36:45 +08:00
2248356998 qq.com
7807e9bdd0 更新readme 2023-07-16 10:28:43 +08:00
2248356998 qq.com
fcbf15fed6 删除无用属性 2023-07-16 09:40:00 +08:00
2248356998 qq.com
cd90a11209 修复1.7.0版本修改导致的mqttrpc映射错误 2023-07-15 22:56:28 +08:00
2248356998 qq.com
ff65707ea2 增加 上传插件的列表分割大小,因为某些情况下传输字节太大会导致失败 2023-07-15 22:42:34 +08:00
2248356998 qq.com
b16026070c 导入提示的当前行显示未初始 2023-07-15 22:35:12 +08:00
2248356998 qq.com
1b5fbf86d8 格式化整理 2023-07-15 22:32:54 +08:00
2248356998 qq.com
5eb1be8101 插件报文截取前200字符,防止页面渲染过多 2023-07-15 20:04:14 +08:00
2248356998 qq.com
6a863cd26a kafka插件增加超时选项 2023-07-15 17:27:35 +08:00
2248356998 qq.com
87ebb7b6c7 历史服务修复变量在线状态显示错误 2023-07-15 15:46:39 +08:00
2248356998 qq.com
1233a74307 发布1.7.2版本 2023-07-15 11:10:29 +08:00
2248356998 qq.com
221890acfb 优化OPCUA错误提示 2023-07-14 17:33:11 +08:00
2248356998 qq.com
687c7e766e OPCUA在取消订阅时应该走读取方法 2023-07-14 17:22:19 +08:00
2248356998 qq.com
ba22c407d3 优化导入excel提示 2023-07-14 16:23:42 +08:00
2248356998 qq.com
a8b9ed56b5 优化导入excel提示 2023-07-14 16:23:35 +08:00
2248356998 qq.com
3004869e19 kafka 插件释放时取消事件注册 2023-07-14 14:35:40 +08:00
2248356998 qq.com
1145853fe1 更改属性说明 2023-07-14 12:23:46 +08:00
2248356998 qq.com
f1617a25b1 添加kafka插件null传播 2023-07-14 10:41:04 +08:00
2248356998 qq.com
932be558d9 opcda JValue转object 2023-07-14 10:14:05 +08:00
2248356998 qq.com
ee3a37d3b9 opcua读取值JValue转为object 2023-07-14 10:04:05 +08:00
2248356998 qq.com
5ac412a582 RabbitMQ,IotSharp添加离线缓存 2023-07-13 19:54:12 +08:00
2248356998 qq.com
1625290bc3 Variable Value数据类型改为object 2023-07-13 18:18:53 +08:00
2248356998 qq.com
1ec169ad49 中间变量页种子ID重复 2023-07-13 17:47:22 +08:00
2248356998 qq.com
53be552e44 复制设备没有及时刷新缓存 2023-07-13 17:38:45 +08:00
2248356998 qq.com
d3a75d46b9 发布1.7.1 2023-07-13 11:19:17 +08:00
2248356998 qq.com
256512c961 代码格式化 2023-07-13 11:18:36 +08:00
2248356998 qq.com
5c12ac5bcc OPCDA增加数组支持,增加写入动态类型支持 2023-07-13 11:16:31 +08:00
2248356998 qq.com
02a2bcb113 优化OPCUA数组类型转换 2023-07-13 09:02:36 +08:00
2248356998 qq.com
1f0a01c725 修复blazor界面null错误 2023-07-12 22:12:11 +08:00
2248356998 qq.com
6ea164ede1 更新ReadMe 2023-07-12 21:33:05 +08:00
2248356998 qq.com
65bae85ecc 删除重复文件 2023-07-12 21:30:41 +08:00
2248356998 qq.com
2fd7dcf4d0 更新nuget包 2023-07-12 21:21:50 +08:00
2248356998 qq.com
aa3bbbe038 V1.7.0发布
1、增加采集通道冗余
2、优化多个界面
3、导出导入功能优化
4、增加中间变量
5、OPCUAClient支持动态类型
6、离线缓存多处覆盖,包含上传插件/历史报警/时序库
7、增加通用调试界面,增加s7调试
8、其他优化
2023-07-12 21:16:38 +08:00
2248356998 qq.com
6cb09a6f95 修复AppDataTable清空MForm模型导致筛选列清空的问题 2023-07-10 13:18:14 +08:00
2248356998 qq.com
45868f05d3 修复写入s7协议 bit值 偏移错误(以byte数据块为准) 2023-07-08 17:01:44 +08:00
2248356998 qq.com
aac7401e20 修复读取s7协议 bit值 偏移错误(以byte数据块为准) 2023-07-08 11:44:57 +08:00
2248356998 qq.com
c2fc290edd 默认添加kafka插件 种子数据 2023-07-07 17:13:00 +08:00
2248356998 qq.com
330357fc36 修复布尔量解析时反转字节导致结果值不符的错误 2023-07-06 14:05:09 +08:00
2248356998 qq.com
f4a3d6a64e null传播 2023-07-03 14:13:00 +08:00
2248356998 qq.com
2e0963ec81 添加x86架构 2023-07-03 10:48:52 +08:00
2248356998 qq.com
897cb6e62a 补充插件实例内容 2023-07-02 19:50:09 +08:00
2248356998 qq.com
80868bd48e blazor组件初始化并行执行,导致sugar单例DB出现线程偶发错误,暂增加copyNew()解决 2023-06-29 16:42:19 +08:00
2248356998 qq.com
b3df78c56f blazor组件初始化并行执行,导致sugar单例DB出现线程偶发错误,暂增加copyNew()解决 2023-06-29 16:36:03 +08:00
2248356998 qq.com
783a4259e3 sqlsugar偶发线程故障,添加copyNew方法 2023-06-28 18:54:45 +08:00
2248356998 qq.com
fcf19b8dc8 登录跳转uri优化 2023-06-28 15:47:35 +08:00
2248356998 qq.com
1f9f89817d 更新开源说明 2023-06-28 10:48:33 +08:00
2248356998 qq.com
7b94da7d85 update openapiUser datatableUI 2023-06-26 19:51:02 +08:00
2248356998 qq.com
164406f6c2 css脚本结果不采用 System.Text.Json.JsonSerializer 2023-06-26 19:44:17 +08:00
2248356998 qq.com
90ef2adc6b OPCUAClient修复当变量为string类型时的数值过滤失败导致添加订阅失效 2023-06-26 19:43:00 +08:00
2248356998 qq.com
d65f10f88b 停用采集设备时,变量获取运行态出错 2023-06-26 16:43:48 +08:00
2248356998 qq.com
dca0ece9e0 登录后跳转原url 2023-06-26 14:46:24 +08:00
2248356998 qq.com
baabc155c8 cookie授权验证失败时返回登录界面 2023-06-26 14:36:41 +08:00
Diego2098
7eb94412d6 更新nuget类库 2023-06-25 18:59:09 +08:00
2248356998 qq.com
0fc8b24f85 添加报警事件None枚举 2023-06-20 13:10:58 +08:00
2248356998 qq.com
88f6ef5b96 修复cpu核心等于1时报错,修正登录错误提示 2023-06-20 09:09:08 +08:00
Diego2098
7442483419 修复modbusServer 初始化错误 2023-06-17 18:14:13 +08:00
2248356998 qq.com
9c61933c04 sugar添加取消令箭 2023-06-15 17:38:36 +08:00
2248356998 qq.com
2b36a99720 增加变量运行态 CollectVariableRuntime 所在设备属性 2023-06-15 16:50:08 +08:00
2248356998 qq.com
c2cfc42ba4 parallel.foreach无序体验不好,退回为foreach 2023-06-14 11:04:09 +08:00
2248356998 qq.com
4f32704e08 update 1.6.1 version 2023-06-13 22:39:47 +08:00
2248356998 qq.com
fccf43685f update nuget package 2023-06-13 22:39:25 +08:00
2248356998 qq.com
39135d81ad update driver messagesui 2023-06-13 22:26:19 +08:00
2248356998 qq.com
ff4b10681e 并行关闭线程 2023-06-12 14:41:08 +08:00
2248356998 qq.com
10b7908fc2 添加mqtt/kafka上传内容显示 2023-06-12 14:40:53 +08:00
2248356998 qq.com
31790da8c6 优化大量变量excel上传的验证过程 2023-06-12 11:35:27 +08:00
2248356998 qq.com
4621201c47 更新文档站点地址 2023-06-11 18:37:50 +08:00
2248356998 qq.com
692ac31dbf 删除docs 2023-06-11 18:22:15 +08:00
2248356998 qq.com
ed1d163d55 更新1.6.0版本 2023-06-11 17:58:57 +08:00
2248356998 qq.com
e931c9040c 缓存最大默认2000 2023-06-11 17:56:34 +08:00
2248356998 qq.com
f23cb48ea4 添加离线缓存大小限制配置 2023-06-11 17:55:03 +08:00
2248356998 qq.com
c3b2b6b07b 上传插件线程等待时间改为10ms 2023-06-11 17:47:16 +08:00
2248356998 qq.com
f89bf590ba 导入变量优化 2023-06-11 17:46:23 +08:00
2248356998 qq.com
fea17dc00b 添加mqttClient离线缓存 2023-06-11 17:45:46 +08:00
2248356998 qq.com
dbb1069920 添加kafka离线缓存 2023-06-11 17:45:27 +08:00
Diego2098
afc4ccfaa9 !6 部分配置会导致SqlServer自动建库失败
Merge pull request !6 from samisgod/master
2023-06-10 06:55:34 +00:00
samisgod
38d55a1c07 fix db init for SqlServer 2023-06-10 14:51:29 +08:00
2248356998 qq.com
5fca29f103 增加pwa 2023-06-09 17:53:41 +08:00
2248356998 qq.com
78f34b2ca4 修复停用验证码时登录失败显示null报错 2023-06-09 17:09:17 +08:00
2248356998 qq.com
8e8028e809 统一文件编码 2023-06-09 15:04:54 +08:00
2248356998 qq.com
8dc70687f8 update solution folder 2023-06-09 14:30:53 +08:00
2248356998 qq.com
fa22f9ee64 upload deviceStatusPage 2023-06-09 10:32:11 +08:00
2248356998 qq.com
b33c0d3f81 update deviceStatusPage 2023-06-09 09:49:03 +08:00
2248356998 qq.com
339009add4 remove dotNET China declaration 2023-06-09 09:10:30 +08:00
2248356998 qq.com
798c823c4b add dotNET China declaration 2023-06-09 09:02:17 +08:00
Diego2098
14ad86f2a3 重启线程时增加运行状态界面空传播防止报错 2023-06-08 21:35:07 +08:00
2248356998 qq.com
a3a714dc17 add upload plugin code description 2023-06-08 17:47:53 +08:00
2248356998 qq.com
e8d8b0d41d 迁移导入变量功能到驱动调试内 2023-06-08 15:11:58 +08:00
2248356998 qq.com
17daad8f89 plugin unload test,but failed 2023-06-08 10:52:39 +08:00
2248356998 qq.com
e178263b3b 更改默认api文档为Knife4j 2023-06-07 20:34:31 +08:00
2248356998 qq.com
4febbc261e 缓存键增加Type-TypeHandle句柄 2023-06-07 18:42:58 +08:00
2248356998 qq.com
ef3a6942fd 修改OPCUA证书路径,增加默认接收不收信任证书与其选项;
OPCDA整理;
2023-06-07 18:03:57 +08:00
2248356998 qq.com
f8ac2be62b 重启线程WebApi修改 2023-06-07 11:32:18 +08:00
2248356998 qq.com
25447c34e5 添加注释提示 2023-06-07 11:28:11 +08:00
2248356998 qq.com
37cdf8fd48 GC策略更改,大量变量实例手动清空以快速内存释放 2023-06-07 11:19:24 +08:00
2248356998 qq.com
ac8e7dc959 上传1.5.1 2023-06-06 19:37:04 +08:00
2248356998 qq.com
8293382840 Merge branch 'master' of https://gitee.com/diego2098/ThingsGateway 2023-06-05 08:33:50 +08:00
Diego2098
d85a3e7743 S7-TCP连接修复死锁 2023-06-02 22:20:21 +08:00
2248356998 qq.com
f3f5ffb5c8 增加KINGVIEW 配置 2023-05-29 01:32:37 +08:00
2248356998 qq.com
99e6702c62 超管用户名称不可更改 2023-05-26 00:14:05 +08:00
2248356998 qq.com
e143c25078 初步添加OPCUAClient调试界面;更新依赖 2023-05-25 23:41:11 +08:00
2248356998 qq.com
3fb67972be OPCUA安全策略添加全部选项 2023-05-25 00:59:21 +08:00
2248356998 qq.com
61c04d4e09 OPCUA安全策略添加全部选项 2023-05-25 00:58:47 +08:00
2248356998 qq.com
b22f728958 添加OPCDAClient调试页面 2023-05-25 00:11:00 +08:00
2248356998 qq.com
112be7e383 修改程序根目录为文件所在目录 2023-05-24 14:37:45 +08:00
2248356998 qq.com
6a7f83fed5 默认添加服务守护支持 2023-05-24 14:32:21 +08:00
2248356998 qq.com
4b9698a735 ModbusServer添加自定义数据类型;修复发布时静态文件路径错误 2023-05-24 12:31:20 +08:00
2248356998 qq.com
ec3d203a6d Add copyright notices 2023-05-23 23:54:28 +08:00
2248356998 qq.com
e77b8f5475 update TGTcpClient 2023-05-23 22:42:48 +08:00
2248356998 qq.com
da8bbd321f 添加Modbus系列插件调试页面;添加Modbus组包解析缓存超时时间; 2023-05-23 20:50:44 +08:00
2248356998 qq.com
98fd011def update HardwareInfoService 2023-05-23 12:04:04 +08:00
2248356998 qq.com
9dccbc5316 nuget更新 2023-05-23 11:59:28 +08:00
2248356998 qq.com
03fa26daf9 硬件界面添加限值防报错 2023-05-23 11:46:19 +08:00
2248356998 qq.com
fbc41e3895 初步添加插件驱动调试页面 2023-05-22 18:50:30 +08:00
2248356998 qq.com
f1a6d0c02c 初步添加插件驱动调试页面 2023-05-22 18:41:09 +08:00
2248356998 qq.com
67f6bb7155 Razor文件格式化清理 2023-05-22 18:40:50 +08:00
2248356998 qq.com
86282f596c 删除调试代码... 2023-05-22 17:09:21 +08:00
2248356998 qq.com
e0f24c795c 更改变量读取间隔限制最低为10ms 2023-05-22 15:17:22 +08:00
2248356998 qq.com
7d44ed860c 明确System.Management版本 2023-05-22 14:51:02 +08:00
2248356998 qq.com
091094a24c 硬件信息获取添加异常拦截 2023-05-22 14:33:30 +08:00
2248356998 qq.com
ba18ee518c update adapter 2023-05-22 12:42:31 +08:00
2248356998 qq.com
513a031691 代码清理 2023-05-21 22:39:33 +08:00
2248356998 qq.com
cc79de1106 优化opcua质量戳提示;添加数据转换基础方法;TCP等待返回时默认断开连接立即返回 2023-05-21 10:51:56 +08:00
2248356998 qq.com
bd90e8efb2 modbus 组包优化 2023-05-20 21:41:16 +08:00
2248356998 qq.com
4bd88ff11d 类型更换 2023-05-20 17:13:14 +08:00
2248356998 qq.com
d27ee61292 可指定OPCUA节点数据类型 2023-05-20 15:40:17 +08:00
2248356998 qq.com
0c20b3345f 更新文档 2023-05-20 13:52:23 +08:00
2248356998 qq.com
0f3c8c7193 添加自定义OPCUAServer数据类型 2023-05-20 12:34:06 +08:00
2248356998 qq.com
16761ec605 导入规则优化,主动抛出名称重复错误 2023-05-19 22:55:53 +08:00
2248356998 qq.com
1069440cda 更改插件时开启刷新设备属性 2023-05-19 22:26:37 +08:00
2248356998 qq.com
60f5702f17 判断OPCUAServer状态时增加tryCatch 2023-05-19 21:27:20 +08:00
2248356998 qq.com
ee70133e47 判断OPCUAServer状态时增加tryCatch 2023-05-19 21:24:56 +08:00
2248356998 qq.com
06a9fdeb2e 优化tcp拆包组包 2023-05-19 20:28:51 +08:00
2248356998 qq.com
f14bd62004 快捷方式null错误 2023-05-19 16:33:57 +08:00
2248356998 qq.com
67cbaf22b7 更新依赖包 2023-05-19 16:23:21 +08:00
2248356998 qq.com
60b166dba2 UDP通讯优化 2023-05-19 16:21:42 +08:00
2248356998 qq.com
66e1647ede 添加链路锁 2023-05-19 14:27:47 +08:00
2248356998 qq.com
a1a35c00a5 分包数量显示错误 2023-05-19 10:13:48 +08:00
2248356998 qq.com
b02e3361c4 Modbus读写锁更新 2023-05-19 10:05:54 +08:00
2248356998 qq.com
2b9ceaa25a Modbus读写锁更新 2023-05-19 09:53:56 +08:00
2248356998 qq.com
109b5a9755 删除sqlsugar旧版本代码,会导致sqlite不兼容 2023-05-19 09:15:32 +08:00
2248356998 qq.com
cc4df86c10 适配mysql;修复写入表达式转换;优化web页面写入体验 2023-05-18 23:38:40 +08:00
2248356998 qq.com
e93532c395 数据库初始化修复 2023-05-18 22:24:27 +08:00
2248356998 qq.com
6ff688326a 数据库连接自动释放 2023-05-18 21:06:06 +08:00
2248356998 qq.com
eda5d2872f 编辑页面添加 变量 允许远程写入选项 2023-05-18 21:03:44 +08:00
2248356998 qq.com
dc88394f5f 修复枚举类型在mysql中类型出错的问题 2023-05-18 20:58:14 +08:00
Diego2098
ec85c9a2c6 修改文件大小限制 2023-05-17 22:29:59 +08:00
Diego2098
1341638556 更新设备读写锁 2023-05-17 22:05:31 +08:00
2248356998 qq.com
4875dfee11 touchSocket修复UDP在windows下重置连接的问题;更新nuget 2023-05-17 16:54:33 +08:00
2248356998 qq.com
d834ba8bd4 代码格式清理 2023-05-17 16:49:25 +08:00
2248356998 qq.com
6191067771 修复CancellationTokenSource未释放导致Linux下偶发内存问题 2023-05-17 16:44:52 +08:00
2248356998 qq.com
6c3a571163 OPCUAServer节点数据类型增加在读取表达式转换后的判断 2023-05-16 09:05:58 +08:00
Diego2098
5efb07e10e ModbusClient添加帧前时间 2023-05-15 22:45:55 +08:00
2248356998 qq.com
b25ec18ce6 修复using作用域导致获取的服务可能被释放的问题 2023-05-15 19:21:35 +08:00
2248356998 qq.com
f3cd281241 nuget更新 2023-05-15 18:55:27 +08:00
2248356998 qq.com
58b93cbf4c mqttClient同步间隔上传的实体类 2023-05-12 18:22:06 +08:00
2248356998 qq.com
57fc0349ff update mqttClient 2023-05-12 16:40:55 +08:00
2248356998 qq.com
d0a2cea772 MqttClient增加间隔上传选项;更改线程循环间隔说明定义 2023-05-12 16:31:57 +08:00
Diego2098
58d5801fb5 update readme 2023-05-10 21:18:43 +08:00
Diego2098
e5f2e59798 增加api控制采集启停等方法 2023-05-10 21:17:34 +08:00
Diego2098
1166921057 提交kafka插件 2023-05-10 21:17:09 +08:00
2248356998 qq.com
aeb49576f2 update readme 2023-05-10 17:49:52 +08:00
2248356998 qq.com
7ef1fecef8 共享链路写入变量修复;Nuget更新 2023-05-10 16:33:59 +08:00
2248356998 qq.com
fd630373b5 更新文档 2023-05-09 17:51:55 +08:00
2248356998 qq.com
d365d8f170 更新文档 2023-05-09 17:47:22 +08:00
2248356998 qq.com
dfa5e1172f OPCUAClient/Server 修改证书有效期为100年 2023-05-09 14:37:18 +08:00
2248356998 qq.com
daf195898a 添加控制台logo 2023-05-08 18:10:07 +08:00
2248356998 qq.com
c61c0a39cf Code Cleanup 2023-05-08 18:03:32 +08:00
2248356998 qq.com
6137e6baa5 add GetSciptValue 2023-05-08 17:45:13 +08:00
2248356998 qq.com
fd16fd9ffe modbus rtu 粘包优化 2023-05-08 15:59:35 +08:00
2248356998 qq.com
2b8bd5f2cc modbus rtu报文粘包优化;共享链路切换延时;上传插件添加报文界面 2023-05-08 15:57:33 +08:00
2248356998 qq.com
d312c2e9e7 plc read with CancellationToken 2023-05-08 13:33:01 +08:00
2248356998 qq.com
578b0d2268 粘包优化 2023-05-08 10:55:16 +08:00
2248356998 qq.com
ffb41b0109 Rpc条件bug修复 2023-05-07 18:06:27 +08:00
2248356998 qq.com
c63fb5d796 OPCUAServer修复匿名登录 2023-05-07 18:06:09 +08:00
2248356998 qq.com
8caee732e8 更新文档 2023-05-07 16:56:41 +08:00
2248356998 qq.com
df5381adce 属性顺序调整 2023-05-05 09:46:11 +08:00
2248356998 qq.com
f34836b7fa 更新文档 2023-05-04 22:58:36 +08:00
2248356998 qq.com
44b459883a update CollectDeviceThread 2023-05-04 10:58:45 +08:00
2248356998 qq.com
14a8592ae3 更新文档 2023-05-02 22:11:55 +08:00
2248356998 qq.com
787d0dce4a 更新1.5.0 2023-05-02 22:06:09 +08:00
2248356998 qq.com
8be05ff93d 1、共享链路支持;
2、设备报文查看;
3、采集线程重构;
2023-05-02 21:58:11 +08:00
2248356998 qq.com
3014af565c mqtt重连锁优化 2023-04-27 11:19:32 +08:00
2248356998 qq.com
315252bdc4 添加常用转换 2023-04-24 17:54:00 +08:00
2248356998 qq.com
c36c3b4607 masa更新 2023-04-24 11:16:28 +08:00
2248356998 qq.com
7d5e939bab 更新包 2023-04-24 09:26:47 +08:00
Diego2098
f75c9d1eed 报警后台服务去除多余接口
Signed-off-by: Diego2098 <2248356998@qq.com>
2023-04-19 00:48:13 +00:00
2248356998 qq.com
38cb9855ea 添加docker文件 2023-04-17 17:39:12 +08:00
2248356998 qq.com
ed8b56d624 单文件发布 2023-04-17 15:13:40 +08:00
2248356998 qq.com
bca48b13ae update SqlSugarConfig 2023-04-17 11:58:41 +08:00
2248356998 qq.com
29426edb05 删除其他信息 2023-04-17 11:05:38 +08:00
2248356998 qq.com
33a2dc687f 验证码更新修复 2023-04-17 09:05:44 +08:00
2248356998 qq.com
e2398a21b2 1、字段null约束修改
2、ModbusServer绑定端口优化
2023-04-16 15:02:09 +08:00
2248356998 qq.com
f19530276e 更新readme 2023-04-16 13:34:29 +08:00
2248356998 qq.com
2b9b92a78c 更新1.4.0
注意Excel导入已不适用以前版本
1、去除动态更新插件
2、改用MiniExcel,支持动态导入,excel配置更简单
3、优化多处界面与后台逻辑,部分方法规范更名
4、修复外网地址获取错误等
2023-04-15 20:48:56 +08:00
2248356998 qq.com
99c55dac10 修复报警文本逻辑 2023-04-11 13:40:13 +08:00
2248356998 qq.com
25667e46f9 1,修复控制台报错(echarts.js问题,已删除)2,多处Dispose修正 2023-04-07 08:48:34 +08:00
2248356998 qq.com
2f4e8f2399 过滤 2023-04-06 14:46:24 +08:00
2248356998 qq.com
9169183769 历史数据库选择为sqlite时查询转换日期错误 2023-04-05 18:04:33 +08:00
2248356998 qq.com
c420f50831 启用开发环境web详细日志,调整App.Razor位置,添加网页ico 2023-04-05 17:14:26 +08:00
2248356998 qq.com
c6c9279ef4 update console/file datetime format 2023-04-05 15:49:00 +08:00
2248356998 qq.com
c125e2991d 更新readme 2023-04-04 18:41:56 +08:00
2248356998 qq.com
5348b19d6a 😀版本1.3.1 2023-04-04 17:55:52 +08:00
2248356998 qq.com
afd426daac 网关软件时间统一UTC 2023-04-04 17:55:15 +08:00
2248356998 qq.com
202c511cfa update iotSharpClient 2023-04-04 11:07:05 +08:00
2248356998 qq.com
651eb295a4 😀 更新1.3.0 2023-04-04 10:15:34 +08:00
2248356998 qq.com
d798aaed33 update iotSharpClient 2023-04-04 09:25:16 +08:00
2248356998 qq.com
63ef347cc9 update iotSharpClient 2023-04-04 09:23:22 +08:00
2248356998 qq.com
3139b2d5a0 IosSharpClient Rpc优化 2023-04-04 09:22:22 +08:00
2248356998 qq.com
2c80bbb244 IotSharp Rpc方法完善 2023-04-04 09:19:48 +08:00
2248356998 qq.com
af06755ada 添加写入多个变量的api方法 2023-04-04 09:18:58 +08:00
2248356998 qq.com
97d6dbaa6c update IotSharpClient 2023-04-03 20:16:38 +08:00
2248356998 qq.com
74cf82a1c7 更新种子 2023-04-03 19:34:12 +08:00
2248356998 qq.com
74634889ab 添加IotSharp插件 2023-04-03 19:30:52 +08:00
2248356998 qq.com
dbe30fcd77 分页显示令牌 2023-04-03 15:29:35 +08:00
2248356998 qq.com
24a7f3a320 后台启动时Furion RootServices NULL值 2023-04-03 15:19:59 +08:00
2248356998 qq.com
d3650f1145 修复不存在采集设备时,初始化报警/历史服务bug 2023-04-03 14:12:56 +08:00
2248356998 qq.com
4801db9050 弹窗消息在SignalR订阅方法中需InvokeAsync 2023-04-03 13:35:14 +08:00
2248356998 qq.com
6445281658 修复规范化结果包装2次导致登录返回结果不正确的问题 2023-04-03 12:45:19 +08:00
2248356998 qq.com
87719f5938 更新演示地址 2023-04-03 10:47:49 +08:00
2248356998 qq.com
5ba1ec433b readme 2023-04-02 18:12:18 +08:00
2248356998 qq.com
7c5b382458 readme 2023-04-02 18:08:56 +08:00
2248356998 qq.com
8960426128 更新readme 2023-04-02 18:05:54 +08:00
2248356998 qq.com
e1d47d5a92 更新readme 2023-04-02 18:05:28 +08:00
2248356998 qq.com
9407c272aa 更新包 2023-04-02 17:10:32 +08:00
2248356998 qq.com
bccbd7b400 添加注释 2023-04-02 16:59:46 +08:00
2248356998 qq.com
a24dc010ec 调整依赖,添加关系图 2023-04-01 17:28:35 +08:00
2248356998 qq.com
c5e5d50fb8 调整依赖,更新版本1.2.1 2023-04-01 15:45:02 +08:00
2248356998 qq.com
be1c520320 整理 2023-04-01 13:57:57 +08:00
2248356998 qq.com
3d18d0f893 😀 OPCUAServer支持历史查询数据 2023-03-31 18:32:55 +08:00
2248356998 qq.com
c3351a38a6 添加ThingsGateway.Foundation注释 2023-03-31 16:25:33 +08:00
2248356998 qq.com
0b86340a8d 硬件信息获取添加延时 2023-03-30 20:51:08 +08:00
2248356998 qq.com
829371b032 脚本显示优化 2023-03-30 19:51:38 +08:00
2248356998 qq.com
b342207bc7 更新文档 2023-03-30 19:39:35 +08:00
2248356998 qq.com
58f4fdced3 mqtt/mq上传 添加上传实体自定义脚本 2023-03-30 19:07:18 +08:00
2248356998 qq.com
253844cbcf 表达式整理 2023-03-30 16:23:03 +08:00
2248356998 qq.com
e2e2b9ffb4 更新版本 2023-03-30 14:12:39 +08:00
2248356998 qq.com
2568042f5f 更新文档 2023-03-30 14:11:16 +08:00
2248356998 qq.com
722edf4b9a readme 2023-03-30 14:06:03 +08:00
2248356998 qq.com
e406d364e4 更新readme,nuget 2023-03-30 14:05:00 +08:00
2248356998 qq.com
31c37f41b2 删除多余代码 2023-03-30 13:53:57 +08:00
2248356998 qq.com
6cd879bbc5 opcua 写入添加用户名日志 2023-03-30 13:32:32 +08:00
2248356998 qq.com
b7974050fe 去除ua数据类型验证 2023-03-30 13:20:26 +08:00
2248356998 qq.com
e9c9d0816e 更新readme 2023-03-30 13:13:44 +08:00
2248356998 qq.com
a437692e1a 类命名错误更改 2023-03-30 13:11:46 +08:00
2248356998 qq.com
2a14d2f3c8 发布文件添加 2023-03-30 13:11:43 +08:00
2248356998 qq.com
559e2d1889 添加OPCUAServer插件,修复个别bug 2023-03-30 13:10:31 +08:00
Diego2098
a1aa919f80 1、OPCUAClient修复客户端证书未自动生成
2、修复异步方法错误使用
2023-03-30 00:15:13 +08:00
2248356998 qq.com
cbccb27a5a 添加部分代码注释 2023-03-29 16:22:01 +08:00
2248356998 qq.com
bbad36d576 驱动支持主机名称 2023-03-29 11:07:21 +08:00
2248356998 qq.com
df6c9d55b5 修复初始化失败导致的一系列问题 2023-03-29 10:53:42 +08:00
2248356998 qq.com
36a1d9c364 上传插件间隔时间修正 2023-03-28 16:40:00 +08:00
2248356998 qq.com
1f3681d5ac 历史变量enable失效 2023-03-28 16:38:29 +08:00
2248356998 qq.com
0159f8e53f 历史报表时间格式改为yyyy-MM-dd HH:mm:ss ffffff 2023-03-28 16:31:53 +08:00
2248356998 qq.com
0432be64fc 采集设备状态判断错误 2023-03-28 16:21:30 +08:00
2248356998 qq.com
481e062961 采集设备状态判断错误 2023-03-28 15:55:01 +08:00
2248356998 qq.com
72b8abdeb6 修复历史保存值 频繁时出现值相同的问题 2023-03-28 15:14:30 +08:00
2248356998 qq.com
7ec3ee41d1 opc 活动时间修正 2023-03-28 14:15:14 +08:00
2248356998 qq.com
b765fa4769 添加写入采集时间的接口,而不是固定DateTime.Now 2023-03-28 14:03:11 +08:00
2248356998 qq.com
06685b162e 更新tcpclient 2023-03-28 13:52:33 +08:00
2248356998 qq.com
7bcad7c424 修复linux 分隔符错误问题 2023-03-28 11:48:16 +08:00
2248356998 qq.com
6e054b3cc6 更改插件文件不存在时的日志信息 2023-03-28 10:21:39 +08:00
2248356998 qq.com
e643f6b0f8 更改项目引用结构 2023-03-28 10:21:23 +08:00
2248356998 qq.com
e44c0f85c2 swagger文档 2023-03-27 19:01:04 +08:00
Iot边缘设备
ea66e968eb !5 添加部署文档
* 添加部署文档
2023-03-27 10:22:30 +00:00
2248356998 qq.com
f7e73d804e 属性/字段缓存获取只包含public 2023-03-27 14:49:09 +08:00
2248356998 qq.com
2ff4df56a1 更新masa-1.0.0-preview.10 2023-03-27 14:27:15 +08:00
2248356998 qq.com
346c45fe0c 优化变量上传属性页 2023-03-27 12:00:10 +08:00
2248356998 qq.com
f98b42a36e 采集设备活动时间应正常刷新 2023-03-27 10:51:54 +08:00
2248356998 qq.com
f77a0a266c 添加设备复制功能 2023-03-27 10:42:02 +08:00
2248356998 qq.com
0be672788f update code collation 2023-03-27 08:49:10 +08:00
2248356998 qq.com
e2e3d11d42 update code collation 2023-03-26 19:48:08 +08:00
2248356998 qq.com
bb127bb567 更新nuget包 2023-03-26 18:52:16 +08:00
2248356998 qq.com
8eb4f89db8 发行1.10版本 2023-03-26 18:10:12 +08:00
2248356998 qq.com
4a87ea3e70 实时数据界面优化 2023-03-26 17:39:05 +08:00
2248356998 qq.com
61115fce99 1、采用异步AutoResetEvent,修复多个设备下采集太慢的问题
2、弃用IntelligentConcurrentQueue(touchsocket集成类)
2023-03-26 17:32:29 +08:00
2248356998 qq.com
4f31120394 1、优化设备状态页,减少signalr刷新所需包大小
2、日志前置等级添加
2023-03-24 18:32:10 +08:00
2248356998 qq.com
b085cd65ce 修复导出表格时,null值报错 2023-03-23 22:09:53 +08:00
2248356998 qq.com
f76ec0721a 导入错误时,忽略大于10行的错误信息显示 2023-03-23 20:01:19 +08:00
2248356998 qq.com
ef3944fbbf 更新readme 2023-03-22 15:29:35 +08:00
2248356998 qq.com
b158fbc0d8 优化log等级、json配置注解 2023-03-22 15:26:42 +08:00
2248356998 qq.com
68f2d66e97 OPCUA写入测试 2023-03-22 14:06:32 +08:00
2248356998 qq.com
0cdd1735bd 设备运行状态页面改为扩展 2023-03-22 13:46:23 +08:00
2248356998 qq.com
70f5ead20b 更新文档 2023-03-22 10:44:44 +08:00
Diego2098
574e5616f8 rbmq插件优化 2023-03-21 23:38:00 +08:00
Diego2098
94fa810590 分包失败提示 2023-03-21 23:28:30 +08:00
Diego2098
37f69da701 设备组列宽调整,补充上传设备组 2023-03-21 23:10:59 +08:00
Diego2098
f2f8448ade 1、更新DataTypeEnum
2、OPCUA写入时需实际数据类型
2023-03-21 22:47:10 +08:00
Diego2098
b357d3fff2 更新Tests 2023-03-21 22:46:12 +08:00
2248356998 qq.com
b417194905 表格无数据时,修改默认宽度 2023-03-21 18:17:18 +08:00
2248356998 qq.com
d8741da20a S7nuget版本 2023-03-21 15:44:50 +08:00
2248356998 qq.com
c469be9a62 masa nuget版本更改 2023-03-21 14:31:36 +08:00
2248356998 qq.com
ff4eb339ef GC策略修改 2023-03-21 14:07:17 +08:00
2248356998 qq.com
78489383c0 更新文档 2023-03-21 14:03:49 +08:00
2248356998 qq.com
f67c1b415f 更新文档 2023-03-21 13:56:14 +08:00
2248356998 qq.com
570c16d921 修改s7属性注释 2023-03-21 13:51:05 +08:00
2248356998 qq.com
c8bc60568a 更新readme 2023-03-21 13:49:10 +08:00
2248356998 qq.com
73de3ba856 更新S7协议插件 2023-03-21 13:45:58 +08:00
2248356998 qq.com
6a69be8537 修改S7特殊方法 2023-03-21 13:41:32 +08:00
2248356998 qq.com
3ee381d505 修改s7 2023-03-21 13:38:43 +08:00
2248356998 qq.com
7ce744e2e4 添加西门子S7协议插件 2023-03-21 13:37:17 +08:00
2248356998 qq.com
b81d21c991 版本恢复 2023-03-21 11:45:18 +08:00
2248356998 qq.com
e9fe0992c6 更新nuget,暂缓链路复用功能 2023-03-20 13:34:59 +08:00
2248356998 qq.com
d5ef9018fa 默认不开启转储 2023-03-20 09:22:11 +08:00
2248356998 qq.com
c2737a7c51 更新opcda文档 2023-03-19 23:18:24 +08:00
2248356998 qq.com
4b6d8733c6 格式清理 2023-03-19 23:12:58 +08:00
2248356998 qq.com
f22a3e0955 修复null值报错 2023-03-19 23:02:08 +08:00
2248356998 qq.com
4b8144a2f7 添加设备组,变量按设备组别搜索 2023-03-19 22:56:02 +08:00
2248356998 qq.com
abac52e23c 更新readme,opcda核心库提示 2023-03-19 20:40:54 +08:00
2248356998 qq.com
9aa089313e 尝试修复中文在mac上乱码 2023-03-19 17:29:01 +08:00
2248356998 qq.com
b18f2c481a 修正中文在mac上乱码 2023-03-19 16:45:14 +08:00
2248356998 qq.com
ec83b9f77b 删除未知文件 2023-03-19 16:35:24 +08:00
2248356998 qq.com
fad5495e02 Merge branch 'master' of https://gitee.com/diego2098/ThingsGateway 2023-03-19 16:34:26 +08:00
2248356998 qq.com
70dec1171e 添加设备组功能 2023-03-19 16:34:15 +08:00
士心
0673a6fce3 !4 修复MacOS环境下,数据库报错的问题
* 修复macos环境下,数据库报错
2023-03-19 08:28:54 +00:00
2248356998 qq.com
8f525b1407 准备更新设备组/变量组功能 2023-03-19 11:49:06 +08:00
2248356998 qq.com
e83a991a4b 更新ReadMe 2023-03-18 17:56:18 +08:00
2248356998 qq.com
c000432a52 1、最后校验失败时应该提示日志
2、暂停时设备状态修正
2023-03-18 17:49:08 +08:00
2248356998 qq.com
c06d2d6927 更新文档 2023-03-18 16:47:29 +08:00
2248356998 qq.com
aa29653a8f ByteBlock实际长度 2023-03-18 16:45:39 +08:00
2248356998 qq.com
3f7e4ad486 修正串口描述类ToString 2023-03-18 16:32:15 +08:00
2248356998 qq.com
0eab546b2f 更新文档 2023-03-18 16:23:23 +08:00
2248356998 qq.com
8830d216d1 更新nuget 2023-03-18 16:16:27 +08:00
2248356998 qq.com
9fa1e3d449 更新readme 2023-03-18 16:15:14 +08:00
2248356998 qq.com
fe5dce7159 添加ModbusRtu种子数据 2023-03-18 16:14:37 +08:00
2248356998 qq.com
952fa31548 添加ModbusRtu插件 2023-03-18 16:14:25 +08:00
2248356998 qq.com
cc058ccc61 添加串口基础类 2023-03-18 16:14:08 +08:00
2248356998 qq.com
bc26ed9701 更新文档 2023-03-17 18:19:14 +08:00
2248356998 qq.com
26135fc1a0 更新文档 2023-03-17 17:52:04 +08:00
2248356998 qq.com
0bd14672ff 种子数据更改 2023-03-17 17:51:58 +08:00
2248356998 qq.com
7c7150cde8 采集检测间隔修改 2023-03-17 17:40:34 +08:00
2248356998 qq.com
b08282b0c1 上传插件添加循环间隔属性 2023-03-17 17:30:06 +08:00
2248356998 qq.com
3bf6e1befc 添加rbmq插件种子数据 2023-03-17 16:30:02 +08:00
2248356998 qq.com
52692371ac rbmq插件文件夹更名 2023-03-17 16:16:23 +08:00
2248356998 qq.com
159ac1d8bb 优化内存queue,修复mqtt插件可能超出字节限制的情况 2023-03-17 16:04:24 +08:00
2248356998 qq.com
7f1ffdbc79 添加rbmq插件 2023-03-17 16:03:44 +08:00
2248356998 qq.com
5fe64931dc 设备禁用时,变量绑定的设备对应选项会显示禁用(灰色) 2023-03-17 11:29:14 +08:00
2248356998 qq.com
ee67855b48 更新readme 2023-03-16 17:33:25 +08:00
2248356998 qq.com
594a97f43f 选择插件时自动更新属性 2023-03-16 17:33:17 +08:00
2248356998 qq.com
7fb435a8b4 更新赞助名单 2023-03-16 11:35:58 +08:00
2248356998 qq.com
01e74d6116 限流服务默认不开启 2023-03-16 09:47:20 +08:00
2248356998 qq.com
b321d75b39 增加简易定时看板 2023-03-15 16:01:54 +08:00
2248356998 qq.com
1e47a45723 更新历史配置说明 2023-03-15 09:11:33 +08:00
Diego2098
88c609e5ef !3 update handbook/docs/05、网关配置/5.5、其他配置.mdx.
Merge pull request !3 from zhubanghao/N/A
2023-03-14 13:39:16 +00:00
zhubanghao
775d1a424e update handbook/docs/05、网关配置/5.5、其他配置.mdx.
Signed-off-by: zhubanghao <58813184@qq.com>
2023-03-14 13:05:33 +00:00
109 changed files with 698 additions and 454 deletions

View File

@@ -0,0 +1,20 @@
<Project>
<PropertyGroup>
<ImplicitUsings>enable</ImplicitUsings>
<TargetFrameworks>net6.0;net8.0;</TargetFrameworks>
<Version>4.0.0.7</Version>
<LangVersion>latest</LangVersion>
<Authors>Diego</Authors>
<Product>ThingsGateway</Product>
<Copyright>© 2023-present Diego</Copyright>
<RepositoryUrl>https://gitee.com/diego2098/ThingsGateway</RepositoryUrl>
<SignAssembly>True</SignAssembly>
<DelaySign>False</DelaySign>
<SatelliteResourceLanguages>zh-Hans</SatelliteResourceLanguages>
<GenerateDocumentationFile>False</GenerateDocumentationFile>
</PropertyGroup>
</Project>

View File

@@ -82,6 +82,7 @@ EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "解决方案项", "解决方案项", "{97B23D8B-C6C0-4746-A21F-C7B49354B284}"
ProjectSection(SolutionItems) = preProject
..\.gitignore = ..\.gitignore
Directory.Build.props = Directory.Build.props
..\README.md = ..\README.md
EndProjectSection
EndProject

View File

@@ -1,17 +1,7 @@
<Project>
<Import Project="$(SolutionDir)\Directory.Build.props" />
<PropertyGroup>
<ImplicitUsings>enable</ImplicitUsings>
<TargetFrameworks>net6.0;net8.0;</TargetFrameworks>
<Version>4.0.0.4</Version>
<LangVersion>latest</LangVersion>
<ImplicitUsings>enable</ImplicitUsings>
<Authors>Diego</Authors>
<Product>ThingsGateway</Product>
<Copyright>© 2023-present Diego</Copyright>
<RepositoryUrl>https://gitee.com/diego2098/ThingsGateway</RepositoryUrl>
<SignAssembly>True</SignAssembly>
<DelaySign>False</DelaySign>
<SatelliteResourceLanguages>zh-Hans</SatelliteResourceLanguages>
</PropertyGroup>

View File

@@ -27,12 +27,12 @@ namespace ThingsGateway.Admin.ApiController;
[Route("Swagger")]
public class SwaggerController : IDynamicApiController, IScoped
{
private readonly ConfigService _configService;
private readonly IConfigService _configService;
/// <summary>
/// <inheritdoc cref="SwaggerController"/>
/// </summary>
/// <param name="sysConfigService"></param>
public SwaggerController(ConfigService sysConfigService)
public SwaggerController(IConfigService sysConfigService)
{
_configService = sysConfigService;
}

View File

@@ -79,7 +79,7 @@
Swagger登录授权服务
</summary>
</member>
<member name="M:ThingsGateway.Admin.ApiController.SwaggerController.#ctor(ThingsGateway.Admin.Application.ConfigService)">
<member name="M:ThingsGateway.Admin.ApiController.SwaggerController.#ctor(ThingsGateway.Admin.Application.IConfigService)">
<summary>
<inheritdoc cref="T:ThingsGateway.Admin.ApiController.SwaggerController"/>
</summary>

View File

@@ -96,7 +96,7 @@ public class OperDispatchProxy : AspectDispatchProxy, IDispatchProxy
/// <exception cref="NotImplementedException"></exception>
public override async Task InvokeAsync(MethodInfo method, object[] args)
{
var desc = method.GetActualCustomAttribute<OperDescAttribute>(Target);
var desc = method.GetActualCustomAttribute<OperDescAttribute>(Target, true);
if (desc == null)
{
var task = method.Invoke(Target, args) as Task;
@@ -134,7 +134,7 @@ public class OperDispatchProxy : AspectDispatchProxy, IDispatchProxy
/// <exception cref="NotImplementedException"></exception>
public override async Task<T> InvokeAsyncT<T>(MethodInfo method, object[] args)
{
var desc = method.GetActualCustomAttribute<OperDescAttribute>(Target);
var desc = method.GetActualCustomAttribute<OperDescAttribute>(Target, true);
if (desc == null)
{
var taskT = method.Invoke(Target, args) as Task<T>;

View File

@@ -83,7 +83,7 @@ public class OpenApiSessionService : DbRepository<OpenApiUser>, IOpenApiSessionS
var verificatInfos = await _verificatService.GetVerificatIdAsync(it.Id);
if (verificatInfos != null)
{
OpenApiSessionService.GetVerificatInfos(ref verificatInfos);//获取剩余时间
GetVerificatInfos(ref verificatInfos);//获取剩余时间
it.VerificatCount = verificatInfos.Count;//令牌数量
it.VerificatSignList = verificatInfos;//令牌列表
}

View File

@@ -73,7 +73,7 @@ public class SessionService : DbRepository<SysUser>, ISessionService
var verificatInfos = await _verificatService.GetVerificatIdAsync(it.Id);
if (verificatInfos != null)
{
SessionService.GetVerificatInfos(ref verificatInfos);//获取剩余时间
GetVerificatInfos(ref verificatInfos);//获取剩余时间
it.VerificatCount = verificatInfos.Count;//令牌数量
it.VerificatSignList = verificatInfos;//令牌列表

View File

@@ -10,6 +10,8 @@
//------------------------------------------------------------------------------
#endregion
using System.Text.RegularExpressions;
using ThingsGateway.Foundation.Extension.String;
namespace ThingsGateway.Admin.Application;
@@ -34,7 +36,8 @@ public class SeedDataUtil
if (!string.IsNullOrEmpty(dataString))//如果有内容
{
//字段没有数据的替换成null
dataString = dataString.Replace("\"\"", "null");
dataString = Regex.Replace(dataString, "\\\"[^\"]+?\\\": \\\"\\\"", match => match.Value.Replace("\"\"", "null"));
//dataString = dataString.Replace("\"\"", "null");
//将json字符串转为实体这里extjson可以正常转换为字符串
var seedDataRecord = Newtonsoft.Json.JsonConvert.DeserializeObject<SeedDataRecords<T>>(dataString);

View File

@@ -37,7 +37,7 @@ namespace ThingsGateway.Admin.Blazor
{
try
{
var data = await _serviceScope.ServiceProvider.GetService<UserCenterService>().GetLoginDefaultRazorAsync(UserManager.UserId);
var data = await _serviceScope.ServiceProvider.GetService<IUserCenterService>().GetLoginDefaultRazorAsync(UserManager.UserId);
var sameLevelMenus = await _serviceScope.ServiceProvider.GetService<IResourceService>().GetaMenuAndSpaListAsync();
if (NavigationManager.ToAbsoluteUri(NavigationManager.Uri).AbsolutePath == "/Login" || NavigationManager.ToAbsoluteUri(NavigationManager.Uri).AbsolutePath == "/")
NavigationManager.NavigateTo(sameLevelMenus.FirstOrDefault(a => a.Id == data)?.Component ?? "index", true);

View File

@@ -39,26 +39,26 @@ public partial class Config
}
private async Task AddCallAsync(ConfigAddInput input)
{
await _serviceScope.ServiceProvider.GetService<ConfigService>().AddAsync(input);
await _serviceScope.ServiceProvider.GetService<IConfigService>().AddAsync(input);
}
private async Task DeleteCallAsync(IEnumerable<SysConfig> sysConfigs)
{
await _serviceScope.ServiceProvider.GetService<ConfigService>().DeleteAsync(sysConfigs.Select(a => a.Id).ToArray());
await _serviceScope.ServiceProvider.GetService<IConfigService>().DeleteAsync(sysConfigs.Select(a => a.Id).ToArray());
}
private async Task EditCallAsync(ConfigEditInput sysConfigs)
{
await _serviceScope.ServiceProvider.GetService<ConfigService>().EditAsync(sysConfigs);
await _serviceScope.ServiceProvider.GetService<IConfigService>().EditAsync(sysConfigs);
}
private async Task OnSaveAsync()
{
await _serviceScope.ServiceProvider.GetService<ConfigService>().EditBatchAsync(_sysConfig);
await _serviceScope.ServiceProvider.GetService<IConfigService>().EditBatchAsync(_sysConfig);
await _mainLayout.StateHasChangedAsync();
await PopupService.EnqueueSnackbarAsync("成功", AlertTypes.Success);
}
private async Task<ISqlSugarPagedList<SysConfig>> QueryCallAsync(ConfigPageInput input)
{
return await _serviceScope.ServiceProvider.GetService<ConfigService>().PageAsync(input);
return await _serviceScope.ServiceProvider.GetService<IConfigService>().PageAsync(input);
}
}

View File

@@ -45,23 +45,23 @@ public partial class Menu
private async Task AddCallAsync(MenuAddInput input)
{
input.ParentId = _search.ParentId;
await _serviceScope.ServiceProvider.GetService<MenuService>().AddAsync(input);
await _serviceScope.ServiceProvider.GetService<IMenuService>().AddAsync(input);
await NavChangeAsync();
}
private async Task ButtonAddCallAsync(ButtonAddInput input)
{
input.ParentId = _buttonParentId;
await _serviceScope.ServiceProvider.GetService<ButtonService>().AddAsync(input);
await _serviceScope.ServiceProvider.GetService<IButtonService>().AddAsync(input);
}
private async Task ButtonDeleteCallAsync(IEnumerable<SysResource> input)
{
await _serviceScope.ServiceProvider.GetService<ButtonService>().DeleteAsync(input.Select(a => a.Id).ToArray());
await _serviceScope.ServiceProvider.GetService<IButtonService>().DeleteAsync(input.Select(a => a.Id).ToArray());
}
private async Task ButtonEditCallAsync(ButtonEditInput input)
{
await _serviceScope.ServiceProvider.GetService<ButtonService>().EditAsync(input);
await _serviceScope.ServiceProvider.GetService<IButtonService>().EditAsync(input);
}
@@ -85,7 +85,7 @@ public partial class Menu
private async Task<ISqlSugarPagedList<SysResource>> ButtonQueryCallAsync(ButtonPageInput input)
{
input.ParentId = _buttonParentId;
var data = await _serviceScope.ServiceProvider.GetService<ButtonService>().PageAsync(input);
var data = await _serviceScope.ServiceProvider.GetService<IButtonService>().PageAsync(input);
return data;
}
@@ -96,13 +96,13 @@ public partial class Menu
private async Task DeleteCallAsync(IEnumerable<SysResource> input)
{
await _serviceScope.ServiceProvider.GetService<MenuService>().DeleteAsync(input.Select(a => a.Id).ToArray());
await _serviceScope.ServiceProvider.GetService<IMenuService>().DeleteAsync(input.Select(a => a.Id).ToArray());
await NavChangeAsync();
}
private async Task EditCallAsync(MenuEditInput input)
{
await _serviceScope.ServiceProvider.GetService<MenuService>().EditAsync(input);
await _serviceScope.ServiceProvider.GetService<IMenuService>().EditAsync(input);
await NavChangeAsync();
}
@@ -123,7 +123,7 @@ public partial class Menu
}
private async Task<ISqlSugarPagedList<SysResource>> QueryCallAsync(MenuPageInput input)
{
var data = await _serviceScope.ServiceProvider.GetService<MenuService>().TreeAsync(input);
var data = await _serviceScope.ServiceProvider.GetService<IMenuService>().TreeAsync(input);
return data.ToPagedList(input);
}

View File

@@ -32,13 +32,13 @@ public partial class OpenApiSession
var confirm = await PopupService.OpenConfirmDialogAsync("警告", "确定 ?");
if (confirm)
{
await _serviceScope.ServiceProvider.GetService<OpenApiSessionService>().ExitSessionAsync(id);
await _serviceScope.ServiceProvider.GetService<IOpenApiSessionService>().ExitSessionAsync(id);
}
}
private async Task<ISqlSugarPagedList<OpenApiSessionOutput>> SessionQueryCallAsync(OpenApiSessionPageInput input)
{
return await _serviceScope.ServiceProvider.GetService<OpenApiSessionService>().PageAsync(input);
return await _serviceScope.ServiceProvider.GetService<IOpenApiSessionService>().PageAsync(input);
}
private async Task ShowVerificatListAsync(List<VerificatInfo> verificatInfos)
@@ -56,7 +56,7 @@ public partial class OpenApiSession
VerificatIds = verificats.Select(it => it.Id).ToList(),
Id = verificats.First().UserId
};
await _serviceScope.ServiceProvider.GetService<OpenApiSessionService>().ExitVerificatAsync(send);
await _serviceScope.ServiceProvider.GetService<IOpenApiSessionService>().ExitVerificatAsync(send);
_verificatInfos.RemoveWhere(it => send.VerificatIds.Contains(it.Id));
}

View File

@@ -32,17 +32,17 @@ public partial class OpenApiUserR
private async Task AddCallAsync(OpenApiUserAddInput input)
{
await _serviceScope.ServiceProvider.GetService<OpenApiUserService>().AddAsync(input);
await _serviceScope.ServiceProvider.GetService<IOpenApiUserService>().AddAsync(input);
}
private async Task DeleteCallAsync(IEnumerable<OpenApiUser> users)
{
await _serviceScope.ServiceProvider.GetService<OpenApiUserService>().DeleteAsync(users.Select(a => a.Id).ToArray());
await _serviceScope.ServiceProvider.GetService<IOpenApiUserService>().DeleteAsync(users.Select(a => a.Id).ToArray());
}
private async Task EditCallAsync(OpenApiUserEditInput users)
{
await _serviceScope.ServiceProvider.GetService<OpenApiUserService>().EditAsync(users);
await _serviceScope.ServiceProvider.GetService<IOpenApiUserService>().EditAsync(users);
}
private List<OpenApiPermissionTreeSelector> GetRouters()
@@ -58,7 +58,7 @@ public partial class OpenApiUserR
OpenApiUserGrantPermissionInput userGrantRoleInput = new();
userGrantRoleInput.Id = _choiceUserId;
userGrantRoleInput.PermissionList = _rolesChoice.Select(it => it.ApiRoute).ToList();
await _serviceScope.ServiceProvider.GetService<OpenApiUserService>().GrantRoleAsync(userGrantRoleInput);
await _serviceScope.ServiceProvider.GetService<IOpenApiUserService>().GrantRoleAsync(userGrantRoleInput);
_isShowRoles = false;
await _datatable?.QueryClickAsync();
}
@@ -70,7 +70,7 @@ public partial class OpenApiUserR
}
private async Task<ISqlSugarPagedList<OpenApiUser>> QueryCallAsync(OpenApiUserPageInput input)
{
return await _serviceScope.ServiceProvider.GetService<OpenApiUserService>().PageAsync(input);
return await _serviceScope.ServiceProvider.GetService<IOpenApiUserService>().PageAsync(input);
}
private async Task UserStatusChangeAsync(OpenApiUser context, bool enable)
@@ -78,9 +78,9 @@ public partial class OpenApiUserR
try
{
if (enable)
await _serviceScope.ServiceProvider.GetService<OpenApiUserService>().EnableUserAsync(context.Id);
await _serviceScope.ServiceProvider.GetService<IOpenApiUserService>().EnableUserAsync(context.Id);
else
await _serviceScope.ServiceProvider.GetService<OpenApiUserService>().DisableUserAsync(context.Id);
await _serviceScope.ServiceProvider.GetService<IOpenApiUserService>().DisableUserAsync(context.Id);
}
finally
{

View File

@@ -47,7 +47,7 @@ public partial class Oplog
var confirm = await PopupService.OpenConfirmDialogAsync("删除", "确定 ?");
if (confirm)
{
await _serviceScope.ServiceProvider.GetService<OperateLogService>().DeleteAsync(_categoryFilters.Select(it => it.Value).ToArray());
await _serviceScope.ServiceProvider.GetService<IOperateLogService>().DeleteAsync(_categoryFilters.Select(it => it.Value).ToArray());
await _datatable?.QueryClickAsync();
}
}
@@ -68,6 +68,6 @@ public partial class Oplog
input.Account = _search.Account;
input.Category = _search.Category;
input.ExeStatus = _search.ExeStatus;
return await _serviceScope.ServiceProvider.GetService<OperateLogService>().PageAsync(input);
return await _serviceScope.ServiceProvider.GetService<IOperateLogService>().PageAsync(input);
}
}

View File

@@ -41,17 +41,17 @@ public partial class Role
private async Task AddCallAsync(RoleAddInput input)
{
await _serviceScope.ServiceProvider.GetService<RoleService>().AddAsync(input);
await _serviceScope.ServiceProvider.GetService<IRoleService>().AddAsync(input);
}
private async Task DeleteCallAsync(IEnumerable<SysRole> sysRoles)
{
await _serviceScope.ServiceProvider.GetService<RoleService>().DeleteAsync(sysRoles.Select(a => a.Id).ToArray());
await _serviceScope.ServiceProvider.GetService<IRoleService>().DeleteAsync(sysRoles.Select(a => a.Id).ToArray());
await _mainLayout.StateHasChangedAsync();
}
private async Task EditCallAsync(RoleEditInput input)
{
await _serviceScope.ServiceProvider.GetService<RoleService>().EditAsync(input);
await _serviceScope.ServiceProvider.GetService<IRoleService>().EditAsync(input);
await _mainLayout.StateHasChangedAsync();
}
private async Task OnRoleHasResuorcesSaveAsync(ModalActionEventArgs args)
@@ -62,7 +62,7 @@ public partial class Role
var data = new List<SysResource>();
userGrantRoleInput.Id = _choiceRoleId;
userGrantRoleInput.GrantInfoList = _roleHasResuorces;
await _serviceScope.ServiceProvider.GetService<RoleService>().GrantResourceAsync(userGrantRoleInput);
await _serviceScope.ServiceProvider.GetService<IRoleService>().GrantResourceAsync(userGrantRoleInput);
_isShowResuorces = false;
}
catch (Exception ex)
@@ -79,7 +79,7 @@ public partial class Role
GrantUserInput userGrantRoleInput = new();
userGrantRoleInput.Id = _choiceRoleId;
userGrantRoleInput.GrantInfoList = _usersChoice.Select(it => it.Id).ToList();
await _serviceScope.ServiceProvider.GetService<RoleService>().GrantUserAsync(userGrantRoleInput);
await _serviceScope.ServiceProvider.GetService<IRoleService>().GrantUserAsync(userGrantRoleInput);
_isShowUsers = false;
}
catch (Exception ex)
@@ -92,19 +92,19 @@ public partial class Role
private async Task<ISqlSugarPagedList<SysRole>> QueryCallAsync(RolePageInput input)
{
return await _serviceScope.ServiceProvider.GetService<RoleService>().PageAsync(input);
return await _serviceScope.ServiceProvider.GetService<IRoleService>().PageAsync(input);
}
private async Task ResuorceInitAsync()
{
_resTreeSelectors = (await _serviceScope.ServiceProvider.GetService<ResourceService>().GetRoleGrantResourceMenusAsync());
_roleHasResuorces = (await _serviceScope.ServiceProvider.GetService<RoleService>().OwnResourceAsync(_choiceRoleId))?.GrantInfoList;
_roleHasResuorces = (await _serviceScope.ServiceProvider.GetService<IRoleService>().OwnResourceAsync(_choiceRoleId))?.GrantInfoList;
}
private async Task<List<UserSelectorOutput>> UserInitAsync()
{
_allUsers = await _serviceScope.ServiceProvider.GetService<SysUserService>().UserSelectorAsync(_searchKey);
var data = await _serviceScope.ServiceProvider.GetService<RoleService>().OwnUserAsync(_choiceRoleId);
_allUsers = await _serviceScope.ServiceProvider.GetService<ISysUserService>().UserSelectorAsync(_searchKey);
var data = await _serviceScope.ServiceProvider.GetService<IRoleService>().OwnUserAsync(_choiceRoleId);
_usersChoice = _allUsers.Where(a => data.Contains(a.Id)).ToList();
return _allUsers;
}

View File

@@ -37,14 +37,14 @@ public partial class Session
var confirm = await PopupService.OpenConfirmDialogAsync("警告", "确定 ?");
if (confirm)
{
await _serviceScope.ServiceProvider.GetService<SessionService>().ExitSessionAsync(id);
await _serviceScope.ServiceProvider.GetService<ISessionService>().ExitSessionAsync(id);
}
}
private async Task<ISqlSugarPagedList<SessionOutput>> SessionQueryCallAsync(SessionPageInput input)
{
return await _serviceScope.ServiceProvider.GetService<SessionService>().PageAsync(input);
return await _serviceScope.ServiceProvider.GetService<ISessionService>().PageAsync(input);
}
private async Task ShowVerificatListAsync(List<VerificatInfo> verificatInfos)
@@ -62,7 +62,7 @@ public partial class Session
VerificatIds = verificats.Select(it => it.Id).ToList(),
Id = verificats.First().UserId
};
await _serviceScope.ServiceProvider.GetService<SessionService>().ExitVerificatAsync(send);
await _serviceScope.ServiceProvider.GetService<ISessionService>().ExitVerificatAsync(send);
_verificatInfos.RemoveWhere(it => send.VerificatIds.Contains(it.Id));
}

View File

@@ -28,23 +28,23 @@ public partial class Spa
private async Task AddCallAsync(SpaAddInput input)
{
await _serviceScope.ServiceProvider.GetService<SpaService>().AddAsync(input);
await _serviceScope.ServiceProvider.GetService<ISpaService>().AddAsync(input);
await _mainLayout.StateHasChangedAsync();
}
private async Task DeleteCallAsync(IEnumerable<SysResource> input)
{
await _serviceScope.ServiceProvider.GetService<SpaService>().DeleteAsync(input.Select(a => a.Id).ToArray());
await _serviceScope.ServiceProvider.GetService<ISpaService>().DeleteAsync(input.Select(a => a.Id).ToArray());
await _mainLayout.StateHasChangedAsync();
}
private async Task EditCallAsync(SpaEditInput input)
{
await _serviceScope.ServiceProvider.GetService<SpaService>().EditAsync(input);
await _serviceScope.ServiceProvider.GetService<ISpaService>().EditAsync(input);
await _mainLayout.StateHasChangedAsync();
}
private async Task<ISqlSugarPagedList<SysResource>> QueryCallAsync(SpaPageInput input)
{
return await _serviceScope.ServiceProvider.GetService<SpaService>().PageAsync(input);
return await _serviceScope.ServiceProvider.GetService<ISpaService>().PageAsync(input);
}
}

View File

@@ -35,17 +35,17 @@ public partial class User
private async Task AddCallAsync(UserAddInput input)
{
await _serviceScope.ServiceProvider.GetService<SysUserService>().AddAsync(input);
await _serviceScope.ServiceProvider.GetService<ISysUserService>().AddAsync(input);
}
private async Task DeleteCallAsync(IEnumerable<SysUser> users)
{
await _serviceScope.ServiceProvider.GetService<SysUserService>().DeleteAsync(users.Select(a => a.Id).ToArray());
await _serviceScope.ServiceProvider.GetService<ISysUserService>().DeleteAsync(users.Select(a => a.Id).ToArray());
await _mainLayout.StateHasChangedAsync();
}
private async Task EditCallAsync(UserEditInput users)
{
await _serviceScope.ServiceProvider.GetService<SysUserService>().EditAsync(users);
await _serviceScope.ServiceProvider.GetService<ISysUserService>().EditAsync(users);
await _mainLayout.StateHasChangedAsync();
}
@@ -56,7 +56,7 @@ public partial class User
UserGrantRoleInput userGrantRoleInput = new();
userGrantRoleInput.Id = _choiceUserId;
userGrantRoleInput.RoleIdList = _rolesChoice.Select(it => it.Id).ToList();
await _serviceScope.ServiceProvider.GetService<SysUserService>().GrantRoleAsync(userGrantRoleInput);
await _serviceScope.ServiceProvider.GetService<ISysUserService>().GrantRoleAsync(userGrantRoleInput);
_isShowRoles = false;
}
catch (Exception ex)
@@ -68,20 +68,20 @@ public partial class User
}
private async Task<ISqlSugarPagedList<SysUser>> QueryCallAsync(UserPageInput input)
{
return await _serviceScope.ServiceProvider.GetService<SysUserService>().PageAsync(input);
return await _serviceScope.ServiceProvider.GetService<ISysUserService>().PageAsync(input);
}
private async Task ResetPasswordAsync(SysUser sysUser)
{
await _serviceScope.ServiceProvider.GetService<SysUserService>().ResetPasswordAsync(sysUser.Id);
await _serviceScope.ServiceProvider.GetService<ISysUserService>().ResetPasswordAsync(sysUser.Id);
await PopupService.EnqueueSnackbarAsync(new("成功", AlertTypes.Success));
await _mainLayout.StateHasChangedAsync();
}
private async Task RoleInitAsync()
{
_allRoles = await _serviceScope.ServiceProvider.GetService<RoleService>().RoleSelectorAsync();
var data = await _serviceScope.ServiceProvider.GetService<RoleService>().GetRoleIdListByUserIdAsync(_choiceUserId);
_allRoles = await _serviceScope.ServiceProvider.GetService<IRoleService>().RoleSelectorAsync();
var data = await _serviceScope.ServiceProvider.GetService<IRoleService>().GetRoleIdListByUserIdAsync(_choiceUserId);
_rolesChoice = _allRoles.Where(a => data.Contains(a.Id)).ToList();
}
private async Task UserStatusChangeAsync(SysUser context, bool enable)
@@ -89,9 +89,9 @@ public partial class User
try
{
if (enable)
await _serviceScope.ServiceProvider.GetService<SysUserService>().EnableUserAsync(context.Id);
await _serviceScope.ServiceProvider.GetService<ISysUserService>().EnableUserAsync(context.Id);
else
await _serviceScope.ServiceProvider.GetService<SysUserService>().DisableUserAsync(context.Id);
await _serviceScope.ServiceProvider.GetService<ISysUserService>().DisableUserAsync(context.Id);
}
finally
{

View File

@@ -44,14 +44,14 @@ public partial class UserCenter
async Task OnDefaultRazorSaveAsync()
{
await _serviceScope.ServiceProvider.GetService<UserCenterService>().UpdateUserDefaultRazorAsync(UserManager.UserId, _defaultMenuId);
await _serviceScope.ServiceProvider.GetService<IUserCenterService>().UpdateUserDefaultRazorAsync(UserManager.UserId, _defaultMenuId);
await _mainLayout.StateHasChangedAsync();
await PopupService.EnqueueSnackbarAsync("成功", AlertTypes.Success);
}
async Task OnShortcutSaveAsync()
{
await _serviceScope.ServiceProvider.GetService<UserCenterService>().UpdateWorkbenchAsync(_menusChoice);
await _serviceScope.ServiceProvider.GetService<IUserCenterService>().UpdateWorkbenchAsync(_menusChoice);
await _mainLayout.StateHasChangedAsync();
await PopupService.EnqueueSnackbarAsync("成功", AlertTypes.Success);
}
@@ -62,7 +62,7 @@ public partial class UserCenter
{
//验证成功,操作业务
_passwordInfoInput.Id = UserResoures.CurrentUser.Id;
await _serviceScope.ServiceProvider.GetService<UserCenterService>().EditPasswordAsync(_passwordInfoInput);
await _serviceScope.ServiceProvider.GetService<IUserCenterService>().EditPasswordAsync(_passwordInfoInput);
await _mainLayout.StateHasChangedAsync();
await PopupService.EnqueueSnackbarAsync("成功,将重新登录", AlertTypes.Success);
await Task.Delay(2000);
@@ -72,7 +72,7 @@ public partial class UserCenter
async Task OnUpdateUserInfoAsync()
{
await _serviceScope.ServiceProvider.GetService<UserCenterService>().UpdateUserInfoAsync(_updateInfoInput);
await _serviceScope.ServiceProvider.GetService<IUserCenterService>().UpdateUserInfoAsync(_updateInfoInput);
await _mainLayout.StateHasChangedAsync();
await PopupService.EnqueueSnackbarAsync("成功", AlertTypes.Success);
}

View File

@@ -56,7 +56,7 @@ public partial class Vislog
var confirm = await PopupService.OpenConfirmDialogAsync("删除", "确定 ?");
if (confirm)
{
await _serviceScope.ServiceProvider.GetService<VisitLogService>().DeleteAsync(_categoryFilters.Select(it => it.Value).ToArray());
await _serviceScope.ServiceProvider.GetService<IVisitLogService>().DeleteAsync(_categoryFilters.Select(it => it.Value).ToArray());
await _datatable?.QueryClickAsync();
}
}
@@ -74,7 +74,7 @@ public partial class Vislog
private async Task<ISqlSugarPagedList<SysVisitLog>> QueryCallAsync(VisitLogPageInput input)
{
var data = await _serviceScope.ServiceProvider.GetService<VisitLogService>().PageAsync(input);
var data = await _serviceScope.ServiceProvider.GetService<IVisitLogService>().PageAsync(input);
return data;
}
}

View File

@@ -107,8 +107,8 @@ public partial class Login
{
await PopupService.EnqueueSnackbarAsync(new("登录成功", AlertTypes.Success));
await Task.Delay(500);
var userId = await _serviceScope.ServiceProvider.GetService<SysUserService>().GetIdByAccountAsync(_loginModel.Account);
var data = await _serviceScope.ServiceProvider.GetService<UserCenterService>().GetLoginDefaultRazorAsync(userId);
var userId = await _serviceScope.ServiceProvider.GetService<ISysUserService>().GetIdByAccountAsync(_loginModel.Account);
var data = await _serviceScope.ServiceProvider.GetService<IUserCenterService>().GetLoginDefaultRazorAsync(userId);
var sameLevelMenus = await _serviceScope.ServiceProvider.GetService<ResourceService>().GetaMenuAndSpaListAsync();
if (_NavigationManager.ToAbsoluteUri(_NavigationManager.Uri).AbsolutePath == "/Login" || _NavigationManager.ToAbsoluteUri(_NavigationManager.Uri).AbsolutePath == "/")
await _ajaxService.GotoAsync(sameLevelMenus.FirstOrDefault(a => a.Id == data)?.Component ?? "index");

View File

@@ -16,7 +16,7 @@ using ThingsGateway.Foundation.Extension.String;
namespace ThingsGateway.Admin.Blazor;
public partial class MainLayout
public partial class MainLayout : IDisposable
{
private List<SysResource> _breadcrumbSysResources = new();
private string _configCopyRight = "";
@@ -43,16 +43,23 @@ public partial class MainLayout
private IServiceScopeFactory _serviceScopeFactory { get; set; }
[Inject]
private UserResoures _userResoures { get; set; }
public void Dispose()
{
_serviceScope.Dispose();
}
/// <summary>
/// 页面刷新
/// </summary>
/// <returns></returns>
public async Task StateHasChangedAsync()
{
_configCopyRight = (await _serviceScope.ServiceProvider.GetService<IConfigService>().GetByConfigKeyAsync(ConfigConst.SYS_CONFIGBASEDEFAULT, ConfigConst.CONFIG_COPYRIGHT)).ConfigValue;
_configTitle = (await _serviceScope.ServiceProvider.GetService<IConfigService>().GetByConfigKeyAsync(ConfigConst.SYS_CONFIGBASEDEFAULT, ConfigConst.CONFIG_TITLE)).ConfigValue;
_configCopyRightUrl = (await _serviceScope.ServiceProvider.GetService<IConfigService>().GetByConfigKeyAsync(ConfigConst.SYS_CONFIGBASEDEFAULT, ConfigConst.CONFIG_COPYRIGHT_URL)).ConfigValue;
_configPageTab = (await _serviceScope.ServiceProvider.GetService<IConfigService>().GetByConfigKeyAsync(ConfigConst.SYS_CONFIGBASEDEFAULT, ConfigConst.CONFIG_PAGETAB)).ConfigValue.ToBool(true);
var configService = _serviceScope.ServiceProvider.GetService<IConfigService>();
_configCopyRight = (await configService.GetByConfigKeyAsync(ConfigConst.SYS_CONFIGBASEDEFAULT, ConfigConst.CONFIG_COPYRIGHT)).ConfigValue;
_configTitle = (await configService.GetByConfigKeyAsync(ConfigConst.SYS_CONFIGBASEDEFAULT, ConfigConst.CONFIG_TITLE)).ConfigValue;
_configCopyRightUrl = (await configService.GetByConfigKeyAsync(ConfigConst.SYS_CONFIGBASEDEFAULT, ConfigConst.CONFIG_COPYRIGHT_URL)).ConfigValue;
_configPageTab = (await configService.GetByConfigKeyAsync(ConfigConst.SYS_CONFIGBASEDEFAULT, ConfigConst.CONFIG_PAGETAB)).ConfigValue.ToBool(true);
await _userResoures.InitUserAsync();
await _userResoures.InitMenuAsync();

View File

@@ -5,8 +5,8 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.1.5" />
<PackageReference Include="SqlSugarCore" Version="5.1.4.123" />
<PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.1.8" />
<PackageReference Include="SqlSugarCore" Version="5.1.4.122" />
<PackageReference Include="UAParser" Version="3.1.47" />
<PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />
</ItemGroup>

View File

@@ -56,6 +56,7 @@ public abstract class BaseComponentBase : ComponentBase, IDisposable
/// </summary>
public virtual void Dispose()
{
_serviceScope.Dispose();
}
/// <summary>

View File

@@ -1,8 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<PackageReference Include="Furion.Pure" Version="4.9.1.5" />
<PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.1.5" />
<PackageReference Include="Furion.Pure" Version="4.9.1.8" />
<PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.1.8" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>

View File

@@ -1,14 +1,7 @@
<Project>
<Import Project="$(SolutionDir)\Directory.Build.props" />
<PropertyGroup>
<TargetFrameworks>net6.0;net8.0;</TargetFrameworks>
<Version>4.0.0.4</Version>
<LangVersion>latest</LangVersion>
<Authors>Diego</Authors>
<Product>ThingsGateway</Product>
<Copyright>© 2023-present Diego</Copyright>
<RepositoryUrl>https://gitee.com/diego2098/ThingsGateway</RepositoryUrl>
<SatelliteResourceLanguages>zh-Hans</SatelliteResourceLanguages>
<GenerateDocumentationFile>False</GenerateDocumentationFile>
</PropertyGroup>

View File

@@ -12,6 +12,9 @@
using Microsoft.AspNetCore.Components;
using ThingsGateway.Components;
namespace ThingsGateway.Foundation.Demo;
using LogLevel = Microsoft.Extensions.Logging.LogLevel;
/// <summary>

View File

@@ -40,7 +40,9 @@
Dense>
</MSelect>
<MCheckbox Class="ma-1" Style="max-width:200px" Label=@(_plc.Description(x => x.IsRtu)) Dense HideDetails="@("auto")" @bind-Value=@_plc.IsRtu></MCheckbox>
<MCheckbox Class="ma-1" Style="max-width:200px" Label=@(_plc.Description(x => x.IsCheckMessageId)) Dense HideDetails="@("auto")" @bind-Value=@_plc.IsCheckMessageId></MCheckbox>
<MCheckbox Class="ma-1" Style="max-width:200px" Label=@(_plc.Description(x => x.Crc16CheckEnable)) Dense HideDetails="@("auto")" @bind-Value=@_plc.Crc16CheckEnable></MCheckbox>
}
</MRow>

View File

@@ -13,9 +13,9 @@
namespace ThingsGateway.Foundation.Demo;
/// <summary>
/// ModbusTcpDtuDebugPage
/// ModbusDtuDebugPage
/// </summary>
public partial class ModbusTcpDtuDebugPage
public partial class ModbusDtuDebugPage
{
/// <summary>
/// TcpServerPage
@@ -23,7 +23,7 @@ public partial class ModbusTcpDtuDebugPage
private TcpServerPage _tcpServerPage;
private DriverDebugUIPage _driverDebugUIPage;
private ThingsGateway.Foundation.Adapter.Modbus.ModbusTcpDtu _plc;
private ThingsGateway.Foundation.Adapter.Modbus.ModbusDtu _plc;
/// <summary>
/// <inheritdoc/>
@@ -70,7 +70,7 @@ public partial class ModbusTcpDtuDebugPage
if (_tcpServerPage != null)
_tcpServerPage.LogAction = _driverDebugUIPage.LogOut;
_plc = new ThingsGateway.Foundation.Adapter.Modbus.ModbusTcpDtu(_tcpServerPage.GetTcpServer());
_plc = new ThingsGateway.Foundation.Adapter.Modbus.ModbusDtu(_tcpServerPage.GetTcpServer());
_driverDebugUIPage.Plc = _plc;
//载入配置
StateHasChanged();

View File

@@ -20,8 +20,6 @@ using Microsoft.JSInterop;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;
using ThingsGateway.Foundation.Adapter.OPCDA;
using ThingsGateway.Foundation.Adapter.OPCDA.Da;
@@ -45,6 +43,7 @@ public partial class OPCDAClientDebugPage : IDisposable
{
_plc.SafeDispose();
opcDAClientPage.SafeDispose();
base.Dispose();
}
/// <inheritdoc/>
@@ -105,7 +104,7 @@ public partial class OPCDAClientDebugPage : IDisposable
await PopupService.EnqueueSnackbarAsync("无可用变量", AlertTypes.Warning);
return;
}
await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().AddAsync(data?.Item1);
await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().AddAsync(data?.Item1);
await _serviceScope.ServiceProvider.GetService<VariableService>().AddBatchAsync(data?.Item2);
await PopupService.EnqueueSnackbarAsync("成功", AlertTypes.Success);
}
@@ -151,7 +150,7 @@ public partial class OPCDAClientDebugPage : IDisposable
/// <returns></returns>
public async Task DownDeviceExportAsync(CollectDevice data)
{
using var memoryStream = await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().ExportFileAsync(new List<CollectDevice>() { data });
using var memoryStream = await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().ExportFileAsync(new List<CollectDevice>() { data });
using var streamRef = new DotNetStreamReference(stream: memoryStream);
JSObjectReference ??= await JSRuntime.LoadModuleAsync("js/downloadFileFromStream");
await JSObjectReference.InvokeVoidAsync("downloadFileFromStream", $"设备导出{DateTimeExtensions.CurrentDateTime.ToFileDateTimeFormat()}.xlsx", streamRef);

View File

@@ -96,7 +96,7 @@ public partial class OPCUAClientDebugPage
await PopupService.EnqueueSnackbarAsync("无可用变量", AlertTypes.Warning);
return;
}
await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().AddAsync(data.Item1);
await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().AddAsync(data.Item1);
await _serviceScope.ServiceProvider.GetService<VariableService>().AddBatchAsync(data.Item2);
await PopupService.EnqueueSnackbarAsync("成功", AlertTypes.Success);
}
@@ -141,7 +141,7 @@ public partial class OPCUAClientDebugPage
/// <returns></returns>
public async Task DownDeviceExportAsync(CollectDevice data)
{
using var memoryStream = await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().ExportFileAsync(new List<CollectDevice>() { data });
using var memoryStream = await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().ExportFileAsync(new List<CollectDevice>() { data });
using var streamRef = new DotNetStreamReference(stream: memoryStream);
JSObjectReference ??= await JSRuntime.LoadModuleAsync("js/downloadFileFromStream");
await JSObjectReference.InvokeVoidAsync("downloadFileFromStream", $"设备导出{DateTimeExtensions.CurrentDateTime.ToFileDateTimeFormat()}.xlsx", streamRef);

View File

@@ -1,20 +1,14 @@
<Project>
<Import Project="$(SolutionDir)\Directory.Build.props" />
<!--如果编译net45报错无支持用一下方法添加net45包-->
<!--VS顶部菜单栏 -> 视图 -> 其他 -> 程序包控制台
Install-Package Microsoft.NETFramework.ReferenceAssemblies.net45
-->
<PropertyGroup>
<Version>4.0.0.4</Version>
<GenerateDocumentationFile>True</GenerateDocumentationFile>
<LangVersion>latest</LangVersion>
<TargetFrameworks>net45;netstandard2.0;net6.0;net8.0;</TargetFrameworks>
<Description>
ThingsGateway.Foundation是工业设备通讯类库归属于ThingsGateway边缘网关项目说明文档https://diego2098.gitee.io/thingsgateway-docs/
</Description>
<Authors>Diego</Authors>
<Product>ThingsGateway</Product>
<Copyright>© 2023-present Diego</Copyright>
<RepositoryUrl>https://gitee.com/diego2098/ThingsGateway</RepositoryUrl>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<EmbedUntrackedSource>true</EmbedUntrackedSource>
<EmbedAllSources>true</EmbedAllSources>
@@ -26,17 +20,11 @@
<PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
<PackageProjectUrl>https://diego2098.gitee.io/thingsgateway-docs/</PackageProjectUrl>
<PackageTags>ThingsGateway;Diego;dotNET China;Blazor;设备采集;边缘网关</PackageTags>
<SignAssembly>True</SignAssembly>
<DelaySign>False</DelaySign>
<SatelliteResourceLanguages>zh-Hans</SatelliteResourceLanguages>
<PackageOutputPath>..\..\nupkgs</PackageOutputPath>
<AssemblyOriginatorKeyFile>..\..\..\snks/ThingsGateway.snk</AssemblyOriginatorKeyFile>
<GenerateDocumentationFile>True</GenerateDocumentationFile>
</PropertyGroup>
<PropertyGroup>
</PropertyGroup>
<ItemGroup>
<None Include="..\..\..\README.md" Pack="true" PackagePath="\" />
</ItemGroup>

View File

@@ -106,7 +106,7 @@ public class DLT645_2007 : ReadWriteDevicesSerialSessionBase, IDLT645_2007
public override OperResult Write(string address, bool[] value, CancellationToken cancellationToken = default) => Write(address, value.ToString(), cancellationToken);
/// <inheritdoc/>
public override Task<OperResult> WriteAsync(string address, byte[] value, CancellationToken cancellationToken = default) => throw new NotImplementedException();
public override Task<OperResult> WriteAsync(string address, byte[] value, CancellationToken cancellationToken = default) => Task.FromResult(new OperResult());
/// <inheritdoc/>
public override Task<OperResult> WriteAsync(string address, uint value, CancellationToken cancellationToken = default) => WriteAsync(address, value.ToString(), cancellationToken);
/// <inheritdoc/>
@@ -125,7 +125,7 @@ public class DLT645_2007 : ReadWriteDevicesSerialSessionBase, IDLT645_2007
public override Task<OperResult> WriteAsync(string address, int value, CancellationToken cancellationToken = default) => WriteAsync(address, value.ToString(), cancellationToken);
/// <inheritdoc/>
public override Task<OperResult> WriteAsync(string address, bool[] value, CancellationToken cancellationToken = default) => throw new NotImplementedException();
public override Task<OperResult> WriteAsync(string address, bool[] value, CancellationToken cancellationToken = default) => Task.FromResult(new OperResult());
#region

View File

@@ -106,7 +106,7 @@ public class DLT645_2007OverTcp : ReadWriteDevicesTcpClientBase, IDLT645_2007
public override OperResult Write(string address, bool[] value, CancellationToken cancellationToken = default) => Write(address, value.ToString(), cancellationToken);
/// <inheritdoc/>
public override Task<OperResult> WriteAsync(string address, byte[] value, CancellationToken cancellationToken = default) => throw new NotImplementedException();
public override Task<OperResult> WriteAsync(string address, byte[] value, CancellationToken cancellationToken = default) => Task.FromResult(new OperResult());
/// <inheritdoc/>
public override Task<OperResult> WriteAsync(string address, uint value, CancellationToken cancellationToken = default) => WriteAsync(address, value.ToString(), cancellationToken);
/// <inheritdoc/>
@@ -125,7 +125,7 @@ public class DLT645_2007OverTcp : ReadWriteDevicesTcpClientBase, IDLT645_2007
public override Task<OperResult> WriteAsync(string address, int value, CancellationToken cancellationToken = default) => WriteAsync(address, value.ToString(), cancellationToken);
/// <inheritdoc/>
public override Task<OperResult> WriteAsync(string address, bool[] value, CancellationToken cancellationToken = default) => throw new NotImplementedException();
public override Task<OperResult> WriteAsync(string address, bool[] value, CancellationToken cancellationToken = default) => Task.FromResult(new OperResult());
#region

View File

@@ -14,14 +14,14 @@ using System.ComponentModel;
namespace ThingsGateway.Foundation.Adapter.Modbus;
/// <inheritdoc/>
public class ModbusTcpDtu : ReadWriteDevicesTcpServerBase
public class ModbusDtu : ReadWriteDevicesTcpServerBase
{
/// <inheritdoc/>
public ModbusTcpDtu(TcpService tcpService) : base(tcpService)
public ModbusDtu(TcpService tcpService) : base(tcpService)
{
ThingsGatewayBitConverter = new ThingsGatewayBitConverter(EndianType.Big);
RegisterByteLength = 2;
ModbusTcpDtuPlugin modbusTcpSalvePlugin = new ModbusTcpDtuPlugin();
ModbusDtuPlugin modbusTcpSalvePlugin = new ModbusDtuPlugin();
tcpService.Config.ConfigurePlugins(a =>
{
a.Add(modbusTcpSalvePlugin);
@@ -35,6 +35,18 @@ public class ModbusTcpDtu : ReadWriteDevicesTcpServerBase
[Description("检测事务标识符")]
public bool IsCheckMessageId { get; set; }
/// <summary>
/// 是否Rtu格式
/// </summary>
[Description("是否Rtu格式")]
public bool IsRtu { get; set; }
/// <summary>
/// Crc校验
/// </summary>
[Description("Crc校验")]
public bool Crc16CheckEnable { get; set; } = true;
/// <summary>
/// 站号
/// </summary>
@@ -92,23 +104,49 @@ public class ModbusTcpDtu : ReadWriteDevicesTcpServerBase
{
if (socketClient != default)
{
ModbusTcpDataHandleAdapter dataHandleAdapter = new()
{
IsCheckMessageId = IsCheckMessageId,
CacheTimeout = TimeSpan.FromMilliseconds(CacheTimeout)
};
socketClient.SetDataHandlingAdapter(dataHandleAdapter);
}
else
{
foreach (var item in TcpService.GetClients())
if (!IsRtu)
{
ModbusTcpDataHandleAdapter dataHandleAdapter = new()
{
IsCheckMessageId = IsCheckMessageId,
CacheTimeout = TimeSpan.FromMilliseconds(CacheTimeout)
};
item.SetDataHandlingAdapter(dataHandleAdapter);
socketClient.SetDataHandlingAdapter(dataHandleAdapter);
}
else
{
ModbusRtuDataHandleAdapter dataHandleAdapter = new()
{
Crc16CheckEnable = Crc16CheckEnable,
CacheTimeout = TimeSpan.FromMilliseconds(CacheTimeout)
};
socketClient.SetDataHandlingAdapter(dataHandleAdapter);
}
}
else
{
//只适配第一个
var item = TcpService.GetClients().FirstOrDefault();
if (item != null)
{
if (!IsRtu)
{
ModbusTcpDataHandleAdapter dataHandleAdapter = new()
{
IsCheckMessageId = IsCheckMessageId,
CacheTimeout = TimeSpan.FromMilliseconds(CacheTimeout)
};
item.SetDataHandlingAdapter(dataHandleAdapter);
}
else
{
ModbusRtuDataHandleAdapter dataHandleAdapter = new()
{
Crc16CheckEnable = Crc16CheckEnable,
CacheTimeout = TimeSpan.FromMilliseconds(CacheTimeout)
};
item.SetDataHandlingAdapter(dataHandleAdapter);
}
}
}
}
@@ -187,7 +225,7 @@ public class ModbusTcpDtu : ReadWriteDevicesTcpServerBase
if (TcpService.TryGetSocketClient($"ID={id}", out var client))
{
SetDataAdapter(client);
return SendThenReturn<ModbusTcpMessage>(command, cancellationToken, client);
return SendThenReturn<MessageBase>(command, cancellationToken, client);
}
else
{
@@ -200,7 +238,7 @@ public class ModbusTcpDtu : ReadWriteDevicesTcpServerBase
if (TcpService.TryGetSocketClient($"ID={id}", out var client))
{
SetDataAdapter(client);
return await SendThenReturnAsync<ModbusTcpMessage>(command, cancellationToken, client);
return await SendThenReturnAsync<MessageBase>(command, cancellationToken, client);
}
else if (TcpService.SocketClients.Count == 1)
{
@@ -208,13 +246,13 @@ public class ModbusTcpDtu : ReadWriteDevicesTcpServerBase
if (client1 != null)
{
SetDataAdapter(client1);
return await SendThenReturnAsync<ModbusTcpMessage>(command, cancellationToken, client1);
return await SendThenReturnAsync<MessageBase>(command, cancellationToken, client1);
}
}
return new OperResult<byte[]>("客户端未连接");
}
internal class ModbusTcpDtuPlugin : PluginBase, ITcpReceivingPlugin
internal class ModbusDtuPlugin : PluginBase, ITcpReceivingPlugin
{
public async Task OnTcpReceiving(ITcpClientBase client, ByteBlockEventArgs e)
{

View File

@@ -134,21 +134,19 @@ internal class ModbusHelper
if (response[1] >= 0x80)//错误码
return new OperResult<byte[], FilterResult>(GetDescriptionByErrorCode(response[2])) { Content2 = FilterResult.Success };
if (response[1] <= 0x05)
if (response[1] <= 0x04)
{
if ((response.Length < response[2] + 5))
return new OperResult<byte[], FilterResult>("数据长度不足" + response.ToHexString()) { Content2 = FilterResult.Cache };
}
else
{
if ((response.Length < 8))
return new OperResult<byte[], FilterResult>("数据长度不足" + response.ToHexString()) { Content2 = FilterResult.Cache };
}
var data = response.SelectMiddle(0, response[2] != 0 ? response[2] + 5 : 8);
var data = response.SelectMiddle(0, response[1] <= 0x04 ? response[2] != 0 ? response[2] + 5 : 8 : 8);
if (crcCheck && !CRC16Utils.CheckCRC16(data))
return new OperResult<byte[], FilterResult>("Crc校验失败" + DataTransUtil.ByteToHexString(data, ' ')) { Content2 = FilterResult.Success };
return GetModbusData(send, data.RemoveLast(2));

View File

@@ -19,7 +19,7 @@ namespace ThingsGateway.Foundation.Adapter.Modbus;
/// </summary>
internal class ModbusTcpDataHandleAdapter : ReadWriteDevicesSingleStreamDataHandleAdapter<ModbusTcpMessage>
{
private readonly IncrementCount easyIncrementCount = new(ushort.MaxValue);
private readonly IncrementCount _incrementCount = new(ushort.MaxValue);
/// <summary>
/// 检测事务标识符
@@ -39,7 +39,7 @@ internal class ModbusTcpDataHandleAdapter : ReadWriteDevicesSingleStreamDataHand
/// <inheritdoc/>
public override byte[] PackCommand(byte[] command)
{
return ModbusHelper.AddModbusTcpHead(command, (ushort)easyIncrementCount.GetCurrentValue());
return ModbusHelper.AddModbusTcpHead(command, (ushort)_incrementCount.GetCurrentValue());
}
/// <inheritdoc/>

View File

@@ -18,7 +18,7 @@ namespace ThingsGateway.Foundation.Adapter.Modbus;
/// </summary>
internal class ModbusUdpDataHandleAdapter : ReadWriteDevicesUdpDataHandleAdapter<ModbusTcpMessage>
{
private readonly IncrementCount easyIncrementCount = new(ushort.MaxValue);
private readonly IncrementCount _incrementCount = new(ushort.MaxValue);
/// <summary>
/// 检测事务标识符
@@ -38,7 +38,7 @@ internal class ModbusUdpDataHandleAdapter : ReadWriteDevicesUdpDataHandleAdapter
/// <inheritdoc/>
public override byte[] PackCommand(byte[] command)
{
return ModbusHelper.AddModbusTcpHead(command, (ushort)easyIncrementCount.GetCurrentValue());
return ModbusHelper.AddModbusTcpHead(command, (ushort)_incrementCount.GetCurrentValue());
}
/// <inheritdoc/>

View File

@@ -143,7 +143,7 @@ public interface IReadWrite : IDisposable
/// <param name="cancellationToken">取消令箭</param>
/// <param name="senderClient">传入改参数时,将新建等待线程</param>
/// <returns></returns>
T SendThenReturn<T>(byte[] command, CancellationToken cancellationToken, ISenderClient senderClient = default) where T : OperResult<byte[]>, new();
T SendThenReturn<T>(byte[] command, CancellationToken cancellationToken, ISenderClient senderClient = default) where T : OperResult<byte[]>;
/// <summary>
/// 异步发送并返回结果
@@ -153,7 +153,7 @@ public interface IReadWrite : IDisposable
/// <param name="cancellationToken">取消令箭</param>
/// <param name="senderClient">传入改参数时,将新建等待线程</param>
/// <returns></returns>
Task<T> SendThenReturnAsync<T>(byte[] command, CancellationToken cancellationToken, ISenderClient senderClient = default) where T : OperResult<byte[]>, new();
Task<T> SendThenReturnAsync<T>(byte[] command, CancellationToken cancellationToken, ISenderClient senderClient = default) where T : OperResult<byte[]>;
/// <summary>
/// 发送获取数据

View File

@@ -148,7 +148,7 @@ public abstract class ReadWriteDevicesBase : IReadWrite
public abstract void Send(byte[] command, string id = default);
/// <inheritdoc/>
public virtual T SendThenReturn<T>(byte[] command, CancellationToken cancellationToken, ISenderClient senderClient = default) where T : OperResult<byte[]>, new()
public virtual T SendThenReturn<T>(byte[] command, CancellationToken cancellationToken, ISenderClient senderClient = default) where T : OperResult<byte[]>
{
var item = command;
if (FrameTime != 0)
@@ -157,7 +157,7 @@ public abstract class ReadWriteDevicesBase : IReadWrite
return (T)result.RequestInfo;
}
/// <inheritdoc/>
public virtual async Task<T> SendThenReturnAsync<T>(byte[] command, CancellationToken cancellationToken, ISenderClient senderClient = default) where T : OperResult<byte[]>, new()
public virtual async Task<T> SendThenReturnAsync<T>(byte[] command, CancellationToken cancellationToken, ISenderClient senderClient = default) where T : OperResult<byte[]>
{
var item = command;
await Task.Delay(FrameTime, cancellationToken);

View File

@@ -69,7 +69,7 @@ public abstract class ReadWriteDevicesUdpSessionBase : ReadWriteDevicesBase
/// <inheritdoc/>
public override string ToString()
{
return UdpSession.RemoteIPHost.ToString();
return UdpSession.RemoteIPHost?.ToString();
}
/// <inheritdoc/>

View File

@@ -29,6 +29,7 @@ public abstract class ReadWriteDevicesSingleStreamDataHandleAdapter<TRequest> :
public ReadWriteDevicesSingleStreamDataHandleAdapter()
{
Request = GetInstance();
CacheTimeoutEnable = true;
}
/// <inheritdoc/>
public override bool CanSendRequestInfo => false;

View File

@@ -53,7 +53,7 @@ public abstract class ReadWriteDevicesUdpDataHandleAdapter<TRequest> : UdpDataHa
/// <inheritdoc/>
public override string ToString()
{
return (Owner as UdpSession)?.RemoteIPHost.ToString();
return (Owner as UdpSession)?.RemoteIPHost?.ToString();
}
/// <summary>
@@ -83,11 +83,11 @@ public abstract class ReadWriteDevicesUdpDataHandleAdapter<TRequest> : UdpDataHa
var allBytes = byteBlock.ToArray(0, byteBlock.Len);
Logger?.Trace($"{FoundationConst.LogMessageHeader}{ToString()}- 接收:{(IsHexData ? allBytes.ToHexString(' ') : Encoding.UTF8.GetString(allBytes))}");
if (Request?.SendBytes == null)
{
GoReceived(remoteEndPoint, byteBlock, null);
return;
}
//if (Request?.SendBytes == null)
//{
// GoReceived(remoteEndPoint, byteBlock, null);
// return;
//}
byte[] header = new byte[] { };
if (Request.HeadBytesLength > 0)
{

View File

@@ -421,6 +421,74 @@ public static class StringExtensions
{
return value.IsNullOrEmpty() ? defaultValue : ushort.TryParse(value, out var n) ? n : defaultValue;
}
/// <summary>
/// ToDouble
/// </summary>
/// <returns></returns>
public static double ToDouble(this object value, double defaultValue = 0)
{
if (value is Double d)
{
return Double.IsNaN(d) ? defaultValue : (Double)d;
}
var str = value?.ToString();
if (str.IsNullOrEmpty())
{
return (double)defaultValue;
}
else
{
if (value is bool boolValue)
{
return boolValue ? 1 : 0;
}
return (double)(double.TryParse(str, out var n) ? n : defaultValue);
}
}
/// <summary>
/// ToDecimal
/// </summary>
/// <returns></returns>
public static decimal ToDecimal(this object value, int defaultValue = 0)
{
if (value is Double d)
{
return Double.IsNaN(d) ? defaultValue : (Decimal)d;
}
var str = value?.ToString();
if (str.IsNullOrEmpty())
{
return defaultValue;
}
else
{
if (value is bool boolValue)
{
return boolValue ? 1 : 0;
}
return Decimal.TryParse(str, out var n) ? n : defaultValue;
}
}
/// <summary>
/// ToInt
/// </summary>
/// <returns></returns>
public static int ToInt(this object value, int defaultValue = 0)
{
if (value == null || value.ToString().IsNullOrEmpty())
{
return defaultValue;
}
else
{
if (value is bool boolValue)
{
return boolValue ? 1 : 0;
}
return int.TryParse(value.ToString(), out int n) ? n : defaultValue;
}
}
/// <summary>
/// 用 正则表达式 判断字符是不是汉字

View File

@@ -2,7 +2,6 @@
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)'=='net45'">

View File

@@ -51,9 +51,9 @@ namespace ThingsGateway.Foundation.Sockets
/// </summary>
/// <param name="config"></param>
/// <returns></returns>
public static HttpClient BuildWithHttpClient(this TouchSocketConfig config)
public static Http.HttpClient BuildWithHttpClient(this TouchSocketConfig config)
{
return BuildWithHttpClient<HttpClient>(config);
return BuildWithHttpClient<Http.HttpClient>(config);
}
/// <summary>

View File

@@ -43,26 +43,25 @@ namespace ThingsGateway.Foundation.Http
});
}
/// <summary>
/// 静态文件缓存。
/// </summary>
public FileCachePool FileCache { get; private set; }
/// <summary>
/// 提供文件扩展名和MIME类型之间的映射。
/// </summary>
public IContentTypeProvider ContentTypeProvider { get; set; }
/// <summary>
/// 设置提供文件扩展名和MIME类型之间的映射
/// 静态文件缓存
/// </summary>
/// <param name="provider"></param>
/// <returns></returns>
public HttpStaticPagePlugin SetContentTypeProvider(IContentTypeProvider provider)
{
this.ContentTypeProvider = provider ?? throw new ArgumentNullException(nameof(provider));
return this;
}
public FileCachePool FileCache { get; private set; }
/// <summary>
/// 重新导航。
/// </summary>
public Func<HttpRequest, Task<string>> NavigateAction { get; set; }
/// <summary>
/// 在响应之前调用
/// </summary>
public Func<HttpContext, Task> ResponseAction { get; set; }
/// <summary>
/// 添加静态
@@ -76,7 +75,33 @@ namespace ThingsGateway.Foundation.Http
timeout ??= TimeSpan.FromHours(1);
this.FileCache.InsertPath(path, prefix, filter, timeout.Value, null);
}
/// <inheritdoc/>
public async Task OnHttpRequest(IHttpSocketClient client, HttpContextEventArgs e)
{
var url = await this.NavigateAction.Invoke(e.Context.Request);
if (this.FileCache.Find(url, out var data))
{
var response = e.Context.Response;
response.SetStatus();
if (this.ContentTypeProvider?.TryGetContentType(url, out var result) != true)
{
result = HttpTools.GetContentTypeFromExtension(url);
}
response.ContentType = result;
response.SetContent(data);
if (this.ResponseAction != null)
{
await this.ResponseAction.Invoke(e.Context);
}
await response.AnswerAsync();
e.Handled = true;
}
else
{
await e.InvokeNext();
}
}
/// <summary>
/// Clear static content cache
/// </summary>
@@ -84,20 +109,23 @@ namespace ThingsGateway.Foundation.Http
{
this.FileCache.Clear();
}
/// <summary>
/// 重新导航
/// Remove static content cache
/// </summary>
public Func<HttpRequest, Task<string>> NavigateAction { get; set; }
/// <summary>
/// 设定重新导航
/// </summary>
/// <param name="func"></param>
/// <returns></returns>
public HttpStaticPagePlugin SetNavigateAction(Func<HttpRequest, Task<string>> func)
/// <param name="path">Static content path</param>
public void RemoveFolder(string path)
{
this.NavigateAction = func;
this.FileCache.RemovePath(path);
}
/// <summary>
/// 设置提供文件扩展名和MIME类型之间的映射。
/// </summary>
/// <param name="provider"></param>
/// <returns></returns>
public HttpStaticPagePlugin SetContentTypeProvider(IContentTypeProvider provider)
{
this.ContentTypeProvider = provider ?? throw new ArgumentNullException(nameof(provider));
return this;
}
@@ -115,35 +143,30 @@ namespace ThingsGateway.Foundation.Http
return this;
}
/// <inheritdoc/>
public async Task OnHttpRequest(IHttpSocketClient client, HttpContextEventArgs e)
/// <summary>
/// 在响应之前调用。
/// </summary>
/// <param name="func"></param>
/// <returns></returns>
public HttpStaticPagePlugin SetResponseAction(Func<HttpContext, Task> func)
{
var url = await this.NavigateAction.Invoke(e.Context.Request);
if (this.FileCache.Find(url, out var data))
{
e.Context.Response.SetStatus();
if (this.ContentTypeProvider?.TryGetContentType(url, out var result) != true)
{
result = HttpTools.GetContentTypeFromExtension(url);
}
e.Context.Response.ContentType = result;
e.Context.Response.SetContentLength(data.Length)
.WriteContent(data);
e.Handled = true;
}
else
{
await e.InvokeNext();
}
this.ResponseAction = func;
return this;
}
/// <summary>
/// Remove static content cache
/// 在响应之前调用。
/// </summary>
/// <param name="path">Static content path</param>
public void RemoveFolder(string path)
/// <param name="action"></param>
/// <returns></returns>
public HttpStaticPagePlugin SetResponseAction(Action<HttpContext> action)
{
this.FileCache.RemovePath(path);
this.ResponseAction = (response) =>
{
action.Invoke(response);
return EasyTask.CompletedTask;
};
return this;
}
}
}

View File

@@ -40,6 +40,14 @@ namespace ThingsGateway.Foundation.Sockets
{
this.Protocol = Protocol.Tcp;
}
/// <summary>
/// <inheritdoc/>
/// </summary>
/// <returns></returns>
public override string ToString()
{
return $"{nameof(SocketClient)}:{IP}:{Port}";
}
#region

View File

@@ -75,7 +75,7 @@ namespace ThingsGateway.Foundation.WebApi.Swagger
var bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
var prefix = this.Prefix.IsNullOrEmpty() ? "/" : (this.Prefix.StartsWith("/") ? this.Prefix : $"/{this.Prefix}");
var name = item.Replace("ThingsGateway.Foundation.ThingsGateway.Foundation.WebApi.Swagger.api.", string.Empty);
var name = item.Replace("ThingsGateway.Foundation.TouchSocket.WebApi.Swagger.api.", string.Empty);
if (name == "openapi.json")
{
try

View File

@@ -342,11 +342,11 @@ namespace ThingsGateway.Foundation.WebApi
var client = (IHttpSocketClient)sender;
var e = (HttpContextEventArgs)args;
if (e.Context.Request.Method == HttpMethod.Get)
if (e.Context.Request.Method == Http.HttpMethod.Get)
{
return this.OnHttpGet(client, e);
}
else if (e.Context.Request.Method == HttpMethod.Post)
else if (e.Context.Request.Method == Http.HttpMethod.Post)
{
return this.OnHttpPost(client, e);
}

View File

@@ -1,16 +1,7 @@
<Project>
<Import Project="$(SolutionDir)\Directory.Build.props" />
<PropertyGroup>
<Version>4.0.0.4</Version>
<LangVersion>latest</LangVersion>
<ImplicitUsings>enable</ImplicitUsings>
<TargetFrameworks>net6.0;net8.0;</TargetFrameworks>
<Authors>Diego</Authors>
<Product>ThingsGateway</Product>
<Copyright>© 2023-present Diego</Copyright>
<RepositoryUrl>https://gitee.com/diego2098/ThingsGateway</RepositoryUrl>
<SignAssembly>True</SignAssembly>
<DelaySign>False</DelaySign>
<SatelliteResourceLanguages>zh-Hans</SatelliteResourceLanguages>
</PropertyGroup>

View File

@@ -30,14 +30,14 @@ public class CollectDbInfoControler : IDynamicApiController
{
readonly IServiceScope _serviceScope;
/// <inheritdoc cref="CollectDbInfoControler"/>
public CollectDbInfoControler(IServiceScopeFactory scopeFactory, VariableService variableService, CollectDeviceService collectDeviceService)
public CollectDbInfoControler(IServiceScopeFactory scopeFactory, VariableService variableService, ICollectDeviceService collectDeviceService)
{
_serviceScope = scopeFactory.CreateScope();
_variableService = variableService;
_collectDeviceService = collectDeviceService;
}
CollectDeviceService _collectDeviceService { get; set; }
ICollectDeviceService _collectDeviceService { get; set; }
VariableService _variableService { get; set; }
/// <summary>
/// 获取采集设备信息

View File

@@ -23,9 +23,9 @@ namespace ThingsGateway.Gateway.ApiController;
public class FileController : IDynamicApiController
{
private readonly IBackendLogService _backendLogService;
private readonly CollectDeviceService _collectDeviceService;
private readonly ICollectDeviceService _collectDeviceService;
private readonly IRpcLogService _rpcLogService;
private readonly UploadDeviceService _uploadDeviceService;
private readonly IUploadDeviceService _uploadDeviceService;
private readonly VariableService _variableService;
/// <summary>
/// <inheritdoc cref="FileController"/>
@@ -33,8 +33,8 @@ public class FileController : IDynamicApiController
public FileController(
IRpcLogService rpcLogService,
IBackendLogService backendLogService,
CollectDeviceService collectDeviceService,
UploadDeviceService uploadDeviceService,
ICollectDeviceService collectDeviceService,
IUploadDeviceService uploadDeviceService,
VariableService variableService
)
{

View File

@@ -9,7 +9,7 @@
采集设备
</summary>
</member>
<member name="M:ThingsGateway.Gateway.ApiController.CollectDbInfoControler.#ctor(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory,ThingsGateway.Gateway.Application.VariableService,ThingsGateway.Gateway.Application.CollectDeviceService)">
<member name="M:ThingsGateway.Gateway.ApiController.CollectDbInfoControler.#ctor(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory,ThingsGateway.Gateway.Application.VariableService,ThingsGateway.Gateway.Application.ICollectDeviceService)">
<inheritdoc cref="T:ThingsGateway.Gateway.ApiController.CollectDbInfoControler"/>
</member>
<member name="M:ThingsGateway.Gateway.ApiController.CollectDbInfoControler.GetCollectDeviceList(ThingsGateway.Gateway.Application.DevicePageInput)">
@@ -29,7 +29,7 @@
文件下载
</summary>
</member>
<member name="M:ThingsGateway.Gateway.ApiController.FileController.#ctor(ThingsGateway.Gateway.Application.IRpcLogService,ThingsGateway.Gateway.Application.IBackendLogService,ThingsGateway.Gateway.Application.CollectDeviceService,ThingsGateway.Gateway.Application.UploadDeviceService,ThingsGateway.Gateway.Application.VariableService)">
<member name="M:ThingsGateway.Gateway.ApiController.FileController.#ctor(ThingsGateway.Gateway.Application.IRpcLogService,ThingsGateway.Gateway.Application.IBackendLogService,ThingsGateway.Gateway.Application.ICollectDeviceService,ThingsGateway.Gateway.Application.IUploadDeviceService,ThingsGateway.Gateway.Application.VariableService)">
<summary>
<inheritdoc cref="T:ThingsGateway.Gateway.ApiController.FileController"/>
</summary>

View File

@@ -10,6 +10,8 @@
//------------------------------------------------------------------------------
#endregion
using Mapster;
using System.ComponentModel;
using ThingsGateway.Gateway.Core.Extensions;
@@ -48,6 +50,7 @@ public class DeviceVariableRunTime : DeviceVariable, IDeviceVariableRunTime
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
[AdaptIgnore]
[Description("采集设备")]
public CollectDeviceRunTime CollectDeviceRunTime { get; set; }

View File

@@ -43,14 +43,16 @@ public abstract class CollectBase : DriverBase
public override async Task AfterStopAsync()
{
await base.AfterStopAsync();
//去除全局设备变量
lock (_globalDeviceData.CollectDevices)
{
_globalDeviceData.CollectDevices.RemoveWhere(it => it.Id == DeviceId);
}
await base.AfterStopAsync();
}
public override void Init(DeviceRunTime device)
{
base.Init(device);
@@ -83,7 +85,7 @@ public abstract class CollectBase : DriverBase
public virtual async Task<Dictionary<string, OperResult>> WriteValuesAsync(Dictionary<DeviceVariableRunTime, JToken> writeInfoLists, CancellationToken cancellationToken)
{
if (_readWrite == null)
throw new("未初始化成功");
throw new($"无法写入数据,{nameof(_readWrite)}为null");
Dictionary<string, OperResult> operResults = new();
foreach (var writeInfo in writeInfoLists)
{
@@ -165,7 +167,7 @@ public abstract class CollectBase : DriverBase
if (!string.IsNullOrEmpty(methodResult.MethodStr))
{
string[] strs = methodResult.MethodStr?.Trim()?.TrimEnd(';').Split(';');
string[] strs = methodResult.MethodStr?.Trim()?.TrimEnd(',').Split(',');
try
{
int index = 0;
@@ -233,7 +235,7 @@ public abstract class CollectBase : DriverBase
var readErrorCount = 0;
var readResult = await ReadSourceAsync(deviceVariableSourceRead, cancellationToken);
while (readResult != null && !readResult.IsSuccess && readErrorCount < 3)
while (readResult != null && !readResult.IsSuccess && readErrorCount < DriverPropertys.RetryCount)
{
readErrorCount++;
LogMessage?.Trace($"{DeviceName} - 采集[{deviceVariableSourceRead?.Address} - {deviceVariableSourceRead?.Length}] 数据失败 - {readResult?.Message}");
@@ -285,7 +287,7 @@ public abstract class CollectBase : DriverBase
var readErrorCount = 0;
var readResult = await InvokeMethodAsync(deviceVariableMethodRead, cancellationToken);
while (readResult != null && !readResult.IsSuccess && readErrorCount < 3)
while (readResult != null && !readResult.IsSuccess && readErrorCount < DriverPropertys.RetryCount)
{
readErrorCount++;
LogMessage?.Trace($"{DeviceName} - 执行方法[{deviceVariableMethodRead.MethodInfo.Name}] - 失败 - {readResult?.Message}");
@@ -363,8 +365,8 @@ public abstract class CollectBase : DriverBase
if (!string.IsNullOrEmpty(deviceVariableMethodSource.MethodStr) || !string.IsNullOrEmpty(value))
{
var strs1 = deviceVariableMethodSource.MethodStr?.Trim()?.TrimEnd(';').Split(';') ?? Array.Empty<string>();
var strs2 = value?.Trim()?.TrimEnd(';').Split(';') ?? Array.Empty<string>();
var strs1 = deviceVariableMethodSource.MethodStr?.Trim()?.TrimEnd(',').Split(',') ?? Array.Empty<string>();
var strs2 = value?.Trim()?.TrimEnd(',').Split(',') ?? Array.Empty<string>();
//通过分号分割,并且合并参数
var strs = GenericExtensions.SpliceArray(strs1, strs2);
int index = 0;

View File

@@ -139,7 +139,11 @@ public class DeviceThread
var result = await device.ExecuteAsync(stoppingToken);
if (result == ThreadRunReturn.None)
{
await Task.Delay(CycleInterval, stoppingToken);
//4.0.0.7版本添加离线恢复的间隔时间
if (device.CurrentDevice.DeviceStatus == DeviceStatusEnum.OffLine && device is not UpLoadBase)
await Task.Delay(Math.Min(device.DriverPropertys.ReIntervalTime, DeviceWorker.CheckIntervalTime / 2) * 1000 - CycleInterval, stoppingToken);
else
await Task.Delay(CycleInterval, stoppingToken);
}
else if (result == ThreadRunReturn.Continue)
{

View File

@@ -275,7 +275,7 @@ public abstract class DriverBase : DisposableObject
{
LogMessage?.LogError(ex, $"插件执行{nameof(ExecuteAsync)}方法失败");
CurrentDevice.SetDeviceStatus(null, CurrentDevice.ErrorCount + 1, ex.Message);
return ThreadRunReturn.Continue;
return ThreadRunReturn.None;
}
}

View File

@@ -33,6 +33,17 @@ public abstract class VariablePropertyBase
/// </summary>
public abstract class DriverPropertyBase
{
/// <summary>
/// 离线后恢复运行的间隔时间 /s默认300s
/// </summary>
[DeviceProperty("离线恢复间隔", "离线后恢复运行的间隔时间s默认300s最大3600s")]
public virtual int ReIntervalTime { get; set; } = 300;
/// <summary>
/// 失败重试次数默认3
/// </summary>
[DeviceProperty("失败重试次数", "失败重试次数默认3")]
public virtual int RetryCount { get; set; } = 3;
#region
/// <summary>
@@ -87,4 +98,22 @@ public abstract class DriverPropertyBase
#endregion
}
/// <summary>
/// 插件配置项
/// <para></para>
/// 约定:
/// 如果需要密码输入属性名称中需包含Password字符串
/// <br></br>
/// 使用<see cref="DevicePropertyAttribute"/> 标识所需的配置属性
/// </summary>
public abstract class UpDriverPropertyBase : DriverPropertyBase
{
public override int ReIntervalTime { get; set; } = 300;
public override int RetryCount { get; set; } = 3;
}

View File

@@ -15,7 +15,7 @@ namespace ThingsGateway.Gateway.Application;
/// <summary>
/// <inheritdoc/>
/// </summary>
public class UploadPropertyWithCache : DriverPropertyBase
public class UploadPropertyWithCache : UpDriverPropertyBase
{
/// <summary>
/// 线程循环间隔

View File

@@ -15,7 +15,7 @@ namespace ThingsGateway.Gateway.Application;
/// <summary>
/// <inheritdoc/>
/// </summary>
public class UploadPropertyWithCacheT : DriverPropertyBase
public class UploadPropertyWithCacheT : UpDriverPropertyBase
{
/// <summary>
/// 线程循环间隔

View File

@@ -24,8 +24,10 @@ using Yitter.IdGenerator;
namespace ThingsGateway.Gateway.Application;
[Injection(Proxy = typeof(OperDispatchProxy))]
public class CollectDeviceService : DeviceService<CollectDevice>, ITransient
public class CollectDeviceService : DeviceService<CollectDevice>, ITransient, ICollectDeviceService
{
protected override string DeviceSheetName => ExportHelpers.CollectDeviceSheetName;
public CollectDeviceService(IServiceScopeFactory serviceScopeFactory, IFileService fileService) : base(serviceScopeFactory, fileService)
{
}

View File

@@ -10,7 +10,6 @@
//------------------------------------------------------------------------------
#endregion
using Furion.DependencyInjection;
using Furion.FriendlyException;
using Mapster;
@@ -31,12 +30,11 @@ using Yitter.IdGenerator;
namespace ThingsGateway.Gateway.Application;
[Injection(Proxy = typeof(OperDispatchProxy))]
public abstract class DeviceService<T> : DbRepository<T> where T : Device, new()
public abstract class DeviceService<T> : DbRepository<T>, IDeviceService<T> where T : Device, new()
{
protected readonly IFileService _fileService;
protected readonly IServiceScope _serviceScope;
/// <inheritdoc cref="CollectDeviceService"/>
/// <inheritdoc cref="ICollectDeviceService"/>
public DeviceService(
IServiceScopeFactory serviceScopeFactory,
IFileService fileService
@@ -206,7 +204,7 @@ public abstract class DeviceService<T> : DbRepository<T> where T : Device, new()
var data = await query.ToListAsync();
return await ExportFileAsync(data);
}
protected abstract string DeviceSheetName { get; }
/// <inheritdoc/>
[OperDesc("导出采集设备表", IsRecordPar = false)]
public async Task<MemoryStream> ExportFileAsync(List<T> devDatas = null)
@@ -235,8 +233,8 @@ public abstract class DeviceService<T> : DbRepository<T> where T : Device, new()
}
deviceDicts.TryGetValue(devData.RedundantDeviceId, out var redundantDevice);
//设备实体没有包含插件名称,手动插入
devExport.Add(ExportHelpers.PluginName, devData.PluginName);
////设备实体没有包含插件名称,手动插入
//devExport.Add(ExportHelpers.PluginName, devData.PluginName);
//设备实体没有包含冗余设备名称,手动插入
devExport.Add(ExportHelpers.RedundantDeviceName, redundantDevice?.Name);
@@ -277,7 +275,7 @@ public abstract class DeviceService<T> : DbRepository<T> where T : Device, new()
}
//添加设备页
sheets.Add(ExportHelpers.CollectDeviceSheetName, devExports);
sheets.Add(DeviceSheetName, devExports);
//添加插件属性页
@@ -321,7 +319,7 @@ public abstract class DeviceService<T> : DbRepository<T> where T : Device, new()
var collectDevices = new List<T>();
foreach (var item in input)
{
if (item.Key == ExportHelpers.CollectDeviceSheetName)
if (item.Key == DeviceSheetName)
{
var collectDeviceImports = ((ImportPreviewOutput<T>)item.Value).Data;
collectDevices = collectDeviceImports.Values.Adapt<List<T>>();
@@ -362,7 +360,7 @@ public abstract class DeviceService<T> : DbRepository<T> where T : Device, new()
//单页数据
var rows = stream.Query(useHeaderRow: true, sheetName: sheetName).Cast<IDictionary<string, object>>();
#region sheet
if (sheetName == ExportHelpers.CollectDeviceSheetName)
if (sheetName == DeviceSheetName)
{
int row = 1;
ImportPreviewOutput<T> importPreviewOutput = new();
@@ -376,22 +374,22 @@ public abstract class DeviceService<T> : DbRepository<T> where T : Device, new()
{
var device = ((ExpandoObject)item).ConvertToEntity<T>(true);
#region
//转化插件名称
var hasPlugin = item.TryGetValue(ExportHelpers.PluginName, out var pluginObj);
////转化插件名称
//var hasPlugin = item.TryGetValue(ExportHelpers.PluginName, out var pluginObj);
if (pluginObj == null || !driverPluginFullNameDict.TryGetValue(pluginObj.ToString(), out var plugin))
{
//找不到对应的插件
importPreviewOutput.HasError = true;
importPreviewOutput.Results.Add((row++, false, $"{ExportHelpers.PluginName}不存在"));
return;
}
//if (pluginObj == null || !driverPluginFullNameDict.TryGetValue(pluginObj.ToString(), out var plugin))
//{
// //找不到对应的插件
// importPreviewOutput.HasError = true;
// importPreviewOutput.Results.Add((row++, false, $"{ExportHelpers.PluginName}不存在"));
// return;
//}
//转化冗余设备名称
var hasRedundant = item.TryGetValue(ExportHelpers.PluginName, out var redundantObj);
var hasRedundant = item.TryGetValue(ExportHelpers.RedundantDeviceName, out var redundantObj);
#endregion
//设备ID、冗余设备ID都需要手动补录
if (hasRedundant && deviceDicts.TryGetValue(redundantObj.ToString(), out var rendundantDevice))
if (hasRedundant && redundantObj != null && deviceDicts.TryGetValue(redundantObj.ToString(), out var rendundantDevice))
{
device.RedundantDeviceId = rendundantDevice.Id;
}

View File

@@ -0,0 +1,10 @@

namespace ThingsGateway.Gateway.Application
{
public interface ICollectDeviceService : IDeviceService<CollectDevice>
{
Task CopyDevAndVarAsync(IEnumerable<CollectDevice> input);
Task EditsAsync(List<CollectDevice> input);
Task<IEnumerable<DeviceRunTime>> GetDeviceRuntimeAsync(long devId = 0);
}
}

View File

@@ -0,0 +1,24 @@
using Microsoft.AspNetCore.Components.Forms;
namespace ThingsGateway.Gateway.Application
{
public interface IDeviceService<T> where T : Device, new()
{
Task AddAsync(T input);
Task CopyDevAsync(IEnumerable<T> input);
Task DeleteAsync(params long[] input);
Task EditAsync(DeviceEditInput input);
Task<MemoryStream> ExportFileAsync(List<T> devDatas = null);
Task<MemoryStream> ExportFileAsync(DeviceInput input);
List<T> GetCacheList(bool isMapster);
T GetDeviceById(long Id);
long? GetIdByName(string name);
string GetNameById(long id);
List<DeviceTree> GetTree();
Task ImportAsync(Dictionary<string, ImportPreviewOutputBase> input);
Task<SqlSugarPagedList<T>> PageAsync(DevicePageInput input);
Task<Dictionary<string, ImportPreviewOutputBase>> PreviewAsync(IBrowserFile file);
Task<Dictionary<string, ImportPreviewOutputBase>> PreviewAsync(MemoryStream stream);
void RemoveCache();
}
}

View File

@@ -0,0 +1,9 @@

namespace ThingsGateway.Gateway.Application
{
public interface IUploadDeviceService : IDeviceService<Device>
{
Task EditsAsync(List<Device> input);
IEnumerable<DeviceRunTime> GetDeviceRuntime(long devId = 0);
}
}

View File

@@ -19,8 +19,9 @@ using Microsoft.Extensions.DependencyInjection;
namespace ThingsGateway.Gateway.Application;
[Injection(Proxy = typeof(OperDispatchProxy))]
public class UploadDeviceService : DeviceService<Device>, ITransient
public class UploadDeviceService : DeviceService<Device>, ITransient, IUploadDeviceService
{
protected override string DeviceSheetName => ExportHelpers.UploadDeviceSheetName;
public UploadDeviceService(IServiceScopeFactory serviceScopeFactory, IFileService fileService) : base(serviceScopeFactory, fileService)
{
}

View File

@@ -173,7 +173,7 @@ public class DriverPluginService : ISingleton
}
return plugins;
}, false);
}, true);
return data;
}
}
@@ -270,9 +270,9 @@ public class DriverPluginService : ISingleton
static T GetCustomAttributeRecursive<T>(PropertyInfo property) where T : Attribute
{
var attribute = property.GetCustomAttribute<T>(false);
if (attribute == null && property.DeclaringType.BaseType != null)
if (attribute == null && property.ReflectedType.BaseType != null && property.ReflectedType != typeof(UpDriverPropertyBase))
{
var baseProperty = property.DeclaringType.BaseType.GetProperties().FirstOrDefault(p => p.Name == property.Name);
var baseProperty = property.ReflectedType.BaseType.GetProperties().FirstOrDefault(p => p.Name == property.Name);
if (baseProperty != null)
{
attribute = GetCustomAttributeRecursive<T>(baseProperty);

View File

@@ -0,0 +1,23 @@
using Furion.DependencyInjection;
using Microsoft.AspNetCore.Components.Forms;
namespace ThingsGateway.Gateway.Application;
public interface IVariableService : ITransient
{
Task AddAsync(DeviceVariable input);
Task AddBatchAsync(List<DeviceVariable> input);
Task ClearDeviceVariableAsync();
Task DeleteAsync(params long[] input);
void DeleteVariableFromCache();
Task EditAsync(DeviceVariable input);
Task<MemoryStream> ExportFileAsync(List<DeviceVariable> deviceVariables = null, string deviceName = null);
Task<MemoryStream> ExportFileAsync(VariableInput input);
Task<List<DeviceVariableRunTime>> GetDeviceVariableRuntimeAsync(long devId = 0);
Task<List<DeviceVariableRunTime>> GetMemoryVariableRuntimeAsync();
Task ImportAsync(Dictionary<string, ImportPreviewOutputBase> input);
Task<SqlSugarPagedList<DeviceVariable>> PageAsync(VariablePageInput input);
Task<Dictionary<string, ImportPreviewOutputBase>> PreviewAsync(IBrowserFile file);
Task<Dictionary<string, ImportPreviewOutputBase>> PreviewAsync(MemoryStream stream, List<CollectDevice> memCollectDevices = null, List<Device> memUploadDevices = null);
}

View File

@@ -32,18 +32,18 @@ namespace ThingsGateway.Gateway.Application;
/// <inheritdoc cref="VariableService"/>
[Injection(Proxy = typeof(OperDispatchProxy))]
public class VariableService : DbRepository<DeviceVariable>, ITransient
public class VariableService : DbRepository<DeviceVariable>, IVariableService
{
private readonly CollectDeviceService _collectDeviceService;
private readonly UploadDeviceService _uploadDeviceService;
private readonly ICollectDeviceService _collectDeviceService;
private readonly IUploadDeviceService _uploadDeviceService;
private readonly FileService _fileService;
private readonly IServiceScope _serviceScope;
/// <inheritdoc cref="VariableService"/>
public VariableService(
CollectDeviceService collectDeviceService,
ICollectDeviceService collectDeviceService,
FileService fileService,
UploadDeviceService uploadDeviceService,
IUploadDeviceService uploadDeviceService,
IServiceScopeFactory scopeFactory)
{
_serviceScope = scopeFactory.CreateScope();

View File

@@ -12,6 +12,8 @@
using Microsoft.Extensions.DependencyInjection;
using System.Reflection;
namespace ThingsGateway.Gateway.Application;
/// <summary>
@@ -42,6 +44,9 @@ public class Startup : AppStartup
services.AddHostedService<CollectDeviceWorker>();
services.AddHostedService<AlarmWorker>();
services.AddHostedService<UploadDeviceWorker>();
ThingsGateway.Core.TypeExtensions.DefaultFuncs.Add(a => a.GetCustomAttribute<VariablePropertyAttribute>()?.Description);
}

View File

@@ -8,13 +8,21 @@
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<!--kafka在某些系统中出现无法动态加载资源的情况需要手动拷贝到主程序下所以这里直接引用native内容发布会自动生成-->
<PackageReference Include="Confluent.Kafka" Version="2.3.0">
<Private>false</Private>
<CopyLocalSatelliteAssemblies>false</CopyLocalSatelliteAssemblies>
<IncludeAssets> native; </IncludeAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<PackageReference Include="LiteDB" Version="5.0.17" />
<PackageReference Include="Hardware.Info" Version="100.0.0" />
<PackageReference Include="CS-Script" Version="4.8.8" />
<PackageReference Include="Hardware.Info" Version="100.0.0.1" />
<PackageReference Include="CodingSeb.ExpressionEvaluator" Version="1.4.40" />
<PackageReference Include="CS-Script" Version="4.8.10" />
<!--CS-Script与Furion冲突直接安装覆盖版本-->
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="4.7.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="4.8.0" />
<PackageReference Include="SqlSugar.TDengineCore" Version="3.4.0" />
</ItemGroup>

View File

@@ -23,7 +23,7 @@ namespace ThingsGateway.Gateway.Application;
/// </summary>
public class CollectDeviceWorker : DeviceWorker
{
private GlobalDeviceData _globalDeviceData;
public CollectDeviceWorker(IServiceScopeFactory serviceScopeFactory, IHostApplicationLifetime appLifetime) : base(serviceScopeFactory, appLifetime)
{
_logger = _serviceScope.ServiceProvider.GetService<ILoggerFactory>().CreateLogger("南向设备服务");
@@ -49,6 +49,10 @@ public class CollectDeviceWorker : DeviceWorker
await StopOtherHostService();
//停止全部采集线程
await RemoveAllDeviceThreadAsync();
//清空内存列表
_globalDeviceData.CollectDevices.Clear();
//创建全部采集线程
await CreatAllDeviceThreadsAsync();
//开始其他后台服务
@@ -101,7 +105,7 @@ public class CollectDeviceWorker : DeviceWorker
if (!_stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("正在获取南向设备组态信息");
var collectDeviceRunTimes = (await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetDeviceRuntimeAsync());
var collectDeviceRunTimes = (await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetDeviceRuntimeAsync());
_logger.LogInformation("获取南向设备组态信息完成");
foreach (var collectDeviceRunTime in collectDeviceRunTimes.Where(a => !collectDeviceRunTimes.Any(b => a.Id == b.RedundantDeviceId && b.IsRedundant)))
{
@@ -125,7 +129,7 @@ public class CollectDeviceWorker : DeviceWorker
protected override async Task<IEnumerable<DeviceRunTime>> GetDeviceRunTimeAsync(long devId)
{
return await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetDeviceRuntimeAsync(devId);
return await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetDeviceRuntimeAsync(devId);
}
#endregion
@@ -139,7 +143,7 @@ public class CollectDeviceWorker : DeviceWorker
/// <returns></returns>
public List<string> GetDeviceMethods(long devId)
{
var pluginName = _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetDeviceById(devId).PluginName;
var pluginName = _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetDeviceById(devId).PluginName;
var driverBase = _driverPluginService.GetDriver(pluginName);
var Propertys = _driverPluginService.GetDriverMethodInfo(driverBase);
driverBase?.SafeDispose();
@@ -158,7 +162,7 @@ public class CollectDeviceWorker : DeviceWorker
var Propertys = _driverPluginService.GetDriverProperties(driverBase);
if (devId != 0)
{
var collectDevice = _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetDeviceById(devId);
var collectDevice = _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetDeviceById(devId);
collectDevice?.DevicePropertys?.ForEach(it =>
{
var dependencyProperty = Propertys.FirstOrDefault(a => a.PropertyName == it.PropertyName);
@@ -197,10 +201,13 @@ public class CollectDeviceWorker : DeviceWorker
{
await _easyLock?.WaitAsync();
_driverPluginService = _serviceScope.ServiceProvider.GetService<DriverPluginService>();
_globalDeviceData = _serviceScope.ServiceProvider.GetService<GlobalDeviceData>();
//重启采集线程,会启动其他后台服务
await RestartDeviceThreadAsync();
await WhileExecuteAsync(stoppingToken);
}
protected virtual async Task WhileExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
@@ -224,17 +231,17 @@ public class CollectDeviceWorker : DeviceWorker
if (driverBase.CurrentDevice.DeviceStatus == DeviceStatusEnum.OffLine)
{
if (driverBase.CurrentDevice.IsRedundant && _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetCacheList(false).Any(a => a.Id == driverBase.CurrentDevice.RedundantDeviceId))
if (driverBase.CurrentDevice.IsRedundant && _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetCacheList(false).Any(a => a.Id == driverBase.CurrentDevice.RedundantDeviceId))
{
await DeviceRedundantThreadAsync(driverBase.CurrentDevice.Id);
}
}
//超过30分钟或者(初始化失败并超过10分钟)会重启
if (
(driverBase.CurrentDevice.ActiveTime != DateTime.MinValue &&
driverBase.CurrentDevice.ActiveTime.AddMinutes(30) <= DateTimeExtensions.CurrentDateTime)
|| (driverBase.IsInitSuccess == false && driverBase.CurrentDevice.ActiveTime.AddMinutes(10) <= DateTimeExtensions.CurrentDateTime)
driverBase.CurrentDevice.ActiveTime.AddSeconds(CheckIntervalTime) <= DateTimeExtensions.CurrentDateTime)
|| (driverBase.IsInitSuccess == false && driverBase.CurrentDevice.ActiveTime.AddMinutes(CheckIntervalTime) <= DateTimeExtensions.CurrentDateTime)
)
{
//如果线程处于暂停状态,跳过

View File

@@ -49,7 +49,7 @@ public abstract class DeviceWorker : BackgroundService
/// </summary>
public List<DriverBase> DriverBases => _deviceThreads
.Where(a => a.DriverBases.Any(b => b.CurrentDevice != null))
.SelectMany(a => a.DriverBases).ToList();
.SelectMany(a => a.DriverBases).OrderByDescending(a => a.CurrentDevice.DeviceStatus).ToList();
/// <summary>
/// 设备子线程列表
@@ -381,7 +381,10 @@ public abstract class DeviceWorker : BackgroundService
}
}
/// <summary>
/// 线程检查时间120分钟
/// </summary>
public const int CheckIntervalTime = 7200;
protected abstract Task StartOtherHostService();
protected abstract Task StopOtherHostService();

View File

@@ -100,7 +100,7 @@ public class UploadDeviceWorker : DeviceWorker
if (!_stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("正在获取北向设备组态信息");
var deviceRunTimes = (_serviceScope.ServiceProvider.GetService<UploadDeviceService>().GetDeviceRuntime());
var deviceRunTimes = (_serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetDeviceRuntime());
_logger.LogInformation("获取北向设备组态信息完成");
foreach (var uploadDeviceRunTime in deviceRunTimes.Where(a => !deviceRunTimes.Any(b => a.Id == b.RedundantDeviceId && b.IsRedundant)))
{
@@ -135,7 +135,7 @@ public class UploadDeviceWorker : DeviceWorker
/// <returns></returns>
public List<string> GetDeviceMethods(long devId)
{
var pluginName = _serviceScope.ServiceProvider.GetService<UploadDeviceService>().GetDeviceById(devId).PluginName;
var pluginName = _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetDeviceById(devId).PluginName;
var driverBase = _driverPluginService.GetDriver(pluginName);
var Propertys = _driverPluginService.GetDriverMethodInfo(driverBase);
driverBase?.SafeDispose();
@@ -154,7 +154,7 @@ public class UploadDeviceWorker : DeviceWorker
var Propertys = _driverPluginService.GetDriverProperties(driverBase);
if (devId != 0)
{
var uploadDevice = _serviceScope.ServiceProvider.GetService<UploadDeviceService>().GetDeviceById(devId);
var uploadDevice = _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetDeviceById(devId);
uploadDevice?.DevicePropertys?.ForEach(it =>
{
var dependencyProperty = Propertys.FirstOrDefault(a => a.PropertyName == it.PropertyName);
@@ -237,7 +237,7 @@ public class UploadDeviceWorker : DeviceWorker
if (driverBase.CurrentDevice.DeviceStatus == DeviceStatusEnum.OffLine)
{
if (driverBase.CurrentDevice.IsRedundant && _serviceScope.ServiceProvider.GetService<UploadDeviceService>().GetCacheList(false).Any(a => a.Id == driverBase.CurrentDevice.RedundantDeviceId))
if (driverBase.CurrentDevice.IsRedundant && _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetCacheList(false).Any(a => a.Id == driverBase.CurrentDevice.RedundantDeviceId))
{
await DeviceRedundantThreadAsync(driverBase.CurrentDevice.Id);
}
@@ -245,11 +245,11 @@ public class UploadDeviceWorker : DeviceWorker
//超过30分钟或者(初始化失败并超过10分钟)会重启
if (
(driverBase.CurrentDevice.ActiveTime != DateTime.MinValue &&
driverBase.CurrentDevice.ActiveTime.AddMinutes(30) <= DateTimeExtensions.CurrentDateTime)
|| (driverBase.IsInitSuccess == false && driverBase.CurrentDevice.ActiveTime.AddMinutes(10) <= DateTimeExtensions.CurrentDateTime)
driverBase.CurrentDevice.ActiveTime.AddMinutes(CheckIntervalTime) <= DateTimeExtensions.CurrentDateTime)
|| (driverBase.IsInitSuccess == false && driverBase.CurrentDevice.ActiveTime.AddMinutes(CheckIntervalTime) <= DateTimeExtensions.CurrentDateTime)
)
{
//如果线程处于暂停状态,跳过
@@ -307,7 +307,7 @@ public class UploadDeviceWorker : DeviceWorker
protected override Task<IEnumerable<DeviceRunTime>> GetDeviceRunTimeAsync(long devId)
{
return Task.FromResult(_serviceScope.ServiceProvider.GetService<UploadDeviceService>().GetDeviceRuntime(devId));
return Task.FromResult(_serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetDeviceRuntime(devId));
}
#endregion

View File

@@ -34,7 +34,7 @@ public partial class BackendLogPage
var confirm = await PopupService.OpenConfirmDialogAsync("删除", "确定 ?");
if (confirm)
{
await _serviceScope.ServiceProvider.GetService<BackendLogService>().DeleteAsync();
await _serviceScope.ServiceProvider.GetService<IBackendLogService>().DeleteAsync();
await _datatable?.QueryClickAsync();
}
}
@@ -46,7 +46,7 @@ public partial class BackendLogPage
private async Task<ISqlSugarPagedList<BackendLog>> QueryCallAsync(BackendLogPageInput input)
{
var data = await _serviceScope.ServiceProvider.GetService<BackendLogService>().PageAsync(input);
var data = await _serviceScope.ServiceProvider.GetService<IBackendLogService>().PageAsync(input);
return data;
}
}

View File

@@ -35,7 +35,7 @@ public partial class CollectDevicePage : BaseComponentBase
List<CollectDevice> _devices = new();
List<DriverPlugin> _driverPlugins;
ImportExcel _importExcel;
string _searchName;
//string _searchName;
[Inject]
AjaxService _ajaxService { get; set; }
[Inject]
@@ -62,18 +62,18 @@ public partial class CollectDevicePage : BaseComponentBase
return;
}
}
data ??= _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetCacheList(true);
data ??= _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetCacheList(true);
foreach (var device in data)
{
device.DevicePropertys = GetDriverProperties(device.PluginName, device.Id);
}
await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().EditsAsync(data);
await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().EditsAsync(data);
await PopupService.EnqueueSnackbarAsync("刷新成功", AlertTypes.Success);
}
private async Task AddCallAsync(DeviceAddInput input)
{
await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().AddAsync(input);
await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().AddAsync(input);
Refresh();
await _mainLayout.StateHasChangedAsync();
}
@@ -85,7 +85,7 @@ public partial class CollectDevicePage : BaseComponentBase
return;
}
await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().CopyDevAndVarAsync(data);
await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().CopyDevAndVarAsync(data);
await DatatableQueryAsync();
await PopupService.EnqueueSnackbarAsync("复制成功", AlertTypes.Success);
await _mainLayout.StateHasChangedAsync();
@@ -99,7 +99,7 @@ public partial class CollectDevicePage : BaseComponentBase
return;
}
await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().CopyDevAsync(data);
await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().CopyDevAsync(data);
await DatatableQueryAsync();
await PopupService.EnqueueSnackbarAsync("复制成功", AlertTypes.Success);
await _mainLayout.StateHasChangedAsync();
@@ -112,14 +112,14 @@ public partial class CollectDevicePage : BaseComponentBase
private async Task DeleteCallAsync(IEnumerable<CollectDevice> input)
{
await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().DeleteAsync(input.Select(a => a.Id).ToArray());
await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().DeleteAsync(input.Select(a => a.Id).ToArray());
Refresh();
await _mainLayout.StateHasChangedAsync();
}
Task<Dictionary<string, ImportPreviewOutputBase>> DeviceImportAsync(IBrowserFile file)
{
return _serviceScope.ServiceProvider.GetService<CollectDeviceService>().PreviewAsync(file);
return _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().PreviewAsync(file);
}
async Task DownExportAsync(DevicePageInput input = null)
@@ -148,8 +148,8 @@ public partial class CollectDevicePage : BaseComponentBase
private async Task EditCallAsync(DeviceEditInput input)
{
await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().EditAsync(input);
_devices = _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetCacheList(true);
await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().EditAsync(input);
_devices = _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetCacheList(true);
_deviceGroups = _devices?.Select(a => a.DeviceGroup)?.Where(a => a != null).Distinct()?.ToList();
await _mainLayout.StateHasChangedAsync();
}
@@ -161,19 +161,19 @@ public partial class CollectDevicePage : BaseComponentBase
private async Task<ISqlSugarPagedList<CollectDevice>> QueryCallAsync(DevicePageInput input)
{
var data = await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().PageAsync(input);
var data = await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().PageAsync(input);
return data;
}
private void Refresh()
{
_devices = _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetCacheList(true);
_devices = _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetCacheList(true);
_deviceGroups = _devices?.Select(a => a.DeviceGroup)?.Where(a => a != null).Distinct()?.ToList();
}
async Task SaveDeviceImportAsync(Dictionary<string, ImportPreviewOutputBase> data)
{
await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().ImportAsync(data);
await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().ImportAsync(data);
await DatatableQueryAsync();
_importExcel.IsShowImport = false;
await _mainLayout.StateHasChangedAsync();

View File

@@ -52,7 +52,7 @@
<MCard Class="ma-2" Style=@($"height: calc(100vh - {BlazorResourceConst.DefaultHeight + 80}px );")>
<MCardTitle>
<MTextField Dense Style="max-width:200px;" HideDetails=@("auto") Class="mx-2 my-1" @bind-Value="_collectDeviceGroupSearchName"
<MTextField Dense Style="max-width:200px;" HideDetails=@("auto") Class="mx-2 my-1" @bind-Value="_collectDeviceSearchName"
Outlined Label=@typeof(CollectDevice).GetDescription(nameof(CollectDevice.DeviceGroup)) />
</MCardTitle>
@@ -64,7 +64,7 @@
}
} )
Items="_collectDeviceGroups" ItemText="r=>r" ItemChildren="r=>null"
Search="@_collectDeviceGroupSearchName"
Search="@_collectDeviceSearchName"
Activatable ItemKey=@(r=>r)>
<LabelContent>
<span title=@context.Item>
@@ -77,10 +77,10 @@
<MCol Md=5 Cols="12">
<MCard Height=@($"calc(100vh - {BlazorResourceConst.DefaultHeight + 80}px; )") Style="overflow-y:auto;" Flat Class="ml-2 my-4">
<MTextField Dense Style="max-width:200px;" HideDetails=@("auto") Class="mx-2 my-1" @bind-Value="_collectDeviceGroupSearchName"
Outlined Label=@typeof(CollectDevice).GetDescription(nameof(CollectDevice.DeviceGroup)) />
<MTextField Dense Style="max-width:200px;" HideDetails=@("auto") Class="mx-2 my-1" @bind-Value="_collectDeviceSearchName"
Outlined Label=@typeof(CollectDevice).GetDescription(nameof(CollectDevice.Name)) />
<MVirtualScroll Context="item" Height=@($"calc(100vh - {BlazorResourceConst.DefaultHeight+140}px)") OverscanCount=2 ItemSize="60" Items="_collectDriverBases.WhereIF(!_collectDeviceGroupSearchName.IsNullOrEmpty(),a=>a.CurrentDevice.DeviceGroup==_collectDeviceGroupSearchName).ToList()">
<MVirtualScroll Context="item" Height=@($"calc(100vh - {BlazorResourceConst.DefaultHeight+140}px)") OverscanCount=2 ItemSize="60" Items="_collectDriverBases.WhereIF(!_collectDeviceSearchName.IsNullOrEmpty(),a=>a.CurrentDevice.Name.Contains(_collectDeviceSearchName)).ToList()">
<ItemContent>
@if (item.CurrentDevice != null)
@@ -255,7 +255,7 @@
@* <MCol Md=2 Cols="12">
<MCard Class="ma-2" Style=@($"height: calc(100vh - {BlazorResourceConst.DefaultHeight + 80}px); )")>
<MCardTitle>
<MTextField Dense Style="max-width:200px;" HideDetails=@("auto") Class="mx-2 my-1" @bind-Value="_uploadDeviceGroupSearchName"
<MTextField Dense Style="max-width:200px;" HideDetails=@("auto") Class="mx-2 my-1" @bind-Value="_uploadDeviceSearchName"
Outlined Label=@typeof(Device).GetDescription(nameof(Device.DeviceGroup)) />
</MCardTitle>
<MTreeview Style=@($"height: calc(100vh - {BlazorResourceConst.DefaultHeight+240}px);overflow-y:auto") Dense TItem="string" TKey="string" ActiveChanged=@(async a=>
@@ -267,7 +267,7 @@
}
} )
Items="_uploadDeviceGroups" ItemText="r=>r" ItemChildren="r=>null"
Search="@_uploadDeviceGroupSearchName"
Search="@_uploadDeviceSearchName"
Activatable ItemKey=@(r=>r)>
<LabelContent>
<span title=@context.Item>
@@ -279,10 +279,10 @@
</MCol> *@
<MCol Md=5 Cols="12">
<MCard Height=@($"calc(100vh - {BlazorResourceConst.DefaultHeight+80}px)") Style="overflow-y:auto;" Flat Class="ml-2 my-4">
<MTextField Dense Style="max-width:200px;" HideDetails=@("auto") Class="mx-2 my-1" @bind-Value="_uploadDeviceGroupSearchName"
Outlined Label=@typeof(CollectDevice).GetDescription(nameof(CollectDevice.DeviceGroup)) />
<MTextField Dense Style="max-width:200px;" HideDetails=@("auto") Class="mx-2 my-1" @bind-Value="_uploadDeviceSearchName"
Outlined Label=@typeof(CollectDevice).GetDescription(nameof(CollectDevice.Name)) />
<MVirtualScroll Context="item" Height=@($"calc(100vh - {BlazorResourceConst.DefaultHeight+140}px)") OverscanCount=2 ItemSize="60" Items="_uploadDriverBases.WhereIF(!_uploadDeviceGroupSearchName.IsNullOrEmpty(),a=>a.CurrentDevice.DeviceGroup==_uploadDeviceGroupSearchName).ToList()">
<MVirtualScroll Context="item" Height=@($"calc(100vh - {BlazorResourceConst.DefaultHeight+140}px)") OverscanCount=2 ItemSize="60" Items="_uploadDriverBases.WhereIF(!_uploadDeviceSearchName.IsNullOrEmpty(),a=>a.CurrentDevice.Name.Contains(_uploadDeviceSearchName)).ToList()">
<ItemContent>
@if (item.CurrentDevice != null)

View File

@@ -12,8 +12,6 @@
using BlazorComponent;
using Mapster;
using Masa.Blazor;
using Microsoft.AspNetCore.Components;
@@ -30,10 +28,11 @@ namespace ThingsGateway.Gateway.Blazor;
public partial class DeviceStatusPage : IDisposable
{
readonly PeriodicTimer _periodicTimer = new(TimeSpan.FromSeconds(3));
private string _collectDeviceGroup;
private bool _isShowDetailUI;
List<string> _collectDeviceGroups = new();
string _collectDeviceGroupSearchName;
//List<string> _collectDeviceGroups = new();
//string _collectDeviceGroupSearchName;
//private string _collectDeviceSearchName;
string _collectDeviceSearchName;
List<CollectBase> _collectDriverBases = new();
CollectBase _collectDriverItem;
BootstrapDynamicComponent _driverComponent;
@@ -42,9 +41,10 @@ public partial class DeviceStatusPage : IDisposable
bool _isAllRestart;
bool _isRestart;
StringNumber _tabNumber;
private string _uploadDeviceGroup;
List<string> _uploadDeviceGroups = new();
string _uploadDeviceGroupSearchName;
//private string _uploadDeviceSearchName;
//List<string> _uploadDeviceGroups = new();
//string _uploadDeviceGroupSearchName;
string _uploadDeviceSearchName;
List<DriverBase> _uploadDriverBases = new();
DriverBase _uploadDriverItem;
AlarmWorker _alarmWorker { get; set; }
@@ -121,8 +121,8 @@ public partial class DeviceStatusPage : IDisposable
void CollectDeviceQuery()
{
_collectDeviceGroups = _globalDeviceData.CollectDevices.Adapt<List<CollectDevice>>()?.Select(a => a.DeviceGroup)?.Where(a => a != null).Distinct()?.ToList() ?? new();
_collectDriverBases = _collectDeviceWorker?.DriverBases?.WhereIF(!_collectDeviceGroup.IsNullOrEmpty(), a => a.CurrentDevice?.DeviceGroup == _collectDeviceGroup).Select(a => (CollectBase)a).ToList() ?? new();
//_collectDeviceGroups = _globalDeviceData.CollectDevices?.Select(a => a.DeviceGroup)?.Where(a => !a.IsNullOrEmpty()).Distinct()?.ToList() ?? new();
_collectDriverBases = _collectDeviceWorker?.DriverBases?.WhereIF(!_collectDeviceSearchName.IsNullOrEmpty(), a => a.CurrentDevice?.Name.Contains(_collectDeviceSearchName) == true).Select(a => (CollectBase)a).ToList() ?? new();
}
async Task DeviceRedundantThreadAsync(long devId)
{
@@ -207,10 +207,6 @@ public partial class DeviceStatusPage : IDisposable
{
try
{
{
_collectDeviceGroups = _globalDeviceData.CollectDevices.Adapt<List<CollectDevice>>()?.Select(a => a.DeviceGroup)?.Where(a => a != null).Distinct()?.ToList() ?? new();
_collectDriverBases = _collectDeviceWorker?.DriverBases?.WhereIF(!_collectDeviceGroup.IsNullOrEmpty(), a => a.CurrentDevice?.DeviceGroup == _collectDeviceGroup).Select(a => (CollectBase)a).ToList() ?? new();
}
if (_collectDriverBases?.FirstOrDefault()?.CurrentDevice == null || _collectDeviceWorker?.DriverBases.Count != _collectDriverBases.Count)
{
CollectDeviceQuery();
@@ -248,8 +244,8 @@ public partial class DeviceStatusPage : IDisposable
void UploadDeviceQuery()
{
_uploadDeviceGroups = _uploadDeviceWorker.DriverBases.Select(a => a.CurrentDevice)?.Select(a => a.DeviceGroup)?.Where(a => a != null).Distinct()?.ToList() ?? new();
_uploadDriverBases = _uploadDeviceWorker?.DriverBases?.WhereIF(!_uploadDeviceGroup.IsNullOrEmpty(), a => a.CurrentDevice?.DeviceGroup == _uploadDeviceGroup).ToList() ?? new();
//_uploadDeviceGroups = _uploadDeviceWorker.DriverBases.Select(a => a.CurrentDevice)?.Select(a => a.DeviceGroup)?.Where(a => a != null).Distinct()?.ToList() ?? new();
_uploadDriverBases = _uploadDeviceWorker?.DriverBases?.WhereIF(!_uploadDeviceSearchName.IsNullOrEmpty(), a => a.CurrentDevice?.Name.Contains(_uploadDeviceSearchName) == true).ToList() ?? new();
}
async Task UpRestartAsync(long devId)
{

View File

@@ -161,7 +161,7 @@ else
case nameof(context.Item.DeviceId):
<span title=@context.Value>
@(
_serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetNameById(context.Item.DeviceId)
_serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetNameById(context.Item.DeviceId)
)
</span>
break;
@@ -193,7 +193,7 @@ else
</td>
<td class="text-start ">
<div style="word-break:break-all; white-space:pre-wrap;">
@(_serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetNameById(context.Item2.ToLong()))
@(_serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetNameById(context.Item2.ToLong()))
</div>
</td>
</tr>

View File

@@ -32,7 +32,7 @@ public partial class DeviceVariablePage
ImportExcel _importExcel;
Dictionary<long, List<string>> _otherMethods = new();
string _searchName;
//string _searchName;
List<Device> _uploadDevices = new();
@@ -46,9 +46,9 @@ public partial class DeviceVariablePage
/// <returns></returns>
protected override async Task OnParametersSetAsync()
{
_collectDevices = _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetCacheList(true);
_uploadDevices = _serviceScope.ServiceProvider.GetService<UploadDeviceService>().GetCacheList(true);
_deviceGroups = _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetTree();
_collectDevices = _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetCacheList(true);
_uploadDevices = _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetCacheList(true);
_deviceGroups = _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetTree();
await base.OnParametersSetAsync();
}

View File

@@ -135,7 +135,7 @@ else
</td>
<td class="text-start ">
<div style="word-break:break-all; white-space:pre-wrap;">
@(_serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetNameById(context.Item2.ToLong()))
@(_serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetNameById(context.Item2.ToLong()))
</div>
</td>
</tr>

View File

@@ -34,7 +34,7 @@ public partial class DeviceVariableRunTimePage
private IAppDataTable _datatable;
private List<DeviceTree> _deviceGroups = new();
private EventCallback<string> _onWrite;
private string _searchName;
//private string _searchName;
/// <summary>
/// 设备名称
/// </summary>
@@ -140,7 +140,7 @@ public partial class DeviceVariableRunTimePage
private async Task<ISqlSugarPagedList<DeviceVariableRunTime>> QueryCallAsync(VariablePageInput input)
{
var uploadDevId = _serviceScope.ServiceProvider.GetService<UploadDeviceService>().GetIdByName(input.UploadDeviceName);
var uploadDevId = _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetIdByName(input.UploadDeviceName);
var data = _globalDeviceData.AllVariables
.WhereIF(!input.DeviceName.IsNullOrEmpty(), a => a.DeviceName == input.DeviceName)
.WhereIF(!input.Name.IsNullOrEmpty(), a => a.Name.Contains(input.Name))

View File

@@ -32,7 +32,7 @@ public partial class RpcLogPage
var confirm = await PopupService.OpenConfirmDialogAsync("删除", "确定 ?");
if (confirm)
{
await _serviceScope.ServiceProvider.GetService<RpcLogService>().DeleteAsync();
await _serviceScope.ServiceProvider.GetService<IRpcLogService>().DeleteAsync();
await _datatable?.QueryClickAsync();
}
}
@@ -50,7 +50,7 @@ public partial class RpcLogPage
private async Task<ISqlSugarPagedList<RpcLog>> QueryCallAsync(RpcLogPageInput input)
{
var data = await _serviceScope.ServiceProvider.GetService<RpcLogService>().PageAsync(input);
var data = await _serviceScope.ServiceProvider.GetService<IRpcLogService>().PageAsync(input);
return data;
}
}

View File

@@ -35,7 +35,7 @@ public partial class UploadDevicePage
List<Device> _devices = new();
List<DriverPlugin> _driverPlugins;
ImportExcel _importExcel;
string _searchName;
//string _searchName;
[Inject]
AjaxService _ajaxService { get; set; }
[Inject]
@@ -54,7 +54,7 @@ public partial class UploadDevicePage
private async Task AddCallAsync(DeviceAddInput input)
{
await _serviceScope.ServiceProvider.GetService<UploadDeviceService>().AddAsync(input);
await _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().AddAsync(input);
Refresh();
await _mainLayout.StateHasChangedAsync();
}
@@ -68,12 +68,12 @@ public partial class UploadDevicePage
return;
}
}
data ??= _serviceScope.ServiceProvider.GetService<UploadDeviceService>().GetCacheList(true);
data ??= _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetCacheList(true);
foreach (var device in data)
{
device.DevicePropertys = GetDriverProperties(device.PluginName, device.Id);
}
await _serviceScope.ServiceProvider.GetService<UploadDeviceService>().EditsAsync(data);
await _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().EditsAsync(data);
await PopupService.EnqueueSnackbarAsync("刷新成功", AlertTypes.Success);
}
@@ -85,7 +85,7 @@ public partial class UploadDevicePage
return;
}
await _serviceScope.ServiceProvider.GetService<UploadDeviceService>().CopyDevAsync(data);
await _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().CopyDevAsync(data);
await DatatableQueryAsync();
await PopupService.EnqueueSnackbarAsync("复制成功", AlertTypes.Success);
await _mainLayout.StateHasChangedAsync();
@@ -98,14 +98,14 @@ public partial class UploadDevicePage
private async Task DeleteCallAsync(IEnumerable<Device> input)
{
await _serviceScope.ServiceProvider.GetService<UploadDeviceService>().DeleteAsync(input.Select(a => a.Id).ToArray());
await _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().DeleteAsync(input.Select(a => a.Id).ToArray());
Refresh();
await _mainLayout.StateHasChangedAsync();
}
Task<Dictionary<string, ImportPreviewOutputBase>> DeviceImportAsync(IBrowserFile file)
{
return _serviceScope.ServiceProvider.GetService<UploadDeviceService>().PreviewAsync(file);
return _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().PreviewAsync(file);
}
async Task DownExportAsync(DevicePageInput input = null)
@@ -134,8 +134,8 @@ public partial class UploadDevicePage
private async Task EditCallAsync(DeviceEditInput input)
{
await _serviceScope.ServiceProvider.GetService<UploadDeviceService>().EditAsync(input);
_devices = _serviceScope.ServiceProvider.GetService<UploadDeviceService>().GetCacheList(true);
await _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().EditAsync(input);
_devices = _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetCacheList(true);
_deviceGroups = _devices?.Select(a => a.DeviceGroup)?.Where(a => a != null).Distinct()?.ToList();
await _mainLayout.StateHasChangedAsync();
}
@@ -147,19 +147,19 @@ public partial class UploadDevicePage
private async Task<ISqlSugarPagedList<Device>> QueryCallAsync(DevicePageInput input)
{
var data = await _serviceScope.ServiceProvider.GetService<UploadDeviceService>().PageAsync(input);
var data = await _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().PageAsync(input);
return data;
}
private void Refresh()
{
_devices = _serviceScope.ServiceProvider.GetService<UploadDeviceService>().GetCacheList(true);
_devices = _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetCacheList(true);
_deviceGroups = _devices?.Select(a => a.DeviceGroup)?.Where(a => a != null).Distinct()?.ToList();
}
async Task SaveDeviceImportAsync(Dictionary<string, ImportPreviewOutputBase> data)
{
await _serviceScope.ServiceProvider.GetService<UploadDeviceService>().ImportAsync(data);
await _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().ImportAsync(data);
await DatatableQueryAsync();
_importExcel.IsShowImport = false;
await _mainLayout.StateHasChangedAsync();

View File

@@ -2,7 +2,6 @@
<ItemGroup>
<ProjectReference Include="..\..\admin\ThingsGateway.Admin.Blazor\ThingsGateway.Admin.Blazor.csproj" />
<ProjectReference Include="..\..\admin\ThingsGateway.Components\ThingsGateway.Components.csproj" />
<ProjectReference Include="..\ThingsGateway.Gateway.Application\ThingsGateway.Gateway.Application.csproj" />
</ItemGroup>
</Project>

View File

@@ -1,9 +1,5 @@
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<PackageReference Include="CodingSeb.ExpressionEvaluator" Version="1.4.40" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\admin\ThingsGateway.Admin.Core\ThingsGateway.Admin.Core.csproj" />
</ItemGroup>

View File

@@ -1,16 +1,6 @@
<Project>
<Import Project="$(SolutionDir)\Directory.Build.props" />
<PropertyGroup>
<Version>4.0.0.4</Version>
<LangVersion>latest</LangVersion>
<ImplicitUsings>enable</ImplicitUsings>
<TargetFrameworks>net6.0;net8.0;</TargetFrameworks>
<Authors>Diego</Authors>
<Product>ThingsGateway</Product>
<Copyright>© 2023-present Diego</Copyright>
<RepositoryUrl>https://gitee.com/diego2098/ThingsGateway</RepositoryUrl>
<SignAssembly>True</SignAssembly>
<DelaySign>False</DelaySign>
<SatelliteResourceLanguages>zh-Hans</SatelliteResourceLanguages>
</PropertyGroup>

View File

@@ -71,8 +71,8 @@ public class DLT645_2007OverTcpProperty : DriverPropertyBase
/// <summary>
/// 组包缓存超时ms
/// </summary>
[DeviceProperty("组包缓存超时", "某些设备性能较弱报文间需要间隔较长时间可以设置更长的组包缓存默认1s")]
public int CacheTimeout { get; set; } = 1;
[DeviceProperty("组包缓存超时", "某些设备性能较弱报文间需要间隔较长时间可以设置更长的组包缓存默认1000ms")]
public int CacheTimeout { get; set; } = 1000;
/// <summary>
/// 共享链路
/// </summary>

View File

@@ -12,14 +12,10 @@
<Compile Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\DriverDebugUIPage.razor.cs" Link="DebugPage\DriverDebugUIPage.razor.cs" />
<Compile Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\SerialSessionPage.razor.cs" Link="DebugPage\SerialSessionPage.razor.cs" />
<Compile Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\TcpClientPage.razor.cs" Link="DebugPage\TcpClientPage.razor.cs" />
<Compile Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\TcpServerPage.razor.cs" Link="DebugPage\TcpServerPage.razor.cs" />
<Compile Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\UdpSessionPage.razor.cs" Link="DebugPage\UdpSessionPage.razor.cs" />
<Content Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\DriverDebugUIPage.razor" Link="DebugPage\DriverDebugUIPage.razor" />
<Content Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\SerialSessionPage.razor" Link="DebugPage\SerialSessionPage.razor" />
<Content Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\TcpClientPage.razor" Link="DebugPage\TcpClientPage.razor" />
<Content Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\TcpServerPage.razor" Link="DebugPage\TcpServerPage.razor" />
<Content Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\UdpSessionPage.razor" Link="DebugPage\UdpSessionPage.razor" />
</ItemGroup>
@@ -30,7 +26,7 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\gateway\ThingsGateway.Gateway.Blazor\ThingsGateway.Gateway.Blazor.csproj" >
<ProjectReference Include="..\..\gateway\ThingsGateway.Gateway.Blazor\ThingsGateway.Gateway.Blazor.csproj">
<Private>false</Private>
<CopyLocalSatelliteAssemblies>false</CopyLocalSatelliteAssemblies>
<ExcludeAssets>runtime</ExcludeAssets>

View File

@@ -69,18 +69,19 @@ public partial class KafkaProducer : UpLoadBaseWithCacheT<DeviceData, VariableDa
#region Kafka
Enum.TryParse<SecurityProtocol>(_driverPropertys.SecurityProtocol, out var SecurityProtocol);
Enum.TryParse<SaslMechanism>(_driverPropertys.SaslMechanism, out var SaslMechanism);
//1、生产者配置
producerconfig = new ProducerConfig
{
BootstrapServers = _driverPropertys.BootStrapServers,
SecurityProtocol = SecurityProtocol,
SaslMechanism = SaslMechanism,
SaslUsername = _driverPropertys.SaslUsername,
SaslPassword = _driverPropertys.SaslPassword,
SecurityProtocol = _driverPropertys.SecurityProtocol,
SaslMechanism = _driverPropertys.SaslMechanism,
};
if (!string.IsNullOrEmpty(_driverPropertys.SaslUsername))
producerconfig.SaslUsername = _driverPropertys.SaslUsername;
if (!string.IsNullOrEmpty(_driverPropertys.SaslPassword))
producerconfig.SaslPassword = _driverPropertys.SaslPassword;
//2、创建生产者
producerBuilder = new ProducerBuilder<Null, string>(producerconfig);
@@ -123,7 +124,14 @@ public partial class KafkaProducer : UpLoadBaseWithCacheT<DeviceData, VariableDa
osStr += RuntimeInformation.ProcessArchitecture.ToString().ToLower();
var pathToLibrd = System.IO.Path.Combine(Directory, "runtimes", osStr, "native", $"librdkafka{fileEx}");
Library.Load(pathToLibrd);
try
{
Library.Load(pathToLibrd);
}
catch (Exception ex)
{
LogMessage.LogError(ex, $"加载dll失败{pathToLibrd}");
}
}
producer = producerBuilder.Build();
}

View File

@@ -10,6 +10,8 @@
//------------------------------------------------------------------------------
#endregion
using Confluent.Kafka;
namespace ThingsGateway.Plugin.Kafka;
/// <summary>
@@ -53,12 +55,10 @@ public class KafkaProducerProperty : UploadPropertyWithCacheT
/// </summary>
[DeviceProperty("密码", "")]
public string SaslPassword { get; set; } = "none";
[DeviceProperty("SecurityProtocol", "")]
public string SecurityProtocol { get; set; } = "SaslPlaintext";
[DeviceProperty("SaslMechanism", "")]
public string SaslMechanism { get; set; } = "Plain";
[DeviceProperty("SecurityProtocol", "Plaintext, Ssl, SaslPlaintext, SaslSsl")]
public SecurityProtocol SecurityProtocol { get; set; } = SecurityProtocol.Plaintext;
[DeviceProperty("SaslMechanism", " Gssapi, Plain, ScramSha256, ScramSha512, OAuthBearer")]
public SaslMechanism SaslMechanism { get; set; } = SaslMechanism.Plain;
/// <summary>
/// 设备实体脚本

View File

@@ -17,14 +17,14 @@ namespace ThingsGateway.Plugin.Modbus;
/// <summary>
/// <inheritdoc/>
/// </summary>
public class ModbusTcpDtu : CollectBase
public class ModbusDtu : CollectBase
{
private readonly ModbusTcpDtuProperty _driverPropertys = new();
private readonly ModbusDtuProperty _driverPropertys = new();
private ThingsGateway.Foundation.Adapter.Modbus.ModbusTcpDtu _plc;
private ThingsGateway.Foundation.Adapter.Modbus.ModbusDtu _plc;
/// <inheritdoc/>
public override Type DriverDebugUIType => typeof(ModbusTcpDtuDebugPage);
public override Type DriverDebugUIType => typeof(ModbusDtuDebugPage);
/// <inheritdoc/>
public override DriverPropertyBase DriverPropertys => _driverPropertys;
@@ -45,13 +45,15 @@ public class ModbusTcpDtu : CollectBase
var client1 = new TcpService();
((TcpService)client1).Setup(FoundataionConfig);
//载入配置
_plc = new((TcpService)client)
_plc = new((TcpService)client1)
{
DataFormat = _driverPropertys.DataFormat,
FrameTime = _driverPropertys.FrameTime,
CacheTimeout = _driverPropertys.CacheTimeout,
Station = _driverPropertys.Station,
TimeOut = _driverPropertys.TimeOut,
IsRtu = _driverPropertys.IsRtu,
Crc16CheckEnable = _driverPropertys.Crc16CheckEnable,
IsCheckMessageId = _driverPropertys.MessageIdCheckEnable
};
base.Init(client);

View File

@@ -14,7 +14,7 @@ namespace ThingsGateway.Plugin.Modbus;
/// <summary>
/// <inheritdoc/>
/// </summary>
public class ModbusTcpDtuProperty : DriverPropertyBase
public class ModbusDtuProperty : DriverPropertyBase
{
/// <summary>
/// IP
@@ -61,6 +61,19 @@ public class ModbusTcpDtuProperty : DriverPropertyBase
/// </summary>
[DeviceProperty("连接标识检测", "")]
public bool MessageIdCheckEnable { get; set; }
/// <summary>
/// 是否Rtu格式
/// </summary>
[DeviceProperty("是否Rtu格式")]
public bool IsRtu { get; set; }
/// <summary>
/// Crc校验
/// </summary>
[DeviceProperty("Crc校验")]
public bool Crc16CheckEnable { get; set; } = true;
/// <summary>
/// 共享链路
/// </summary>

View File

@@ -16,7 +16,7 @@ namespace ThingsGateway.Plugin.Modbus;
/// <summary>
/// <inheritdoc/>
/// </summary>
public class ModbusSerialServerProperty : DriverPropertyBase
public class ModbusSerialServerProperty : UpDriverPropertyBase
{
/// <summary>
/// COM口

View File

@@ -14,7 +14,7 @@ namespace ThingsGateway.Plugin.Modbus;
/// <summary>
/// <inheritdoc/>
/// </summary>
public class ModbusTcpServerProperty : DriverPropertyBase
public class ModbusTcpServerProperty : UpDriverPropertyBase
{
/// <summary>
/// IP

View File

@@ -35,7 +35,7 @@
<Compile Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusRtuOverUdpDebugPage.razor.cs" Link="Page\ModbusRtuOverUdpDebugPage.razor.cs" />
<Compile Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusSerialServerDebugPage.razor.cs" Link="Page\ModbusSerialServerDebugPage.razor.cs" />
<Compile Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusTcpDebugPage.razor.cs" Link="Page\ModbusTcpDebugPage.razor.cs" />
<Compile Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusTcpDtuDebugPage.razor.cs" Link="Page\ModbusTcpDtuDebugPage.razor.cs" />
<Compile Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusDtuDebugPage.razor.cs" Link="Page\ModbusDtuDebugPage.razor.cs" />
<Compile Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusTcpServerDebugPage.razor.cs" Link="Page\ModbusTcpServerDebugPage.razor.cs" />
<Compile Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusUdpDebugPage.razor.cs" Link="Page\ModbusUdpDebugPage.razor.cs" />
<Content Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusRtuDebugPage.razor" Link="Page\ModbusRtuDebugPage.razor" />
@@ -43,7 +43,7 @@
<Content Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusRtuOverUdpDebugPage.razor" Link="Page\ModbusRtuOverUdpDebugPage.razor" />
<Content Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusSerialServerDebugPage.razor" Link="Page\ModbusSerialServerDebugPage.razor" />
<Content Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusTcpDebugPage.razor" Link="Page\ModbusTcpDebugPage.razor" />
<Content Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusTcpDtuDebugPage.razor" Link="Page\ModbusTcpDtuDebugPage.razor" />
<Content Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusDtuDebugPage.razor" Link="Page\ModbusDtuDebugPage.razor" />
<Content Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusTcpServerDebugPage.razor" Link="Page\ModbusTcpServerDebugPage.razor" />
<Content Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusUdpDebugPage.razor" Link="Page\ModbusUdpDebugPage.razor" />
</ItemGroup>
@@ -51,7 +51,7 @@
<ItemGroup>
<ProjectReference Include="..\..\gateway\ThingsGateway.Gateway.Blazor\ThingsGateway.Gateway.Blazor.csproj" >
<ProjectReference Include="..\..\gateway\ThingsGateway.Gateway.Blazor\ThingsGateway.Gateway.Blazor.csproj">
<Private>false</Private>
<CopyLocalSatelliteAssemblies>false</CopyLocalSatelliteAssemblies>
<ExcludeAssets>runtime</ExcludeAssets>

View File

@@ -14,7 +14,7 @@ namespace ThingsGateway.Plugin.Mqtt;
/// <summary>
/// <inheritdoc/>
/// </summary>
public class MqttServerProperty : DriverPropertyBase
public class MqttServerProperty : UpDriverPropertyBase
{
[DeviceProperty("是否选择全部变量", "")] public bool IsAllVariable { get; set; } = false;

View File

@@ -12,16 +12,8 @@
<ItemGroup>
<Compile Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\DriverDebugUIBase.cs" Link="DebugPage\DriverDebugUIBase.cs" />
<Compile Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\DriverDebugUIPage.razor.cs" Link="DebugPage\DriverDebugUIPage.razor.cs" />
<Compile Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\SerialSessionPage.razor.cs" Link="DebugPage\SerialSessionPage.razor.cs" />
<Compile Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\TcpClientPage.razor.cs" Link="DebugPage\TcpClientPage.razor.cs" />
<Compile Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\TcpServerPage.razor.cs" Link="DebugPage\TcpServerPage.razor.cs" />
<Compile Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\UdpSessionPage.razor.cs" Link="DebugPage\UdpSessionPage.razor.cs" />
<Content Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\DriverDebugUIPage.razor" Link="DebugPage\DriverDebugUIPage.razor" />
<Content Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\SerialSessionPage.razor" Link="DebugPage\SerialSessionPage.razor" />
<Content Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\TcpClientPage.razor" Link="DebugPage\TcpClientPage.razor" />
<Content Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\TcpServerPage.razor" Link="DebugPage\TcpServerPage.razor" />
<Content Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\UdpSessionPage.razor" Link="DebugPage\UdpSessionPage.razor" />
</ItemGroup>
@@ -45,7 +37,7 @@
<ItemGroup>
<ProjectReference Include="..\..\gateway\ThingsGateway.Gateway.Blazor\ThingsGateway.Gateway.Blazor.csproj" >
<ProjectReference Include="..\..\gateway\ThingsGateway.Gateway.Blazor\ThingsGateway.Gateway.Blazor.csproj">
<Private>false</Private>
<CopyLocalSatelliteAssemblies>false</CopyLocalSatelliteAssemblies>
<ExcludeAssets>runtime</ExcludeAssets>

Some files were not shown because too many files have changed in this diff Show More