在工作上的需要接触道路运输车辆卫星定位系统相关应用,由于自己对网络服务的编写比较感兴趣,所以利用空闲时间实现了JT/T808的一些协议和相关服务(不得不说这种协议的设计在解释的确导致性能上的损耗,特别针地托管语言的C#来说就更加容易导致性能问题,不过对于现有硬件资源来说一台简配的PC支撑上几万个终端那还是没什么压力的).主要基于兴趣来写所以JT/T808只实现了几个常用的协议:0x0002,0x0200,0x0100等.

为了更好地进行模拟测试还实现了一个简单的JT/T808模拟器方便进行一些简单的测试

消息封装

一个好的消息封装会给消息扩展带来极大的方便和效率(不过不得不面对资源损耗的加大).Beetle.JT808采用对象结合特性的方式来描述一个JT808消息,特别对于一个多位组合的属性也通过对象化来表现,这样可以上使用者使用起来更方便和简单.

    /// <summary>
/// 终端注册
/// </summary>
[MessageType(ID = 0x0100)]
public class Register
{
/// <summary>
/// 标示终端安装车辆所在的省域,0保留,由平台取默认值。省域ID采用GB/T 2260中规定的行政区划代码六位中前两位
/// </summary>
[UInt16Handler]
public ushort Province { get; set; }
/// <summary>
/// 标示终端安装车辆所在的市域和县域,0保留, 由平台取默认值。市县域ID采用GB/T 2260中规定的行政区划代码六位后四位
/// </summary>
[UInt16Handler]
public ushort City { get; set; }
/// <summary>
/// 五个字节,终端制造商编码。
/// </summary>
[ASCIIHandler(5)]
public string Provider { get; set; }
/// <summary>
/// 八个字节,此终端型号由制造商自行定义,位数不是八位的,补空格。
/// </summary>
[ASCIIHandler(8)]
public string DeviceNumber { get; set; }
/// <summary>
/// 七个字节,由大写字母和数字组成,此终端ID由制造商自行定义
/// </summary>
[ASCIIHandler(7)]
public string DeviceID { get; set; }
/// <summary>
/// 车牌颜色,按照JT/T 415-2006的5.4.12
/// </summary>
[ByteHandler]
public byte Color { get; set; }
/// <summary>
/// 公安交通管理部门颁发的机动车号牌
/// </summary>
[GBKHandler]
public string PlateNumber { get; set; }
}
}

服务器封装

有服务端封装上也是采购消息事件来驱动消息逻辑的处理,这样在扩展消息处理上也非常方便

        protected virtual void OnPostion(Message msg, Messages.Postion e, Beetle.Express.IChannel channel)
{
channel.Name = msg.SIM;
channel["GPS_INFO"] = e;
if (Loger.Enabled(LogType.DEBUG))
Loger.Process(LogType.DEBUG, "{0} postion lng:{1}/lat:{2} time:{3}", msg.SIM, e.Longitude, e.Latitude, e.Time);
ReturnCenterResponse(msg, channel);
} protected virtual void OnRegister(Message msg, Messages.Register e, Beetle.Express.IChannel channel)
{
if (Loger.Enabled(LogType.DEBUG))
Loger.Process(LogType.DEBUG, "{0} registed platenumber:{1}", msg.SIM, e.PlateNumber);
Message result = MessageFactory.CreateMessage<RegisterResponse>(msg.SIM);
RegisterResponse response = result.GetBody<RegisterResponse>();
response.BusinessNO = msg.BussinessNO;
response.Result = RegisterStatus.Success;
response.Signature = Guid.NewGuid().ToString("N");
result.Send(channel);
} protected virtual void OnSignature(Message msg, Messages.ClientSignature e, Beetle.Express.IChannel channel)
{
if (Loger.Enabled(LogType.DEBUG))
Loger.Process(LogType.DEBUG, "{0} signature {1}", msg.SIM, e.Signature);
ReturnCenterResponse(msg, channel);
} protected virtual void OnNotImplement(Message msg, Messages.MessageNotImplement e, Beetle.Express.IChannel channel)
{
if (Loger.Enabled(LogType.DEBUG))
Loger.Process(LogType.DEBUG, "{0} message:{1} not implement!", msg.SIM, e.MessageID);
ReturnCenterResponse(msg, channel);
}

压测结果

虽然对服务功能进行了大量的抽象封装,在效率上会有很大的开销损耗.但在现有的硬件资源下并不会存在多大问题.以下是模拟10000个终端设备每5秒提交一条车辆行驶信息的测试情况:

服务端是一台虚拟化的4核,16G内存的电脑.

行车信息:

                Messages.Postion postion = new Messages.Postion();
postion.Direction = (ushort)ran.Next(ushort.MinValue, ushort.MaxValue);
postion.Height = (ushort)ran.Next(ushort.MinValue, ushort.MaxValue);
postion.Latitude = (uint)ran.Next(0, 2000000);
postion.Longitude = (uint)ran.Next(0, 2000000);
postion.Speed = (ushort)ran.Next(ushort.MinValue, ushort.MaxValue);
postion.Time = DateTime.Now;
postion.FuelGauge.Value = (ushort)ran.Next(ushort.MinValue, ushort.MaxValue);
postion.Milometer.Value = (uint)ran.Next(0, 2000000);
postion.Speedometer.Value = (ushort)ran.Next(10, 200);
Client.Postion(postion);

服务器压力17小时后的结果:

测试终端情况:

道路运输车辆卫星定位系统JT/T808服务实现和压测的更多相关文章

  1. JT/T 1077-2016《道路运输车辆卫星定位系统车载视频平台技术要求》平台标准符合性检测合同

    合同编号: 道路运输车辆卫星定位系统 平台标准符合性检测合同 委托方(甲方): 受托方(乙方): 交通运输通信信息工程质量检测中心 签订时间: 签订地点: 北京市 委托方(甲方): 委托方(甲方): ...

  2. JT/T 808-2013 道路运输车辆卫星定位系统北斗兼容车载终端通讯协议技术规范

    文档下载地址:JT/T 808-2013 道路运输车辆卫星定位系统北斗兼容车载终端通讯协议技术规范

  3. JTT808、JTT809、JTT796、JTT794、JTT1077、JTT1078区别与交通部道路运输车辆卫星定位系统部标标准大全下载地址

    部标JT/T808协议.JT/T809协议.JT/T796标准.JT/T794标准的区别,他们是基于不同的通信场景,不同的通信对象,不同的设计目的和目标而制定出来的.首先要知道这些标准的全称是什么意思 ...

  4. 交通部道路运输车辆卫星定位系统部标JTT808、809、796标准大全

    无论是开发GPS设备硬件还是开发应用软件,都要面临一个标准,这个标准就是国家交通部发布的道路运输车辆卫星定位系统部标认证标准,它涵盖了GPS硬件设备参数.功能标准,也包括了设备上传到应用平台的协议标准 ...

  5. JT796、JT808、JT809、JT1076、JT1077、JT1078部标平台过检道路运输车辆卫星定位系统企业视频监控平台检测登记表

    道路运输车辆卫星定位系统企业视频监控平台检测登记表的具体格式如下: 报名检测需要以下材料: 0检测报名须知.doc   点击下载 1检测意向单.doc   点击下载 2-1道路运输车辆卫星定位系统企业 ...

  6. 软件性能测试分析与调优实践之路-JMeter对RPC服务的性能压测分析与调优-手稿节选

    一.JMeter 如何通过自定义Sample来压测RPC服务 RPC(Remote Procedure Call)俗称远程过程调用,是常用的一种高效的服务调用方式,也是性能压测时经常遇到的一种服务调用 ...

  7. python服务端多进程压测工具

    本文描述一个python实现的多进程压测工具,这个压测工具的特点如下: 多进程 在大多数情况下,压测一般适用于IO密集型场景(如访问接口并等待返回),在这种场景下多线程多进程的区分并不明显(详情请参见 ...

  8. Jmeter压测Thrift服务接口

    此文已由作者夏鹏授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Apache Jmeter是基于Java开发的性能测试工具,支持多种协议的测试,包括:Web(HTTP/HTT ...

  9. 基于JT/T808协议的车辆监控平台架构方案

    技术支持QQ:78772895 1.接入网关应用采用mina/netty+spring架构,独立于其他应用,主要负责维护接入终端的tcp链接.上行以及下行消息的解码.编码.流量控制,黑白名单等安全控制 ...

随机推荐

  1. HBASE强制删除表

    1,先把hdfs的对应表的数据删除 hadoop fs -mv /hbase/<table_name> /tmp 2,修复meta信息 hbase hbck -fixMeta -fixAs ...

  2. BZOJ.4137.[FJOI2015]火星商店问题(线段树分治 可持久化Trie)

    BZOJ 洛谷 一直觉得自己非常zz呢.现在看来是真的=-= 注意题意描述有点问题,可以看BZOJ/洛谷讨论. 每个询问有两个限制区间,一是时间限制\([t-d+1,t]\),二是物品限制\([L,R ...

  3. 图解CSS3核心技术与案例实战(1)

    前言: 我买了一本<图解CSS3核心技术与案例实战>大漠写的,为了提高自己的自觉性呢,抓紧看书,把读书笔记放在这上面,跟大家一起分享,也为督促自己完成读书计划. 文末有微信公众号,感谢你的 ...

  4. DWM1000 帧过滤代码实现

    帧过滤功能可以在同一个环境内组建多个网络而不干扰(非频段不同),可以通过PANID(网络ID)区分不同网络,不同网络中的模块无法直接通信, 再之,利用短地址,网络中可以同时有多个模块发送信息,而接收端 ...

  5. Python使用ProtoBuffer

    Python使用ProtoBuffer Protocol Buffers,是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储.通信协议等方面. 就可读性而言感 ...

  6. 用java从0生成一个简单的excel

    用java从0生成一个简单的excel 目标 用代码实现对一个excel的基础操作,包括创建,插入文字,(好像就这些了),生成的excel可以用wps打开,如果直接用c++的文件流会生成假的xls表格 ...

  7. ProgressBar三种style

    一.普通的ProgressBar显示如图 <ProgressBar        android:id="@+id/pbNormal"        android:layo ...

  8. 《SpringMVC从入门到放肆》十二、SpringMVC自定义类型转换器

    之前的教程,我们都已经学会了如何使用Spring MVC来进行开发,掌握了基本的开发方法,返回不同类型的结果也有了一定的了解,包括返回ModelAndView.返回List.Map等等,这里就包含了传 ...

  9. 如何设置body高度为浏览器高度

    html{height:100%} body{min-height:100%} 有时我们的页面上内容不多,但设计师要求背景色必须铺满全屏,这时候只需在样式表中加上这行,body就以浏览器的高度显示,超 ...

  10. ES6的Module 的用法

    在vue-cli中遇到的模糊参考 https://www.cnblogs.com/ppJuan/p/7151000.html 解决问题: 在 ES6 之前,社区制定了一些模块加载方案,最主要的有 Co ...