From bfa833ced96d866fb62396af63a4dcbab05e60d5 Mon Sep 17 00:00:00 2001 From: "MATRIX\\29620" <2962004889@qq.com> Date: Sat, 18 Jan 2025 13:41:57 +0800 Subject: [PATCH] no message --- .idea/.name | 2 +- charging_pile_proxy/commands/__init__.py | 18 + .../__pycache__/__init__.cpython-311.pyc | Bin 161 -> 1201 bytes .../__pycache__/command_19_1A.cpython-311.pyc | Bin 8318 -> 8637 bytes .../__pycache__/command_21_22.cpython-311.pyc | Bin 13917 -> 9384 bytes .../__pycache__/command_25.cpython-311.pyc | Bin 10196 -> 9728 bytes .../__pycache__/command_26_27.cpython-311.pyc | Bin 174 -> 16845 bytes .../command_heartbeat.cpython-311.pyc | Bin 9515 -> 8379 bytes charging_pile_proxy/commands/command_19_1A.py | 242 +++++++------ charging_pile_proxy/commands/command_21_22.py | 327 ++++++------------ charging_pile_proxy/commands/command_25.py | 299 +++++++--------- .../commands/command_heartbeat.py | 244 ++++++------- .../__pycache__/proxy_server.cpython-311.pyc | Bin 15297 -> 17731 bytes charging_pile_proxy/core/proxy_server.py | 155 +++++---- 14 files changed, 565 insertions(+), 722 deletions(-) diff --git a/.idea/.name b/.idea/.name index 11a5d8e..adc719b 100644 --- a/.idea/.name +++ b/.idea/.name @@ -1 +1 @@ -main.py \ No newline at end of file +command_07.py \ No newline at end of file diff --git a/charging_pile_proxy/commands/__init__.py b/charging_pile_proxy/commands/__init__.py index e69de29..232848b 100644 --- a/charging_pile_proxy/commands/__init__.py +++ b/charging_pile_proxy/commands/__init__.py @@ -0,0 +1,18 @@ +from .command_02 import Command02 +from .command_03 import Command03 +from .command_heartbeat import CommandHeartbeat +from commands.command_02 import Command02 +from commands.command_03 import Command03 +from commands.command_07 import Command07 +from commands.command_08 import Command08 +from commands.command_09 import Command09 +from commands.command_0A import Command0A +from commands.command_25 import Command25 +from commands.command_30 import Command30 +from commands.command_19_1A import Command191A +from commands.command_21_22 import Command2122 +from commands.command_23_24 import Command2324 +#from commands.command_26_27 import Command2627 + +__all__ = ['Command02', 'Command03', 'CommandHeartbeat','Command07','Command08','Command09', + 'Command0A','Command25','Command30','Command191A','Command2122','Command2324'] \ No newline at end of file diff --git a/charging_pile_proxy/commands/__pycache__/__init__.cpython-311.pyc b/charging_pile_proxy/commands/__pycache__/__init__.cpython-311.pyc index 47800dfd8cbacd141f739d276050c13b4e0613be..1c28149f323a7237986588c9ea69cfc0c5587d75 100644 GIT binary patch literal 1201 zcmc&yzi-n(6uyg{IF94|Ahe~h025w9d~VeSRY(yGu&}V5BArYfrABv2&LUt)3*jfzm&*VB_lUK zCHaCP6k(18rWh+;;T2&}1GvFWQKePMO_@{6a!i?HWjSV4<#l0G8**yAAsp%ew|G;y z)CFGWEzzcJ;5P4wF6{zu@Oz?1d%zujU+mF6;7z_S4(I`Jmp>4P^bn&didtVWeHgXh zBd>FfW$_+P?N@Ul!dWyRMG;8R$(%QnFj;+=gsW@ScQNavC{BxFSQMjzAjbs}45VqAL0;19Idw6ZtDpVk)RAuoTo4*b3AyOB@AF1+IdYg0_Tr-lMc}{-;?s zAaGP65Wul%H_y1pyM~+6UKU^W^MnD>1p{611PawTr%=7l8A3}sX9Rs}9C8fJYn)&J z6G`{)bm0$~KY~eVOyV;_V1ha`VB`oUn_7&8oHOd3)ZF?x_2YH8g?k&p?~`VvIk3j?sFhUuh*?^4c3@Hr344RC7D;bKIfc(!O$zLWe hRxy*km~9kUfjp4lC}IYR0RZbY5jg+= diff --git a/charging_pile_proxy/commands/__pycache__/command_19_1A.cpython-311.pyc b/charging_pile_proxy/commands/__pycache__/command_19_1A.cpython-311.pyc index 263e5cafbe38040aaa3b50f1d70420e0b345d742..4e2dcc92e9b276d4948c386c7b4c0028999b38b3 100644 GIT binary patch literal 8637 zcmcIpeQX=Ym0xm~pBhTk7e#$pa;VB?VoChaw-p~`+45JcB6Zqa949=QOIuPTN?DSz zB`kev>gzFyeU?)dRvkO0QYBW-X{!T#Ii+!cT&`F2?yp^80TGKcP~b{A`cH;apzvS! zW>)-IiE5n#I$XY;dGqGY?9A+Yzc+i^Vlh*Ykl~%P|5-s%|BDOh#B5|9oq^0Xiltc1 z2z64qYffsQtR2ygYENo4l$JU~vGhfXWj@kU)E)RM=_JkSE>b6%ppMnQMz|c(QbFb; zsJ@dHqBNlS1o=A+YnVIW)W}BG9|=Z=MuUNj9Awg(AMJ+1H7ZEqah%k$8t8>)wYV?V z#Og0x*C-Pe$vh5WV&5}Ykku+a!^!}@fdHEbRW-aMeq#F}$^iop!9=4=l!I#QI@0s4&TJX-*A zh^2Ges$UP5$w~85nTcnmer31b(W{R0( z1u?`MSnGQXTg)5T5^^_@dns=w_cFd<<@)7qa#nbgW3V3oF%R`Zs;J2h9PhA+$~!xx>P z98|=XoreaB8;Ds|I}pE(B(b%T>U5r>c&mB_^66L2*p6@8`X!1r#;g~tc%Lh|bDDG1 zdHN;loW@xfwZmAxzWwvn_ov-mhf|m5*510idhQ5I}FaNT;ehsrYY#r7xd4$Q)zm4Jt$K4R^sioViiF>JgSN^bc zdG!}Re=zsUfi?Vgui+PWQrmNQ4bRyces$LbFc@oiDP-E!%0AXK!QBJ*`p25?H9YaM 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 G^8WxC8sSX< literal 8318 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 diff --git a/charging_pile_proxy/commands/__pycache__/command_21_22.cpython-311.pyc b/charging_pile_proxy/commands/__pycache__/command_21_22.cpython-311.pyc index 8888ba118326183947c1d3c3bc5d533b615b0be4..190768e80df06b4e6543e1fa43b069e69f3d0334 100644 GIT binary patch literal 9384 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 literal 13917 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 DT2h9z literal 10196 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 diff --git a/charging_pile_proxy/commands/__pycache__/command_heartbeat.cpython-311.pyc b/charging_pile_proxy/commands/__pycache__/command_heartbeat.cpython-311.pyc index a2ecbac7c971ce4c4a805e6a2c685dc71aaac1ac..bb77b8ca2691c443c5897a62007bdbe26bef9b57 100644 GIT binary patch literal 8379 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 IGCb7(0s6({bN~PV literal 9515 zcmbVRd2ka~ns42QTb6uZ*p|To#9`z+Hju;zN4PSXFtfo0qX>6nn_$_~k_O|E7*7U* z;&FnLF+r0UA~GB%0pe^(;*exQb~lrmt=g(?S689xDypd3NJf9HQzTVXsgUBgbB@-8w26|`C#AUz(%*%@6uNXv z*3@Ry)GG;Ebs3tyn`lgQ8E8XDoRQ3mCum)IYXz}nKN&TR=UhC6O1UE z(x-D31afIp$h?@0^zmo5q!iD63^8oHr#n?dV$B}Z0rxCH6SyZ`N=k8p=u+X1 zbg3y7Pz|L9s--kQb(9vUp3;F#y+C#h^!Gbml)c^FvAsJX5BtDfQ^Ehiav-qx3LoKs zloTi>$L1tv_t(Y~6pj&pXuT z>Tx(-&LhX%eeV6;y-ubFIfH#iXvZKkFm!BxTpAR{#rD!p#&eK%dTIub33`X4&(-H~ zIED*S=Tnnl>!34tK9CV2Tv`!OkD23-fH`1(0DPibR$9p56vU|qG&pqw;gP3G5I#lv z7Ey}lQ2^mC^(iPNr8=oB5%Wku`B4txCZSA~!q-TAX01mo$2tUYSRMnV_27`>;c((L zT+sKM#5ra9XcPo)tOs`@9w_}kFAGL(pp2$l%K=?dr}w2G_JKC}bB^bXy)8YDDvlCEs(r*!MVf{cXSPc# zE%7NsDf*Zg8$qNWe2eLFnw(Of@$c3t^JOho$47z|IQ`}{dCPoesyw-$unKwSR6jbC z3TRQ8*1`&$sw9V64tl)e+=3lS>$e)(Jd$h!{i2kWNzPJI#t!~tE9o=(vV0`9YEu0S zu|OZ5_2;JPgM6(~t374Oz47Iyuf$@jx`Z6tKY!kc`j&e<7tb)zI7lTm&bG#T0>)>w z#>4$9e~O+Thg&Op;cDcI-`)TCgUG9&fAi@@qgk=2YPCv&Bjc|?<;eB3k&`pg!0USkT(n#@mJI`8@U)I0d4Occ zvkV>v-gQ9aE+R8mqM^?spPl|@=H=-1Kh0gZ@jsu9MP7L;a^?3@@2%E7UVLAr(WRHf z@M>TXGR3e;j0O2Iyoh4R6IAvF>IcPoc-Fzw`h%i1RsejPMlkevU2q>#^pK!&dz>Cx zFp3X{haU0>hNA<_^N#)jiWaivq*&xd*d)z*~^vBQwmkuPv&fbiMPTha+ zMPTIsOYS3jW;%B2G;s0KgFdZHIV8lPS*_9lTCGea@P^ga)%GC<4NjSeE`lX}!7!ye^Mm#HAA#%k3?K z7P68_DigW*{{5Sm;p^LLkn8x;2`aygxnt5!!O0Tom&NNMlwaS%q><-Cl;FU7omlDf*Wg4DaSOFWlKY}-9gqY8M+)x}b=Z-hLbZqQcux|8t z;CLuMA}2t_y4# zuMet&heC(KWtD94b5ab^a&mfwoSf;Dled2*C)vGSaysxNbX`&&{OP1#OqMQ#-j`Jb zcHb>14YqIvkMISL%o91LK7~Zb74u3J*EN9UsM|4{6*h^P5xGC+^JCg&DLhxu}Srxn>3I~v*Yk^z)SRj5iXNV zJ1!l4f?cBwrC52;Djui|dk^roG9+7SiCXyd5r<`KE*(9IZ5EZDX-zIIomyb&rCKr> zvr$nhN_|A#ulB1!qB;b2*TRs|M&na0z5=P%)nVD6Kn$7CH~&i+J#5NK1ET{i8i) zN&%Z(<=6U@l%6uATEk$I==?gL)~6c=@bA}->6g^349Ay(@E`(;2g;Z^vb54Hkczly zK}g^KMG<~#FJ#(EWoRQK4z}tBzuto|BOVURmMoR+S)1U3 zmSwot78^NO5(dBiIIK8W5@IUFk}!K;0%o%aL0X z3yg_0LrRta4YwCmjlg|dS*KM@{Q>E6Om7E!F(d4Z?#HjTjWPxJQ=z1Ndkb2 ztk{_^BDXFBOAErJp?mRVNUlf9m=loSRwx({PC6L|K%*8c3V^Q62583MVZdwyBB)#g zM*%{57;m>nP!Br0pJ!UIuocNhB%6?IM)DYv)kxMOsRtrxM8L|RSCg?JX+Y8l#AXly zF4GKYL30S~JDO?2LhP5>A#%HW>F(zR#X+VMvTi((WT+_t&59n{MKiF(;G9fiO$S4} z2M1hkdU$Ob==|}@&tM<_3+E34P#XZy{PI_KPV5Y936nXeca81}7I0)GPgb&IWrCAG zS;>($p0u%~Ex{}2$W=VKiX~SiIQbk|!IKp%Spnb^gl?SJ80dtX+_VOorN(e>>DhI! zt$Vd*q9)K0CM~CTj_y3Coy-b78LnP+ar>0#!c)`F+}w9t^&dKk(S7ak%!<#}e5+BG zY*lwc#6Y-Y)3 z5p~%^jaORUZn?1W;zl+X;F_HyYk9JkC2Pgv#!K}f?}gTjt!!?i6lJ&<$tw;Pyt-*( z6YR&sh#6px60uH##KBDa=PPEMpRD|BC0p7Kks~{JvV$c%7UCEUv_u?J3~KPgHtjY8 z@wLIYU8(vyuX@{N)z_OfkWRxSc*BX9WF_bfViNHD0c&B%LE;0&Phz%$e zc!6a!0={KAO{w7~(j>i2aB}0_q)X*2^aN6R@w}Grdx8+pYgJkwGRmL~skd$BeYnJV zt?;Xk18%|39hgcvuZ>Pf z&$44D?jsW20b9L@VWJZsMFP{(HDG1%Uh~4&G{TBbB=Hzsm$)p>za#lLtfF1LSM)Q; zQ;Pc;;{Fwzj@bf2q%&|0qy%-J>(GF7FecALwR9%pIVfa_HZtYFxl0G28ixTvI{WhB zdrCL$c01C{?5eaAZ?P&TL5llBAb8GY8%p2<%AL~M+0xqSYOb`IFKrI&yk{b$gcT z-?B82PJ2gjKgD<#>mnjjUgBg-Z9dEl_CD&myCaghOsA)Dd^ry?!b>c`bVS^!+cUIzNh>0{4G};w zD}Y>82r6*A*;LX?B)Ss~;zB$6or7-FgT%|j*ddeQl3M7qn}ka4eL&z%u@HG>;aqDt zw|ub(d@PzTF%=l+2_ON({4y}WPy0vx!Jo0!9n)SQa^%dNyt$LrcQUA;X&NivDu{qG zHFi?_qgtv5Ej7S*3*#bMn&mwT0%f&{YiWvmb%BbaV;M9wrOHz3nOX-N@rx)as!8;Z zH)11i#MK0W>iy4eKu%JSi&p^U&b@L<%-#R!B&Z9Pi5d+a>-R%*pWcj)UKER?Z%sr; zu-K-}&?e?zKrHht64WNqi7e@hm<9;0q@b z+yeKnfsDw%d8JZQ31@VI=(j2~fT>dGPn34#$b?c9Xy8DXNlk%f3*gQaT4UC<17~q6 zjSGi_v+Q^Fx!}wHPa4{+jgMOG9aek2wYJ&X1Q8Oo*7_!^y~*0xY_->lrFLs=iZmO@Xt#7h7H8zXN zWwf`anuD!23$qi~S2T6d(3O_E8&kV+mbydCKtH&q%w7 z_7Q`dD(DktP13$%4q+)CBI4%$px-3v$775Oc<4)UX8{GLsX`GZOe5kiOk|IUzc67Q z5r6Z58x^=qOFzDq%Dzjl@`RR9lY!w`RSByqxtCXbcJphS*(x`e=i&1_BfG#@$S;w2 z6qiTydGyGxd!~}W{+E6+_KT6NP^`(iqpqA)SB6MVy`EREXVvS`!YDnv`?cNd@&+!y zk 2025-01-09 12:15:44 + """ - # 提取时间标识 - time_bytes = data[14:20] - year = time_bytes[0] + 2000 - month, day, hour, minute, second = time_bytes[1:6] - timestamp = f"{year:04d}-{month:02d}-{day:02d} {hour:02d}:{minute:02d}:{second:02d}" + def bcd_to_int(byte): + """BCD转换为整数""" + return ((byte >> 4) * 10) + (byte & 0x0F) - # 解析充电参数 - current_index = 20 - charging_voltage = struct.unpack(" 25 -> 2025年) + month = bcd_to_int(time_bytes[1]) # BCD月 (0x01 -> 1月) + day = bcd_to_int(time_bytes[2]) # BCD日 (0x09 -> 9日) + hour = bcd_to_int(time_bytes[3]) # BCD时 (0x0C -> 12时) + minute = bcd_to_int(time_bytes[4]) # BCD分 (0x16 -> 22分) + second = bcd_to_int(time_bytes[5]) # BCD秒 (0x12 -> 18秒) - charging_current = struct.unpack("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 L{`*y|g7g0Y`BK+z delta 3869 zcmb_f4NP0t6~6EJAN=!-4Sojy@e{BgggOQT$!LH;fVGUD&;*iY0_x`yQZU)G6SB(0 z>y%Y$mrPD?vZYNXd0W*bU6w^+m9ll&R85<*smg3*&6c%nXd0a=MVg~EQZ-H5&V7yn zGf?)^tNXrp?mg#z@7#OeJLkS%yhgphp#7dkQ-q+L_r5kgRDVIsQV%ZF{jz~aynfa` z=Q!e^5RLi}Uvd`lhPP>iz7JQf9I51~QRFgWHN|Pv-ScyEQvu$+&)waR`>0Dg7nLb~ z-05lYwBp}WFt13bsN^k zX5_Oo!H_>7*zkz z3(I)vQ!k7A(E zJf`T`W=*tPP)wWMT;P2etb4*>W{bfS9pWS!C=^%#3jGr(N;XpzukA@p1AA3l8`xRk zx;DRMyaDKqSEPJt0mUPmxmcICi81-@E;&UBweWK3*Hk5-s&OvL!*Zc0EC-b#uL?`r zK`byff^jK+$7Iwi7L{9Q&UEP5qww}EsuqjFG#G5*0={EcnaTnbZ(3A`iv^lzK{hXH z!gQ>Z%+$!2ht*dQUlCRSTEazuR(S0##w+Ms%0+F#GDz`|!&+RHcR6Mf9X#jIDNqd(-dWTYkgt7Lyba>lovKDAM8d-3lJC?4f1v|L zXhQqPe!CiQx`|D~q}_I^xhqIoG>DEuhnq!)Sqm*m$SL z6RCoSufBEmFVR;V?p^(k)eCq2{N7uC{pq<6FWvg^{LR%@zPftz$9o(nH=232HT#H! zoC4dX?QKacIa%=h*6ocUiWL&KZEvgEY`c4V+j5wqx3r(Dune|W1@B-Pv zjBeT=nh4JOUWD6B;Dz~&H0TfT8xoJ0b4a?$B_1&?Jp)Y_1KH=it5>1O@!^E44VQ3@ z)G+Si%v3%8JlAge1Ehp6qpWn4Qq`wR$}ToMM17Q|9N*+BWND*0x*vbQJr!Z?v6|N- z(a3$)epMacap-Q%Z=Jt!{+j!Mg9g+DJCi{0t z@uR8n$>s6M#Q5`(;h&&rXp@|ra1>_|C#mz}){XMfV!A2*P?Vyn7( zJY{QJwzb_hCTx3?w!P85w8@r5RB0!bZtJ)#y{d@?608?ko@%;rJk{90+}MBDnrIwL zHjX8j`l$NyT$*dV!KJvKWv(X@-#?b%#*^H5f~kuZU49nEIXt(XOL_-V-qB_6Xu^9i z={*>?AB?KgdwS!R$+)G3)Pc#UD(!5JS3Vsx#0 zkKzkV*|;IWc$17b&Umv*#9A(fVM+Am;&+xEqLIOr|NgS#SNQMv$)f`_V$4~jQq`}+ zDvr5r*86IGykyr84A(}km)$4>5o$v1Nvb_@wFm#qT^m`^!JH^fZJM#BnCfMwI>GEn zGCShTjGAoQz~zq{LJ8zxHe zyiO8R?z|2t9@&K+{BSo%C6+9E-jzj20uihP)?J>1W=7_l^-l?62p3~@rih;j`sM=x zzb~|TKAkYYCCND_x}*$-=1&lhf+RcVpA3;7x?i$%ADa@UA%_gl%;MorJ^c@aeVu<~ zcY^7lODdGYT_A@M!6ZufNEhdBAR<{AL0n&PwR%YNReCOoY| ziTE4>=LxJi@ONeV+&q7B*1uP{0tyPQ;2d7*9$=c{sG#D>o&X;1sloSpnsK(r&{=d+ TLN#U4*7#8D|9Bg%`22qXCyhiD diff --git a/charging_pile_proxy/core/proxy_server.py b/charging_pile_proxy/core/proxy_server.py index 5211e85..9e6ae74 100644 --- a/charging_pile_proxy/core/proxy_server.py +++ b/charging_pile_proxy/core/proxy_server.py @@ -1,9 +1,9 @@ import socket import logging import threading -from .utils import ProxyUtils # 使用相对导入 -from .mqtt_client import MQTTClient # 使用相对导入 -from commands.command_heartbeat import Command0B0CH +from .utils import ProxyUtils +from .mqtt_client import MQTTClient +from commands.command_heartbeat import CommandHeartbeat from commands.command_02 import Command02 from commands.command_03 import Command03 from commands.command_07 import Command07 @@ -15,7 +15,7 @@ from commands.command_30 import Command30 from commands.command_19_1A import Command191A from commands.command_21_22 import Command2122 from commands.command_23_24 import Command2324 -from commands.command_26_27 import Command2627 +#from commands.command_26_27 import Command2627 @@ -34,7 +34,7 @@ class ChargingPileProxyServer: self.mqtt_client = MQTTClient() self.pile_ids = {} self.utils = ProxyUtils() - self.command_handler = Command0B0CH() + self.command_handler = CommandHeartbeat() self.command_handler = Command02() self.command_handler = Command03() self.command_handler = Command07() @@ -46,7 +46,7 @@ class ChargingPileProxyServer: self.command_handler = Command191A() self.command_handler = Command2122() self.command_handler = Command2324() - self.command_handler = Command2627() + #self.command_handler = Command2627() # 存储登录信息的字典,以桩号为键 self.login_info = {} @@ -131,80 +131,115 @@ class ChargingPileProxyServer: if len(data) >= 14 and data[0:2] == b'JX': command = data[2] # 提取命令字节 + # 获取本地和远程端口信息用于日志 + source_local, source_remote = self.utils.get_socket_info(source_socket) + dest_local, dest_remote = self.utils.get_socket_info(destination_socket) + # 根据命令字节处理不同命令 - if command == 0x01: - logging.info(f"处理 01H 命令,数据内容: {data.hex()}") - self.command_handler.parse_01h(data) + if command == 0x01: # 01H命令 + logging.info(f"收到01H连接请求命令: {data.hex().upper()}") + if self.command_handler.process_and_respond(data, destination_socket): + logging.info("01H命令处理完成") + continue # 跳过后续转发 - elif command == 0x02: - logging.info(f"处理 02H 命令,数据内容: {data.hex()}") - self.command_handler.parse_02h(data) + elif command == 0x03: # 03H登录命令 + logging.info(f"收到03H登录命令: {data.hex().upper()}") + self.command_handler.process_03h(data) - elif command == 0x03: - logging.info(f"处理 03H 命令,数据内容: {data.hex()}") - self.command_handler.parse_03h(data) + elif command == 0x0C: # 0CH桩心跳命令 + logging.info(f"收到0CH心跳命令: {data.hex().upper()}") + if self.heartbeat_handler.process_and_respond(data, destination_socket): + logging.info("0CH心跳命令处理完成") + continue # 跳过后续转发 - elif command == 0x07: - logging.info(f"处理 07H 命令,数据内容: {data.hex()}") - self.command_handler.parse_07h(data) + elif command == 0x19: # 19H卡鉴权命令 + logging.info(f"收到19H卡鉴权命令: {data.hex().upper()}") + if self.card_auth_handler.process_and_respond(data, destination_socket): + logging.info("19H卡鉴权命令处理完成") + continue # 跳过后续转发 - elif command == 0x08: - logging.info(f"处理 08H 命令,数据内容: {data.hex()}") - self.command_handler.parse_08h(data) - elif command == 0x09: - logging.info(f"处理 09H 命令,数据内容: {data.hex()}") - self.command_handler.parse_09h(data) + elif command == 0x21: # 21H启动充电结果命令 - elif command == 0x0A: - logging.info(f"处理 0AH 命令,数据内容: {data.hex()}") - self.command_handler.parse_0Ah(data) + logging.info(f"收到21H启动充电结果命令: {data.hex()}") - #其他命令待添加... + if self.charge_result_handler.process_and_respond(data, destination_socket): + continue # 跳过后续转发 + + elif command == 0x23: # 23H充电订单命令 + logging.info(f"收到23H充电订单命令: {data.hex().upper()}") + if self.order_handler.process_and_respond(data, destination_socket): + logging.info("23H充电订单命令处理完成") + continue + + + elif command == 0x25: # 25H充电信息命令 + + logging.info(f"收到25H充电信息命令: {data.hex()}") + + if self.charge_info_handler.process_25h(data): + logging.info("25H命令处理完成") + + elif command == 0x30: # 30H BMS信息命令 + logging.info(f"收到30H BMS信息命令: {data.hex().upper()}") + if self.bms_handler.process_30h(data): + logging.info("30H BMS信息命令处理完成") else: - # 未知命令,日志记录 - logging.warning(f"未知命令:{command:02X},数据内容: {data.hex()}") + # 未知命令,记录日志 + logging.warning(f"未知命令:{command:02X},数据内容: {data.hex().upper()}") - # 将数据转发到远程或充电桩,判断方向 - if source_socket not in self.remote_connections.values(): - # 这里是判断是否是客户端连接,进行桩ID提取 - pile_id = self.utils.extract_pile_id(data) - if pile_id: - self.pile_ids[source_address] = pile_id + # 如果数据来自客户端连接,提取桩号 + if source_socket not in self.remote_connections.values(): + pile_id = self.utils.extract_pile_id(data) + if pile_id: + self.pile_ids[source_address] = pile_id - # 获取本地和远程端口信息 - source_local, source_remote = self.utils.get_socket_info(source_socket) - dest_local, dest_remote = self.utils.get_socket_info(destination_socket) + # 判断数据发送方向:是发送到远程服务器还是充电桩 + is_to_remote = destination_socket in self.remote_connections.values() + direction = "发送到远程服务器" if is_to_remote else "发送到充电桩" + mqtt_direction = "u" if is_to_remote else "d" - # 判断数据发送方向:是发送到远程服务器还是充电桩 - is_to_remote = destination_socket in self.remote_connections.values() - direction = "发送到远程服务器" if is_to_remote else "发送到充电桩" - mqtt_direction = "u" if is_to_remote else "d" + # 发送数据到目的地 + destination_socket.send(data) - # 发送数据到目的地 - destination_socket.send(data) + # 记录数据转发日志 + msg = (f"数据转发成功: {direction} | " + f"本地地址: {source_local} | " + f"远程地址: {dest_remote} | " + f"命令: {command:02X}H | " + f"数据长度: {len(data)}") + logging.info(msg) + self.mqtt_client.publish_message(msg) - # 记录数据转发日志 - msg = f"数据转发成功: {direction} | 本地地址: {source_local} | 远程地址: {dest_remote} | 数据长度: {len(data)}" - logging.info(msg) - self.mqtt_client.publish_message(msg) + # 记录完整的数据内容到调试日志 + logging.debug(f"完整数据内容: {data.hex().upper()}") - # 每次数据转发完成后,处理其他相关操作 - # 例如检查是否需要断开连接等 - if not self.running: - break + # 每次数据转发完成后,检查连接状态 + if not self.running: + break + + except ConnectionResetError: + logging.error(f"连接被重置: {source_remote}") + self.mqtt_client.publish_message(f"连接被重置: {source_remote}") + + except socket.timeout: + logging.error(f"连接超时: {source_remote}") + self.mqtt_client.publish_message(f"连接超时: {source_remote}") except Exception as e: - # 异常处理,日志记录错误信息 logging.error(f"转发数据出错: {str(e)}") - print(f"转发数据出错: {str(e)}") self.mqtt_client.publish_message(f"转发数据出错: {str(e)}") - # 若需要,可以选择关闭连接 - if source_socket: - source_socket.close() - if destination_socket: - destination_socket.close() + + finally: + # 关闭连接 + try: + if source_socket: + source_socket.close() + if destination_socket: + destination_socket.close() + except Exception as e: + logging.error(f"关闭连接出错: {str(e)}") def handle_client(self, client_socket, client_address): """处理客户端连接"""