From e36dd6fc2e97099a9046569b60e0582e31673af2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=B5=B7=E4=B8=9C?= <535915157@qq.com> Date: Mon, 20 Dec 2021 23:38:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0mqtt=E7=A6=BB=E6=95=A3?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vs/IoTGateway/DesignTimeBuild/.dtbcache.v2 | Bin 394265 -> 394265 bytes .vs/IoTGateway/v16/.suo | Bin 82944 -> 115712 bytes .../20211220151947_disperse.Designer.cs | 797 ++++++++++++++++++ .../Migrations/20211220151947_disperse.cs | 24 + .../Migrations/DataContextModelSnapshot.cs | 3 + IoTGateway.Model/SystemConfig.cs | 2 + .../SystemConfigVMs/SystemConfigListVM.cs | 2 + .../Config/Views/SystemConfig/Edit.cshtml | 16 +- .../Config/Views/SystemConfig/Index.cshtml | 7 +- IoTGateway/iotgateway.db | Bin 311296 -> 311296 bytes Plugins/Plugin/DeviceThread.cs | 2 +- Plugins/Plugin/MyMqttClient.cs | 37 +- 12 files changed, 871 insertions(+), 19 deletions(-) create mode 100644 IoTGateway.DataAccess/Migrations/20211220151947_disperse.Designer.cs create mode 100644 IoTGateway.DataAccess/Migrations/20211220151947_disperse.cs diff --git a/.vs/IoTGateway/DesignTimeBuild/.dtbcache.v2 b/.vs/IoTGateway/DesignTimeBuild/.dtbcache.v2 index 2a9d2830ecf1bfee46ab0405eb3fb389e0bf0bef..4c6cf3349efac86a00e0621038399a8f58934e76 100644 GIT binary patch delta 52663 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 diff --git a/IoTGateway.DataAccess/Migrations/20211220151947_disperse.Designer.cs b/IoTGateway.DataAccess/Migrations/20211220151947_disperse.Designer.cs new file mode 100644 index 0000000..d1123a1 --- /dev/null +++ b/IoTGateway.DataAccess/Migrations/20211220151947_disperse.Designer.cs @@ -0,0 +1,797 @@ +// +using System; +using IoTGateway.DataAccess; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +namespace IoTGateway.DataAccess.Migrations +{ + [DbContext(typeof(DataContext))] + [Migration("20211220151947_disperse")] + partial class disperse + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "5.0.9"); + + modelBuilder.Entity("IoTGateway.Model.Device", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("AutoStart") + .HasColumnType("INTEGER"); + + b.Property("CreateBy") + .HasColumnType("TEXT"); + + b.Property("CreateTime") + .HasColumnType("TEXT"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("DeviceName") + .HasColumnType("TEXT"); + + b.Property("DeviceTypeEnum") + .HasColumnType("INTEGER"); + + b.Property("DriverId") + .HasColumnType("TEXT"); + + b.Property("Index") + .HasColumnType("INTEGER"); + + b.Property("ParentId") + .HasColumnType("TEXT"); + + b.Property("UpdateBy") + .HasColumnType("TEXT"); + + b.Property("UpdateTime") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.HasIndex("DriverId"); + + b.HasIndex("ParentId"); + + b.ToTable("Devices"); + }); + + modelBuilder.Entity("IoTGateway.Model.DeviceConfig", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("CreateTime") + .HasColumnType("TEXT"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("DeviceConfigName") + .HasColumnType("TEXT"); + + b.Property("DeviceId") + .HasColumnType("TEXT"); + + b.Property("EnumInfo") + .HasColumnType("TEXT"); + + b.Property("UpdateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UpdateTime") + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.HasIndex("DeviceId"); + + b.ToTable("DeviceConfigs"); + }); + + modelBuilder.Entity("IoTGateway.Model.DeviceVariable", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("DataType") + .HasColumnType("INTEGER"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("DeviceAddress") + .HasColumnType("TEXT"); + + b.Property("DeviceId") + .HasColumnType("TEXT"); + + b.Property("Expressions") + .HasColumnType("TEXT"); + + b.Property("Method") + .HasColumnType("TEXT"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("ProtectType") + .HasColumnType("INTEGER"); + + b.HasKey("ID"); + + b.HasIndex("DeviceId"); + + b.ToTable("DeviceVariables"); + }); + + modelBuilder.Entity("IoTGateway.Model.Driver", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("AssembleName") + .HasColumnType("TEXT"); + + b.Property("AuthorizesNum") + .HasColumnType("INTEGER"); + + b.Property("CreateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("CreateTime") + .HasColumnType("TEXT"); + + b.Property("DriverName") + .HasColumnType("TEXT"); + + b.Property("FileName") + .HasColumnType("TEXT"); + + b.Property("UpdateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UpdateTime") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.ToTable("Drivers"); + }); + + modelBuilder.Entity("IoTGateway.Model.SystemConfig", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("CreateTime") + .HasColumnType("TEXT"); + + b.Property("Disperse") + .HasColumnType("INTEGER"); + + b.Property("GatewayName") + .HasColumnType("TEXT"); + + b.Property("MqttIp") + .HasColumnType("TEXT"); + + b.Property("MqttPort") + .HasColumnType("INTEGER"); + + b.Property("MqttUName") + .HasColumnType("TEXT"); + + b.Property("MqttUPwd") + .HasColumnType("TEXT"); + + b.Property("UpdateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UpdateTime") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.ToTable("SystemConfig"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.ActionLog", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("ActionName") + .HasMaxLength(255) + .HasColumnType("TEXT"); + + b.Property("ActionTime") + .HasColumnType("TEXT"); + + b.Property("ActionUrl") + .HasMaxLength(250) + .HasColumnType("TEXT"); + + b.Property("CreateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("CreateTime") + .HasColumnType("TEXT"); + + b.Property("Duration") + .HasColumnType("REAL"); + + b.Property("IP") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("ITCode") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("LogType") + .HasColumnType("INTEGER"); + + b.Property("ModuleName") + .HasMaxLength(255) + .HasColumnType("TEXT"); + + b.Property("Remark") + .HasColumnType("TEXT"); + + b.Property("UpdateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UpdateTime") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.ToTable("ActionLogs"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.DataPrivilege", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("CreateTime") + .HasColumnType("TEXT"); + + b.Property("Domain") + .HasColumnType("TEXT"); + + b.Property("GroupCode") + .HasColumnType("TEXT"); + + b.Property("RelateId") + .HasColumnType("TEXT"); + + b.Property("TableName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UpdateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UpdateTime") + .HasColumnType("TEXT"); + + b.Property("UserCode") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.ToTable("DataPrivileges"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.FileAttachment", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("ExtraInfo") + .HasColumnType("TEXT"); + + b.Property("FileData") + .HasColumnType("BLOB"); + + b.Property("FileExt") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("TEXT"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("HandlerInfo") + .HasColumnType("TEXT"); + + b.Property("Length") + .HasColumnType("INTEGER"); + + b.Property("Path") + .HasColumnType("TEXT"); + + b.Property("SaveMode") + .HasColumnType("TEXT"); + + b.Property("UploadTime") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.ToTable("FileAttachments"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.FrameworkGroup", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("CreateTime") + .HasColumnType("TEXT"); + + b.Property("GroupCode") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("TEXT"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("GroupRemark") + .HasColumnType("TEXT"); + + b.Property("TenantCode") + .HasColumnType("TEXT"); + + b.Property("UpdateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UpdateTime") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.ToTable("FrameworkGroups"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.FrameworkMenu", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("ActionName") + .HasColumnType("TEXT"); + + b.Property("ClassName") + .HasColumnType("TEXT"); + + b.Property("DisplayOrder") + .IsRequired() + .HasColumnType("INTEGER"); + + b.Property("Domain") + .HasColumnType("TEXT"); + + b.Property("FolderOnly") + .HasColumnType("INTEGER"); + + b.Property("Icon") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("IsInherit") + .HasColumnType("INTEGER"); + + b.Property("IsInside") + .IsRequired() + .HasColumnType("INTEGER"); + + b.Property("IsPublic") + .HasColumnType("INTEGER"); + + b.Property("MethodName") + .HasColumnType("TEXT"); + + b.Property("ModuleName") + .HasColumnType("TEXT"); + + b.Property("PageName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("ParentId") + .HasColumnType("TEXT"); + + b.Property("ShowOnMenu") + .HasColumnType("INTEGER"); + + b.Property("Url") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.HasIndex("ParentId"); + + b.ToTable("FrameworkMenus"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.FrameworkRole", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("CreateTime") + .HasColumnType("TEXT"); + + b.Property("RoleCode") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("TEXT"); + + b.Property("RoleName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("RoleRemark") + .HasColumnType("TEXT"); + + b.Property("TenantCode") + .HasColumnType("TEXT"); + + b.Property("UpdateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UpdateTime") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.ToTable("FrameworkRoles"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.FrameworkUser", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Address") + .HasMaxLength(200) + .HasColumnType("TEXT"); + + b.Property("CellPhone") + .HasColumnType("TEXT"); + + b.Property("CreateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("CreateTime") + .HasColumnType("TEXT"); + + b.Property("Email") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("Gender") + .HasColumnType("INTEGER"); + + b.Property("HomePhone") + .HasMaxLength(30) + .HasColumnType("TEXT"); + + b.Property("ITCode") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("IsValid") + .HasColumnType("INTEGER"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("Password") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("TEXT"); + + b.Property("PhotoId") + .HasColumnType("TEXT"); + + b.Property("TenantCode") + .HasColumnType("TEXT"); + + b.Property("UpdateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UpdateTime") + .HasColumnType("TEXT"); + + b.Property("ZipCode") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.HasIndex("PhotoId"); + + b.ToTable("FrameworkUsers"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.FrameworkUserGroup", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("CreateTime") + .HasColumnType("TEXT"); + + b.Property("GroupCode") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UpdateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UpdateTime") + .HasColumnType("TEXT"); + + b.Property("UserCode") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.ToTable("FrameworkUserGroups"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.FrameworkUserRole", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("CreateTime") + .HasColumnType("TEXT"); + + b.Property("RoleCode") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UpdateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UpdateTime") + .HasColumnType("TEXT"); + + b.Property("UserCode") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.ToTable("FrameworkUserRoles"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.FunctionPrivilege", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Allowed") + .IsRequired() + .HasColumnType("INTEGER"); + + b.Property("CreateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("CreateTime") + .HasColumnType("TEXT"); + + b.Property("MenuItemId") + .HasColumnType("TEXT"); + + b.Property("RoleCode") + .HasColumnType("TEXT"); + + b.Property("UpdateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UpdateTime") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.HasIndex("MenuItemId"); + + b.ToTable("FunctionPrivileges"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.PersistedGrant", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreationTime") + .HasColumnType("TEXT"); + + b.Property("Expiration") + .HasColumnType("TEXT"); + + b.Property("RefreshToken") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UserCode") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.ToTable("PersistedGrants"); + }); + + modelBuilder.Entity("IoTGateway.Model.Device", b => + { + b.HasOne("IoTGateway.Model.Driver", "Driver") + .WithMany() + .HasForeignKey("DriverId"); + + b.HasOne("IoTGateway.Model.Device", "Parent") + .WithMany("Children") + .HasForeignKey("ParentId"); + + b.Navigation("Driver"); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("IoTGateway.Model.DeviceConfig", b => + { + b.HasOne("IoTGateway.Model.Device", "Device") + .WithMany("DeviceConfigs") + .HasForeignKey("DeviceId"); + + b.Navigation("Device"); + }); + + modelBuilder.Entity("IoTGateway.Model.DeviceVariable", b => + { + b.HasOne("IoTGateway.Model.Device", "Device") + .WithMany("DeviceVariables") + .HasForeignKey("DeviceId"); + + b.Navigation("Device"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.FrameworkMenu", b => + { + b.HasOne("WalkingTec.Mvvm.Core.FrameworkMenu", "Parent") + .WithMany("Children") + .HasForeignKey("ParentId"); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.FrameworkUser", b => + { + b.HasOne("WalkingTec.Mvvm.Core.FileAttachment", "Photo") + .WithMany() + .HasForeignKey("PhotoId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("Photo"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.FunctionPrivilege", b => + { + b.HasOne("WalkingTec.Mvvm.Core.FrameworkMenu", "MenuItem") + .WithMany("Privileges") + .HasForeignKey("MenuItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("MenuItem"); + }); + + modelBuilder.Entity("IoTGateway.Model.Device", b => + { + b.Navigation("Children"); + + b.Navigation("DeviceConfigs"); + + b.Navigation("DeviceVariables"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.FrameworkMenu", b => + { + b.Navigation("Children"); + + b.Navigation("Privileges"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/IoTGateway.DataAccess/Migrations/20211220151947_disperse.cs b/IoTGateway.DataAccess/Migrations/20211220151947_disperse.cs new file mode 100644 index 0000000..23d8451 --- /dev/null +++ b/IoTGateway.DataAccess/Migrations/20211220151947_disperse.cs @@ -0,0 +1,24 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace IoTGateway.DataAccess.Migrations +{ + public partial class disperse : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "Disperse", + table: "SystemConfig", + type: "INTEGER", + nullable: false, + defaultValue: false); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "Disperse", + table: "SystemConfig"); + } + } +} diff --git a/IoTGateway.DataAccess/Migrations/DataContextModelSnapshot.cs b/IoTGateway.DataAccess/Migrations/DataContextModelSnapshot.cs index 2734928..ff4c994 100644 --- a/IoTGateway.DataAccess/Migrations/DataContextModelSnapshot.cs +++ b/IoTGateway.DataAccess/Migrations/DataContextModelSnapshot.cs @@ -193,6 +193,9 @@ namespace IoTGateway.DataAccess.Migrations b.Property("CreateTime") .HasColumnType("TEXT"); + b.Property("Disperse") + .HasColumnType("INTEGER"); + b.Property("GatewayName") .HasColumnType("TEXT"); diff --git a/IoTGateway.Model/SystemConfig.cs b/IoTGateway.Model/SystemConfig.cs index 07dc854..ad68b9e 100644 --- a/IoTGateway.Model/SystemConfig.cs +++ b/IoTGateway.Model/SystemConfig.cs @@ -15,5 +15,7 @@ namespace IoTGateway.Model public string MqttUName { get; set; } [Display(Name = "Mqtt密码")] public string MqttUPwd { get; set; } + [Display(Name = "离散输出")] + public bool Disperse { get; set; } } } \ No newline at end of file diff --git a/IoTGateway.ViewModel/Config/SystemConfigVMs/SystemConfigListVM.cs b/IoTGateway.ViewModel/Config/SystemConfigVMs/SystemConfigListVM.cs index 77ab872..c7cf5c5 100644 --- a/IoTGateway.ViewModel/Config/SystemConfigVMs/SystemConfigListVM.cs +++ b/IoTGateway.ViewModel/Config/SystemConfigVMs/SystemConfigListVM.cs @@ -37,6 +37,7 @@ namespace IoTGateway.ViewModel.Config.SystemConfigVMs this.MakeGridHeader(x => x.MqttPort), this.MakeGridHeader(x => x.MqttUName), this.MakeGridHeader(x => x.MqttUPwd), + this.MakeGridHeader(x => x.Disperse), this.MakeGridHeaderAction(width: 200) }; } @@ -52,6 +53,7 @@ namespace IoTGateway.ViewModel.Config.SystemConfigVMs MqttPort = x.MqttPort, MqttUName = x.MqttUName, MqttUPwd = x.MqttUPwd, + Disperse = x.Disperse, }) .OrderBy(x => x.ID); return query; diff --git a/IoTGateway/Areas/Config/Views/SystemConfig/Edit.cshtml b/IoTGateway/Areas/Config/Views/SystemConfig/Edit.cshtml index 2acf3ab..e8c410f 100644 --- a/IoTGateway/Areas/Config/Views/SystemConfig/Edit.cshtml +++ b/IoTGateway/Areas/Config/Views/SystemConfig/Edit.cshtml @@ -2,13 +2,15 @@ @inject IStringLocalizer Localizer; - - - - - - - + 注意:tb只能使用非离散输出模式,否则平台无法解析 + + + + + + + + diff --git a/IoTGateway/Areas/Config/Views/SystemConfig/Index.cshtml b/IoTGateway/Areas/Config/Views/SystemConfig/Index.cshtml index 6eee90f..9d0e60b 100644 --- a/IoTGateway/Areas/Config/Views/SystemConfig/Index.cshtml +++ b/IoTGateway/Areas/Config/Views/SystemConfig/Index.cshtml @@ -2,7 +2,8 @@ @inject IStringLocalizer Localizer; - - + + - +注意:tb只能使用非离散输出模式,否则平台无法解析 + diff --git a/IoTGateway/iotgateway.db b/IoTGateway/iotgateway.db index 629522e136f1c4db701e8ae8731ef38a64de40ca..9deebb0b0248633d4dee41a319dfbfdd4f3124de 100644 GIT binary patch delta 412 zcmZo@5N>D?o**qK!oa}b1H@`T%mu`96LpLkMK&fZ;pbxJU%ollT?o znVGG{jSP$o4ULQp3{4F!P0Zs{GK&jRi;7cC^$heZCm)n|2I|_t!2gQ>4F3k8u0{MZ z(#+P3I5aUgpV8lbMxW7CKpAK=AEP$||6#s-J`J9mJX5%{xV0I*xju2YaEP*6vixEC z4Kz-jk*ir(oLyX1m9b5ByPz{;9V3^Hf|3iw5z{Z4FbeZ4xVXAGhWdmk7-%-v$+B;KFFhWGgn=mR)ALpc|vo_ERp5nvByM-5FiC z8@Vz1Gj2cU&Uk}yTL2@Q14}9ce=5-WXnwv%2}Yh!d3h#NUT1M<@#(kMGpbIXF`qF& z*vLS^$k@ur+{(aE&)m%1!r0h!`|tUT26Bv?)937EtcEHuG_f)^(6cZ%GB7qZn_j)2 WQM3K=K1LvB0%GRvkN2_2G6Dd*Np8si delta 330 zcmWN_KS%;m9KiASJ5Nt9?PZ4?6sCg)TIk*Bb#^WODUdwOrKzE&gPPi-IFV>o3Z4)o zL^Kv5^_H?+g5YS5XfqPpqS2vl_zd5#WeJugG^c|CLdbB;I(SF8HJ<_DX6pib8Qe$s z6ZgBp+ATirM@r7I5&p)ubDnU+PE$J#>O_KjM&l@neB0g-_v%r&I{V`Ob#ZJHC7HKC z%s=G6{O7#Mn{>GhR}2Z2AZ{1u@>;&YJ#jqWmV5=x~!%oMN$`Y3v|>0X@;CW!2YBbRTN#$=@})Zsgj({ VsbudF5=Vm`I2ebE4ti`D{s91WU10zK diff --git a/Plugins/Plugin/DeviceThread.cs b/Plugins/Plugin/DeviceThread.cs index dbe013c..5476241 100644 --- a/Plugins/Plugin/DeviceThread.cs +++ b/Plugins/Plugin/DeviceThread.cs @@ -113,7 +113,7 @@ namespace Plugin { payLoad.DeviceStatus = DeviceStatusTypeEnum.Good; sendModel[Device.DeviceName] = new List { payLoad }; - myMqttClient.Publish("v1/gateway/telemetry", sendModel); + myMqttClient.Publish(Device,sendModel); } } diff --git a/Plugins/Plugin/MyMqttClient.cs b/Plugins/Plugin/MyMqttClient.cs index a11274f..2e3cbc9 100644 --- a/Plugins/Plugin/MyMqttClient.cs +++ b/Plugins/Plugin/MyMqttClient.cs @@ -21,6 +21,7 @@ namespace Plugin { private static IMqttClient _mqttClient = null; private static MqttClientOptionsBuilder builder = null; + private SystemConfig systemConfig = null; public MyMqttClient() { InitClient(); @@ -34,8 +35,8 @@ namespace Plugin using (var DC = new DataContext(IoTBackgroundService.connnectSetting, IoTBackgroundService.DBType)) { - var systemManage = DC.Set().FirstOrDefault(); - if (systemManage == null) + systemConfig = DC.Set().FirstOrDefault(); + if (systemConfig == null) Console.WriteLine("配置信息错误,无法启动"); else { @@ -46,9 +47,9 @@ namespace Plugin builder = new MqttClientOptionsBuilder() .WithCommunicationTimeout(TimeSpan.FromSeconds(60)) .WithKeepAlivePeriod(TimeSpan.FromSeconds(20)) - .WithTcpServer(systemManage.MqttIp, systemManage.MqttPort) - .WithClientId(systemManage.MqttUName + Guid.NewGuid().ToString()) - .WithCredentials(systemManage.MqttUName, systemManage.MqttUPwd); + .WithTcpServer(systemConfig.MqttIp, systemConfig.MqttPort) + .WithClientId(systemConfig.MqttUName + Guid.NewGuid().ToString()) + .WithCredentials(systemConfig.MqttUName, systemConfig.MqttUPwd); _mqttClient.ConnectAsync(builder.Build()); } @@ -58,12 +59,32 @@ namespace Plugin { } - + } - public void Publish(string Topic, Dictionary> SendModel) + public void Publish(Device device, Dictionary> SendModel) { - _mqttClient.PublishAsync(Topic, JsonConvert.SerializeObject(SendModel)); + try + { + string TopicBase = "v1/gateway/telemetry"; + if (!systemConfig.Disperse) + _mqttClient.PublishAsync(TopicBase, JsonConvert.SerializeObject(SendModel)); + else + { + foreach (var payload in SendModel[device.DeviceName]) + { + foreach (var kv in payload.Values) + { + _mqttClient.PublishAsync($"{TopicBase}/{device.DeviceName}/{kv.Key}", kv.Value.ToString()); + } + } + } + } + catch (Exception ex) + { + + } + } private void OnReceived(MqttApplicationMessageReceivedEventArgs obj)