From 8057c763db2757353f73654b0de80d2c8d9efad5 Mon Sep 17 00:00:00 2001 From: henry Date: Tue, 21 Feb 2017 11:47:47 +0800 Subject: [PATCH] no message --- .gitignore | 8 + Beetle.JT808/.vs/Beetle.JT808/v14/.suo | Bin 0 -> 59904 bytes Beetle.JT808/AssemblyDependencies1.dgml | 677 ++++++++++++++++++ .../Beetle.JT808.ClientApp/App.config | 6 + .../Beetle.JT808.ClientApp.csproj | 94 +++ .../FrmMain.Designer.cs | 159 ++++ .../Beetle.JT808.ClientApp/FrmMain.cs | 20 + .../Beetle.JT808.ClientApp/FrmMain.resx | 123 ++++ .../Beetle.JT808.ClientApp/Program.cs | 22 + .../Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 71 ++ .../Properties/Resources.resx | 117 +++ .../Properties/Settings.Designer.cs | 30 + .../Properties/Settings.settings | 7 + .../Beetle.JT808.UnitTestProject1.csproj | 92 +++ .../Properties/AssemblyInfo.cs | 36 + .../UnitTest1.cs | 190 +++++ Beetle.JT808/Beetle.JT808.sln | 38 + Beetle.JT808/Beetle.JT808.v11.suo | Bin 0 -> 135680 bytes Beetle.JT808/Beetle.JT808/Beetle.JT808.csproj | 80 +++ .../Beetle.JT808/Beetle.JT808.csproj.user | 6 + Beetle.JT808/Beetle.JT808/ClassDiagram1.cd | 344 +++++++++ Beetle.JT808/Beetle.JT808/Core.cs | 96 +++ Beetle.JT808/Beetle.JT808/IMessage.cs | 23 + Beetle.JT808/Beetle.JT808/IMessageBody.cs | 14 + Beetle.JT808/Beetle.JT808/IProtocolBuffer.cs | 39 + .../Beetle.JT808/Implement/Message.cs | 143 ++++ .../Beetle.JT808/Implement/ProtocolBuffer.cs | 364 ++++++++++ .../Beetle.JT808/MessageBodyAttributes.cs | 80 +++ .../Beetle.JT808/MessageBodyPacket.cs | 32 + Beetle.JT808/Beetle.JT808/MessageFactory.cs | 44 ++ .../Beetle.JT808/Messages/CenterResponse.cs | 20 + .../Beetle.JT808/Messages/ClientPing.cs | 14 + .../Beetle.JT808/Messages/ClientPostion.cs | 342 +++++++++ .../Beetle.JT808/Messages/ClientRegister.cs | 26 + .../Messages/ClientRegisterCancel.cs | 13 + .../Messages/ClientRegisterResponse.cs | 19 + .../Beetle.JT808/Messages/ClientResponse.cs | 30 + .../Beetle.JT808/Messages/ClientSignature.cs | 15 + .../Beetle.JT808/Properties/AssemblyInfo.cs | 36 + .../Beetle.JT808/ProtocolProcessError.cs | 19 + .../Beetle.JT808/Serializes/EmitHandler.cs | 532 ++++++++++++++ .../Beetle.JT808/Serializes/IBitType.cs | 18 + .../Serializes/IReadWriteHandler.cs | 242 +++++++ .../Serializes/MessageTypeAttribute.cs | 21 + .../Serializes/PropertySerializeHandler.cs | 35 + .../Beetle.JT808/Serializes/Serializer.cs | 141 ++++ .../Beetle.TJ808.BaseServer/App.config | 6 + .../Beetle.TJ808.BaseServer.csproj | 67 ++ .../Beetle.TJ808.BaseServer/Program.cs | 91 +++ .../Properties/AssemblyInfo.cs | 36 + .../LayerDiagram1.layerdiagram | 1 + .../LayerDiagram1.layerdiagram.layout | 1 + .../LayerDiagram1.layerdiagram.suppressions | 1 + .../ModelDefinition/ModelingProject1.uml | 44 ++ .../ModelingProject1.modelproj | 43 ++ Lib/Beetle.Express.dll | Bin 0 -> 54272 bytes 57 files changed, 4804 insertions(+) create mode 100644 .gitignore create mode 100644 Beetle.JT808/.vs/Beetle.JT808/v14/.suo create mode 100644 Beetle.JT808/AssemblyDependencies1.dgml create mode 100644 Beetle.JT808/Beetle.JT808.ClientApp/App.config create mode 100644 Beetle.JT808/Beetle.JT808.ClientApp/Beetle.JT808.ClientApp.csproj create mode 100644 Beetle.JT808/Beetle.JT808.ClientApp/FrmMain.Designer.cs create mode 100644 Beetle.JT808/Beetle.JT808.ClientApp/FrmMain.cs create mode 100644 Beetle.JT808/Beetle.JT808.ClientApp/FrmMain.resx create mode 100644 Beetle.JT808/Beetle.JT808.ClientApp/Program.cs create mode 100644 Beetle.JT808/Beetle.JT808.ClientApp/Properties/AssemblyInfo.cs create mode 100644 Beetle.JT808/Beetle.JT808.ClientApp/Properties/Resources.Designer.cs create mode 100644 Beetle.JT808/Beetle.JT808.ClientApp/Properties/Resources.resx create mode 100644 Beetle.JT808/Beetle.JT808.ClientApp/Properties/Settings.Designer.cs create mode 100644 Beetle.JT808/Beetle.JT808.ClientApp/Properties/Settings.settings create mode 100644 Beetle.JT808/Beetle.JT808.UnitTestProject1/Beetle.JT808.UnitTestProject1.csproj create mode 100644 Beetle.JT808/Beetle.JT808.UnitTestProject1/Properties/AssemblyInfo.cs create mode 100644 Beetle.JT808/Beetle.JT808.UnitTestProject1/UnitTest1.cs create mode 100644 Beetle.JT808/Beetle.JT808.sln create mode 100644 Beetle.JT808/Beetle.JT808.v11.suo create mode 100644 Beetle.JT808/Beetle.JT808/Beetle.JT808.csproj create mode 100644 Beetle.JT808/Beetle.JT808/Beetle.JT808.csproj.user create mode 100644 Beetle.JT808/Beetle.JT808/ClassDiagram1.cd create mode 100644 Beetle.JT808/Beetle.JT808/Core.cs create mode 100644 Beetle.JT808/Beetle.JT808/IMessage.cs create mode 100644 Beetle.JT808/Beetle.JT808/IMessageBody.cs create mode 100644 Beetle.JT808/Beetle.JT808/IProtocolBuffer.cs create mode 100644 Beetle.JT808/Beetle.JT808/Implement/Message.cs create mode 100644 Beetle.JT808/Beetle.JT808/Implement/ProtocolBuffer.cs create mode 100644 Beetle.JT808/Beetle.JT808/MessageBodyAttributes.cs create mode 100644 Beetle.JT808/Beetle.JT808/MessageBodyPacket.cs create mode 100644 Beetle.JT808/Beetle.JT808/MessageFactory.cs create mode 100644 Beetle.JT808/Beetle.JT808/Messages/CenterResponse.cs create mode 100644 Beetle.JT808/Beetle.JT808/Messages/ClientPing.cs create mode 100644 Beetle.JT808/Beetle.JT808/Messages/ClientPostion.cs create mode 100644 Beetle.JT808/Beetle.JT808/Messages/ClientRegister.cs create mode 100644 Beetle.JT808/Beetle.JT808/Messages/ClientRegisterCancel.cs create mode 100644 Beetle.JT808/Beetle.JT808/Messages/ClientRegisterResponse.cs create mode 100644 Beetle.JT808/Beetle.JT808/Messages/ClientResponse.cs create mode 100644 Beetle.JT808/Beetle.JT808/Messages/ClientSignature.cs create mode 100644 Beetle.JT808/Beetle.JT808/Properties/AssemblyInfo.cs create mode 100644 Beetle.JT808/Beetle.JT808/ProtocolProcessError.cs create mode 100644 Beetle.JT808/Beetle.JT808/Serializes/EmitHandler.cs create mode 100644 Beetle.JT808/Beetle.JT808/Serializes/IBitType.cs create mode 100644 Beetle.JT808/Beetle.JT808/Serializes/IReadWriteHandler.cs create mode 100644 Beetle.JT808/Beetle.JT808/Serializes/MessageTypeAttribute.cs create mode 100644 Beetle.JT808/Beetle.JT808/Serializes/PropertySerializeHandler.cs create mode 100644 Beetle.JT808/Beetle.JT808/Serializes/Serializer.cs create mode 100644 Beetle.JT808/Beetle.TJ808.BaseServer/App.config create mode 100644 Beetle.JT808/Beetle.TJ808.BaseServer/Beetle.TJ808.BaseServer.csproj create mode 100644 Beetle.JT808/Beetle.TJ808.BaseServer/Program.cs create mode 100644 Beetle.JT808/Beetle.TJ808.BaseServer/Properties/AssemblyInfo.cs create mode 100644 Beetle.JT808/ModelingProject1/LayerDiagram1.layerdiagram create mode 100644 Beetle.JT808/ModelingProject1/LayerDiagram1.layerdiagram.layout create mode 100644 Beetle.JT808/ModelingProject1/LayerDiagram1.layerdiagram.suppressions create mode 100644 Beetle.JT808/ModelingProject1/ModelDefinition/ModelingProject1.uml create mode 100644 Beetle.JT808/ModelingProject1/ModelingProject1.modelproj create mode 100644 Lib/Beetle.Express.dll diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dc0c7f3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +Beetle.JT808/Beetle.JT808.ClientApp/bin/ +Beetle.JT808/Beetle.JT808.ClientApp/obj/ +Beetle.JT808/Beetle.JT808.UnitTestProject1/bin/ +Beetle.JT808/Beetle.JT808.UnitTestProject1/obj/ +Beetle.JT808/Beetle.JT808/bin/ +Beetle.JT808/Beetle.JT808/obj/ +Beetle.JT808/Beetle.TJ808.BaseServer/bin/ +Beetle.JT808/Beetle.TJ808.BaseServer/obj/ diff --git a/Beetle.JT808/.vs/Beetle.JT808/v14/.suo b/Beetle.JT808/.vs/Beetle.JT808/v14/.suo new file mode 100644 index 0000000000000000000000000000000000000000..006a4dbcb782eff17aac9094ae40c66dad4434e8 GIT binary patch literal 59904 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 literal 0 HcmV?d00001 diff --git a/Beetle.JT808/AssemblyDependencies1.dgml b/Beetle.JT808/AssemblyDependencies1.dgml new file mode 100644 index 0000000..4a6e3be --- /dev/null +++ b/Beetle.JT808/AssemblyDependencies1.dgml @@ -0,0 +1,677 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Beetle.JT808/Beetle.JT808.ClientApp/App.config b/Beetle.JT808/Beetle.JT808.ClientApp/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808.ClientApp/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Beetle.JT808/Beetle.JT808.ClientApp/Beetle.JT808.ClientApp.csproj b/Beetle.JT808/Beetle.JT808.ClientApp/Beetle.JT808.ClientApp.csproj new file mode 100644 index 0000000..9deb593 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808.ClientApp/Beetle.JT808.ClientApp.csproj @@ -0,0 +1,94 @@ + + + + + Debug + AnyCPU + {88C57185-5E00-454E-91E9-6E8AAD0E99FC} + WinExe + Properties + Beetle.JT808.ClientApp + Beetle.JT808.ClientApp + v4.5 + 512 + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + Form + + + FrmMain.cs + + + + + FrmMain.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + {ad6a9116-9faf-475d-8451-4316f2df910f} + Beetle.JT808 + + + + + \ No newline at end of file diff --git a/Beetle.JT808/Beetle.JT808.ClientApp/FrmMain.Designer.cs b/Beetle.JT808/Beetle.JT808.ClientApp/FrmMain.Designer.cs new file mode 100644 index 0000000..4bffdbb --- /dev/null +++ b/Beetle.JT808/Beetle.JT808.ClientApp/FrmMain.Designer.cs @@ -0,0 +1,159 @@ +namespace Beetle.JT808.ClientApp +{ + partial class FrmMain + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows 窗体设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.txtConnectionStatus = new System.Windows.Forms.ToolStripStatusLabel(); + this.txtStatus = new System.Windows.Forms.ToolStripStatusLabel(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.label1 = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.statusStrip1.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // statusStrip1 + // + this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.txtConnectionStatus, + this.txtStatus}); + this.statusStrip1.Location = new System.Drawing.Point(3, 712); + this.statusStrip1.Name = "statusStrip1"; + this.statusStrip1.Size = new System.Drawing.Size(767, 22); + this.statusStrip1.TabIndex = 1; + this.statusStrip1.Text = "statusStrip1"; + // + // txtConnectionStatus + // + this.txtConnectionStatus.Name = "txtConnectionStatus"; + this.txtConnectionStatus.Size = new System.Drawing.Size(0, 17); + // + // txtStatus + // + this.txtStatus.Name = "txtStatus"; + this.txtStatus.Size = new System.Drawing.Size(0, 17); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.label2); + this.groupBox1.Controls.Add(this.textBox1); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Dock = System.Windows.Forms.DockStyle.Top; + this.groupBox1.Location = new System.Drawing.Point(3, 3); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(767, 63); + this.groupBox1.TabIndex = 2; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "服务器信息"; + // + // groupBox2 + // + this.groupBox2.Dock = System.Windows.Forms.DockStyle.Top; + this.groupBox2.Location = new System.Drawing.Point(3, 66); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(767, 105); + this.groupBox2.TabIndex = 3; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "注册信息"; + // + // groupBox3 + // + this.groupBox3.Dock = System.Windows.Forms.DockStyle.Top; + this.groupBox3.Location = new System.Drawing.Point(3, 171); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(767, 580); + this.groupBox3.TabIndex = 4; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "行驶信息设置"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(18, 29); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(59, 12); + this.label1.TabIndex = 0; + this.label1.Text = "服务地址:"; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(89, 26); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(134, 21); + this.textBox1.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(258, 29); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(59, 12); + this.label2.TabIndex = 2; + this.label2.Text = "服务端口:"; + // + // FrmMain + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(773, 737); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.statusStrip1); + this.MaximizeBox = false; + this.Name = "FrmMain"; + this.Padding = new System.Windows.Forms.Padding(3); + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "TJ/T 808 emulator"; + this.statusStrip1.ResumeLayout(false); + this.statusStrip1.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.StatusStrip statusStrip1; + private System.Windows.Forms.ToolStripStatusLabel txtConnectionStatus; + private System.Windows.Forms.ToolStripStatusLabel txtStatus; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Label label1; + } +} + diff --git a/Beetle.JT808/Beetle.JT808.ClientApp/FrmMain.cs b/Beetle.JT808/Beetle.JT808.ClientApp/FrmMain.cs new file mode 100644 index 0000000..50c8fc8 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808.ClientApp/FrmMain.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Beetle.JT808.ClientApp +{ + public partial class FrmMain : Form + { + public FrmMain() + { + InitializeComponent(); + } + } +} diff --git a/Beetle.JT808/Beetle.JT808.ClientApp/FrmMain.resx b/Beetle.JT808/Beetle.JT808.ClientApp/FrmMain.resx new file mode 100644 index 0000000..dafba2f --- /dev/null +++ b/Beetle.JT808/Beetle.JT808.ClientApp/FrmMain.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 127, 17 + + \ No newline at end of file diff --git a/Beetle.JT808/Beetle.JT808.ClientApp/Program.cs b/Beetle.JT808/Beetle.JT808.ClientApp/Program.cs new file mode 100644 index 0000000..d1cd7b7 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808.ClientApp/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Beetle.JT808.ClientApp +{ + static class Program + { + /// + /// 应用程序的主入口点。 + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new FrmMain()); + } + } +} diff --git a/Beetle.JT808/Beetle.JT808.ClientApp/Properties/AssemblyInfo.cs b/Beetle.JT808/Beetle.JT808.ClientApp/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..8918a16 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808.ClientApp/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的常规信息通过以下 +// 特性集控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Beetle.JT808.ClientApp")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Beetle.JT808.ClientApp")] +[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 使此程序集中的类型 +// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型, +// 则将该类型上的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("c5e82d67-3f37-41c8-a58f-3950864f734f")] + +// 程序集的版本信息由下面四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Beetle.JT808/Beetle.JT808.ClientApp/Properties/Resources.Designer.cs b/Beetle.JT808/Beetle.JT808.ClientApp/Properties/Resources.Designer.cs new file mode 100644 index 0000000..1953f04 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808.ClientApp/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本: 4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将丢失。 +// +//------------------------------------------------------------------------------ + +namespace Beetle.JT808.ClientApp.Properties +{ + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// 返回此类使用的、缓存的 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Beetle.JT808.ClientApp.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 为所有资源查找重写当前线程的 CurrentUICulture 属性, + /// 方法是使用此强类型资源类。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Beetle.JT808/Beetle.JT808.ClientApp/Properties/Resources.resx b/Beetle.JT808/Beetle.JT808.ClientApp/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Beetle.JT808/Beetle.JT808.ClientApp/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Beetle.JT808/Beetle.JT808.ClientApp/Properties/Settings.Designer.cs b/Beetle.JT808/Beetle.JT808.ClientApp/Properties/Settings.Designer.cs new file mode 100644 index 0000000..4265f1c --- /dev/null +++ b/Beetle.JT808/Beetle.JT808.ClientApp/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Beetle.JT808.ClientApp.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Beetle.JT808/Beetle.JT808.ClientApp/Properties/Settings.settings b/Beetle.JT808/Beetle.JT808.ClientApp/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808.ClientApp/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Beetle.JT808/Beetle.JT808.UnitTestProject1/Beetle.JT808.UnitTestProject1.csproj b/Beetle.JT808/Beetle.JT808.UnitTestProject1/Beetle.JT808.UnitTestProject1.csproj new file mode 100644 index 0000000..adeb5e2 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808.UnitTestProject1/Beetle.JT808.UnitTestProject1.csproj @@ -0,0 +1,92 @@ + + + + Debug + AnyCPU + {5CDBD16D-5D06-4868-A5E8-DB2B62EF2182} + Library + Properties + Beetle.JT808.UnitTestProject1 + Beetle.JT808.UnitTestProject1 + v4.5 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages + False + UnitTest + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\Lib\Beetle.Express.dll + + + + + + + + + + + + + + + + + + + + + + {ad6a9116-9faf-475d-8451-4316f2df910f} + Beetle.JT808 + + + + + + + False + + + False + + + False + + + False + + + + + + + + \ No newline at end of file diff --git a/Beetle.JT808/Beetle.JT808.UnitTestProject1/Properties/AssemblyInfo.cs b/Beetle.JT808/Beetle.JT808.UnitTestProject1/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..e578372 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808.UnitTestProject1/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的常规信息通过以下特性集 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Beetle.JT808.UnitTestProject1")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Beetle.JT808.UnitTestProject1")] +[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型, +// 请将该类型上的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("6cb0dd38-40da-49b5-83ce-877c30bfb7ef")] + +// 程序集的版本信息由以下四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Beetle.JT808/Beetle.JT808.UnitTestProject1/UnitTest1.cs b/Beetle.JT808/Beetle.JT808.UnitTestProject1/UnitTest1.cs new file mode 100644 index 0000000..e1b407f --- /dev/null +++ b/Beetle.JT808/Beetle.JT808.UnitTestProject1/UnitTest1.cs @@ -0,0 +1,190 @@ +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Beetle.JT808.UnitTestProject1 +{ + [TestClass] + public class UnitTest1 + { + [TestMethod] + public void TestMethod1() + { + + //Beetle.Express.Clients.SyncTcpClient client = new Express.Clients.SyncTcpClient("192.168.1.184", 5555); + //DateTime dt = new DateTime(2016, 12, 23, 13, 50, 50); + //IProtocolBuffer buffer = MessageFactory.MessateToBuffer(BUSINESS_NO, SIM, (m, b) => + //{ + // b.Direction = 4; + // b.Height = 5; + // b.Latitude = 56; + // b.Longitude = 100; + // b.Speed = 100; + // b.Status.ACC = true; + // b.Time = dt; + // b.WarningMark.DisplayTheFault = true; + //}); + //client.Send(buffer.Array, 0, buffer.Length); + Console.WriteLine("OK"); + } + + private const UInt16 BUSINESS_NO = 1; + + private const string SIM = "13660170908"; + + [TestMethod] + public void TestClientResponse() + { + IProtocolBuffer buffer = MessageFactory.MessateToBuffer(BUSINESS_NO, SIM, (m, b) => + { + b.BussinessNO = 12; + b.ResultID = 5; + b.Result = Messages.ResultType.Success; + }); + buffer.Postion = 0; + IMessage msg = MessageFactory.MessageFromBuffer(buffer); + Messages.ClientResponse response = msg.GetBody(); + Assert.AreEqual(msg.ID, MessageFactory.GetMessageID()); + Assert.AreEqual(msg.SIM, SIM); + Assert.AreEqual(msg.BussinessNO, BUSINESS_NO); + Assert.AreEqual(response.BussinessNO, 12); + Assert.AreEqual(response.Result, Messages.ResultType.Success); + Assert.AreEqual(response.ResultID, 5); + } + + [TestMethod] + public void TestClientPing() + { + IProtocolBuffer buffer = MessageFactory.MessateToBuffer(BUSINESS_NO, SIM, (m, b) => + { + + }); + buffer.Postion = 0; + IMessage msg = MessageFactory.MessageFromBuffer(buffer); + Messages.ClientPing response = msg.GetBody(); + Assert.AreEqual(msg.ID, MessageFactory.GetMessageID()); + Assert.AreEqual(msg.SIM, SIM); + Assert.AreEqual(msg.BussinessNO, BUSINESS_NO); + } + + [TestMethod] + public void TestCenterResponse() + { + IProtocolBuffer buffer = MessageFactory.MessateToBuffer(BUSINESS_NO, SIM, (m, b) => + { + b.BussinessNO = 12; + b.ResultID = 5; + b.Result = Messages.ResultType.Success; + }); + buffer.Postion = 0; + IMessage msg = MessageFactory.MessageFromBuffer(buffer); + Messages.CenterResponse response = msg.GetBody(); + Assert.AreEqual(msg.ID, MessageFactory.GetMessageID()); + Assert.AreEqual(msg.SIM, SIM); + Assert.AreEqual(msg.BussinessNO, BUSINESS_NO); + Assert.AreEqual(response.BussinessNO, 12); + Assert.AreEqual(response.Result, Messages.ResultType.Success); + Assert.AreEqual(response.ResultID, 5); + } + + [TestMethod] + public void TestClientRegister() + { + IProtocolBuffer buffer = MessageFactory.MessateToBuffer(BUSINESS_NO, SIM, (m, b) => + { + b.City = 5; + b.Color = 4; + b.DeviceID = "abc"; + b.DeviceNumber = "1002"; + b.PlateNumber = "粤A4XB38"; + b.Provider = "gdgz"; + b.Province = 10; + }); + buffer.Postion = 0; + IMessage msg = MessageFactory.MessageFromBuffer(buffer); + Messages.ClientRegister register = msg.GetBody(); + Assert.AreEqual(msg.ID, MessageFactory.GetMessageID()); + Assert.AreEqual(msg.SIM, SIM); + Assert.AreEqual(msg.BussinessNO, BUSINESS_NO); + Assert.AreEqual(register.City, 5); + Assert.AreEqual(register.Color, 4); + Assert.AreEqual(register.DeviceID, "abc"); + Assert.AreEqual(register.DeviceNumber, "1002"); + Assert.AreEqual(register.PlateNumber, "粤A4XB38"); + Assert.AreEqual(register.Provider, "gdgz"); + Assert.AreEqual(register.Province, 10); + } + + [TestMethod] + public void TestClientRegisterResponse() + { + IProtocolBuffer buffer = MessageFactory.MessateToBuffer(BUSINESS_NO, SIM, (m, b) => + { + b.BusinessNO = 6; + b.Result = 10; + b.Signature = "bbqabc"; + }); + buffer.Postion = 0; + IMessage msg = MessageFactory.MessageFromBuffer(buffer); + Messages.ClientRegisterResponse response = msg.GetBody(); + Assert.AreEqual(msg.ID, MessageFactory.GetMessageID()); + Assert.AreEqual(msg.SIM, SIM); + Assert.AreEqual(msg.BussinessNO, BUSINESS_NO); + Assert.AreEqual(response.BusinessNO, 6); + Assert.AreEqual(response.Result, 10); + Assert.AreEqual(response.Signature, "bbqabc"); + } + + [TestMethod] + public void TestClientRegisterCancel() + { + IProtocolBuffer buffer = MessageFactory.MessateToBuffer(BUSINESS_NO, SIM, (m, b) => + { + + }); + buffer.Postion = 0; + IMessage msg = MessageFactory.MessageFromBuffer(buffer); + Messages.ClientRegisterCancel response = msg.GetBody(); + Assert.AreEqual(msg.ID, MessageFactory.GetMessageID()); + Assert.AreEqual(msg.SIM, SIM); + Assert.AreEqual(msg.BussinessNO, BUSINESS_NO); + } + + [TestMethod] + public void TestClientSignature() + { + } + + [TestMethod] + public void TestClientPostion() + { + + DateTime dt = new DateTime(2016, 12, 23, 13, 50, 50); + IProtocolBuffer buffer = MessageFactory.MessateToBuffer(BUSINESS_NO, SIM, (m, b) => + { + b.Direction = 4; + b.Height = 5; + b.Latitude = 56; + b.Longitude = 100; + b.Speed = 100; + b.Status.ACC = true; + b.Time = dt; + b.WarningMark.DisplayTheFault = true; + }); + buffer.Postion = 0; + Console.WriteLine(buffer.ToString()); + IMessage msg = MessageFactory.MessageFromBuffer(buffer); + Messages.ClientPostion postion = msg.GetBody(); + Assert.AreEqual(msg.ID, MessageFactory.GetMessageID()); + Assert.AreEqual(msg.SIM, SIM); + Assert.AreEqual(msg.BussinessNO, BUSINESS_NO); + Assert.AreEqual(postion.Direction, 4); + Assert.AreEqual(postion.Height, 5); + Assert.AreEqual(postion.Latitude, (uint)56); + Assert.AreEqual(postion.Longitude, (uint)100); + Assert.AreEqual(postion.Speed, 100); + Assert.AreEqual(postion.Status.ACC, true); + Assert.AreEqual(postion.Time, dt); + Assert.AreEqual(postion.WarningMark.DisplayTheFault, true); + } + } +} diff --git a/Beetle.JT808/Beetle.JT808.sln b/Beetle.JT808/Beetle.JT808.sln new file mode 100644 index 0000000..6590b5b --- /dev/null +++ b/Beetle.JT808/Beetle.JT808.sln @@ -0,0 +1,38 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Beetle.JT808", "Beetle.JT808\Beetle.JT808.csproj", "{AD6A9116-9FAF-475D-8451-4316F2DF910F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Beetle.JT808.ClientApp", "Beetle.JT808.ClientApp\Beetle.JT808.ClientApp.csproj", "{88C57185-5E00-454E-91E9-6E8AAD0E99FC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Beetle.JT808.UnitTestProject1", "Beetle.JT808.UnitTestProject1\Beetle.JT808.UnitTestProject1.csproj", "{5CDBD16D-5D06-4868-A5E8-DB2B62EF2182}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Beetle.TJ808.BaseServer", "Beetle.TJ808.BaseServer\Beetle.TJ808.BaseServer.csproj", "{03EB1725-EC1F-4933-B0E9-E7F48A5B414D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {AD6A9116-9FAF-475D-8451-4316F2DF910F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AD6A9116-9FAF-475D-8451-4316F2DF910F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AD6A9116-9FAF-475D-8451-4316F2DF910F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AD6A9116-9FAF-475D-8451-4316F2DF910F}.Release|Any CPU.Build.0 = Release|Any CPU + {88C57185-5E00-454E-91E9-6E8AAD0E99FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {88C57185-5E00-454E-91E9-6E8AAD0E99FC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {88C57185-5E00-454E-91E9-6E8AAD0E99FC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {88C57185-5E00-454E-91E9-6E8AAD0E99FC}.Release|Any CPU.Build.0 = Release|Any CPU + {5CDBD16D-5D06-4868-A5E8-DB2B62EF2182}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5CDBD16D-5D06-4868-A5E8-DB2B62EF2182}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5CDBD16D-5D06-4868-A5E8-DB2B62EF2182}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5CDBD16D-5D06-4868-A5E8-DB2B62EF2182}.Release|Any CPU.Build.0 = Release|Any CPU + {03EB1725-EC1F-4933-B0E9-E7F48A5B414D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {03EB1725-EC1F-4933-B0E9-E7F48A5B414D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {03EB1725-EC1F-4933-B0E9-E7F48A5B414D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {03EB1725-EC1F-4933-B0E9-E7F48A5B414D}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Beetle.JT808/Beetle.JT808.v11.suo b/Beetle.JT808/Beetle.JT808.v11.suo new file mode 100644 index 0000000000000000000000000000000000000000..e1000de10c3c8536d1b14edf4706eb0a58fa0cc1 GIT binary patch literal 135680 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 V^OqC&X_DnUGSpCh)C~CR{{g7_z~%q| literal 0 HcmV?d00001 diff --git a/Beetle.JT808/Beetle.JT808/Beetle.JT808.csproj b/Beetle.JT808/Beetle.JT808/Beetle.JT808.csproj new file mode 100644 index 0000000..b8d32f1 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/Beetle.JT808.csproj @@ -0,0 +1,80 @@ + + + + + Debug + AnyCPU + {AD6A9116-9FAF-475D-8451-4316F2DF910F} + Library + Properties + Beetle.JT808 + Beetle.JT808 + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Beetle.JT808/Beetle.JT808/Beetle.JT808.csproj.user b/Beetle.JT808/Beetle.JT808/Beetle.JT808.csproj.user new file mode 100644 index 0000000..07dbd5b --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/Beetle.JT808.csproj.user @@ -0,0 +1,6 @@ + + + + ProjectFiles + + \ No newline at end of file diff --git a/Beetle.JT808/Beetle.JT808/ClassDiagram1.cd b/Beetle.JT808/Beetle.JT808/ClassDiagram1.cd new file mode 100644 index 0000000..f65ba6f --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/ClassDiagram1.cd @@ -0,0 +1,344 @@ + + + + + + AAgAAAAAAABACAAAACAAAAAAAD4IAAAAAAAAQAAAAAg= + Core.cs + + + + + + AAAAgJAAAAAAgAABAAABAAAAAACAAAAAAAAAAQBAACA= + Implement\Message.cs + + + + + + + AAAAAAABCAAA7AGMIgARgARgAAgAAKACAgABwREAAAA= + Implement\ProtocolBuffer.cs + + + + + + + AAAABAAAAAAAAAAAAAAAIAAAAACAAABAAAAAABAACAA= + Implement\ProtocolBuffer.cs + + + + + + IUAAgIAAAIAhAAAAgAAAAABgAgCAAAAgAAgAAAAAAAA= + MessageBodyAttributes.cs + + + + + + AAAAgIAAAAAAAAAAAAAAAAQAAAAAAAAAAAEAAAAAAAA= + MessageBodyPacket.cs + + + + + + AAAAAAAAAAAAAAAEAAAAAAAACAAAAgAAAAAAAAAAAAA= + MessageFactory.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + ProtocolProcessError.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAEAAAA= + Serializes\IReadWriteHandler.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAEAAAA= + Serializes\IReadWriteHandler.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAEAAAA= + Serializes\IReadWriteHandler.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAEAAAA= + Serializes\IReadWriteHandler.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAEAAAA= + Serializes\IReadWriteHandler.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAEAAAA= + Serializes\IReadWriteHandler.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAEAAAA= + Serializes\IReadWriteHandler.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAEAAAA= + Serializes\IReadWriteHandler.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAEAAAA= + Serializes\IReadWriteHandler.cs + + + + + + AAAAAAAAAAAAAAAAAAAAABAgAAAAAAAAAAAAAAEAAAA= + Serializes\IReadWriteHandler.cs + + + + + + AAAAAAAAAAAAAAAAAAAAABAgAAAAAAAAAAAAAAEAAAA= + Serializes\IReadWriteHandler.cs + + + + + + AAAAAAAAAAAAAAAAAAAAABAgAAAAAAAAAAAAAAEAAAA= + Serializes\IReadWriteHandler.cs + + + + + + AAAAAAAAAAAAgAAAAABAAAAAAAAAAAAAAAAAAAAAAAA= + Serializes\MessageTypeAttribute.cs + + + + + + AAAAAAAAAAAAIAABAAAAAAQAAAAAAAAAAAAAAAAAAAA= + Messages\CenterResponse.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Messages\ClientPing.cs + + + + + + AAAAAAAEBEAAAAAAACAIAAABAAAAAAAAAAAAAAEAAQA= + Messages\ClientPostion.cs + + + + + + EQACgIAAAAUIAAIFAAACIgAAAEAAQAAJBCAEUECACAI= + Messages\ClientPostion.cs + + + + + + + AIAwgIAAAEAIBAJBAAIIAAAAAAAAAAIAAAAAgCAACgA= + Messages\ClientPostion.cs + + + + + + + AAAAAAAAAAAMAAAIAAAAAAAAAQAAAAAAAAAAkgAAAAA= + Messages\ClientRegister.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Messages\ClientRegisterCancel.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAgAAE= + Messages\ClientRegisterResponse.cs + + + + + + AAAAAAAAAAAAIAABAAAAAAQAAAAAAAAAAAAAAAAAAAA= + Messages\ClientResponse.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE= + Messages\ClientSignature.cs + + + + + + AAAAAgAAIAEAAgAAAAAAAAAAAAAAAAAAAAAAAAAAgAA= + Serializes\EmitHandler.cs + + + + + + ACQAAgAAIAAABABAIAAAAAAAAAAAAAAAAAAAAQAAAAA= + Serializes\EmitHandler.cs + + + + + + AACAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAIEAAAAA= + Serializes\EmitHandler.cs + + + + + + EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAA= + Serializes\EmitHandler.cs + + + + + + AAAAAVAAAAAEBKIAEAABAEQAAAAAAEABABAgAAgAAAA= + Serializes\EmitHandler.cs + + + + + + AAAAAAAAAAAIAAAAAABAAAAgAAAAAAAAAAAAAAEAAAA= + Serializes\PropertySerializeHandler.cs + + + + + + AAAAACAAAAAEAAAAQAAAAAAAACBAAgAAAAACAAAAAAA= + Serializes\Serializer.cs + + + + + + AAADBAgAAAAAAABAAAAAAAAAAAABAAAAAAACAAAAAAA= + Serializes\Serializer.cs + + + + + + AAAAgJAAAAAAgAABAAABAAAAAACAAAAAAAAAAQBAACA= + IMessage.cs + + + + + + AAAAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + IMessageBody.cs + + + + + + AAAAAAABCAAAzACAIgABAARgAAgAAIAAAAABQQEAAAA= + IProtocolBuffer.cs + + + + + + AAAAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Serializes\IBitType.cs + + + + + + AAAAAAAAAAAAAQAAAAAAAAAAAgAAAACAAAAAAAAAEAA= + Messages\ClientResponse.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAA= + Serializes\EmitHandler.cs + + + + + + AAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Serializes\EmitHandler.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAgA= + Serializes\EmitHandler.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAAAAAAAAAAAAA= + Serializes\EmitHandler.cs + + + + \ No newline at end of file diff --git a/Beetle.JT808/Beetle.JT808/Core.cs b/Beetle.JT808/Beetle.JT808/Core.cs new file mode 100644 index 0000000..1b8f34f --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/Core.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Beetle.JT808 +{ + class Core + { + + public byte[] Encode(string value) + { + return Encoding.GetEncoding("GBK").GetBytes(value); + } + + public string Decode(byte[] data, int offset, int count) + { + return Encoding.GetEncoding("GBK").GetString(data, offset, count); + } + + public static short SwapInt16(short v) + { + return (short)(((v & 0xff) << 8) | ((v >> 8) & 0xff)); + } + public static ushort SwapUInt16(ushort v) + { + return (ushort)(((v & 0xff) << 8) | ((v >> 8) & 0xff)); + } + public static int SwapInt32(int v) + { + return (int)(((SwapInt16((short)v) & 0xffff) << 0x10) | + (SwapInt16((short)(v >> 0x10)) & 0xffff)); + } + public static uint SwapUInt32(uint v) + { + return (uint)(((SwapUInt16((ushort)v) & 0xffff) << 0x10) | + (SwapUInt16((ushort)(v >> 0x10)) & 0xffff)); + } + public static long SwapInt64(long v) + { + return (long)(((SwapInt32((int)v) & 0xffffffffL) << 0x20) | + (SwapInt32((int)(v >> 0x20)) & 0xffffffffL)); + } + public static ulong SwapUInt64(ulong v) + { + return (ulong)(((SwapUInt32((uint)v) & 0xffffffffL) << 0x20) | + (SwapUInt32((uint)(v >> 0x20)) & 0xffffffffL)); + } + + public static byte GetCRC(byte[] array, int offset, int count) + { + //write crc + byte crc = 1; + for (int i = offset; i < offset + count; i++) + { + if (i == 1) + crc = array[i]; + else + crc = (byte)(crc ^ array[i]); + } + return crc; + } + + public static bool GetBitValue(uint value, int index) + { + uint tag = 1; + tag = tag << (index); + return (value & tag) > 0; + } + + public static byte GetByteBitValue(params bool[] values) + { + byte result = 0; + for (int i = 0; i < values.Length; i++) + result = (byte)(result | ((values[i] ? 1 : 0) << i)); + return result; + } + + public static ushort GetUShortBitValue(params bool[] values) + { + ushort result = 0; + for (int i = 0; i < values.Length; i++) + result = (ushort)(result | ((values[i] ? 1 : 0) << i)); + return result; + } + + public static uint GetUIntBitValue(params bool[] values) + { + uint result = 0; + for (int i = 0; i < values.Length; i++) + result = (uint)(result | ((values[i] ? (uint)1 : (uint)0) << i)); + return result; + } + } +} diff --git a/Beetle.JT808/Beetle.JT808/IMessage.cs b/Beetle.JT808/Beetle.JT808/IMessage.cs new file mode 100644 index 0000000..9627104 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/IMessage.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Beetle.JT808 +{ + public interface IMessage + { + ushort ID { get; set; } + MessageBodyAttributes Property { get; set; } + string SIM { get; set; } + ushort BussinessNO { get; set; } + PacketInfo Packet { get; set; } + void Save(IProtocolBuffer buffer); + void Load(IProtocolBuffer buffer); + object Body { get; set; } + byte CRC { get; set; } + T GetBody(); + + } +} diff --git a/Beetle.JT808/Beetle.JT808/IMessageBody.cs b/Beetle.JT808/Beetle.JT808/IMessageBody.cs new file mode 100644 index 0000000..9d6255c --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/IMessageBody.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Beetle.JT808 +{ + public interface IMessageBody + { + void Save(IProtocolBuffer buffer); + void Load(IProtocolBuffer buffer); + } +} diff --git a/Beetle.JT808/Beetle.JT808/IProtocolBuffer.cs b/Beetle.JT808/Beetle.JT808/IProtocolBuffer.cs new file mode 100644 index 0000000..837f39c --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/IProtocolBuffer.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Beetle.JT808 +{ + public interface IProtocolBuffer + { + bool Import(byte value); + int Import(byte[] data, int offset, int count); + + void Reset(); + int Length { get; } + void SetLength(int length); + int Postion { get; set; } + byte[] Array { get; } + + void Write(byte[] data); + void Write(byte data); + void Write(ushort value); + void Write(uint value); + void WriteBCD(string value); + void WriteASCII(string value, int length); + int WriteGBK(string value); + void WriteSubBuffer(IProtocolBuffer buffer); + void WriteTag(); + + byte Read(); + byte[] Read(int length); + ushort ReadUInt16(); + uint ReadUInt(); + string ReadBCD(int length); + string ReadASCII(int length); + string ReadGBK(int length = -1); + void ReadSubBuffer(IProtocolBuffer buffer, int count); + } +} diff --git a/Beetle.JT808/Beetle.JT808/Implement/Message.cs b/Beetle.JT808/Beetle.JT808/Implement/Message.cs new file mode 100644 index 0000000..9b0db3f --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/Implement/Message.cs @@ -0,0 +1,143 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Beetle.JT808.Serializes; +namespace Beetle.JT808 +{ + public class Message : IMessage + { + public Message() + { + Property = new JT808.MessageBodyAttributes(); + } + + public object Body + { + get; + set; + } + + public ushort ID + { + get; + set; + } + + public MessageBodyAttributes Property + { + get; + set; + } + + public string SIM + { + get; + set; + } + + public ushort BussinessNO + { + get; + set; + } + + public PacketInfo Packet + { + get; + set; + } + + public byte CRC + { + get; + set; + } + + public void Load(IProtocolBuffer buffer) + { + byte crc = Core.GetCRC(buffer.Array, 1, buffer.Length - 3); + this.CRC = buffer.Array[buffer.Length - 2]; + if (this.CRC != crc) + throw new ProtocolProcessError("message check CRC error!"); + buffer.Read(); //read start + ID = buffer.ReadUInt16(); //read id + Property.Load(buffer); //read property + SIM = buffer.ReadBCD(6); //read sim + BussinessNO = buffer.ReadUInt16(); //read no + if (Property.IsPacket) //read packet + { + Packet = new PacketInfo(); + Packet.Load(buffer); + } + if (Property.BodyLength > 0) //read body + { + IProtocolBuffer bodybuffer = ProtocolBufferPool.Default.Pop(); + try + { + + buffer.ReadSubBuffer(bodybuffer, Property.BodyLength); + Serializer serializer = SerializerFactory.Defalut.Get(ID); + Body = serializer.CreateObject(); + serializer.Deserialize(Body, bodybuffer); + } + finally + { + ProtocolBufferPool.Default.Push(bodybuffer); + } + } + this.CRC = buffer.Read(); //read crc + buffer.Read(); //read end + } + + public void Save(IProtocolBuffer buffer) + { + IProtocolBuffer bodybuffer = null; + try + { + if (Packet != null) + Property.IsPacket = true; + if (Body != null) + { + Serializer serializer = SerializerFactory.Defalut.Get(Body.GetType()); + if (serializer == null) + throw new ProtocolProcessError(string.Format("{0} serializer not found!", Body)); + ID = serializer.MessageType.ID; + if (!serializer.MessageType.NoBody) + { + + bodybuffer = ProtocolBufferPool.Default.Pop(); + serializer.Serialize(Body, bodybuffer); + if (bodybuffer.Length > MessageBodyAttributes.BODY_LENGTH) + throw new ProtocolProcessError("message body to long!"); + Property.BodyLength = (ushort)bodybuffer.Length; + + } + } + buffer.WriteTag(); //write start + buffer.Write(ID); //write id + Property.Save(buffer); //write body property + buffer.WriteBCD(SIM); //write sim + buffer.Write(BussinessNO); //write no + if (Packet != null) //write packet + Packet.Save(buffer); + if (bodybuffer != null) //write body + buffer.WriteSubBuffer(bodybuffer); + byte crc = Core.GetCRC(buffer.Array, 1, buffer.Length - 1); + buffer.Write(crc); //write crc + buffer.WriteTag(); //write end + } + finally + { + if (bodybuffer != null) + ProtocolBufferPool.Default.Push(bodybuffer); + } + } + + public T GetBody() + { + return (T)Body; + } + } +} diff --git a/Beetle.JT808/Beetle.JT808/Implement/ProtocolBuffer.cs b/Beetle.JT808/Beetle.JT808/Implement/ProtocolBuffer.cs new file mode 100644 index 0000000..e20f3ce --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/Implement/ProtocolBuffer.cs @@ -0,0 +1,364 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Beetle.JT808 +{ + public class ProtocolBuffer : IProtocolBuffer + { + private byte[] mArray = new byte[1024]; + + private int mPostion; + + private int mLength; + + private bool mProtocolStart = false; + + public const byte PROTOBUF_TAG = 0x7e; + + public const byte REPLACE_TAG = 0x7d; + + public bool Import(byte value) + { + if (value == PROTOBUF_TAG) + { + OnWrite(value); + if (!mProtocolStart) + { + mProtocolStart = true; + } + else + { + mPostion = 0; + return true; + } + } + else + { + if (mProtocolStart) + { + OnWrite(value); + } + } + return false; + } + + public int Import(byte[] data, int offset, int count) + { + int result = 0; + for (int i = 0; i < count; i++) + { + result++; + byte value = data[offset + i]; + if (Import(value)) + return result; + } + return -1; + } + + private byte OnRead() + { + byte value = mArray[mPostion]; + mPostion++; + return value; + } + + public byte Read() + { + byte value = OnRead(); + if (value == REPLACE_TAG) + { + value = Read(); + if (value == 0x01) + { + return REPLACE_TAG; + } + else if (value == 0x02) + { + return PROTOBUF_TAG; + } + } + return value; + } + + public byte[] Read(int length) + { + byte[] result = new byte[length]; + for (int i = 0; i < length; i++) + { + result[i] = Read(); + } + return result; + } + + private ProtocolBuffer OnWrite(byte value) + { + mArray[mPostion] = value; + mPostion++; + mLength++; + return this; + } + + public void WriteTag() + { + OnWrite(PROTOBUF_TAG); + } + + public void Write(byte data) + { + if (data == PROTOBUF_TAG) + { + OnWrite(REPLACE_TAG).OnWrite(0x02); + } + else if (data == REPLACE_TAG) + { + OnWrite(REPLACE_TAG).OnWrite(0x01); + } + else + { + OnWrite(data); + } + } + + public void Write(byte[] data) + { + for (int i = 0; i < data.Length; i++) + { + Write(data[i]); + } + } + + public int Length { get { return mLength; } } + + public int Postion { get { return mPostion; } set { mPostion = value; } } + + public byte[] Array { get { return mArray; } } + + public void ReadSubBuffer(IProtocolBuffer buffer, int count) + { + Buffer.BlockCopy(mArray, mPostion, buffer.Array, 0, count); + mPostion += count; + buffer.SetLength(count); + buffer.Postion = 0; + } + + public void WriteSubBuffer(IProtocolBuffer buffer) + { + Buffer.BlockCopy(buffer.Array, 0, mArray, mPostion, buffer.Length); + mPostion += buffer.Length; + mLength += buffer.Length; + } + + public void SetLength(int length) + { + mLength = length; + } + + public void Reset() + { + mPostion = 0; + mLength = 0; + mProtocolStart = false; + } + + public void Write(ushort value) + { + value = Core.SwapUInt16(value); + byte[] data = BitConverter.GetBytes(value); + Write(data); + } + + public void Write(uint value) + { + value = Core.SwapUInt32(value); + byte[] data = BitConverter.GetBytes(value); + Write(data); + } + + public void WriteBCD(string value) + { + byte[] data = str2Bcd(value); + Write(data); + } + + public ushort ReadUInt16() + { + byte[] data = Read(2); + ushort result = BitConverter.ToUInt16(data, 0); + return Core.SwapUInt16(result); + } + + public uint ReadUInt() + { + byte[] data = Read(4); + uint result = BitConverter.ToUInt32(data, 0); + return Core.SwapUInt32(result); + } + + public string ReadBCD(int length) + { + byte[] data = Read(length); + return bcd2Str(data); + } + + public byte[] str2Bcd(String asc) + { + int len = asc.Length; + int mod = len % 2; + if (mod != 0) + { + asc = "0" + asc; + len = asc.Length; + } + byte[] abt = new byte[len]; + if (len >= 2) + { + len = len / 2; + } + byte[] bbt = new byte[len]; + abt = System.Text.Encoding.ASCII.GetBytes(asc); + int j, k; + for (int p = 0; p < asc.Length / 2; p++) + { + if ((abt[2 * p] >= '0') && (abt[2 * p] <= '9')) + { + j = abt[2 * p] - '0'; + } + else if ((abt[2 * p] >= 'a') && (abt[2 * p] <= 'z')) + { + j = abt[2 * p] - 'a' + 0x0a; + } + else + { + j = abt[2 * p] - 'A' + 0x0a; + } + if ((abt[2 * p + 1] >= '0') && (abt[2 * p + 1] <= '9')) + { + k = abt[2 * p + 1] - '0'; + } + else if ((abt[2 * p + 1] >= 'a') && (abt[2 * p + 1] <= 'z')) + { + k = abt[2 * p + 1] - 'a' + 0x0a; + } + else + { + k = abt[2 * p + 1] - 'A' + 0x0a; + } + int a = (j << 4) + k; + byte b = (byte)a; + bbt[p] = b; + } + return bbt; + + } + + public string bcd2Str(byte[] bytes) + { + StringBuilder temp = new StringBuilder(bytes.Length * 2); + for (int i = 0; i < bytes.Length; i++) + { + temp.Append((byte)((bytes[i] & 0xf0) >> 4)); + temp.Append((byte)(bytes[i] & 0x0f)); + } + return temp.ToString().Substring(0, 1).Equals("0") ? temp.ToString().Substring(1) : temp.ToString(); + + } + + public void WriteASCII(string value, int length) + { + if (value.Length > length) + { + value = value.Substring(0, length); + } + else + { + for (int i = value.Length; i < length; i++) + { + value = " " + value; + } + } + byte[] data = Encoding.ASCII.GetBytes(value); + Write(data); + } + + public string ReadASCII(int length) + { + byte[] data = Read(length); + return Encoding.ASCII.GetString(data); + } + + public int WriteGBK(string value) + { + int postion = mPostion; + byte[] data = Encoding.GetEncoding("GBK").GetBytes(value); + Write(data); + return mPostion - postion; + } + + public string ReadGBK(int length = -1) + { + if (length == -1) + return Encoding.GetEncoding("GBK").GetString(Array, mPostion, mLength - mPostion); + byte[] data = Read(length); + return Encoding.GetEncoding("GBK").GetString(data); + } + + public override string ToString() + { + string hex = BitConverter.ToString(Array, 0, Length).Replace("-", string.Empty); + return hex; + } + } + + + public class ProtocolBufferPool + { + private System.Collections.Concurrent.ConcurrentStack + mPool = new System.Collections.Concurrent.ConcurrentStack(); + + public ProtocolBufferPool() + { + for (int i = 0; i < 1000; i++) + { + mPool.Push(CreateBuffer()); + } + } + + public IProtocolBuffer Pop() + { + IProtocolBuffer result = null; + if (!mPool.TryPop(out result)) + { + result = CreateBuffer(); + } + + result.Reset(); + return result; + } + + private IProtocolBuffer CreateBuffer() + { + ProtocolBuffer buffer = new ProtocolBuffer(); + return buffer; + } + + public void Push(IProtocolBuffer buffer) + { + mPool.Push(buffer); + } + + private static ProtocolBufferPool mDefault; + + public static ProtocolBufferPool Default + { + get + { + if (mDefault == null) + mDefault = new ProtocolBufferPool(); + return mDefault; + } + } + } +} diff --git a/Beetle.JT808/Beetle.JT808/MessageBodyAttributes.cs b/Beetle.JT808/Beetle.JT808/MessageBodyAttributes.cs new file mode 100644 index 0000000..fdcefae --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/MessageBodyAttributes.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Beetle.JT808 +{ + public class MessageBodyAttributes + { + + #region consts + public const ushort CUSTOM_HEIGHT = 0x8000; + + public const ushort CUSTOM_LOW = 0x4000; + + public const ushort IS_PACKET = 0x2000; + + public const ushort ENCRYPT_HEIGHT = 0x1000; + + public const ushort ENCRYPT_MIDDLE = 0x400; + + public const ushort ENCRYPT_LOW = 0x200; + + public const ushort BODY_LENGTH = 0x1FF; + #endregion + + //保留位15 + public bool CustomHigh { get; set; } + + //保留位14 + public bool CustomLow { get; set; } + + //分包位13 + public bool IsPacket { get; set; } + + //加密位12 + public bool EncryptHigh { get; set; } + + //加密位11 + public bool EncryptMiddle { get; set; } + + //加密位10 + public bool EncryptLow { get; set; } + + //消息长度9-0 + public ushort BodyLength { get; set; } + + public void Save(IProtocolBuffer buffer) + { + ushort value = (ushort)(BodyLength & BODY_LENGTH); + if (CustomHigh) + value |= CUSTOM_HEIGHT; + if (CustomLow) + value |= CUSTOM_LOW; + if (IsPacket) + value |= IS_PACKET; + if (EncryptHigh) + value |= ENCRYPT_HEIGHT; + if (EncryptMiddle) + value |= ENCRYPT_MIDDLE; + if (EncryptLow) + value |= ENCRYPT_LOW; + buffer.Write(value); + } + + public void Load(IProtocolBuffer buffer) + { + + ushort value = buffer.ReadUInt16(); + CustomHigh = (CUSTOM_HEIGHT & value) > 0; + CustomLow = (CUSTOM_LOW & value) > 0; + IsPacket = (IS_PACKET & value) > 0; + EncryptHigh = (ENCRYPT_HEIGHT & value) > 0; + EncryptMiddle = (ENCRYPT_MIDDLE & value) > 0; + EncryptLow = (ENCRYPT_LOW & value) > 0; + BodyLength = (ushort)(BODY_LENGTH & value); + } + } +} diff --git a/Beetle.JT808/Beetle.JT808/MessageBodyPacket.cs b/Beetle.JT808/Beetle.JT808/MessageBodyPacket.cs new file mode 100644 index 0000000..bd30229 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/MessageBodyPacket.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Beetle.JT808 +{ + public class PacketInfo + { + public ushort Count { get; set; } + + public ushort Index { get; set; } + + public void Save(IProtocolBuffer buffer) + { + Count = Core.SwapUInt16(Count); + Index = Core.SwapUInt16(Index); + } + + public void Load(IProtocolBuffer buffer) + { + byte[] data = buffer.Read(2); + Count = BitConverter.ToUInt16(data, 0); + Count = Core.SwapUInt16(Count); + + data = buffer.Read(2); + Index = BitConverter.ToUInt16(data, 0); + Index = Core.SwapUInt16(Count); + } + } +} diff --git a/Beetle.JT808/Beetle.JT808/MessageFactory.cs b/Beetle.JT808/Beetle.JT808/MessageFactory.cs new file mode 100644 index 0000000..50bf713 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/MessageFactory.cs @@ -0,0 +1,44 @@ + +using Beetle.JT808.Messages; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Beetle.JT808 +{ + public class MessageFactory + { + + public static IProtocolBuffer MessateToBuffer(ushort businessNO, string sim, Action handler) where T : new() + { + IProtocolBuffer buffer = ProtocolBufferPool.Default.Pop(); + Message msg = new Message(); + msg.BussinessNO = businessNO; + msg.SIM = sim; + T body = new T(); + msg.Body = body; + if (handler != null) + handler(msg, body); + msg.Save(buffer); + return buffer; + } + + public static ushort GetMessageID() + { + Type type = typeof(T); + Serializes.Serializer serializer = Serializes.SerializerFactory.Defalut.Get(type); + if (serializer == null) + throw new ProtocolProcessError(string.Format("{0} serializer not found!", type)); + return serializer.MessageType.ID; + } + + public static Message MessageFromBuffer(IProtocolBuffer buffer) + { + Message msg = new Message(); + msg.Load(buffer); + return msg; + } + } +} diff --git a/Beetle.JT808/Beetle.JT808/Messages/CenterResponse.cs b/Beetle.JT808/Beetle.JT808/Messages/CenterResponse.cs new file mode 100644 index 0000000..9bf3e10 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/Messages/CenterResponse.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Beetle.JT808.Messages +{ + + [MessageType(ID = 0x0008)] + public class CenterResponse + { + [UInt16Handler] + public ushort BussinessNO { get; set; } + [UInt16Handler] + public ushort ResultID { get; set; } + [ByteHandler] + public ResultType Result { get; set; } + } +} diff --git a/Beetle.JT808/Beetle.JT808/Messages/ClientPing.cs b/Beetle.JT808/Beetle.JT808/Messages/ClientPing.cs new file mode 100644 index 0000000..072bdc4 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/Messages/ClientPing.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Beetle.JT808.Messages +{ + [MessageType(NoBody = true, ID = 0x0002)] + public class ClientPing + { + + } +} diff --git a/Beetle.JT808/Beetle.JT808/Messages/ClientPostion.cs b/Beetle.JT808/Beetle.JT808/Messages/ClientPostion.cs new file mode 100644 index 0000000..9947952 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/Messages/ClientPostion.cs @@ -0,0 +1,342 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Beetle.JT808.Messages +{ + [MessageType(ID = 0x0200)] + public class ClientPostion + { + public ClientPostion() + { + Status = new ClientPostionStatus(); + WarningMark = new ClientPostionWarningMark(); + } + + [UIntBitHandler(typeof(ClientPostionWarningMark))] + public ClientPostionWarningMark WarningMark { get; set; } + + [UIntBitHandler(typeof(ClientPostionStatus))] + public ClientPostionStatus Status { get; set; } + + [UIntHandler] + public uint Longitude { get; set; } + + [UIntHandler] + public uint Latitude { get; set; } + + [UInt16Handler] + public ushort Height { get; set; } + + [UInt16Handler] + public ushort Speed { get; set; } + + [UInt16Handler] + public ushort Direction { get; set; } + + [TimeBCD] + public DateTime Time { get; set; } + + + } + + + + + public class ClientPostionWarningMark : IBitCustomType + { + /// + /// 紧急报瞥触动报警开关后触发 + /// + public bool TouchAlarmSwitch { get; set; } + + /// + /// 超速报警 + /// + public bool SpeedLimit { get; set; } + + /// + /// 疲劳驾驶 + /// + public bool Fatigue { get; set; } + + /// + /// 预警 + /// + public bool Alert { get; set; } + + /// + /// GNSS模块发生故障 + /// + public bool GNSSModule { get; set; } + + /// + /// GNSS天线未接或被剪断 + /// + public bool GNSSCutAntenna { get; set; } + + /// + /// GNSS天线短路 + /// + public bool GNSSShortCircuit { get; set; } + + /// + /// 终端主电源欠压 + /// + public bool MainPowerVoltage { get; set; } + + /// + /// 终端主电源掉电 + /// + public bool MainPowerOff { get; set; } + + /// + /// 终端LCD或显示器故障 + /// + public bool DisplayTheFault { get; set; } + + /// + /// TTS模块故障 + /// + public bool TTSModuleFailure { get; set; } + + /// + /// 摄像头故障 + /// + public bool CameraMalfunction { get; set; } + + public bool Keep12 { get; set; } + + public bool Keep13 { get; set; } + + public bool Keep14 { get; set; } + + public bool Keep15 { get; set; } + + public bool Keep16 { get; set; } + + public bool Keep17 { get; set; } + + /// + /// 驾驶超时 + /// + public bool DrivingTimeoutOfDay { get; set; } + + /// + /// 超时停车 + /// + public bool StopTimeout { get; set; } + + /// + /// 进出区域 + /// + public bool InOutArea { get; set; } + + /// + /// 进出路线 + /// + public bool InOutLine { get; set; } + + /// + /// 路段行驶时间 + /// + public bool BritainsTime { get; set; } + + /// + /// 路线偏离报警 + /// + public bool LaneDeparture { get; set; } + + /// + /// VSS故障 + /// + public bool VSSFault { get; set; } + + /// + /// 油量异常 + /// + public bool OilFault { get; set; } + + /// + /// 被盗 + /// + public bool Stolen { get; set; } + + /// + /// 非法点火 + /// + public bool IllegalIgnition { get; set; } + + /// + /// 车辆非法位移 + /// + public bool IllegalDisplacement { get; set; } + + public bool Keep29 { get; set; } + + public bool Keep30 { get; set; } + + public bool Keep31 { get; set; } + + public void Load(object value) + { + uint data = (uint)value; + TouchAlarmSwitch = Core.GetBitValue(data, 0); + SpeedLimit = Core.GetBitValue(data, 1); + Fatigue = Core.GetBitValue(data, 2); + Alert = Core.GetBitValue(data, 3); + GNSSModule = Core.GetBitValue(data, 4); + GNSSCutAntenna = Core.GetBitValue(data, 5); + GNSSShortCircuit = Core.GetBitValue(data, 6); + MainPowerVoltage = Core.GetBitValue(data, 7); + MainPowerOff = Core.GetBitValue(data, 8); + DisplayTheFault = Core.GetBitValue(data, 9); + TTSModuleFailure = Core.GetBitValue(data, 10); + CameraMalfunction = Core.GetBitValue(data, 11); + Keep12 = Core.GetBitValue(data, 12); + Keep13 = Core.GetBitValue(data, 13); + Keep14 = Core.GetBitValue(data, 14); + Keep15 = Core.GetBitValue(data, 15); + Keep16 = Core.GetBitValue(data, 16); + Keep17 = Core.GetBitValue(data, 17); + DrivingTimeoutOfDay = Core.GetBitValue(data, 18); + StopTimeout = Core.GetBitValue(data, 19); + InOutArea = Core.GetBitValue(data, 20); + InOutLine = Core.GetBitValue(data, 21); + BritainsTime = Core.GetBitValue(data, 22); + LaneDeparture = Core.GetBitValue(data, 23); + VSSFault = Core.GetBitValue(data, 24); + OilFault = Core.GetBitValue(data, 25); + Stolen = Core.GetBitValue(data, 26); + IllegalIgnition = Core.GetBitValue(data, 27); + IllegalDisplacement = Core.GetBitValue(data, 28); + Keep29 = Core.GetBitValue(data, 29); + Keep30 = Core.GetBitValue(data, 30); + Keep31 = Core.GetBitValue(data, 31); + + } + + public object Save() + { + return Core.GetUIntBitValue(TouchAlarmSwitch, SpeedLimit, Fatigue, Alert, GNSSModule, GNSSCutAntenna, GNSSShortCircuit, + MainPowerVoltage, MainPowerOff, DisplayTheFault, TTSModuleFailure, CameraMalfunction, Keep12, + Keep13, Keep14, Keep15, Keep16, Keep17, DrivingTimeoutOfDay, StopTimeout, InOutArea, InOutLine, + BritainsTime, LaneDeparture, VSSFault, OilFault, Stolen, IllegalIgnition, IllegalDisplacement, + Keep29, Keep30, Keep31); + } + } + + public class ClientPostionStatus : IBitCustomType + { + public bool ACC { get; set; } + + public bool Location { get; set; } + + public bool Latitude { get; set; } + + public bool Longitude { get; set; } + + public bool Operate { get; set; } + + public bool Encryption { get; set; } + + public bool Keep6 { get; set; } + + public bool Keep7 { get; set; } + + public bool Keep8 { get; set; } + + public bool Keep9 { get; set; } + + public bool OilRoad { get; set; } + + public bool ElectricityRoad { get; set; } + + public bool DoorLock { get; set; } + + public bool Keep13 { get; set; } + + public bool Keep14 { get; set; } + + public bool Keep15 { get; set; } + + public bool Keep16 { get; set; } + + public bool Keep17 { get; set; } + + public bool Keep18 { get; set; } + + public bool Keep19 { get; set; } + + public bool Keep20 { get; set; } + + public bool Keep21 { get; set; } + + public bool Keep22 { get; set; } + + public bool Keep23 { get; set; } + + public bool Keep24 { get; set; } + + public bool Keep25 { get; set; } + + public bool Keep26 { get; set; } + + public bool Keep27 { get; set; } + + public bool Keep28 { get; set; } + + public bool Keep29 { get; set; } + + public bool Keep30 { get; set; } + + public bool Keep31 { get; set; } + + public void Load(object value) + { + uint data = (uint)value; + ACC = Core.GetBitValue(data, 0); + Location = Core.GetBitValue(data, 1); + Latitude = Core.GetBitValue(data, 2); + Longitude = Core.GetBitValue(data, 3); + Operate = Core.GetBitValue(data, 4); + Encryption = Core.GetBitValue(data, 5); + Keep6 = Core.GetBitValue(data, 6); + Keep7 = Core.GetBitValue(data, 7); + Keep8 = Core.GetBitValue(data, 8); + Keep9 = Core.GetBitValue(data, 9); + OilRoad = Core.GetBitValue(data, 10); + ElectricityRoad = Core.GetBitValue(data, 11); + DoorLock = Core.GetBitValue(data, 12); + Keep13 = Core.GetBitValue(data, 13); + Keep14 = Core.GetBitValue(data, 14); + Keep15 = Core.GetBitValue(data, 15); + Keep16 = Core.GetBitValue(data, 16); + Keep17 = Core.GetBitValue(data, 17); + Keep18 = Core.GetBitValue(data, 18); + Keep19 = Core.GetBitValue(data, 19); + Keep20 = Core.GetBitValue(data, 20); + Keep21 = Core.GetBitValue(data, 21); + Keep22 = Core.GetBitValue(data, 22); + Keep23 = Core.GetBitValue(data, 23); + Keep24 = Core.GetBitValue(data, 24); + Keep25 = Core.GetBitValue(data, 25); + Keep26 = Core.GetBitValue(data, 26); + Keep27 = Core.GetBitValue(data, 27); + Keep28 = Core.GetBitValue(data, 28); + Keep29 = Core.GetBitValue(data, 29); + Keep30 = Core.GetBitValue(data, 30); + Keep31 = Core.GetBitValue(data, 31); + + } + + public object Save() + { + return Core.GetUIntBitValue(ACC, Location, Latitude, Longitude, Operate, Encryption, Keep6, Keep7, Keep8, Keep9, + OilRoad, ElectricityRoad, DoorLock, Keep13, Keep14, Keep15, Keep16, Keep17, Keep18, Keep19, Keep20, Keep21, Keep22, + Keep23, Keep24, Keep25, Keep26, Keep27, Keep28, Keep29, Keep30, Keep31); + } + } +} diff --git a/Beetle.JT808/Beetle.JT808/Messages/ClientRegister.cs b/Beetle.JT808/Beetle.JT808/Messages/ClientRegister.cs new file mode 100644 index 0000000..0afaf25 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/Messages/ClientRegister.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +namespace Beetle.JT808.Messages +{ + [MessageType(ID = 0x0100)] + public class ClientRegister + { + [UInt16Handler] + public ushort Province { get; set; } + [UInt16Handler] + public ushort City { get; set; } + [ASCIIHandler(5)] + public string Provider { get; set; } + [ASCIIHandler(8)] + public string DeviceNumber { get; set; } + [ASCIIHandler(7)] + public string DeviceID { get; set; } + [ByteHandler] + public byte Color { get; set; } + [GBKHandler] + public string PlateNumber { get; set; } + } +} diff --git a/Beetle.JT808/Beetle.JT808/Messages/ClientRegisterCancel.cs b/Beetle.JT808/Beetle.JT808/Messages/ClientRegisterCancel.cs new file mode 100644 index 0000000..0812b40 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/Messages/ClientRegisterCancel.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Beetle.JT808.Messages +{ + [MessageType(NoBody = true, ID = 0x0003)] + public class ClientRegisterCancel + { + } +} diff --git a/Beetle.JT808/Beetle.JT808/Messages/ClientRegisterResponse.cs b/Beetle.JT808/Beetle.JT808/Messages/ClientRegisterResponse.cs new file mode 100644 index 0000000..16a53d3 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/Messages/ClientRegisterResponse.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Beetle.JT808.Messages +{ + [MessageType(ID = 0x8100)] + public class ClientRegisterResponse + { + [UInt16Handler] + public ushort BusinessNO { get; set; } + [ByteHandler] + public byte Result { get; set; } + [GBKHandler] + public string Signature { get; set; } + } +} diff --git a/Beetle.JT808/Beetle.JT808/Messages/ClientResponse.cs b/Beetle.JT808/Beetle.JT808/Messages/ClientResponse.cs new file mode 100644 index 0000000..283a735 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/Messages/ClientResponse.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Beetle.JT808.Messages +{ + + public enum ResultType : byte + { + Success = 0, + Failure = 1, + Error = 2, + NotSupport = 3 + + } + [MessageType(ID = 0x0001)] + public class ClientResponse + { + [UInt16Handler] + public ushort BussinessNO { get; set; } + [UInt16Handler] + public ushort ResultID { get; set; } + [ByteHandler] + public ResultType Result { get; set; } + } + + +} diff --git a/Beetle.JT808/Beetle.JT808/Messages/ClientSignature.cs b/Beetle.JT808/Beetle.JT808/Messages/ClientSignature.cs new file mode 100644 index 0000000..fd4f03f --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/Messages/ClientSignature.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Beetle.JT808.Messages +{ + [MessageType(ID = 0x0102)] + public class ClientSignature + { + [GBKHandler] + public string Signature { get; set; } + } +} diff --git a/Beetle.JT808/Beetle.JT808/Properties/AssemblyInfo.cs b/Beetle.JT808/Beetle.JT808/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..cb03f18 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Beetle.JT808")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Beetle.JT808")] +[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +//将 ComVisible 设置为 false 将使此程序集中的类型 +//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("ad6a9116-9faf-475d-8451-4316f2df910f")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Beetle.JT808/Beetle.JT808/ProtocolProcessError.cs b/Beetle.JT808/Beetle.JT808/ProtocolProcessError.cs new file mode 100644 index 0000000..bf010dd --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/ProtocolProcessError.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Beetle.JT808 +{ + public class ProtocolProcessError : Exception + { + public ProtocolProcessError() + { + } + + public ProtocolProcessError(string error) : base(error) { } + + public ProtocolProcessError(string error, Exception e) : base(error, e) { } + } +} diff --git a/Beetle.JT808/Beetle.JT808/Serializes/EmitHandler.cs b/Beetle.JT808/Beetle.JT808/Serializes/EmitHandler.cs new file mode 100644 index 0000000..8362a9e --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/Serializes/EmitHandler.cs @@ -0,0 +1,532 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Reflection.Emit; +using System.Text; +using System.Threading.Tasks; + +namespace Beetle.JT808.Serializes +{ + public class FieldHandler + { + public FieldHandler(FieldInfo field) + { + mGetValue = ReflectionHandlerFactory.FieldGetHandler(field); + mSetValue = ReflectionHandlerFactory.FieldSetHandler(field); + Field = field; + } + private FieldInfo mField; + public FieldInfo Field + { + get + { + return mField; + } + private set + { + mField = value; + } + } + private GetValueHandler mGetValue; + public GetValueHandler GetValue + { + get + { + return mGetValue; + } + + } + private SetValueHandler mSetValue; + public SetValueHandler SetValue + { + get + { + return mSetValue; + } + + } + } + public class PropertyHandler + { + public PropertyHandler(PropertyInfo property) + { + if (property.CanWrite) + mSetValue = ReflectionHandlerFactory.PropertySetHandler(property); + if (property.CanRead) + mGetValue = ReflectionHandlerFactory.PropertyGetHandler(property); + mProperty = property; + IndexProperty = mProperty.GetGetMethod().GetParameters().Length > 0; + } + private bool mIndexProperty; + public bool IndexProperty + { + get + { + return mIndexProperty; + } + set + { + mIndexProperty = value; + } + } + private PropertyInfo mProperty; + public PropertyInfo Property + { + get + { + return mProperty; + } + set + { + mProperty = value; + } + } + private GetValueHandler mGetValue; + public GetValueHandler Get + { + get + { + return mGetValue; + } + + } + private SetValueHandler mSetValue; + public SetValueHandler Set + { + get + { + return mSetValue; + } + + } + } + public class MethodHandler + { + public MethodHandler(MethodInfo method) + { + mExecute = ReflectionHandlerFactory.MethodHandler(method); + mInfo = method; + } + private MethodInfo mInfo; + public MethodInfo Info + { + get + { + return mInfo; + } + } + private FastMethodHandler mExecute; + public FastMethodHandler Execute + { + get + { + return mExecute; + } + } + } + public class InstanceHandler + { + public InstanceHandler(Type type) + { + mInstance = ReflectionHandlerFactory.InstanceHandler(type); + } + private ObjectInstanceHandler mInstance; + public ObjectInstanceHandler Instance + { + get + { + return mInstance; + } + } + } + public delegate object GetValueHandler(object source); + public delegate object ObjectInstanceHandler(); + public delegate void SetValueHandler(object source, object value); + public delegate object FastMethodHandler(object target, object[] paramters); + public class ReflectionHandlerFactory + { + + #region field handler + + private static Dictionary mFieldGetHandlers = new Dictionary(); + private static Dictionary mFieldSetHandlers = new Dictionary(); + public static GetValueHandler FieldGetHandler(FieldInfo field) + { + GetValueHandler handler; + if (mFieldGetHandlers.ContainsKey(field)) + { + handler = mFieldGetHandlers[field]; + } + else + { + lock (typeof(ReflectionHandlerFactory)) + { + if (mFieldGetHandlers.ContainsKey(field)) + { + handler = mFieldGetHandlers[field]; + } + else + { + handler = CreateFieldGetHandler(field); + mFieldGetHandlers.Add(field, handler); + } + + } + } + return handler; + } + private static GetValueHandler CreateFieldGetHandler(FieldInfo field) + { + DynamicMethod dm = new DynamicMethod("", typeof(object), new Type[] { typeof(object) }, field.DeclaringType); + ILGenerator ilGenerator = dm.GetILGenerator(); + ilGenerator.Emit(OpCodes.Ldarg_0); + ilGenerator.Emit(OpCodes.Ldfld, field); + EmitBoxIfNeeded(ilGenerator, field.FieldType); + ilGenerator.Emit(OpCodes.Ret); + return (GetValueHandler)dm.CreateDelegate(typeof(GetValueHandler)); + } + public static SetValueHandler FieldSetHandler(FieldInfo field) + { + SetValueHandler handler; + if (mFieldSetHandlers.ContainsKey(field)) + { + handler = mFieldSetHandlers[field]; + } + else + { + lock (typeof(ReflectionHandlerFactory)) + { + if (mFieldSetHandlers.ContainsKey(field)) + { + handler = mFieldSetHandlers[field]; + } + else + { + handler = CreateFieldSetHandler(field); + mFieldSetHandlers.Add(field, handler); + } + } + } + return handler; + } + private static SetValueHandler CreateFieldSetHandler(FieldInfo field) + { + DynamicMethod dm = new DynamicMethod("", null, new Type[] { typeof(object), typeof(object) }, field.DeclaringType); + ILGenerator ilGenerator = dm.GetILGenerator(); + ilGenerator.Emit(OpCodes.Ldarg_0); + ilGenerator.Emit(OpCodes.Ldarg_1); + EmitCastToReference(ilGenerator, field.FieldType); + ilGenerator.Emit(OpCodes.Stfld, field); + ilGenerator.Emit(OpCodes.Ret); + return (SetValueHandler)dm.CreateDelegate(typeof(SetValueHandler)); + } + + #endregion + + #region Property Handler + + private static Dictionary mPropertyGetHandlers = new Dictionary(); + private static Dictionary mPropertySetHandlers = new Dictionary(); + public static SetValueHandler PropertySetHandler(PropertyInfo property) + { + SetValueHandler handler; + if (mPropertySetHandlers.ContainsKey(property)) + { + handler = mPropertySetHandlers[property]; + } + else + { + lock (typeof(ReflectionHandlerFactory)) + { + if (mPropertySetHandlers.ContainsKey(property)) + { + handler = mPropertySetHandlers[property]; + } + else + { + handler = CreatePropertySetHandler(property); + mPropertySetHandlers.Add(property, handler); + } + } + } + return handler; + } + private static SetValueHandler CreatePropertySetHandler(PropertyInfo property) + { + DynamicMethod dynamicMethod = new DynamicMethod(string.Empty, null, new Type[] { typeof(object), typeof(object) }, property.DeclaringType.Module); + + ILGenerator ilGenerator = dynamicMethod.GetILGenerator(); + + + ilGenerator.Emit(OpCodes.Ldarg_0); + + + ilGenerator.Emit(OpCodes.Ldarg_1); + + + EmitCastToReference(ilGenerator, property.PropertyType); + + + ilGenerator.EmitCall(OpCodes.Callvirt, property.GetSetMethod(), null); + + + ilGenerator.Emit(OpCodes.Ret); + + + SetValueHandler setter = (SetValueHandler)dynamicMethod.CreateDelegate(typeof(SetValueHandler)); + + return setter; + } + public static GetValueHandler PropertyGetHandler(PropertyInfo property) + { + GetValueHandler handler; + if (mPropertyGetHandlers.ContainsKey(property)) + { + handler = mPropertyGetHandlers[property]; + } + else + { + lock (typeof(ReflectionHandlerFactory)) + { + if (mPropertyGetHandlers.ContainsKey(property)) + { + handler = mPropertyGetHandlers[property]; + } + else + { + handler = CreatePropertyGetHandler(property); + mPropertyGetHandlers.Add(property, handler); + } + } + } + return handler; + } + private static GetValueHandler CreatePropertyGetHandler(PropertyInfo property) + { + + DynamicMethod dynamicMethod = new DynamicMethod(string.Empty, typeof(object), new Type[] { typeof(object) }, property.DeclaringType.Module); + + ILGenerator ilGenerator = dynamicMethod.GetILGenerator(); + + + ilGenerator.Emit(OpCodes.Ldarg_0); + + + ilGenerator.EmitCall(OpCodes.Callvirt, property.GetGetMethod(), null); + + + EmitBoxIfNeeded(ilGenerator, property.PropertyType); + + + ilGenerator.Emit(OpCodes.Ret); + + + GetValueHandler getter = (GetValueHandler)dynamicMethod.CreateDelegate(typeof(GetValueHandler)); + + return getter; + } + #endregion + + #region Method Handler + + private static Dictionary mMethodHandlers = new Dictionary(); + public static FastMethodHandler MethodHandler(MethodInfo method) + { + FastMethodHandler handler = null; + if (mMethodHandlers.ContainsKey(method)) + { + handler = mMethodHandlers[method]; + } + else + { + lock (typeof(ReflectionHandlerFactory)) + { + if (mMethodHandlers.ContainsKey(method)) + { + handler = mMethodHandlers[method]; + } + else + { + handler = CreateMethodHandler(method); + mMethodHandlers.Add(method, handler); + } + } + } + return handler; + } + private static FastMethodHandler CreateMethodHandler(MethodInfo methodInfo) + { + DynamicMethod dynamicMethod = new DynamicMethod(string.Empty, typeof(object), new Type[] { typeof(object), typeof(object[]) }, methodInfo.DeclaringType.Module); + ILGenerator il = dynamicMethod.GetILGenerator(); + ParameterInfo[] ps = methodInfo.GetParameters(); + Type[] paramTypes = new Type[ps.Length]; + for (int i = 0; i < paramTypes.Length; i++) + { + if (ps[i].ParameterType.IsByRef) + paramTypes[i] = ps[i].ParameterType.GetElementType(); + else + paramTypes[i] = ps[i].ParameterType; + } + LocalBuilder[] locals = new LocalBuilder[paramTypes.Length]; + + for (int i = 0; i < paramTypes.Length; i++) + { + locals[i] = il.DeclareLocal(paramTypes[i], true); + } + for (int i = 0; i < paramTypes.Length; i++) + { + il.Emit(OpCodes.Ldarg_1); + EmitFastInt(il, i); + il.Emit(OpCodes.Ldelem_Ref); + EmitCastToReference(il, paramTypes[i]); + il.Emit(OpCodes.Stloc, locals[i]); + } + if (!methodInfo.IsStatic) + { + il.Emit(OpCodes.Ldarg_0); + } + for (int i = 0; i < paramTypes.Length; i++) + { + if (ps[i].ParameterType.IsByRef) + il.Emit(OpCodes.Ldloca_S, locals[i]); + else + il.Emit(OpCodes.Ldloc, locals[i]); + } + if (methodInfo.IsStatic) + il.EmitCall(OpCodes.Call, methodInfo, null); + else + il.EmitCall(OpCodes.Callvirt, methodInfo, null); + if (methodInfo.ReturnType == typeof(void)) + il.Emit(OpCodes.Ldnull); + else + EmitBoxIfNeeded(il, methodInfo.ReturnType); + + for (int i = 0; i < paramTypes.Length; i++) + { + if (ps[i].ParameterType.IsByRef) + { + il.Emit(OpCodes.Ldarg_1); + EmitFastInt(il, i); + il.Emit(OpCodes.Ldloc, locals[i]); + if (locals[i].LocalType.IsValueType) + il.Emit(OpCodes.Box, locals[i].LocalType); + il.Emit(OpCodes.Stelem_Ref); + } + } + + il.Emit(OpCodes.Ret); + FastMethodHandler invoder = (FastMethodHandler)dynamicMethod.CreateDelegate(typeof(FastMethodHandler)); + return invoder; + } + #endregion + + #region Instance Handler + + private static Dictionary mInstanceHandlers = new Dictionary(); + public static ObjectInstanceHandler InstanceHandler(Type type) + { + ObjectInstanceHandler handler; + if (mInstanceHandlers.ContainsKey(type)) + { + handler = mInstanceHandlers[type]; + } + else + { + lock (typeof(ReflectionHandlerFactory)) + { + if (mInstanceHandlers.ContainsKey(type)) + { + handler = mInstanceHandlers[type]; + } + else + { + handler = CreateInstanceHandler(type); + mInstanceHandlers.Add(type, handler); + } + } + } + return handler; + } + private static ObjectInstanceHandler CreateInstanceHandler(Type type) + { + DynamicMethod method = new DynamicMethod(string.Empty, type, null, type.Module); + ILGenerator il = method.GetILGenerator(); + il.DeclareLocal(type, true); + il.Emit(OpCodes.Newobj, type.GetConstructor(new Type[0])); + il.Emit(OpCodes.Stloc_0); + il.Emit(OpCodes.Ldloc_0); + il.Emit(OpCodes.Ret); + ObjectInstanceHandler creater = (ObjectInstanceHandler)method.CreateDelegate(typeof(ObjectInstanceHandler)); + return creater; + + } + #endregion + + + private static void EmitCastToReference(ILGenerator il, System.Type type) + { + if (type.IsValueType) + { + il.Emit(OpCodes.Unbox_Any, type); + } + else + { + il.Emit(OpCodes.Castclass, type); + } + } + private static void EmitBoxIfNeeded(ILGenerator il, System.Type type) + { + if (type.IsValueType) + { + il.Emit(OpCodes.Box, type); + } + } + private static void EmitFastInt(ILGenerator il, int value) + { + switch (value) + { + case -1: + il.Emit(OpCodes.Ldc_I4_M1); + return; + case 0: + il.Emit(OpCodes.Ldc_I4_0); + return; + case 1: + il.Emit(OpCodes.Ldc_I4_1); + return; + case 2: + il.Emit(OpCodes.Ldc_I4_2); + return; + case 3: + il.Emit(OpCodes.Ldc_I4_3); + return; + case 4: + il.Emit(OpCodes.Ldc_I4_4); + return; + case 5: + il.Emit(OpCodes.Ldc_I4_5); + return; + case 6: + il.Emit(OpCodes.Ldc_I4_6); + return; + case 7: + il.Emit(OpCodes.Ldc_I4_7); + return; + case 8: + il.Emit(OpCodes.Ldc_I4_8); + return; + } + + if (value > -129 && value < 128) + { + il.Emit(OpCodes.Ldc_I4_S, (SByte)value); + } + else + { + il.Emit(OpCodes.Ldc_I4, value); + } + } + } +} + diff --git a/Beetle.JT808/Beetle.JT808/Serializes/IBitType.cs b/Beetle.JT808/Beetle.JT808/Serializes/IBitType.cs new file mode 100644 index 0000000..ba53bd0 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/Serializes/IBitType.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Beetle.JT808 +{ + + + + public interface IBitCustomType + { + void Load(object value); + + object Save(); + } +} diff --git a/Beetle.JT808/Beetle.JT808/Serializes/IReadWriteHandler.cs b/Beetle.JT808/Beetle.JT808/Serializes/IReadWriteHandler.cs new file mode 100644 index 0000000..8ab2997 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/Serializes/IReadWriteHandler.cs @@ -0,0 +1,242 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Beetle.JT808 +{ + [AttributeUsage(AttributeTargets.Property)] + public abstract class ReadWriteHandlerAttribute : Attribute + { + public abstract object Read(IProtocolBuffer buffer); + + public abstract void Write(object value, IProtocolBuffer buffer); + } + + [AttributeUsage(AttributeTargets.Property)] + public class ByteHandler : ReadWriteHandlerAttribute + { + + public override object Read(IProtocolBuffer buffer) + { + return buffer.Read(); + } + + public override void Write(object value, IProtocolBuffer buffer) + { + buffer.Write((byte)value); + } + } + + [AttributeUsage(AttributeTargets.Property)] + public class BytesHandler : ReadWriteHandlerAttribute + { + + public BytesHandler(int length) + { + Length = length; + } + public int Length { get; set; } + + public override object Read(IProtocolBuffer buffer) + { + return buffer.Read(Length); + } + + public override void Write(object value, IProtocolBuffer buffer) + { + buffer.Write((byte[])value); + } + } + + [AttributeUsage(AttributeTargets.Property)] + public class UInt16Handler : ReadWriteHandlerAttribute + { + + public override object Read(IProtocolBuffer buffer) + { + return buffer.ReadUInt16(); + } + + public override void Write(object value, IProtocolBuffer buffer) + { + buffer.Write((UInt16)value); + } + } + + [AttributeUsage(AttributeTargets.Property)] + public class UIntHandler : ReadWriteHandlerAttribute + { + + public override object Read(IProtocolBuffer buffer) + { + return buffer.ReadUInt(); + } + + public override void Write(object value, IProtocolBuffer buffer) + { + buffer.Write((uint)value); + } + } + + [AttributeUsage(AttributeTargets.Property)] + public class ASCIIHandler : ReadWriteHandlerAttribute + { + public ASCIIHandler(int length) + { + Length = length; + } + public int Length { get; set; } + + public override object Read(IProtocolBuffer buffer) + { + return buffer.ReadASCII(Length).TrimStart(' '); + } + + public override void Write(object value, IProtocolBuffer buffer) + { + buffer.WriteASCII((string)value, Length); + } + } + + [AttributeUsage(AttributeTargets.Property)] + public class CBDHandler : ReadWriteHandlerAttribute + { + public CBDHandler(int length) + { + Length = length; + } + + public int Length { get; set; } + + public override object Read(IProtocolBuffer buffer) + { + return buffer.ReadBCD(Length); + } + + public override void Write(object value, IProtocolBuffer buffer) + { + buffer.WriteBCD((string)value); + } + } + + [AttributeUsage(AttributeTargets.Property)] + public class GBKHandler : ReadWriteHandlerAttribute + { + public GBKHandler(int length = -1) + { + Length = length; + } + + public int Length { get; set; } + + public override object Read(IProtocolBuffer buffer) + { + return buffer.ReadGBK(Length); + } + + public override void Write(object value, IProtocolBuffer buffer) + { + buffer.WriteGBK((string)value); + } + } + + [AttributeUsage(AttributeTargets.Property)] + public class TimeBCD : ReadWriteHandlerAttribute + { + public override object Read(IProtocolBuffer buffer) + { + string value = buffer.ReadBCD(6); + int year = int.Parse("20" + value.Substring(0, 2)); + int month = int.Parse(value.Substring(2, 2)); + int day = int.Parse(value.Substring(4, 2)); + int hh = int.Parse(value.Substring(6, 2)); + int mm = int.Parse(value.Substring(8, 2)); + int ss = int.Parse(value.Substring(10, 2)); + return new DateTime(year, month, day, hh, mm, ss); + } + + public override void Write(object value, IProtocolBuffer buffer) + { + string time = ((DateTime)value).ToString("yyMMddHHmmss"); + buffer.WriteBCD(time); + } + } + + + [AttributeUsage(AttributeTargets.Property)] + public class ByteBitHandler : ReadWriteHandlerAttribute + { + public ByteBitHandler(Type type) + { + mType = type; + } + private Type mType; + + public override object Read(IProtocolBuffer buffer) + { + byte data = buffer.Read(); + IBitCustomType result = (IBitCustomType)Activator.CreateInstance(mType); + result.Load(data); + return result; + } + + public override void Write(object value, IProtocolBuffer buffer) + { + byte data = (byte)((IBitCustomType)value).Save(); + buffer.Write(data); + } + + } + + [AttributeUsage(AttributeTargets.Property)] + public class UInt16BitHandler : ReadWriteHandlerAttribute + { + public UInt16BitHandler(Type type) + { + mType = type; + } + private Type mType; + + public override object Read(IProtocolBuffer buffer) + { + UInt16 data = buffer.ReadUInt16(); + IBitCustomType result = (IBitCustomType)Activator.CreateInstance(mType); + result.Load(data); + return result; + } + + public override void Write(object value, IProtocolBuffer buffer) + { + UInt16 data = (UInt16)((IBitCustomType)value).Save(); + buffer.Write(data); + } + + } + + [AttributeUsage(AttributeTargets.Property)] + public class UIntBitHandler : ReadWriteHandlerAttribute + { + public UIntBitHandler(Type type) + { + mType = type; + } + private Type mType; + + public override object Read(IProtocolBuffer buffer) + { + uint data = buffer.ReadUInt(); + IBitCustomType result = (IBitCustomType)Activator.CreateInstance(mType); + result.Load(data); + return result; + } + + public override void Write(object value, IProtocolBuffer buffer) + { + uint data = (uint)((IBitCustomType)value).Save(); + buffer.Write(data); + } + + } +} diff --git a/Beetle.JT808/Beetle.JT808/Serializes/MessageTypeAttribute.cs b/Beetle.JT808/Beetle.JT808/Serializes/MessageTypeAttribute.cs new file mode 100644 index 0000000..5ef43f7 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/Serializes/MessageTypeAttribute.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Beetle.JT808 +{ + [AttributeUsage(AttributeTargets.Class)] + public class MessageTypeAttribute : Attribute + { + public MessageTypeAttribute() + { + NoBody = false; + } + + public ushort ID { get; set; } + + public bool NoBody { get; set; } + } +} diff --git a/Beetle.JT808/Beetle.JT808/Serializes/PropertySerializeHandler.cs b/Beetle.JT808/Beetle.JT808/Serializes/PropertySerializeHandler.cs new file mode 100644 index 0000000..974e760 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/Serializes/PropertySerializeHandler.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Beetle.JT808.Serializes +{ + class PropertySerializeHandler + { + public PropertySerializeHandler(System.Reflection.PropertyInfo property, ReadWriteHandlerAttribute readwritehandler) + { + Handler = new PropertyHandler(property); + ReadWriteHandler = readwritehandler; + } + + public PropertyHandler Handler { get; private set; } + + public ReadWriteHandlerAttribute ReadWriteHandler { get; private set; } + + public void Read(object target, IProtocolBuffer buffer) + { + object value = ReadWriteHandler.Read(buffer); + Handler.Set(target, value); + } + + public void Write(object target, IProtocolBuffer buffer) + { + object value = Handler.Get(target); + if (value == null) + throw new ProtocolProcessError(string.Format("{0}.{1} value can't be null!", Handler.Property.DeclaringType, Handler.Property.PropertyType)); + ReadWriteHandler.Write(value, buffer); + } + } +} diff --git a/Beetle.JT808/Beetle.JT808/Serializes/Serializer.cs b/Beetle.JT808/Beetle.JT808/Serializes/Serializer.cs new file mode 100644 index 0000000..3881806 --- /dev/null +++ b/Beetle.JT808/Beetle.JT808/Serializes/Serializer.cs @@ -0,0 +1,141 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Beetle.JT808.Serializes +{ + public class Serializer + { + + public Serializer(Type bodyType, MessageTypeAttribute msgType) + { + mBodyType = bodyType; + MessageType = msgType; + Init(); + } + + private Type mBodyType; + + private List mProperties = new List(); + + private void Init() + { + try + { + + + foreach (System.Reflection.PropertyInfo p in mBodyType.GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public)) + { + ReadWriteHandlerAttribute[] rwha = (ReadWriteHandlerAttribute[])p.GetCustomAttributes(typeof(ReadWriteHandlerAttribute), true); + if (rwha != null && rwha.Length > 0) + { + PropertySerializeHandler handler = new PropertySerializeHandler(p, rwha[0]); + mProperties.Add(handler); + } + } + } + catch (Exception e_) + { + throw new ProtocolProcessError(string.Format("{0} init error {1}", mBodyType.Name, e_.Message), e_); + } + } + + public MessageTypeAttribute MessageType { get; set; } + + public void Deserialize(object obj, IProtocolBuffer buffer) + { + if (obj is IMessageBody) + { + ((IMessageBody)obj).Load(buffer); + } + else + { + foreach (PropertySerializeHandler item in mProperties) + { + item.Read(obj, buffer); + } + } + } + + public void Serialize(object obj, IProtocolBuffer buffer) + { + if (obj is IMessageBody) + { + ((IMessageBody)obj).Save(buffer); + } + else + { + foreach (PropertySerializeHandler item in mProperties) + { + item.Write(obj, buffer); + } + } + } + + public object CreateObject() + { + return Activator.CreateInstance(mBodyType); + } + + } + + public class SerializerFactory + { + + private Dictionary mTypeSerializersMap = new Dictionary(); + + private Dictionary mIDSerializersMap = new Dictionary(); + + private void Register(Type type, MessageTypeAttribute msgType) + { + + Serializer serializer = new Serializer(type, msgType); + mTypeSerializersMap[type] = serializer; + mIDSerializersMap[serializer.MessageType.ID] = serializer; + } + + public Serializer Get(ushort id) + { + Serializer result = null; + mIDSerializersMap.TryGetValue(id, out result); + return result; + } + + public Serializer Get(Type type) + { + Serializer result = null; + mTypeSerializersMap.TryGetValue(type, out result); + return result; + } + + public static void Init() + { + SerializerFactory factory = Defalut; + } + + private static SerializerFactory mDefault = null; + + public static SerializerFactory Defalut + { + get + { + if (mDefault == null) + { + mDefault = new SerializerFactory(); + foreach (Type type in typeof(SerializerFactory).Assembly.GetTypes()) + { + MessageTypeAttribute[] mta = (MessageTypeAttribute[])type.GetCustomAttributes(typeof(MessageTypeAttribute), false); + if (mta != null && mta.Length > 0) + { + mDefault.Register(type, mta[0]); + } + } + } + return mDefault; + } + + } + } +} diff --git a/Beetle.JT808/Beetle.TJ808.BaseServer/App.config b/Beetle.JT808/Beetle.TJ808.BaseServer/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/Beetle.JT808/Beetle.TJ808.BaseServer/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Beetle.JT808/Beetle.TJ808.BaseServer/Beetle.TJ808.BaseServer.csproj b/Beetle.JT808/Beetle.TJ808.BaseServer/Beetle.TJ808.BaseServer.csproj new file mode 100644 index 0000000..4e66309 --- /dev/null +++ b/Beetle.JT808/Beetle.TJ808.BaseServer/Beetle.TJ808.BaseServer.csproj @@ -0,0 +1,67 @@ + + + + + Debug + AnyCPU + {03EB1725-EC1F-4933-B0E9-E7F48A5B414D} + Exe + Properties + Beetle.TJ808.BaseServer + Beetle.TJ808.BaseServer + v4.5 + 512 + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\Lib\Beetle.Express.dll + + + + + + + + + + + + + + + + + + + {ad6a9116-9faf-475d-8451-4316f2df910f} + Beetle.JT808 + + + + + \ No newline at end of file diff --git a/Beetle.JT808/Beetle.TJ808.BaseServer/Program.cs b/Beetle.JT808/Beetle.TJ808.BaseServer/Program.cs new file mode 100644 index 0000000..16676f6 --- /dev/null +++ b/Beetle.JT808/Beetle.TJ808.BaseServer/Program.cs @@ -0,0 +1,91 @@ +using Beetle.JT808; +using Beetle.JT808.Messages; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Beetle.TJ808.BaseServer +{ + class Program : Beetle.Express.IServerHandler + { + private static Beetle.Express.IServer mServer; + + static void Main(string[] args) + { + Beetle.JT808.Serializes.SerializerFactory.Init(); + mServer = Beetle.Express.ServerFactory.CreateTCP(); + mServer.Port = 9091; + mServer.Handler = new Program(); + mServer.Open(false, false, false, 1, 1, "JT808"); + Console.WriteLine("server start!"); + Console.Read(); + } + + public void Connect(Express.IServer server, Express.ChannelConnectEventArgs e) + { + + } + + public void Disposed(Express.IServer server, Express.ChannelEventArgs e) + { + + } + + public void Error(Express.IServer server, Express.ErrorEventArgs e) + { + Console.WriteLine(e.Error.Message); + } + + public void Opened(Express.IServer server) + { + + } + + public void Receive(Express.IServer server, Express.ChannelReceiveEventArgs e) + { + IProtocolBuffer protocolbuffer; + if (e.Channel.Tag == null) + { + protocolbuffer = ProtocolBufferPool.Default.Pop(); + e.Channel.Tag = protocolbuffer; + } + else + { + protocolbuffer = (IProtocolBuffer)e.Channel.Tag; + + } + int offset = 0; int count = e.Data.Count; + while (count > 0) + { + int readcout = protocolbuffer.Import(e.Data.Array, 0, count); + if (readcout > 0) + { + Message message = MessageFactory.MessageFromBuffer(protocolbuffer); + ProtocolBufferPool.Default.Push(protocolbuffer); + protocolbuffer = ProtocolBufferPool.Default.Pop(); + e.Channel.Tag = protocolbuffer; + IProtocolBuffer result = MessageFactory.MessateToBuffer( + message.BussinessNO, message.SIM, (m, b) => + { + b.BussinessNO = message.BussinessNO; + b.ResultID = message.ID; + b.Result = ResultType.Success; + }); + Beetle.Express.Data data = new Express.Data(result.Array, result.Length); + data.Tag = result; + server.Send(data, e.Channel); + offset += readcout; + count -= readcout; + } + } + } + + public void SendCompleted(Express.IServer server, Express.ChannelSendEventArgs e) + { + IProtocolBuffer buffer = (IProtocolBuffer)e.Data.Tag; + ProtocolBufferPool.Default.Push(buffer); + } + } +} diff --git a/Beetle.JT808/Beetle.TJ808.BaseServer/Properties/AssemblyInfo.cs b/Beetle.JT808/Beetle.TJ808.BaseServer/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..9402025 --- /dev/null +++ b/Beetle.JT808/Beetle.TJ808.BaseServer/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的常规信息通过以下 +// 特性集控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Beetle.TJ808.BaseServer")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Beetle.TJ808.BaseServer")] +[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 使此程序集中的类型 +// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型, +// 则将该类型上的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("d70b0006-9a9b-440f-b870-6ba531c2bc2c")] + +// 程序集的版本信息由下面四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Beetle.JT808/ModelingProject1/LayerDiagram1.layerdiagram b/Beetle.JT808/ModelingProject1/LayerDiagram1.layerdiagram new file mode 100644 index 0000000..19a76f1 --- /dev/null +++ b/Beetle.JT808/ModelingProject1/LayerDiagram1.layerdiagram @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Beetle.JT808/ModelingProject1/LayerDiagram1.layerdiagram.layout b/Beetle.JT808/ModelingProject1/LayerDiagram1.layerdiagram.layout new file mode 100644 index 0000000..19a76f1 --- /dev/null +++ b/Beetle.JT808/ModelingProject1/LayerDiagram1.layerdiagram.layout @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Beetle.JT808/ModelingProject1/LayerDiagram1.layerdiagram.suppressions b/Beetle.JT808/ModelingProject1/LayerDiagram1.layerdiagram.suppressions new file mode 100644 index 0000000..19a76f1 --- /dev/null +++ b/Beetle.JT808/ModelingProject1/LayerDiagram1.layerdiagram.suppressions @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Beetle.JT808/ModelingProject1/ModelDefinition/ModelingProject1.uml b/Beetle.JT808/ModelingProject1/ModelDefinition/ModelingProject1.uml new file mode 100644 index 0000000..67d418c --- /dev/null +++ b/Beetle.JT808/ModelingProject1/ModelDefinition/ModelingProject1.uml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + diff --git a/Beetle.JT808/ModelingProject1/ModelingProject1.modelproj b/Beetle.JT808/ModelingProject1/ModelingProject1.modelproj new file mode 100644 index 0000000..6a00299 --- /dev/null +++ b/Beetle.JT808/ModelingProject1/ModelingProject1.modelproj @@ -0,0 +1,43 @@ + + + + + Debug + AnyCPU + 2.0 + {3217fbd5-5679-4dd6-9c43-e1c1735e97df} + 2.0.0.0 + ModelingProject1 + ModelingProject1 + + + bin\Debug\ + + + bin\Release\ + + + 10.0 + $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + + Content + + + + + Content + + + Content + LayerDiagram1.layerdiagram + + + Content + LayerDiagram1.layerdiagram + + + \ No newline at end of file diff --git a/Lib/Beetle.Express.dll b/Lib/Beetle.Express.dll new file mode 100644 index 0000000000000000000000000000000000000000..29ec43e07e3b80e9a3bea59cec0557a9e53c1e5f GIT binary patch literal 54272 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 literal 0 HcmV?d00001