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.

480 lines
14 KiB
C#

using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;
namespace Estsh.Client.StepLibrary
{
public class RF182C
{
// Socket to realise TCP/IP conncetion
private static Socket Connection = null;
// connectet (true) or not (false)
private bool ConnectionState = false;
// buffer for received data
public static String ReceiveBuffer = "";
// Indicator for an error in asynchronous receive threads
public bool TagState =false;
public bool AsyncError = false;
public static string Message = "";
public static string BarCode = "";
//初始化
private string _editMessage = @"<command><reset><param>0025000000010001</param></reset></command>";
//写——前部分
private static string _write_F_Message = @"<command><writeTagData><startAddress>0000</startAddress><data>";
//写——后部分
private static string _write_B_Message = @"</data></writeTagData></command>";
//读--前部分
private string _Read_F_Message = @"<command><readTagData><startAddress>0000</startAddress><dataLength>";
//读——后部分
private string _Read_B_Message = @"</dataLength></readTagData></command>";
private static string _readMessage = @"<command><readTagData><startAddress>0000</startAddress><dataLength>0028</dataLength></readTagData></command>";
//连接
public bool Connect ( string editIP , int editPort )
{
try
{
//Collect port and IP from the window.
int port = 0;
if ( Int32 .TryParse (editPort .ToString () , out port) == false || port <= 0 )
{
Message = ( editIP + " is not a legal port" );
return false;
}
IPHostEntry hostEntry = null;
hostEntry = Dns .GetHostEntry (editIP);
foreach ( IPAddress address in hostEntry .AddressList )
{
IPEndPoint ipe = new IPEndPoint (address , port);
// stream based TCP/IP socket
Socket tempSocket = new Socket (ipe .AddressFamily , SocketType .Stream , ProtocolType .Tcp);
// the actual connect
tempSocket .Connect (ipe);
if ( tempSocket .Connected )
{
Connection = tempSocket;
Connection .ReceiveTimeout = 25;
break;
}
}
if ( Connection == null ) return false;
//Start asynchronous receive
ReceiveString s = new ReceiveString ();
Connection .BeginReceive (s .buffer , 0 , ReceiveString .BufferSize , 0 , new AsyncCallback (ReceiveCallback) , s);
ConnectionState = true;
return true;
}
catch ( Exception ex )
{
Message = ( "Connecting Failed - " + ex .Message );
return false;
}
}
private void ReceiveCallback ( IAsyncResult res )
{
try
{
if ( ConnectionState == true )
{
// Collect data
int size = Connection .EndReceive (res);
ReceiveString s = ( ReceiveString ) res .AsyncState;
lock ( ReceiveBuffer )
{
//Store data in buffer
ReceiveBuffer += Encoding .ASCII .GetString (s .buffer , 0 , size);
}
//Start new asynchronous receive
ReceiveString rs = new ReceiveString ();
Connection .BeginReceive (rs .buffer , 0 , ReceiveString .BufferSize , 0 , new AsyncCallback (ReceiveCallback) , rs);
}
}
catch ( Exception ex )
{
// An error occured --> report it
AsyncError = false;
Message = ( ex .Message );
}
}
//初始化
public bool Initialization ()
{
bool result= Send (_editMessage);
return result;
}
//写信息
public static bool Write ( string barcode )
{
string SN = string.Empty;
if (barcode.Length <= 40)
{
SN = barcode.PadRight(40, '*');
}
else
{
SN = barcode;
}
//转ASCII
byte[] array = System.Text.Encoding.ASCII.GetBytes(SN); //数组array为对应的ASCII数组
string ASCIIstr2 = null;
for ( int i = 0 ; i < array .Length ; i++ )
{
int asciicode = ( int ) ( array [ i ] );
ASCIIstr2 += Convert .ToString (asciicode);//字符串ASCIIstr2 为对应的ASCII字符串
}
string a = _write_F_Message + ASCIIstr2 + _write_B_Message;
bool result = Send (a);
//ReceiveBuffer = "";
return result;
}
//写信信息为空
public bool WriteNull(string barcode)
{
string SN = string.Empty;
SN = barcode;
//转ASCII
byte[] array = System.Text.Encoding.ASCII.GetBytes(SN); //数组array为对应的ASCII数组
string ASCIIstr2 = null;
for (int i = 0; i < array.Length; i++)
{
int asciicode = (int)(array[i]);
ASCIIstr2 += Convert.ToString(asciicode);//字符串ASCIIstr2 为对应的ASCII字符串
}
string a = _write_F_Message + ASCIIstr2 + _write_B_Message;
bool result = Send(a);
//ReceiveBuffer = "";
return result;
}
//读信息
public static bool read ()
{
//ASCII转字符串
bool result = Send (_readMessage);
string str1 = string .Empty;
//string str = ReceiveBuffer.ToString();
if ( ReceiveBuffer .ToString () == "" )
{
Message = "读取信息出错";
}
int z=0;
for ( int i = 1 ; i > z ; i++ )
{
if ( ReceiveBuffer .ToString () != "" )
{
z = i + 1;
}
}
Thread.Sleep(79);
string a ="";
Regex reg_2 = new Regex ("(?i)(?<=<resultCode>)[^\"]*(?=</resultCode>)");
MatchCollection mc2 = reg_2 .Matches (ReceiveBuffer);
foreach ( Match m in mc2 )
{
a += m .Value;
}
Thread.Sleep(79);
if ( a .ToString () != "" )
{
string t2 = "0000";
if ( !a .Contains (t2) )
{
Message = "读取信息出错";
return false;
}
}
string b = "";
Regex reg = new Regex ("(?i)(?<=<data>)[^\"]*(?=</data>)");
MatchCollection mc = reg .Matches (ReceiveBuffer);
foreach ( Match m in mc )
{
b += m .Value;
}
Thread.Sleep(79);
for ( int i = 0 ; i < b .Length - 1 ; i++ )
{
string subStr = b.Substring(i, 2);
//00是终止符
if (subStr != "00")
{
int j = int.Parse(subStr);
str1 += Encoding.ASCII.GetString(new byte[] { (byte)j });
i++;
}
else
{
i++;
}
}
Thread.Sleep(219);
BarCode = str1.Replace("/0", "");
BarCode = BarCode.Replace("*", "");
//ReceiveBuffer = "";
if ( BarCode == "" )
{
result = false;
}
else
{
result = true;
}
return result;
}
//发送命令
public static bool Send ( string editMessage )
{
if ( editMessage != "" )
{
byte[] buffer = Encoding .ASCII .GetBytes (editMessage .ToCharArray ());
try
{
int count = Connection .Send (buffer);
if ( count != buffer .Length )
{
Message = ( "Sending failed!" );
return false;
}
}
catch ( Exception ex )
{
Message = ( ex .Message );
return false;
}
}
System .Threading .Thread .Sleep (100);
return true;
}
/// <summary>
/// 判断是否连接成功
/// </summary>
/// <returns></returns>
public bool IsConnected ()
{
try
{
if ( TagState .ToString () .ToUpper () == "YES" )
{
return true;
}
return false;
}
catch
{
return false;
}
}
//检测是否有TAG
public void ParseBuffer ()
{
//bool TAGState = false;
lock ( ReceiveBuffer )
{
for ( XMLTag tag = FirstTag () ; tag != null ; tag = FirstTag () )
{
String message = ReceiveBuffer .Substring (tag .startIndex , tag .length);
AppendInMessage (message);
ReceiveBuffer = ReceiveBuffer .Substring (tag .startIndex + tag .length);
if ( message .Contains ("<tagCount>") )
{
if ( message .Contains ("<tagCount>0000</tagCount>") )
{
//未检测到TAG
SetTagDetectionState (TagDetectionState .NO);
//TAGState = false;
}
else
{
//检测到TAG
SetTagDetectionState (TagDetectionState .YES);
//TAGState = true;
}
}
}
}
//return TAGState;
}
public void Disconnect ()
{
try
{
Connection .Disconnect (false);
SetConnectionState (false);
Connection .Close ();
}
catch ( Exception ex )
{
}
}
private XMLTag FirstTag ()
{
int index1 = ReceiveBuffer .IndexOf ("<reply>");
int index2 = ReceiveBuffer .IndexOf ("<notification>");
int index3 = ReceiveBuffer .IndexOf ("<alarm>");
if ( index1 == -1 && index2 == -1 && index3 == -1 ) return null; //No XML tag found
if ( index1 == -1 ) index1 = Int32 .MaxValue;
if ( index2 == -1 ) index2 = Int32 .MaxValue;
if ( index3 == -1 ) index3 = Int32 .MaxValue;
String endTag = "</alarm>";
XMLTag tag = new XMLTag ();
tag .type = "alarm";
tag .startIndex = index3;
if ( index1 < index2 && index1 < index3 )
{
endTag = "</reply>";
tag .type = "reply";
tag .startIndex = index1;
}
else if ( index2 < index3 )
{
endTag = "</notification>";
tag .type = "notification";
tag .startIndex = index2;
}
int endIndex = ReceiveBuffer .IndexOf (endTag , tag .startIndex);
if ( endIndex == -1 ) return null;
tag .length = endIndex - tag .startIndex + endTag .Length;
return tag;
}
private void AppendInMessage ( String message )
{
message = message .Replace ("\r" , "");
message = message .Replace ("\n" , "");
Message = ( "IN : " + message );
}
private void SetConnectionState ( bool state )
{
if ( state == true )
{
ConnectionState = true;
AsyncError = true;
}
else
{
ConnectionState = false;
SetTagDetectionState (TagDetectionState .UNDEFINED);
TagState = false;
ParseBuffer ();
AsyncError = false;
}
}
private void SetTagDetectionState ( TagDetectionState state )
{
switch ( state )
{
case TagDetectionState .YES:
Message = "TAG(s) DETECTED";
TagState = true;
break;
case TagDetectionState .NO:
Message = "NO TAG DETECTED";
TagState = false;
break;
case TagDetectionState .UNDEFINED:
Message = ""; //Color of the dialog
TagState = false;
break;
}
}
}
enum TagDetectionState
{
YES , NO , UNDEFINED
}
internal class ReceiveString
{
public readonly static int BufferSize = 512;
public byte[] buffer = new byte [ BufferSize ];
}
internal class XMLTag
{
//Index of first character
public int startIndex;
//Block length
public int length;
// Type ( reply, notification or alarm, since only telegramms
// from the ASM are handeld within this structure)
public String type;
}
}