公司的买了一个 GPS监护器,通过公司网,我给设置Ip端口映射。
如何获取GPS返回数据; 有关代码我写了些,请高手指点; 如果有其他方法 请指教!
错误如下:
TcpListener serverSocket = new TcpListener(9990); //TCP网络客户端监听 设置Ip端口映射
TcpClient clientSocket = default(TcpClient);
int counter = 0;
serverSocket.Start();
Console.WriteLine("数据采集服务器运行中 ....");
counter = 0;
while ((true))
{
counter += 1;
clientSocket = serverSocket.AcceptTcpClient();
byte[] bytesFrom = new byte[10025];
string dataFromClient = null; //接数据
NetworkStream networkStream = clientSocket.GetStream(); //网路访问的基础数据流
Console.WriteLine(clientSocket.ReceiveBufferSize.ToString() + bytesFrom.ToString());
networkStream.Read(bytesFrom, 0, 10025);
dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
try
{
dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));
}
catch (System.Exception ex)
{
}
if (dataFromClient == String.Empty) dataFromClient = "空数据";
{
dataFromClient.TrimEnd(';');
Console.WriteLine(dataFromClient + DateTime.Now); // FileStream fs = new FileStream("E:\\GPSTest.txt", FileMode.Append);
//获得字节数组 // byte[] data = new UTF8Encoding().GetBytes(dataFromClient);
//开始写入
// fs.(data, 0, data.Length); //清空缓冲区、关闭流
// fs.Flush();
// fs.Close();
StreamWriter sw = new StreamWriter("E:\\GPSTest.txt", true, System.Text.Encoding.Default);
sw.Write("\r\n" + dataFromClient);
sw.Flush();
sw.Close();
}
string[] tempMsg;
tempMsg = dataFromClient.Split(';');
if (tempMsg[0] == "0")
{
clientsList.Add(tempMsg[1], clientSocket); // broadcast(dataFromClient + " Joined ", dataFromClient, false); Console.WriteLine(tempMsg[1] + " 用户登录系统 ");
handleClinet client = new handleClinet();
client.startClient(clientSocket, dataFromClient, clientsList);
}
}
public void Open()
{ DCB dcbCommPort = new DCB();
COMMTIMEOUTS ctoCommPort = new COMMTIMEOUTS(); // 打开串口 OPEN THE COMM PORT.
hComm = CreateFile(PortNum, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
// 如果串口没有打开,就打开 IF THE PORT CANNOT BE OPENED, BAIL OUT.
if (hComm == INVALID_HANDLE_VALUE)
{
throw (new ApplicationException("非法操作,不能打开串口!"));
} // 设置通信超时时间 SET THE COMM TIMEOUTS.
GetCommTimeouts(hComm, ref ctoCommPort);
ctoCommPort.ReadTotalTimeoutConstant = ReadTimeout;
ctoCommPort.ReadTotalTimeoutMultiplier = 0;
ctoCommPort.WriteTotalTimeoutMultiplier = 0;
ctoCommPort.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(hComm, ref ctoCommPort); // 设置串口 SET BAUD RATE, PARITY, WORD SIZE, AND STOP BITS.
GetCommState(hComm, ref dcbCommPort);
dcbCommPort.BaudRate = BaudRate;
dcbCommPort.flags = 0;
//dcb.fBinary=1;
dcbCommPort.flags |= 1;
if (Parity > 0)
{
//dcb.fParity=1
dcbCommPort.flags |= 2;
}
dcbCommPort.Parity = Parity;
dcbCommPort.ByteSize = ByteSize;
dcbCommPort.StopBits = StopBits;
if (!SetCommState(hComm, ref dcbCommPort))
{
//uint ErrorNum=GetLastError();
throw (new ApplicationException("非法操作,不能打开串口!"));
}
//unre to see if setting took correctly
//DCB dcbCommPort2 = new DCB();
//GetCommState(hComm, ref dcbCommPort2);
Opened = true;
} public void Close()
{
if (hComm != INVALID_HANDLE_VALUE)
{
CloseHandle(hComm); Opened = false;
}
} public byte[] Read(int NumBytes)
{
byte[] BufBytes;
byte[] OutBytes;
BufBytes = new byte[NumBytes];
if (hComm != INVALID_HANDLE_VALUE)
{
OVERLAPPED ovlCommPort = new OVERLAPPED();
int BytesRead = 0;
ReadFile(hComm, BufBytes, NumBytes, ref BytesRead, ref ovlCommPort);
try
{
OutBytes = new byte[BytesRead];
Array.Copy(BufBytes, 0, OutBytes, 0, BytesRead);
}
catch
{
return BufBytes;
} }
else
{
throw (new ApplicationException("串口未打开!"));
}
return OutBytes;
// return BufBytes;
} public void Write(byte[] WriteBytes)
{
if (hComm != INVALID_HANDLE_VALUE)
{
OVERLAPPED ovlCommPort = new OVERLAPPED();
int BytesWritten = 0;
WriteFile(hComm, WriteBytes, WriteBytes.Length, ref BytesWritten, ref ovlCommPort);
}
else
{
throw (new ApplicationException("串口未打开!"));
}
} public string GetGPS(string strGPS, string strFind)
{
///从GPS中读取的数据中,找出想要的数据
///GPSstring原始字符串,
///strFind要查找的内容,X:经度,Y:纬度,T:时间,V:速度,M:海拔 是数字从1开始,即以“,”分隔的位置
///返回查找到指定位置的字符串
string handerStrGPRMC = "$GPRMC";//GPS串头
string handerStrGPGGA = "$GPGGA"; int findHanderGPRMC = strGPS.IndexOf(handerStrGPRMC);//看是否含有GPS串头
int findHanderGPGGA = strGPS.IndexOf(handerStrGPGGA);//看是否含有GPS串头
if (strGPS.IndexOf(handerStrGPRMC) < 0 && strGPS.IndexOf(handerStrGPGGA) < 0)
{
return "-1";
}
else
{
if (findHanderGPGGA > 0)//GPGGA
{
strGPS = strGPS.Substring(findHanderGPGGA, strGPS.Length - findHanderGPGGA); string[] ArryTmp = strGPS.Split(",".ToCharArray());
try
{
if (ArryTmp[2] == "V")
{
return "V";
//没有信号
}
else
{
switch (strFind)
{
case "X":
return DM2DD(ArryTmp[4]);
//return ArryTmp[4];
case "Y":
return DM2DD(ArryTmp[2]);
//return ArryTmp[2];
case "M":
return ArryTmp[9];
case "T":
return T2Time(ArryTmp[9], ArryTmp[1]);
case "V":
return Convert.ToString( Convert.ToDouble( ArryTmp[7] )* 1.852 );
default:
return "V";
}
}
}
catch
{
return "V";
}
}
else//GPRMC
{
strGPS = strGPS.Substring(findHanderGPRMC, strGPS.Length - findHanderGPRMC);
string[] ArryTmp = strGPS.Split(",".ToCharArray());
try
{
if (ArryTmp[2] == "V")
{
return "V";//没有信号
}
else
{
switch (strFind)
{
case "X":
return DM2DD(ArryTmp[5]);
//return ArryTmp[5];
case "Y":
return DM2DD(ArryTmp[3]);
//return ArryTmp[3];
case "T":
return T2Time(ArryTmp[9], ArryTmp[1]); case "V":
return Convert.ToString(Convert.ToDouble(ArryTmp[7]) * 1.852); default:
return "V"; }
}
}
catch
{
return "V";
}
}
}
}
public string T2Time(string strDate, string strTime)
{
string dT = "20" + strDate.Substring(4, 2) + "-" + strDate.Substring(2, 2) + "-" + strDate.Substring(0, 2);
string TT = Convert.ToString(Convert.ToInt32(strTime.Substring(0, 2))) + ":" + strTime.Substring(2, 2) + ":" + strTime.Substring(4, 2);
DateTime T = Convert.ToDateTime(dT + " " + TT);
T = T.AddHours(8);
return T.ToString();
} public string DM2DD(string DegreeMinutes)
{
//转换NMEA协议的“度分”格式为十进制“度度”格式
string sDegree;
string sMinute;
string sReturn = "";
if (DegreeMinutes.IndexOf(".") == 4)
{
//DegreeMinutes = Replace(DegreeMinutes, ".", "")
//DM2DD = CDbl(Left(DegreeMinutes, 2)) + CDbl(Left(CStr(CDbl(Right(DegreeMinutes, Len(DegreeMinutes) - 2)) / 60), 8)) / 10000
DegreeMinutes = DegreeMinutes.Replace(".", "");
double sDegree1 = Convert.ToDouble(DegreeMinutes.Substring(0, 2));
double sDegree2 = Convert.ToDouble(DegreeMinutes.Substring(2, DegreeMinutes.Length - 2));
string sTmp = Convert.ToString(sDegree2 / 60);
sDegree2 = Convert.ToDouble(sTmp.Substring(0, sTmp.Length));
sDegree2 = sDegree2 / 10000;
if (sDegree2 > 1)//接收为4位、6位小数,当4为除以10000正确,当6位时要再除以100 如:{E:10338.9163 N:2501.3304 、E:10338.925024 N:2501.255818}
{
sDegree2 = sDegree2 / 100;
}
sDegree = Convert.ToString(sDegree1 + sDegree2);
if (sDegree.Length > 11)
sDegree = sDegree.Substring(0, 11);
sReturn = sDegree;
}
else if (DegreeMinutes.IndexOf(".") == 5)
{
//DegreeMinutes = Replace(DegreeMinutes, ".", "")
//DM2DD = CDbl(Left(DegreeMinutes, 2)) + CDbl(Left(CStr(CDbl(Right(DegreeMinutes, Len(DegreeMinutes) - 2)) / 60), 8)) / 10000
DegreeMinutes = DegreeMinutes.Replace(".", "");
double sMinute1 = Convert.ToDouble(DegreeMinutes.Substring(0, 3));
double sMinute2 = Convert.ToDouble(DegreeMinutes.Substring(3, DegreeMinutes.Length - 3));
string sTmp = Convert.ToString(sMinute2 / 60);
sMinute2 = Convert.ToDouble(sTmp.Substring(0, sTmp.Length));
sMinute2 = sMinute2 / 10000;
if (sMinute2 > 1)//接收为4位、6位小数,当4为除以10000正确,当6位时要再除以100 如:{E:10338.9163 N:2501.3304 、E:10338.925024 N:2501.255818}
{
sMinute2 = sMinute2 / 100;
} sMinute = Convert.ToString(sMinute1 + sMinute2);
if (sMinute.Length > 10)
sMinute = sMinute.Substring(0, 10);
sReturn = sMinute;
}
return sReturn;
} public bool ScanPort()
{
try
{
if (Opened)
{
Close();
Open();
}
else
{
Open();//打开串口 }
byte[] bytRead = Read(512);
Close();
if (Encoding.ASCII.GetString(bytRead, 0, bytRead.Length).IndexOf("$GP") >= 0)
return true;
else
return false;
}
catch
{
return false;
} }
} class HexCon
{
// 把十六进制字符串转换成字节型和把字节型转换成十六进制字符串 converter hex string to byte and byte to hex string
public static string ByteToString(byte[] InBytes)
{
string StringOut = "";
foreach (byte InByte in InBytes)
{
StringOut = StringOut + String.Format("{0:X2} ", InByte);
}
return StringOut;
}
public static byte[] StringToByte(string InString)
{
string[] ByteStrings;
ByteStrings = InString.Split(" ".ToCharArray());
byte[] ByteOut;
ByteOut = new byte[ByteStrings.Length - 1];
for (int i = 0; i == ByteStrings.Length - 1; i++)
{
ByteOut[i] = Convert.ToByte(("0x" + ByteStrings[i]));
}
return ByteOut;
}
1.开启监听后,接收数据最好用异步回调函数实现;
2.如2楼所说,单开一个线程来操作,因为网络读取会有阻塞之类的问题。
{
byte[] BufBytes;
byte[] OutBytes;
BufBytes = new byte[NumBytes]; if (hComm != INVALID_HANDLE_VALUE)
{
OVERLAPPED ovlCommPort = new OVERLAPPED();
int BytesRead = 0;
ReadFile(hComm, BufBytes, NumBytes, ref BytesRead, ref ovlCommPort);
try
{
OutBytes = new byte[BytesRead];
Array.Copy(BufBytes, 0, OutBytes, 0, BytesRead);
}
catch
{
return BufBytes;
} }
else
{
throw (new ApplicationException("串口未打开!"));
}
return OutBytes;
// return BufBytes;
}