172 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			172 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C#
		
	
	
	
| 
								 | 
							
								using DM_Weight.Models;
							 | 
						|||
| 
								 | 
							
								using log4net;
							 | 
						|||
| 
								 | 
							
								using SuperSimpleTcp;
							 | 
						|||
| 
								 | 
							
								using System;
							 | 
						|||
| 
								 | 
							
								using System.Collections.Generic;
							 | 
						|||
| 
								 | 
							
								using System.IO;
							 | 
						|||
| 
								 | 
							
								using System.Linq;
							 | 
						|||
| 
								 | 
							
								using System.Text;
							 | 
						|||
| 
								 | 
							
								using System.Threading.Channels;
							 | 
						|||
| 
								 | 
							
								using System.Threading.Tasks;
							 | 
						|||
| 
								 | 
							
								using System.Windows.Markup;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								namespace DM_Weight.Port
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								    public class ScreenUtil
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        private readonly ILog logger = LogManager.GetLogger(typeof(ScreenUtil));
							 | 
						|||
| 
								 | 
							
								        SimpleTcpServer server = new SimpleTcpServer("0.0.0.0:8888");
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        string ipport { get; set; } = "";
							 | 
						|||
| 
								 | 
							
								        public ScreenUtil()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            server.Events.ClientConnected += (object sender, ConnectionEventArgs e) =>
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                ipport = e.IpPort;
							 | 
						|||
| 
								 | 
							
								                logger.Info($"[{e.IpPort}] client connected");
							 | 
						|||
| 
								 | 
							
								            };
							 | 
						|||
| 
								 | 
							
								            server.Events.ClientDisconnected += (object sender, ConnectionEventArgs e) =>
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                logger.Info($"[{e.IpPort}] client disconnected: {e.Reason}");
							 | 
						|||
| 
								 | 
							
								            };
							 | 
						|||
| 
								 | 
							
								            server.Events.DataReceived += (object sender, DataReceivedEventArgs e) =>
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                logger.Info($"[{e.IpPort}]: {e.Data.Array}");
							 | 
						|||
| 
								 | 
							
								            };
							 | 
						|||
| 
								 | 
							
								            // let's go!
							 | 
						|||
| 
								 | 
							
								            server.Start();
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private byte[] head = new byte[] { 0xee, 0xb1, 0x12 };
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private byte[] end = new byte[] { 0xFF, 0xFC, 0xFF, 0xFF };
							 | 
						|||
| 
								 | 
							
								        public void SetStockInfo(ChannelStock channel, int screenId)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            // 添加画面id
							 | 
						|||
| 
								 | 
							
								            byte[] a = Copy2NewArr(head, HighLow(screenId));
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
							 | 
						|||
| 
								 | 
							
								            //if (channel.DrugInfo.DrugName != null)
							 | 
						|||
| 
								 | 
							
								            //{
							 | 
						|||
| 
								 | 
							
								            byte[] content = Encoding.GetEncoding("gb2312").GetBytes(channel.DrugInfo?.DrugName??"");
							 | 
						|||
| 
								 | 
							
								                a = WriteInfo(a, content, channel.ColNo * 10 + 1);
							 | 
						|||
| 
								 | 
							
								            //}
							 | 
						|||
| 
								 | 
							
								            //if (channel.DrugInfo.Manufactory != null)
							 | 
						|||
| 
								 | 
							
								            //{
							 | 
						|||
| 
								 | 
							
								                byte[] content1 = Encoding.GetEncoding("gb2312").GetBytes(channel.DrugInfo?.Manufactory?? "");
							 | 
						|||
| 
								 | 
							
								                a = WriteInfo(a, content1, channel.ColNo * 10 + 2);
							 | 
						|||
| 
								 | 
							
								            //}
							 | 
						|||
| 
								 | 
							
								            //if (channel.DrugInfo.DrugSpec != null)
							 | 
						|||
| 
								 | 
							
								            //{
							 | 
						|||
| 
								 | 
							
								                byte[] content2 = Encoding.GetEncoding("gb2312").GetBytes(channel.DrugInfo?.DrugSpec ?? "");
							 | 
						|||
| 
								 | 
							
								                a = WriteInfo(a, content2, channel.ColNo * 10 + 3);
							 | 
						|||
| 
								 | 
							
								            //}
							 | 
						|||
| 
								 | 
							
								            //if (channel.ManuNo != null)
							 | 
						|||
| 
								 | 
							
								            //{
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                byte[] content3 = Encoding.GetEncoding("gb2312").GetBytes(channel.ManuNo);
							 | 
						|||
| 
								 | 
							
								                a = WriteInfo(a, content3, channel.ColNo * 10 + 4);
							 | 
						|||
| 
								 | 
							
								            //}
							 | 
						|||
| 
								 | 
							
								            //if (channel.EffDate != null)
							 | 
						|||
| 
								 | 
							
								            //{
							 | 
						|||
| 
								 | 
							
								                byte[] content4 = Encoding.GetEncoding("gb2312").GetBytes(channel.EffDate);
							 | 
						|||
| 
								 | 
							
								                a = WriteInfo(a, content4, channel.ColNo * 10 + 5);
							 | 
						|||
| 
								 | 
							
								            //}
							 | 
						|||
| 
								 | 
							
								            //if (channel.Quantity != null)
							 | 
						|||
| 
								 | 
							
								            //{
							 | 
						|||
| 
								 | 
							
								                byte[] content5 = Encoding.GetEncoding("gb2312").GetBytes(channel.Quantity.ToString());
							 | 
						|||
| 
								 | 
							
								                a = WriteInfo(a, content5, channel.ColNo * 10 + 6);
							 | 
						|||
| 
								 | 
							
								            //}
							 | 
						|||
| 
								 | 
							
								            // 添加结束块
							 | 
						|||
| 
								 | 
							
								            byte[] b = Copy2NewArr(a, end);
							 | 
						|||
| 
								 | 
							
								            server.Send(ipport, b);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public void TellChange(int d)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            byte[] buffer = new byte[] { 0xee, 0xb5, 0x01, 0x00, 0xFF, 0xFC, 0xFF, 0xFF };
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public void SetStockInfo(List<ChannelStock> channels, int screenId)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            // 添加画面id
							 | 
						|||
| 
								 | 
							
								            byte[] a = Copy2NewArr(head, HighLow(screenId));
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            for (int i = 0; i < channels.Count; i++)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                ChannelStock channel = channels[i];
							 | 
						|||
| 
								 | 
							
								                if (channel.DrugInfo.DrugName != null)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    byte[] content = Encoding.ASCII.GetBytes(channel.DrugInfo.DrugName);
							 | 
						|||
| 
								 | 
							
								                    a = WriteInfo(a, content, channels[0].DrawerNo * 10 + 1);
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                if (channel.DrugInfo.Manufactory != null)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    byte[] content = Encoding.ASCII.GetBytes(channel.DrugInfo.Manufactory);
							 | 
						|||
| 
								 | 
							
								                    a = WriteInfo(a, content, channels[0].DrawerNo * 10 + 2);
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                if (channel.DrugInfo.DrugSpec != null)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    byte[] content = Encoding.ASCII.GetBytes(channel.DrugInfo.DrugSpec);
							 | 
						|||
| 
								 | 
							
								                    a = WriteInfo(a, content, channels[0].DrawerNo * 10 + 3);
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                if (channel.ManuNo != null)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                    byte[] content = Encoding.ASCII.GetBytes(channel.ManuNo);
							 | 
						|||
| 
								 | 
							
								                    a = WriteInfo(a, content, channels[0].DrawerNo * 10 + 4);
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                if (channel.EffDate != null)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    byte[] content = Encoding.ASCII.GetBytes(channel.EffDate);
							 | 
						|||
| 
								 | 
							
								                    a = WriteInfo(a, content, channels[0].DrawerNo * 10 + 5);
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                if (channel.Quantity != null)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    byte[] content = Encoding.ASCII.GetBytes(channel.Quantity.ToString());
							 | 
						|||
| 
								 | 
							
								                    a = WriteInfo(a, content, channels[0].DrawerNo * 10 + 6);
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            // 添加结束块
							 | 
						|||
| 
								 | 
							
								            byte[] b = Copy2NewArr(a, end);
							 | 
						|||
| 
								 | 
							
								            server.Send(ipport, b);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public byte[] WriteInfo(byte[] a, byte[] content, int id)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            // 添加控件id
							 | 
						|||
| 
								 | 
							
								            byte[] b = Copy2NewArr(a, HighLow(id));
							 | 
						|||
| 
								 | 
							
								            // 添加需要向控件内写入的字节长度
							 | 
						|||
| 
								 | 
							
								            byte[] c = Copy2NewArr(b, HighLow(content.Length));
							 | 
						|||
| 
								 | 
							
								            // 写入内容
							 | 
						|||
| 
								 | 
							
								            return Copy2NewArr(c, content);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public byte[] HighLow(int data)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            byte high = Convert.ToByte((data >> 8) & 0x00ff); //位运算:右移8位
							 | 
						|||
| 
								 | 
							
								            byte low = Convert.ToByte(data & 0x00ff);         //去掉高位
							 | 
						|||
| 
								 | 
							
								            return new byte[] {high, low};
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public byte[] Copy2NewArr(byte[] source1, byte[] source2)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            byte[] target = new byte[source1.Length + source2.Length];
							 | 
						|||
| 
								 | 
							
								            Buffer.BlockCopy(source1, 0, target, 0, source1.Length);
							 | 
						|||
| 
								 | 
							
								            Buffer.BlockCopy(source2, 0, target, source1.Length, source2.Length);
							 | 
						|||
| 
								 | 
							
								            return target;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |