|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
using System.Net.Sockets;
|
|
|
using System.Text;
|
|
|
using System.Text.RegularExpressions;
|
|
|
using System.Threading;
|
|
|
|
|
|
namespace POSV.Printer
|
|
|
{
|
|
|
public class LabelPrinterUtils
|
|
|
{
|
|
|
|
|
|
public static Tuple<bool, string> PrintContent(PrinterObject pobj, List<PrintContent> content)
|
|
|
{
|
|
|
lock (PrinterUtils._lock)
|
|
|
{
|
|
|
Tuple<bool , string> result = null;
|
|
|
try
|
|
|
{
|
|
|
IntPtr _IntPtr = IntPtr.Zero;
|
|
|
|
|
|
var dynamic = pobj.DynamicLibrary;
|
|
|
var portType = pobj.PortType;
|
|
|
|
|
|
string _portName = pobj.Data[PrinterObject.COM_PORT_NAME];
|
|
|
string _portBaud = pobj.Data[PrinterObject.COM_PORT_BAUD];
|
|
|
|
|
|
int baud = 0;
|
|
|
int.TryParse(_portBaud , out baud);
|
|
|
|
|
|
switch (portType)
|
|
|
{
|
|
|
case PortType.串口:
|
|
|
{
|
|
|
int iPort = 0;
|
|
|
switch (_portName)
|
|
|
{
|
|
|
case "COM1":
|
|
|
iPort = 1;
|
|
|
break;
|
|
|
case "COM2":
|
|
|
iPort = 2;
|
|
|
break;
|
|
|
case "COM3":
|
|
|
iPort = 3;
|
|
|
break;
|
|
|
case "COM4":
|
|
|
iPort = 4;
|
|
|
break;
|
|
|
default:
|
|
|
iPort = 0;
|
|
|
break;
|
|
|
}
|
|
|
Send2YKDLL(pobj , content , iPort , baud);
|
|
|
}
|
|
|
break;
|
|
|
case PortType.网口:
|
|
|
{
|
|
|
SendNetPort(pobj , content);
|
|
|
}
|
|
|
break;
|
|
|
case PortType.并口:
|
|
|
{
|
|
|
int iPort = 0;
|
|
|
switch (_portName)
|
|
|
{
|
|
|
case "LPT1":
|
|
|
iPort = 11;
|
|
|
break;
|
|
|
case "LPT2":
|
|
|
iPort = 12;
|
|
|
break;
|
|
|
default:
|
|
|
iPort = 0;
|
|
|
break;
|
|
|
}
|
|
|
Send2YKDLL(pobj , content , iPort , baud);
|
|
|
}
|
|
|
break;
|
|
|
case PortType.驱动:
|
|
|
{
|
|
|
PrinterUtils.OpenDrivePort(pobj , content);
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case PortType.USB:
|
|
|
{
|
|
|
switch (dynamic)
|
|
|
{
|
|
|
case DynamicLibrary.北洋打印机专用:
|
|
|
{
|
|
|
PrinterUtils.OpenBeiyangUsbPort(pobj , content);
|
|
|
}
|
|
|
break;
|
|
|
case DynamicLibrary.通用打印模式:
|
|
|
default:
|
|
|
{
|
|
|
Send2YKDLL(pobj , content , 13 , baud);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case PortType.None:
|
|
|
{
|
|
|
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
result = new Tuple<bool , string>(true , "打印成功");
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
result = new Tuple<bool , string>(false , "打印出现错误,请检查配置");
|
|
|
}
|
|
|
finally
|
|
|
{
|
|
|
ByPosDll.POS_Close();
|
|
|
Thread.Sleep(5);
|
|
|
|
|
|
YkPosDll.YkCloseDevice();
|
|
|
Thread.Sleep(5);
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
private static Tuple<bool, string> Send2YKDLL(PrinterObject pobj, List<PrintContent> content, int iPort, int baud)
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
YkPosDll.YkOpenDevice(iPort, baud);
|
|
|
foreach(var p in content)
|
|
|
{
|
|
|
YkPosDll.YkPrintStr(p.Content);
|
|
|
}
|
|
|
}
|
|
|
catch(Exception ex)
|
|
|
{
|
|
|
return new Tuple<bool, string>(false, "YKDLL打印异常");
|
|
|
}
|
|
|
finally
|
|
|
{
|
|
|
YkPosDll.YkCloseDevice();
|
|
|
}
|
|
|
return new Tuple<bool, string>(true, "YKDLL打印成功!");
|
|
|
}
|
|
|
|
|
|
private static Tuple<bool, string> SendNetPort(PrinterObject pobj, List<PrintContent> content)
|
|
|
{
|
|
|
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
|
|
try
|
|
|
{
|
|
|
string _ipAddress = pobj.Data[PrinterObject.NET_IP_ADDRESS];
|
|
|
socket.Connect(_ipAddress, 9100);
|
|
|
foreach(var p in content)
|
|
|
{
|
|
|
byte[] buffer = Encoding.Default.GetBytes(p.Content.ToString());
|
|
|
socket.Send(buffer);
|
|
|
}
|
|
|
socket.Shutdown(SocketShutdown.Both);
|
|
|
}
|
|
|
catch(Exception ex)
|
|
|
{
|
|
|
return new Tuple<bool, string>(false, "网口打印发生异常");
|
|
|
}
|
|
|
finally
|
|
|
{
|
|
|
socket.Close();
|
|
|
}
|
|
|
return new Tuple<bool, string>(true, "网口打印成功");
|
|
|
}
|
|
|
}
|
|
|
}
|