单灯:模块改为客户端

This commit is contained in:
hehaibing-1996
2024-12-06 11:12:18 +08:00
parent cfbf6a81c8
commit 43694e3185
4 changed files with 290 additions and 160 deletions

View File

@ -90,13 +90,18 @@ namespace WCS.DAL.DbModels
[SugarColumn(ColumnName = "group_name", Length = 50, IsNullable = false, ColumnDescription = "货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)")]
public string GroupName { get; set; }
/// <summary>
/// 是否串联绑定
/// 模块是不
/// </summary>
[SugarColumn(ColumnName = "is_bind", IsNullable = false, ColumnDescription = "是否串联绑定")]
public bool IsBind { get; set; }
/// <summary>
/// 货架的模块是不是服务端
/// </summary>
[SugarColumn(ColumnName = "is_service", IsNullable = true, ColumnDescription = "货架的模块是不是服务端")]
public bool IsService { get; set; } = false;
/// <summary>
/// 串联绑定后的大货架编码
/// </summary>

View File

@ -78,6 +78,8 @@ namespace WCS.BLL.Manager
, typeof(AppVersion)
);
//DbHelp.db.CodeFirst.InitTables(typeof(ShelfInfo));
Logs.Write("【初始化数据库】db业务数据库建表", LogsType.StartBoot);
DbHelp.dbLog.CodeFirst.InitTables(typeof(SystemApiLogRecord));
Logs.Write("【初始化数据库】dblog日志数据库建表", LogsType.StartBoot);

View File

@ -23,12 +23,15 @@ namespace WCS.BLL.Manager
/// </summary>
public static List<TCPClient> TCPClients = new List<TCPClient>();
public static TcpService Service { get; set; }
public static void InitTcpClient()
{
#region Service的逻辑
Logs.Write("【InitTcpClient】开始", LogsType.StartBoot);
var clientsInDB = DbHelp.db.Queryable<ShelfInfo>()
var moduleServices = DbHelp.db.Queryable<ShelfInfo>()
.WhereIF(!string.IsNullOrEmpty(LocalFile.Config.GroupName), t => t.GroupName == LocalFile.Config.GroupName)
.Where(t => t.IsService)
.Select(t => new
{
IP = t.ClientIp,
@ -37,8 +40,10 @@ namespace WCS.BLL.Manager
})
.Distinct()
.ToList();
Logs.Write($"【InitTcpClient】需要连接的服务端地址如下\r\n{string.Join(";", clientsInDB)}", LogsType.StartBoot);
foreach (var cleientInDB in clientsInDB)
if (moduleServices != null && moduleServices.Count > 0)
{
Logs.Write($"【InitTcpClient】需要连接的服务端地址如下\r\n{string.Join(";", moduleServices)}", LogsType.StartBoot);
foreach (var cleientInDB in moduleServices)
{
Task.Run(() =>
{
@ -186,6 +191,58 @@ namespace WCS.BLL.Manager
});
Logs.Write("【InitTcpClient】完成 后台继续连接", LogsType.StartBoot);
}
#endregion
#region Client的逻辑
var moduleClients = DbHelp.db.Queryable<ShelfInfo>()
.WhereIF(!string.IsNullOrEmpty(LocalFile.Config.GroupName), t => t.GroupName == LocalFile.Config.GroupName)
.Where(t => t.IsService == false)
.Select(t => new
{
IP = t.ClientIp,
ShelfTypeName = t.ShelfTypeName,
Port = t.Port,
})
.Distinct()
.ToList();
//有客户端作客户端时才需要初始化一个服务端
if (moduleClients != null && moduleClients.Count > 0)
{
Service = new TcpService();
Service.Connecting = (client, e) =>
{
return EasyTask.CompletedTask;
};//有客户端正在连接
Service.Connected = (client, e) => { return EasyTask.CompletedTask; };//有客户端成功连接
Service.Disconnecting = (client, e) => { return EasyTask.CompletedTask; };//有客户端正在断开连接,只有当主动断开时才有效。
Service.Disconnected = (client, e) => { return EasyTask.CompletedTask; };//有客户端断开连接
Service.Received = (client, e) =>
{
//从客户端收到信息
var mes = Encoding.UTF8.GetString(e.ByteBlock.Buffer, 0, e.ByteBlock.Len);//注意数据长度是byteBlock.Len
client.Logger.Info($"已从{client.Id}接收到信息:{mes}");
//client.Send(mes);//将收到的信息直接返回给发送方
return EasyTask.CompletedTask;
};
Service.Setup(new TouchSocketConfig()//载入配置
.SetListenIPHosts("tcp://0.0.0.0:9999", 7790)//同时监听两个地址
.ConfigureContainer(a =>//容器的配置顺序应该在最前面
{
a.AddConsoleLogger();//添加一个控制台日志注入注意在maui中控制台日志不可用
})
.ConfigurePlugins(a =>
{
//a.Add();//此处可以添加插件
}));
Service.Start();
}
#endregion
}
//后台启动时给所有板子、警示灯发送复位操作 保持状态一致
public static void InitStatus()

View File

@ -96,14 +96,21 @@ namespace WCS.BLL.Services.Service
}
//合并同一个TCP的货架合并 报警灯和库位灯统一只发送一条指令
var clientIpList = shelfs.Select(t => t.ClientIp)
var clients = shelfs.Select(t => new
{
ClientIp = t.ClientIp,
IsService = t.IsService,
})
.Distinct()
.ToList();
foreach (var clientIp in clientIpList)
foreach (var client in clients)
{
var shelfModelsInOneIp = shelfModels.Where(t => t.ClientIp == clientIp).ToList();
var shelfModelsInOneIp = shelfModels.Where(t => t.ClientIp == client.ClientIp).ToList();
var sendData = Helper.SingleLightControl(shelfModelsInOneIp);
TCPClient tcpClient = TCPClientManager.GetTCPClientByIPHost(clientIp);
if (client.IsService)
{
TCPClient tcpClient = TCPClientManager.GetTCPClientByIPHost(client.ClientIp);
if (tcpClient != null)
{
try
@ -113,12 +120,38 @@ namespace WCS.BLL.Services.Service
}
catch (Exception ex)
{
Logs.Write($"【单灯单独控制】{clientIp}以下指令发送中遇到异常{ex.Message}" + BitConverter.ToString(sendData));
Logs.Write($"【单灯单独控制】{client}以下指令发送中遇到异常{ex.Message}" + BitConverter.ToString(sendData));
}
}
else
{
Logs.Write($"【单灯单独控制】{clientIp}未连接,以下指令未能成功发送" + BitConverter.ToString(sendData));
Logs.Write($"【单灯单独控制】{client}未连接,以下指令未能成功发送" + BitConverter.ToString(sendData));
}
}
else
{
var tcpClient = TCPClientManager.Service.GetClients().Where(t => t.IP + ":" + t.Port.ToString() == client.ClientIp).FirstOrDefault();
if (tcpClient != null)
{
try
{
tcpClient.Send(sendData,0,sendData.Length);
Logs.Write("【单灯单独控制】发送指令" + BitConverter.ToString(sendData));
}
catch (Exception ex)
{
Logs.Write($"【单灯单独控制】{client}以下指令发送中遇到异常{ex.Message}" + BitConverter.ToString(sendData));
}
}
else
{
Logs.Write($"【单灯单独控制】{client}未连接,以下指令未能成功发送" + BitConverter.ToString(sendData));
return new ResponseCommon<object>()
{
Code = 201,
Message = $"【单灯单独控制】{client}未连接,以下指令未能成功发送",
};
}
}
}
@ -172,31 +205,64 @@ namespace WCS.BLL.Services.Service
var shelfs = DbHelp.db.Queryable<ShelfInfo>().Where(t => shelfIds.Contains(t.Id))
.ToList();
//获取对应货架所有IP
var clientIPs = shelfs.Select(t => t.ClientIp)
var clients = shelfs.Select(t => new
{
ClientIp = t.ClientIp,
IsService = t.IsService,
})
.Distinct()
.ToList();
//挨个发关灯指令
foreach (var clientIP in clientIPs)
foreach (var client in clients)
{
//生成关灯指令
var sendData = Helper.SingleLightTrunOffAllLight();
TCPClient tcpClient = TCPClientManager.GetTCPClientByIPHost(clientIP);
if (client.IsService)
{
TCPClient tcpClient = TCPClientManager.GetTCPClientByIPHost(client.ClientIp);
if (tcpClient != null)
{
try
{
tcpClient.Send(sendData);
Logs.Write("【单灯单独控制】发送指令" + BitConverter.ToString(sendData));
Logs.Write("【熄灯】发送指令" + BitConverter.ToString(sendData));
}
catch (Exception ex)
{
Logs.Write($"【单灯单独控制】{clientIP}以下指令发送中遇到异常{ex.Message}" + BitConverter.ToString(sendData));
Logs.Write($"【熄灯】{client}以下指令发送中遇到异常{ex.Message}" + BitConverter.ToString(sendData));
}
}
else
{
Logs.Write($"【单灯单独控制】{clientIP}未连接,以下指令未能成功发送" + BitConverter.ToString(sendData));
Logs.Write($"【熄灯】{client}未连接,以下指令未能成功发送" + BitConverter.ToString(sendData));
}
}
else
{
var tcpClient = TCPClientManager.Service.GetClients().Where(t => t.IP + ":" + t.Port.ToString() == client.ClientIp).FirstOrDefault();
if (tcpClient != null)
{
try
{
tcpClient.Send(sendData, 0, sendData.Length);
Logs.Write("【熄灯】发送指令" + BitConverter.ToString(sendData));
}
catch (Exception ex)
{
Logs.Write($"【熄灯】{client}以下指令发送中遇到异常{ex.Message}" + BitConverter.ToString(sendData));
}
}
else
{
Logs.Write($"【熄灯】{client}未连接,以下指令未能成功发送" + BitConverter.ToString(sendData));
return new ResponseCommon<object>()
{
Code = 201,
Message = $"【熄灯】{client}未连接,以下指令未能成功发送",
};
}
}
}