在工作上的需要接触道路运输车辆卫星定位系统相关应用,由于自己对网络服务的编写比较感兴趣,所以利用空闲时间实现了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. nginx配置ssl验证

    在上一篇博客中,我们只是通过nginx搭建了反向代理服务,由于需要在小程序中使用https服务,所以需要申请安全证书. 1.在所购买的域名商那申请免费的ssl证书,我买的是阿里的,所以直接在阿里上申请 ...

  2. 【C语言编程练习】新娘与新郎

    1. 题目要求 新郎A,B,C与新娘 X,Y,Z.有人不知道她们谁和谁结婚了,询问了6位新人中的三位,A说他将和X结婚,X说她的未婚夫是C,C说她会和Z结婚,一听就知道是全是假话,请编程找出谁和谁结婚 ...

  3. 20181115 python-第一章学习小结part2

    Python基本知识 变量,用来存储中间计算结果,在后面可进行调用被使用的东西,叫做变量. 变量的命名规则: 字母,数字,下划线组合 不能用数字开头 常见的关键字不能用啊 常量,不会变的量,称作常量. ...

  4. go 可变参数

    go 在参数列表中使用 ... 表示可变参数,例如: import "fmt" func Minimum(first int, others ...int) int { min : ...

  5. js判断pc还是移动端

    if (!/windows phone|iphone|android/ig.test(window.navigator.userAgent)) { //pc }else{ //h5 }

  6. vue创建状态管理(vuex的store机制)

    1:为什么说要是永远状态管理 在使用 Vue 框架做单页面应用时,我们时常会遇到传值,组件公用状态的问题.(子父间传值文章传送门) ,如果是简单的应用,兄弟组件之间通信还能使用 eventBus 来作 ...

  7. centos7安装可视化界面

    使用VMWare安装好centos7镜像后开始安装centos桌面. 一.输入命令 yum groupinstall "GNOME Desktop" "Graphical ...

  8. 一些 NSArray 的基本操作代码例子

    一些 NSArray 的基本操作代码例子 数组可以说是软件开发人员每天都要面对的基本操作,下面就分享一些 NSArray 的基本操作代码例子供苹果开发初学者参考,每段代码第一行会以注释方式说明该段代码 ...

  9. Android系统架构及内核简介

    (来源于ThinkPHP) Android是Google公司开发的基于Linux平台的开源手机操作系统,它包括操作系统.中间件.用户界面和应用程序,而且不存在任何以往阻碍移 动产业创新的专利权障碍,并 ...

  10. Go语言基础之包

    Go语言基础之包 在工程化的Go语言开发项目中,Go语言的源码复用是建立在包(package)基础之上的.本文介绍了Go语言中如何定义包.如何导出包的内容及如何导入其他包. Go语言的包(packag ...