在工作上的需要接触道路运输车辆卫星定位系统相关应用,由于自己对网络服务的编写比较感兴趣,所以利用空闲时间实现了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. APP产品设计及运营时常见的问题

    目录 一.APP设计之初必须预埋的功能 二.H5活动页入口设计 三.全套icon /menu icon / logo图,统一后台设置便于活动推广 四.webview与原生页面的路由应统一改善用户体验 ...

  2. BZOJ5465 : [APIO 2018] 选圆圈

    假设最大的圆半径为$R$,以$2R$为大小将地图划分为一个个格子,那么每个圆只需要检查圆心在附近$9$个格子内部的所有圆. 在当前圆的半径不足$\frac{R}{2}$时重构网格,那么最多重构$O(\ ...

  3. Tesseract-ocr 工具使用记录

    1.很多地方可以下载Tesseract-ocr工具,同时下载jTessBoxEditor方便之后的训练使用 2.下载Tesseract-ocr后可以放在任何地方,但是需要设置环境变量,或者在CMD当中 ...

  4. cookie设置域名问题,cookie跨域

    今天研究一天发现cookie无法设置除当前域名或者其父域名之外的其他domain. 这个是浏览器出于对cookie的保护造成的,也就是cookie无法跨域设置. 对于子域名也有如下规则,当前域名只能设 ...

  5. 13-事务&数据库连接池&DBUtiles

    事务&数据库连接池&DBUtils 事务 Transaction  其实指的一组操作,里面包含许多个单一的逻辑.只要有一个逻辑没有执行成功,那么都算失败. 所有的数据都回归到最初的状态 ...

  6. 如何解决PeopleSoft Process Scheduler发布问题

    常见PeopleSoft进程调度程序发布问题 此发布问题中遇到的一些常见错误是: 将HTTP响应转换为UCS2时出错 XML文档对象创建失败. 无法处理来自Report Repository的HTTP ...

  7. 锐捷交换机配置DHCP SERVER给固定的MAC地址分配静态IP

    今天突发奇想,想给自己的手机分配固定地址,使得接入公司无线网络时每次都取到同一ip地址,这样可以排除认证登录问题. 上网溜达一下,记录下锐捷官方的[常见问题]如下,经验证可行. 需求: 给MAC地址为 ...

  8. python多线程和多进程使用

    # 多线程 from concurrent.futures import ThreadPoolExecutor # 多进程 from concurrent.futures import Process ...

  9. vue的父子组建之间的通信(-),基于props和$emit之间的传递

    对于vue而言,以为其核心思想为前端组建化.所以组建之间的通信必不可少. 相信接触过Angularjs的童鞋都知道angularjs的控制器之间的通信机制. 1:父传子:官方的$broadcast() ...

  10. /usr/lib/python2.7/site-packages/requests/__init__.py:80: RequestsDependencyWarning: urllib3 (1.22) or chardet (2.2.1) doesn't match a supported version! RequestsDependencyWarning)

    [root@iZwz9bhan5nqzh979qokrkZ ~]# ansible all -m ping /usr/lib/python2.7/site-packages/requests/__in ...