using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Linq;
using SlnMesnac.Model.domain;
using SlnMesnac.Model.dto;
using System.Text.Json.Nodes;
namespace SlnMesnac.Business
{
public class SerialPortBusiness
{
private static readonly object _object = new object();
private SerialPort _serialPort;
public delegate void RefreshSerialPortDeviceStatus(int isFlag);
public event RefreshSerialPortDeviceStatus RefreshSerialPortDeviceStatusEvent;
///
/// 刷新日志内容
///
public delegate void RefreshLogMessage(string message);
public event RefreshLogMessage RefreshLogMessageEvent;
//public delegate void ReceivedMeterConfigInfo(ElectricMeterInfoDto electricMeterInfo, List electricMeterConfigInfos);
//public event ReceivedMeterConfigInfo ReceivedMeterConfigInfoEvent;
public delegate void ReceivedBarcodeInfo(string barcodeInfo);
public static event ReceivedBarcodeInfo? ReceivedBarcodeInfoEvent;
//public delegate void ReceivedGatewayConfigInfo(GatewayInfoDto gatewayInfoDto);
//public event ReceivedGatewayConfigInfo ReceivedGatewayConfigInfoEvent;
///
/// 获取系统内的串口
///
///
public void GetSerialPorts(out List serialPorts)
{
serialPorts = SerialPort.GetPortNames().ToList();
}
///
/// 打开串口
///
/// 串口号
/// 波特率
/// 校验位None = 0,Odd = 1, Even = 2,Mark = 3,Space = 4,
/// 数据位
/// 停止位
public void OpenSerialPort(string serialPort, int baudRate, int parity, int dataBits, int stopBits)
{
if (string.IsNullOrEmpty(serialPort))
{
throw new ArgumentException("串口号不能为空");
}
_serialPort = new SerialPort(serialPort, baudRate, (System.IO.Ports.Parity)parity, dataBits, (StopBits)stopBits);
_serialPort.DataReceived += SerialPortDataReceived;
_serialPort.Open();
RefreshSerialPortDeviceStatusEvent?.Invoke(1);
}
///
/// 关闭串口
///
///
public void CloseSerialPort()
{
if (_serialPort == null)
{
throw new ArgumentException("串口实例为空");
}
_serialPort.Close();
RefreshSerialPortDeviceStatusEvent?.Invoke(2);
}
///
/// 发送数据
///
///
///
public void SendMessage(string message)
{
try
{
if (message == null)
{
throw new ArgumentException("发送内容为空");
}
//RefreshLogMessageEvent?.Invoke($"发送指令:{message}");
if(_serialPort != null && _serialPort.IsOpen)
{
_serialPort.Write(message);
RefreshLogMessageEvent?.Invoke("发送成功");
}
else
{
RefreshLogMessageEvent?.Invoke("串口未打开,无法发送数据");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
///
/// 串口数据接收
///
///
///
private void SerialPortDataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
lock (string.Empty)
{
Thread.Sleep(50);
SerialPort sp = (SerialPort)sender;
// 读取字节数据
int bytesToRead = _serialPort.BytesToRead;
byte[] buffer = new byte[bytesToRead];
sp.Read(buffer, 0, bytesToRead);
string data = System.Text.Encoding.ASCII.GetString(buffer);
if (!string.IsNullOrEmpty(data))
{
RefreshLogMessageEvent?.Invoke("Received data: " + data);
ReceivedBarcodeInfoEvent?.Invoke(data);
//Analys(data);
}
}
}
catch (Exception ex)
{
Console.WriteLine("接收数据时发生错误: " + ex.Message);
}
}
/////
///// 解析数据
/////
/////
//public void Analys(string jsonStr)
//{
// try
// {
// if (jsonStr.Contains("OK"))
// {
// RefreshLogMessageEvent?.Invoke($"修改成功");
// return;
// }
// else if (jsonStr.Contains("Error"))
// {
// RefreshLogMessageEvent?.Invoke($"修改失败");
// return;
// }
// else if (jsonStr.Contains("MeterSerialNumber")) //电表信息
// {
// #region 判断JSON格式合法性,获取第一个}为结尾,避免硬件返回多余数据
// int lastBraceIndex = jsonStr.IndexOf('}');
// if (lastBraceIndex != -1)
// {
// jsonStr = jsonStr.Substring(0, lastBraceIndex + 1);
// }
// else
// {
// RefreshLogMessageEvent?.Invoke($"设备信息指令有误:{jsonStr}");
// return;
// }
// #endregion
// RefreshLogMessageEvent?.Invoke($"解析电表设备信息:{jsonStr}");
// if (!string.IsNullOrEmpty(jsonStr))
// {
// var jsonObject = JObject.Parse(jsonStr);
// ElectricMeterInfoDto electricMeterInfo = JsonConvert.DeserializeObject(jsonObject.ToString());
// AnalysMeterConfig(jsonObject, ref electricMeterInfo, out List electricMeterConfigInfos);
// ReceivedMeterConfigInfoEvent?.Invoke(electricMeterInfo, electricMeterConfigInfos);
// }
// }else if (jsonStr.Contains("NaturalGas"))
// {
// RefreshLogMessageEvent?.Invoke($"解析网关设备信息:{jsonStr}");
// GatewayInfoDto gatewayInfo = JsonConvert.DeserializeObject(jsonStr);
// ReceivedGatewayConfigInfoEvent?.Invoke(gatewayInfo);
// }
// }
// catch (Exception ex)
// {
// RefreshLogMessageEvent?.Invoke($"解析逻辑异常:{ex.Message};原始数据:{jsonStr}");
// }
//}
/////
///// 解析子表配置信息
/////
/////
/////
/////
//private void AnalysMeterConfig(JObject jsonObject, ref ElectricMeterInfoDto electricMeterInfo, out List electricMeterConfigInfos)
//{
// electricMeterConfigInfos = new List();
// foreach (var property in jsonObject.Properties())
// {
// if (electricMeterInfo.GetType().GetProperty(property.Name) == null)
// {
// string proValue = property.Value.ToObject();
// string[] proValueArray = proValue.Split(",");
// if (proValueArray.Length == 4)
// {
// ElectricMeterConfigInfo electricMeterConfigInfo = new ElectricMeterConfigInfo();
// electricMeterConfigInfo.PointName = property.Name;
// electricMeterConfigInfo.InitialAddress = proValueArray[0];
// electricMeterConfigInfo.Length = Convert.ToInt32(proValueArray[1]);
// electricMeterConfigInfo.Rate = proValueArray[2];
// electricMeterConfigInfo.DataType = Convert.ToInt32(proValueArray[3]);
// electricMeterConfigInfos.Add(electricMeterConfigInfo);
// }
// }
// }
//}
}
}