文档章节

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

泥水佬
 泥水佬
发布于 2017/05/24 11:38
字数 929
阅读 132
收藏 1

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

         

         测试终端情况:

         

 

© 著作权归作者所有

共有 人打赏支持
泥水佬

泥水佬

粉丝 72
博文 87
码字总数 57518
作品 7
广州
架构师
私信 提问
Bouyei.BdProto1.1.x 北斗终端车载定位协议解析

Bouyei.BdProto 是一个道路运输车辆北斗卫星终端设备通信协议解析和打包dll,完成JT/T808-2013协议格式。 支持.net core和.net framework两个框架版本下的发布. 1、修复部分解析问题。 2、优...

bouyeijiang
2018/12/23
0
0
国内商用车联网行业的生存现状

从 09年开始,随着“物联网”概念的盛起,“车联网”名词在2010年10月28日,被百度关键词第一次搜索,企业为自己宣传需要,也纷纷用“车联网”来装 扮自己,我曾经见过做路灯控制的企业说自己...

oschina
2013/08/15
2.9K
8
bouyei/Bouyei.BeidouLSP

北斗车载终端设备通信数据包协议打包和解析库,该库针对(JT/T808协议)进行解析和打包,使用该库需要先了解JT/T808协议和终端设备与服务端平台的通信流程; 大概流程如下: 1、终端通过tcp或u...

bouyei
2018/12/24
0
0
解决1078部标车载视频的一个bug

我们已经有一个C++的程序,但是有bug,需要解决这个bug。程序是从博实结的车载设备(包括符合部标的设备,比如锐明等)接收视频流,然后解析视频流,然后推送到rtmp服务器。推送是用的librt...

tutai
2018/06/12
0
0
出台无人驾驶路测新规开了一个好头

  近日,北京市交通委联合市公安交管局、市经济信息委等部门,制定发布了《加快推进自动驾驶车辆道路测试有关工作的指导意见》和《自动驾驶车辆道路测试管理实施细则》两个指导性文件。(12...

中国机器人
2017/12/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一线互联网技术推荐:Java工程师架构知识系统化汇总,面完45K!

根据高端招聘平台100 offer发布的Java人才盘点报告,在过去的2018年,Java仍然是最流行、招聘供需量最大的技术语言。 在此基础上,互联网行业针对 Java 开发的招聘需求,也是近年技术类岗位供...

java知识分子
12分钟前
0
0
JAVA并发编程JUC基础学习(简介)

之前写过一篇并发编程的简单实例应用,Future快速实现并发编程,可以很快的在自己的项目中应用,但并不系统,之前说过总结一篇(或者一系列)java.util.concurrent 这个并发编程工具类的学习...

小海bug
14分钟前
0
0
matlab-线性代数 齐次方程组 判断是否有无穷多解

  matlab : R2018a 64bit     OS : Windows 10 x64 typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   code clearclc% x1+2*......

志成就
15分钟前
0
0
简单描述PHP发展历程

PHP简介 PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域...

问题终结者
24分钟前
0
0
结构体指针需要初始化

过年过的大脑已经瓦特了。 #include <stdio.h>#define N 10#define MAXSIZE 100typedef struct {int r[MAXSIZE+1];/* 用于存储要排序数组 */ int length;/* 用于记录顺序表的...

niithub
38分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部