唐山轨道机控制端TCP服务
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1440 lines
59 KiB

using Guidaoji.Camera;
using Newtonsoft.Json.Linq;
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
//using System.DirectoryServices;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.RegularExpressions;
using System.Text.Unicode;
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;
using static Guidaoji.Camera.CHCNetSDK.NET_DVR_WIFI_CFG_EX;
//using static System.Runtime.InteropServices.JavaScript.JSType;
namespace Guidaoji.Common
{
internal class TcpClientWrapper
{
public static Socket socket_commu;
public GuiDaoJi guiDaoJi = new GuiDaoJi();
//接收Json串
public static string sRetResule = null;
//位置
public static string[] dPos = { "0", "0" };
//连接成功标志
private static bool bConnect = false;
//轨道机返回对象
private static GuiDaoJiRet readAndSetRet = new GuiDaoJiRet();
//轨道机返回Upload对象
public static GuiDaoJiRet uploadRet = new GuiDaoJiRet();
//alarm对象
private static GuiDaoJiRet alarmRet = new GuiDaoJiRet();
//轨道机客户端IP 192.168.10.119 117.172.225.193
private static string sGuidaojiClientIP = "192.168.10.119";
private static int iGuidaojiClientPort = 20000;
//客户端IP
//private static string sClientIP = "192.168.10.104";
private static string sClientIP = "192.168.1.142";
private static int iClientPort = 20001;
//客户端1IP
private static string sUnityClientIP = "";
private static int iUnityClientPort = 20002;
private static Dictionary<int, Socket> dict = new Dictionary<int, Socket>();
public static void Socket(string ip, int port)
{
PrintInfo("Socket is begin......");
Socket server_socketListen = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//server_socketListen.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
//IPAddress ips = IPAddress.Parse("192.168.10.36");
//IPEndPoint ipNode = new IPEndPoint(ips, 20000);//网络端点:为IP地址和端口号
// //服务端必须绑定一个端口才能listen(),要不然客户端就不知道该连哪个端口了
//byte[] b = { 0x00, 0x6d };
//int I = BitConverter.ToInt16(FZ(b));
IPAddress ips = IPAddress.Parse(ip);
IPEndPoint ipNode = new IPEndPoint(ips, port);
try
{
server_socketListen.Bind(ipNode);
PrintInfo("服务器已启动......");
sClientIP = ip;
//监听后,如果客户端这时调用connect()发出连接请求,服务器端就会接收到这个请求
//listen函数将socket变为被动类型的,等待客户的连接请求。
server_socketListen.Listen(10);
//开启线程监听客户端
Thread t = new Thread(Execute);
t.IsBackground = true;
t.Start(server_socketListen);
PrintInfo("服务器启动监听成功!");
}
catch (Exception ex)
{
PrintInfo(ex.ToString());
}
}
/// <summary>
/// 监听客户端线程
/// </summary>
/// <param name="obj"></param>
private static void Execute(System.Object obj)
{
Socket server = (Socket)obj;
while (true)
{
//服务端有两个socket;这里Accept()返回的相当于是客户端的socket,用于和客户端发送(send)和接收(recv)数据
PrintInfo("等待客户端连接......");
Socket client = server.Accept();
//客户端IP和端口号
string clientIP = client.RemoteEndPoint == null ? "" : client.RemoteEndPoint.ToString();
clientIP = clientIP.Substring(0, clientIP.LastIndexOf(':'));
int clientPort = ((IPEndPoint)client.LocalEndPoint).Port;
// 将与客户端连接的 套接字 对象添加到集合中;
dict.Add(clientPort, client);
PrintInfo(string.Format("客户端连接成功!IP:{0},端口号:{1}", clientIP, clientPort));
Console.WriteLine(string.Format("客户端连接成功!IP:{0},端口号:{1}", clientIP, clientPort));
if (clientPort == iClientPort)
{
bConnect = true;
Console.WriteLine("连接成功");
PrintInfo("客户端连接成功连接成功......");
PrintInfo("Socket is end......");
Thread t = new Thread(ClientExecute);
t.IsBackground = true;
t.Start(client);
}
else if (clientPort == iUnityClientPort)
{
bConnect = true;
Console.WriteLine("连接成功");
PrintInfo("客户端连接成功连接成功......");
PrintInfo("Socket is end......");
Thread t = new Thread(UnityClientExecute);
t.IsBackground = true;
t.Start(client);
}
else
{
byte[] buffer = new byte[1024];
int count = client.Receive(buffer);
if (buffer[0] == 0x43 && buffer[1] == 0x48)
{
bConnect = true;
iGuidaojiClientPort = clientPort;
Console.WriteLine("轨道机连接成功");
PrintInfo("客户端连接成功连接成功......");
PrintInfo("Socket is end......");
Thread t = new Thread(GuidaojiExecute);
t.IsBackground = true;
t.Start(client);
}
}
}
}
/// <summary>
/// 接收轨道机客户端数据
/// </summary>
/// <param name="obj"></param>
private static void GuidaojiExecute(object obj)
{
PrintInfo("GuidaojiExecute(object obj) is begin");
Socket client = (Socket)obj;
try
{
while (true)
{
byte[] buffer = new byte[1024];
int count = client.Receive(buffer);
Thread.Sleep(100);
//连接断开
if (count == 0)
{
//删除字典组中的socket
if (dict.Any(kvp => kvp.Key == iGuidaojiClientPort))
{
DeleteValue(iGuidaojiClientPort);
}
break;
}
if (count > 0)
{
//校验包头
if (buffer[0] == 0x43 && buffer[1] == 0x48)
{
PrintInfo("校验包头成功");
//校验长度
byte[] length = new byte[2];
Array.Copy(buffer, 2, length, 0, 2);
PrintByte("接收长度:" + count + ";长度:", length);
PrintInfo("接收长度:" + count + ";长度:" + BitConverter.ToInt16(FZ(length),0));
int iCount = (int)BitConverter.ToInt16(FZ(length),0);
short sCount = BitConverter.ToInt16(FZ(length),0);
iCount = sCount;
if (count == iCount)
{
PrintInfo("校验长度成功");
// 计算校验码
byte[] data = new byte[count - 2];
Array.Copy(buffer, 0, data, 0, count - 2);
ushort checkBit = ModbusCRC16.CalculateCrc(data);
PrintByte("校验码:", data);
//判断校验码
//if ((byte)checkBit == buffer[count - 2] && (byte)(checkBit >> 8) == buffer[count - 1])
if ((byte)checkBit == buffer[count - 1] && (byte)(checkBit >> 8) == buffer[count - 2])
{
PrintInfo("校验码成功");
//判断设备地址
//todo
//处理数据
try
{
//提取Json数据
string jsonResult = Encoding.UTF8.GetString(data, 8, count - 10);
PrintInfo("接收唐山客户端数据:", jsonResult);
//将JSON解析为指定类型的对象
var guiDaoJiRetTemp = JsonSerializer.Deserialize<GuiDaoJiRet>(jsonResult);
if (guiDaoJiRetTemp != null)
{
//取出在轨道机接收到的数据
byte[] receiveData = new byte[count];
Array.Copy(buffer, 0, receiveData, 0, count);
if (guiDaoJiRetTemp.action == "upload")
{
//自动应答
byte[] senddata = SendDataUpload();
uploadRet = guiDaoJiRetTemp;
//分别给唐山客户端、unity客户端转发数据
if (dict.Any(kvp => kvp.Key == iClientPort))
{
dict[iClientPort].Send(receiveData);
PrintInfo("Send to Client :", Encoding.UTF8.GetString(receiveData));
}
if (dict.Any(kvp => kvp.Key == iUnityClientPort))
{
dict[iUnityClientPort].Send(receiveData);
PrintInfo("Send to UnityClient :", Encoding.UTF8.GetString(receiveData));
}
}
else if (guiDaoJiRetTemp.action == "set" || guiDaoJiRetTemp.action == "read")
{
readAndSetRet = guiDaoJiRetTemp;
PrintInfo("存放到服务器数据:", readAndSetRet.uid + ":" + readAndSetRet.data.y);
}
}
}
catch (Exception ex)
{
PrintInfo("ClientExecute(object obj) is end false", ex.Message);
//MessageBox.Show(ex.Message);
continue;
}
}
}
}
}
}
}
catch (Exception ex)
{
DeleteValue(iGuidaojiClientPort);
PrintInfo("ClientExecute(object obj) is end false", ex.Message);
//MessageBox.Show(ex.Message);
}
}
/// <summary>
/// 接收唐山客户端数据
/// </summary>
/// <param name="obj"></param>
private static void ClientExecute(object obj)
{
PrintInfo("ClientExecute(object obj) is begin");
Socket client = (Socket)obj;
try
{
while (true)
{
byte[] buffer = new byte[1024];
int count = client.Receive(buffer);
Thread.Sleep(100);
//连接断开
if (count == 0)
{
//删除字典组中的socket
if (dict.Any(kvp => kvp.Key == iClientPort))
{
DeleteValue(iClientPort);
}
break;
}
PrintInfo("接收唐山客户端数据:", Encoding.UTF8.GetString(buffer, 0, count));
PrintByte("接收唐山客户端数据:", buffer);
if (count == 1)
{
char cCommand = Convert.ToChar(buffer[0]);
switch (cCommand)
{
case (char)ControlCommands.F: //前进
GuiDaoFOrB(600);
break;
case (char)ControlCommands.B: //后退
GuiDaoFOrB(0);
break;
case (char)ControlCommands.U: //上升
GuiDaoJiUOrD(0);
break;
case (char)ControlCommands.D: //下降
GuiDaoJiUOrD(28);
break;
case (char)ControlCommands.S: //停止
GuiDaoJiStop();
break;
case (char)ControlCommands.R: //位置复位
SendReturn();
break;
case (char)ControlCommands.E: //故障复位
SendReset();
break;
default: break;
}
}
else if (count > 1)
{
//校验包头
if (buffer[0] == 0x43 && buffer[1] == 0x48)
{
PrintInfo("校验包头成功");
//校验长度
byte[] length = new byte[2];
Array.Copy(buffer, 2, length, 0, 2);
PrintByte("接收长度:" + count + ";长度:", length);
PrintInfo("接收长度:" + count + ";长度:" + BitConverter.ToInt16(FZ(length), 0));
int iCount = (int)BitConverter.ToInt16(FZ(length), 0);
short sCount = BitConverter.ToInt16(FZ(length),0);
iCount = sCount;
if (count == iCount)
{
PrintInfo("校验长度成功");
// 计算校验码
byte[] data = new byte[count - 2];
Array.Copy(buffer, 0, data, 0, count - 2);
ushort checkBit = ModbusCRC16.CalculateCrc(data);
PrintByte("校验码:", data);
//判断校验码
//if ((byte)checkBit == buffer[count - 2] && (byte)(checkBit >> 8) == buffer[count - 1])
if ((byte)checkBit == buffer[count - 1] && (byte)(checkBit >> 8) == buffer[count - 2])
{
PrintInfo("校验码成功");
//判断设备地址
//todo
//处理数据
try
{
//提取Json数据
string jsonResult = Encoding.UTF8.GetString(data, 8, count - 10);
PrintInfo("接收唐山客户端数据:", jsonResult);
//将JSON解析为指定类型的对象
var guiDaoJiRetTemp = JsonSerializer.Deserialize<GuiDaoJiRet>(jsonResult);
if (guiDaoJiRetTemp != null && guiDaoJiRetTemp.action == "alarm")
{
alarmRet = guiDaoJiRetTemp;
}
}
catch (Exception ex)
{
PrintInfo("ClientExecute(object obj) is end false", ex.Message);
//MessageBox.Show(ex.Message);
continue;
}
}
}
}
}
}
}
catch (Exception ex)
{
DeleteValue(iClientPort);
PrintInfo("ClientExecute(object obj) is end false", ex.Message);
//MessageBox.Show(ex.Message);
}
}
/// <summary>
/// 接收Unity客户端数据
/// </summary>
/// <param name="obj"></param>
private static void UnityClientExecute(object obj)
{
PrintInfo("UnityClientExecute(object obj) is begin");
Socket client = (Socket)obj;
try
{
while (true)
{
byte[] buffer = new byte[1024];
int count = client.Receive(buffer);
//连接断开
if (count == 0)
{
//删除字典组中的socket
if (dict.Any(kvp => kvp.Key == iUnityClientPort))
{
DeleteValue(iUnityClientPort);
}
break;
}
if (count > 0)
{
//将接收到的数据转换为字符串
string response = Encoding.UTF8.GetString(buffer, 0, count);
//获取Json数据的起始位置和长度
int startIndex = response.IndexOf('{');
int endIndex = response.LastIndexOf('}');
int jsonLength = endIndex - startIndex + 1;
//提取Json数据
string jsonResult = response.Substring(startIndex, jsonLength);
//将JSON解析为指定类型的对象
try
{
var guiDaoJiRetTemp = JsonSerializer.Deserialize<GuiDaoJiRet>(jsonResult);
if (guiDaoJiRetTemp != null)
{
if (guiDaoJiRetTemp.action == "upload")
{
//自动应答
byte[] senddata = SendDataUpload();
if (senddata != null)
{
if (dict.Any(kvp => kvp.Key == iUnityClientPort))
{
dict[iUnityClientPort].Send(senddata);
PrintInfo("Send to UnityClient:", Encoding.UTF8.GetString(senddata, 0, senddata.Length));
}
}
}
}
}
catch (Exception ex)
{
PrintInfo("UnityClientExecute(object obj) is end false", ex.Message);
//MessageBox.Show(ex.Message);
break;
}
}
}
}
catch (Exception ex)
{
DeleteValue(iUnityClientPort);
PrintInfo("UnityClientExecute(object obj) is end false", ex.Message);
//MessageBox.Show(ex.Message);
}
}
/// <summary>
/// 读轨道机位置
/// </summary>
/// <returns></returns>
public static GuiDaoJiRet SendDataRead()
{
PrintInfo("SendDataRead() is begin");
string uid = "XJ00001";
string action = "read";
DateTime date = DateTime.Now;
string fort = date.ToString("yyyy-MM-dd HH:mm:ss");
Console.WriteLine(fort);
// 创建JSON数据对象
var json = new
{
uid = uid,
action = action,
date = fort
};
// 将JSON数据对象序列化为字符串
var options = new JsonSerializerOptions { WriteIndented = true };
string jsonString = JsonSerializer.Serialize(json, options);
Console.WriteLine(jsonString);
// 将JSON字符串转换为字节数组
byte[] dataBytes = Encoding.UTF8.GetBytes(jsonString);
// 定义包头和设备地址
ushort baoTou = 0x4348;
ushort ADDR1 = 0x7;
ushort ADDR2 = 0xc925;
// 计算数据长度
ushort length = (ushort)(10 + dataBytes.Length);
Console.WriteLine(length);
// 将数据长度转换为字节数组并存储到集合中
List<byte> numberBytesList = new List<byte>();
numberBytesList.AddRange(FZ(baoTou));
numberBytesList.AddRange(FZ(length));
numberBytesList.AddRange(FZ(ADDR1));
numberBytesList.AddRange(FZ(ADDR2));
numberBytesList.AddRange(dataBytes);
//// 将包头、数据长度、设备地址和校验码组合成一个完整的字节数组
//List<byte> combineBytes = new List<byte>();
//foreach (var item in numberBytesList)
//{
// combineBytes.Add(item);
//}
//var hex = BitConverter.ToString(dataBytes, 0).Replace("-", string.Empty).ToLower();
//Console.WriteLine(hex);
byte[] Bytes = numberBytesList.ToArray();
// 计算校验码
ushort checkBit = ModbusCRC16.CalculateCrc(Bytes);
byte[] ushortBytes = BitConverter.GetBytes(checkBit);
numberBytesList.AddRange(FZ(checkBit));
byte[] data = numberBytesList.ToArray();
var hex = BitConverter.ToString(data, 0).Replace("-", string.Empty).ToLower();
Console.WriteLine(hex);
// 将字节数组转换为大端字节序
//var finalBytes = Bytes.SelectMany(i => BitConverter.GetBytes(i)).ToArray();
if (BitConverter.IsLittleEndian)
{
// 发送数据
PrintInfo("Send data:", Encoding.UTF8.GetString(data, 0, data.Length));
return (SendDataRead(data));
}
PrintInfo("SendDataRead() is end false");
return null;
}
public static bool SendDataSet(GuiDaoJiSet guiDaoJiSet)
{
PrintInfo("SendDataSet(GuiDaoJi guiDaoJi) is begin");
// 将JSON数据对象序列化为字符串
var options = new JsonSerializerOptions { Encoder = JavaScriptEncoder.Create(UnicodeRanges.All) };
string jsonString = JsonSerializer.Serialize(guiDaoJiSet, options);
PrintInfo("Json串:" + jsonString);
// 将JSON字符串转换为字节数组
// 将字符串转换为GB2312编码的字节数组
//注册
Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
Encoding gb2312 = Encoding.GetEncoding("GB2312");
byte[] dataBytes = gb2312.GetBytes(jsonString);
//byte[] dataBytes = Encoding.UTF8.GetBytes(jsonString);
PrintByte("---", dataBytes);
// 定义包头和设备地址
ushort baoTou = 0x4348;
ushort ADDR1 = 0x7;
ushort ADDR2 = 0xc925;
// 计算数据长度
int ushortSize = sizeof(ushort);
int totalUshortSize = 2 * ushortSize;
ushort length = (ushort)(10 + dataBytes.Length);
// 将数据长度转换为字节数组并存储到集合中
List<byte> numberBytesList = new List<byte>();
numberBytesList.AddRange(FZ(baoTou));
numberBytesList.AddRange(FZ(length));
numberBytesList.AddRange(FZ(ADDR1));
numberBytesList.AddRange(FZ(ADDR2));
//// 将包头、数据长度、设备地址和校验码组合成一个完整的字节数组
//List<byte> combineBytes = new List<byte>();
//foreach (var item in numberBytesList)
//{
// combineBytes.Add(item);
//}
numberBytesList.AddRange(dataBytes);
//var hex = BitConverter.ToString(dataBytes, 0).Replace("-", string.Empty).ToLower();
//Console.WriteLine(hex);
byte[] Bytes = numberBytesList.ToArray();
// 计算校验码
ushort checkBit = ModbusCRC16.CalculateCrc(Bytes);
// 将校验码转换为字节数组
byte[] ushortBytes = BitConverter.GetBytes(checkBit);
numberBytesList.AddRange(FZ(checkBit));
byte[] data = numberBytesList.ToArray();
var hex = BitConverter.ToString(data, 0).Replace("-", string.Empty).ToLower();
Console.WriteLine(hex);
// 将字节数组转换为大端字节序
//var finalBytes = Bytes.SelectMany(i => BitConverter.GetBytes(i)).ToArray();
if (BitConverter.IsLittleEndian)
{
// 发送数据
if (SendDataSet(data) != null)
{
PrintInfo("SendDataSet(GuiDaoJi guiDaoJi) is end true");
return true;
}
}
PrintInfo("SendDataSet(GuiDaoJi guiDaoJi) is end false");
return false;
}
public static byte[] SendDataUpload()
{
PrintInfo("SendDataUpload() is begin");
string uid = "XJ00001";
string action = "upload";
string result = "OK";
string date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
// 创建JSON数据对象
var json = new
{
uid = uid,
action = action,
date = date,
result = result
};
// 将JSON数据对象序列化为字符串
var options = new JsonSerializerOptions { WriteIndented = true };
string jsonString = JsonSerializer.Serialize(json, options);
// 将JSON字符串转换为字节数组
byte[] dataBytes = Encoding.UTF8.GetBytes(jsonString);
// 定义包头和设备地址
ushort baoTou = 0x4348;
ushort ADDR1 = 0x7;
ushort ADDR2 = 0xc925;
// 计算数据长度
int ushortSize = sizeof(ushort);
int totalUshortSize = 2 * ushortSize;
ushort length = (ushort)(10 + dataBytes.Length);
// 将数据长度转换为字节数组并存储到集合中
List<byte> numberBytesList = new List<byte>();
numberBytesList.AddRange(FZ(baoTou));
numberBytesList.AddRange(FZ(length));
numberBytesList.AddRange(FZ(ADDR1));
numberBytesList.AddRange(FZ(ADDR2));
// 将包头、数据长度、设备地址和校验码组合成一个完整的字节数组
//List<byte> combineBytes = new List<byte>();
//foreach (var item in numberBytesList)
//{
// combineBytes.Add(item);
//}
numberBytesList.AddRange(dataBytes);
//var hex = BitConverter.ToString(dataBytes, 0).Replace("-", string.Empty).ToLower();
//Console.WriteLine(hex);
byte[] Bytes = numberBytesList.ToArray();
// 计算校验码
ushort checkBit = ModbusCRC16.CalculateCrc(Bytes);
// 将校验码转换为字节数组
byte[] ushortBytes = BitConverter.GetBytes(checkBit);
numberBytesList.AddRange(FZ(checkBit));
byte[] data = numberBytesList.ToArray();
var hex = BitConverter.ToString(data, 0).Replace("-", string.Empty).ToLower();
Console.WriteLine(hex);
// 将字节数组转换为大端字节序
//var finalBytes = Bytes.SelectMany(i => BitConverter.GetBytes(i)).ToArray();
if (BitConverter.IsLittleEndian)
{
// 给轨道机客户端回数据
//socket_commu.Send(data);
PrintInfo("SendDataUpload() is end true. 给轨道机客户端回数据:", Encoding.UTF8.GetString(data, 0, data.Length));
return data;
}
else
{
PrintInfo("SendDataUpload() is end false");
return null;
}
}
/// <summary>
/// 发送报警信息
/// </summary>
/// <param name="sAlarmMessage"></param>
/// <returns></returns>
public static bool SendDataAlarm(string sAlarmMessage)
{
PrintInfo("SendDataAlarm(string sAlarmMessage) is begin");
string uid = "XJ00001";
string action = "alarm";
string result = sAlarmMessage;
string date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
// 创建JSON数据对象
var json = new
{
uid = uid,
action = action,
date = date,
result = result
};
// 将JSON数据对象序列化为字符串
var options = new JsonSerializerOptions { WriteIndented = true };
string jsonString = JsonSerializer.Serialize(json, options);
// 将JSON字符串转换为字节数组
byte[] dataBytes = Encoding.UTF8.GetBytes(jsonString);
// 定义包头和设备地址
ushort baoTou = 0x4348;
ushort ADDR1 = 0x7;
ushort ADDR2 = 0xc925;
// 计算数据长度
int ushortSize = sizeof(ushort);
int totalUshortSize = 2 * ushortSize;
ushort length = (ushort)(10 + dataBytes.Length);
// 将数据长度转换为字节数组并存储到集合中
List<byte> numberBytesList = new List<byte>();
numberBytesList.AddRange(FZ(baoTou));
numberBytesList.AddRange(FZ(length));
numberBytesList.AddRange(FZ(ADDR1));
numberBytesList.AddRange(FZ(ADDR2));
// 将包头、数据长度、设备地址和校验码组合成一个完整的字节数组
//List<byte> combineBytes = new List<byte>();
//foreach (var item in numberBytesList)
//{
// combineBytes.Add(item);
//}
numberBytesList.AddRange(dataBytes);
//var hex = BitConverter.ToString(dataBytes, 0).Replace("-", string.Empty).ToLower();
//Console.WriteLine(hex);
byte[] Bytes = numberBytesList.ToArray();
// 计算校验码
ushort checkBit = ModbusCRC16.CalculateCrc(Bytes);
// 将校验码转换为字节数组
byte[] ushortBytes = BitConverter.GetBytes(checkBit);
numberBytesList.AddRange(FZ(checkBit));
byte[] data = numberBytesList.ToArray();
var hex = BitConverter.ToString(data, 0).Replace("-", string.Empty).ToLower();
Console.WriteLine(hex);
// 将字节数组转换为大端字节序
//var finalBytes = Bytes.SelectMany(i => BitConverter.GetBytes(i)).ToArray();
if (BitConverter.IsLittleEndian)
{
if (SendDataAlarm(data) != null)
{
PrintInfo("SendDataAlarm(string sAlarmMessage) is end true");
return true;
}
}
PrintInfo("SendDataAlarm(string sAlarmMessage) is end false");
return false;
}
/// <summary>
/// 移动轨道机过程
/// </summary>
/// <param name="iMoveX">前后</param>
/// <param name="iMoveY">上下</param>
/// <param name="iSelIndex">选择通道</param>
/// <param name="sViedoPath">保存视频路径</param>
/// <returns></returns>
public static bool GuiDaoJMove(double iMoveX, double iMoveY, int iSelIndex, string sViedoPath)
{
PrintInfo("GuiDaoJMove(double iMoveX, double iMoveY, int iSelIndex, string sViedoPath)", iMoveX.ToString() + ":" + iMoveY);
if (!bConnect)
return false;
if (uploadRet.data.alarm[0] == 1)
{
PrintInfo("报警返回");
return false;
}
GuiDaoJiRet guiDaoJiRet = SendDataRead();
if (guiDaoJiRet != null)
{
PrintInfo("------------1-----------");
//如果需要移动的位置和当前位置一致
if (iMoveX.ToString() == guiDaoJiRet.data.x && iMoveY.ToString() == guiDaoJiRet.data.y)
{
PrintInfo("------------2-----------");
return true;
}
CHNetHelp.SaveViedo(true, iSelIndex, sViedoPath);
string sUid = "XJ00001";
GuiDaoJiSet guiDaoJi = new GuiDaoJiSet();
guiDaoJi.uid = sUid;
guiDaoJi.action = "set";
guiDaoJi.send_gap = 1;
guiDaoJi.cont = 0;
guiDaoJi.contda.@return = 0;
guiDaoJi.contda.reset = 0;
guiDaoJi.contda.lamp = 0;
guiDaoJi.move = 1;
guiDaoJi.moveda.rate = 2;
guiDaoJi.moveda.x = guiDaoJiRet.data.x;
guiDaoJi.moveda.y = iMoveY.ToString();
guiDaoJi.voice = 0;
guiDaoJi.voiceda.@string = "";
guiDaoJi.date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//如果轨道机在上面
if (guiDaoJiRet.data.y != "0.0")
{
guiDaoJi.moveda.y = "0.0";
guiDaoJi.date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
if (SendDataSet(guiDaoJi))
{
PrintInfo("--------------向上-------------", dPos[0] + ":" + dPos[1]);
while (true)
{
if (double.Parse(dPos[1]) == 0)
break;
Thread.Sleep(100);
}
}
}
guiDaoJi.moveda.x = iMoveX.ToString();
guiDaoJi.moveda.y = "0.0";
guiDaoJi.date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
if (SendDataSet(guiDaoJi))
{
while (true)
{
PrintInfo("--------------向前-------------");
if (dPos[0] == iMoveX.ToString())
break;
Thread.Sleep(100);
}
guiDaoJi.moveda.x = iMoveX.ToString();
guiDaoJi.moveda.y = iMoveY.ToString();
guiDaoJi.date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
if (SendDataSet(guiDaoJi))
{
while (true)
{
PrintInfo("--------------向下-------------");
if (dPos[1] == iMoveY.ToString())
{
CHNetHelp.SaveViedo(false, iSelIndex, sViedoPath);
return true;
}
Thread.Sleep(100);
}
}
}
CHNetHelp.SaveViedo(false, iSelIndex, sViedoPath);
}
return false;
}
/// <summary>
/// 轨道机上下移动
/// </summary>
/// <param name="iMoveX">前后</param>
/// <returns></returns>
public static bool GuiDaoJiUpOrDown(double iMoveX, double iMoveY)
{
PrintInfo("GuiDaoJiUpOrDown(double iMoveY) is begin");
if (!bConnect)
return false;
if (uploadRet.data.alarm[0] == 1)
{
PrintInfo("报警返回");
return false;
}
GuiDaoJiRet guiDaoJiRet1 = SendDataRead();
if (guiDaoJiRet1 != null)
{
PrintInfo(guiDaoJiRet1.uid + ":" + guiDaoJiRet1.data.y);
////如果需要移动的位置和当前位置一致
//if (guiDaoJiRet1.data.y == "0.0" || guiDaoJiRet1.data.y == "-0.0")
// return true;
PrintInfo("------------2-------------", Math.Round((double.Parse(guiDaoJiRet1.data.x) + iMoveX), 1).ToString() + ":" + Math.Round(double.Parse(guiDaoJiRet1.data.y) + iMoveY, 1).ToString());
string sUid = "XJ00001";
GuiDaoJiSet guiDaoJiSet = new GuiDaoJiSet();
guiDaoJiSet.uid = sUid;
guiDaoJiSet.action = "set";
guiDaoJiSet.send_gap = 1;
guiDaoJiSet.cont = 0;
guiDaoJiSet.contda.@return = 0;
guiDaoJiSet.contda.reset = 0;
guiDaoJiSet.contda.lamp = 0;
guiDaoJiSet.move = 1;
guiDaoJiSet.moveda.rate = 2;
guiDaoJiSet.moveda.x = Math.Round((double.Parse(guiDaoJiRet1.data.x) + iMoveX), 1).ToString();
guiDaoJiSet.moveda.y = Math.Round(double.Parse(guiDaoJiRet1.data.y) + iMoveY, 1).ToString();
guiDaoJiSet.voice = 0;
//Voiceda voiceda = new Voiceda();
//voiceda.@string = "";
//guiDaoJiSet.voiceda.Add(voiceda);
guiDaoJiSet.voiceda.@string = "";
guiDaoJiSet.date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
PrintInfo("------------3-------------", guiDaoJiSet.uid + ":" + guiDaoJiSet.moveda.y);
return SendDataSet(guiDaoJiSet);
}
PrintInfo("GuiDaoJiUpOrDown(double iMoveY) is end false");
return false;
}
/// <summary>
/// 轨道机前后移动
/// </summary>
/// <param name="iMoveX">前后</param>
/// <returns></returns>
public static bool GuiDaoFOrB(double iMoveX)
{
PrintInfo("GuiDaoJiUpOrDown(double iMoveY) is begin");
if (!bConnect)
return false;
if (uploadRet.data.alarm[0] == 1)
{
PrintInfo("报警返回");
return false;
}
GuiDaoJiRet guiDaoJiRet1 = SendDataRead();
if (guiDaoJiRet1 != null)
{
PrintInfo(guiDaoJiRet1.uid + ":" + guiDaoJiRet1.data.y);
////如果需要移动的位置和当前位置一致
//if (guiDaoJiRet1.data.y == "0.0" || guiDaoJiRet1.data.y == "-0.0")
// return true;
PrintInfo("------------2-------------", Math.Round((double.Parse(guiDaoJiRet1.data.x) + iMoveX), 1).ToString());
string sUid = "XJ00001";
GuiDaoJiSet guiDaoJiSet = new GuiDaoJiSet();
guiDaoJiSet.uid = sUid;
guiDaoJiSet.action = "set";
guiDaoJiSet.send_gap = 1;
guiDaoJiSet.cont = 0;
guiDaoJiSet.contda.@return = 0;
guiDaoJiSet.contda.reset = 0;
guiDaoJiSet.contda.lamp = 0;
guiDaoJiSet.move = 1;
guiDaoJiSet.moveda.rate = 2;
guiDaoJiSet.moveda.x = Math.Round(iMoveX, 1).ToString();
guiDaoJiSet.moveda.y = Math.Round(double.Parse(guiDaoJiRet1.data.y), 1).ToString();
guiDaoJiSet.voice = 0;
//Voiceda voiceda = new Voiceda();
//voiceda.@string = "";
//guiDaoJiSet.voiceda.Add(voiceda);
guiDaoJiSet.voiceda.@string = "";
guiDaoJiSet.date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
PrintInfo("------------3-------------", guiDaoJiSet.uid + ":" + guiDaoJiSet.moveda.y);
return SendDataSet(guiDaoJiSet);
}
PrintInfo("GuiDaoJiUpOrDown(double iMoveY) is end false");
return false;
}
/// <summary>
/// 轨道机上下移动
/// </summary>
/// <param name="iMoveY">上下</param>
/// <returns></returns>
public static bool GuiDaoJiUOrD(double iMoveY)
{
PrintInfo("GuiDaoJiUpOrDown(double iMoveY) is begin");
if (!bConnect)
return false;
if (uploadRet.data.alarm[0] == 1)
{
PrintInfo("报警返回");
return false;
}
GuiDaoJiRet guiDaoJiRet1 = SendDataRead();
if (guiDaoJiRet1 != null)
{
PrintInfo(guiDaoJiRet1.uid + ":" + guiDaoJiRet1.data.y);
////如果需要移动的位置和当前位置一致
//if (guiDaoJiRet1.data.y == "0.0" || guiDaoJiRet1.data.y == "-0.0")
// return true;
PrintInfo("------------2-------------", Math.Round(double.Parse(guiDaoJiRet1.data.y) + iMoveY, 1).ToString());
string sUid = "XJ00001";
GuiDaoJiSet guiDaoJiSet = new GuiDaoJiSet();
guiDaoJiSet.uid = sUid;
guiDaoJiSet.action = "set";
guiDaoJiSet.send_gap = 1;
guiDaoJiSet.cont = 0;
guiDaoJiSet.contda.@return = 0;
guiDaoJiSet.contda.reset = 0;
guiDaoJiSet.contda.lamp = 0;
guiDaoJiSet.move = 1;
guiDaoJiSet.moveda.rate = 2;
guiDaoJiSet.moveda.x = Math.Round(double.Parse(guiDaoJiRet1.data.x), 1).ToString();
guiDaoJiSet.moveda.y = Math.Round(iMoveY, 1).ToString();
guiDaoJiSet.voice = 0;
//Voiceda voiceda = new Voiceda();
//voiceda.@string = "";
//guiDaoJiSet.voiceda.Add(voiceda);
guiDaoJiSet.voiceda.@string = "";
guiDaoJiSet.date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
PrintInfo("------------3-------------", guiDaoJiSet.uid + ":" + guiDaoJiSet.moveda.y);
return SendDataSet(guiDaoJiSet);
}
PrintInfo("GuiDaoJiUpOrDown(double iMoveY) is end false");
return false;
}
public static void GuiDaoJiStop()
{
PrintInfo("------------Stop1-------------");
string sUid = "XJ00001";
GuiDaoJiSet guiDaoJiSet = new GuiDaoJiSet();
guiDaoJiSet.uid = sUid;
guiDaoJiSet.action = "set";
guiDaoJiSet.send_gap = 1;
guiDaoJiSet.cont = 0;
guiDaoJiSet.contda.@return = 0;
guiDaoJiSet.contda.reset = 0;
guiDaoJiSet.contda.lamp = 0;
guiDaoJiSet.move = 1;
guiDaoJiSet.moveda.rate = 0;
guiDaoJiSet.moveda.x = "0.0";
guiDaoJiSet.moveda.y = "0.0";
guiDaoJiSet.voice = 0;
guiDaoJiSet.voiceda.@string = "";
guiDaoJiSet.date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
PrintInfo("------------Stop2-------------", guiDaoJiSet.uid + ":" + guiDaoJiSet.moveda.y);
SendDataSet(guiDaoJiSet);
}
/// <summary>
/// 轨道机上下移动
/// </summary>
/// <param name="iMoveX">前后</param>
/// <returns></returns>
public static bool GuiDaoJiMove(double iMoveX, double iMoveY)
{
PrintInfo("GuiDaoJiUpOrDown(double iMoveY) is begin");
if (!bConnect)
return false;
if (uploadRet.data.alarm[0] == 1)
{
PrintInfo("报警返回");
return false;
}
PrintInfo("------------2-------------");
string sUid = "XJ00001";
GuiDaoJiSet guiDaoJiSet = new GuiDaoJiSet();
guiDaoJiSet.uid = sUid;
guiDaoJiSet.action = "set";
guiDaoJiSet.send_gap = 1;
guiDaoJiSet.cont = 0;
guiDaoJiSet.contda.@return = 0;
guiDaoJiSet.contda.reset = 0;
guiDaoJiSet.contda.lamp = 0;
guiDaoJiSet.move = 1;
guiDaoJiSet.moveda.rate = 2;
guiDaoJiSet.moveda.x = Math.Round(iMoveX, 1).ToString();
guiDaoJiSet.moveda.y = Math.Round(iMoveY, 1).ToString();
guiDaoJiSet.voice = 0;
guiDaoJiSet.voiceda.@string = "";
guiDaoJiSet.date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
PrintInfo("------------3-------------", guiDaoJiSet.uid + ":" + guiDaoJiSet.moveda.y);
return SendDataSet(guiDaoJiSet);
}
/// <summary>
/// 轨道机移动
/// </summary>
/// <param name="iLed">灯状态</param>
/// <param name="sVoice">语音播放内容</param>
public static bool SetLedAndVoice(int iLed, string sVoice)
{
string sUid = "XJ00001";
GuiDaoJiSet guiDaoJi = new GuiDaoJiSet();
guiDaoJi.uid = sUid;
guiDaoJi.action = "set";
guiDaoJi.send_gap = 2;
guiDaoJi.cont = 1;
guiDaoJi.contda.@return = 0;
guiDaoJi.contda.reset = 0;
guiDaoJi.contda.lamp = iLed;
guiDaoJi.move = 0;
guiDaoJi.moveda.rate = 0;
guiDaoJi.moveda.x = "0.0";
guiDaoJi.moveda.y = "0.0";
guiDaoJi.voice = 1;
guiDaoJi.voiceda.@string = sVoice;
guiDaoJi.date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
return SendDataSet(guiDaoJi);
}
/// <summary>
/// 轨道故障复位
/// </summary>
public static bool SendReset()
{
string sUid = "XJ00001";
GuiDaoJiSet guiDaoJi = new GuiDaoJiSet();
guiDaoJi.uid = sUid;
guiDaoJi.action = "set";
guiDaoJi.send_gap = 2;
guiDaoJi.cont = 1;
guiDaoJi.contda.@return = 0;
guiDaoJi.contda.reset = 1;
guiDaoJi.contda.lamp = 0;
guiDaoJi.move = 0;
guiDaoJi.moveda.rate = 0;
guiDaoJi.moveda.x = "0.0";
guiDaoJi.moveda.y = "0.0";
guiDaoJi.voice = 0;
guiDaoJi.voiceda.@string = "";
guiDaoJi.date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
return SendDataSet(guiDaoJi);
}
/// <summary>
/// 轨道位置复位
/// </summary>
public static bool SendReturn()
{
string sUid = "XJ00001";
GuiDaoJiSet guiDaoJi = new GuiDaoJiSet();
guiDaoJi.uid = sUid;
guiDaoJi.action = "set";
guiDaoJi.send_gap = 2;
guiDaoJi.cont = 1;
guiDaoJi.contda.@return = 1;
guiDaoJi.contda.reset = 0;
guiDaoJi.contda.lamp = 0;
guiDaoJi.move = 0;
guiDaoJi.moveda.rate = 0;
guiDaoJi.moveda.x = "0.0";
guiDaoJi.moveda.y = "0.0";
guiDaoJi.voice = 0;
guiDaoJi.voiceda.@string = "";
guiDaoJi.date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
return SendDataSet(guiDaoJi);
}
/// <summary>
/// 向轨道机客户端发数据
/// </summary>
/// <param name="btData"></param>
/// <returns></returns>
public static GuiDaoJiRet SendDataSet(byte[] btData)
{
PrintInfo("GuiDaoJiRet SendDataSet(byte[] btData) is begin");
if (dict.Any(kvp => kvp.Key == iGuidaojiClientPort))
{
dict[iGuidaojiClientPort].Send(btData);
uint time = 50;
while (time-- != 0)
{
PrintInfo("time:", time.ToString());
PrintInfo("sSetState:", "set");
if (readAndSetRet != null && readAndSetRet.action == "set")
{
GuiDaoJiRet sData = readAndSetRet;
PrintInfo("GuiDaoJiRet SendDataSet(byte[] btData) is end true. ", readAndSetRet.uid + ":" + readAndSetRet.data.y);
PrintInfo("GuiDaoJiRet SendDataSet(byte[] btData) is end true. ", sData.uid + ":" + sData.data.y);
return sData;
}
Thread.Sleep(100);
}
}
PrintInfo("GuiDaoJiRet SendDataSet(byte[] btData) is end false");
return null;
}
/// <summary>
/// 向轨道机客户端发数据
/// </summary>
/// <param name="btData"></param>
/// <returns></returns>
public static GuiDaoJiRet SendDataRead(byte[] btData)
{
PrintInfo("GuiDaoJiRet SendDataRead(byte[] btData) is begin");
if (dict.Any(kvp => kvp.Key == iGuidaojiClientPort))
{
dict[iGuidaojiClientPort].Send(btData);
uint time = 50;
while (time-- != 0)
{
PrintInfo("time:", time.ToString());
PrintInfo("sSetState:", "read");
if (readAndSetRet != null && readAndSetRet.action == "read")
{
GuiDaoJiRet sData = readAndSetRet;
PrintInfo("GuiDaoJiRet SendDataRead(byte[] btData) is end true. ", readAndSetRet.uid + ":" + readAndSetRet.data.y);
PrintInfo("GuiDaoJiRet SendDataRead(byte[] btData) is end true. ", sData.uid + ":" + sData.data.y);
return sData;
}
Thread.Sleep(100);
}
}
PrintInfo("GuiDaoJiRet SendDataRead(byte[] btData) is end false");
return null;
}
/// <summary>
/// 向唐山客户端发数据
/// </summary>
/// <param name="btData"></param>
/// <returns></returns>
public static GuiDaoJiRet SendDataAlarm(byte[] btData)
{
PrintInfo("GuiDaoJiRet SendDataAlarm(byte[] btData) is begin");
if (dict.Any(kvp => kvp.Key == iClientPort))
{
dict[iClientPort].Send(btData);
uint time = 50;
while (time-- != 0)
{
PrintInfo("time:", time.ToString());
PrintInfo("sSetState:", "alarm");
if (alarmRet != null && alarmRet.action == "alarm")
{
GuiDaoJiRet sData = alarmRet;
PrintInfo("GuiDaoJiRet SendDataAlarm(byte[] btData) is end true. ", alarmRet.uid + ":" + alarmRet.result);
return sData;
}
Thread.Sleep(100);
}
}
PrintInfo("GuiDaoJiRet SendDataAlarm(byte[] btData) is end false");
return null;
}
public static void Close()
{
socket_commu.Close();
Console.WriteLine("关闭成功");
}
static byte[] FZ(ushort val)
{
byte[] bytes = BitConverter.GetBytes(val);
byte aa = bytes[0];
bytes[0] = bytes[1];
bytes[1] = aa;
return bytes;
}
static byte[] FZ(byte[] bytes)
{
byte aa = bytes[0];
bytes[0] = bytes[1];
bytes[1] = aa;
return bytes;
}
public static void PrintInfo(string funcName, string funcOper = null)
{
//记录时间
string time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//获取行号
System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace(1, true);
int i = st.GetFrame(0).GetFileLineNumber();
//组织打印信息
string sFileInfo = "[" + i + "]:" + time + " " + funcName + " " + funcOper + "\n";
//创建日志文件夹.
string path = Environment.CurrentDirectory + "/Log";
string txtName = DateTime.Now.ToString("yyyy_MM_dd") + ".txt";
try
{
// 文件夹不存在则创建
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
}
catch (Exception e)
{
Console.WriteLine("The process failed: {0}", e.ToString());
}
finally { }
try
{
//向文本中输入日志
FileStream fileLog = new FileStream(path + @"\" + txtName + "", FileMode.Append, FileAccess.Write, FileShare.Read);
StreamWriter writeFileLog = new StreamWriter(fileLog);
writeFileLog.Write(sFileInfo);
//清空缓冲区
writeFileLog.Flush();
//关闭流
writeFileLog.Close();
fileLog.Close();
//释放流
fileLog.Dispose();
//向输出流打印日志
System.Diagnostics.Debugger.Log(0, null, sFileInfo);
}
catch { }
}
public static void PrintInt(string funcName, int[] funcOper = null)
{
//记录时间
string time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//获取行号
System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace(1, true);
int i = st.GetFrame(0).GetFileLineNumber();
//组织打印信息
string sFileInfo = "[" + i + "]:" + time + " " + funcName + " ";
if (funcOper != null)
{
for (int j = 0; j < funcOper.Length; j++)
{
sFileInfo += funcOper[j].ToString() + " ";
}
sFileInfo += "\n";
}
//创建日志文件夹.
string path = Environment.CurrentDirectory + "/Log";
string txtName = DateTime.Now.ToString("yyyy_MM_dd") + ".txt";
try
{
// 文件夹不存在则创建
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
}
catch (Exception e)
{
Console.WriteLine("The process failed: {0}", e.ToString());
}
finally { }
try
{
//向文本中输入日志
FileStream fileLog = new FileStream(path + @"\" + txtName + "", FileMode.Append, FileAccess.Write, FileShare.Read);
StreamWriter writeFileLog = new StreamWriter(fileLog);
writeFileLog.Write(sFileInfo);
//清空缓冲区
writeFileLog.Flush();
//关闭流
writeFileLog.Close();
fileLog.Close();
//释放流
fileLog.Dispose();
//向输出流打印日志
System.Diagnostics.Debugger.Log(0, null, sFileInfo);
}
catch { }
}
private static void DeleteValue(int iPort)
{
//删除字典组中的socket
if (dict.Any(kvp => kvp.Key == iPort))
{
dict[iPort].Shutdown(SocketShutdown.Both);
dict[iPort].Close();
dict[iPort].Dispose();
dict[iPort] = null;
dict.Remove(iPort);
}
}
public static void PrintByte(string funcName, byte[] data)
{
string sData = BitConverter.ToString(data).Replace('-', ' ');
//记录时间
string time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//获取行号
System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace(1, true);
int i = st.GetFrame(0).GetFileLineNumber();
//组织打印信息
string sFileInfo = "[" + i + "]:" + time + " " + funcName + " " + sData + "\r\n";
//创建日志文件夹.
string path = Environment.CurrentDirectory + "/Log";
string txtName = DateTime.Now.ToString("yyyy_MM_dd") + ".txt";
try
{
// 文件夹不存在则创建
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
}
catch (Exception e)
{
Console.WriteLine("The process failed: {0}", e.ToString());
}
finally { }
try
{
//向文本中输入日志
FileStream fileLog = new FileStream(path + @"\" + txtName + "", FileMode.Append, FileAccess.Write, FileShare.Read);
StreamWriter writeFileLog = new StreamWriter(fileLog);
writeFileLog.Write(sFileInfo);
//清空缓冲区
writeFileLog.Flush();
//关闭流
writeFileLog.Close();
fileLog.Close();
//释放流
fileLog.Dispose();
//向输出流打印日志
System.Diagnostics.Debugger.Log(0, null, sFileInfo);
}
catch (Exception e)
{
Console.WriteLine("The process failed: {0}", e.ToString());
//MessageBox.Show(e.ToString());
}
}
}
}