using NewLife;
using NewLife.Data;
using NewLife.Log;
using NewLife.JT808.Protocols;
using NewLife.JT808.Models;
using NewLife.JT808.Protocols;
namespace Client;
/// <summary>JT808测试客户端 — 主窗体</summary>
public partial class FrmMain : Form
{
private readonly TextBox _txtHex;
private readonly Button _btnDecode;
private readonly PropertyGrid _gridResult;
private readonly Button _btnClear;
public FrmMain()
{
Text = "JT808报文解æžå·¥å…·";
Size = new Size(900, 700);
StartPosition = FormStartPosition.CenterScreen;
// åˆå§‹åŒ–消æ¯å·¥åŽ‚
MessageFactory.Instance.Init();
// 布局
var split = new SplitContainer { Dock = DockStyle.Fill, Orientation = Orientation.Horizontal };
Controls.Add(split);
// ä¸Šæ–¹é¢æ¿ï¼ˆè¾“入)
var topPanel = new Panel { Dock = DockStyle.Fill, Padding = new Padding(10) };
split.Panel1.Controls.Add(topPanel);
var lbl = new Label { Text = "粘贴åå…进制报文(支æŒå¸¦ç©ºæ ¼å’Œ0xå‰ç¼€ï¼‰ï¼š", Dock = DockStyle.Top, Height = 25 };
topPanel.Controls.Add(lbl);
_txtHex = new TextBox { Dock = DockStyle.Fill, Multiline = true, Font = new Font("Consolas", 10) };
topPanel.Controls.Add(_txtHex);
var btnPanel = new FlowLayoutPanel { Dock = DockStyle.Bottom, Height = 40, FlowDirection = FlowDirection.RightToLeft };
_btnClear = new Button { Text = "清空", Width = 80 };
_btnClear.Click += (s, e) => { _txtHex.Clear(); _gridResult.SelectedObject = null; };
btnPanel.Controls.Add(_btnClear);
_btnDecode = new Button { Text = "è§£ç ", Width = 80 };
_btnDecode.Click += BtnDecode_Click;
btnPanel.Controls.Add(_btnDecode);
topPanel.Controls.Add(btnPanel);
// ä¸‹æ–¹é¢æ¿ï¼ˆç»“果)
_gridResult = new PropertyGrid { Dock = DockStyle.Fill, PropertySort = PropertySort.Categorized };
split.Panel2.Controls.Add(_gridResult);
}
private void BtnDecode_Click(Object sender, EventArgs e)
{
try
{
var hex = _txtHex.Text.Trim();
if (String.IsNullOrEmpty(hex))
{
MessageBox.Show("请输入åå…进制报文", "æç¤º", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
// æ¸…ç†æ ¼å¼ï¼šåŽ»é™¤ç©ºæ ¼ã€0xå‰ç¼€ã€æ¢è¡Œ
hex = hex.Replace(" ", "")
.Replace("0x", "")
.Replace("0X", "")
.Replace("\r", "")
.Replace("\n", "")
.Replace("-", "");
if (hex.Length % 2 != 0)
{
MessageBox.Show("åå…进制å—ç¬¦ä¸²é•¿åº¦å¿…é¡»ä¸ºå¶æ•°", "æ ¼å¼é”™è¯¯", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
var data = hex.ToHex();
var msg = new JTMessage();
if (!msg.Read(new MemoryStream(data), null))
{
MessageBox.Show("è§£ç å¤±è´¥ï¼Œè¯·æ£€æŸ¥æŠ¥æ–‡æ ¼å¼", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
// è§£æžæ¶ˆæ¯ä½“
var body = MessageFactory.Instance.Parse(msg);
var result = new DecodeResult
{
Kind = msg.Kind,
KindName = msg.Kind.ToString(),
Mobile = msg.Mobile,
Sequence = msg.Sequence,
Version = msg.Version,
Hex = msg.Payload?.ToHex(512) ?? "",
Body = body?.ToJsonJT808() ?? "",
RawMessage = msg.ToJsonJT808()
};
_gridResult.SelectedObject = result;
}
catch (Exception ex)
{
MessageBox.Show($"è§£ç 出错:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
/// <summary>è§£ç 结果展示类</summary>
public class DecodeResult
{
[System.ComponentModel.Category("基本信æ¯")]
[System.ComponentModel.DisplayName("消æ¯ID")]
public MessageKinds Kind { get; set; }
[System.ComponentModel.Category("基本信æ¯")]
[System.ComponentModel.DisplayName("消æ¯åç§°")]
public String KindName { get; set; }
[System.ComponentModel.Category("基本信æ¯")]
[System.ComponentModel.DisplayName("终端手机å·")]
public String Mobile { get; set; }
[System.ComponentModel.Category("基本信æ¯")]
[System.ComponentModel.DisplayName("æµæ°´å·")]
public UInt16 Sequence { get; set; }
[System.ComponentModel.Category("基本信æ¯")]
[System.ComponentModel.DisplayName("å议版本")]
public Byte Version { get; set; }
[System.ComponentModel.Category("消æ¯ä½“")]
[System.ComponentModel.DisplayName("åå…进制负载")]
public String Hex { get; set; }
[System.ComponentModel.Category("消æ¯ä½“")]
[System.ComponentModel.DisplayName("JSON消æ¯ä½“")]
public String Body { get; set; }
[System.ComponentModel.Category("原始报文")]
[System.ComponentModel.DisplayName("JSON原始")]
public String RawMessage { get; set; }
}
|