道路运输车辆卫星定位系统JT/T808服务实现和压测

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

测试终端情况:

时间: 2024-10-25 12:37:32

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

道路运输车辆卫星定位系统标准符合性检测 ----新规则、新方法

道路运输车辆卫星定位系统标准符合性检测 ----新规则.新方法 全称叫道路运输车辆卫星定位系统标准符合性检测或道路运输车辆卫星定位系统标准符合性审查,口语(或简称)为过检.交通部过检.平台过检.平台测试等等,符合性审查分硬件和平台,硬件就是即是车载终端,平台即运营平台,平台分企业平台.政府平台,企业平台分经营性与非经营性平台,政府平台分市级平台与省级平台.在这里讨论的是平台符合性审查,而非硬件. 此博文只介绍2015年恢复检测之后,采取的新测试规则,新测试方法.关于符合性审查的更详细说明,请参看

道路运输车辆卫星定位系统标准符合性测试 ----操作方法和注意事项

道路运输车辆卫星定位系统标准符合性测试 ----操作方法和注意事项 写在前面的话 全称叫道路运输车辆卫星定位系统标准符合性检測,口语(或简称)为过检.交通部过检.平台过检.平台測试等等,符合性审查分硬件和平台.硬件就是即是车载终端,平台即运营平台.平台分企业平台.政府平台,企业平台分经营性与非经营性平台,政府平台分市级平台与省级平台.在这里讨论的是平台符合性审查,而非硬件. 说起过检,大家铁定都有诉不完的血与泪.太折腾.太纠结.太扯淡了,有木有?当然.做不论什么事都有好的方法与诀窍.假设你充分參

Jmeter压测Thrift服务接口

此文已由作者夏鹏授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Apache Jmeter是基于Java开发的性能测试工具,支持多种协议的测试,包括:Web(HTTP/HTTPS).SOAP.FTP.Database(JDBC).LDAP.Mail(POP3/IMAP).JAVA:还提供了多种性能数据统计报表,使用简单方便简直是性能测试中居家旅行杀人越货之必备:但是~本次性能测试需求是Thrift服务接口,并不在Jmeter支持的协议范围内,继续用钟意的Jmeter完成

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

技术支持QQ:78772895 1.车载终端协议网关采用mina/netty+spring架构,独立于其他应用,主要负责维护接入终端的tcp链接.上行以及下行消息的解码.编码.流量控制,黑白名单等安全控制,网关同时支持交通部JT/T808-2011.JT/T808-2013两个版本全部的808协议,网关应用提供二次开发接口,支持以插件形式协议扩展而不需要改动任何原有代码.接入网关采用json消息通过MQ消息队列与业务平台进行交互,支持ActiveMQ和RabbitMQ,能够无缝接入各种异构系统.

基于SSM框架下的java道路运输证管理系统

最近了解了道路运输证管理系统项目,在这个平台记录一下这个道路运输证管理系统项目,方便以后再次使用或学习的时候能够及时的翻阅.在完成这个项目的时候,考虑了很多框架.最终决定选用SSM(MYECLIPSE),该框架具有极强的移植性,多平台性,便于操作性等优点.此框架能在MYECLIPSE开发工具中完美的编写和运行,道路运输证管理系统为一个 后台项目.这个项目的描述是这样的:运输证管理系统是专门针对于木材运输证管理而开发的一套信息软件.系统主要实现木材运输证(木材运输证录入.木材运输证(省内).木材运

后端服务性能压测实践

转自:https://mp.weixin.qq.com/s/XW9geHZ9odHdI7srDiKBIg 目录 背景 环境检测 压力机及压力工具检测 Linux openfiles limit 设置 排查周边依赖 空接口压测检测 聚合报告中 throughput 计算 压测及性能排查方法 关注各纬度 log Linux 常规命令 性能排查两种方式(从上往下.从下往上) 总结 背景 最近大半年内有过两次负责性能压测的一些工作.一件事情做了一次可能还无法总结出一些东西,两次过后还是能发现一些共性问题

(转)后端服务性能压测实践

作者:王清培(Plen wang) 传送门:https://www.cnblogs.com/wangiqngpei557/p/7953453.html ---------------------------------------------------------------------分割线------------------------------------------------------ 入职新公司,没人理我,负责的需求开发一直很忙,要么环境有问题,要么Bug卡住我找开发,回了一句

如何在OsgEarth中加载谷歌卫星地图的ArcGISServer服务教程

说明: 本实例演示如何在arcgis中发布下载好的影像瓦片数据,在osgearth中加载发布好的瓦片服务. 本实例使用软件版本:ArcGIS10.2,osg3.3.1和osgEarth2.5 VC10编译环境(参考osgearth加载谷歌卫星地图的源码案例),水经注万能地图下载器. 影像瓦片来源"水经注万能地图下载器".如果没有安装本软件,可以百度"水经注软件"到官方网站下载. 一.下载瓦片数据 启动水经注万能地图下载器,点击"框选下载区域",双

windows 安装MySQL服务 zip解压程序

1:配置 my.ini 文件 如下: [mysql] default-character-set=utf8[mysqld] port=3306basedir=D:\\Program Files\\databases\\mysql-5.7.24datadir=D:\\Program Files\\databases\\mysql-5.7.24\\datamax_connections=200max_connections=200character-set-server=utf8default-st