1.WebSocket登录注册

2.数据重发机制
This commit is contained in:
hehaibing-1996
2024-05-17 15:12:07 +08:00
parent c8ce453f74
commit 649e22b4ce
17 changed files with 200 additions and 163 deletions

View File

@ -57,6 +57,8 @@ namespace WCS.BLL.HardWare
/// 货架组别 /// 货架组别
/// </summary> /// </summary>
public string GroupName { get; set; } public string GroupName { get; set; }
public string WebSocketIpAddress { get; set; }
/// <summary> /// <summary>
/// 模组 /// 模组
/// </summary> /// </summary>

View File

@ -25,6 +25,7 @@ namespace WCS.BLL.HardWare
public string ClientIp { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public string ClientIp { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
public List<string> ExceptionMessages { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public List<string> ExceptionMessages { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
public bool IsWarning { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public bool IsWarning { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
public string WebSocketIpAddress { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
public bool ConfirmStocktakingSingle(int BoardId, int LightNumber) public bool ConfirmStocktakingSingle(int BoardId, int LightNumber)
{ {

View File

@ -104,6 +104,9 @@ namespace WCS.BLL.HardWare
public List<int> ModuleIds { get; set; } public List<int> ModuleIds { get; set; }
public string ClientIp { get; set; } public string ClientIp { get; set; }
//websocket通知的前端的IP地址
public string WebSocketIpAddress { get; set; } = "127.0.0.2";
#region #region
public void GoInInstore(string? IPAddress) public void GoInInstore(string? IPAddress)
{ {
@ -186,7 +189,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode, ShelfCode = ShelfCode,
ShelfId = ShelfId, ShelfId = ShelfId,
WarningMessage = exceptionMessage, WarningMessage = exceptionMessage,
ClientIp = "127.0.0.1", ClientIp = WebSocketIpAddress,
}; };
WarningManager.SendWarning(warningModel); WarningManager.SendWarning(warningModel);
@ -267,13 +270,13 @@ namespace WCS.BLL.HardWare
var warningModel = new WebSocketMessageModel() var warningModel = new WebSocketMessageModel()
{ {
IsWarning = true, IsWarning = true,
WarningType = WarningTypeEnum., WarningType = WarningTypeEnum.退,
StoreId = 0, StoreId = 0,
StoreCode = "", StoreCode = "",
ShelfCode = ShelfCode, ShelfCode = ShelfCode,
ShelfId = ShelfId, ShelfId = ShelfId,
WarningMessage = exceptionMessage, WarningMessage = exceptionMessage,
ClientIp = "127.0.0.1", ClientIp = WebSocketIpAddress,
}; };
WarningManager.SendWarning(warningModel); WarningManager.SendWarning(warningModel);
} }
@ -354,7 +357,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode, ShelfCode = ShelfCode,
ShelfId = ShelfId, ShelfId = ShelfId,
WarningMessage = exceptionMessage, WarningMessage = exceptionMessage,
ClientIp = "127.0.0.1", ClientIp = WebSocketIpAddress,
}; };
WarningManager.SendWarning(warningModel); WarningManager.SendWarning(warningModel);
} }
@ -411,7 +414,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode, ShelfCode = ShelfCode,
ShelfId = ShelfId, ShelfId = ShelfId,
WarningMessage = exceptionMessage, WarningMessage = exceptionMessage,
ClientIp = "127.0.0.1", ClientIp = WebSocketIpAddress,
}; };
WarningManager.SendWarning(warningModel); WarningManager.SendWarning(warningModel);
} }
@ -503,7 +506,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode, ShelfCode = ShelfCode,
ShelfId = ShelfId, ShelfId = ShelfId,
WarningMessage = exceptionMessage, WarningMessage = exceptionMessage,
ClientIp = "127.0.0.1", ClientIp = WebSocketIpAddress,
}; };
WarningManager.SendWarning(warningModel); WarningManager.SendWarning(warningModel);
} }
@ -536,7 +539,7 @@ namespace WCS.BLL.HardWare
var messageMode = new WebSocketMessageModel() var messageMode = new WebSocketMessageModel()
{ {
IsWarning = false, IsWarning = false,
ClientIp = "127.0.0.1", ClientIp = WebSocketIpAddress,
WarningType = WarningTypeEnum. WarningType = WarningTypeEnum.
}; };
WarningManager.SendWarning(messageMode); WarningManager.SendWarning(messageMode);
@ -590,7 +593,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode, ShelfCode = ShelfCode,
ShelfId = ShelfId, ShelfId = ShelfId,
WarningMessage = exceptionMessage, WarningMessage = exceptionMessage,
ClientIp = "127.0.0.1", ClientIp = WebSocketIpAddress,
}; };
WarningManager.SendWarning(warningModel); WarningManager.SendWarning(warningModel);
} }
@ -797,7 +800,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode, ShelfCode = ShelfCode,
ShelfId = ShelfId, ShelfId = ShelfId,
WarningMessage = exceptionMessage, WarningMessage = exceptionMessage,
ClientIp = "127.0.0.1" ClientIp = WebSocketIpAddress
}; };
WarningManager.SendWarning(warningModel); WarningManager.SendWarning(warningModel);
#endregion #endregion
@ -831,7 +834,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode, ShelfCode = ShelfCode,
ShelfId = ShelfId, ShelfId = ShelfId,
WarningMessage = exceptionMessage, WarningMessage = exceptionMessage,
ClientIp = "127.0.0.1" ClientIp = WebSocketIpAddress
}; };
WarningManager.SendWarning(warningModel); WarningManager.SendWarning(warningModel);
#endregion #endregion
@ -916,7 +919,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode, ShelfCode = ShelfCode,
ShelfId = ShelfId, ShelfId = ShelfId,
WarningMessage = storeInfo.StoreCode + "入库过程中存在物料未扫描上架!", WarningMessage = storeInfo.StoreCode + "入库过程中存在物料未扫描上架!",
ClientIp = "127.0.0.1" ClientIp = WebSocketIpAddress
}; };
WarningManager.SendWarning(warningModel); WarningManager.SendWarning(warningModel);
@ -1051,7 +1054,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode, ShelfCode = ShelfCode,
ShelfId = ShelfId, ShelfId = ShelfId,
WarningMessage = exceptionMessage, WarningMessage = exceptionMessage,
ClientIp = "127.0.0.1", ClientIp = WebSocketIpAddress,
SolvedGuids = warnings.Select(t => t.Guid).ToList(), SolvedGuids = warnings.Select(t => t.Guid).ToList(),
}; };
WarningManager.SendWarning(warningModel); WarningManager.SendWarning(warningModel);
@ -1079,7 +1082,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode, ShelfCode = ShelfCode,
ShelfId = ShelfId, ShelfId = ShelfId,
WarningMessage = exceptionMessage, WarningMessage = exceptionMessage,
ClientIp = "127.0.0.1" ClientIp = WebSocketIpAddress
}; };
WarningManager.SendWarning(warningModel); WarningManager.SendWarning(warningModel);
@ -1096,7 +1099,6 @@ namespace WCS.BLL.HardWare
{ {
Logs.Write("协议处理5.4"); Logs.Write("协议处理5.4");
var exceptionMessage = storeInfo.StoreCode + "物料被取出!"; var exceptionMessage = storeInfo.StoreCode + "物料被取出!";
//WebSoceketManager.TrySendMessage("127.0.0.1", exceptionMessage);
var warningModel = new WebSocketMessageModel() var warningModel = new WebSocketMessageModel()
{ {
WarningType = WarningTypeEnum., WarningType = WarningTypeEnum.,
@ -1107,7 +1109,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode, ShelfCode = ShelfCode,
ShelfId = ShelfId, ShelfId = ShelfId,
WarningMessage = exceptionMessage, WarningMessage = exceptionMessage,
ClientIp = "127.0.0.1" ClientIp = WebSocketIpAddress
}; };
WarningManager.SendWarning(warningModel); WarningManager.SendWarning(warningModel);
@ -1213,7 +1215,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode, ShelfCode = ShelfCode,
ShelfId = ShelfId, ShelfId = ShelfId,
WarningMessage = exceptionMessage, WarningMessage = exceptionMessage,
ClientIp = "127.0.0.1" ClientIp = WebSocketIpAddress
}; };
WarningManager.SendWarning(warningModel); WarningManager.SendWarning(warningModel);
#endregion #endregion
@ -1247,7 +1249,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode, ShelfCode = ShelfCode,
ShelfId = ShelfId, ShelfId = ShelfId,
WarningMessage = exceptionMessage, WarningMessage = exceptionMessage,
ClientIp = "127.0.0.1" ClientIp = WebSocketIpAddress
}; };
WarningManager.SendWarning(warningModel); WarningManager.SendWarning(warningModel);
#endregion #endregion
@ -1402,7 +1404,7 @@ namespace WCS.BLL.HardWare
var messageMode = new WebSocketMessageModel() var messageMode = new WebSocketMessageModel()
{ {
IsWarning = false, IsWarning = false,
ClientIp = "127.0.0.1", ClientIp = WebSocketIpAddress,
WarningType = WarningTypeEnum. WarningType = WarningTypeEnum.
}; };
WarningManager.SendWarning(messageMode); WarningManager.SendWarning(messageMode);
@ -1625,7 +1627,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode, ShelfCode = ShelfCode,
ShelfId = ShelfId, ShelfId = ShelfId,
WarningMessage = exceptionMessage, WarningMessage = exceptionMessage,
ClientIp = "127.0.0.1", ClientIp = WebSocketIpAddress,
SolvedGuids = warnings.Select(t => t.Guid).ToList(), SolvedGuids = warnings.Select(t => t.Guid).ToList(),
}; };
WarningManager.SendWarning(warningModel); WarningManager.SendWarning(warningModel);
@ -1640,7 +1642,6 @@ namespace WCS.BLL.HardWare
case 0x01: case 0x01:
{ {
var exceptionMessage = storeInfo.StoreCode + "出库过程中存在物料上架!"; var exceptionMessage = storeInfo.StoreCode + "出库过程中存在物料上架!";
//WebSoceketManager.TrySendMessage("127.0.0.1", exceptionMessage);
var warningModel = new WebSocketMessageModel() var warningModel = new WebSocketMessageModel()
{ {
WarningType = WarningTypeEnum., WarningType = WarningTypeEnum.,
@ -1651,7 +1652,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode, ShelfCode = ShelfCode,
ShelfId = ShelfId, ShelfId = ShelfId,
WarningMessage = exceptionMessage, WarningMessage = exceptionMessage,
ClientIp = "127.0.0.1" ClientIp = WebSocketIpAddress,
}; };
WarningManager.SendWarning(warningModel); WarningManager.SendWarning(warningModel);
@ -1666,7 +1667,6 @@ namespace WCS.BLL.HardWare
case 0x02: case 0x02:
{ {
var exceptionMessage = storeInfo.StoreCode + "物料被取出!"; var exceptionMessage = storeInfo.StoreCode + "物料被取出!";
//WebSoceketManager.TrySendMessage("127.0.0.1", exceptionMessage);
var warningModel = new WebSocketMessageModel() var warningModel = new WebSocketMessageModel()
{ {
WarningType = WarningTypeEnum., WarningType = WarningTypeEnum.,
@ -1677,7 +1677,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode, ShelfCode = ShelfCode,
ShelfId = ShelfId, ShelfId = ShelfId,
WarningMessage = exceptionMessage, WarningMessage = exceptionMessage,
ClientIp = "127.0.0.1" ClientIp = WebSocketIpAddress
}; };
WarningManager.SendWarning(warningModel); WarningManager.SendWarning(warningModel);

View File

@ -14,6 +14,9 @@ namespace WCS.BLL.Manager
{ {
public static void InitDb() public static void InitDb()
{ {
Logs.Write("【初始化数据库】开始", LogsType.StartBoot);
DbHelp.db.DbMaintenance.CreateDatabase();
DbHelp.db.CodeFirst.InitTables(typeof(ModuleInfo), typeof(ShelfInfo), typeof(StoreInfo) DbHelp.db.CodeFirst.InitTables(typeof(ModuleInfo), typeof(ShelfInfo), typeof(StoreInfo)
, typeof(InventoryDetail), typeof(OutOrder), typeof(OutOrderDetail), typeof(OutOrderMatDetail) , typeof(InventoryDetail), typeof(OutOrder), typeof(OutOrderDetail), typeof(OutOrderMatDetail)
, typeof(ShelfTypeInfo), typeof(MatBaseInfo), typeof(MatInfo) , typeof(ShelfTypeInfo), typeof(MatBaseInfo), typeof(MatInfo)
@ -43,6 +46,8 @@ namespace WCS.BLL.Manager
DbHelp.db.Insertable(outDocumentSerialNumber).ExecuteCommand(); DbHelp.db.Insertable(outDocumentSerialNumber).ExecuteCommand();
DbHelp.db.Insertable(stockTakingDocumentSerialNumber).ExecuteCommand(); DbHelp.db.Insertable(stockTakingDocumentSerialNumber).ExecuteCommand();
} }
Logs.Write("【初始化数据库】结束", LogsType.StartBoot);
} }
} }
} }

View File

@ -20,11 +20,15 @@ namespace WCS.BLL.Manager
public static void InitShelves() public static void InitShelves()
{ {
Logs.Write("【InitShelves】开始", LogsType.StartBoot);
var shelvesInDb = DbHelp.db.Queryable<ShelfInfo>().ToList(); var shelvesInDb = DbHelp.db.Queryable<ShelfInfo>().ToList();
foreach (var shelfInDb in shelvesInDb) foreach (var shelfInDb in shelvesInDb)
{ {
Shelves.Add(InitShelf(shelfInDb)); Shelves.Add(InitShelf(shelfInDb));
} }
Logs.Write("【InitShelves】结束", LogsType.StartBoot);
} }
public static IShelfBase InitShelf(ShelfInfo shelfInDb) public static IShelfBase InitShelf(ShelfInfo shelfInDb)

View File

@ -21,107 +21,97 @@ namespace WCS.BLL.Manager
public static List<TCPClient> TCPClients = new List<TCPClient>(); public static List<TCPClient> TCPClients = new List<TCPClient>();
public static void InitTcpClient() public static void InitTcpClient()
{ {
Logs.Write("【InitTcpClient】开始", LogsType.StartBoot);
var ips = DbHelp.db.Queryable<ShelfInfo>() var ips = DbHelp.db.Queryable<ShelfInfo>()
//.Where(t => t.ShelfCode.Contains("C"))
.Select(t => t.ClientIp) .Select(t => t.ClientIp)
.Distinct() .Distinct()
.ToList(); .ToList();
foreach (var ip in ips) foreach (var ip in ips)
{ {
var tcpCleint = new TCPClient(ip, ""); Task.Run(() =>
//配置断线重连
tcpCleint.tcpClient.Received += (client, e) =>
{ {
var clientIpHost = client.IP + ":" + client.Port; var tcpCleint = new TCPClient(ip, "");
var TcpCleint = TCPClientManager.GetTCPClientByIPHost(clientIpHost); //配置断线重连
if (TcpCleint == null) tcpCleint.tcpClient.Received += (client, e) =>
{ {
//TO DO var clientIpHost = client.IP + ":" + client.Port;
return EasyTask.CompletedTask; var TcpCleint = TCPClientManager.GetTCPClientByIPHost(clientIpHost);
} if (TcpCleint == null)
var data = e.ByteBlock.Buffer.Take((int)e.ByteBlock.Length).ToArray();
e.ByteBlock.Clear();
var len = data.Length;
for (int index = 0; index < data.Length - TcpCleint.PreFixLength; index++)
{
//协议拆包 通过前缀校验是否为完整数据包
var prefixInData = data.Skip(index).Take(TcpCleint.PreFixLength);
var isEqual = prefixInData.SequenceEqual(TcpCleint.Prefix);
if (isEqual)
{ {
Logs.Write("协议处理1"); return EasyTask.CompletedTask;
var dataTemp = data.Skip(index).Take(TcpCleint.PreFixLength + TcpCleint.DataLength).ToArray();
if (dataTemp.Length < TcpCleint.PreFixLength + TcpCleint.DataLength)//拆包后不满足一条指令的长度
{
continue;
}
index += (TcpCleint.PreFixLength + TcpCleint.DataLength - 1);//每次循环index会+1 所以这里-1
//获取板子ID
var boardId = (dataTemp[TcpCleint.PreFixLength + 0] << 8) + dataTemp[TcpCleint.PreFixLength + 1];
var lightNumber = Convert.ToInt32(dataTemp[TcpCleint.PreFixLength + 3]);
Logs.Write("协议处理2");
//报警灯
if (dataTemp[TcpCleint.PreFixLength + 2] == 0x20)
{
var shelf = ShelfManager.Shelves.Where(t => t.ClientIp == clientIpHost)
.Where(t => t.LightId == boardId)
.FirstOrDefault();
var smartShelf = shelf as SmartShelf;
smartShelf?.ProtocolProcess(dataTemp, boardId, lightNumber);
}
//!= 0x20 货架类型协议返回
else
{
Logs.Write("协议处理3");
var shelf = ShelfManager.Shelves
.Where(t => t.ClientIp == clientIpHost)
.Where(t => t.ModuleIds.Contains(boardId))
.FirstOrDefault();
var smartShelf = shelf as SmartShelf;
smartShelf?.ProtocolProcess(dataTemp, boardId, lightNumber);
}
//协议处理 判断功能位
//switch (dataTemp[TcpCleint.PreFixLength + 2])
//{
// case 0x20://进入入库模式信号
// //GoInInstoreProcess(dataTemp, boardId, lightNumber);
// break;
// case 0x03://正常入库信号
// //InStoreReturnProcess(dataTemp);
// break;
// default:
// ;
// break;
//}
} }
}
Logs.Write("协议处理完毕!");
return EasyTask.CompletedTask;
};
//配置首次连接后复位操作
tcpCleint.tcpClient.Connected += (client, e) =>
{
var clientIpHost = client.IP + ":" + client.Port;
var TcpCleint = TCPClientManager.GetTCPClientByIPHost(clientIpHost);
if (TcpCleint == null)
{
return EasyTask.CompletedTask;
}
//首次连接
if (TcpCleint.IsFirstConnected == false)
{
InitStatus(TcpCleint);
TcpCleint.IsFirstConnected = true;
}
return EasyTask.CompletedTask;
};
TCPClients.Add(tcpCleint); var data = e.ByteBlock.Buffer.Take((int)e.ByteBlock.Length).ToArray();
tcpCleint.Connect(); e.ByteBlock.Clear();
var len = data.Length;
for (int index = 0; index < data.Length - TcpCleint.PreFixLength; index++)
{
//协议拆包 通过前缀校验是否为完整数据包
var prefixInData = data.Skip(index).Take(TcpCleint.PreFixLength);
var isEqual = prefixInData.SequenceEqual(TcpCleint.Prefix);
if (isEqual)
{
Logs.Write("协议处理1");
var dataTemp = data.Skip(index).Take(TcpCleint.PreFixLength + TcpCleint.DataLength).ToArray();
if (dataTemp.Length < TcpCleint.PreFixLength + TcpCleint.DataLength)//拆包后不满足一条指令的长度
{
continue;
}
index += (TcpCleint.PreFixLength + TcpCleint.DataLength - 1);//每次循环index会+1 所以这里-1
//获取板子ID
var boardId = (dataTemp[TcpCleint.PreFixLength + 0] << 8) + dataTemp[TcpCleint.PreFixLength + 1];
var lightNumber = Convert.ToInt32(dataTemp[TcpCleint.PreFixLength + 3]);
Logs.Write("协议处理2");
//报警灯
if (dataTemp[TcpCleint.PreFixLength + 2] == 0x20)
{
var shelf = ShelfManager.Shelves.Where(t => t.ClientIp == clientIpHost)
.Where(t => t.LightId == boardId)
.FirstOrDefault();
var smartShelf = shelf as SmartShelf;
smartShelf?.ProtocolProcess(dataTemp, boardId, lightNumber);
}
//!= 0x20 货架类型协议返回
else
{
Logs.Write("协议处理3");
var shelf = ShelfManager.Shelves
.Where(t => t.ClientIp == clientIpHost)
.Where(t => t.ModuleIds.Contains(boardId))
.FirstOrDefault();
var smartShelf = shelf as SmartShelf;
smartShelf?.ProtocolProcess(dataTemp, boardId, lightNumber);
}
}
}
Logs.Write("协议处理完毕!");
return EasyTask.CompletedTask;
};
//配置首次连接后复位操作
tcpCleint.tcpClient.Connected += (client, e) =>
{
var clientIpHost = client.IP + ":" + client.Port;
var TcpCleint = TCPClientManager.GetTCPClientByIPHost(clientIpHost);
if (TcpCleint == null)
{
return EasyTask.CompletedTask;
}
//首次连接
if (TcpCleint.IsFirstConnected == false)
{
Logs.Write($"【InitTcpClient】{clientIpHost}完成首次连接", LogsType.StartBoot);
InitStatus(TcpCleint);
TcpCleint.IsFirstConnected = true;
}
return EasyTask.CompletedTask;
};
TCPClients.Add(tcpCleint);
tcpCleint.Connect();
});
} }
//启动线程监听所有TCP是否已经完成首次连接 //启动线程监听所有TCP是否已经完成首次连接
@ -145,6 +135,7 @@ namespace WCS.BLL.Manager
} }
} }
}); });
Logs.Write("【InitTcpClient】完成后台继续连接", LogsType.StartBoot);
} }
//后台启动时给所有板子、警示灯发送复位操作 保持状态一致 //后台启动时给所有板子、警示灯发送复位操作 保持状态一致

View File

@ -16,6 +16,7 @@ namespace WCS.BLL.Manager
public static object flag = new object(); public static object flag = new object();
public static void InitWebSocket() public static void InitWebSocket()
{ {
Logs.Write("【启动WebSocket】开始", LogsType.StartBoot);
service = new HttpService(); service = new HttpService();
service.Setup(new TouchSocketConfig()//加载配置 service.Setup(new TouchSocketConfig()//加载配置
.SetListenIPHosts(7789) .SetListenIPHosts(7789)
@ -32,9 +33,10 @@ namespace WCS.BLL.Manager
})); }));
service.Start(); service.Start();
service.Logger.Info("服务器已启动"); Logs.Write("【启动WebSocket】结束", LogsType.StartBoot);
} }
//尝试发送报警信息给前端
//发送报警信息给前端
public static void TrySendMessage(string IpAddress, string Message) public static void TrySendMessage(string IpAddress, string Message)
{ {
try try

View File

@ -5,6 +5,7 @@ using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Threading.Tasks; using System.Threading.Tasks;
using TouchSocket.Core; using TouchSocket.Core;
using WCS.BLL.Manager;
using WCS.BLL.Services.IService; using WCS.BLL.Services.IService;
using WCS.DAL; using WCS.DAL;
using WCS.DAL.Db.AuthDb; using WCS.DAL.Db.AuthDb;
@ -440,13 +441,23 @@ namespace WCS.BLL.Services.Service
//返回字串不返回密码 //返回字串不返回密码
user.Password = "***"; user.Password = "***";
var response = new ResponseCommon<UserBase>() var response = new ResponseCommon<UserBase>()
{ {
Code = 200, Code = 200,
Message = "success", Message = "success",
Data = user Data = user
}; };
//登录成功
if (request.DeviceType == "WCS前端" && request.GroupNames != null)
{
var shelves = ShelfManager.Shelves.Where(t => request.GroupNames.Contains(t.GroupName))
.ToList();
foreach (var shelf in shelves)
{
shelf.WebSocketIpAddress = request.WebSocketIpAddress;
}
}
return response; return response;
} }
catch (Exception ex) catch (Exception ex)

View File

@ -22,17 +22,10 @@ namespace WCS.BLL
/// </summary> /// </summary>
Info, Info,
/// <summary> /// <summary>
/// 警告 /// 启动信息
/// </summary> /// </summary>
Warning, StartBoot,
/// <summary>
/// 错误
/// </summary>
Err,
/// <summary>
/// 数据库错误
/// </summary>
DbErr,
Api Api
} }
@ -115,16 +108,6 @@ namespace WCS.BLL
Write($"{contentTitle} {JsonConvert.SerializeObject(content)}", type); Write($"{contentTitle} {JsonConvert.SerializeObject(content)}", type);
} }
/// <summary>
/// 写入日志
/// </summary>
/// <param name="ex">错误</param>
/// <returns>是否写入成功</returns>
public static void Write(Exception ex, LogsType type = LogsType.Err)
{
Write(ex.ToString(), type);
}
/// <summary> /// <summary>
/// 清除日志 /// 清除日志
/// </summary> /// </summary>

View File

@ -94,7 +94,7 @@ namespace WCS.BLL
continue; continue;
} }
//获取返回指令的板子ID //获取返回指令的板子ID
var boardId = (data[PreFixLength + 0] << 8) + data[PreFixLength + 1]; var boardId = (dataTemp[PreFixLength + 0] << 8) + dataTemp[PreFixLength + 1];
//查询当前板子是否有待验证的指令 //查询当前板子是否有待验证的指令
var message = new MessageDto(); var message = new MessageDto();
MessageList.TryGetValue(boardId, out message); MessageList.TryGetValue(boardId, out message);
@ -103,7 +103,7 @@ namespace WCS.BLL
{ {
MessageList.TryRemove(boardId, out message); MessageList.TryRemove(boardId, out message);
} }
index += (PreFixLength + DataLength - 1);//每次循环index会+1 所以这里-1 index += (PreFixLength + DataLength - 2);//每次循环index会+1 所以这里-1
} }
} }
Logs.Write($"校验发送接收处理完毕" + BitConverter.ToString(data)); Logs.Write($"校验发送接收处理完毕" + BitConverter.ToString(data));
@ -131,24 +131,21 @@ namespace WCS.BLL
try try
{ {
//TODO如果指令已发两次 则取消重发 //TODO如果指令已发两次 则取消重发
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
await Task.Delay(100); await Task.Delay(100);
if (MessageList.Count > 0) if (MessageList.Count > 0)
{ {
var failedMessage = MessageList.Where(t => t.Value.SendTimes >= 2).ToList(); var failedMessage = MessageList.Where(t => t.Value.LastSendTime < DateTime.Now.AddSeconds(-1))
.ToList();
foreach (var message in failedMessage) foreach (var message in failedMessage)
{ {
Logs.Write(BitConverter.ToString(message.Value.Message) + Logs.Write(BitConverter.ToString(message.Value.Message) + "指令超时1s未响应");
"指令未响应");
} }
MessageList.RemoveWhen(t => t.Value.SendTimes >= 3); MessageList.RemoveWhen(t => t.Value.SendTimes >= 2);
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
foreach (var item in MessageList) foreach (var item in MessageList)
{ {
if (item.Value.LastSendTime < DateTime.Now.AddSeconds(-1)) if (item.Value.LastSendTime < DateTime.Now.AddSeconds(-1))
{ {
tcpClient.Send(item.Value.Message); Send(item.Value.Message);
item.Value.SendTimes++; item.Value.SendTimes++;
item.Value.LastSendTime = DateTime.Now; item.Value.LastSendTime = DateTime.Now;
await Task.Delay(10); await Task.Delay(10);
@ -173,17 +170,25 @@ namespace WCS.BLL
} }
public void Send(byte[] message) public void Send(byte[] message, bool IsReSend = false)
{ {
try try
{ {
var boardId = (message[3] << 8) + message[4]; var boardId = (message[3] << 8) + message[4];
if (boardId != 2047 && IsReSend == false)
{
MessageList.TryAdd(boardId, new MessageDto()
{
ID = boardId,
Message = message,
});
}
lock (sendLockObject) lock (sendLockObject)
{ {
tcpClient.Send(message); tcpClient.Send(message);
//TODO MessageList.AddOrUpdate(new Mes) //发送自带8ms间隔
//发送自带10ms间隔 Thread.Sleep(8);
Thread.Sleep(10);
} }
} }
catch (Exception ex) catch (Exception ex)
@ -226,18 +231,14 @@ namespace WCS.BLL
public class MessageDto public class MessageDto
{ {
public int ID { get; set; } public int ID { get; set; }
/// <summary> /// <summary>
/// 最后一次发送时间 /// 最后一次发送时间
/// </summary> /// </summary>
public DateTime LastSendTime { get; set; } = DateTime.Now; public DateTime LastSendTime { get; set; } = DateTime.Now;
/// <summary> /// <summary>
/// 发送内容 /// 发送内容
/// </summary> /// </summary>
public byte[] Message { get; set; } public byte[] Message { get; set; }
public bool IsWating { get; set; }
/// <summary> /// <summary>
/// 发送次数 /// 发送次数
/// </summary> /// </summary>

View File

@ -14,5 +14,9 @@ namespace WCS.Model.ApiModel.User
/// 是否配置为不登陆(如果不登陆 直接获取admin 且不验证密码了) /// 是否配置为不登陆(如果不登陆 直接获取admin 且不验证密码了)
/// </summary> /// </summary>
public bool IsNoLogin { get; set; } = false; public bool IsNoLogin { get; set; } = false;
public string WebSocketIpAddress { get; set; } = string.Empty;
public List<string> GroupNames { get; set; }
} }
} }

View File

@ -52,6 +52,8 @@ namespace WCS.WebApi.Controllers
[HttpPost(Name = "userLogin")] [HttpPost(Name = "userLogin")]
public async Task<ResponseBase> userLogin(UserLoginRequest request) public async Task<ResponseBase> userLogin(UserLoginRequest request)
{ {
//获取调用设备的Ip地址
request.WebSocketIpAddress = HttpContext?.Connection?.RemoteIpAddress?.ToString();
return await _userService.UserLogin(request); return await _userService.UserLogin(request);
} }
} }

View File

@ -20,19 +20,21 @@ namespace WebApi
{ {
public static void Main(string[] args) public static void Main(string[] args)
{ {
//<2F><>ʼ<EFBFBD><CABC>websocket
WebSoceketManager.InitWebSocket(); WebSoceketManager.InitWebSocket();
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD>
DbInit.InitDb(); DbInit.InitDb();
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
LocalFile.SaveConfig(); LocalFile.SaveConfig();
//<2F><>ʼ<EFBFBD><CABC>TCP<43><50><EFBFBD><EFBFBD>
TCPClientManager.InitTcpClient(); TCPClientManager.InitTcpClient();
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ShelfManager.InitShelves(); ShelfManager.InitShelves();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>ƺͰ<C6BA><CDB0><EFBFBD>
//TCPClientManager.InitStatus();
WarningManager.StartWarningMessageThread(); WarningManager.StartWarningMessageThread();
@ -71,7 +73,7 @@ namespace WebApi
app.UseAuthorization(); app.UseAuthorization();
app.MapControllers(); app.MapControllers();
app.Run("http://+:8888"); app.Run("http://0.0.0.0:8888");//0.0.0.0<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ipv4
} }
} }
} }

View File

@ -28,6 +28,7 @@ using System.Collections.ObjectModel;
using WCS.BLL.DbModels; using WCS.BLL.DbModels;
using WCS.Model.ApiModel.MatBaseInfo; using WCS.Model.ApiModel.MatBaseInfo;
using System.Security.Cryptography; using System.Security.Cryptography;
using Ping9719.WpfEx;
namespace .ViewModel namespace .ViewModel
{ {
@ -259,6 +260,33 @@ namespace 货架标准上位机.ViewModel
if (Result != null && Result.Code == 200) if (Result != null && Result.Code == 200)
{ {
scanner.MatSn = Result.Data.MatSN; scanner.MatSn = Result.Data.MatSN;
#region
Task.Run(() =>
{
try
{
var body = new QueryByMatSnRequest()
{
MatSn = scanner.MatSn,
ShelfCode = scanner.ShelfCode,
IpAddress = scanner.COM,
DeviceType = LocalFile.Config.DeviceType,
UserName = LocalStatic.CurrentUser,
};
var Result = ApiHelp.GetDataFromHttp<ResponseCommon<MatInfoModel>>(LocalFile.Config.ApiIpHost + "instore/queryInstoreStatus", body, "POST");
if (Result != null && !string.IsNullOrEmpty(Result.Message))
{
TextBoxLog.AddLog(Result.Message, "InstoreLog", DateTime.Now);
scanner.MatSn = string.Empty;
scanner.ScannerDisplayControl.RefreshValues(scanner.ShelfCode, scanner.MatSn);
}
}
catch (Exception ex)
{
Growl.Warning(ex.Message);
}
});
#endregion
} }
else if (Result != null && !string.IsNullOrEmpty(Result.Message)) else if (Result != null && !string.IsNullOrEmpty(Result.Message))
{ {

View File

@ -291,10 +291,10 @@
<!--状态栏--> <!--状态栏-->
<Border Margin="5,3" Grid.Row="2" Grid.ColumnSpan="2" Background="AliceBlue" CornerRadius="3"> <Border Margin="5,3" Grid.Row="2" Grid.ColumnSpan="2" Background="AliceBlue" CornerRadius="3">
<Grid> <Grid>
<StackPanel Margin="5" Orientation="Horizontal" HorizontalAlignment="Left"> <!--<StackPanel Margin="5" Orientation="Horizontal" HorizontalAlignment="Left">
<pi:IotState Content="WebSocket连接" IsOk="False" Height="auto" Width="auto" InteriorHeight="13" Foreground="Gray" Background="{x:Null}"></pi:IotState> <pi:IotState Content="WebSocket连接" IsOk="False" Height="auto" Width="auto" InteriorHeight="13" Foreground="Gray" Background="{x:Null}"></pi:IotState>
<Button Content="手动重连" ></Button> <Button Content="手动重连" ></Button>
</StackPanel> </StackPanel>-->
<StackPanel Margin="5" Orientation="Horizontal" HorizontalAlignment="Right"> <StackPanel Margin="5" Orientation="Horizontal" HorizontalAlignment="Right">
<TextBlock Margin="0,0" Text="{Binding Time,StringFormat=yyyy-MM-dd HH:mm:ss,FallbackValue=2000-01-01 00:00:00}" Foreground="#FF3A90C1" VerticalAlignment="Center"></TextBlock> <TextBlock Margin="0,0" Text="{Binding Time,StringFormat=yyyy-MM-dd HH:mm:ss,FallbackValue=2000-01-01 00:00:00}" Foreground="#FF3A90C1" VerticalAlignment="Center"></TextBlock>
</StackPanel> </StackPanel>

View File

@ -69,6 +69,7 @@ namespace 货架标准上位机
{ {
UserName = loginName, UserName = loginName,
DeviceType = LocalFile.Config.DeviceType, DeviceType = LocalFile.Config.DeviceType,
GroupNames = LocalFile.Config.GroupName,
PassWord = pass, PassWord = pass,
IsNoLogin = false, IsNoLogin = false,
}; };

View File

@ -4,13 +4,13 @@
//货架服务器的IP和端口号 //货架服务器的IP和端口号
"ApiIpHost": "http://localhost:8888/", "ApiIpHost": "http://localhost:8888/",
//货架分区 //货架分区
"GroupName": [ "A", "B", "C" ], "GroupName": [ "13寸智能货架", "7寸智能货架"],
//设备类型 可以配置为每个电脑不一样 //设备类型 可以配置为每个电脑不一样
"DeviceType": "WCS前端-开发电脑", "DeviceType": "WCS前端",
//货架类型的是否开机自检 //货架类型的是否开机自检
"IsBootSelfTest": false, "IsBootSelfTest": false,
//扫码枪COM口列表 //扫码枪COM口列表
"ScannerComList": [ "COM1", "COM2" ], "ScannerComList": [],
//串口扫码枪延时 //串口扫码枪延时
"ScannerTimeOut": 2000, "ScannerTimeOut": 2000,
//系统配置 //系统配置