@@ -0,0 +1,94 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||||
<PropertyGroup> | |||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> | |||||
<Platform Condition=" '$(Platform)' == '' ">x86</Platform> | |||||
<ProductVersion>8.0.30703</ProductVersion> | |||||
<SchemaVersion>2.0</SchemaVersion> | |||||
<ProjectGuid>{DAEB7DF5-2FA8-4663-A15C-F8E52C1A19A9}</ProjectGuid> | |||||
<OutputType>Exe</OutputType> | |||||
<AppDesignerFolder>Properties</AppDesignerFolder> | |||||
<RootNamespace>GT808ClientTest</RootNamespace> | |||||
<AssemblyName>GT808ClientTest</AssemblyName> | |||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> | |||||
<TargetFrameworkProfile> | |||||
</TargetFrameworkProfile> | |||||
<FileAlignment>512</FileAlignment> | |||||
</PropertyGroup> | |||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> | |||||
<PlatformTarget>x86</PlatformTarget> | |||||
<DebugSymbols>true</DebugSymbols> | |||||
<DebugType>full</DebugType> | |||||
<Optimize>false</Optimize> | |||||
<OutputPath>bin\Debug\</OutputPath> | |||||
<DefineConstants>DEBUG;TRACE</DefineConstants> | |||||
<ErrorReport>prompt</ErrorReport> | |||||
<WarningLevel>4</WarningLevel> | |||||
</PropertyGroup> | |||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> | |||||
<PlatformTarget>x86</PlatformTarget> | |||||
<DebugType>pdbonly</DebugType> | |||||
<Optimize>true</Optimize> | |||||
<OutputPath>bin\Release\</OutputPath> | |||||
<DefineConstants>TRACE</DefineConstants> | |||||
<ErrorReport>prompt</ErrorReport> | |||||
<WarningLevel>4</WarningLevel> | |||||
</PropertyGroup> | |||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'"> | |||||
<DebugSymbols>true</DebugSymbols> | |||||
<OutputPath>bin\x64\Debug\</OutputPath> | |||||
<DefineConstants>DEBUG;TRACE</DefineConstants> | |||||
<DebugType>full</DebugType> | |||||
<PlatformTarget>x64</PlatformTarget> | |||||
<ErrorReport>prompt</ErrorReport> | |||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> | |||||
</PropertyGroup> | |||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'"> | |||||
<OutputPath>bin\x64\Release\</OutputPath> | |||||
<DefineConstants>TRACE</DefineConstants> | |||||
<Optimize>true</Optimize> | |||||
<DebugType>pdbonly</DebugType> | |||||
<PlatformTarget>x64</PlatformTarget> | |||||
<ErrorReport>prompt</ErrorReport> | |||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<Reference Include="log4net"> | |||||
<HintPath>..\Libs\log4net.dll</HintPath> | |||||
</Reference> | |||||
<Reference Include="Plugin.Common, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"> | |||||
<SpecificVersion>False</SpecificVersion> | |||||
<HintPath>bin\Debug\Plugin.Common.dll</HintPath> | |||||
</Reference> | |||||
<Reference Include="System" /> | |||||
<Reference Include="System.configuration" /> | |||||
<Reference Include="System.Core" /> | |||||
<Reference Include="System.Xml.Linq" /> | |||||
<Reference Include="System.Data.DataSetExtensions" /> | |||||
<Reference Include="Microsoft.CSharp" /> | |||||
<Reference Include="System.Data" /> | |||||
<Reference Include="System.Xml" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<Compile Include="Program.cs" /> | |||||
<Compile Include="Properties\AssemblyInfo.cs" /> | |||||
<Compile Include="TcpPack.cs" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<None Include="app.config"> | |||||
<SubType>Designer</SubType> | |||||
</None> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<Content Include="dll\log4net.dll" /> | |||||
<Content Include="dll\Plugin.Common.dll" /> | |||||
</ItemGroup> | |||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> | |||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. | |||||
Other similar extension points exist, see Microsoft.Common.targets. | |||||
<Target Name="BeforeBuild"> | |||||
</Target> | |||||
<Target Name="AfterBuild"> | |||||
</Target> | |||||
--> | |||||
</Project> |
@@ -0,0 +1,35 @@ | |||||
| |||||
Microsoft Visual Studio Solution File, Format Version 12.00 | |||||
# Visual Studio 15 | |||||
VisualStudioVersion = 15.0.28307.539 | |||||
MinimumVisualStudioVersion = 10.0.40219.1 | |||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GT808ClientTest", "GT808ClientTest.csproj", "{DAEB7DF5-2FA8-4663-A15C-F8E52C1A19A9}" | |||||
EndProject | |||||
Global | |||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | |||||
Debug|Any CPU = Debug|Any CPU | |||||
Debug|x64 = Debug|x64 | |||||
Debug|x86 = Debug|x86 | |||||
Release|Any CPU = Release|Any CPU | |||||
Release|x64 = Release|x64 | |||||
Release|x86 = Release|x86 | |||||
EndGlobalSection | |||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution | |||||
{DAEB7DF5-2FA8-4663-A15C-F8E52C1A19A9}.Debug|Any CPU.ActiveCfg = Debug|x86 | |||||
{DAEB7DF5-2FA8-4663-A15C-F8E52C1A19A9}.Debug|x64.ActiveCfg = Debug|x64 | |||||
{DAEB7DF5-2FA8-4663-A15C-F8E52C1A19A9}.Debug|x64.Build.0 = Debug|x64 | |||||
{DAEB7DF5-2FA8-4663-A15C-F8E52C1A19A9}.Debug|x86.ActiveCfg = Debug|x86 | |||||
{DAEB7DF5-2FA8-4663-A15C-F8E52C1A19A9}.Debug|x86.Build.0 = Debug|x86 | |||||
{DAEB7DF5-2FA8-4663-A15C-F8E52C1A19A9}.Release|Any CPU.ActiveCfg = Release|x86 | |||||
{DAEB7DF5-2FA8-4663-A15C-F8E52C1A19A9}.Release|x64.ActiveCfg = Release|x64 | |||||
{DAEB7DF5-2FA8-4663-A15C-F8E52C1A19A9}.Release|x64.Build.0 = Release|x64 | |||||
{DAEB7DF5-2FA8-4663-A15C-F8E52C1A19A9}.Release|x86.ActiveCfg = Release|x86 | |||||
{DAEB7DF5-2FA8-4663-A15C-F8E52C1A19A9}.Release|x86.Build.0 = Release|x86 | |||||
EndGlobalSection | |||||
GlobalSection(SolutionProperties) = preSolution | |||||
HideSolutionNode = FALSE | |||||
EndGlobalSection | |||||
GlobalSection(ExtensibilityGlobals) = postSolution | |||||
SolutionGuid = {BAA1F5E7-D1F4-4D5E-A8BD-C3C293C9BA3B} | |||||
EndGlobalSection | |||||
EndGlobal |
@@ -0,0 +1,493 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Net.Sockets; | |||||
using System.Net; | |||||
using System.Diagnostics; | |||||
using System.Threading; | |||||
using Gps.Plugin.Tcp.GT808; | |||||
using Gps.Plugin.Common.Helpers; | |||||
using System.Configuration; | |||||
namespace GT808ClientTest | |||||
{ | |||||
class Program | |||||
{ | |||||
protected static log4net.ILog log = null; | |||||
private string ip; | |||||
private int port; | |||||
private string deviceId; | |||||
Random r = new Random(); | |||||
private int interval; | |||||
private int sendCountByOneDevice; | |||||
private ProcessCounter processCounter; | |||||
private static bool sendLogPrint; | |||||
private static bool waitReceive; | |||||
private static bool receiveLogPrint; | |||||
static Program() | |||||
{ | |||||
log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile)); | |||||
log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | |||||
} | |||||
private double initLat = 38.01342; | |||||
private double initLon = 114.560478; | |||||
public Program(string ip, int port, string deviceId, int interval, int sendCountByOneDevice, ProcessCounter processCounter) | |||||
{ | |||||
// TODO: Complete member initialization | |||||
this.latlonBuilder = new LatlonBuilder(initLat, initLon, 31.802893, 39.300299, 104.941406, 117.861328); | |||||
this.ip = ip; | |||||
this.port = port; | |||||
this.deviceId = deviceId; | |||||
this.interval = interval; | |||||
this.sendCountByOneDevice = sendCountByOneDevice; | |||||
this.processCounter = processCounter; | |||||
} | |||||
private static byte[] stringtobytes(string str) | |||||
{ | |||||
string[] strs = str.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries); | |||||
byte[] buffer = new byte[strs.Length]; | |||||
for (int i = 0; i < strs.Length; ++i) | |||||
{ | |||||
buffer[i] = Convert.ToByte(strs[i], 16); | |||||
} | |||||
return buffer; | |||||
} | |||||
static void Main(string[] args) | |||||
{ | |||||
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); | |||||
//var headpack = new Gps.Plugin.Tcp.GT808.HeadPack(); | |||||
//byte[] packBytes = stringtobytes("7E-01-02-00-0E-00-20-47-05-52-32-00-00-32-30-31-32-30-31-31-39-30-38-31-30-34-37-0D-7E"); | |||||
//if (RawFormatter.Instance.Bytes2Struct(headpack, packBytes , 1, HeadPack.PackSize)) | |||||
//{ | |||||
// Console.WriteLine("OK"); | |||||
// Console.ReadKey(); | |||||
//} | |||||
//MessageContext pack = new MessageContext(); | |||||
//byte[] packBytes = stringtobytes("68-68-25-00-00-00-00-00-00-00-12-34-56-00-18-10-DC-01-13-13-06-17-04-14-11-DC-0C-4A-7F-5C-1A-00-00-00-00-00-00-00-00-00-0A-0D"); | |||||
//if (RawFormatter.Instance.Bytes2Struct(pack, packBytes, BodyData.PackSize, MessageContext.PackSize)) | |||||
//{ | |||||
// Console.WriteLine("OK"); | |||||
// Console.ReadKey(); | |||||
//} | |||||
sendLogPrint = Convert.ToBoolean(ConfigurationManager.AppSettings["sendLogPrint"]); | |||||
waitReceive = Convert.ToBoolean(ConfigurationManager.AppSettings["waitReceive"]); | |||||
receiveLogPrint = Convert.ToBoolean(ConfigurationManager.AppSettings["receiveLogPrint"]); | |||||
string ip = ""; | |||||
int port = 0; | |||||
while (port == 0 || string.IsNullOrEmpty(ip)) | |||||
{ | |||||
string line = ""; | |||||
string configValue = ConfigurationManager.AppSettings["remoteServerPort"]; | |||||
if (string.IsNullOrEmpty(configValue)) | |||||
{ | |||||
Console.Write("请输入服务器IP和端口(113.31.92.200:8201):"); | |||||
line = Console.ReadLine(); | |||||
} | |||||
else | |||||
{ | |||||
line = configValue; | |||||
} | |||||
if (string.IsNullOrEmpty(line)) | |||||
line = "113.31.92.200:8201"; | |||||
int pos = line.IndexOf(':'); | |||||
if (pos == -1) | |||||
{ | |||||
Console.WriteLine("正确格式:xx.xxx.xxx.xxx:xxxx"); | |||||
continue; | |||||
} | |||||
ip = line.Substring(0, pos); | |||||
string strPort = line.Substring(pos + 1); | |||||
int.TryParse(strPort, out port); | |||||
} | |||||
int min = 0, max = 0; | |||||
string deviceIdRangeValue = ConfigurationManager.AppSettings["deviceIdRange"]; | |||||
if (string.IsNullOrEmpty(deviceIdRangeValue)) | |||||
{ | |||||
Console.WriteLine("生成设备标识格式为:0000000000000000,0000000000000001...."); | |||||
Console.Write("依客户端网络情况输入要模拟的客户端数量(1-10000):"); | |||||
string strCount = Console.ReadLine(); | |||||
max = int.Parse(strCount); | |||||
} | |||||
else | |||||
{ | |||||
string[] items = deviceIdRangeValue.Split('-'); | |||||
min = int.Parse(items[0]); | |||||
max = int.Parse(items[1]); | |||||
} | |||||
int interval = 30; | |||||
string strInterval = ConfigurationManager.AppSettings["interval"]; | |||||
if (string.IsNullOrEmpty(strInterval)) | |||||
{ | |||||
Console.Write("每个消息间隔(秒):"); | |||||
strInterval = Console.ReadLine(); | |||||
interval = int.Parse(strInterval); | |||||
} | |||||
else | |||||
{ | |||||
interval = int.Parse(strInterval); | |||||
} | |||||
int sendCountByOneDevice = 30; | |||||
string strSendCountByOneDevice = ConfigurationManager.AppSettings["sendCountByOneDevice"]; | |||||
if (string.IsNullOrEmpty(strSendCountByOneDevice)) | |||||
{ | |||||
Console.Write("每个设备发送共多少个包后断开连接:"); | |||||
strSendCountByOneDevice = Console.ReadLine(); | |||||
sendCountByOneDevice = int.Parse(strSendCountByOneDevice); | |||||
} | |||||
else | |||||
{ | |||||
sendCountByOneDevice = int.Parse(strSendCountByOneDevice); | |||||
} | |||||
ProcessCounter processCounter = new ProcessCounter((max - min + 1) * sendCountByOneDevice, pc => | |||||
{ | |||||
Console.Title = pc.ToString(); | |||||
}); | |||||
for (int i = min; i <= max; ++i) | |||||
{ | |||||
string deviceId = string.Concat("010000", i.ToString("00000")); | |||||
Program p = new Program(ip, port, deviceId, interval, sendCountByOneDevice, processCounter); | |||||
//p.Run(); | |||||
Thread iThred = new Thread(p.Run); | |||||
iThred.Start(); | |||||
//Thread.SpinWait(2); | |||||
} | |||||
Console.ReadLine(); | |||||
} | |||||
private void Run() | |||||
{ | |||||
Console.WriteLine("Thread {0} Start {1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString()); | |||||
Socket tcp = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); | |||||
try | |||||
{ | |||||
tcp.Connect(IPAddress.Parse(ip), port); | |||||
try | |||||
{ | |||||
while (this.sendCountByOneDevice-- > 0) | |||||
{ | |||||
if (SendPosition(tcp)) | |||||
{ | |||||
processCounter.IncrSuccess(); | |||||
} | |||||
else | |||||
{ | |||||
processCounter.IncrFailed(); | |||||
} | |||||
Thread.Sleep(interval * 1000); | |||||
//Thread.Sleep(100); | |||||
} | |||||
/* | |||||
if (SendPosition(tcp)) | |||||
{ | |||||
processCounter.IncrSuccess(); | |||||
} | |||||
else | |||||
{ | |||||
processCounter.IncrFailed(); | |||||
} | |||||
if (--this.sendCountByOneDevice <= 0) | |||||
{ | |||||
//timer.Change(-1, -1); | |||||
//try | |||||
//{ | |||||
// tcp.Disconnect(true); | |||||
// tcp.Dispose(); | |||||
//} | |||||
//catch (Exception exp) | |||||
//{ | |||||
// log.Warn("断开连接出错:" + exp.Message); | |||||
//} | |||||
} | |||||
else | |||||
{ | |||||
//SendPosition(tcp); | |||||
//timer.Change(Math.Max(1, interval * 1000 - watch.ElapsedMilliseconds), -1); | |||||
} | |||||
*/ | |||||
} | |||||
catch (SocketException exp) | |||||
{ | |||||
log.Debug("连接已经断开, 重连接中"); | |||||
//timer.Change(Timeout.Infinite, Timeout.Infinite); | |||||
this.Run(); | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
log.Error(ex.Message, ex); | |||||
//timer.Change(Math.Max(1, interval * 1000 - watch.ElapsedMilliseconds), -1); | |||||
} | |||||
} | |||||
catch (ThreadAbortException) | |||||
{ | |||||
return; | |||||
} | |||||
catch (Exception exp) | |||||
{ | |||||
log.Error(exp); | |||||
} | |||||
Console.WriteLine("Thread {0} End {1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString()); | |||||
} | |||||
ushort seqNum = 1; | |||||
ushort GetNextSeqNum() | |||||
{ | |||||
lock (this) | |||||
{ | |||||
return ++seqNum; | |||||
} | |||||
} | |||||
private byte[] bufferRecv = new byte[1024]; | |||||
private LatlonBuilder latlonBuilder; | |||||
private bool SendPosition(Socket tcp) | |||||
{ | |||||
HeadPack head = new HeadPack() { SeqNO = GetNextSeqNum(), MessageId = (ushort)MessageIds.PositionReport, BodyProp = (ushort)0 }; | |||||
head.SetDeviceId(this.deviceId); | |||||
double lat; | |||||
double lon; | |||||
int speed = 10 + r.Next(90); | |||||
latlonBuilder.GetNextLatlon(speed, out lat, out lon); | |||||
PositionReportPack pack = new PositionReportPack() | |||||
{ | |||||
AlermFlags = 0, | |||||
Speed = (ushort)(speed * 10), | |||||
State = 0, | |||||
Latitude = Convert.ToUInt32(lat * 1000000), | |||||
Longitude = Convert.ToUInt32(lon * 1000000), | |||||
Altitude = 200, | |||||
Direction = 0, | |||||
Time = DateTime.Now.ToString("yyMMddHHmmss") | |||||
}; | |||||
byte[] bytesSend = RawFormatter.Instance.Struct2Bytes(pack); | |||||
BodyPropertyHelper.SetMessageLength(ref head.BodyProp, (ushort)bytesSend.Length); | |||||
byte[] headBytes = RawFormatter.Instance.Struct2Bytes(head); | |||||
byte[] fullBytes = headBytes.Concat(bytesSend).ToArray(); | |||||
byte checkByte = PackHelper.CalcCheckByte(fullBytes, 0, fullBytes.Length); | |||||
bytesSend = (new byte[] { 0x7e } | |||||
.Concat(PackHelper.EncodeBytes(fullBytes).Concat(new byte[] { checkByte })) | |||||
.Concat(new byte[] { 0x7e })).ToArray(); | |||||
//发送消息 | |||||
SendBytes(tcp, bytesSend); | |||||
//控制台打印日志cpu占用太高 | |||||
if (sendLogPrint) | |||||
{ | |||||
Console.WriteLine("{0} {1}, LatLon:{2:0.000000},{3:0.000000}", head.GetDeviceId(), DateTime.Now.ToString(), lat, lon); | |||||
} | |||||
//等待接收服务端返回值 | |||||
var success = true; | |||||
if (waitReceive) | |||||
{ | |||||
success = RecvBytes(tcp); | |||||
//var success = true; | |||||
} | |||||
return success; | |||||
} | |||||
void SendBytes(Socket tcp, byte[] bytes) | |||||
{ | |||||
lock (System.Reflection.MethodBase.GetCurrentMethod()) | |||||
{ | |||||
if (bytes.Length != tcp.Send(bytes)) | |||||
{ | |||||
throw new SocketException((int)SocketError.ConnectionReset); | |||||
} | |||||
} | |||||
} | |||||
private bool RecvBytes(Socket tcp) | |||||
{ | |||||
lock (bufferRecv) | |||||
{ | |||||
byte[] buffer = bufferRecv; | |||||
int received = tcp.Receive(buffer); | |||||
//received = tcp.ReceiveAsync.Receive(buffer); | |||||
byte[] bytesReceived = PackHelper.DecodeBytes(buffer, 1, received - 2); | |||||
int rightSize = HeadPack.PackSize + ServerAnswerPack.PackSize + 1; | |||||
if (bytesReceived.Length != rightSize) | |||||
{ | |||||
log.WarnFormat("返回消息长度不正确:" + bytesReceived.Length + "!=" + rightSize); | |||||
} | |||||
ServerAnswerPack pack = new ServerAnswerPack(); | |||||
RawFormatter.Instance.Bytes2Struct(pack, bytesReceived, HeadPack.PackSize, ServerAnswerPack.PackSize); | |||||
if (pack.Result != 0) | |||||
{ | |||||
log.WarnFormat("发送失败:" + pack.Result.ToString()); | |||||
} | |||||
if(waitReceive && receiveLogPrint) | |||||
{ | |||||
Console.WriteLine("SeqNO:{0} MessageId:{1} Result:{2}", pack.SeqNO,pack.MessageId,pack.Result); | |||||
} | |||||
return pack.Result == 0; | |||||
} | |||||
} | |||||
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) | |||||
{ | |||||
log.Error(e.ExceptionObject); | |||||
} | |||||
} | |||||
class LatlonBuilder | |||||
{ | |||||
private double lat; | |||||
private double lon; | |||||
private double minLat; | |||||
private double maxLat; | |||||
private double minLon; | |||||
private double maxLon; | |||||
private int direction = 0; | |||||
private Random r = new Random(); | |||||
public LatlonBuilder(double lat, double lon, double minLat, double maxlat, double minLon, double maxLon) | |||||
{ | |||||
this.lat = lat; | |||||
this.lon = lon; | |||||
this.minLat = minLat; | |||||
this.maxLat = maxlat; | |||||
this.minLon = minLon; | |||||
this.maxLon = maxLon; | |||||
this.direction = r.Next(360); | |||||
} | |||||
public bool GetNextLatlon(int speed, out double lat, out double lon) | |||||
{ | |||||
direction = (direction + (r.Next(30) - 15)) % 360; | |||||
double angle = Math.PI * this.direction / 180.0; | |||||
double latAdd = speed / 1000.0 * Math.Sin(angle); | |||||
double lonAdd = speed / 1000.0 * Math.Cos(angle); | |||||
this.lat = lat = this.lat + latAdd; | |||||
this.lon = lon = this.lon + lonAdd; | |||||
if (lat < minLat || lat > maxLat || lon < minLon || lon > maxLon) | |||||
{ | |||||
direction = (direction + 180) % 360; | |||||
return GetNextLatlon(speed, out lat, out lon); | |||||
} | |||||
return true; | |||||
} | |||||
} | |||||
class ProcessCounter | |||||
{ | |||||
private long current = 0, failedCounter = 0; | |||||
private Thread thread; | |||||
private AutoResetEvent evtUpdateUI = new AutoResetEvent(false); | |||||
private long updatePerCount; | |||||
private long lastUpdateVal; | |||||
public ProcessCounter(long max, Action<ProcessCounter> updateUI) | |||||
{ | |||||
this.Max = max; | |||||
this.updatePerCount = max / 100; | |||||
this.thread = new Thread(new ThreadStart(() => | |||||
{ | |||||
while (true) | |||||
{ | |||||
try | |||||
{ | |||||
evtUpdateUI.WaitOne(500); | |||||
this.lastUpdateVal = Interlocked.Read(ref current); | |||||
updateUI(this); | |||||
} | |||||
catch (ThreadAbortException) | |||||
{ | |||||
return; | |||||
} | |||||
catch (Exception exp) | |||||
{ | |||||
Console.WriteLine(exp.Message); | |||||
} | |||||
} | |||||
})); | |||||
this.thread.IsBackground = true; | |||||
this.thread.Start(); | |||||
} | |||||
public long Max { get; set; } | |||||
internal void IncrSuccess() | |||||
{ | |||||
lock (this) | |||||
Incr(); | |||||
} | |||||
internal void IncrFailed() | |||||
{ | |||||
lock (this) | |||||
{ | |||||
Incr(); | |||||
Interlocked.Increment(ref failedCounter); | |||||
} | |||||
} | |||||
private void Incr() | |||||
{ | |||||
var val = Interlocked.Increment(ref current); | |||||
if (val - lastUpdateVal > this.updatePerCount) | |||||
{ | |||||
this.evtUpdateUI.Set(); | |||||
} | |||||
if (val == Max) | |||||
{ | |||||
Console.WriteLine("Done"); | |||||
} | |||||
} | |||||
public override string ToString() | |||||
{ | |||||
long curr = Interlocked.Read(ref current); | |||||
float g = Convert.ToSingle(curr / (Max / 100.0)); | |||||
string ret = string.Concat(curr, "/", Max, "=>", g.ToString("##.00"), "%"); | |||||
long failed = Interlocked.Read(ref failedCounter); | |||||
if (failed > 0) | |||||
ret = string.Concat(ret, "(Success:" + (curr - failed), ", Failed:", failed, ")"); | |||||
return ret; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,36 @@ | |||||
using System.Reflection; | |||||
using System.Runtime.CompilerServices; | |||||
using System.Runtime.InteropServices; | |||||
// 有关程序集的常规信息通过以下 | |||||
// 特性集控制。更改这些特性值可修改 | |||||
// 与程序集关联的信息。 | |||||
[assembly: AssemblyTitle("GT808ClientTest")] | |||||
[assembly: AssemblyDescription("")] | |||||
[assembly: AssemblyConfiguration("")] | |||||
[assembly: AssemblyCompany("")] | |||||
[assembly: AssemblyProduct("GT808ClientTest")] | |||||
[assembly: AssemblyCopyright("Copyright © 2012")] | |||||
[assembly: AssemblyTrademark("")] | |||||
[assembly: AssemblyCulture("")] | |||||
// 将 ComVisible 设置为 false 使此程序集中的类型 | |||||
// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型, | |||||
// 则将该类型上的 ComVisible 特性设置为 true。 | |||||
[assembly: ComVisible(false)] | |||||
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID | |||||
[assembly: Guid("13ae5af7-0f7a-4428-88fe-e41cf030f0a2")] | |||||
// 程序集的版本信息由下面四个值组成: | |||||
// | |||||
// 主版本 | |||||
// 次版本 | |||||
// 内部版本号 | |||||
// 修订号 | |||||
// | |||||
// 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值, | |||||
// 方法是按如下所示使用“*”: | |||||
// [assembly: AssemblyVersion("1.0.*")] | |||||
[assembly: AssemblyVersion("1.0.0.0")] | |||||
[assembly: AssemblyFileVersion("1.0.0.0")] |
@@ -0,0 +1,903 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Runtime.InteropServices; | |||||
using System.Diagnostics.Contracts; | |||||
using System.Net; | |||||
using Gps.Plugin.Common.Helpers; | |||||
using System.IO; | |||||
using System.Collections; | |||||
namespace Gps.Plugin.Tcp.GT808 | |||||
{ | |||||
public class PackHelper | |||||
{ | |||||
public static byte[] ToBytes(string deviceId, MessageIds messageId, ushort seqNO, byte[] bodyBytesReturn) | |||||
{ | |||||
HeadPack head = new HeadPack() | |||||
{ | |||||
BodyProp = 0, | |||||
MessageId = (ushort)messageId, | |||||
SeqNO = seqNO | |||||
}; | |||||
head.SetDeviceId(deviceId); | |||||
//BodyPropertyHelper.SetMessageLength(ref head.BodyProp,(ushort)bodyBytesReturn.Length); | |||||
BodyPropertyHelper.SetMessageLength(ref head.BodyProp, (ushort)bodyBytesReturn.Length); | |||||
return RawFormatter.Instance.Struct2Bytes(head).Concat(bodyBytesReturn).ToArray(); | |||||
} | |||||
public static byte[] DecodeBytes(byte[] buffer) | |||||
{ | |||||
return DecodeBytes(buffer, 0, buffer.Length); | |||||
} | |||||
public static byte[] DecodeBytes(byte[] bytes, int offset, int length) | |||||
{ | |||||
int index = 0; | |||||
int endOffset = Math.Min(length, bytes.Length - offset) + offset; | |||||
for (int i = offset; i < endOffset; ) | |||||
{ | |||||
if (bytes[i] == 0x7d && bytes[i + 1] == 0x02) | |||||
{ | |||||
bytes[index++] = 0x7e; | |||||
i += 2; | |||||
} | |||||
else if (bytes[i] == 0x7d && bytes[i + 1] == 0x01) | |||||
{ | |||||
bytes[index++] = 0x7d; | |||||
i += 2; | |||||
} | |||||
else | |||||
{ | |||||
bytes[index++] = bytes[i++]; | |||||
} | |||||
} | |||||
return bytes.Take(index).ToArray(); | |||||
} | |||||
public static byte[] EncodeBytes(IEnumerable<byte> bytes) | |||||
{ | |||||
MemoryStream ms = new MemoryStream(); | |||||
foreach (var b in bytes) | |||||
{ | |||||
if (b == 0x7e) | |||||
{ | |||||
ms.WriteByte(0x7d); | |||||
ms.WriteByte(0x02); | |||||
} | |||||
else if (b == 0x7d) | |||||
{ | |||||
ms.WriteByte(0x7d); | |||||
ms.WriteByte(0x01); | |||||
} | |||||
else | |||||
{ | |||||
ms.WriteByte(b); | |||||
} | |||||
} | |||||
return ms.ToArray(); | |||||
} | |||||
/// <summary> | |||||
/// 计算校验位 | |||||
/// </summary> | |||||
/// <param name="bytes"></param> | |||||
/// <param name="offset"></param> | |||||
/// <param name="count"></param> | |||||
/// <returns></returns> | |||||
public static byte CalcCheckByte(byte[] bytes, int offset, int count) | |||||
{ | |||||
if (count == 0) | |||||
return 0; | |||||
byte ret = bytes[offset]; | |||||
for (int i = offset + 1; i < offset + count; ++i) | |||||
{ | |||||
ret ^= bytes[i]; | |||||
} | |||||
return ret; | |||||
} | |||||
/// <summary> | |||||
/// 计算校验位 | |||||
/// </summary> | |||||
/// <param name="bytes"></param> | |||||
public static void CalcCheckByte(byte[] bytes) | |||||
{ | |||||
if (bytes.Length == 0) | |||||
return; | |||||
bytes[bytes.Length - 1] = CalcCheckByte(bytes, 0, bytes.Length - 1); | |||||
} | |||||
} | |||||
/* | |||||
车载GPS定位器通信协议(GT808)(TCP_6004).pdf | |||||
P2 | |||||
* | |||||
* 7E-01-02-00-06-00-20-47-05-52-32-00-00-30-31-32-33-34-35-06-7E | |||||
*/ | |||||
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)] | |||||
public class HeadPack | |||||
{ | |||||
public static byte FixPrefix = 0x7e; | |||||
public static Int32 PackSize = Marshal.SizeOf(typeof(HeadPack)); | |||||
/// <summary> | |||||
/// 消息 ID | |||||
/// </summary> | |||||
public BigEndianUInt16 MessageId; | |||||
/// <summary> | |||||
/// 消息体属性 | |||||
/// </summary> | |||||
public BigEndianUInt16 BodyProp; | |||||
/// <summary> | |||||
/// 终端手机号 | |||||
/// </summary> | |||||
protected BCD8421_6BytesString DeviceId; | |||||
/// <summary> | |||||
/// 自增一序列号 | |||||
/// </summary> | |||||
public BigEndianUInt16 SeqNO; | |||||
public string GetDeviceId() | |||||
{ | |||||
return string.Concat("460", DeviceId); | |||||
} | |||||
public void SetDeviceId(string value) | |||||
{ | |||||
if (value.Length > 12) | |||||
{ | |||||
DeviceId = value.Substring(value.Length - 12, 12); | |||||
} | |||||
else | |||||
{ | |||||
DeviceId = value.PadLeft(12, '0'); | |||||
} | |||||
} | |||||
} | |||||
public static class BodyPropertyHelper | |||||
{ | |||||
/// <summary> | |||||
/// 9-0 BIT | |||||
/// </summary> | |||||
/// <param name="val"></param> | |||||
/// <returns></returns> | |||||
public static Int16 GetMessageLength(BigEndianUInt16 val) | |||||
{ | |||||
return (Int16)((UInt16)val & 0x03ff); | |||||
} | |||||
/// <summary> | |||||
/// 9-0 BIT | |||||
/// </summary> | |||||
/// <param name="val"></param> | |||||
/// <returns></returns> | |||||
public static void SetMessageLength(ref BigEndianUInt16 val, UInt16 length) | |||||
{ | |||||
val = (UInt16)(((UInt16)val & (~0x03ff)) + length); | |||||
} | |||||
/// <summary> | |||||
/// 12-10 BIT | |||||
/// </summary> | |||||
/// <param name="val"></param> | |||||
/// <returns></returns> | |||||
public static Byte GetEncodeType(BigEndianUInt16 val) | |||||
{ | |||||
return (Byte)((val >> 10) & 0x03); | |||||
} | |||||
public static void SetEncodeType(ref BigEndianUInt16 val, byte encType) | |||||
{ | |||||
ushort v = val; | |||||
v = (ushort)(v & ~(0x03 << 10) + encType << 10); | |||||
val = v; | |||||
} | |||||
/// <summary> | |||||
/// 13 BIT | |||||
/// </summary> | |||||
/// <param name="val"></param> | |||||
/// <returns></returns> | |||||
public static bool IsMutliPack(this BigEndianUInt16 val) | |||||
{ | |||||
return ((val >> 13) & 0x01) == 0x0001; | |||||
} | |||||
} | |||||
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)] | |||||
public class PackProperty | |||||
{ | |||||
public static Int32 PackSize = Marshal.SizeOf(typeof(PackProperty)); | |||||
public BigEndianUInt16 Total; | |||||
public BigEndianUInt16 Index; | |||||
} | |||||
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)] | |||||
public class ServerAnswerPack | |||||
{ | |||||
public static Int32 PackSize = Marshal.SizeOf(typeof(ServerAnswerPack)); | |||||
/// <summary> | |||||
/// 流水 | |||||
/// </summary> | |||||
public BigEndianUInt16 SeqNO; | |||||
/// <summary> | |||||
/// 消息ID | |||||
/// </summary> | |||||
public BigEndianUInt16 MessageId; | |||||
/// <summary> | |||||
/// 结果 0:成功/确认 1:失败 2:消息有误 3:不支持 4:报警处理确认 | |||||
/// </summary> | |||||
public byte Result; | |||||
} | |||||
/// <summary> | |||||
/// 终端通用应答 | |||||
/// </summary> | |||||
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)] | |||||
public class ClientAnswerPack | |||||
{ | |||||
public static Int32 PackSize = Marshal.SizeOf(typeof(ServerAnswerPack)); | |||||
/// <summary> | |||||
/// 流水 | |||||
/// </summary> | |||||
public BigEndianUInt16 SeqNO; | |||||
/// <summary> | |||||
/// 消息ID | |||||
/// </summary> | |||||
public BigEndianUInt16 MessageId; | |||||
/// <summary> | |||||
/// 结果 0:成功/确认 1:失败 2:消息有误 3:不支持 | |||||
/// </summary> | |||||
public byte Result; | |||||
} | |||||
/// <summary> | |||||
/// 终端注册 最后是GBK字串,车牌号 | |||||
/// </summary> | |||||
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)] | |||||
public class ClientRegistPack | |||||
{ | |||||
public static Int32 PackSize = Marshal.SizeOf(typeof(ClientRegistPack)); | |||||
/// <summary> | |||||
/// 省 | |||||
/// </summary> | |||||
public BigEndianUInt16 Province; | |||||
/// <summary> | |||||
/// 市 | |||||
/// </summary> | |||||
public BigEndianUInt16 City; | |||||
/// <summary> | |||||
/// 制造商 | |||||
/// </summary> | |||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] | |||||
public byte[] Manufacturer; | |||||
/// <summary> | |||||
/// 终端型号 | |||||
/// </summary> | |||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] | |||||
public byte[] DeviceModel; | |||||
/// <summary> | |||||
/// 终端ID | |||||
/// </summary> | |||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)] | |||||
public byte[] DeviceId; | |||||
/// <summary> | |||||
/// 车牌颜色 | |||||
/// </summary> | |||||
public byte CarColor; | |||||
//最后是GBK字串,车牌号 | |||||
} | |||||
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)] | |||||
public class ClientRegistReturnPack | |||||
{ | |||||
/// <summary> | |||||
/// 自增一序列号 | |||||
/// </summary> | |||||
public BigEndianUInt16 SeqNum; | |||||
/// <summary> | |||||
/// 0成功, 1车辆已经注册, 2数据库中无此车辆, 3终端已经被注册, 4数据库中无该终端 | |||||
/// </summary> | |||||
public Byte Result; | |||||
} | |||||
/// <summary> | |||||
/// 位置包汇报 | |||||
/// </summary> | |||||
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)] | |||||
public class PositionReportPack | |||||
{ | |||||
public static Int32 PackSize = Marshal.SizeOf(typeof(PositionReportPack)); | |||||
/// <summary> | |||||
/// 报警标志 | |||||
/// </summary> | |||||
public BigEndianUInt32 AlermFlags; | |||||
/// <summary> | |||||
/// 状态 | |||||
/// </summary> | |||||
public BigEndianUInt32 State; | |||||
/// <summary> | |||||
/// 纬度 度*10^6 | |||||
/// </summary> | |||||
public BigEndianUInt32 Latitude; | |||||
/// <summary> | |||||
/// 经度 度*10^6 | |||||
/// </summary> | |||||
public BigEndianUInt32 Longitude; | |||||
/// <summary> | |||||
/// 高程 单位为米 | |||||
/// </summary> | |||||
public BigEndianUInt16 Altitude; | |||||
/// <summary> | |||||
/// 速度 1/10KM/H | |||||
/// </summary> | |||||
public BigEndianUInt16 Speed; | |||||
/// <summary> | |||||
/// 方向 0~359 正北为0 顺时针 | |||||
/// </summary> | |||||
public BigEndianUInt16 Direction; | |||||
/// <summary> | |||||
/// 时间 | |||||
/// </summary> | |||||
public BCD8421_6BytesString Time; | |||||
} | |||||
/// <summary> | |||||
/// 立即拍照命令 | |||||
/// </summary> | |||||
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)] | |||||
public class CmdPhotographePack | |||||
{ | |||||
/// <summary> | |||||
/// 通道ID > 0 | |||||
/// </summary> | |||||
public Byte Channel; | |||||
/// <summary> | |||||
/// 拍摄命令 0表示停止拍摄;0xffff表示录像;其它表示拍摄张数 | |||||
/// </summary> | |||||
public BigEndianUInt16 Cmd; | |||||
/// <summary> | |||||
/// 拍照间隔,录像时间。 单位为秒,0表示最小间隔拍照或者一直录像 | |||||
/// </summary> | |||||
public BigEndianUInt16 Interval; | |||||
/// <summary> | |||||
/// 保存标志 1保存 0立即上传 | |||||
/// </summary> | |||||
public byte Deal; | |||||
/// <summary> | |||||
/// 图像分辨率 0x01:320*240 0x02:640*480 0x03:800*600 0x04:1024*768 | |||||
/// 0x05:176*144(Qcif) 0x06:352*288(Cif) 0x07:704*288(HALF D1) 0x08:704*546(D1) | |||||
/// </summary> | |||||
public byte Resolution; | |||||
/// <summary> | |||||
/// 图像质量 1 ~ 10 1表示质量损失最小, 10表示压缩最大 | |||||
/// </summary> | |||||
public byte Quality; | |||||
/// <summary> | |||||
/// 亮度 0 ~ 255 | |||||
/// </summary> | |||||
public byte Brightness; | |||||
/// <summary> | |||||
/// 对比度 0 ~ 127 | |||||
/// </summary> | |||||
public byte Contrast; | |||||
/// <summary> | |||||
/// 饱和度 0 ~ 127 | |||||
/// </summary> | |||||
public byte Saturation; | |||||
/// <summary> | |||||
/// 色度 0 ~ 255 | |||||
/// </summary> | |||||
public byte Chroma; | |||||
} | |||||
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)] | |||||
public class CmdSendTextPack | |||||
{ | |||||
public byte Flag; | |||||
/// <summary> | |||||
/// 紧急 | |||||
/// </summary> | |||||
public bool IsUrgent | |||||
{ | |||||
get { return (Flag & 0x01) == 0x01; } | |||||
set { Flag = (byte)(Flag | 0x01); } | |||||
} | |||||
/// <summary> | |||||
/// 终端显示器显示 | |||||
/// </summary> | |||||
public bool IsDisplay | |||||
{ | |||||
get { return (Flag & 0x04) == 0x04; } | |||||
set { Flag = (byte)(Flag | 0x04); } | |||||
} | |||||
/// <summary> | |||||
/// 终端显示器显示 | |||||
/// </summary> | |||||
public bool IsTTS | |||||
{ | |||||
get { return (Flag & 0x08) == 0x08; } | |||||
set { Flag = (byte)(Flag | 0x08); } | |||||
} | |||||
/// <summary> | |||||
/// 终端显示器显示 | |||||
/// </summary> | |||||
public bool IsAD | |||||
{ | |||||
get { return (Flag & 0x10) == 0x10; } | |||||
set { Flag = (byte)(Flag | 0x10); } | |||||
} | |||||
//[MarshalAs(UnmanagedType.ByValArray, SizeConst = 0)] | |||||
//public byte[] MessageBytes; | |||||
} | |||||
/// <summary> | |||||
/// 多媒体数据上传 | |||||
/// </summary> | |||||
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)] | |||||
public class GpsMultimediaUploadPack | |||||
{ | |||||
public static Int32 PackSize = Marshal.SizeOf(typeof(GpsMultimediaUploadPack)); | |||||
/// <summary> | |||||
/// 多媒体ID >0 | |||||
/// </summary> | |||||
public BigEndianUInt32 ID; | |||||
/// <summary> | |||||
/// 多媒体类型 0:图像 1:音频 2:视频 | |||||
/// </summary> | |||||
public Byte Type; | |||||
/// <summary> | |||||
/// 多媒体格式编码 0:JPEG 1:TIF 2:MP3 3:WAV 4:WMV | |||||
/// </summary> | |||||
public byte Format; | |||||
/// <summary> | |||||
/// 事件项编码 0:平台下发指令 1:定时动作 2:抢劫报警触发 3:碰撞侧翻触发报警 4:保留 | |||||
/// </summary> | |||||
public byte EventCode; | |||||
/// <summary> | |||||
/// 通道ID > 0 | |||||
/// </summary> | |||||
public Byte Channel; | |||||
} | |||||
/// <summary> | |||||
/// 多媒体数据上传 | |||||
/// </summary> | |||||
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)] | |||||
public class GpsMultimediaReUploadPack | |||||
{ | |||||
public static Int32 PackSize = Marshal.SizeOf(typeof(GpsMultimediaReUploadPack)); | |||||
/// <summary> | |||||
/// 多媒体ID >0 | |||||
/// </summary> | |||||
public BigEndianUInt32 ID; | |||||
/// <summary> | |||||
/// 多媒体类型 0:图像 1:音频 2:视频 | |||||
/// </summary> | |||||
public Byte Count; | |||||
///// <summary> | |||||
///// 要求重发的下一个包 | |||||
///// </summary> | |||||
//public Byte NextIndex; | |||||
} | |||||
public class BitValueState | |||||
{ | |||||
private BitArray bitArray; | |||||
public BitValueState(ushort state) | |||||
{ | |||||
this.bitArray = new BitArray(BitConverter.GetBytes(state)); | |||||
} | |||||
/// <summary> | |||||
/// ACC 开关 | |||||
/// </summary> | |||||
bool ACC | |||||
{ | |||||
get | |||||
{ | |||||
return bitArray[0]; | |||||
} | |||||
set | |||||
{ | |||||
bitArray[0] = value; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 是否定位 | |||||
/// </summary> | |||||
//Position = 0x0002, | |||||
bool Position | |||||
{ | |||||
get | |||||
{ | |||||
return bitArray[1]; | |||||
} | |||||
set | |||||
{ | |||||
bitArray[1] = value; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 0北纬 1南纬 | |||||
/// </summary> | |||||
//NorthOrSouth = 0x0004, | |||||
bool IsSouth | |||||
{ | |||||
get | |||||
{ | |||||
return bitArray[2]; | |||||
} | |||||
set | |||||
{ | |||||
bitArray[2] = value; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 0东经 1西经 | |||||
/// </summary> | |||||
//EastOrWest = 0x0008, | |||||
bool IsWest | |||||
{ | |||||
get | |||||
{ | |||||
return bitArray[3]; | |||||
} | |||||
set | |||||
{ | |||||
bitArray[3] = value; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 0运营状态 1停运 | |||||
/// </summary> | |||||
//OperationState = 0x0010, | |||||
bool OperationStoped | |||||
{ | |||||
get | |||||
{ | |||||
return bitArray[4]; | |||||
} | |||||
set | |||||
{ | |||||
bitArray[4] = value; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 经纬度是否加密 | |||||
/// </summary> | |||||
//EncodeLongitudeLatitude = 0x0020, | |||||
bool EncodeLongitudeLatitude | |||||
{ | |||||
get | |||||
{ | |||||
return bitArray[5]; | |||||
} | |||||
set | |||||
{ | |||||
bitArray[5] = value; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 0车辆油路正常 1断开 | |||||
/// </summary> | |||||
//CarOilchannel = 0x0400, | |||||
bool CarOilchannelBreaked | |||||
{ | |||||
get | |||||
{ | |||||
return bitArray[10]; | |||||
} | |||||
set | |||||
{ | |||||
bitArray[10] = value; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 0车辆电子正常 1断开 | |||||
/// </summary> | |||||
//CarCircuit = 0x0800, | |||||
bool CarCircuitBreaked | |||||
{ | |||||
get | |||||
{ | |||||
return bitArray[11]; | |||||
} | |||||
set | |||||
{ | |||||
bitArray[11] = value; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 0车辆车门解锁 1加锁 | |||||
/// </summary> | |||||
//CarDoorLock = 0x1000 | |||||
bool CarDoorLocked | |||||
{ | |||||
get | |||||
{ | |||||
return bitArray[12]; | |||||
} | |||||
set | |||||
{ | |||||
bitArray[12] = value; | |||||
} | |||||
} | |||||
} | |||||
public class BitValueAlerm | |||||
{ | |||||
//private uint data; | |||||
private BitArray bitArray; | |||||
public BitValueAlerm(UInt32 alerm) | |||||
{ | |||||
//this.data = alerm; | |||||
bitArray = new BitArray(new int[] { (int)alerm }); | |||||
} | |||||
/// <summary> | |||||
/// 紧急报警, 触动报警开关后触发 收到答应后清除 | |||||
/// </summary> | |||||
bool Urgent | |||||
{ | |||||
get | |||||
{ | |||||
return bitArray[0]; | |||||
} | |||||
set | |||||
{ | |||||
bitArray[0] = value; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 超速报警 标志维持到报警条件解除 | |||||
/// </summary> | |||||
bool Speeding | |||||
{ | |||||
get | |||||
{ | |||||
return bitArray[1]; | |||||
} | |||||
set | |||||
{ | |||||
bitArray[1] = value; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 疲劳驾驶 标志维持到报警条件解除 | |||||
/// </summary> | |||||
bool Fatigue | |||||
{ | |||||
get | |||||
{ | |||||
return bitArray[2]; | |||||
} | |||||
set | |||||
{ | |||||
bitArray[2] = value; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 预警 收到答应后清除 | |||||
/// </summary> | |||||
bool Forewarning | |||||
{ | |||||
get | |||||
{ | |||||
return bitArray[3]; | |||||
} | |||||
set | |||||
{ | |||||
bitArray[3] = value; | |||||
} | |||||
} | |||||
//TODO:未完, 以后用到添加 | |||||
} | |||||
public enum MessageIds : ushort | |||||
{ | |||||
/// <summary> | |||||
/// 终端通用应答 | |||||
/// </summary> | |||||
ClientAnswer = 0x0001, | |||||
/// <summary> | |||||
/// 终端心跳 | |||||
/// </summary> | |||||
ClientPump = 0x0002, | |||||
/// <summary> | |||||
/// 终端注销 | |||||
/// </summary> | |||||
ClientUnregist = 0x0003, | |||||
/// <summary> | |||||
/// 终端注册 | |||||
/// </summary> | |||||
ClientRegist = 0x0100, | |||||
/// <summary> | |||||
/// 终端鉴权 | |||||
/// </summary> | |||||
ClientAuth = 0x0102, | |||||
/// <summary> | |||||
/// 位置信息汇报 | |||||
/// </summary> | |||||
PositionReport = 0x0200, | |||||
/// <summary> | |||||
/// 多媒体事件信息上传 | |||||
/// </summary> | |||||
MultimediaEventUpload = 0x0800, | |||||
/// <summary> | |||||
/// 多媒体数据上传 | |||||
/// </summary> | |||||
MultimediaUpload = 0x0801, | |||||
/// <summary> | |||||
/// 多媒体数据上传 | |||||
/// </summary> | |||||
MultimediaUploadAnswer = 0x8800, | |||||
/// <summary> | |||||
/// 平台通用应答 | |||||
/// </summary> | |||||
ServerAnswer = 0x8001, | |||||
/// <summary> | |||||
/// 终端注册应答 | |||||
/// </summary> | |||||
ClientRegistReturn = 0x8100, | |||||
/// <summary> | |||||
/// 立即拍照 | |||||
/// </summary> | |||||
Photographe = 0x8801, | |||||
/// <summary> | |||||
/// 下发文本 | |||||
/// </summary> | |||||
SendTextMessage = 0x8300 | |||||
} | |||||
} |
@@ -0,0 +1,85 @@ | |||||
<?xml version="1.0"?> | |||||
<configuration> | |||||
<configSections> | |||||
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> | |||||
</configSections> | |||||
<appSettings> | |||||
<!--服务器IP和端口(113.31.92.200:8201)--> | |||||
<add key="remoteServerPort" value="10.1.97.12:32195"/> | |||||
<!--模拟终端id区间(设置200000-200100,将自动生成010000200000-010000200100这样101个设备)--> | |||||
<add key="deviceIdRange" value="200000-200010"/> | |||||
<!--每个消息间隔(秒)--> | |||||
<add key="interval" value="1"/> | |||||
<!--每个设备发送共多少个包(默认0x0200)后断开连接--> | |||||
<add key="sendCountByOneDevice" value="10"/> | |||||
<!--控制台是否打印发送日志(消耗大量cpu)true or false--> | |||||
<add key="sendLogPrint" value="false"/> | |||||
<!--消息是否等待服务端同步应答(如果开启,服务器来不及回复应答的时候,控制台看上去就像假死了)true or false--> | |||||
<add key="waitReceive" value="false"/> | |||||
<!--控制台是否打印接收日志(消耗大量cpu),该开关只有开启了服务端应答之后才有效 true or false--> | |||||
<add key="receiveLogPrint" value="false"/> | |||||
</appSettings> | |||||
<log4net debug="false"> | |||||
<root> | |||||
<level value="DEBUG"/> | |||||
<appender-ref ref="RollingLogFileAppender"/> | |||||
<appender-ref ref="log_console"/> | |||||
</root> | |||||
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> | |||||
<param name="File" value="log\applog.txt"/> | |||||
<param name="AppendToFile" value="true"/> | |||||
<param name="MaxSizeRollBackups" value="10"/> | |||||
<param name="MaximumFileSize" value="5MB"/> | |||||
<param name="RollingStyle" value="Size"/> | |||||
<param name="StaticLogFileName" value="true"/> | |||||
<layout type="log4net.Layout.PatternLayout"> | |||||
<param name="ConversionPattern" value="%d [%t] %-5p %c %n%m%n"/> | |||||
</layout> | |||||
</appender> | |||||
<appender name="Console" type="log4net.Appender.ConsoleAppender"> | |||||
<!-- A1 uses PatternLayout --> | |||||
<layout type="log4net.Layout.PatternLayout"> | |||||
<conversionPattern value="%-4timestamp [%thread] %-5level %logger %ndc - %message%newline"/> | |||||
</layout> | |||||
</appender> | |||||
<appender name="UdpAppender" type="log4net.Appender.UdpAppender"> | |||||
<param name="RemoteAddress" value="localhost"/> | |||||
<param name="RemotePort" value="4931"/> | |||||
<param name="Encoding" value="utf-8"/> | |||||
<layout type="log4net.Layout.PatternLayout" value="{%level}%date{MM/dd HH:mm:ss} - %message"/> | |||||
</appender> | |||||
<appender name="log_console" type="log4net.Appender.ColoredConsoleAppender, log4net"> | |||||
<mapping> | |||||
<level value="FATAL"/> | |||||
<foreColor value="Red"/> | |||||
<backColor value="White"/> | |||||
</mapping> | |||||
<mapping> | |||||
<level value="ERROR"/> | |||||
<foreColor value="Red, HighIntensity"/> | |||||
</mapping> | |||||
<mapping> | |||||
<level value="WARN"/> | |||||
<foreColor value="Yellow"/> | |||||
</mapping> | |||||
<mapping> | |||||
<level value="INFO"/> | |||||
<foreColor value="Cyan"/> | |||||
</mapping> | |||||
<mapping> | |||||
<level value="DEBUG"/> | |||||
<foreColor value="Green"/> | |||||
</mapping> | |||||
<layout type="log4net.Layout.PatternLayout"> | |||||
<param name="Header" value="*********************************** "/> | |||||
<param name="Footer" value=" "/> | |||||
<param name="ConversionPattern" value="[%p] %message%newline"/> | |||||
</layout> | |||||
</appender> | |||||
</log4net> | |||||
<startup> | |||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> | |||||
</startup> | |||||
</configuration> |