You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
490 lines
18 KiB
C#
490 lines
18 KiB
C#
using AduSkin.Controls.Metro;
|
|
using AduSkin.Controls;
|
|
using CommunityToolkit.Mvvm.Input;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.VisualBasic;
|
|
using NVelocity.Util.Introspection;
|
|
using Prism.Events;
|
|
using SlnMesnac.Common;
|
|
using SlnMesnac.Config;
|
|
using SlnMesnac.Serilog;
|
|
using SlnMesnac.WPF.Attribute;
|
|
using SlnMesnac.WPF.Event;
|
|
using SlnMesnac.WPF.ViewModel.Base;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using TouchSocket.Core;
|
|
using TouchSocket.Sockets;
|
|
using CommunityToolkit.Mvvm.ComponentModel;
|
|
using System.Windows.Documents;
|
|
using SlnMesnac.Business;
|
|
using static Microsoft.WindowsAPICodePack.Shell.PropertySystem.SystemProperties.System;
|
|
using System.Windows.Markup;
|
|
|
|
namespace SlnMesnac.WPF.ViewModel.Index
|
|
{
|
|
[RegisterAsSingletonAttribute]
|
|
public partial class IndexViewModel : BaseViewModel
|
|
{
|
|
public readonly SerilogHelper _logger;
|
|
|
|
private readonly AppConfig _appConfig;
|
|
|
|
private readonly StringChange _stringChange;
|
|
|
|
private readonly IEventAggregator _eventAggregator;
|
|
|
|
private readonly SerialBusiness _serialBusiness;
|
|
|
|
public IndexViewModel(SerilogHelper logger,AppConfig appConfig,StringChange stringChange, IEventAggregator eventAggregator, SerialBusiness serialBusiness)
|
|
{
|
|
_logger = logger;
|
|
_appConfig = appConfig;
|
|
_stringChange = stringChange;
|
|
_eventAggregator = eventAggregator;
|
|
_serialBusiness = serialBusiness;
|
|
|
|
_serialBusiness.OpenPort();
|
|
|
|
}
|
|
|
|
[ObservableProperty]
|
|
private string firstBatchEpcBarcode = string.Empty;
|
|
|
|
[ObservableProperty]
|
|
private string secondBatchEpcBarcode = string.Empty;
|
|
|
|
[ObservableProperty]
|
|
private string thirdBatchEpcBarcode = string.Empty;
|
|
|
|
[ObservableProperty]
|
|
private string fourthBatchEpcBarcode = string.Empty;
|
|
|
|
[ObservableProperty]
|
|
private string fifthBatchEpcBarcode = string.Empty;
|
|
|
|
[ObservableProperty]
|
|
private string sixthBatchEpcBarcode = string.Empty;
|
|
|
|
/// <summary>
|
|
/// 加载产品信息
|
|
/// </summary>
|
|
/// <param name="deviceCode"></param>
|
|
[RelayCommand]
|
|
private void LoadProductInfo(string deviceCode)
|
|
{
|
|
string code = deviceCode as string;
|
|
|
|
_eventAggregator.GetEvent<ProductCodeEvent>().Publish(code);
|
|
|
|
var mainWindow = App.ServiceProvider.GetService<MainWindowViewModel>();
|
|
mainWindow.ControlOnClick("ProductInfo");
|
|
}
|
|
|
|
[RelayCommand]
|
|
private void ReadEpcCode(string deviceCode)
|
|
{
|
|
string configKey = string.Empty;
|
|
if (deviceCode == "050-B" || deviceCode == "I68")
|
|
{
|
|
configKey = "I68";
|
|
}
|
|
else
|
|
{
|
|
configKey = deviceCode;
|
|
}
|
|
var rfidConfig = _appConfig.rfidConfig.Where(x => x.equipKey == configKey).FirstOrDefault();
|
|
try
|
|
{
|
|
if (rfidConfig != null)
|
|
{
|
|
var session = rfidConfig.session as TcpClient;
|
|
|
|
if (session != null)
|
|
{
|
|
|
|
session.Connect();
|
|
|
|
var waitClinet = session.CreateWaitingClient(new WaitingOptions()
|
|
{
|
|
FilterFunc = response =>
|
|
{
|
|
return true;
|
|
}
|
|
});
|
|
|
|
byte[] buffer = null;
|
|
|
|
if (deviceCode == "I90" || deviceCode == "RFR-RFLY")
|
|
{
|
|
buffer = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x03, 0x00, 0x10, 0x00, 0x04 };
|
|
}
|
|
|
|
if (deviceCode == "050-B") //站1
|
|
{
|
|
buffer = new byte[] { 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00, 0x02, 0x00, 0x04 };
|
|
}
|
|
|
|
if (deviceCode == "I68") //站2
|
|
{
|
|
buffer = new byte[] { 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00, 0x06, 0x00, 0x04 };
|
|
}
|
|
|
|
ResponsedData responsedData = waitClinet.SendThenResponse(buffer, 5000);
|
|
|
|
string str = _stringChange.bytesToHexStr(responsedData.Data, responsedData.Data.Length).Substring(18, 16);
|
|
|
|
SetEpcBarCode(deviceCode, str);
|
|
|
|
NoticeManager.NotifiactionShow.AddNotifiaction(new NotifiactionModel()
|
|
{
|
|
Title = "通知",
|
|
Content = $"{deviceCode}设备读取成功:{str}",
|
|
NotifiactionType = EnumPromptType.Success
|
|
});
|
|
}
|
|
else
|
|
{
|
|
NoticeManager.NotifiactionShow.AddNotifiaction(new NotifiactionModel()
|
|
{
|
|
Title = "通知",
|
|
Content = $"{deviceCode}设备未连接",
|
|
NotifiactionType = EnumPromptType.Warn
|
|
});
|
|
}
|
|
}
|
|
else
|
|
{
|
|
NoticeManager.NotifiactionShow.AddNotifiaction(new NotifiactionModel()
|
|
{
|
|
Title = "通知",
|
|
Content = $"{deviceCode}设备未获取到配置信息",
|
|
NotifiactionType = EnumPromptType.Warn
|
|
});
|
|
}
|
|
}catch (Exception ex)
|
|
{
|
|
NoticeManager.NotifiactionShow.AddNotifiaction(new NotifiactionModel()
|
|
{
|
|
Title = "通知",
|
|
Content = $"条码读取异常:{ex.Message}",
|
|
NotifiactionType = EnumPromptType.Error
|
|
});
|
|
}
|
|
finally
|
|
{
|
|
var session = rfidConfig.session as TcpClient;
|
|
|
|
session.Close();
|
|
}
|
|
}
|
|
|
|
[RelayCommand]
|
|
private void WriteEpcCode(string deviceCode)
|
|
{
|
|
string configKey = string.Empty;
|
|
if (deviceCode == "050-B" || deviceCode == "I68")
|
|
{
|
|
configKey = "I68";
|
|
}
|
|
else
|
|
{
|
|
configKey = deviceCode;
|
|
}
|
|
var rfidConfig = _appConfig.rfidConfig.Where(x => x.equipKey == configKey).FirstOrDefault();
|
|
try
|
|
{
|
|
if (rfidConfig != null)
|
|
{
|
|
var session = rfidConfig.session as TcpClient;
|
|
|
|
if (session != null)
|
|
{
|
|
session.Connect();
|
|
|
|
var waitClinet = session.CreateWaitingClient(new WaitingOptions()
|
|
{
|
|
FilterFunc = response =>
|
|
{
|
|
return true;
|
|
}
|
|
});
|
|
|
|
byte[] buffer = null;
|
|
|
|
if (deviceCode == "I90" || deviceCode == "RFR-RFLY")
|
|
{
|
|
byte[] FixedPart = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04};
|
|
|
|
string epcBarCode = string.Empty;
|
|
|
|
if (deviceCode == "I90")
|
|
{
|
|
epcBarCode = FirstBatchEpcBarcode;
|
|
}
|
|
else
|
|
{
|
|
epcBarCode = SecondBatchEpcBarcode;
|
|
}
|
|
|
|
int inputByteLength = epcBarCode.Length / 2;
|
|
byte[] fixedPartWithLength = new byte[FixedPart.Length + 1];
|
|
Array.Copy(FixedPart, fixedPartWithLength, FixedPart.Length);
|
|
fixedPartWithLength[fixedPartWithLength.Length - 1] = (byte)inputByteLength;
|
|
|
|
byte[] inputBytes = Enumerable.Range(0, epcBarCode.Length)
|
|
.Where(x => x % 2 == 0)
|
|
.Select(x => Convert.ToByte(FirstBatchEpcBarcode.Substring(x, 2), 16))
|
|
.ToArray();
|
|
buffer = new byte[fixedPartWithLength.Length + inputBytes.Length];
|
|
|
|
Array.Copy(fixedPartWithLength, buffer, fixedPartWithLength.Length);
|
|
|
|
Array.Copy(inputBytes, 0, buffer, fixedPartWithLength.Length, inputBytes.Length);
|
|
}
|
|
|
|
if (deviceCode == "050-B")
|
|
{
|
|
buffer = new byte[] { 0x00, 0x82, 0x00, 0x00, 0x00, 0x1F, 0x01, 0x10, 0x00, 0x00, 0x00, 0x0C, 0x18, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
|
|
|
|
byte[] inputBytes = Enumerable.Range(0, FourthBatchEpcBarcode.Length)
|
|
.Where(x => x % 2 == 0)
|
|
.Select(x => Convert.ToByte(FourthBatchEpcBarcode.Substring(x, 2), 16))
|
|
.ToArray();
|
|
buffer = buffer.Concat(inputBytes).ToArray();
|
|
}
|
|
|
|
if (deviceCode == "I68")
|
|
{
|
|
buffer = new byte[] { 0x00, 0x89, 0x00, 0x00, 0x00, 0x27, 0x01, 0x10, 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
|
|
|
|
byte[] inputBytes = Enumerable.Range(0, ThirdBatchEpcBarcode.Length)
|
|
.Where(x => x % 2 == 0)
|
|
.Select(x => Convert.ToByte(ThirdBatchEpcBarcode.Substring(x, 2), 16))
|
|
.ToArray();
|
|
buffer = buffer.Concat(inputBytes).ToArray();
|
|
|
|
}
|
|
|
|
|
|
|
|
ResponsedData responsedData = waitClinet.SendThenResponse(buffer, 5000);
|
|
|
|
//string str = _stringChange.bytesToHexStr(responsedData.Data, responsedData.Data.Length).Substring(18, 16);
|
|
|
|
//SetEpcBarCode(deviceCode, str);
|
|
|
|
NoticeManager.NotifiactionShow.AddNotifiaction(new NotifiactionModel()
|
|
{
|
|
Title = "通知",
|
|
Content = $"{deviceCode}设备写入成功",
|
|
NotifiactionType = EnumPromptType.Success
|
|
});
|
|
}
|
|
else
|
|
{
|
|
NoticeManager.NotifiactionShow.AddNotifiaction(new NotifiactionModel()
|
|
{
|
|
Title = "通知",
|
|
Content = $"{deviceCode}设备未连接",
|
|
NotifiactionType = EnumPromptType.Warn
|
|
});
|
|
}
|
|
}
|
|
else
|
|
{
|
|
NoticeManager.NotifiactionShow.AddNotifiaction(new NotifiactionModel()
|
|
{
|
|
Title = "通知",
|
|
Content = $"{deviceCode}设备未获取到配置信息",
|
|
NotifiactionType = EnumPromptType.Warn
|
|
});
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
NoticeManager.NotifiactionShow.AddNotifiaction(new NotifiactionModel()
|
|
{
|
|
Title = "通知",
|
|
Content = $"{deviceCode}设备写入异常:{ex.Message}",
|
|
NotifiactionType = EnumPromptType.Error
|
|
});
|
|
}
|
|
finally
|
|
{
|
|
var session = rfidConfig.session as TcpClient;
|
|
|
|
session.Close();
|
|
}
|
|
}
|
|
|
|
[RelayCommand]
|
|
private void ReadEpcCodeByRtu(string deviceCode)
|
|
{
|
|
try
|
|
{
|
|
|
|
byte[] buffer = null;
|
|
|
|
if (deviceCode == "I40") //站1
|
|
{
|
|
buffer = new byte[] { 0x01, 0x03, 0x00, 0x10, 0x00, 0x04, 0x45, 0xCC, };
|
|
}
|
|
|
|
if (deviceCode == "RFR-050") //站2
|
|
{
|
|
buffer = new byte[] { 0x02, 0x03, 0x00, 0x10, 0x00, 0x04, 0x45, 0xFF, };
|
|
}
|
|
|
|
byte[] response = _serialBusiness.SendDataAndWaitForResponse(buffer);
|
|
|
|
if (response.Length == 13)
|
|
{
|
|
string str = _stringChange.bytesToHexStr(response, response.Length).Substring(6, 16);
|
|
|
|
SetEpcBarCode(deviceCode, str);
|
|
|
|
NoticeManager.NotifiactionShow.AddNotifiaction(new NotifiactionModel()
|
|
{
|
|
Title = "通知",
|
|
Content = $"{deviceCode}设备读取成功:{str}",
|
|
NotifiactionType = EnumPromptType.Success
|
|
});
|
|
}
|
|
else
|
|
{
|
|
SetEpcBarCode(deviceCode, string.Empty);
|
|
NoticeManager.NotifiactionShow.AddNotifiaction(new NotifiactionModel()
|
|
{
|
|
Title = "通知",
|
|
Content = $"{deviceCode}设备读取失败",
|
|
NotifiactionType = EnumPromptType.Success
|
|
});
|
|
}
|
|
|
|
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
NoticeManager.NotifiactionShow.AddNotifiaction(new NotifiactionModel()
|
|
{
|
|
Title = "通知",
|
|
Content = $"条码读取异常:{ex.Message}",
|
|
NotifiactionType = EnumPromptType.Error
|
|
});
|
|
}
|
|
}
|
|
|
|
[RelayCommand]
|
|
private void WriteEpcCodeByRtu(string deviceCode)
|
|
{
|
|
try
|
|
{
|
|
//站1
|
|
//01 10 00 10 00 04 08 11 11 22 22 11 11 22 22 85 41
|
|
//01 10 00 10 00 04 08 11 11 11 11 11 11 11 11 85 41
|
|
//站2 02 10 00 10 00 04 08 11 11 11 11 11 11 11 11 93 62
|
|
byte[] buffer = null;
|
|
if (deviceCode == "I40")
|
|
{
|
|
buffer = new byte[] { 0x01, 0x10, 0x00, 0x10, 0x00, 0x04, 0x08, };
|
|
byte[] inputBytes = Enumerable.Range(0, SixthBatchEpcBarcode.Length)
|
|
.Where(x => x % 2 == 0)
|
|
.Select(x => Convert.ToByte(SixthBatchEpcBarcode.Substring(x, 2), 16))
|
|
.ToArray();
|
|
buffer = buffer.Concat(inputBytes).ToArray();
|
|
byte[] crcBytes = CRCCalc(buffer);
|
|
|
|
buffer = buffer.Concat(crcBytes).ToArray();
|
|
}
|
|
|
|
if (deviceCode == "RFR-050")
|
|
{
|
|
buffer = new byte[] { 0x02, 0x10, 0x00, 0x10, 0x00, 0x04, 0x08, };
|
|
byte[] inputBytes = Enumerable.Range(0, FifthBatchEpcBarcode.Length)
|
|
.Where(x => x % 2 == 0)
|
|
.Select(x => Convert.ToByte(FifthBatchEpcBarcode.Substring(x, 2), 16))
|
|
.ToArray();
|
|
buffer = buffer.Concat(inputBytes).ToArray();
|
|
byte[] crcBytes = CRCCalc(buffer);
|
|
|
|
buffer = buffer.Concat(crcBytes).ToArray();
|
|
|
|
}
|
|
|
|
_logger.Info($"{deviceCode}发送:{_stringChange.bytesToHexStr(buffer, buffer.Length)}");
|
|
var responsedData = _serialBusiness.SendDataAndWaitForResponse(buffer);
|
|
|
|
NoticeManager.NotifiactionShow.AddNotifiaction(new NotifiactionModel()
|
|
{
|
|
Title = "通知",
|
|
Content = $"{deviceCode}设备写入成功",
|
|
NotifiactionType = EnumPromptType.Success
|
|
});
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
NoticeManager.NotifiactionShow.AddNotifiaction(new NotifiactionModel()
|
|
{
|
|
Title = "通知",
|
|
Content = $"{deviceCode}设备写入异常:{ex.Message}",
|
|
NotifiactionType = EnumPromptType.Error
|
|
});
|
|
}
|
|
}
|
|
|
|
public static byte[] CRCCalc(byte[] data)
|
|
{
|
|
int crc = 0xffff;
|
|
for (int i = 0; i < data.Length; i++)
|
|
{
|
|
crc ^= data[i];
|
|
for (int j = 0; j < 8; j++)
|
|
{
|
|
int temp = crc & 1;
|
|
crc >>= 1;
|
|
crc &= 0x7fff;
|
|
if (temp == 1)
|
|
{
|
|
crc ^= 0xa001;
|
|
}
|
|
crc &= 0xffff;
|
|
}
|
|
}
|
|
byte[] crc16 = new byte[2];
|
|
crc16[1] = (byte)((crc >> 8) & 0xff);
|
|
crc16[0] = (byte)(crc & 0xff);
|
|
return crc16;
|
|
}
|
|
|
|
private void SetEpcBarCode(string deviceCode,string str)
|
|
{
|
|
switch (deviceCode)
|
|
{
|
|
case "I90":
|
|
FirstBatchEpcBarcode = str;
|
|
break;
|
|
case "RFR-RFLY":
|
|
SecondBatchEpcBarcode = str;
|
|
break;
|
|
case "I68":
|
|
ThirdBatchEpcBarcode = str;
|
|
break;
|
|
case "050-B":
|
|
FourthBatchEpcBarcode = str;
|
|
break;
|
|
case "RFR-050":
|
|
FifthBatchEpcBarcode = str;
|
|
break;
|
|
case "I40":
|
|
SixthBatchEpcBarcode= str;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
} |