From 69ce328cda043467cefd02ab2c7237c54adaf653 Mon Sep 17 00:00:00 2001 From: "SmallChi(Koike)" <564952747@qq.com> Date: Wed, 27 Nov 2019 14:28:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A02019=E6=96=B0=E7=89=88808?= =?UTF-8?q?=E5=8D=8F=E8=AE=AE=E7=9A=84=E5=85=BC=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 31 ++--- doc/JTT.808-2019.PDF | Bin 3227587 -> 3098838 bytes .../JT808.Protocol.Test.csproj | 6 + .../JT808HeaderMessageBodyPropertyTest.cs | 44 +++++++ src/JT808.Protocol.Test/JT808HeaderTest.cs | 37 +++++- .../MessageBody/JT808_0x0005Test.cs | 33 ++++++ .../MessageBody/JT808_0x0100Test.cs | 52 ++++++++ .../MessageBody/JT808_0x0102Test.cs | 25 ++++ .../MessageBody/JT808_0x8004Test.cs | 31 +++++ .../MessagePack/JT808MessagePackReaderTest.cs | 11 ++ .../MessagePack/JT808MessagePackWriterTest.cs | 11 ++ .../Attributes/JT808FormatterAttribute.cs | 17 --- src/JT808.Protocol/Enums/JT808ErrorCode.cs | 5 - src/JT808.Protocol/Interfaces/IJT808Config.cs | 1 + src/JT808.Protocol/JT808.Protocol.csproj | 6 +- src/JT808.Protocol/JT808.Protocol.xml | 112 +++++++++++++++--- src/JT808.Protocol/JT808Header.cs | 40 ++++++- .../JT808HeaderMessageBodyProperty.cs | 77 +++++++++++- src/JT808.Protocol/JT808HeaderPackage.cs | 45 ++++++- src/JT808.Protocol/JT808Package.cs | 91 ++++++++++---- src/JT808.Protocol/JT808Serializer.cs | 39 +++--- .../MessageBody/JT808_0x0004.cs | 16 +++ .../MessageBody/JT808_0x0005.cs | 44 +++++++ .../MessageBody/JT808_0x0100.cs | 44 +++++-- .../MessageBody/JT808_0x0102.cs | 42 ++++++- .../MessageBody/JT808_0x8004.cs | 29 +++++ .../MessagePack/JT808MessagePackReader.cs | 6 +- .../MessagePack/JT808MessagePackWriter.cs | 5 +- 28 files changed, 776 insertions(+), 124 deletions(-) create mode 100644 src/JT808.Protocol.Test/MessageBody/JT808_0x0005Test.cs create mode 100644 src/JT808.Protocol.Test/MessageBody/JT808_0x8004Test.cs delete mode 100644 src/JT808.Protocol/Attributes/JT808FormatterAttribute.cs create mode 100644 src/JT808.Protocol/MessageBody/JT808_0x0004.cs create mode 100644 src/JT808.Protocol/MessageBody/JT808_0x0005.cs create mode 100644 src/JT808.Protocol/MessageBody/JT808_0x8004.cs diff --git a/README.md b/README.md index 05bb4f0..b561727 100644 --- a/README.md +++ b/README.md @@ -23,15 +23,15 @@ ### 数据头[JT808Header] -| 消息ID | 消息体属性 | 终端手机号 | 消息流水号 | 消息总包数(依赖是否分包) | 包序号(依赖是否分包) | -| :----: | :----------------------------: | :-------------: | :--------: |:---------: | :-------:| -| MsgId | JT808HeaderMessageBodyProperty | TerminalPhoneNo | MsgNum |PackgeCount | PackageIndex | +| 消息ID | 消息体属性 | 协议版本号(2019版本)|终端手机号 | 消息流水号 | 消息总包数(依赖是否分包) | 包序号(依赖是否分包) | +| :----: | :----------------------------: | :-------------: |:-------------: | :--------: |:---------: | :-------:| +| MsgId | JT808HeaderMessageBodyProperty | ProtocolVersion|TerminalPhoneNo | MsgNum |PackgeCount | PackageIndex | #### 数据头-消息体属性[JT808HeaderMessageBodyProperty] -| 是否分包 | 加密标识 | 消息体长度 | -| :------: | :------: | :--------: | -| IsPackge | Encrypt | DataLength | +|版本标识(2019版本)| 是否分包 | 加密标识 | 消息体长度 | +|:------:| :------: | :------: | :--------: | +|VersionFlag| IsPackge | Encrypt | DataLength | #### 消息体属性[JT808Bodies] @@ -306,17 +306,17 @@ Platform=AnyCpu Server=False Toolchain=.NET Core 3.0 ## JT808终端通讯协议消息对照表 -| 序号 | 消息ID | 完成情况 | 测试情况 | 消息体名称 | -| :---: | :-----------: | :------: | :------: | :----------------------------: | +| 序号 | 消息ID | 完成情况 | 测试情况 | 消息体名称 |2019版本| +| :---: | :-----------: | :------: | :------: | :----------------------------: |:----------------------------:| | 1 | 0x0001 | √ | √ | 终端通用应答 | | 2 | 0x8001 | √ | √ | 平台通用应答 | | 3 | 0x0002 | √ | √ | 终端心跳 | | 4 | 0x8003 | √ | √ | 补传分包请求 | -| 5 | 0x0100 | √ | √ | 终端注册 | +| 5 | 0x0100 | √ | √ | 终端注册 |修改| | 6 | 0x8100 | √ | √ | 终端注册应答 | | 7 | 0x0003 | √ | √ | 终端注销 | -| 8 | 0x0102 | √ | √ | 终端鉴权 | -| 9 | 0x8103 | √ | √ | 设置终端参数 | +| 8 | 0x0102 | √ | √ | 终端鉴权 |修改| +| 9 | 0x8103 | √ | x | 设置终端参数 |修改且增加| | 10 | 0x8104 | √ | √ | 查询终端参数 | | 11 | 0x0104 | √ | √ | 查询终端参数应答 | | 12 | 0x8105 | √ | √ | 终端控制 | @@ -350,9 +350,9 @@ Platform=AnyCpu Server=False Toolchain=.NET Core 3.0 | 40 | 0x8605 | √ | √ | 删除多边形区域 | | 41 | 0x8606 | √ | √ | 设置路线 | | 42 | 0x8607 | √ | √ | 删除路线 | -| 43 | 0x8700 | x | 下个版本 | 行驶记录仪数据采集命令 | -| 44 | 0x0700 | x | 下个版本 | 行驶记录仪数据上传 | -| 45 | 0x8701 | x | 下个版本 | 行驶记录仪参数下传命令 | +| 43 | 0x8700 | x | 不开发 | 行驶记录仪数据采集命令 | +| 44 | 0x0700 | x | 不开发 | 行驶记录仪数据上传 | +| 45 | 0x8701 | x | 不开发 | 行驶记录仪参数下传命令 | | 46 | 0x0701 | √ | √ | 电子运单上报 | | 47 | 0x0702 | √ | √ | 驾驶员身份信息采集上报 | | 48 | 0x8702 | √ | 消息体为空| 上报驾驶员身份信息请求 | @@ -375,3 +375,6 @@ Platform=AnyCpu Server=False Toolchain=.NET Core 3.0 | 65 | 0x0A00 | √ | √ | 终端 RSA 公钥 | | 66 | 0x8F00~0x8FFF | 保留 | 保留 | 平台下行消息保留 | | 67 | 0x0F00~0x0FFF | 保留 | 保留 | 终端上行消息保留 | +| 68 | 0x0004 | √ | √ | 查询服务器时间请求 |新增| +| 69 | 0x8004 | √ | √ | 查询服务器时间应答 |新增| +| 70 | 0x0005 | √ | √ | 终端补传分包请求 |新增| diff --git a/doc/JTT.808-2019.PDF b/doc/JTT.808-2019.PDF index dd195e2095af9ee22895475363fcabcf75e264e0..7ea6824437893f6dc77363406f9af5d89aa4f8f9 100644 GIT binary patch delta 69540 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 z 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®$dnM_bAyL}TUg>T4i|r^YWZ5(gINz~NCd1ebZ7 z=RF!yuxHbwp^pqOiE69~G7`NSfwE2lHc#zsvFELf%9>DnXhL1xKkS`QnI-w)78hHp zBMwSOTvTHr<9usFK!|a=taY#Qj{zYNQRK&~0L7h@xrwFblndi6<0-mMp?~m4;#NBk}HS79_-HqE=hTOue1z+@nzjf+4t z3dw@5RO|}6Qe+l)N_&N*hZ95^(~iO{-xrU_Xb2z7z_v9>S7y#t07)2P!H(m8b{GKX z1!3({=@-(g3SY5Hh@bfNoUMY10N2|B_XUoe!|(l-{|>vN&5oG7txARv!0M5@Y%+c6 z((^FJ)EVdAO$aA?r$1UaxDh{~7SY7gfzU1e-Ng|+tOgt|-Hr%2aYqyB2w**pqqxl5 z@yv#11-)-+Xg)z|VCna2W3FD=Oj_WGmCZvO5`tiuJ=@?&g`=06l0e&Pig*(75_zDj4X;68Ru6^MFBD)bycKaWs7&slX+5)Dg7#u zUtQk+T7UD6mV^_vXc-#c74~7&8L~Vr#a3+tl_|8K)|=KEhFBuDE+HsFC3g7BR}BUM zm4kL~qxZAjfSXyy<8Mv?!3}8hmnsXR>p)o3WqpRI2i4iGz@P(21YXY;Bds`j zHOdivjukKff7w`uF0kdsK>W+B`Ky_UBeeWvt!Fhwa2?+xeQbq0Mczpz`U36vEzw{g z%vhj#NGS{`+o4#bA1LpDX4;$dK58gxEkfXq?$)Ew!HZh{5JljQqamV^P<3WJr7@U? ze`QSh&aawBIT@ybyE%sEW3F^M0%%RyRiIdADqvPUg+-xe<(RpsD?Z_`tkT#Dzai%r zLzkZAS-UboIQuLLVnKI8MlhEPt)0MY6otWa8UDh}fmA|V51hmRN|J}1mJ2&wBjjKv z{D7GYGv<_fj5H7r#`ghG6cZ)*OEjOi<)ek8dJQ0@e8^5ZR0%K5YWHHE{x0c3tw-si z^*tabg7C&-DL)azJxB?=Ru5!5oB#>~QoayiAkhiW=PuA`+!ChaP5vis zp|f{|1}2LcavdHf@?$4=%p;lKgTB-jBe0As%e^D@)dLCYz+F7hpNi*j56rkXW?sIF zrAHAo=TMFcLuZ~_Fnw&Fad%JOs15UsyCs+|p`2|%G_uiE1kztPp#c-jg#R%J*O$gG z0x6>%Nr6EuH~;`rDnN}lANc^}acyQ65{BZdD{zMg;$@p962TPyR6d#@B%ar}uB6s$ zfbC3;>I0$S+Y1z6B2o6p4 zY)M51DCY5_{o6=b`cB0WR}N?xIP$3({ZB!8Fx}Pqi7+4#j2x zVCyFJwM52j?U*Ivl#8>{92wQ#ynJt2x4iz}?>+iSYuX$29WGc@fkC8uF8o>|FjcwI zTeF9s4rnbwy$gDo(BiRm@o90Z_vjg;HDlr3Ge)0pG2R%m5-9MrJ!s_%?_#G6a1NLO zGufp*qzVBuco>Wfq+m;=-#hP-!fL`jC_e!TA(c4vBjVo|_O(PtOG?FCd_Bq1L_QWM zfZWp8a8#T%47!pB<`5o?hr1bJ%zmVYv@4(cLrgLl$uXh}ykc}>Xv8%Z3ixg289?5V zGm*GW1%ll57-EKc=MCs*V?2Re8@xB0Mj&yOwVwy(>pP3qtl~aPIdE<29Xx~=reGmx z3_O^^DilCtyC+>UfH15P$m~Gt3Jb5Kn|82%F9!`b`NW$*D@f!GmPxi!s0^UCH6nXg|9Xi81ASXhJv7CbpCdul~52FBV310aksof*A3j}{hHJC?++Q&0~z;;#3;zpiBL zo|_qXfO&!^Y<}Pg_hX!T{?SybDH^!J2Ml`RPn_H5413TZW$~za8$%wF@maRu{~V38 zBEyFGjL#+K(#wm#H8%V8x1;~Dr(-h~)GejS_KuVa{b2Vo`&teFf+ms!5X+isGn;b& zav)qKc!9fwtFej55+!96U}&0AaC9F z0jQG|qrmfjBt0jEg@FXw018c4pPx$K!2>yxjUNPzZVW6SYB4Y_FTm&6265K;^_6T!mFS(2IrC7z&I7-q_y9`HR&P%H_@#xQe|r0JnAwl;a~@gVMP zfB`W^g$MqRBq&CmvezL=@%(8J>1hRa-sDFMYsWf)O5ztbhs&om#-bnh@JR<#|4(~g z9uIXF{jVsDC4~qf8T)Q#(4rD$N%m5*FQr5wPbDVOLVICKrIbWTif9!{8&N4*NTo&V z(@Le~ckcbnXUs75R8P z2EXObkwCi_D+^NXfp3Z&bN=ykFMBa4YeyV_AOxN~b~xSiJTc^bO5M(@>ypKtXy9!J zodIQefC$${i_jMAh#d0ZK){^L3_=42bCTm1LIVmmH<=O2L0h5$20A2?qGSbms3iKMSU4CdZ0iGpKsd4DxF{9t zRH4!vqST{gg%}zHsIZ5vR-1}Ed^feJAtbbc#zsv6lK~C|@oND41K-K#vZor){>hMa zZWxuwBlPF*#iH z)rbF{5qzQWDs_;B3~2;UGYLpiN*Tn7oluatNTKT_Flk=SX9N;3B^fkGdyK1eip4mj=JXrU6{< zI=>FQ)$lv4tyf}DV4*qX5oj}O$~33+|!(J81#_GB!HQNGbCWr zVJ|Yg5Vw;UaR8eJFax_lZ?GF13_Zh%*+8gkd&Uzf1C<3>PPC4oPbQpbKb9uW#tgo| z($qhVlqRDz>KxKNOe4yb4`h;s$g$QT59nnZ1e}c9?yCi7xrdj!3r9p%Uvq1DS6{W?= zex}NjX>kBfVoyg1@sVk9l2G%VJVAj5*YS^emH?a=r^GrqKw~F4En#QTH7$XQ-JL+} zA}D{yiZJc%m_12hi@CX8Y-WD*A7y&b#6AE<1SPu=*z@w)*LtinN) z@*o-Djd=>$z^n5tnr29)bE3;!DjQy&=Oh&vkS?zVsATw_Pf|r!QUMSqOS9qvr10Y0 zehKo}SQF&IW$dwXz& z#%ls#227^2bChX-OCrPVcv^7`a-#4+x7rCf=B~tA)~K<7oM5;Dfd*elC|45hpMb%F zfv&_l1lvf^3mh~Q4Ny-I>Nfzp4q`s+%>-P-o0JhZG}w-xsW&uA)kp~;@K3ObBj$cL zASFyo;gqZnnE=4t(H2H^W=}FpvVz<6B_|IK&l- zmm?!B-2yGFMUi4^%zx+9hF}c5#BZTjpz{#KVfF+)p$9_ddyi}-=oR;&=KmJGLM(>N zKZRcTS^OXDXF$P>gD@6yen7!gC6PhAa6r(iPz;0ZECU0rXVe=XT(5v8ED89cK^+WS zA9<>_CSHhyO6O~9zE3ALEm106leM>86S;#9murd;fG=2rh>GOkc>;e&Pg?jmb_IN1 zBRfC1e@8qPS^emCj4V^D*JQ60qw6)l z_2#@kwj~Dt;K)gsE8u#Tft z_A5TMslV=`1-%bb72`@lH}P?*ar@Mm|E*8$2M!=uJ-{6;%y#%=%>1wT`IUd{=f??N zlDu(N(p>>?PPV!-=NAve=j&i~#R=%ZSu&tQG+B!pNOhIbp!sDxIo$yQ$gwZ}hb-Fv zX1Wsvf{=Er7=e``q~!F}vGxcyMJPk|)(RkuSjX1KXt7~aZ)3CqiMk-@X+EwZTCC=$ z+Mvu?70%kytilqlR?Iyn!49ypFC4znHguaeXHHn~ z?BMWdRU=DFL+i<)8UU+-9&a5S6&M*hCpsch6lM$L8$l;oD$liL<%lxw=pIW;iQw=c z^j>fW%4``sK_8XP#Elu0O@sfv@zchIh6N*^D8O=gnANincG3P}p@Czr4&#unxd>n01#w>T_5Z@2WkN!#WaN$CkXdr`qit)*-?E zC!sU>FIk7t6h9I=jDh<{q3aHi>n?OAd^v}Yr_f?4J=f-NF8jH*dKc%+uze;DV7D%q zhSXA>3bIr>4g9Y^t@F4_X$e6gWikPd4&gz(pM!EeBCNCZK``Bp7^*U^Ks_uH7 z_2gEL4k#w1yY=8kz5q+^5<{j$i6K&p!!HOe^&wS!U;(RgAVG6 zDPzyD4e9x3d;dsC07x%#`@yE4>o7GW>rhY?c?QR_tA>!7kGxL6Zo&^64^Ch}m8`OA z!Wv#hQ6!_jKl1t^k5jk0u{|+iV19E4h)Dne8AafMji5L`JQU?+GdaE{xWJvOhWPPQ zcp#YhII#nmgAtX`lQ9s9{@#hi-4K>62b3(r!2|(m8r_(mojx7`)6hnSb3y~$M=XK61a;Xn;k2Nx zVJNAxxshp_K$^=A*Qe2i?NnRna+!DY`K~#MC&1vcxY#h6><5!fR_VTbI4m zJIvOdK`iwXVb-EGify7fIje^FheZV&IypP48XLMfsu~#>!2!&WT|=C^G(UR0TeN?4 zuwld;;!ZB}oes&;*xU4KjxKU1bN7s*BrVu=ojC0v&nGU1WOntj{>BE}ww;&@^p`jlRa*PUa?c|uoFr|t<0 zcpx~QBWZSIgAU##A_h+f%o2vJu)XA*gAdRb`1KbT=(3$|nFYGH$x7OEq5_g!pDqGZ zKq|R1abdDR(JbER#}D-%%$ly!bYxLltPQ(BFJ#dVwiN&rxyqUW#qY#RyGKgkP6&9T z>@Jj332K205eZWIeSL@$&v04;{00Z{;7KT0$BDtgjKpDQU<*Q6aSGDF?=Y?o-k5Kx zRnTuZ{EEJZm>zEq4EzmrP(nE?bcBf1|JPoa{}HtN{{;sAP+IGs3k<-1gQy7x>JA`r zWT_LZ2gyJH`T~2_N{UFGbgf9Y`Y_gm@BpF;80U<2&>c`}n}~PQ+2ys+)1k5jI%*R| zCBg0^PQ4(mV}*A+RFCbY{}`(GlJwHk0k(v`hNAQA3A=M;3A{0qf(>QfUOtN%Zl3p&c)5KjP@*L=VkFCK6_~0j#K~A`j zP~W4M>9L(`e#`V^hLKAKz?%rKCLLnTJkAunxx**!;0JPe4;U59p2BjHJ+kw~hX_0mue!NUpc6eE zPw*pTPjLI}W|T@+>8XAbrnUKj@PlKsr8rmLtCnskC&e&yjtmY84FsP$phPV# zSqa+>q*<`1)?}$L42Lki4Uyj-+&uVQCj^I2kDj3lRkw`|T_Yl*RSA{l7P>GP;M{ zRCMQTo4^V0C;j#6;y$&U<|JX)yey|CodF}hG&wRxlt-5zyk4l@(DhPoe~tNmhJ#FxpPerl zEv~rAPm0kpsO3=3p3N;e?iE?%FGonHKlo7Nyx`m5&+R8a&JNov8b3#QjNPf#Go3nj zH)prpqGsHEsw+~vr)8=k{nQKXl;$m$Bj%aZL_A?KZC*LLkI8g7+_q@Ef}-Q3{jJXZ zE5gELX1(-xd)~)&P~bh2y8*SA`^;z(d)Y5O=B;dT|5x{-PHAsS(Fx4IYMRzZr2Uh& z`d7D0c41cE8=!xA`ol(&dpuGUJXXT?#z@s6S(hq5LuJkT%DcgC_oM6t(tUWq|*dD=SnJ zuEzJaT5qFO6|ixQ#7rw+%D`<2S6MRe1}$|J?^9_O&@rEKahnJu$Zxukm!fQSz0KE6 z53M9K6iAa&(=URK*kbqIipIn4zbX%3t2vu76|G zMrVbw=k(^DFKoN8+wN}i!0UReY?SAXKi%tDWU*htz6`HCOTjPRxfbbjUysid>$8t; zb*cTDWu1aZdsc?coaEgv7yGxCRu>yu3`*G%_nvaYW(%lLrB=gzV^|F z{hGaOI`vYQxm;?KragL}a@3XS{B(k*&Y^+3z1@qfO8g(SmIl7c9D4UK%c%bCM)MDh z?Ux>24j$>XMs0pSshg>;Z92tq0;?O^3Pi$p1%BN*c<=Kae&rU&=Y3o4|7h1=2gYa* zS3KmoK=OuqS(0YT=U~$?qny>#6}3)>H`AXf*EkGz{ov;=KdTsV>g*ibM`s0{W%keZmNz{aUnX)@Pb@P~aG_6`Q$=oxR$7+dL;Y)0 zB|aG(%6hijyF>PEb$I=<#p)-ni`wd>O00Fg>rh(vMo7QKL?SnJW8$NoaYIraZdkiN zscL@|d2L!nVtZk5MOEebOlPIpZLac)Ck`+diHohSn0Q%BWNU!jl=+Jj4q zty00kij>*4r1iZL`gFbZ&Rqt7v+~Vdr}7fEmpc;J-%whigQBw*~-!T$K)~gCEh8z zS@u3XE1LCb*qQld{W~;J`}ovvyJKV4J2OhU;ZoN?%A~*7=65(3`qS)vi^N09MD8R%6Djz- zYeco`LoGiF+c18(nRD!kP!Sf4Gt-gd-FSK4)P)0e&OpL_TI<+L64noUWwj`rGSI^5yl zo8I;pWZqrQjIgf|8FBcb{4u+k{`b^U4h}uE)NW^t)Q6*XTL(!@-hZ2AaW(e%w!h4# z8XE6ZDA>L#Oa1h`dyxq-2ZHq09C?3X=quLVn%rLN{Hexky&cyjtq6R^Ts(bO(373< z%%`@Fr?Xlz_P8DkmdLyx(l8-6m3i4RZEt>y`H_H!A7h8bzP7i`GwU7}e=`>@`$;zZ=*xfQkp4Vj;cBPLeZs-&KE&77Ej^`WqPQI2H0e!kFTjbw`Q z%g;L(DN8O@d9y+4zQ(g1v;FSOtI1xu%g%cB*jL+SR=qzRzi-B0qjuR#H3};&9i4Y^ z|Fl_UZyrxs-ak4uKw4_+nGI>0yJ&R_`>tqwck+YzV7;~y*&CN{O^xoS>N!AK>_kOdde!-i(KMS?cbLpO?nNms(^6K=GnP_IW3txX%}+bS zxRo_RBe3oCqk7Fx`jko6N*gp}#QTlb&P=4cP8d*T)BMEw`Te`Hwezm6<>be|z6Pz^ik*igNMV-8#$<@>@$5=7~|;JcAB;{ev?Ga({2x0e#Z7z#ezY*jY{syk9^~H zF~8TO zSmRX6i^b9!$+@ypk2L1aJN$9$W=;8V^)4y*%9bWyv((h+cVXF@O0}^e&V@JszOh@h zVqI0=w3!&do4oIPK^cK3;`56m+kj#+eUz{GKd zC&s)wT{b^g!=oxB>Td3J2VG{U@Tp^3hqL_D%f6oX5kC_p-M7duqJpyEl3ufV|JXr$ zkK1ik6d9kd-d4Xjcb8M;Uu{~SE^3%vv6+1$^=Pp*RWh${)V{S=Zu>L zQ~uf|v`gWN_wI_EPX@aTUw(0HaLhPbCm9l`uSuN! z-pOc>mVD5Nc`2q#(nqJdr=@G(*k0`xz&ugDeahEp<6X<^Kj(GY++VLZ-7WEb^{uTU z{%4okZ}qt%G}F%GsINk{R~Tzo+vWEci&RYCMHU~pK7ev_lo6a>x!Uk_0r2XV>j0oXu6GB9ul**ZNyX+ zdym~rr^z4gC@3tt^+;yIY3cI^)6xT)6%W1f*q-|6oA|aHxjWXldkm+R`^;*{oiNI^;9Xbq`%;p+jjC3#*UMpR{1ru8gAi5a(e7PADnZdVHz1y779N?-t?hugt9~J~m%z zpCS`>Z1eT!ZK6hE%vr|6my8tMyr-de(@`Dsav_^#TNN*OFaYYmFpb>)Gl49 zReUFB?7ivXG-D~fvRgUkbMv#lex{Z+T6l&I|IjZ+_Dp(HrMpsFD#dkg# zrp(J-xwJ#8E!nPi7nORj@Aelvw7mqPc7A!`E4 z28T#cOikdVX&POELZ#X`jgz3PmsAorboQSf90l70*#E3IA1ZEXNg*&h6p9IJ{Te}O zM6&Qq{=N5q2p4RuS{P5O9WJY+?X;J?3{Il z;HZdsk%2&gIFEvLuR%jq8h^({3DvDdw48{Dh3j{S85=+bu{qt$z>IET!7$+vgKD|m zh!Kb=S5}s`qH=!-)}ybx=&@F>5tMVHfzKH(|9e_^8%)rWWf)_?K^H9wsxFKB2Du@B zhMoxl8A5#ndN@+VLys6YCw5->zwVzY8={2hu`JgK3RAkMv7FWcCrvSm>fdt`%Htvq zk)wvaBV4pzQ-tN57?9QTJEKMf)VjoxfgNxJEg6O}erOjh3V1!%tr3)QVi2c1|1uMM zkR!s2xN9(Icm#RKv4wX8N783ezPJ-_JqZ3n*>>us~4?R;n z3GC>QOo@lDn;!Z8)b2qE6b>mQz{&2agaJr;Jl)I)aQiQFk^l^K2@2>ME_z1YR0)Lv zIDCR0!GV8IkMKQXPO`#NDLm7SnM#p!G9wO8`1h2E!V{R1G{XopnrqA$=`)pOoj|Yu z)_m*1Mx!pR1;ntz<|f7(6RQT)jDBx+cc;c62A^P}Q94Cff{T`!87l$IbSHC2-~Js{ zf`7%evcZbPEg{`ii5b+@#S&r;;nhDv4+=JuGk_IOk>rt(wG>G?Cvzgy^2-v^qi5_z z8>xO722mxAn~_kG1u02$j5GLk{ojKemyF0V2y`M3Irh{x|4k|BPR|UEP2ezcw78_O zBo{Sv$a=xUW&tJnerMRQX5tbP3u5?@OsYshNql%_7dcjiTz@$y3&Icm%j4FA6fypo zlneoH?IJ}nCk4_1a`660&xrBI3Ssd2TrvW6K{;wtMTRh| zxL9ccSrkYnfgn^B`1PUVN02aZ*rL+iF0p{T3^qYxS^5J#1Vj|PIh$a2!^8qAJ+lcC z=f(X2f<{<`*hAReGJzrNHB(u}84??QXPWoqs0CqBVRBLc=i`x2mT{b%yo<3h)Cv2Y z(ZfQNIRPL?ZWo<;dN@Lj=&`p(40CSy?N|AMe zgByO20A@V5WSDk&GE}4psT0Q3M8 z{yVC&Cq2UcK)h68smxOD%PsqcvvA)C=glw6eh*qEg!O@G$q=RiPv3|Q2uwD@e)$6g z2_l%FEMZk}6EtOSie13__j|*K$BJ84XkF7=MV1giUW%kH4Pv}|E=9BAHOf1J<+k}7k8VRjQ|8g_LlEpGZZKky8650Cn=*fE(d&zP z2Ku&kZdwldI<+-*MILb6i;?@Gq6>OUv&9da37CG^jnVBF^``io}TPDia7(;1FT79CKY}Uqu?L z=T)SRdtOBY+Vd(Bj-FS$I>+SdGoIl+Z|2)Oym<7yw_ERsZop|=d|m?Yk|R+6c^HrV zD?J_zn16nc;M+UAndyKZ1eH*q&GU2`1r_>v=D`b2dC| zgS=Nha!@4MniO3!=w4FnM( z?RwX)3CAFFt$2BWSDGGA!0Qyc3Pl*WF`ZpFP9E4Nf$3xb&=UZnF{B6dJ;B?k} z0b>#ULxar#{6l9#32nNCw;>yE%CLZgd&tG0mw?fSMgeF)>f!bzYCpN+_AzQZ7oqlZ zf86Gv_RDbGUPkTLVBCH}?YCrTjRll(TZGzPwzy?BqknowqE=8Cw_8ywWQ^OhsO{s0 z+gGUVyA-v;3b;LhS`lm9-bSq`ehx(xeWvU{tr!EhwWt*j!R=SnN~EJ!(twHo!DRaR zpwIoja)DDbCt=vG|7NAysG;VL8 zcF-KuD)h$f3jrqlp{RrYP{cPWVls+h_(~#fH{ljPNbwB*d<(ajA4+}EXC)=vn&1{Q zRta}TDH>l%!7b*85`JB!8hquxKrbfz_yhW5uq1BPaXSpR&bST1EgEU#!5eU!i(AZ< z!PoHTr>IpHz%A~#GLjf$Wh>lz;x-(&Nx03xZ6UOt#>!{$A5FM@gIX04++y~s(C}w_ z-1^}*2DhtlyA!uZa9fMp2Lb}{giivjd|Si865tMivX2BJg2KY~4s6)FMEqy%om)3M z18kPO-1z00Prlc?faYa;V)y813#sP_?p~F!3Jje>1~txowo`k%Wy|rG7rrj7Q)twc zcbAv%l{WhDpv~p)HgEE}U%#jG#4P6RqGjWDT&|y2l==L5lA<5QwETRH_<>$^$I{C@ zk3WC7bD-+SurZzWU+Rq|OqUD_nYpSlpJnQm8Kb{=j*mgp$FPdbJ+YteiZQAbru-)7Cu#*?0`)kUA8Njr5R+fEgnaIb)FS~;t{s9?8YgF)=k+&;FJ zUYEZ{e~X?_S>v~CvqCHV*~6OjJ>FufTUla%S$Y*dev%n~MEjAEo2t*%<>L|t3p`fa zcZ%=$;Dt@;=N1aC@i8UG2lMi0#s`M!d*egxK;xr1lruiYCg!HR<3pqUPmRwdtGe^f z_jm`1iAQNzt`7`S2nQr{}*4^AdJ$t*3hVP1Uto-Ax^+a`NVvgd{<}9n3Qv}%S$Ss*jf8umhkNxU^Yi) znPR7j7CKA?*4Kl;z6$NKJ*6&R^;NoF=0*R${pzo;p7JqjOZ4gMYJWS0nhz}!ULWu#HPS94|ANkrgLO>R1>5E% z+K4%H1Pog8?wr%8@$X`7!(XOLBrzqDcE;z128;P8y!Eq+ZPZ;QH1Pe-s}7s#AF4W3 z&aB;B<$T2^ZH3qMGY-@A%e=nGO&av2nXep>CMQ2R=z|?ue6=jSOAuhtent?m4ai^1 z>P$s~p!<>|2vCiZciDr=zC41ET5VrBT4tGV@cBFDrkkfx8ieOOJiXeXLZ{E+0FP-? zBTn9!Dr6&5RpP0?BGe|Yw4rQ5$c7V3cRA)zrJIt}YdS7jeA^r}Q)656RNra6Z|AKJ z8&;I=E|p}vInzEOXHvzqg;CTr_ZgaxTWB&y#|vwi+oeuj2ztDcGD&0TvlQ6_hlk%2 z5338GAG5r@Zmg}?kb<=V=_&o^e3C7V7`|j!_2FJk37Zaxc}}p}v?*C@M6KhI-3GTW zy`FrnEYdQ?YRAeA60N?ybm=Ge#Gaa4ejq=6&l0gIAxS3QosAEDl`p%_{&2T(l;{5O zu^#@$V^=l}a7kwF?bV<^XWgBX%T`d;Qri!^3l=`3=wE*lT)oe1o6qWjYi4}BJnPiK z$0Nn8949y><+aMM6>U0@*m)zJDqxi>w$k?6x{Iamy6XyA14rt7n<%|H$HJ=r5R;Y8 z0-aTpV~R#49b9bl!92t_DPcPEt*E#}@v(EY!^^D#o7c{l(Y$-Gg~>P>GgL=4ApHJ2 z>98shTUEb@BStY?Ru7pK9dLHWyG_H|9&hf9?t6DWeg3tH)6&P8uh=L&we5}G0*Pbd zvqGlnirzh;QvWp6c`Wtsc*|Gys?4MqPNA65rEMdJoa^Vkp89OjA=M8kdGLXPWY?{&8uJ5%r^`mVLW;u_Ncs z`&)Cfb6oG8?KSuA>Hf)!)q2@vtFEzA%y5#nDYjpkYil*u&10VHVRhPr*1GwP?Wg?Q zZa+KkvoJYeR?GD1kG2hp7;*8D<%!tW0~Xbss0%J_$)RdhJKt(L|1#*#;ypLFHEu4p zW-jZ~k*%AcS?7CD^ZeJa$CifsndWi4Y?pri4CopDklx@iJ1Y1#Sah0?uqCyFD z)90H*^@kN33B1u9bTF!H;JwkSHsIB8D8^pCvwQT3EZo;gn+bts&>)ZYdnqFIajaNrdwBK(B(RVIybV(s&r>`t7;+ z*>^K1vx2F$F6&iO)C<3*zgRg&sdvznNft{xv#K^UN+0W&)fjik*SEd5cP znSDeer7cF{i0|Xt`Ju)kSd1}8|daXLgYe#NB{&?us5pNPZK8;%JC+R}# zuii&Fd}K(BOJxv^VLeU0WR1p(DZ%^e^){UB>m}cAvs%8fI7F|d>1OQ^|0e-nen$&J zmV15H@-@4~Tw^J+X73`6G^^vO4PPQIJ{q;ZWql{#X+-*K`04lWt9LVwdPfrfGqVV4 zXMArK8Gb{v$fS-li{RWPW1d-L)@>G5PrQw_`-71cfpz9H#b=TyGoo@-n0DLEYP0*ID@V<`DOa76 zqgT64cZ!c@>D>vS=oiGST^%!ay>g0ByibS*ZPnKG57&fEzxqJYJ3HQmJ~uq)x~-PR zg=;516ogmkcPt1Wdm^CS>G3fk0m=}?vr7bg!ebww`ZCGq^P6!Aj_vo2h9|fuwk>^i!;79yJ}~^Q+?JfZPv=TrS9eig-+7=db6%@d z_FkPnlxvkMs1X`9gOYq>Zp6&HC1(C~scnjA@+{-bSEHXB1XsMQ1$l$sbau zyz)~Yp-HzN93L5UfB4Pu3-tusiqvWZMcfC6ET54hB;b)h(7OIo;41TF8?uGQQs)-l zTN7KhjDr)at5Z>ay$nAW7!U9WNMF3d1BdhRJKFX73O`_B=-LW6QZaJF1xvKWwMu z8_BvKYN)Sl_ZPk$b}iugkm196>mRY%;BInq*_?fPR_~q8eGT1yohg(oTqJEJBD6zs zgTRX9oGmkhl4nL$KiWO(l(V#_aq{RDF=lD`y*5~_oxHv8o6e*&>&(a5v^KmAWA4*v zNQ<51-#|U!S#MVAD7-Fr&cW(E)se-=DdYWb4(d>flTqGX*#DiE+ra6*#cAJ!^UgN# zoo%G|?Ypzh(9YUxgw0qpnwgo6xs5eIoX0{T1~_bT0M4W4+9#QFrXZRwKQjfPe%JS= zpec4!Fv>Vn5UK^4b4@`rK{F#d>ln*GpPA*sYO*iTu%bFkrK(f=B;8-UqnE3d&so!w zmYvc{+g0nzHB$C}{A$tIB3*YV%GdJbf|X^pi!!Tg~92-(AF=fdaBfIGvUd4si7{+`!y>ot5)8N043G|k+D#;(; zXa2!K#b1+F%f7CjWzo>Gp(@{VRmR$xOK{&vuzl2;4 zf91Vg_E}ixiimlq_5F;a%ga;Rr-&Tcapzt5OubVVFSaacr;hSEG_N^zUT)S3wbh@Q z3%+IRuT=GJ)Xp6}Tt6?SB&46shmZZe^!tqyT{|u`DZnadVCxX2fd(J$L<%VijJ+aJ zb@ImOgjn5MD%yn?2QUw0swuWq$DavITWk?#<+`~1a{1H#m6Jq9%T-$#7ugMRNYAp) zP#!W?c5dOzWi7WxfBG_GmCLZbQ>V@y+8{ZlZ0JnwfE^}bIUadI>;CcxNPF)uKC$+1 z<&@BM`a^b|SM}HYtf$#NbzI)w6@6`dN~;aF#CspPF(ydlib;Z1-&=lrnc=0*A6gkl z!rr!seU1=Sau&9yFAN!B8TMD&dxiX_;Lgr+tHZV#Iwg$*uIr>YSGL}Mb)>R^IWBqp zap{#(BIU(0y`&T+Ruw#65gv8!;nHVDllvbEkRIb7^u^s@P<=_}#8GQsEgv1AtuwCb zZoz@Vhbe`+-?Gnajq-`?8}V|Pr1g|>t2Y{`%%6Q=n8f&s=lQ~GER)x|&JlWBpw(L0 z@BTGr{poun`A$7D*znz{$9ErN!I@=fM*PeygEOhWH_OZpqlIo*HD{JFOpWR6Syl?} uI|;#|3==Z?@k{RsWvSTibrbZ=pLtJ<@4x5p)95`dFLB<}%#=nh$o~&E&gqo^ diff --git a/src/JT808.Protocol.Test/JT808.Protocol.Test.csproj b/src/JT808.Protocol.Test/JT808.Protocol.Test.csproj index b4166dc..bd982a9 100644 --- a/src/JT808.Protocol.Test/JT808.Protocol.Test.csproj +++ b/src/JT808.Protocol.Test/JT808.Protocol.Test.csproj @@ -56,6 +56,8 @@ + + @@ -94,6 +96,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/src/JT808.Protocol.Test/JT808HeaderMessageBodyPropertyTest.cs b/src/JT808.Protocol.Test/JT808HeaderMessageBodyPropertyTest.cs index c84fae4..0f6b4f4 100644 --- a/src/JT808.Protocol.Test/JT808HeaderMessageBodyPropertyTest.cs +++ b/src/JT808.Protocol.Test/JT808HeaderMessageBodyPropertyTest.cs @@ -27,5 +27,49 @@ namespace JT808.Protocol.Test Assert.True(jT808HeaderMessageBodyProperty.IsPackage); Assert.Equal(JT808EncryptMethod.RSA, jT808HeaderMessageBodyProperty.Encrypt); } + + [Fact] + public void Test2019_1() + { + //01 1 001 0011111111‬ + JT808HeaderMessageBodyProperty jT808HeaderMessageBodyProperty = new JT808HeaderMessageBodyProperty(); + jT808HeaderMessageBodyProperty.DataLength = 255; + jT808HeaderMessageBodyProperty.IsPackage = true; + jT808HeaderMessageBodyProperty.Encrypt = JT808EncryptMethod.RSA; + jT808HeaderMessageBodyProperty.VersionFlag = true; + var result = jT808HeaderMessageBodyProperty.Wrap(); + Assert.Equal(25855, result); + } + + [Fact] + public void Test2019_2() + { + JT808HeaderMessageBodyProperty jT808HeaderMessageBodyProperty = new JT808HeaderMessageBodyProperty(25855); + Assert.Equal(255, jT808HeaderMessageBodyProperty.DataLength); + Assert.True(jT808HeaderMessageBodyProperty.IsPackage); + Assert.True(jT808HeaderMessageBodyProperty.VersionFlag); + Assert.Equal(JT808EncryptMethod.RSA, jT808HeaderMessageBodyProperty.Encrypt); + } + + [Fact] + public void Test2019_3() + { + JT808HeaderMessageBodyProperty jT808HeaderMessageBodyProperty = new JT808HeaderMessageBodyProperty(); + jT808HeaderMessageBodyProperty.DataLength = 255; + jT808HeaderMessageBodyProperty.IsPackage = false; + jT808HeaderMessageBodyProperty.Encrypt = JT808EncryptMethod.RSA; + jT808HeaderMessageBodyProperty.VersionFlag = true; + ushort result = jT808HeaderMessageBodyProperty.Wrap(); + Assert.Equal(17663, result); + } + [Fact] + public void Test2019_4() + { + JT808HeaderMessageBodyProperty jT808HeaderMessageBodyProperty = new JT808HeaderMessageBodyProperty(17663); + Assert.Equal(255, jT808HeaderMessageBodyProperty.DataLength); + Assert.False(jT808HeaderMessageBodyProperty.IsPackage); + Assert.True(jT808HeaderMessageBodyProperty.VersionFlag); + Assert.Equal(JT808EncryptMethod.RSA, jT808HeaderMessageBodyProperty.Encrypt); + } } } diff --git a/src/JT808.Protocol.Test/JT808HeaderTest.cs b/src/JT808.Protocol.Test/JT808HeaderTest.cs index 97f11f1..7bc0cbe 100644 --- a/src/JT808.Protocol.Test/JT808HeaderTest.cs +++ b/src/JT808.Protocol.Test/JT808HeaderTest.cs @@ -8,6 +8,7 @@ namespace JT808.Protocol.Test public class JT808HeaderTest { JT808Serializer JT808Serializer = new JT808Serializer(); + [Fact] public void Test3() { @@ -34,7 +35,7 @@ namespace JT808.Protocol.Test jT808HeaderProperty.MsgId = JT808MsgId.终端鉴权.ToUInt16Value(); var hex = JT808Serializer.Serialize(jT808HeaderProperty).ToHexString(); - Assert.Equal("01 02 00 05 01 38 12 34 56 78 00 87".Replace(" ",""), hex); + Assert.Equal("01 02 00 05 01 38 12 34 56 78 00 87".Replace(" ", ""), hex); } [Fact] @@ -75,5 +76,39 @@ namespace JT808.Protocol.Test Assert.Equal(JT808MsgId.终端鉴权.ToValue(), jT808Header.MsgId); Assert.Equal(5, jT808Header.MessageBodyProperty.DataLength); } + + [Fact] + public void JT808Header_2019Test1() + { + JT808Header jT808HeaderProperty = new JT808Header + { + TerminalPhoneNo = "13812345678" + }; + JT808HeaderMessageBodyProperty jT808HeaderMessageBodyProperty = new JT808HeaderMessageBodyProperty(); + jT808HeaderMessageBodyProperty.DataLength = 255; + jT808HeaderMessageBodyProperty.IsPackage = true; + jT808HeaderMessageBodyProperty.Encrypt = JT808EncryptMethod.RSA; + jT808HeaderMessageBodyProperty.VersionFlag = true; + jT808HeaderProperty.MessageBodyProperty = jT808HeaderMessageBodyProperty; + jT808HeaderProperty.MsgNum = 135; + jT808HeaderProperty.MsgId = JT808MsgId.终端鉴权.ToUInt16Value(); + jT808HeaderProperty.ProtocolVersion = 2; + var hex = JT808Serializer.Serialize(jT808HeaderProperty).ToHexString(); + Assert.Equal("010264FF0200000000013812345678008700000000", hex); + } + + [Fact] + public void JT808Header_2019Test2() + { + byte[] headerBytes = "010264FF0200000000013812345678008700000000".ToHexBytes(); + JT808Header jT808Header = JT808Serializer.Deserialize(headerBytes); + Assert.Equal(135, jT808Header.MsgNum); + Assert.Equal(2, jT808Header.ProtocolVersion); + Assert.Equal("13812345678", jT808Header.TerminalPhoneNo); + Assert.True(jT808Header.MessageBodyProperty.IsPackage); + Assert.True(jT808Header.MessageBodyProperty.VersionFlag); + Assert.Equal(JT808MsgId.终端鉴权.ToValue(), jT808Header.MsgId); + Assert.Equal(255, jT808Header.MessageBodyProperty.DataLength); + } } } diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x0005Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x0005Test.cs new file mode 100644 index 0000000..daa4ff1 --- /dev/null +++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x0005Test.cs @@ -0,0 +1,33 @@ +using System.Text; +using Xunit; +using JT808.Protocol.Extensions; +using JT808.Protocol.MessageBody; + +namespace JT808.Protocol.Test.MessageBody +{ + public class JT808_0x0005Test + { + JT808Serializer JT808Serializer = new JT808Serializer(); + [Fact] + public void Test1() + { + JT808_0x0005 jT808_0X8005 = new JT808_0x0005 + { + OriginalMsgNum = 1234, + AgainPackageData = new byte[] { 0x01, 0x02, 0x02, 0x03 } + }; + var hex = JT808Serializer.Serialize(jT808_0X8005).ToHexString(); + Assert.Equal("04D20201020203", hex); + } + + [Fact] + public void Test2() + { + var bytes = "04D20201020203".ToHexBytes(); + JT808_0x0005 jT808_0X8005 = JT808Serializer.Deserialize(bytes); + Assert.Equal(1234, jT808_0X8005.OriginalMsgNum); + Assert.Equal(new byte[] { 0x01, 0x02, 0x02, 0x03 }, jT808_0X8005.AgainPackageData); + Assert.Equal(2, jT808_0X8005.AgainPackageCount); + } + } +} diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x0100Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x0100Test.cs index 961e665..4f03465 100644 --- a/src/JT808.Protocol.Test/MessageBody/JT808_0x0100Test.cs +++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x0100Test.cs @@ -1,6 +1,7 @@ using Xunit; using JT808.Protocol.MessageBody; using JT808.Protocol.Extensions; +using JT808.Protocol.Enums; namespace JT808.Protocol.Test.MessageBody { @@ -52,5 +53,56 @@ namespace JT808.Protocol.Test.MessageBody Assert.Equal("CHI1230", JT808Bodies.TerminalId); Assert.Equal("smallchi123000000000", JT808Bodies.TerminalModel); } + + [Fact] + public void Test2019_1() + { + JT808Package jT808_0X0100 = new JT808Package + { + Header = new JT808Header + { + MsgId = Enums.JT808MsgId.终端注册.ToUInt16Value(), + MsgNum = 10, + TerminalPhoneNo = "123456789", + ProtocolVersion=1, + }, + Bodies = new JT808_0x0100 + { + AreaID = 40, + CityOrCountyId = 50, + MakerId = "1234", + PlateColor = 1, + PlateNo = "粤A12345", + TerminalId = "CHI123", + TerminalModel = "smallchi123" + } + }; + JT808HeaderMessageBodyProperty jT808HeaderMessageBodyProperty = new JT808HeaderMessageBodyProperty(true); + jT808_0X0100.Header.MessageBodyProperty = jT808HeaderMessageBodyProperty; + var hex = JT808Serializer.Serialize(jT808_0X0100).ToHexString(); + Assert.Equal("7E010040540100000000000123456789000A00280032303030303030303132333430303030303030303030303030303030303030736D616C6C63686931323330303030303030303030303030303030303030303030303043484931323301D4C1413132333435B27E", hex); + } + + [Fact] + public void Test2019_2() + { + byte[] bytes = "7E010040540100000000000123456789000A00280032303030303030303132333430303030303030303030303030303030303030736D616C6C63686931323330303030303030303030303030303030303030303030303043484931323301D4C1413132333435B27E".ToHexBytes(); + JT808Package jT808_0X0100 = JT808Serializer.Deserialize(bytes); + Assert.Equal(JT808MsgId.终端注册.ToUInt16Value(), jT808_0X0100.Header.MsgId); + Assert.Equal(1, jT808_0X0100.Header.ProtocolVersion); + Assert.Equal(JT808Version.JTT2019, jT808_0X0100.Version); + Assert.True(jT808_0X0100.Header.MessageBodyProperty.VersionFlag); + Assert.Equal(10, jT808_0X0100.Header.MsgNum); + Assert.Equal("123456789", jT808_0X0100.Header.TerminalPhoneNo); + + JT808_0x0100 JT808Bodies = (JT808_0x0100)jT808_0X0100.Bodies; + Assert.Equal(40, JT808Bodies.AreaID); + Assert.Equal(50, JT808Bodies.CityOrCountyId); + Assert.Equal("1234".PadLeft(11,'0'), JT808Bodies.MakerId); + Assert.Equal(1, JT808Bodies.PlateColor); + Assert.Equal("粤A12345", JT808Bodies.PlateNo); + Assert.Equal("CHI123".PadLeft(30, '0'), JT808Bodies.TerminalId); + Assert.Equal("smallchi123".PadLeft(30, '0'), JT808Bodies.TerminalModel); + } } } diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x0102Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x0102Test.cs index 1b02e62..bbf625e 100644 --- a/src/JT808.Protocol.Test/MessageBody/JT808_0x0102Test.cs +++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x0102Test.cs @@ -1,6 +1,7 @@ using Xunit; using JT808.Protocol.MessageBody; using JT808.Protocol.Extensions; +using JT808.Protocol.Enums; namespace JT808.Protocol.Test.MessageBody { @@ -26,6 +27,30 @@ namespace JT808.Protocol.Test.MessageBody Assert.Equal("45612", jT808LoginRequest.Code); } + [Fact] + public void Test2019_1() + { + JT808_0x0102 jT808LoginRequestProperty = new JT808_0x0102 + { + Code = "45612", + IMEI="1234567890abcde", + SoftwareVersion="v2.0.0" + }; + string hex = JT808Serializer.Serialize(jT808LoginRequestProperty,JT808Version.JTT2019).ToHexString(); + Assert.Equal("05343536313231323334353637383930616263646576322E302E303030303030303030303030303030", hex); + } + + [Fact] + public void Test2019_2() + { + byte[] bodys = "05343536313231323334353637383930616263646576322E302E303030303030303030303030303030".ToHexBytes(); + JT808_0x0102 jT808LoginRequest = JT808Serializer.Deserialize(bodys, JT808Version.JTT2019); + Assert.Equal("45612", jT808LoginRequest.Code); + Assert.Equal(5, jT808LoginRequest.CodeLength); + Assert.Equal("1234567890abcde", jT808LoginRequest.IMEI); + Assert.Equal("v2.0.0".PadRight(20,'0'), jT808LoginRequest.SoftwareVersion); + } + [Fact] public void Test3() { diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x8004Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x8004Test.cs new file mode 100644 index 0000000..d244654 --- /dev/null +++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x8004Test.cs @@ -0,0 +1,31 @@ +using System.Text; +using Xunit; +using JT808.Protocol.Extensions; +using JT808.Protocol.MessageBody; +using System; + +namespace JT808.Protocol.Test.MessageBody +{ + public class JT808_0x8004Test + { + JT808Serializer JT808Serializer = new JT808Serializer(); + [Fact] + public void Test1() + { + JT808_0x8004 jT808_0X8004 = new JT808_0x8004 + { + Time = DateTime.Parse("2019-11-26 15:58:50") + }; + var hex = JT808Serializer.Serialize(jT808_0X8004).ToHexString(); + Assert.Equal("191126155850", hex); + } + + [Fact] + public void Test2() + { + var bytes = "191126155850".ToHexBytes(); + JT808_0x8004 jT808_0X8004 = JT808Serializer.Deserialize(bytes); + Assert.Equal(DateTime.Parse("2019-11-26 15:58:50"), jT808_0X8004.Time); + } + } +} diff --git a/src/JT808.Protocol.Test/MessagePack/JT808MessagePackReaderTest.cs b/src/JT808.Protocol.Test/MessagePack/JT808MessagePackReaderTest.cs index 8a745cd..be981c4 100644 --- a/src/JT808.Protocol.Test/MessagePack/JT808MessagePackReaderTest.cs +++ b/src/JT808.Protocol.Test/MessagePack/JT808MessagePackReaderTest.cs @@ -8,6 +8,7 @@ using System.Buffers; using JT808.Protocol.Formatters; using JT808.Protocol.Interfaces; using JT808.Protocol.Internal; +using JT808.Protocol.Enums; namespace JT808.Protocol.Test.MessagePack { @@ -228,5 +229,15 @@ namespace JT808.Protocol.Test.MessagePack } } } + + [Fact] + public void VersionTest1() + { + byte[] array = new byte[4096]; + var reader = new JT808MessagePackReader(array); + Assert.Equal(JT808Version.JTT2013, reader.Version); + reader.Version = JT808Version.JTT2019; + Assert.Equal(JT808Version.JTT2019, reader.Version); + } } } diff --git a/src/JT808.Protocol.Test/MessagePack/JT808MessagePackWriterTest.cs b/src/JT808.Protocol.Test/MessagePack/JT808MessagePackWriterTest.cs index bd65a07..b7722e5 100644 --- a/src/JT808.Protocol.Test/MessagePack/JT808MessagePackWriterTest.cs +++ b/src/JT808.Protocol.Test/MessagePack/JT808MessagePackWriterTest.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Text; using Xunit; using System.Buffers; +using JT808.Protocol.Enums; namespace JT808.Protocol.Test.MessagePack { @@ -457,5 +458,15 @@ namespace JT808.Protocol.Test.MessagePack var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString(); Assert.Equal("7E 01 7E 00 7D 01 23 45 67 89 00 00 00 00 00 7E 7E 01 7D 02 00 7D 01 01 23 45 67 89 00 00 00 00 00 7E".Replace(" ", ""), realBytes); } + + [Fact] + public void VersionTest1() + { + byte[] array = new byte[4096]; + var msgpackWriter = new JT808MessagePackWriter(array); + Assert.Equal(JT808Version.JTT2013, msgpackWriter.Version); + msgpackWriter.Version = JT808Version.JTT2019; + Assert.Equal(JT808Version.JTT2019, msgpackWriter.Version); + } } } diff --git a/src/JT808.Protocol/Attributes/JT808FormatterAttribute.cs b/src/JT808.Protocol/Attributes/JT808FormatterAttribute.cs deleted file mode 100644 index 18cf8cc..0000000 --- a/src/JT808.Protocol/Attributes/JT808FormatterAttribute.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace JT808.Protocol.Attributes -{ - [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, AllowMultiple = false, Inherited = true)] - public sealed class JT808FormatterAttribute : Attribute - { - public Type FormatterType { get; private set; } - - public JT808FormatterAttribute(Type formatterType) - { - this.FormatterType = formatterType; - } - } -} diff --git a/src/JT808.Protocol/Enums/JT808ErrorCode.cs b/src/JT808.Protocol/Enums/JT808ErrorCode.cs index 92e9837..ca0916d 100644 --- a/src/JT808.Protocol/Enums/JT808ErrorCode.cs +++ b/src/JT808.Protocol/Enums/JT808ErrorCode.cs @@ -7,11 +7,6 @@ /// CheckCodeNotEqual = 1001, ///

- /// 没有标记 - /// - /// - GetFormatterAttributeError = 1002, - /// /// 消息头解析错误 /// HeaderParseError = 1003, diff --git a/src/JT808.Protocol/Interfaces/IJT808Config.cs b/src/JT808.Protocol/Interfaces/IJT808Config.cs index f27ad7c..e80d3a4 100644 --- a/src/JT808.Protocol/Interfaces/IJT808Config.cs +++ b/src/JT808.Protocol/Interfaces/IJT808Config.cs @@ -10,6 +10,7 @@ namespace JT808.Protocol { public interface IJT808Config { + [Obsolete("目前没用")] JT808Version Version { get;} string ConfigId { get; } /// diff --git a/src/JT808.Protocol/JT808.Protocol.csproj b/src/JT808.Protocol/JT808.Protocol.csproj index 6d7b056..983c0a7 100644 --- a/src/JT808.Protocol/JT808.Protocol.csproj +++ b/src/JT808.Protocol/JT808.Protocol.csproj @@ -14,7 +14,7 @@ https://github.com/SmallChi/JT808/blob/master/LICENSE https://github.com/SmallChi/JT808/blob/master/LICENSE false - 2.2.0-preview1 + 2.2.0-preview3 LICENSE @@ -65,6 +65,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/src/JT808.Protocol/JT808.Protocol.xml b/src/JT808.Protocol/JT808.Protocol.xml index 00528c6..5ec4efd 100644 --- a/src/JT808.Protocol/JT808.Protocol.xml +++ b/src/JT808.Protocol/JT808.Protocol.xml @@ -213,12 +213,6 @@ 校验和不相等 - - - 没有标记 - - - 消息头解析错误 @@ -2197,10 +2191,21 @@ + + + 消息体属性 + + + + + 协议版本号(2019版本) + + 终端手机号 根据安装后终端自身的手机号转换。手机号不足 12 位,则在前补充数字,大陆手机号补充数字 0,港澳台则根据其区号进行位数补充 + (2019版本)手机号不足 20 位,则在前补充数字 0 @@ -2221,6 +2226,11 @@ 报序号 从1开始 + + + 版本标识(默认为1=true) + + 是否分包 @@ -2292,9 +2302,14 @@ 起始符 - + - 终止符 + 头数据 + + + + + 数据体 @@ -2303,17 +2318,17 @@ 从消息头开始,同后一字节异或,直到校验码前一个字节,占用一个字节。 - + - 头数据 + 终止符 - + - 数据体 + 808版本号 - + 用于负载或者分布式的时候,在网关只需要解到头部。 根据头部的消息Id进行分发处理,可以防止小部分性能损耗。 @@ -2365,6 +2380,42 @@ 跳过数据体序列化 + + + 查询服务器时间请求 + 2019版本 + + + + + 跳过数据体序列化 + + + + + 终端补传分包请求 + 2019版本 + + + + + 原始消息流水号 + 对应要求补传的原始消息第一包的消息流水号 + + + + + 重传包总数 + n + + + + + 重传包 ID 列表 + BYTE[2*n] + 重传包序号顺序排列,如“包 ID1 包 ID2......包 IDn”。 + + 终端注册 @@ -2389,21 +2440,22 @@ 制造商 ID - 5 个字节,终端制造商编码 + 2013版本 5 个字节,终端制造商编码 + 2019版本 11 个字节,终端制造商编码 终端型号 - 20 个字节,此终端型号由制造商自行定义,位数不 - 足时,后补“0X00”。 + 2013版本 20 个字节,此终端型号由制造商自行定义,位数不足时,后补“0X00”。 + 2019版本 30 个字节,此终端型号由制造商自行定义,位数不足时,后补“0X00”。 终端 ID - 7 个字节,由大写字母和数字组成,此终端 ID 由制 - 造商自行定义,位数不足时,后补“0X00”。 + 2013版本 7个字节,由大写字母和数字组成,此终端 ID 由制造商自行定义,位数不足时,后补“0X00”。 + 2019版本 30个字节,由大写字母和数字组成,此终端 ID 由制造商自行定义,位数不足时,后补“0X00”。 @@ -2428,6 +2480,22 @@ 鉴权码 + 鉴权码内容 2019版本 + + + + + 鉴权码长度 2019版本 + + + + + 终端IMEI 长度15 2019版本 + + + + + 软件版本号 长度20 后补 "0x00" 2019版本 @@ -3216,6 +3284,12 @@ 重传包序号顺序排列,如“包 ID1 包 ID2......包 IDn”。 + + + 查询服务器时间应答 + 2019版本 + + 终端注册应答 @@ -5420,7 +5494,7 @@ 主要用来一次性读取所有数据体内容操作 - + 解码(转义还原),计算校验和 diff --git a/src/JT808.Protocol/JT808Header.cs b/src/JT808.Protocol/JT808Header.cs index b560c00..c5eb137 100644 --- a/src/JT808.Protocol/JT808Header.cs +++ b/src/JT808.Protocol/JT808Header.cs @@ -13,10 +13,18 @@ namespace JT808.Protocol /// /// public ushort MsgId { get; set; } + /// + /// 消息体属性 + /// public JT808HeaderMessageBodyProperty MessageBodyProperty { get; set; } /// + /// 协议版本号(2019版本) + /// + public byte ProtocolVersion { get; set; } = 1; + /// /// 终端手机号 /// 根据安装后终端自身的手机号转换。手机号不足 12 位,则在前补充数字,大陆手机号补充数字 0,港澳台则根据其区号进行位数补充 + /// (2019版本)手机号不足 20 位,则在前补充数字 0 /// public string TerminalPhoneNo { get; set; } /// @@ -42,8 +50,20 @@ namespace JT808.Protocol jT808Header.MsgId = reader.ReadUInt16(); // 2.消息体属性 jT808Header.MessageBodyProperty = new JT808HeaderMessageBodyProperty(reader.ReadUInt16()); - // 3.终端手机号 - jT808Header.TerminalPhoneNo = reader.ReadBCD(config.TerminalPhoneNoLength, config.Trim); + if (jT808Header.MessageBodyProperty.VersionFlag) + { + // 2019 版本 + // 3.协议版本号 + jT808Header.ProtocolVersion = reader.ReadByte(); + // 4.终端手机号 + jT808Header.TerminalPhoneNo = reader.ReadBCD(20, config.Trim); + } + else + { + // 2013 版本 + // 3.终端手机号 + jT808Header.TerminalPhoneNo = reader.ReadBCD(config.TerminalPhoneNoLength, config.Trim); + } jT808Header.MsgNum = reader.ReadUInt16(); // 4.判断有无分包 if (jT808Header.MessageBodyProperty.IsPackage) @@ -62,8 +82,20 @@ namespace JT808.Protocol writer.WriteUInt16(value.MsgId); // 2.消息体属性 writer.WriteUInt16(value.MessageBodyProperty.Wrap()); - // 3.终端手机号 - writer.WriteBCD(value.TerminalPhoneNo, config.TerminalPhoneNoLength); + if (value.MessageBodyProperty.VersionFlag) + { + // 2019 版本 + // 3.协议版本号 + writer.WriteByte(value.ProtocolVersion); + // 4.终端手机号 + writer.WriteBCD(value.TerminalPhoneNo, 20); + } + else + { + // 2013 版本 + // 3.终端手机号 + writer.WriteBCD(value.TerminalPhoneNo, config.TerminalPhoneNoLength); + } // 4.消息流水号 writer.WriteUInt16(value.MsgNum); // 5.判断是否分包 diff --git a/src/JT808.Protocol/JT808HeaderMessageBodyProperty.cs b/src/JT808.Protocol/JT808HeaderMessageBodyProperty.cs index e093529..c90dd55 100644 --- a/src/JT808.Protocol/JT808HeaderMessageBodyProperty.cs +++ b/src/JT808.Protocol/JT808HeaderMessageBodyProperty.cs @@ -7,15 +7,34 @@ namespace JT808.Protocol { public struct JT808HeaderMessageBodyProperty { - public JT808HeaderMessageBodyProperty(int dataLength,bool isPackage, JT808EncryptMethod jT808EncryptMethod= JT808EncryptMethod.None) + public JT808HeaderMessageBodyProperty(int dataLength,bool isPackage, bool versionFlag= false, JT808EncryptMethod jT808EncryptMethod= JT808EncryptMethod.None) { IsPackage = isPackage; Encrypt = jT808EncryptMethod; DataLength = dataLength; + VersionFlag = versionFlag; } + + public JT808HeaderMessageBodyProperty(bool isPackage, bool versionFlag, JT808EncryptMethod jT808EncryptMethod = JT808EncryptMethod.None) + { + IsPackage = isPackage; + Encrypt = jT808EncryptMethod; + DataLength = 0; + VersionFlag = versionFlag; + } + + public JT808HeaderMessageBodyProperty(bool versionFlag, JT808EncryptMethod jT808EncryptMethod = JT808EncryptMethod.None) + { + IsPackage = false; + Encrypt = jT808EncryptMethod; + DataLength = 0; + VersionFlag = versionFlag; + } + public JT808HeaderMessageBodyProperty(ushort value) { - IsPackage = (value >> 13) == 1; + VersionFlag = (value >> 14 & 0x01) == 1; + IsPackage = ((value >> 13) & 0x001) == 1; switch ((value & 0x400) >> 10) { case 0: @@ -31,6 +50,10 @@ namespace JT808.Protocol DataLength = value & 0x3FF; } /// + /// 版本标识(默认为1=true) + /// + public bool VersionFlag { get; set; } + /// /// 是否分包 /// true-1 表示消息体为长消息,进行分包发送处理 /// false-0 消息头中无消息包封装项字段。 @@ -49,6 +72,7 @@ namespace JT808.Protocol public int DataLength { get; set; } public ushort Wrap() { + // 1.是否分包 int tmpIsPacke = 0; if (IsPackage) @@ -75,8 +99,53 @@ namespace JT808.Protocol { // 判断有无数据体长度 DataLength = 0; - } - return (ushort)(tmpIsPacke | tmpEncrypt | DataLength); + } + // 3.是否分包 + int versionFlag = 0; + if (VersionFlag) + { + versionFlag = 1 << 14; + } + return (ushort)(versionFlag|tmpIsPacke | tmpEncrypt | DataLength); + } + + public ushort Wrap(int dataLength) + { + // 1.是否分包 + int tmpIsPacke = 0; + if (IsPackage) + { + tmpIsPacke = 1 << 13; + } + // 2.是否加密 + int tmpEncrypt; + // 2.3.数据加密方式 + switch (Encrypt) + { + case JT808EncryptMethod.None: + tmpEncrypt = 0; + break; + case JT808EncryptMethod.RSA: + tmpEncrypt = 1 << 10; + break; + default: + tmpEncrypt = 0; + break; + } + // 2.4.数据长度 + DataLength = dataLength; + if (dataLength <= 0) + { + // 判断有无数据体长度 + dataLength = 0; + } + // 3.是否分包 + int versionFlag = 0; + if (VersionFlag) + { + versionFlag = 1 << 14; + } + return (ushort)(versionFlag | tmpIsPacke | tmpEncrypt | dataLength); } } } diff --git a/src/JT808.Protocol/JT808HeaderPackage.cs b/src/JT808.Protocol/JT808HeaderPackage.cs index ec47319..f644e97 100644 --- a/src/JT808.Protocol/JT808HeaderPackage.cs +++ b/src/JT808.Protocol/JT808HeaderPackage.cs @@ -34,6 +34,34 @@ namespace JT808.Protocol /// public byte End { get; set; } + public JT808Version Version + { + get { + if (Header != null) + { + try + { + if (Header.MessageBodyProperty.VersionFlag) + { + return JT808Version.JTT2019; + } + else + { + return JT808Version.JTT2013; + } + } + catch + { + return JT808Version.JTT2013; + } + } + else + { + return JT808Version.JTT2013; + } + } + } + public JT808HeaderPackage Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { // 1. 验证校验和 @@ -56,8 +84,21 @@ namespace JT808.Protocol ushort messageBodyPropertyValue = reader.ReadUInt16(); // 3.2.1.解包消息体属性 jT808Package.Header.MessageBodyProperty = new JT808HeaderMessageBodyProperty(messageBodyPropertyValue); - // 3.3.读取终端手机号 - jT808Package.Header.TerminalPhoneNo = reader.ReadBCD(config.TerminalPhoneNoLength, config.Trim); + if (jT808Package.Header.MessageBodyProperty.VersionFlag) + { + //2019版本 + // 3.3.读取协议版本号 + jT808Package.Header.ProtocolVersion = reader.ReadByte(); + // 3.4.读取终端手机号 + jT808Package.Header.TerminalPhoneNo = reader.ReadBCD(20, config.Trim); + reader.Version = JT808Version.JTT2019; + } + else + { + //2013版本 + // 3.3.读取终端手机号 + jT808Package.Header.TerminalPhoneNo = reader.ReadBCD(config.TerminalPhoneNoLength, config.Trim); + } // 3.4.读取消息流水号 jT808Package.Header.MsgNum = reader.ReadUInt16(); // 3.5.判断有无分包 diff --git a/src/JT808.Protocol/JT808Package.cs b/src/JT808.Protocol/JT808Package.cs index d109a83..7c7485a 100644 --- a/src/JT808.Protocol/JT808Package.cs +++ b/src/JT808.Protocol/JT808Package.cs @@ -25,27 +25,54 @@ namespace JT808.Protocol /// 起始符 /// public byte Begin { get; set; } = BeginFlag; - /// - /// 终止符 + /// 头数据 /// - public byte End { get; set; } = EndFlag; - + public JT808Header Header { get; set; } + /// + /// 数据体 + /// + public JT808Bodies Bodies { get; set; } /// /// 校验码 /// 从消息头开始,同后一字节异或,直到校验码前一个字节,占用一个字节。 /// public byte CheckCode { get; set; } - /// - /// 头数据 + /// 终止符 /// - public JT808Header Header { get; set; } - + public byte End { get; set; } = EndFlag; /// - /// 数据体 + /// 808版本号 /// - public JT808Bodies Bodies { get; set; } + public JT808Version Version + { + get + { + if (Header != null) + { + try + { + if (Header.MessageBodyProperty.VersionFlag) + { + return JT808Version.JTT2019; + } + else + { + return JT808Version.JTT2013; + } + } + catch + { + return JT808Version.JTT2013; + } + } + else + { + return JT808Version.JTT2013; + } + } + } public JT808Package Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { @@ -67,11 +94,23 @@ namespace JT808.Protocol jT808Package.Header.MsgId = reader.ReadUInt16(); // 3.2.读取消息体属性 jT808Package.Header.MessageBodyProperty = new JT808HeaderMessageBodyProperty(reader.ReadUInt16()); - // 3.3.读取终端手机号 - jT808Package.Header.TerminalPhoneNo = reader.ReadBCD(config.TerminalPhoneNoLength, config.Trim); - // 3.4.读取消息流水号 + if (jT808Package.Header.MessageBodyProperty.VersionFlag) + { + //2019版本 + jT808Package.Header.ProtocolVersion = reader.ReadByte(); + // 3.4.读取终端手机号 + jT808Package.Header.TerminalPhoneNo = reader.ReadBCD(20, config.Trim); + reader.Version = JT808Version.JTT2019; + } + else + { + //2013版本 + // 3.3.读取终端手机号 + jT808Package.Header.TerminalPhoneNo = reader.ReadBCD(config.TerminalPhoneNoLength, config.Trim); + } + // 3.4.读取消息流水号 jT808Package.Header.MsgNum = reader.ReadUInt16(); - // 3.5.判断有无分包 + // 3.5.判断有无分包 if (jT808Package.Header.MessageBodyProperty.IsPackage) { //3.5.1.读取消息包总数 @@ -131,9 +170,7 @@ namespace JT808.Protocol } } } - - - + // 5.读取校验码 jT808Package.CheckCode = reader.ReadByte(); // 6.读取终止位置 @@ -152,8 +189,21 @@ namespace JT808.Protocol writer.WriteUInt16(value.Header.MsgId); // 2.2.消息体属性(包含消息体长度所以先跳过) writer.Skip(2, out int msgBodiesPropertyPosition); - // 2.3.终端手机号 (写死大陆手机号码) - writer.WriteBCD(value.Header.TerminalPhoneNo, config.TerminalPhoneNoLength); + if (value.Header.MessageBodyProperty.VersionFlag) + { + //2019版本 + // 2.3.协议版本号 + writer.WriteByte(value.Header.ProtocolVersion); + // 2.4.终端手机号 + writer.WriteBCD(value.Header.TerminalPhoneNo, 20); + writer.Version = JT808Version.JTT2019; + } + else + { + //2013版本 + // 2.3.终端手机号 (写死大陆手机号码) + writer.WriteBCD(value.Header.TerminalPhoneNo, config.TerminalPhoneNoLength); + } value.Header.MsgNum = value.Header.MsgNum > 0 ? value.Header.MsgNum : config.MsgSNDistributed.Increment(); // 2.4.消息流水号 writer.WriteUInt16(value.Header.MsgNum); @@ -177,9 +227,8 @@ namespace JT808.Protocol } } // 3.1.处理数据体长度 - value.Header.MessageBodyProperty = new JT808HeaderMessageBodyProperty((ushort)(writer.GetCurrentPosition() - headerLength)); // 2.2.回写消息体属性 - writer.WriteUInt16Return(value.Header.MessageBodyProperty.Wrap(), msgBodiesPropertyPosition); + writer.WriteUInt16Return(value.Header.MessageBodyProperty.Wrap((writer.GetCurrentPosition() - headerLength)), msgBodiesPropertyPosition); // 4.校验码 writer.WriteXor(); // 5.终止符 diff --git a/src/JT808.Protocol/JT808Serializer.cs b/src/JT808.Protocol/JT808Serializer.cs index 8a69c2b..8f606be 100644 --- a/src/JT808.Protocol/JT808Serializer.cs +++ b/src/JT808.Protocol/JT808Serializer.cs @@ -1,4 +1,5 @@ -using JT808.Protocol.Extensions; +using JT808.Protocol.Enums; +using JT808.Protocol.Extensions; using JT808.Protocol.Formatters; using JT808.Protocol.Interfaces; using JT808.Protocol.Internal; @@ -27,13 +28,13 @@ namespace JT808.Protocol private readonly IJT808Config jT808Config; - public byte[] Serialize(JT808Package jT808Package, int minBufferSize = 4096) + public byte[] Serialize(JT808Package package, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096) { byte[] buffer = JT808ArrayPool.Rent(minBufferSize); try { - JT808MessagePackWriter jT808MessagePackWriter = new JT808MessagePackWriter(buffer); - jT808Package.Serialize(ref jT808MessagePackWriter, jT808Package, jT808Config); + JT808MessagePackWriter jT808MessagePackWriter = new JT808MessagePackWriter(buffer, version); + jT808Package.Serialize(ref jT808MessagePackWriter, package, jT808Config); return jT808MessagePackWriter.FlushAndGetEncodingArray(); } finally @@ -42,13 +43,13 @@ namespace JT808.Protocol } } - public ReadOnlySpan SerializeReadOnlySpan(JT808Package jT808Package, int minBufferSize = 4096) + public ReadOnlySpan SerializeReadOnlySpan(JT808Package package, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096) { byte[] buffer = JT808ArrayPool.Rent(minBufferSize); try { - JT808MessagePackWriter jT808MessagePackWriter = new JT808MessagePackWriter(buffer); - jT808Package.Serialize(ref jT808MessagePackWriter, jT808Package, jT808Config); + JT808MessagePackWriter jT808MessagePackWriter = new JT808MessagePackWriter(buffer, version); + jT808Package.Serialize(ref jT808MessagePackWriter, package, jT808Config); return jT808MessagePackWriter.FlushAndGetEncodingReadOnlySpan(); } finally @@ -57,12 +58,12 @@ namespace JT808.Protocol } } - public JT808Package Deserialize(ReadOnlySpan bytes, int minBufferSize = 4096) + public JT808Package Deserialize(ReadOnlySpan bytes, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096) { byte[] buffer = JT808ArrayPool.Rent(minBufferSize); try { - JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes); + JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version); jT808MessagePackReader.Decode(buffer); return jT808Package.Deserialize(ref jT808MessagePackReader, jT808Config); } @@ -72,13 +73,13 @@ namespace JT808.Protocol } } - public byte [] Serialize(T obj, int minBufferSize = 4096) + public byte [] Serialize(T obj, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096) { byte[] buffer = JT808ArrayPool.Rent(minBufferSize); try { var formatter = jT808Config.GetMessagePackFormatter(); - JT808MessagePackWriter jT808MessagePackWriter = new JT808MessagePackWriter(buffer); + JT808MessagePackWriter jT808MessagePackWriter = new JT808MessagePackWriter(buffer, version); formatter.Serialize(ref jT808MessagePackWriter, obj, jT808Config); return jT808MessagePackWriter.FlushAndGetEncodingArray(); } @@ -88,13 +89,13 @@ namespace JT808.Protocol } } - public ReadOnlySpan SerializeReadOnlySpan(T obj, int minBufferSize = 4096) + public ReadOnlySpan SerializeReadOnlySpan(T obj, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096) { byte[] buffer = JT808ArrayPool.Rent(minBufferSize); try { var formatter = jT808Config.GetMessagePackFormatter(); - JT808MessagePackWriter jT808MessagePackWriter = new JT808MessagePackWriter(buffer); + JT808MessagePackWriter jT808MessagePackWriter = new JT808MessagePackWriter(buffer, version); formatter.Serialize(ref jT808MessagePackWriter, obj, jT808Config); return jT808MessagePackWriter.FlushAndGetEncodingReadOnlySpan(); } @@ -104,12 +105,12 @@ namespace JT808.Protocol } } - public T Deserialize(ReadOnlySpan bytes, int minBufferSize = 4096) + public T Deserialize(ReadOnlySpan bytes, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096) { byte[] buffer = JT808ArrayPool.Rent(minBufferSize); try { - JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes); + JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version); if(CheckPackageType(typeof(T))) jT808MessagePackReader.Decode(buffer); var formatter = jT808Config.GetMessagePackFormatter(); @@ -132,12 +133,12 @@ namespace JT808.Protocol /// /// /// - public JT808HeaderPackage HeaderDeserialize(ReadOnlySpan bytes, int minBufferSize = 4096) + public JT808HeaderPackage HeaderDeserialize(ReadOnlySpan bytes, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096) { byte[] buffer = JT808ArrayPool.Rent(minBufferSize); try { - JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes); + JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version); jT808MessagePackReader.Decode(buffer); return jT808HeaderPackage.Deserialize(ref jT808MessagePackReader,jT808Config); } @@ -146,13 +147,13 @@ namespace JT808.Protocol JT808ArrayPool.Return(buffer); } } - public dynamic Deserialize(ReadOnlySpan bytes, Type type, int minBufferSize = 4096) + public dynamic Deserialize(ReadOnlySpan bytes, Type type, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096) { byte[] buffer = JT808ArrayPool.Rent(minBufferSize); try { var formatter = jT808Config.GetMessagePackFormatterByType(type); - JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes); + JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version); if (CheckPackageType(type)) jT808MessagePackReader.Decode(buffer); return JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(formatter,ref jT808MessagePackReader, jT808Config); diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0004.cs b/src/JT808.Protocol/MessageBody/JT808_0x0004.cs new file mode 100644 index 0000000..2bd9e48 --- /dev/null +++ b/src/JT808.Protocol/MessageBody/JT808_0x0004.cs @@ -0,0 +1,16 @@ +namespace JT808.Protocol.MessageBody +{ + /// + /// 查询服务器时间请求 + /// 2019版本 + /// + public class JT808_0x0004 : JT808Bodies + { + /// + /// 跳过数据体序列化 + /// + public override bool SkipSerialization { get; set; } = true; + + public override ushort MsgId { get; } = 0x0004; + } +} diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0005.cs b/src/JT808.Protocol/MessageBody/JT808_0x0005.cs new file mode 100644 index 0000000..c5a9867 --- /dev/null +++ b/src/JT808.Protocol/MessageBody/JT808_0x0005.cs @@ -0,0 +1,44 @@ +using JT808.Protocol.Formatters; +using JT808.Protocol.MessagePack; + +namespace JT808.Protocol.MessageBody +{ + /// + /// 终端补传分包请求 + /// 2019版本 + /// + public class JT808_0x0005 : JT808Bodies, IJT808MessagePackFormatter + { + public override ushort MsgId { get; } = 0x0005; + /// + /// 原始消息流水号 + /// 对应要求补传的原始消息第一包的消息流水号 + /// + public ushort OriginalMsgNum { get; set; } + /// + /// 重传包总数 + /// n + /// + public byte AgainPackageCount { get; set; } + /// + /// 重传包 ID 列表 + /// BYTE[2*n] + /// 重传包序号顺序排列,如“包 ID1 包 ID2......包 IDn”。 + /// + public byte[] AgainPackageData { get; set; } + public JT808_0x0005 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x0005 value = new JT808_0x0005(); + value.OriginalMsgNum = reader.ReadUInt16(); + value.AgainPackageCount = reader.ReadByte(); + value.AgainPackageData = reader.ReadArray(value.AgainPackageCount * 2).ToArray(); + return value; + } + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0005 value, IJT808Config config) + { + writer.WriteUInt16(value.OriginalMsgNum); + writer.WriteByte((byte)(value.AgainPackageData.Length / 2)); + writer.WriteArray(value.AgainPackageData); + } + } +} diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0100.cs b/src/JT808.Protocol/MessageBody/JT808_0x0100.cs index 6e8320b..94b83d0 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0100.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0100.cs @@ -1,4 +1,5 @@ -using JT808.Protocol.Formatters; +using JT808.Protocol.Enums; +using JT808.Protocol.Formatters; using JT808.Protocol.MessagePack; namespace JT808.Protocol.MessageBody @@ -27,21 +28,22 @@ namespace JT808.Protocol.MessageBody /// /// 制造商 ID - /// 5 个字节,终端制造商编码 + /// 2013版本 5 个字节,终端制造商编码 + /// 2019版本 11 个字节,终端制造商编码 /// public string MakerId { get; set; } /// /// 终端型号 - /// 20 个字节,此终端型号由制造商自行定义,位数不 - /// 足时,后补“0X00”。 + /// 2013版本 20 个字节,此终端型号由制造商自行定义,位数不足时,后补“0X00”。 + /// 2019版本 30 个字节,此终端型号由制造商自行定义,位数不足时,后补“0X00”。 /// public string TerminalModel { get; set; } /// /// 终端 ID - /// 7 个字节,由大写字母和数字组成,此终端 ID 由制 - /// 造商自行定义,位数不足时,后补“0X00”。 + /// 2013版本 7个字节,由大写字母和数字组成,此终端 ID 由制造商自行定义,位数不足时,后补“0X00”。 + /// 2019版本 30个字节,由大写字母和数字组成,此终端 ID 由制造商自行定义,位数不足时,后补“0X00”。 /// public string TerminalId { get; set; } @@ -64,9 +66,18 @@ namespace JT808.Protocol.MessageBody JT808_0x0100 jT808_0X0100 = new JT808_0x0100(); jT808_0X0100.AreaID = reader.ReadUInt16(); jT808_0X0100.CityOrCountyId = reader.ReadUInt16(); - jT808_0X0100.MakerId = reader.ReadString(5); - jT808_0X0100.TerminalModel = reader.ReadString(20); - jT808_0X0100.TerminalId = reader.ReadString(7); + if(reader.Version== JT808Version.JTT2019) + { + jT808_0X0100.MakerId = reader.ReadString(11); + jT808_0X0100.TerminalModel = reader.ReadString(30); + jT808_0X0100.TerminalId = reader.ReadString(30); + } + else + { + jT808_0X0100.MakerId = reader.ReadString(5); + jT808_0X0100.TerminalModel = reader.ReadString(20); + jT808_0X0100.TerminalId = reader.ReadString(7); + } jT808_0X0100.PlateColor = reader.ReadByte(); jT808_0X0100.PlateNo = reader.ReadRemainStringContent(); return jT808_0X0100; @@ -76,9 +87,18 @@ namespace JT808.Protocol.MessageBody { writer.WriteUInt16(value.AreaID); writer.WriteUInt16(value.CityOrCountyId); - writer.WriteString(value.MakerId.PadRight(5, '0')); - writer.WriteString(value.TerminalModel.PadRight(20, '0')); - writer.WriteString(value.TerminalId.PadRight(7, '0')); + if (writer.Version == JT808Version.JTT2019) + { + writer.WriteString(value.MakerId.PadLeft(11, '0')); + writer.WriteString(value.TerminalModel.PadLeft(30, '0')); + writer.WriteString(value.TerminalId.PadLeft(30, '0')); + } + else + { + writer.WriteString(value.MakerId.PadRight(5, '0')); + writer.WriteString(value.TerminalModel.PadRight(20, '0')); + writer.WriteString(value.TerminalId.PadRight(7, '0')); + } writer.WriteByte(value.PlateColor); writer.WriteString(value.PlateNo); } diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0102.cs b/src/JT808.Protocol/MessageBody/JT808_0x0102.cs index 189829e..97570ce 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0102.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0102.cs @@ -1,4 +1,5 @@ -using JT808.Protocol.Formatters; +using JT808.Protocol.Enums; +using JT808.Protocol.Formatters; using JT808.Protocol.MessagePack; namespace JT808.Protocol.MessageBody @@ -11,19 +12,54 @@ namespace JT808.Protocol.MessageBody public override ushort MsgId { get; } = 0x0102; /// /// 鉴权码 + /// 鉴权码内容 2019版本 /// public string Code { get; set; } + /// + /// 鉴权码长度 2019版本 + /// + public byte CodeLength { get; set; } + /// + /// 终端IMEI 长度15 2019版本 + /// + public string IMEI { get; set; } + /// + /// 软件版本号 长度20 后补 "0x00" 2019版本 + /// + public string SoftwareVersion { get; set; } public JT808_0x0102 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0102 jT808_0X0102 = new JT808_0x0102(); - jT808_0X0102.Code = reader.ReadRemainStringContent(); + if(reader.Version== JT808Version.JTT2019) + { + jT808_0X0102.CodeLength = reader.ReadByte(); + jT808_0X0102.Code = reader.ReadString(jT808_0X0102.CodeLength); + jT808_0X0102.IMEI = reader.ReadString(15); + jT808_0X0102.SoftwareVersion = reader.ReadString(20); + } + else + { + jT808_0X0102.Code = reader.ReadRemainStringContent(); + } + return jT808_0X0102; } public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0102 value, IJT808Config config) { - writer.WriteString(value.Code); + if (writer.Version == JT808Version.JTT2019) + { + writer.Skip(1, out int CodeLengthPosition); + writer.WriteString(value.Code); + writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - CodeLengthPosition - 1), CodeLengthPosition); + writer.WriteString(value.IMEI); + writer.WriteString(value.SoftwareVersion.PadRight(20,'0')); + } + else + { + writer.WriteString(value.Code); + } } } } diff --git a/src/JT808.Protocol/MessageBody/JT808_0x8004.cs b/src/JT808.Protocol/MessageBody/JT808_0x8004.cs new file mode 100644 index 0000000..b15fe7c --- /dev/null +++ b/src/JT808.Protocol/MessageBody/JT808_0x8004.cs @@ -0,0 +1,29 @@ +using JT808.Protocol.Formatters; +using JT808.Protocol.MessagePack; +using System; + +namespace JT808.Protocol.MessageBody +{ + /// + /// 查询服务器时间应答 + /// 2019版本 + /// + public class JT808_0x8004 : JT808Bodies, IJT808MessagePackFormatter + { + public override ushort MsgId { get; } = 0x8004; + + public DateTime Time { get; set; } = DateTime.Now; + + public JT808_0x8004 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x8004 value = new JT808_0x8004(); + value.Time = reader.ReadDateTime6(); + return value; + } + + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8004 value, IJT808Config config) + { + writer.WriteDateTime6(value.Time); + } + } +} diff --git a/src/JT808.Protocol/MessagePack/JT808MessagePackReader.cs b/src/JT808.Protocol/MessagePack/JT808MessagePackReader.cs index 7bfe262..f90012d 100644 --- a/src/JT808.Protocol/MessagePack/JT808MessagePackReader.cs +++ b/src/JT808.Protocol/MessagePack/JT808MessagePackReader.cs @@ -1,5 +1,7 @@ using JT808.Protocol.Buffers; +using JT808.Protocol.Enums; using JT808.Protocol.Extensions; +using JT808.Protocol.Interfaces; using System; using System.Buffers; using System.Buffers.Binary; @@ -15,6 +17,7 @@ namespace JT808.Protocol.MessagePack public ReadOnlySpan Reader { get; private set; } public ReadOnlySpan SrcBuffer { get; } public int ReaderCount { get; private set; } + public JT808Version Version { get; set; } private byte _calculateCheckXorCode; private byte _realCheckXorCode; private bool _checkXorCodeVali; @@ -31,7 +34,7 @@ namespace JT808.Protocol.MessagePack /// 解码(转义还原),计算校验和 /// /// - public JT808MessagePackReader(ReadOnlySpan srcBuffer) + public JT808MessagePackReader(ReadOnlySpan srcBuffer, JT808Version version = JT808Version.JTT2013) { SrcBuffer = srcBuffer; ReaderCount = 0; @@ -39,6 +42,7 @@ namespace JT808.Protocol.MessagePack _calculateCheckXorCode = 0x00; _checkXorCodeVali = false; _decoded = false; + Version = version; Reader = srcBuffer; } /// diff --git a/src/JT808.Protocol/MessagePack/JT808MessagePackWriter.cs b/src/JT808.Protocol/MessagePack/JT808MessagePackWriter.cs index d8d5558..490e7d1 100644 --- a/src/JT808.Protocol/MessagePack/JT808MessagePackWriter.cs +++ b/src/JT808.Protocol/MessagePack/JT808MessagePackWriter.cs @@ -1,4 +1,5 @@ using JT808.Protocol.Buffers; +using JT808.Protocol.Enums; using System; using System.Buffers; using System.Buffers.Binary; @@ -9,9 +10,11 @@ namespace JT808.Protocol.MessagePack public ref struct JT808MessagePackWriter { private JT808BufferWriter writer; - public JT808MessagePackWriter(Span buffer) + public JT808Version Version { get; set; } + public JT808MessagePackWriter(Span buffer, JT808Version version= JT808Version.JTT2013) { this.writer = new JT808BufferWriter(buffer); + Version = version; } public byte[] FlushAndGetEncodingArray() {