From 56189f93858d1228705cc3dcfae0fc77f3c74231 Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: Sat, 11 Oct 2025 16:23:30 +0800
Subject: [PATCH] 调整tcp和http多服务业务
---
ard-work/src/main/java/com/ard/work/domain/dto/BoxPhotosDTO.java | 3
ard-device/src/main/resources/mapper/ArdCameraMapper.xml | 6
ard-work/src/main/java/com/ard/work/mapper/ArdDroneInfoMapper.java | 2
ard-work/src/main/java/com/ard/work/service/impl/TyServiceImpl.java | 227 +++-
ard-work/src/main/java/com/ard/work/component/netty/TyTcpClientManager.java | 157 +++
ard-work/src/main/resources/mapper/ArdDroneInfoMapper.xml | 5
ard-admin/src/main/java/com/ard/web/controller/work/UavBaseController.java | 6
ard-work/src/main/java/com/ard/work/domain/receiver/BoxInfoReceiver.java | 1
ard-work/src/main/java/com/ard/work/component/forest/TokenInterceptor.java | 13
ard-work/src/main/java/com/ard/work/component/forest/TyClient.java | 30
ard-work/src/main/java/com/ard/work/service/impl/ArdServerServiceImpl.java | 92 +
ard-work/src/main/java/com/ard/work/service/IArdServerService.java | 10
ard-admin/src/main/resources/resources_zh_CN.properties | 1074 +++++++++++++++++++++
ard-admin/src/main/resources/resources_en_US.properties | 1071 +++++++++++++++++++++
ard-work/src/main/java/com/ard/work/service/impl/ArdDroneServiceImpl.java | 7
ard-device/src/main/java/com/ard/device/camera/domain/ArdCamera.java | 7
ard-work/src/main/java/com/ard/work/component/netty/TcpClientSession.java | 6
ard-admin/src/main/resources/application.yml | 8
基于六合边缘服务器数据流程.png | 0
ard-work/src/main/java/com/ard/work/service/IArdDroneService.java | 2
ard-work/pom.xml | 4
/dev/null | 81 -
ard-work/src/main/java/com/ard/work/component/netty/handler/ClientHandler.java | 68
ard-admin/src/main/resources/application-prod.yml | 32
ard-work/src/main/java/com/ard/work/service/ITyService.java | 4
25 files changed, 2,661 insertions(+), 255 deletions(-)
diff --git a/ard-admin/src/main/java/com/ard/web/controller/work/UavBaseController.java b/ard-admin/src/main/java/com/ard/web/controller/work/UavBaseController.java
index c5cf605..6a97548 100644
--- a/ard-admin/src/main/java/com/ard/web/controller/work/UavBaseController.java
+++ b/ard-admin/src/main/java/com/ard/web/controller/work/UavBaseController.java
@@ -34,9 +34,9 @@
@ApiOperation("获取六合token信息")
@ApiOperationSupport(order = 1)
- @GetMapping("/getToken")
- public AjaxResult getToken() {
- return AjaxResult.success(tyService.getAccessToken());
+ @GetMapping("/getToken/{serverId}")
+ public AjaxResult getToken(@PathVariable("serverId") String serverId) {
+ return AjaxResult.success(tyService.getAccessToken(serverId));
}
@ApiOperation("获取六合盒子列表")
diff --git a/ard-admin/src/main/resources/application-prod.yml b/ard-admin/src/main/resources/application-prod.yml
index dd9c138..24a7827 100644
--- a/ard-admin/src/main/resources/application-prod.yml
+++ b/ard-admin/src/main/resources/application-prod.yml
@@ -32,18 +32,6 @@
# 加载全局的配置文件
configLocation: classpath:mybatis/mybatis-config.xml
-# 六合服务器配置
-tianyu:
- # 六合http服务器地址
- # endpoint: 192.168.1.97:8060 # 哈尔滨环境
- endpoint: 112.98.104.134:8060 # 大庆环境
- accesskeyid: wuwuwu
- accesskeysecret: 9c9f139f63b343b0a9ef42e05ed29b0b
- # 六合tcp服务器地址
- # tcpserver: 192.168.1.97 # 哈尔滨环境
- tcpserver: 112.98.104.134 # 大庆环境
- tcpport: 8126
-
# 地图资源配置
geoserver:
deviceCoordinateType: WGS84
@@ -63,9 +51,9 @@
# MinIO
minio:
- url: http://192.168.1.3:9001
+ url: https://192.168.1.3:9001
accessKey: admin
- secretKey: xzx12345
+ secretKey: ard12345
bucketName: kmz
#上云API
@@ -80,7 +68,7 @@
mediamtx:
apiHost: 192.168.1.3
playHost: 192.168.1.3
- https: false
+ https: true
# mqtt配置
mqtt:
@@ -90,4 +78,16 @@
username: admin
password: public
client-id: ard-uav
- inbound-topic: sys/product/+/status,thing/product/+/requests
\ No newline at end of file
+ inbound-topic: sys/product/+/status,thing/product/+/requests
+
+# oss配置
+oss:
+ enable: true
+ provider: minio
+ endpoint: https://192.168.1.3:9001
+ access-key: admin
+ secret-key: ard12345
+ bucket: cloud-bucket
+ expire: 3600
+ region: us-east-1
+ object-dir-prefix: wayline
diff --git a/ard-admin/src/main/resources/application.yml b/ard-admin/src/main/resources/application.yml
index 3405d58..d55c1bd 100644
--- a/ard-admin/src/main/resources/application.yml
+++ b/ard-admin/src/main/resources/application.yml
@@ -44,7 +44,7 @@
# 令牌密钥
secret: abcdefghijklmnopqrstuvwxyz
# 令牌有效期(默认30分钟)
- expireTime: 10
+ expireTime: 720
# 是否允许账户多终端同时登录(true允许 false不允许)
soloLogin: true
@@ -135,7 +135,7 @@
# 数据库索引
database: 0
# 密码
- password: 123456
+ password:
# 连接超时时间
timeout: 10s
lettuce:
@@ -164,5 +164,5 @@
# 激活配置文件
profiles:
- active: prod-druid,prod
- #active: dev-druid,dev
\ No newline at end of file
+ #active: prod-druid,prod
+ active: dev-druid,dev
\ No newline at end of file
diff --git a/ard-admin/src/main/resources/resources_en_US.properties b/ard-admin/src/main/resources/resources_en_US.properties
new file mode 100644
index 0000000..79be990
--- /dev/null
+++ b/ard-admin/src/main/resources/resources_en_US.properties
@@ -0,0 +1,1071 @@
+# FunctionList
+FUNCTIONLIST=FunctionList
+REALPLAY=RealPlay
+CAPTURE_PICTURE=Capture Picture
+MULTIREALPLAY=MultiRealPlay
+DOWNLOAD_RECORD=Download Record
+ITS_EVENT=TrafficEvent
+TALK=Talk
+DEVICESEARCH_DEVICEINIT=DeviceSearchAndInit
+PTZ=PTZ Control
+FACERECOGNITION=FaceRecognition
+ALARM_LISTEN=Alarm Listen
+DEVICE_CONTROL=Device Control
+AUTOREGISTER=AutoRegister
+REMOTE_OPEN_DOOR=Remote Open Door
+
+ONLINE=Online
+
+# Login Info
+DEVICE_IP=Device IP
+DEVICE_PORT=Port
+USERNAME=UserName
+PASSWORD=Password
+IP=IP
+
+LOGIN=Login
+LOGOUT=Logout
+
+LOGIN_SUCCEED=Login Succeed
+LOGIN_FAILED=Login Failed
+DISCONNECT=Device disconnect
+DISCONNECT_RECONNECTING=Device disconnect, reconnecting
+PROMPT_MESSAGE=Prompt Message
+ERROR_MESSAGE=Error Message
+
+SUCCEED=Succeed
+FAILED=Failed
+
+PLEASE_INPUT_DEVICE_IP=Please input device IP
+PLEASE_INPUT_DEVICE_PORT=Please input device port
+PLEASE_INPUT_DEVICE_USERNAME=Please input userName
+PLEASE_INPUT_DEVICE_PASSWORD=Please input password
+PLEASE_INPUT_CONFIRM_PASSWORD=Please input confirm password
+
+# Error Info
+NET_NOERROR=No error
+NET_ERROR=Unknown error
+NET_SYSTEM_ERROR=System error
+NET_NETWORK_ERROR=Protocol error it may result from network timeout
+NET_DEV_VER_NOMATCH=Device protocol does not match
+NET_INVALID_HANDLE=Handle is invalid
+NET_OPEN_CHANNEL_ERROR=Failed to open channel
+NET_CLOSE_CHANNEL_ERROR=Failed to close channel
+NET_ILLEGAL_PARAM=User parameter is illegal
+NET_SDK_INIT_ERROR=SDK initialization error
+NET_SDK_UNINIT_ERROR=SDK clear error
+NET_RENDER_OPEN_ERROR=Error occurs when apply for render resources
+NET_DEC_OPEN_ERROR=Error occurs when opening the decoder library
+NET_DEC_CLOSE_ERROR=Error occurs when closing the decoder library
+NET_MULTIPLAY_NOCHANNEL=The detected channel number is 0 in multiple-channel preview
+NET_TALK_INIT_ERROR=Failed to initialize record library
+NET_TALK_NOT_INIT=The record library has not been initialized
+NET_TALK_SENDDATA_ERROR=Error occurs when sending out audio data
+NET_REAL_ALREADY_SAVING=The real-time has been protected
+NET_NOT_SAVING=The real-time data has not been save
+NET_OPEN_FILE_ERROR=Error occurs when opening the file
+NET_PTZ_SET_TIMER_ERROR=Failed to enable PTZ to control timer
+NET_RETURN_DATA_ERROR=Error occurs when verify returned data
+NET_INSUFFICIENT_BUFFER=There is no sufficient buffer
+NET_NOT_SUPPORTED=The current SDK does not support this funcntion
+NET_NO_RECORD_FOUND=There is no searched result
+NET_NOT_AUTHORIZED=You have no operation right
+NET_NOT_NOW=Can not operate right now
+NET_NO_TALK_CHANNEL=There is no audio talk channel
+NET_NO_AUDIO=There is no audio
+NET_NO_INIT=The network SDK has not been initialized
+NET_DOWNLOAD_END=The download completed
+NET_EMPTY_LIST=There is no searched result
+NET_ERROR_GETCFG_SYSATTR=Failed to get system property setup
+NET_ERROR_GETCFG_SERIAL=Failed to get SN
+NET_ERROR_GETCFG_GENERAL=Failed to get general property
+NET_ERROR_GETCFG_DSPCAP=Failed to get DSP capacity description
+NET_ERROR_GETCFG_NETCFG=Failed to get network channel setup
+NET_ERROR_GETCFG_CHANNAME=Failed to get channel name
+NET_ERROR_GETCFG_VIDEO=Failed to get video property
+NET_ERROR_GETCFG_RECORD=Failed to get record setup
+NET_ERROR_GETCFG_PRONAME=Failed to get decoder protocol name
+NET_ERROR_GETCFG_FUNCNAME=Failed to get 232 COM function name
+NET_ERROR_GETCFG_485DECODER=Failed to get decoder property
+NET_ERROR_GETCFG_232COM=Failed to get 232 COM setup
+NET_ERROR_GETCFG_ALARMIN=Failed to get external alarm input setup
+NET_ERROR_GETCFG_ALARMDET=Failed to get motion detection alarm
+NET_ERROR_GETCFG_SYSTIME=Failed to get device time
+NET_ERROR_GETCFG_PREVIEW=Failed to get preview parameter
+NET_ERROR_GETCFG_AUTOMT=Failed to get audio maintenance setup
+NET_ERROR_GETCFG_VIDEOMTRX=Failed to get video matrix setup
+NET_ERROR_GETCFG_COVER=Failed to get privacy mask zone setup
+NET_ERROR_GETCFG_WATERMAKE=Failed to get video watermark setup
+NET_ERROR_GETCFG_MULTICAST=Failed to get config, omulticast port by channel
+NET_ERROR_SETCFG_GENERAL=Failed to modify general property
+NET_ERROR_SETCFG_NETCFG=Failed to modify channel setup
+NET_ERROR_SETCFG_CHANNAME=Failed to modify channel name
+NET_ERROR_SETCFG_VIDEO=Failed to modify video channel
+NET_ERROR_SETCFG_RECORD=Failed to modify record setup
+NET_ERROR_SETCFG_485DECODER=Failed to modify decoder property
+NET_ERROR_SETCFG_232COM=Failed to modify 232 COM setup
+NET_ERROR_SETCFG_ALARMIN=Failed to modify external input alarm setup
+NET_ERROR_SETCFG_ALARMDET=Failed to modify motion detection alarm setup
+NET_ERROR_SETCFG_SYSTIME=Failed to modify device time
+NET_ERROR_SETCFG_PREVIEW=Failed to modify preview parameter
+NET_ERROR_SETCFG_AUTOMT=Failed to modify auto maintenance setup
+NET_ERROR_SETCFG_VIDEOMTRX=Failed to modify video matrix setup
+NET_ERROR_SETCFG_COVER=Failed to modify privacy mask zone
+NET_ERROR_SETCFG_WATERMAKE=Failed to modify video watermark setup
+NET_ERROR_SETCFG_WLAN=Failed to modify wireless network information
+NET_ERROR_SETCFG_WLANDEV=Failed to select wireless network device
+NET_ERROR_SETCFG_REGISTER=Failed to modify the actively registration parameter setup
+NET_ERROR_SETCFG_CAMERA=Failed to modify camera property
+NET_ERROR_SETCFG_INFRARED=Failed to modify IR alarm setup
+NET_ERROR_SETCFG_SOUNDALARM=Failed to modify audio alarm setup
+NET_ERROR_SETCFG_STORAGE=Failed to modify storage position setup
+NET_AUDIOENCODE_NOTINIT=The audio encode port has not been successfully initialized
+NET_DATA_TOOLONGH=The data are too long
+NET_UNSUPPORTED=The device does not support current operation
+NET_DEVICE_BUSY=Device resources is not sufficient
+NET_SERVER_STARTED=The server has boot up
+NET_SERVER_STOPPED=The server has not fully boot up
+NET_LISTER_INCORRECT_SERIAL=Input serial number is not correct
+NET_QUERY_DISKINFO_FAILED=Failed to get HDD information
+NET_ERROR_GETCFG_SESSION=Failed to get connect session information
+NET_USER_FLASEPWD_TRYTIME=The password you typed is incorrect You have exceeded the maximum number of retries
+NET_LOGIN_ERROR_PASSWORD=Password is not correct
+NET_LOGIN_ERROR_USER=The account does not exist
+NET_LOGIN_ERROR_TIMEOUT=Time out for log in returned value
+NET_LOGIN_ERROR_RELOGGIN=The account has logged in
+NET_LOGIN_ERROR_LOCKED=The account has been locked
+NET_LOGIN_ERROR_BLACKLIST=The account has been in the block list
+NET_LOGIN_ERROR_BUSY=Resources are not sufficient System is busy now
+NET_LOGIN_ERROR_CONNECT=Time out Please check network and try again
+NET_LOGIN_ERROR_NETWORK=Network connection failed
+NET_LOGIN_ERROR_SUBCONNECT=Successfully logged in the device but can not create video channel Please check network connection
+NET_LOGIN_ERROR_MAXCONNECT=Exceed the max connect number
+NET_LOGIN_ERROR_PROTOCOL3_ONLY=Only support 3 protocol
+NET_LOGIN_ERROR_UKEY_LOST=There is no USB or USB info error
+NET_LOGIN_ERROR_NO_AUTHORIZED=Client-end IP address has no right to login
+NET_LOGIN_ERROR_USER_OR_PASSOWRD=user or password error
+NET_LOGIN_ERROR_DEVICE_NOT_INIT=cannot login because the device has not been init,please init the device and then login
+NET_RENDER_SOUND_ON_ERROR=Error occurs when Render library open audio
+NET_RENDER_SOUND_OFF_ERROR=Error occurs when Render library close audio
+NET_RENDER_SET_VOLUME_ERROR=Error occurs when Render library control volume
+NET_RENDER_ADJUST_ERROR=Error occurs when Render library set video parameter
+NET_RENDER_PAUSE_ERROR=Error occurs when Render library pause play
+NET_RENDER_SNAP_ERROR=Render library snapshot error
+NET_RENDER_STEP_ERROR=Render library stepper error
+NET_RENDER_FRAMERATE_ERROR=Error occurs when Render library set frame rate
+NET_RENDER_DISPLAYREGION_ERROR=Error occurs when Render lib setting show region
+NET_RENDER_GETOSDTIME_ERROR=An error occurred when Render library getting current play time
+NET_GROUP_EXIST=Group name has been existed
+NET_GROUP_NOEXIST=The group name does not exist
+NET_GROUP_RIGHTOVER=The group right exceeds the right list!
+NET_GROUP_HAVEUSER=The group can not be removed since there is user in it!
+NET_GROUP_RIGHTUSE=The user has used one of the group right It can not be removed
+NET_GROUP_SAMENAME=New group name has been existed
+NET_USER_EXIST=The user name has been existed
+NET_USER_NOEXIST=The account does not exist
+NET_USER_RIGHTOVER=User right exceeds the group right
+NET_USER_PWD=Reserved account It does not allow to be modified
+NET_USER_FLASEPWD=password is not correct
+NET_USER_NOMATCHING=Password is invalid
+NET_USER_INUSE=account in use
+NET_ERROR_GETCFG_ETHERNET=Failed to get network card setup
+NET_ERROR_GETCFG_WLAN=Failed to get wireless network information
+NET_ERROR_GETCFG_WLANDEV=Failed to get wireless network device
+NET_ERROR_GETCFG_REGISTER=Failed to get actively registration parameter
+NET_ERROR_GETCFG_CAMERA=Failed to get camera property
+NET_ERROR_GETCFG_INFRARED=Failed to get IR alarm setup
+NET_ERROR_GETCFG_SOUNDALARM=Failed to get audio alarm setup
+NET_ERROR_GETCFG_STORAGE=Failed to get storage position
+NET_ERROR_GETCFG_MAIL=Failed to get mail setup
+NET_CONFIG_DEVBUSY=Can not set right now
+NET_CONFIG_DATAILLEGAL=The configuration setup data are illegal
+NET_ERROR_GETCFG_DST=Failed to get DST setup
+NET_ERROR_SETCFG_DST=Failed to set DST
+NET_ERROR_GETCFG_VIDEO_OSD=Failed to get video OSD setup
+NET_ERROR_SETCFG_VIDEO_OSD=Failed to set video OSD
+NET_ERROR_GETCFG_GPRSCDMA=Failed to get CDMA\GPRS configuration
+NET_ERROR_SETCFG_GPRSCDMA=Failed to set CDMA\GPRS configuration
+NET_ERROR_GETCFG_IPFILTER= Failed to get IP Filter configuration
+NET_ERROR_SETCFG_IPFILTER=Failed to set IP Filter configuration
+NET_ERROR_GETCFG_TALKENCODE=Failed to get Talk Encode configuration
+NET_ERROR_SETCFG_TALKENCODE=Failed to set Talk Encode configuration
+NET_ERROR_GETCFG_RECORDLEN=Failed to get The length of the video package configuration
+NET_ERROR_SETCFG_RECORDLEN=Failed to set The length of the video package configuration
+NET_DONT_SUPPORT_SUBAREA=Not support Network hard disk partition
+NET_ERROR_GET_AUTOREGSERVER=Failed to get the register server information
+NET_ERROR_CONTROL_AUTOREGISTER=Failed to control actively registration
+NET_ERROR_DISCONNECT_AUTOREGISTER=Failed to disconnect actively registration
+NET_ERROR_GETCFG_MMS=Failed to get mms configuration
+NET_ERROR_SETCFG_MMS=Failed to set mms configuration
+NET_ERROR_GETCFG_SMSACTIVATION=Failed to get SMS configuration
+NET_ERROR_SETCFG_SMSACTIVATION=Failed to set SMS configuration
+NET_ERROR_GETCFG_DIALINACTIVATION=Failed to get activation of a wireless connection
+NET_ERROR_SETCFG_DIALINACTIVATION=Failed to set activation of a wireless connection
+NET_ERROR_GETCFG_VIDEOOUT=Failed to get the parameter of video output
+NET_ERROR_SETCFG_VIDEOOUT=Failed to set the configuration of video output
+NET_ERROR_GETCFG_OSDENABLE=Failed to get osd overlay enabling
+NET_ERROR_SETCFG_OSDENABLE=Failed to set OSD overlay enabling
+NET_ERROR_SETCFG_ENCODERINFO=Failed to set digital input configuration of front encoders
+NET_ERROR_GETCFG_TVADJUST=Failed to get TV adjust configuration
+NET_ERROR_SETCFG_TVADJUST=Failed to set TV adjust configuration
+NET_ERROR_CONNECT_FAILED=Failed to request to establish a connection
+NET_ERROR_SETCFG_BURNFILE=Failed to request to upload burn files
+NET_ERROR_SNIFFER_GETCFG=Failed to get capture configuration information
+NET_ERROR_SNIFFER_SETCFG=Failed to set capture configuration information
+NET_ERROR_DOWNLOADRATE_GETCFG=Failed to get download restrictions information
+NET_ERROR_DOWNLOADRATE_SETCFG=Failed to set download restrictions information
+NET_ERROR_SEARCH_TRANSCOM=Failed to query serial port parameters
+NET_ERROR_GETCFG_POINT=Failed to get the preset info
+NET_ERROR_SETCFG_POINT=Failed to set the preset info
+NET_SDK_LOGOUT_ERROR=SDK log out the device abnormally
+NET_ERROR_GET_VEHICLE_CFG=Failed to get vehicle configuration
+NET_ERROR_SET_VEHICLE_CFG=Failed to set vehicle configuration
+NET_ERROR_GET_ATM_OVERLAY_CFG=Failed to get ATM overlay configuration
+NET_ERROR_SET_ATM_OVERLAY_CFG=Failed to set ATM overlay configuration
+NET_ERROR_GET_ATM_OVERLAY_ABILITY=Failed to get ATM overlay ability
+NET_ERROR_GET_DECODER_TOUR_CFG=Failed to get decoder tour configuration
+NET_ERROR_SET_DECODER_TOUR_CFG=Failed to set decoder tour configuration
+NET_ERROR_CTRL_DECODER_TOUR=Failed to control decoder tour
+NET_GROUP_OVERSUPPORTNUM=Beyond the device supports for the largest number of user groups
+NET_USER_OVERSUPPORTNUM=Beyond the device supports for the largest number of users
+NET_ERROR_GET_SIP_CFG=Failed to get SIP configuration
+NET_ERROR_SET_SIP_CFG=Failed to set SIP configuration
+NET_ERROR_GET_SIP_ABILITY=Failed to get SIP capability
+NET_ERROR_GET_WIFI_AP_CFG=Failed to get "WIFI ap' configuration
+NET_ERROR_SET_WIFI_AP_CFG=Failed to set "WIFI ap" configuration
+NET_ERROR_GET_DECODE_POLICY=Failed to get decode policy
+NET_ERROR_SET_DECODE_POLICY=Failed to set decode policy
+NET_ERROR_TALK_REJECT=refuse talk
+NET_ERROR_TALK_OPENED=talk has opened by other client
+NET_ERROR_TALK_RESOURCE_CONFLICIT=resource conflict
+NET_ERROR_TALK_UNSUPPORTED_ENCODE=unsupported encode type
+NET_ERROR_TALK_RIGHTLESS=no right
+NET_ERROR_TALK_FAILED=request failed
+NET_ERROR_GET_MACHINE_CFG=Failed to get device relative config
+NET_ERROR_SET_MACHINE_CFG=Failed to set device relative config
+NET_ERROR_GET_DATA_FAILED=get data failed
+NET_ERROR_MAC_VALIDATE_FAILED=MAC validate failed
+NET_ERROR_GET_INSTANCE=Failed to get server instance
+NET_ERROR_JSON_REQUEST=Generated json string is error
+NET_ERROR_JSON_RESPONSE=The responding json string is error
+NET_ERROR_VERSION_HIGHER=The protocol version is lower than current version
+NET_SPARE_NO_CAPACITY=Hotspare disk operation failed The capacity is low
+NET_ERROR_SOURCE_IN_USE=Display source is used by other output
+NET_ERROR_REAVE=advanced users grab low-level user resource
+NET_ERROR_NETFORBID=net forbid
+NET_ERROR_GETCFG_MACFILTER=get MAC filter configuration error
+NET_ERROR_SETCFG_MACFILTER=set MAC filter configuration error
+NET_ERROR_GETCFG_IPMACFILTER=get IP/MAC filter configuration error
+NET_ERROR_SETCFG_IPMACFILTER=set IP/MAC filter configuration error
+NET_ERROR_OPERATION_OVERTIME=operation over time
+NET_ERROR_SENIOR_VALIDATE_FAILED=senior validation failure
+NET_ERROR_DEVICE_ID_NOT_EXIST=device ID is not exist
+NET_ERROR_UNSUPPORTED=unsupport operation
+NET_ERROR_PROXY_DLLLOAD=proxy dll load error
+NET_ERROR_PROXY_ILLEGAL_PARAM= proxy user parameter is not legal
+NET_ERROR_PROXY_INVALID_HANDLE=handle invalid
+NET_ERROR_PROXY_LOGIN_DEVICE_ERROR=login device error
+NET_ERROR_PROXY_START_SERVER_ERROR=start proxy server error
+NET_ERROR_SPEAK_FAILED=request speak failed
+NET_ERROR_NOT_SUPPORT_F6=unsupport F6
+NET_ERROR_CD_UNREADY=CD is not ready
+NET_ERROR_DIR_NOT_EXIST=Directory does not exist
+NET_ERROR_UNSUPPORTED_SPLIT_MODE=The device does not support the segmentation model
+NET_ERROR_OPEN_WND_PARAM=Open the window parameter is illegal
+NET_ERROR_LIMITED_WND_COUNT=Open the window more than limit
+NET_ERROR_UNMATCHED_REQUEST=Request command with the current pattern don't match
+NET_RENDER_ENABLELARGEPICADJUSTMENT_ERROR=Render Library to enable high-definition image internal adjustment strategy error
+NET_ERROR_UPGRADE_FAILED=Upgrade equipment failure
+NET_ERROR_NO_TARGET_DEVICE=Can't find the target device
+NET_ERROR_NO_VERIFY_DEVICE=Can't find the verify device
+NET_ERROR_CASCADE_RIGHTLESS=No cascade permissions
+NET_ERROR_LOW_PRIORITY=low priority
+NET_ERROR_REMOTE_REQUEST_TIMEOUT=The remote device request timeout
+NET_ERROR_LIMITED_INPUT_SOURCE=Input source beyond maximum route restrictions
+NET_ERROR_SET_LOG_PRINT_INFO=Failed to set log print
+NET_ERROR_PARAM_DWSIZE_ERROR="dwSize" is not initialized in input param
+NET_ERROR_LIMITED_MONITORWALL_COUNT=TV wall exceed limit
+NET_ERROR_PART_PROCESS_FAILED=Fail to execute part of the process
+NET_ERROR_TARGET_NOT_SUPPORT=Fail to transmit due to not supported by target
+NET_ERROR_VISITE_FILE=Access to the file failed
+NET_ERROR_DEVICE_STATUS_BUSY=Device busy
+NET_USER_PWD_NOT_AUTHORIZED=Fail to change the password
+NET_USER_PWD_NOT_STRONG=Password strength is not enough
+NET_ERROR_NO_SUCH_CONFIG=No corresponding setup
+NET_ERROR_AUDIO_RECORD_FAILED=Failed to record audio
+NET_ERROR_SEND_DATA_FAILED=Failed to send out data
+NET_ERROR_OBSOLESCENT_INTERFACE=Abandoned port
+NET_ERROR_INSUFFICIENT_INTERAL_BUF=Internal buffer is not sufficient
+NET_ERROR_NEED_ENCRYPTION_PASSWORD=verify password when changing device IP
+NET_ERROR_NOSUPPORT_RECORD =device not support the record
+NET_ERROR_SERIALIZE_ERROR=Failed to serialize data
+NET_ERROR_DESERIALIZE_ERROR=Failed to deserialize data
+NET_ERROR_LOWRATEWPAN_ID_EXISTED=the wireless id is already existed
+NET_ERROR_LOWRATEWPAN_ID_LIMIT=the wireless id limited
+NET_ERROR_LOWRATEWPAN_ID_ABNORMAL=add the wireless id abnormaly
+NET_ERROR_ENCRYPT=encrypt data fail
+NET_ERROR_PWD_ILLEGAL=new password illegal
+NET_ERROR_DEVICE_ALREADY_INIT=device is already initiation
+NET_ERROR_SECURITY_CODE=security code check out fail
+NET_ERROR_SECURITY_CODE_TIMEOUT=security code out of time
+NET_ERROR_GET_PWD_SPECI=get password specification fail
+NET_ERROR_NO_AUTHORITY_OF_OPERATION=no authority of operation
+NET_ERROR_DECRYPT=decrypt data fail
+NET_ERROR_2D_CODE=2D code check out fail
+NET_ERROR_INVALID_REQUEST=Invalid request
+NET_ERROR_PWD_RESET_DISABLE=password reset unable
+NET_ERROR_PLAY_PRIVATE_DATA=Failed to display private data,such as rule box
+NET_ERROR_ROBOT_OPERATE_FAILED=robot operate failed
+NET_ERROR_PHOTOSIZE_EXCEEDSLIMIT=photo size exceeds limit
+NET_ERROR_USERID_INVALID=Invalid userId
+NET_ERROR_EXTRACTFEATURE_FAILED=photo extract feature failed
+NET_ERROR_PHOTO_EXIST=photo exist
+NET_ERROR_PHOTO_OVERFLOW=photo over flow
+NET_ERROR_CHANNEL_ALREADY_OPENED=channel has already been opened
+NET_ERROR_CREATE_SOCKET=create socket error
+NET_ERROR_CHANNEL_NUM=Invalid channel number
+NET_ERROR_FACE_RECOGNITION_SERVER_GROUP_ID_EXCEED=target recognition server group id exceed
+
+# RealPlay Info
+START_REALPLAY=Start RealPlay
+STOP_REALPLAY=Stop RealPlay
+ATTACH=Attach
+DETACH=Detach
+REALPLAY_SUCCEED=Success to start realPlay
+REALPLAY_FAILED=Failed to start realPlay
+
+CHN=Chn
+CHANNEL=Channel
+STREAM_TYPE=Stream
+MASTER_AND_SUB_STREAM=Main/Sub stream
+MASTER_STREAM=Main Stream
+SUB_STREAM=Sub Stream
+
+# Capture Picture
+LOCAL_CAPTURE=Local Capture
+REMOTE_CAPTURE=Remote Capture
+TIMER_CAPTURE=Timer Capture
+STOP_CAPTURE=Stop Capture
+INTERVAL=Interval
+
+TIME_INTERVAL_ILLEGAL=Time Interval Illegal
+PLEASE_START_REALPLAY=Please Start Real Play
+
+# PTZ Info
+PTZ_CONTROL=PTZControl
+LEFT_UP=LeftUp
+UP=Up
+RIGHT_UP=RightUp
+LEFT=Left
+RIGHT=Right
+LEFT_DOWN=LeftDown
+DOWN=Down
+RIGHT_DOWN=RightDown
+
+ZOOM_ADD=Zoom+
+ZOOM_DEC=Zoom-
+FOCUS_ADD=Focus+
+FOCUS_DEC=Focus-
+IRIS_ADD=Iris+
+IRIS_DEC=Iris-
+
+SPEED=Speed
+
+#ITS
+EVENT_INFO=Event Information
+EVENT_NAME=Event Name
+EVENT_TIME=Event Time
+EVENT_PICTURE=Event and Picture
+PLATE_PICTURE=Plate Picture
+LICENSE_PLATE=License Plate
+PLATE_TYPE=Plate Type
+PLATE_COLOR=Plate Color
+VEHICLE_TYPE=Vehicle Type
+VEHICLE_SIZE=Vehicle Size
+VEHICLE_COLOR=Vehicle Color
+FILE_COUNT=File Count
+FILE_INDEX=File Index
+GROUP_ID=Group ID
+ILLEGAL_PLACE=Illegal Place
+LANE_NUMBER=Lane Number
+MANUAL_CAPTURE=Manual Capture
+OPEN_STROBE=Open Strobe
+CLOSE_STROBE=Close Strobe
+INDEX=Index
+
+OPERATE=Operate
+FUNCTION=Function
+
+UNDEFINED_COLOR=Undefined Color
+BLACK=Black
+WHITE=White
+RED=Red
+BLUE=Blue
+GREEN=Green
+YELLOW=Yellow
+GRAY=Gray
+ORANGE=Orange
+
+LIGHT_DUTY=Light Duty
+MEDIUM=Medium
+OVER_SIZE=Over Size
+MINI_SIZE=Miniature Size
+LARGE_SIZE=Large Size
+
+NO_PLATENUMBER=No PlateNumber
+MANUALSNAP_SUCCEED=Manual snap succeed
+MANUALSNAP_FAILED=Manual snap failed
+
+OPEN_STROBE_SUCCEED=Open strobe succeed
+OPEN_STROBE_FAILED=Open strobe failed
+CLOSE_STROBE_SUCCEED=Close strobe succeed
+CLOSE_STROBE_FAILED=Close strobe failed
+
+EVENT_IVS_TRAFFICJUNCTION=Junction
+EVENT_IVS_TRAFFIC_RUNREDLIGHT=RunRedLight
+EVENT_IVS_TRAFFIC_OVERLINE=OverLine
+EVENT_IVS_TRAFFIC_RETROGRADE=ReTrograde
+EVENT_IVS_TRAFFIC_TURNLEFT=TurnLeft
+EVENT_IVS_TRAFFIC_TURNRIGHT=TurnRight
+EVENT_IVS_TRAFFIC_UTURN=UTurn
+EVENT_IVS_TRAFFIC_OVERSPEED=OverSpeed
+EVENT_IVS_TRAFFIC_UNDERSPEED=UnderSpeed
+EVENT_IVS_TRAFFIC_PARKING=Parking
+EVENT_IVS_TRAFFIC_WRONGROUTE=WrongRoute
+EVENT_IVS_TRAFFIC_CROSSLANE=CrossLane
+EVENT_IVS_TRAFFIC_OVERYELLOWLINE=OverYellowLine
+EVENT_IVS_TRAFFIC_YELLOWPLATEINLANE=YellowPlateInLane
+EVENT_IVS_TRAFFIC_PEDESTRAINPRIORITY=PedestrainPriority
+EVENT_IVS_TRAFFIC_MANUALSNAP=ManualSnap
+EVENT_IVS_TRAFFIC_VEHICLEINROUTE=VehicleInRoute
+EVENT_IVS_TRAFFIC_VEHICLEINBUSROUTE=VehicleInBusRoute
+EVENT_IVS_TRAFFIC_BACKING=Backing
+EVENT_IVS_TRAFFIC_PARKINGSPACEPARKING=ParkingSpaceParking
+EVENT_IVS_TRAFFIC_PARKINGSPACENOPARKING=ParkingSpaceNoParking
+EVENT_IVS_TRAFFIC_WITHOUT_SAFEBELT=WithoutSafeBelt
+
+# DownLoad Info
+DOWNLOAD_RECORD_BYTIME=DownloadRecordByTime
+DOWNLOAD_RECORD_BYFILE=DownloadRecordByFile
+QUERY=Query
+DOWNLOAD=DownLoad
+STOP_DOWNLOAD=StopDownLoad
+START_TIME=Start Time
+END_TIME=End Time
+RECORD_TYPE=Record Type
+
+GENERAL_RECORD=General Record
+ALARM_RECORD=Alarm Record
+MOTION_DETECTION=Motion Detection Record
+CARD_NUMBER_RECORD=Card Number Record
+INTELLIGENT_DETECTION=intelligent Record
+POS_RECORD=pos Record
+
+
+QUERY_RECORD_IS_NOT_EXIST=Query record is not exist
+PLEASE_CHECK_RECORD_TIME=Please check record time
+PLEASE_SELECT_TIME_AGAIN=Please select time again,max time different is 6 hour
+DOWNLOAD_COMPLETED=Download completed
+
+PLEASE_FIRST_QUERY_RECORD=Please first query record
+PLEASE_FIRST_SELECT_ROW_WITH_DATA=Please first select row with data
+
+# Time Set
+YEAR=Year
+MONTH=Month
+DAY=Day
+HOUR=Hour
+MINUTE=Minute
+SECOND=Second
+CONFIRM=Confirm
+CANCEL=Cancel
+DATE_CHOOSER=Date Chooser
+
+MONDAY=Mon
+TUESDAY=Tue
+WEDNESDAY=Wed
+THURSDAY=Thur
+FRIDAY=Fri
+SATURDAY=Sat
+SUNDAY=Sun
+
+# Talk
+TRANSMIT_TYPE=Transmit Type
+LOCAL_TRANSMIT_TYPE=Local(not transmit)
+REMOTE_TRANSMIT_TYPE=Remote(transmit)
+TRANSMIT_CHANNEL=Speaker Channel
+START_TALK=Start Talk
+STOP_TALK=Stop Talk
+TALK_FAILED=Talk Failed
+
+# DeviceSearchAndInt
+DEVICESEARCH_OPERATE=DeviceSearch Operate
+DEVICESEARCH_RESULT=DeviceSearch Result
+DEVICEINIT=DeviceInit
+
+DEVICESEARCH=DeviceSearch
+DEVICE_POINT_TO_POINT_SEARCH=Device IP Point To Point Search
+
+START_SEARCH=Start Search
+STOP_SEARCH=Stop Search
+
+START_IP=Start IP
+END_IP=End IP
+
+DEVICE_TYPE=Device Type
+MAC=MAC
+SN=SN
+DEVICE_INIT_STATE=Initialized State
+INIT_PASSWD=Initialization Password
+PHONE=Phone
+MAIL=Mail
+IP_VERSION=IP Version
+SUB_MASK=Sub Mask
+GETWAY=GetWay
+DETAIL_TYPE=Detail Type
+HTTP_PORT=HTTP Port
+LOCAL_IP=local ip
+CONFIRM_PASSWORD=Confirm Password
+
+OLD_DEVICE=Old Device
+DONOT_SUPPORT_INITIALIZATION=Do not support initialization
+NOT_INITIALIZED=Uninitialized
+INITIALIZED=Initialized
+
+THE_IP_CONTROL_SCOPE=The scope is too large, please control it between the 1000
+PLEASE_FIRST_SELECT_INITIALIZED_DEVICE=Please first select initialized device
+PLEASE_INPUT_PHONE=Please input phone
+PLEASE_INPUT_MAIL=Please input mail
+INCONSISTENT=The password and the confirm password are inconsistent
+PLEASE_CHECK_IP=Please check IP
+
+SEARCHING_WAITING=Searching, please waiting
+
+START_LISTEN=Start Listen
+STOP_LISTEN=Stop Listen
+SHOW_ALARM_EVENT=Show Alarm Event Info
+ALARM_LISTEN_FAILED=Alarm Listen Failed
+ALARM_MESSAGE=Alarm Message
+
+EXTERNAL_ALARM=External alarm
+MOTION_ALARM=Motion detection alarm
+VIDEOLOST_ALARM=Video loss alarm
+SHELTER_ALARM=Camera masking alarm
+DISKFULL_ALARM=HDD full alarm
+DISKERROR_ALARM=HDD error alarm
+START=start
+STOP=stop
+
+CURRENT_TIME=Current Time
+DEVICE_REBOOT=Device Reboot
+SYNCHRONIZE_TIME=Synchronize Time
+REBOOT=Reboot
+SET_TIME=Set Time
+GET_TIME=Get Time
+REBOOT_TIPS=Are you sure you want to reboot it?
+OPERATE_SUCCESS=Operate Success
+
+#FaceRecognition
+FACE_GROUP_ID=Group Id
+FACE_GROUP_NAME=Group Name
+PERSON_COUNT=Person Count
+
+GROUP_OPERATE=Group Operate
+PERSON_OPERATE=Person Operate
+
+FACE_RECOGNITION_EVENT=FaceRecognition Event
+FACE_DETECT_EVENT=FaceDetect Event
+
+GLOBAL_PICTURE=Global Picture
+PERSON_PICTURE=Person Picture
+CANDIDATE_PICTURE=Candidate Picture
+
+TIME=Time
+SEX=Sex
+AGE=Age
+COLOR=Color
+EYE=Eye
+MOUTH=Mouth
+MASK=Mask
+BEARD=Beard
+MALE=Male
+FEMALE=Female
+ID_CARD=Id Card
+OFFICE_CARD=office card
+PASSPORT=Passport
+UNIDENTIFIED=Unidentified
+HAVE_BEARD=Have Beard
+NO_BEARD=No Beard
+OPEN_MOUTH=Open Mouth
+CLOSE_MOUTH=Close Mouth
+YELLOW_COLOR=Yellow
+BLACK_COLOR=Black
+WHITE_COLOR=White
+OPEN_EYE=Open Eye
+CLOSE_EYE=Close Eye
+SMILE=Smile
+ANGER=Anger
+SADNESS=Sadness
+DISGUST=Disgust
+FEAR=Fear
+SURPRISE=Surprise
+NEUTRAL=Neutral
+LAUGH=Laugh
+WEAR_MASK=Wear Mask
+NO_MASK=No Mask
+WEAR_GLASSES=Wear Glasses
+NO_GLASSES=No Glasses
+UNKNOW=UnKnow
+UNLIMITED=Unlimited
+
+NAME=Name
+BIRTHDAY=Birthday
+ID_NO=Id No
+ID_TYPE=ID Type
+SIMILARITY=Similarity
+UID=UID
+STRANGER=Stranger
+GLASSES=glasses
+PICTURE_PATH=picture path
+FACE_LIBRARY_ID=face library id
+FACE_LIBRARY_NAME=face library name
+
+
+ADD=Add
+MODIFY=Modify
+FRESH=Fresh
+ADD_GROUP=Add Group
+MODIFY_GROUP=Modify Group
+DEL_GROUP=Delete Group
+DISPOSITION=Disposition
+DEL_DISPOSITION=Delete Disposition
+
+FIND_CONDITION=Find Condition
+FIND_PERSON=Find Person
+ADD_PERSON=Add Person
+MODIFY_PERSON=Modify Person
+DEL_PERSON=Delete Person
+
+PREVIOUSPAGE=Previous Page
+LASTPAGE=Last Page
+SELECT_PICTURE=Select Picture
+SEARCH_BY_PIC=Search by Picture
+DOWNLOAD_QUERY_PICTURE=Download the query Picture
+FACE_LIBRARY=face library
+HISTORY_LIBRARY=history library
+CHOOSE_FACE_PIC=Please select a face picture
+EVENT_TYPE=Event Type
+PAGES_NUMBER=Pages Number
+
+SIMILARITY_RANGE=Similarity range[0, 100]
+PLEASE_INPUT_GROUPNAME=Please input groupName
+PLEASE_SELECT_GROUP=Please select group
+
+PLEASE_SELECT_PERSON=Please select person
+PLEASE_ADD_DISPOSITION_INFO=Please add disposition info
+PLEASE_SELECT_DEL_DISPOSITION_INFO=Please select delDisposition info
+
+#AutoRegister
+AUTOREGISTER_LISTEN=AutoRegister Listen
+DEVICE_CONFIG=Device Configure
+DEVICE_LIST=Device List
+DEVICE_MANAGER=Device Manager
+ADD_DEVICE=Add Device
+MODIFY_DEVICE=Modify Device
+DELETE_DEVICE=Delete Device
+CLEAR_DEVICE=Clear Device
+IMPORT_DEVICE=Import Device
+EXPORT_DEVICE=Export Device
+DEVICE_ID=Device ID
+ENABLE=Enable
+REGISTER_ADDRESS=Register Address
+REGISTER_PORT=Register Port
+GET=Get
+SET=Set
+RECORD=Record
+DEVICE_LOGIN=Device has logged in
+
+ALREADY_EXISTED=Already existed
+ALREADY_EXISTED_WHETHER_OR_NOT_TO_COVER=Already existed, whether or not to cover(no, not export)
+FILE_OPEN_PLEASE_CLOSE_FILE=The file is opened, please first close the file
+IMPORT_COMPLETION=Import completed
+EXPORT_COMPLETION=Export completed
+FILE_NOT_EXIST=File is not existed
+
+PLEASE_INPUT=Please input
+MAX_SUPPORT_100=Maximum support is 100
+
+#Attendance
+ATTENDANCE=Attendance
+USER_ID=User ID
+USER_NAME=User Name
+CARD_NO=Card No
+QUERY_CONDITION=Query Condition
+USER_OPERATE=User Operate
+FINGERPRINT_OPERATE=FingerPrint Operate
+OPERATE_BY_USER_ID=Operate FingerPrint By User ID
+OPERATE_BY_FINGERPRINT_ID=Operate FingerPrint By FingerPrint ID
+FINGERPRINT_ID=FingerPrint ID
+DELETE=Delete
+SEARCH=Search
+SEARCH_FINGERPRINT=Search FingerPrint
+ADD_FINGERPRINT=Add FingerPrint
+DELETE_FINGERPRINT=Delete FingerPrint
+SUBSCRIBE=Subscribe
+UNSUBSCRIBE=UnSubscribe
+USER_LIST=User List
+NEXT_PAGE=Next Page
+USER_INFO=User Info
+DOOROPEN_METHOD=Open Door Method
+FINGERPRINT=FingerPrint
+FINGERPRINT_INFO=FingerPrint Info
+FINGERPRINT_DATA=FingerPrint Data
+CARD=Card
+DELETE_FINGERPRINT_PROMPT=It will delete all fingerprint of this user
+SUBSCRIBE_FAILED=Subscribe failed
+FINGERPRINT_ID_ILLEGAL=FingerPrint id illegal
+FINGERPRINT_COLLECTION=FingerPrint Collection
+START_COLLECTION=Start Collection
+STOP_COLLECTION=Stop Collection
+IN_THE_COLLECTION=In collection...
+COLLECTION_COMPLETED=Collection completed
+COLLECTION_FAILED=Collection failed
+FINGERPRINT_ID_NOT_EXIST=FingerPrint Id not exist
+USER_ID_EXCEED_LENGTH=User id exceed max length
+USER_NAME_EXCEED_LENGTH=User name exceed max length
+CARD_NO_EXCEED_LENGTH=Card no exceed max length
+CARD_NAME_EXCEED_LENGTH=Card name exceed max length
+CARD_PASSWD_EXCEED_LENGTH=Card password exceed max length
+
+#Gate
+GATE=FaceOpenDoor
+
+CARD_OPERATE=Card Operate
+CARD_INFO=Card Information
+CARD_MANAGER=Card Manager
+
+CLEAR=Clear
+
+OPEN_STATUS=Open Status
+OPEN_METHOD=Open Method
+
+TEMPERATURE=temperture
+MASK_STATUS=mask status
+
+CARD_UNKNOW=UnKnown Card
+CARD_GENERAL=General Card
+CARD_VIP=VIP Card
+CARD_GUEST=Guest Card
+CARD_PATROL=Patrol Card
+CARD_BACKLIST=BackList Card
+CARD_COERCE=Coerce Card
+CARD_POLLING=Polling Card
+CARD_MOTHERCARD=Mother Card
+
+STATE_UNKNOWN=UnKnown
+STATE_NORMAL=Normal
+STATE_LOSE=Lose
+STATE_LOGOFF=LogOff
+STATE_FREEZE=Freeze
+STATE_ARREARS=Arrears
+STATE_OVERDUE=OverDue
+STATE_PREARREARS=PreArrears
+
+RECORD_NO=Record No
+CARD_NAME=Card Name
+CARD_STATUS=Card Status
+CARD_PASSWORD=Card Password
+CARD_TYPE=Card Type
+CARD_NUM=Card Number
+USE_TIMES=Use Times
+IS_FIRST_ENTER=IsFirstEnter
+IS_VALID=IsValid
+VALID_PERIOD=Valid Period
+VALID_START_TIME=Valid Start Time
+VALID_END_TIME=Valid End Time
+FIRST_ENTER=FirstEnter
+NO_FIRST_ENTER=No FirstEnter
+VALID=Valid
+INVALID=Invalid
+
+PLEASE_SELECT_CARD=Please select card
+PLEASE_INPUT_CARDNO=Please input cardNo
+PLEASE_INPUT_USERID=Please input userId
+WANT_CLEAR_ALL_INFO=Do you want to clear all information ?
+
+ADD_CARD_INDO_FAILED=Failed to add card information
+ADD_CARD_INFO_AND_PERSON_PICTURE_SUCCEED=Succeed to add card information and person picture
+ADD_CARD_INFO_SUCCEED_BUT_ADD_PERSON_PICTURE_FAILED=Succeed to add card information, but failed to add person picture
+CARD_EXISTED_ADD_PERSON_PICTURE_SUCCEED=Card information is existed, succeed to add person picture
+
+MODIFY_CARD_INFO_SUCCEED=Succeed to modify card information
+MODIFY_CARD_INFO_FAILED=Failed to modify card information
+MODIFY_CARD_INFO_AND_PERSON_PICTURE_SUCCEED=Succeed to modify card information and person picture
+MODIFY_CARD_INFO_SUCCEED_BUT_MODIFY_PERSON_PICTURE_FAILED=Succeed to modify card information, but failed to modify person picture
+
+NET_ACCESS_DOOROPEN_METHOD_UNKNOWN=UnKnow
+NET_ACCESS_DOOROPEN_METHOD_PWD_ONLY=Password
+NET_ACCESS_DOOROPEN_METHOD_CARD=Card
+NET_ACCESS_DOOROPEN_METHOD_CARD_FIRST=First Card Then Password
+NET_ACCESS_DOOROPEN_METHOD_PWD_FIRST=First Password Then Card
+NET_ACCESS_DOOROPEN_METHOD_REMOTE=Remote Open
+NET_ACCESS_DOOROPEN_METHOD_BUTTON=Open Door Button
+NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT=fingerprint lock
+NET_ACCESS_DOOROPEN_METHOD_PWD_CARD_FINGERPRINT=password+swipe card+fingerprint combination unlock
+NET_ACCESS_DOOROPEN_METHOD_PWD_FINGERPRINT=password+fingerprint combination unlock
+NET_ACCESS_DOOROPEN_METHOD_CARD_FINGERPRINT=swipe card+fingerprint combination unlock
+NET_ACCESS_DOOROPEN_METHOD_PERSONS=multi-people unlock
+NET_ACCESS_DOOROPEN_METHOD_KEY=Key
+NET_ACCESS_DOOROPEN_METHOD_COERCE_PWD=Use force password to open the door
+NET_ACCESS_DOOROPEN_METHOD_QRCODE=Use QR Code
+NET_ACCESS_DOOROPEN_METHOD_FACE_RECOGNITION=face recogniton to open the door
+NET_ACCESS_DOOROPEN_METHOD_FACEIDCARD=comparsion of face and ID card
+NET_ACCESS_DOOROPEN_METHOD_FACEIDCARD_AND_IDCARD=ID card and compasion of face and ID card
+NET_ACCESS_DOOROPEN_METHOD_BLUETOOTH=Bluetooth
+NET_ACCESS_DOOROPEN_METHOD_CUSTOM_PASSWORD=Custom password
+NET_ACCESS_DOOROPEN_METHOD_USERID_AND_PWD=UserID and password
+NET_ACCESS_DOOROPEN_METHOD_FACE_AND_PWD=Face and password
+NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_AND_PWD=Fingerprint and password
+NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_AND_FACE= FingerPrint and face
+NET_ACCESS_DOOROPEN_METHOD_CARD_AND_FACE=Card and face
+NET_ACCESS_DOOROPEN_METHOD_FACE_OR_PWD=Face or password
+NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_OR_PWD=Fingerprint or password
+NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_OR_FACE=Fingerprint or face
+NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FACE=Card or face
+NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FINGERPRINT=Card or fingerprint
+NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_AND_FACE_AND_PWD=Fingerprint and face and password
+NET_ACCESS_DOOROPEN_METHOD_CARD_AND_FACE_AND_PWD=Card and face and password
+NET_ACCESS_DOOROPEN_METHOD_CARD_AND_FINGERPRINT_AND_PWD=Card and fingerprint and password
+NET_ACCESS_DOOROPEN_METHOD_CARD_AND_PWD_AND_FACE=Card and password and face
+NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_OR_FACE_OR_PWD=Fingerprint or face or password
+NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FACE_OR_PWD=Card or face or password
+NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FINGERPRINT_OR_FACE=Card or fingerprint or face
+NET_ACCESS_DOOROPEN_METHOD_CARD_AND_FINGERPRINT_AND_FACE_AND_PWD=Card and fingerprint and face and password
+NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FINGERPRINT_OR_FACE_OR_PWD=Card or fingerprint or face or password
+NET_ACCESS_DOOROPEN_METHOD_FACEIPCARDANDIDCARD_OR_CARD_OR_FACE=ID card and compasion of face and ID card or card or face
+NET_ACCESS_DOOROPEN_METHOD_FACEIDCARD_OR_CARD_OR_FACE=ID card and compasion of face or card or face
+
+#ThermalCamera
+THERMAL_CAMERA=Thermal Camera
+THERMAL_OPERATE=Operate
+POINT_QUERY=Query Point
+ITEM_QUERY=Query Item
+TEMPER_QUERY=Query Temperature
+HEATMAP=HeatMap
+POINT_TEMPER=Point Temperature
+ITEM_TEMPER=Item Temperature
+X=X
+Y=Y
+COORDINATE_ILLEGAL=Coordinate Illegal
+QUERY_RESULT=Query Result
+METER_TYPE=Meter Type
+TEMPER_UNIT=Temperature Unit
+TEMPER=Temperature
+UNKNOWN=Unknown
+SPOT=Spot
+LINE=Line
+AREA=Area
+CENTIGRADE=Celsius
+FAHRENHEIT=Fahrenheit
+PRESET_ID=Preset Id
+RULE_ID=Rule Id
+TEMPER_AVER=Average Temperature
+TEMPER_MAX=Maximum Temperature
+TEMPER_MIN=Minimum Temperature
+TEMPER_MID=Middle Temperature
+TEMPER_STD=Standard Deviation
+INPUT_ILLEGAL=Input Illegal
+TEMPER_INFO=Temperature Info
+FIVE_MINUTES=Five Minutes
+TEN_MINUTES=Ten Minutes
+FIFTEEN_MINUTES=Fifteen Minutes
+THIRTY_MINUTES=Thirty Minutes
+SAVE_PERIOD=Save Period
+QUERY_LIST=Query List
+RECORD_TIME=Record Time
+ITEM_NAME=Name
+COORDINATE=Coordinate
+NO_RECORD=No Record
+HEATMAP_OPERATE=Operate
+IDLE=Idle
+ACQUIRING=Acquiring
+RADIOMETRY_ATTACH=Attach
+RADIOMETRY_DETACH=Detach
+RADIOMETRY_FETCH=Fetch
+SAVE_HEATMAP=Save HeatMap
+HEATMAP_METADATA_INFO=HeatMap MetaData
+HEIGHT=Height
+WIDTH=Width
+LENGTH=Size
+SENSOR_TYPE=Sensor Type
+HEATMAP_SAVE_SUCCESS=HeatMap Save Success
+
+#matrix screen
+MATRIX_SCREEN=Lattice Screen
+PASSING_STATE=Passing state
+PASSING_CAR=pass car
+NO_CAR=no car
+IN_TIME=Entry time
+OUT_TIME=departure time
+PLATE_NUMBER=plate number
+CAR_OWNER=car owner
+PARKING_TIME=parking time
+USER_TYPE=user type
+MONTHLY_CARD_USER=monthly card user
+ANNUAL_CARD_USER=annual card user
+LONG_TERM_USER=long term user/VIP
+TEMPORARY_USER=temporary user/Visitor
+PARKING_CHARGE=parking charge
+DAYS_DUE=days due
+REMAINING_PARKING_SPACES=Remaining parking spaces
+VEHICLES_NOT_ALLOWED_TO_PASS=vehicles not allowed to pass
+ALLOWED_VEHICLES_TO_PASS=allowed vehicles to pass
+SET_UP=set up
+SUCCESSFULLY_ISSUED=Successfully issued
+DELIVERY FAILED=Delivery failed
+CUSTOM_USER_CLASS=Custom user class
+REMARKS_INFORMATION=Remarks information
+CUSTOM_INFORMATION=Custom information
+
+# human number statistic
+HUMAN_NUMBER_STATISTIC_TITLE=Human Number Statistic
+HUMAN_NUMBER_STATISTIC_CONTROL=Human Number Statistic Control
+
+HUMAN_NUMBER_STATISTIC_EVENT_TITLE=Human Number Statistic Event List
+
+HUMAN_NUMBER_STATISTIC_EVENT_CHANNEL=Channel
+HUMAN_NUMBER_STATISTIC_EVENT_TIME=EventTime
+HUMAN_NUMBER_STATISTIC_EVENT_HOUR_IN=HourIn
+HUMAN_NUMBER_STATISTIC_EVENT_HOUR_OUT=HourOut
+HUMAN_NUMBER_STATISTIC_EVENT_TODAY_IN=TodayIn
+HUMAN_NUMBER_STATISTIC_EVENT_TODAY_OUT=TodayOut
+HUMAN_NUMBER_STATISTIC_EVENT_TOTAL_IN=TotalIn
+HUMAN_NUMBER_STATISTIC_EVENT_TOTAL_OUT=TotalOut
+
+HUMAN_NUMBER_STATIC_EVENT_OSD_CLEAR=OSD Clear
+
+VTO_ALARM_EVENT_ROOM_NO=RoomNo.
+VTO_ALARM_EVENT_CARD_NO=CardNo.
+VTO_ALARM_EVENT_TIME=Time
+VTO_ALARM_EVENT_OPEN_METHOD=OpenMethod
+VTO_ALARM_EVENT_STATUS=Status
+
+VTO_REAL_LOAD_ROOM_NO=RoomNo.
+VTO_REAL_LOAD_CARD_NO=CardNO.
+VTO_REAL_LOAD_TIME=Time
+VTO_REAL_LOAD_EVENT_INFO=EventInfo
+
+VTO_OPERATE_MANAGER_TITLE=Card&Fingerprint&FaceManager
+VTO_OPERATE_MANAGER_REC_NO=RecNo.
+VTO_OPERATE_MANAGER_ROOM_NO=RoomNo.
+VTO_OPERATE_MANAGER_CARD_NO=CardNo.
+VTO_OPERATE_MANAGER_FINGER_PRINT_DATA=FingerprintData
+VTO_OPERATE_INFO_TITLE=Add
+
+VTO_OPERATE_COLLECTION_FINGER_PRINT_TITLE=CollectionFingerPrint
+
+DOOR_OPEN=Open Door
+DOOR_CLOSE=Close Door
+EVENT_OPERATE=Event Operate
+START_REAL_LOAD_PIC=StartRealLoad
+STOP_REAL_LOAD_PIC=StopRealLoad
+ALARM_EVENT=AlarmEvent
+REAL_LOAD_EVENT=RealLoadEvent
+COLLECTION_RESULT=CollectionResult
+NEED_FINGER_PRINT=Need FingerPrint
+FACE_INFO=FaceInfo
+OPEN=open
+VTO=VTO
+SCADA=SCADA
+TRAFFIC_ALLOW_LIST=Traffic Allow List
+MODIFY_CARD_FACE_FAILED=failed to modify face info.
+EM_MASK_STATE_UNKNOWN=unknown
+EM_MASK_STATE_NODISTI=unrecognized
+EM_MASK_STATE_NOMASK=Not wearing mask
+EM_MASK_STATE_WEAR=wearing mask
+END_SEARCH=End of query
+DOWNLOAD_PICTURE=download picture
+ENTER_PICTURE_PATH=Please enter the picture path
+LOADING=The equipment is being processed
+QUERY_CARD_EXIST_FAILED=Check if the cardNo exists failed
+CARD_EXIST=The cardNo already exists
+INPUT_ROOM_NO=please input room number
+ROOM_NO_EXCEED_LENGTH=room number exceed max length
+REMOVE_CARD_FACE_FAILED=remove card face failed
+STOP_LISTEN_FAILED=stop listen failed
+
+SCREEN_NUMBER=screen number
+TEXT_CONTENT=text content
+TEXT_CONTENT_TYPE=text content type
+TEXT_CONTENT_COLOR=text content color
+SCROLL_TYPE=scroll type
+SCROLL_SPEED=scroll speed
+
+ORDINARY=ordinary
+QR_CODE=QR code
+LOCAL_TIME=local time
+RESOURCE=resource
+
+NOT_ROLLING=not rolling
+SCROLL_LEFT_AND_RIGHT=scroll left and right
+SCROLL_UP_AND_DOWN=scroll up and right
+
+NUMBER_STRING=number string
+VOICE_TEXT=vioce text
+ISSUED=issued
+PROMPT=Please add corresponding parameters
+
+
+SCADA_DEVICE_LIST=device list
+
+DEVICE_NAME=device name
+POINT_ID=point id
+IF_VALID_SIGNAL_POINT=valid signal point
+POINT_NAME=point name
+ALARM_DESCRIBE=alarm describe
+ALARM_LEVEL=alarm level
+ALARM_DELAY=alarm delay
+ALARM_TYPE=alarm type
+ALARM_TIME=alarm time
+COLLECT_TIME=collect time
+
+SCADA_POINT_LIST=point list
+SCADA_ATTACH_ALARM=attach alarm
+SCADA_ATTACH_INFO=attach info
+SCADA_ATTACH=start listen
+BTN_LIST = get
+
+ALLOWLIST_OPERATION=allowlist operation
+
+SINGLE_UPLOAD=single upload
+
+LICENSE_PLATE_RUN=The license plate to run
+FUZZY_QUERY=fuzzy query
+DELETE_ALL=delete all
+AUTHORIZATION=authorization
+UNAUTHORIZATION=unauthorized
+BATCH_UPLOAD=batch upload
+BROWSE=browse
+UPLOAD=upload
+QUERY_INFORMATION=query information
+DIALOG=dialog
+LICENSE_PLATE_NUMBER=license plate number
+MODIFY_PANEL=modify panel
+SERIAL_NUMBER=serial number
+OPEN_MODEL=open model
+LICENSE_PLATE_LENGTH_TOO_LONG=License plate length is too long
+NAME_TOO_LONG=The name is too long
+ADD_SUCCESS= add a success
+ADD_FAIL=add a fail
+DELETE_SUCCESS=delete a success
+DELETE_FAIL=delete a fail
+MODIFY_SUCCESS=modify the success
+MODIFY_FAIL=modify the fail
+UPLOAD_SUCCESS=Uploaded successfully
+ENTER_QUERY_DATA=Please enter the data to query
+FILLING_RULES=fill in legal characters
+UPLOAD_FAIL=upload fail
+UPLOADING=uploading
+SURE_UPLOAD=Are you sure to upload?
+DATA_NUMBER=pieces of data
+SELECT_DATA=Please select data
diff --git a/ard-admin/src/main/resources/resources_zh_CN.properties b/ard-admin/src/main/resources/resources_zh_CN.properties
new file mode 100644
index 0000000..0c184cb
--- /dev/null
+++ b/ard-admin/src/main/resources/resources_zh_CN.properties
@@ -0,0 +1,1074 @@
+# FunctionList
+FUNCTIONLIST=\u529F\u80FD\u5217\u8868
+REALPLAY=\u5B9E\u65F6\u9884\u89C8
+CAPTURE_PICTURE=\u6293\u62CD\u56FE\u7247
+MULTIREALPLAY=\u53CC\u901A\u9053\u5B9E\u65F6\u9884\u89C8
+DOWNLOAD_RECORD=\u4E0B\u8F7D\u5F55\u50CF
+ITS_EVENT=\u667A\u80FD\u4EA4\u901A
+TALK=\u8BED\u97F3\u5BF9\u8BB2
+DEVICESEARCH_DEVICEINIT=\u8BBE\u5907\u641C\u7D22\u548C\u8BBE\u5907\u521D\u59CB\u5316
+PTZ=\u4E91\u53F0\u63A7\u5236
+FACERECOGNITION=\u76EE\u6807\u8BC6\u522B
+ALARM_LISTEN=\u62A5\u8B66\u76D1\u542C
+DEVICE_CONTROL=\u8BBE\u5907\u63A7\u5236
+AUTOREGISTER=\u4E3B\u52A8\u6CE8\u518C
+
+ONLINE=\u5728\u7EBF
+
+# Login Info
+DEVICE_IP=\u8BBE\u5907\u5730\u5740
+DEVICE_PORT=\u7AEF\u53E3\u53F7
+USERNAME=\u7528\u6237\u540D
+PASSWORD=\u5BC6\u7801
+IP=\u5730\u5740
+
+LOGIN=\u767B\u5F55
+LOGOUT=\u767B\u51FA
+
+LOGIN_SUCCEED=\u767B\u5F55\u6210\u529F
+LOGIN_FAILED=\u767B\u5F55\u5931\u8D25
+DISCONNECT=\u8BBE\u5907\u65AD\u7EBF
+DISCONNECT_RECONNECTING=\u8BBE\u5907\u65AD\u7EBF\uFF0C\u6B63\u5728\u91CD\u8FDE\u4E2D
+PROMPT_MESSAGE=\u63D0\u793A\u4FE1\u606F
+ERROR_MESSAGE=\u9519\u8BEF\u4FE1\u606F
+
+SUCCEED=\u6210\u529F
+FAILED=\u5931\u8D25
+
+PLEASE_INPUT_DEVICE_IP=\u8BF7\u8F93\u5165\u8BBE\u5907\u5730\u5740
+PLEASE_INPUT_DEVICE_PORT=\u8BF7\u8F93\u5165\u8BBE\u5907\u7AEF\u53E3\u53F7
+PLEASE_INPUT_DEVICE_USERNAME=\u8BF7\u8F93\u5165\u7528\u6237\u540D
+PLEASE_INPUT_DEVICE_PASSWORD=\u8BF7\u8F93\u5165\u5BC6\u7801
+PLEASE_INPUT_CONFIRM_PASSWORD=\u8BF7\u8F93\u5165\u786E\u8BA4\u5BC6\u7801
+
+# Error Info
+NET_NOERROR=\u6CA1\u6709\u9519\u8BEF
+NET_ERROR=\u672A\u77E5\u9519\u8BEF
+NET_SYSTEM_ERROR=Windows\u7CFB\u7EDF\u51FA\u9519
+NET_NETWORK_ERROR=\u7F51\u7EDC\u9519\u8BEF\uFF0C\u53EF\u80FD\u662F\u56E0\u4E3A\u7F51\u7EDC\u8D85\u65F6
+NET_DEV_VER_NOMATCH=\u8BBE\u5907\u534F\u8BAE\u4E0D\u5339\u914D
+NET_INVALID_HANDLE=\u53E5\u67C4\u65E0\u6548
+NET_OPEN_CHANNEL_ERROR=\u6253\u5F00\u901A\u9053\u5931\u8D25
+NET_CLOSE_CHANNEL_ERROR=\u5173\u95ED\u901A\u9053\u5931\u8D25
+NET_ILLEGAL_PARAM=\u7528\u6237\u53C2\u6570\u4E0D\u5408\u6CD5
+NET_SDK_INIT_ERROR=SDK\u521D\u59CB\u5316\u51FA\u9519
+NET_SDK_UNINIT_ERROR=SDK\u6E05\u7406\u51FA\u9519
+NET_RENDER_OPEN_ERROR=\u7533\u8BF7render\u8D44\u6E90\u51FA\u9519
+NET_DEC_OPEN_ERROR=\u6253\u5F00\u89E3\u7801\u5E93\u51FA\u9519
+NET_DEC_CLOSE_ERROR=\u5173\u95ED\u89E3\u7801\u5E93\u51FA\u9519
+NET_MULTIPLAY_NOCHANNEL=\u591A\u753B\u9762\u9884\u89C8\u4E2D\u68C0\u6D4B\u5230\u901A\u9053\u6570\u4E3A0
+NET_TALK_INIT_ERROR=\u5F55\u97F3\u5E93\u521D\u59CB\u5316\u5931\u8D25
+NET_TALK_NOT_INIT=\u5F55\u97F3\u5E93\u672A\u7ECF\u521D\u59CB\u5316
+NET_TALK_SENDDATA_ERROR=\u53D1\u9001\u97F3\u9891\u6570\u636E\u51FA\u9519
+NET_REAL_ALREADY_SAVING=\u5B9E\u65F6\u6570\u636E\u5DF2\u7ECF\u5904\u4E8E\u4FDD\u5B58\u72B6\u6001
+NET_NOT_SAVING=\u672A\u4FDD\u5B58\u5B9E\u65F6\u6570\u636E
+NET_OPEN_FILE_ERROR=\u6253\u5F00\u6587\u4EF6\u51FA\u9519
+NET_PTZ_SET_TIMER_ERROR=\u542F\u52A8\u4E91\u53F0\u63A7\u5236\u5B9A\u65F6\u5668\u5931\u8D25
+NET_RETURN_DATA_ERROR=\u5BF9\u8FD4\u56DE\u6570\u636E\u7684\u6821\u9A8C\u51FA\u9519
+NET_INSUFFICIENT_BUFFER=\u6CA1\u6709\u8DB3\u591F\u7684\u7F13\u5B58
+NET_NOT_SUPPORTED=\u5F53\u524DSDK\u672A\u652F\u6301\u8BE5\u529F\u80FD
+NET_NO_RECORD_FOUND=\u67E5\u8BE2\u4E0D\u5230\u5F55\u50CF
+NET_NOT_AUTHORIZED=\u65E0\u64CD\u4F5C\u6743\u9650
+NET_NOT_NOW=\u6682\u65F6\u65E0\u6CD5\u6267\u884C
+NET_NO_TALK_CHANNEL=\u672A\u53D1\u73B0\u5BF9\u8BB2\u901A\u9053
+NET_NO_AUDIO=\u672A\u53D1\u73B0\u97F3\u9891
+NET_NO_INIT=\u7F51\u7EDCSDK\u672A\u7ECF\u521D\u59CB\u5316
+NET_DOWNLOAD_END=\u4E0B\u8F7D\u5DF2\u7ED3\u675F
+NET_EMPTY_LIST=\u67E5\u8BE2\u7ED3\u679C\u4E3A\u7A7A
+NET_ERROR_GETCFG_SYSATTR=\u83B7\u53D6\u7CFB\u7EDF\u5C5E\u6027\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GETCFG_SERIAL=\u83B7\u53D6\u5E8F\u5217\u53F7\u5931\u8D25
+NET_ERROR_GETCFG_GENERAL=\u83B7\u53D6\u5E38\u89C4\u5C5E\u6027\u5931\u8D25
+NET_ERROR_GETCFG_DSPCAP=\u83B7\u53D6DSP\u80FD\u529B\u63CF\u8FF0\u5931\u8D25
+NET_ERROR_GETCFG_NETCFG=\u83B7\u53D6\u7F51\u7EDC\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GETCFG_CHANNAME=\u83B7\u53D6\u901A\u9053\u540D\u79F0\u5931\u8D25
+NET_ERROR_GETCFG_VIDEO=\u83B7\u53D6\u89C6\u9891\u5C5E\u6027\u5931\u8D25
+NET_ERROR_GETCFG_RECORD=\u83B7\u53D6\u5F55\u8C61\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GETCFG_PRONAME=\u83B7\u53D6\u89E3\u7801\u5668\u534F\u8BAE\u540D\u79F0\u5931\u8D25
+NET_ERROR_GETCFG_FUNCNAME=\u83B7\u53D6232\u4E32\u53E3\u529F\u80FD\u540D\u79F0\u5931\u8D25
+NET_ERROR_GETCFG_485DECODER=\u83B7\u53D6\u89E3\u7801\u5668\u5C5E\u6027\u5931\u8D25
+NET_ERROR_GETCFG_232COM=\u83B7\u53D6232\u4E32\u53E3\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GETCFG_ALARMIN=\u83B7\u53D6\u5916\u90E8\u62A5\u8B66\u8F93\u5165\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GETCFG_ALARMDET=\u83B7\u53D6\u52A8\u6001\u68C0\u6D4B\u62A5\u8B66\u5931\u8D25
+NET_ERROR_GETCFG_SYSTIME=\u83B7\u53D6\u8BBE\u5907\u65F6\u95F4\u5931\u8D25
+NET_ERROR_GETCFG_PREVIEW=\u83B7\u53D6\u9884\u89C8\u53C2\u6570\u5931\u8D25
+NET_ERROR_GETCFG_AUTOMT=\u83B7\u53D6\u81EA\u52A8\u7EF4\u62A4\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GETCFG_VIDEOMTRX=\u83B7\u53D6\u89C6\u9891\u77E9\u9635\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GETCFG_COVER=\u83B7\u53D6\u533A\u57DF\u906E\u6321\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GETCFG_WATERMAKE=\u83B7\u53D6\u56FE\u8C61\u6C34\u5370\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GETCFG_MULTICAST=\u83B7\u53D6\u914D\u7F6E\u5931\u8D25\u4F4D\u7F6E\uFF1A\u7EC4\u64AD\u7AEF\u53E3\u6309\u901A\u9053\u914D\u7F6E
+NET_ERROR_SETCFG_GENERAL=\u4FEE\u6539\u5E38\u89C4\u5C5E\u6027\u5931\u8D25
+NET_ERROR_SETCFG_NETCFG=\u4FEE\u6539\u7F51\u7EDC\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_CHANNAME=\u4FEE\u6539\u901A\u9053\u540D\u79F0\u5931\u8D25
+NET_ERROR_SETCFG_VIDEO=\u4FEE\u6539\u89C6\u9891\u5C5E\u6027\u5931\u8D25
+NET_ERROR_SETCFG_RECORD=\u4FEE\u6539\u5F55\u8C61\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_485DECODER=\u4FEE\u6539\u89E3\u7801\u5668\u5C5E\u6027\u5931\u8D25
+NET_ERROR_SETCFG_232COM=\u4FEE\u6539232\u4E32\u53E3\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_ALARMIN=\u4FEE\u6539\u5916\u90E8\u8F93\u5165\u62A5\u8B66\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_ALARMDET=\u4FEE\u6539\u52A8\u6001\u68C0\u6D4B\u62A5\u8B66\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_SYSTIME=\u4FEE\u6539\u8BBE\u5907\u65F6\u95F4\u5931\u8D25
+NET_ERROR_SETCFG_PREVIEW=\u4FEE\u6539\u9884\u89C8\u53C2\u6570\u5931\u8D25
+NET_ERROR_SETCFG_AUTOMT=\u4FEE\u6539\u81EA\u52A8\u7EF4\u62A4\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_VIDEOMTRX=\u4FEE\u6539\u89C6\u9891\u77E9\u9635\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_COVER=\u4FEE\u6539\u533A\u57DF\u906E\u6321\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_WATERMAKE=\u4FEE\u6539\u56FE\u8C61\u6C34\u5370\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_WLAN=\u4FEE\u6539\u65E0\u7EBF\u7F51\u7EDC\u4FE1\u606F\u5931\u8D25
+NET_ERROR_SETCFG_WLANDEV=\u9009\u62E9\u65E0\u7EBF\u7F51\u7EDC\u8BBE\u5907\u5931\u8D25
+NET_ERROR_SETCFG_REGISTER=\u4FEE\u6539\u4E3B\u52A8\u6CE8\u518C\u53C2\u6570\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_CAMERA=\u4FEE\u6539\u6444\u50CF\u5934\u5C5E\u6027\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_INFRARED=\u4FEE\u6539\u7EA2\u5916\u62A5\u8B66\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_SOUNDALARM=\u4FEE\u6539\u97F3\u9891\u62A5\u8B66\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_STORAGE=\u4FEE\u6539\u5B58\u50A8\u4F4D\u7F6E\u914D\u7F6E\u5931\u8D25
+NET_AUDIOENCODE_NOTINIT=\u97F3\u9891\u7F16\u7801\u63A5\u53E3\u6CA1\u6709\u6210\u529F\u521D\u59CB\u5316
+NET_DATA_TOOLONGH=\u6570\u636E\u8FC7\u957F
+NET_UNSUPPORTED=\u8BBE\u5907\u4E0D\u652F\u6301\u8BE5\u64CD\u4F5C
+NET_DEVICE_BUSY=\u8BBE\u5907\u8D44\u6E90\u4E0D\u8DB3
+NET_SERVER_STARTED=\u670D\u52A1\u5668\u5DF2\u7ECF\u542F\u52A8
+NET_SERVER_STOPPED=\u670D\u52A1\u5668\u5C1A\u672A\u6210\u529F\u542F\u52A8
+NET_LISTER_INCORRECT_SERIAL=\u8F93\u5165\u5E8F\u5217\u53F7\u6709\u8BEF
+NET_QUERY_DISKINFO_FAILED=\u83B7\u53D6\u786C\u76D8\u4FE1\u606F\u5931\u8D25
+NET_ERROR_GETCFG_SESSION=\u83B7\u53D6\u8FDE\u63A5Session\u4FE1\u606F
+NET_USER_FLASEPWD_TRYTIME=\u8F93\u5165\u5BC6\u7801\u9519\u8BEF\u8D85\u8FC7\u9650\u5236\u6B21\u6570
+NET_LOGIN_ERROR_PASSWORD=\u5BC6\u7801\u4E0D\u6B63\u786E
+NET_LOGIN_ERROR_USER=\u5E10\u6237\u4E0D\u5B58\u5728
+NET_LOGIN_ERROR_TIMEOUT=\u7B49\u5F85\u767B\u5F55\u8FD4\u56DE\u8D85\u65F6
+NET_LOGIN_ERROR_RELOGGIN=\u5E10\u53F7\u5DF2\u767B\u5F55
+NET_LOGIN_ERROR_LOCKED=\u5E10\u53F7\u5DF2\u88AB\u9501\u5B9A
+NET_LOGIN_ERROR_BLACKLIST=\u5E10\u53F7\u5DF2\u88AB\u5217\u4E3A\u7981\u6B62\u540D\u5355
+NET_LOGIN_ERROR_BUSY=\u8D44\u6E90\u4E0D\u8DB3\uFF0C\u7CFB\u7EDF\u5FD9
+NET_LOGIN_ERROR_CONNECT=\u767B\u5F55\u8BBE\u5907\u8D85\u65F6\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u5E76\u91CD\u8BD5
+NET_LOGIN_ERROR_NETWORK=\u7F51\u7EDC\u8FDE\u63A5\u5931\u8D25
+NET_LOGIN_ERROR_SUBCONNECT=\u767B\u5F55\u8BBE\u5907\u6210\u529F\uFF0C\u4F46\u65E0\u6CD5\u521B\u5EFA\u89C6\u9891\u901A\u9053\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u72B6\u51B5
+NET_LOGIN_ERROR_MAXCONNECT=\u8D85\u8FC7\u6700\u5927\u8FDE\u63A5\u6570
+NET_LOGIN_ERROR_PROTOCOL3_ONLY=\u53EA\u652F\u63013\u4EE3\u534F\u8BAE
+NET_LOGIN_ERROR_UKEY_LOST=\u672A\u63D2\u5165U\u76FE\u6216U\u76FE\u4FE1\u606F\u9519\u8BEF
+NET_LOGIN_ERROR_NO_AUTHORIZED=\u5BA2\u6237\u7AEFIP\u5730\u5740\u6CA1\u6709\u767B\u5F55\u6743\u9650
+NET_LOGIN_ERROR_USER_OR_PASSOWRD=\u8D26\u53F7\u6216\u5BC6\u7801\u9519\u8BEF
+NET_LOGIN_ERROR_DEVICE_NOT_INIT=\u8BBE\u5907\u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u4E0D\u80FD\u767B\u5F55\uFF0C\u8BF7\u5148\u521D\u59CB\u5316\u8BBE\u5907
+NET_RENDER_SOUND_ON_ERROR=Render\u5E93\u6253\u5F00\u97F3\u9891\u51FA\u9519
+NET_RENDER_SOUND_OFF_ERROR=Render\u5E93\u5173\u95ED\u97F3\u9891\u51FA\u9519
+NET_RENDER_SET_VOLUME_ERROR=Render\u5E93\u63A7\u5236\u97F3\u91CF\u51FA\u9519
+NET_RENDER_ADJUST_ERROR=Render\u5E93\u8BBE\u7F6E\u753B\u9762\u53C2\u6570\u51FA\u9519
+NET_RENDER_PAUSE_ERROR=Render\u5E93\u6682\u505C\u64AD\u653E\u51FA\u9519
+NET_RENDER_SNAP_ERROR=Render\u5E93\u6293\u56FE\u51FA\u9519
+NET_RENDER_STEP_ERROR=Render\u5E93\u6B65\u8FDB\u51FA\u9519
+NET_RENDER_FRAMERATE_ERROR=Render\u5E93\u8BBE\u7F6E\u5E27\u7387\u51FA\u9519
+NET_RENDER_DISPLAYREGION_ERROR=Render\u5E93\u8BBE\u7F6E\u663E\u793A\u533A\u57DF\u51FA\u9519
+NET_RENDER_GETOSDTIME_ERROR=Render\u5E93\u83B7\u53D6\u5F53\u524D\u64AD\u653E\u65F6\u95F4\u51FA\u9519
+NET_GROUP_EXIST=\u7EC4\u540D\u5DF2\u5B58\u5728
+NET_GROUP_NOEXIST=\u7EC4\u540D\u4E0D\u5B58\u5728
+NET_GROUP_RIGHTOVER=\u7EC4\u7684\u6743\u9650\u8D85\u51FA\u6743\u9650\u5217\u8868\u8303\u56F4
+NET_GROUP_HAVEUSER=\u7EC4\u4E0B\u6709\u7528\u6237\uFF0C\u4E0D\u80FD\u5220\u9664
+NET_GROUP_RIGHTUSE=\u7EC4\u7684\u67D0\u4E2A\u6743\u9650\u88AB\u7528\u6237\u4F7F\u7528\uFF0C\u4E0D\u80FD\u5220\u9664
+NET_GROUP_SAMENAME=\u65B0\u7EC4\u540D\u540C\u5DF2\u6709\u7EC4\u540D\u91CD\u590D
+NET_USER_EXIST=\u7528\u6237\u5DF2\u5B58\u5728
+NET_USER_NOEXIST=\u7528\u6237\u4E0D\u5B58\u5728
+NET_USER_RIGHTOVER=\u7528\u6237\u6743\u9650\u8D85\u51FA\u7EC4\u6743\u9650
+NET_USER_PWD=\u4FDD\u7559\u5E10\u53F7\uFF0C\u4E0D\u5BB9\u8BB8\u4FEE\u6539\u5BC6\u7801
+NET_USER_FLASEPWD=\u5BC6\u7801\u4E0D\u6B63\u786E
+NET_USER_NOMATCHING=\u5BC6\u7801\u4E0D\u5339\u914D
+NET_USER_INUSE=\u8D26\u53F7\u6B63\u5728\u4F7F\u7528\u4E2D
+NET_ERROR_GETCFG_ETHERNET=\u83B7\u53D6\u7F51\u5361\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GETCFG_WLAN=\u83B7\u53D6\u65E0\u7EBF\u7F51\u7EDC\u4FE1\u606F\u5931\u8D25
+NET_ERROR_GETCFG_WLANDEV=\u83B7\u53D6\u65E0\u7EBF\u7F51\u7EDC\u8BBE\u5907\u5931\u8D25
+NET_ERROR_GETCFG_REGISTER=\u83B7\u53D6\u4E3B\u52A8\u6CE8\u518C\u53C2\u6570\u5931\u8D25
+NET_ERROR_GETCFG_CAMERA=\u83B7\u53D6\u6444\u50CF\u5934\u5C5E\u6027\u5931\u8D25
+NET_ERROR_GETCFG_INFRARED=\u83B7\u53D6\u7EA2\u5916\u62A5\u8B66\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GETCFG_SOUNDALARM=\u83B7\u53D6\u97F3\u9891\u62A5\u8B66\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GETCFG_STORAGE=\u83B7\u53D6\u5B58\u50A8\u4F4D\u7F6E\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GETCFG_MAIL=\u83B7\u53D6\u90AE\u4EF6\u914D\u7F6E\u5931\u8D25
+NET_CONFIG_DEVBUSY=\u6682\u65F6\u65E0\u6CD5\u8BBE\u7F6E
+NET_CONFIG_DATAILLEGAL=\u914D\u7F6E\u6570\u636E\u4E0D\u5408\u6CD5
+NET_ERROR_GETCFG_DST=\u83B7\u53D6\u590F\u4EE4\u65F6\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_DST=\u8BBE\u7F6E\u590F\u4EE4\u65F6\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GETCFG_VIDEO_OSD=\u83B7\u53D6\u89C6\u9891OSD\u53E0\u52A0\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_VIDEO_OSD=\u8BBE\u7F6E\u89C6\u9891OSD\u53E0\u52A0\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GETCFG_GPRSCDMA=\u83B7\u53D6CDMA\GPRS\u7F51\u7EDC\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_GPRSCDMA=\u8BBE\u7F6ECDMA\GPRS\u7F51\u7EDC\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GETCFG_IPFILTER=\u83B7\u53D6IP\u8FC7\u6EE4\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_IPFILTER=\u8BBE\u7F6EIP\u8FC7\u6EE4\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GETCFG_TALKENCODE=\u83B7\u53D6\u8BED\u97F3\u5BF9\u8BB2\u7F16\u7801\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_TALKENCODE=\u8BBE\u7F6E\u8BED\u97F3\u5BF9\u8BB2\u7F16\u7801\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GETCFG_RECORDLEN=\u83B7\u53D6\u5F55\u50CF\u6253\u5305\u957F\u5EA6\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_RECORDLEN=\u8BBE\u7F6E\u5F55\u50CF\u6253\u5305\u957F\u5EA6\u914D\u7F6E\u5931\u8D25
+NET_DONT_SUPPORT_SUBAREA=\u4E0D\u652F\u6301\u7F51\u7EDC\u786C\u76D8\u5206\u533A
+NET_ERROR_GET_AUTOREGSERVER=\u83B7\u53D6\u8BBE\u5907\u4E0A\u4E3B\u52A8\u6CE8\u518C\u670D\u52A1\u5668\u4FE1\u606F\u5931\u8D25
+NET_ERROR_CONTROL_AUTOREGISTER=\u4E3B\u52A8\u6CE8\u518C\u91CD\u5B9A\u5411\u6CE8\u518C\u9519\u8BEF
+NET_ERROR_DISCONNECT_AUTOREGISTER=\u65AD\u5F00\u4E3B\u52A8\u6CE8\u518C\u670D\u52A1\u5668\u9519\u8BEF
+NET_ERROR_GETCFG_MMS=\u83B7\u53D6mms\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_MMS=\u8BBE\u7F6Emms\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GETCFG_SMSACTIVATION=\u83B7\u53D6\u77ED\u4FE1\u6FC0\u6D3B\u65E0\u7EBF\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_SMSACTIVATION=\u8BBE\u7F6E\u77ED\u4FE1\u6FC0\u6D3B\u65E0\u7EBF\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GETCFG_DIALINACTIVATION=\u83B7\u53D6\u62E8\u53F7\u6FC0\u6D3B\u65E0\u7EBF\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_DIALINACTIVATION=\u8BBE\u7F6E\u62E8\u53F7\u6FC0\u6D3B\u65E0\u7EBF\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GETCFG_VIDEOOUT=\u67E5\u8BE2\u89C6\u9891\u8F93\u51FA\u53C2\u6570\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_VIDEOOUT=\u8BBE\u7F6E\u89C6\u9891\u8F93\u51FA\u53C2\u6570\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GETCFG_OSDENABLE=\u83B7\u53D6osd\u53E0\u52A0\u4F7F\u80FD\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_OSDENABLE=\u8BBE\u7F6Eosd\u53E0\u52A0\u4F7F\u80FD\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_ENCODERINFO=\u8BBE\u7F6E\u6570\u5B57\u901A\u9053\u524D\u7AEF\u7F16\u7801\u63A5\u5165\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GETCFG_TVADJUST=\u83B7\u53D6TV\u8C03\u8282\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_TVADJUST=\u8BBE\u7F6ETV\u8C03\u8282\u914D\u7F6E\u5931\u8D25
+NET_ERROR_CONNECT_FAILED=\u8BF7\u6C42\u5EFA\u7ACB\u8FDE\u63A5\u5931\u8D25
+NET_ERROR_SETCFG_BURNFILE=\u8BF7\u6C42\u523B\u5F55\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25
+NET_ERROR_SNIFFER_GETCFG=\u83B7\u53D6\u6293\u5305\u914D\u7F6E\u4FE1\u606F\u5931\u8D25
+NET_ERROR_SNIFFER_SETCFG=\u8BBE\u7F6E\u6293\u5305\u914D\u7F6E\u4FE1\u606F\u5931\u8D25
+NET_ERROR_DOWNLOADRATE_GETCFG=\u67E5\u8BE2\u4E0B\u8F7D\u9650\u5236\u4FE1\u606F\u5931\u8D25
+NET_ERROR_DOWNLOADRATE_SETCFG=\u8BBE\u7F6E\u4E0B\u8F7D\u9650\u5236\u4FE1\u606F\u5931\u8D25
+NET_ERROR_SEARCH_TRANSCOM=\u67E5\u8BE2\u4E32\u53E3\u53C2\u6570\u5931\u8D25
+NET_ERROR_GETCFG_POINT=\u83B7\u53D6\u9884\u5236\u70B9\u4FE1\u606F\u9519\u8BEF
+NET_ERROR_SETCFG_POINT=\u8BBE\u7F6E\u9884\u5236\u70B9\u4FE1\u606F\u9519\u8BEF
+NET_SDK_LOGOUT_ERROR=SDK\u6CA1\u6709\u6B63\u5E38\u767B\u51FA\u8BBE\u5907
+NET_ERROR_GET_VEHICLE_CFG=\u83B7\u53D6\u8F66\u8F7D\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SET_VEHICLE_CFG=\u8BBE\u7F6E\u8F66\u8F7D\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GET_ATM_OVERLAY_CFG=\u83B7\u53D6atm\u53E0\u52A0\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SET_ATM_OVERLAY_CFG=\u8BBE\u7F6Eatm\u53E0\u52A0\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GET_ATM_OVERLAY_ABILITY=\u83B7\u53D6atm\u53E0\u52A0\u80FD\u529B\u5931\u8D25
+NET_ERROR_GET_DECODER_TOUR_CFG=\u83B7\u53D6\u89E3\u7801\u5668\u89E3\u7801\u8F6E\u5DE1\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SET_DECODER_TOUR_CFG=\u8BBE\u7F6E\u89E3\u7801\u5668\u89E3\u7801\u8F6E\u5DE1\u914D\u7F6E\u5931\u8D25
+NET_ERROR_CTRL_DECODER_TOUR=\u63A7\u5236\u89E3\u7801\u5668\u89E3\u7801\u8F6E\u5DE1\u5931\u8D25
+NET_GROUP_OVERSUPPORTNUM=\u8D85\u51FA\u8BBE\u5907\u652F\u6301\u6700\u5927\u7528\u6237\u7EC4\u6570\u76EE
+NET_USER_OVERSUPPORTNUM=\u8D85\u51FA\u8BBE\u5907\u652F\u6301\u6700\u5927\u7528\u6237\u6570\u76EE
+NET_ERROR_GET_SIP_CFG=\u83B7\u53D6SIP\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SET_SIP_CFG=\u8BBE\u7F6ESIP\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GET_SIP_ABILITY=\u83B7\u53D6SIP\u80FD\u529B\u5931\u8D25
+NET_ERROR_GET_WIFI_AP_CFG=\u83B7\u53D6WIFIap\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SET_WIFI_AP_CFG=\u8BBE\u7F6EWIFIap\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GET_DECODE_POLICY=\u83B7\u53D6\u89E3\u7801\u7B56\u7565\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SET_DECODE_POLICY=\u8BBE\u7F6E\u89E3\u7801\u7B56\u7565\u914D\u7F6E\u5931\u8D25
+NET_ERROR_TALK_REJECT=\u62D2\u7EDD\u5BF9\u8BB2
+NET_ERROR_TALK_OPENED=\u5BF9\u8BB2\u88AB\u5176\u4ED6\u5BA2\u6237\u7AEF\u6253\u5F00
+NET_ERROR_TALK_RESOURCE_CONFLICIT=\u8D44\u6E90\u51B2\u7A81
+NET_ERROR_TALK_UNSUPPORTED_ENCODE=\u4E0D\u652F\u6301\u7684\u8BED\u97F3\u7F16\u7801\u683C\u5F0F
+NET_ERROR_TALK_RIGHTLESS=\u65E0\u6743\u9650
+NET_ERROR_TALK_FAILED=\u8BF7\u6C42\u5BF9\u8BB2\u5931\u8D25
+NET_ERROR_GET_MACHINE_CFG=\u83B7\u53D6\u673A\u5668\u76F8\u5173\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SET_MACHINE_CFG=\u8BBE\u7F6E\u673A\u5668\u76F8\u5173\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GET_DATA_FAILED=\u8BBE\u5907\u65E0\u6CD5\u83B7\u53D6\u5F53\u524D\u8BF7\u6C42\u6570\u636E
+NET_ERROR_MAC_VALIDATE_FAILED=MAC\u5730\u5740\u9A8C\u8BC1\u5931\u8D25
+NET_ERROR_GET_INSTANCE=\u83B7\u53D6\u670D\u52A1\u5668\u5B9E\u4F8B\u5931\u8D25
+NET_ERROR_JSON_REQUEST=\u751F\u6210\u7684json\u5B57\u7B26\u4E32\u9519\u8BEF
+NET_ERROR_JSON_RESPONSE=\u54CD\u5E94\u7684json\u5B57\u7B26\u4E32\u9519\u8BEF
+NET_ERROR_VERSION_HIGHER=\u534F\u8BAE\u7248\u672C\u4F4E\u4E8E\u5F53\u524D\u4F7F\u7528\u7684\u7248\u672C
+NET_SPARE_NO_CAPACITY=\u8BBE\u5907\u64CD\u4F5C\u5931\u8D25,\u5BB9\u91CF\u4E0D\u8DB3
+NET_ERROR_SOURCE_IN_USE=\u663E\u793A\u6E90\u88AB\u5176\u4ED6\u8F93\u51FA\u5360\u7528
+NET_ERROR_REAVE=\u9AD8\u7EA7\u7528\u6237\u62A2\u5360\u4F4E\u7EA7\u7528\u6237\u8D44\u6E90
+NET_ERROR_NETFORBID=\u7981\u6B62\u5165\u7F51
+NET_ERROR_GETCFG_MACFILTER=\u83B7\u53D6MAC\u8FC7\u6EE4\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_MACFILTER=\u8BBE\u7F6EMAC\u8FC7\u6EE4\u914D\u7F6E\u5931\u8D25
+NET_ERROR_GETCFG_IPMACFILTER=\u83B7\u53D6IP/MAC\u8FC7\u6EE4\u914D\u7F6E\u5931\u8D25
+NET_ERROR_SETCFG_IPMACFILTER=\u8BBE\u7F6EIP/MAC\u8FC7\u6EE4\u914D\u7F6E\u5931\u8D25
+NET_ERROR_OPERATION_OVERTIME=\u5F53\u524D\u64CD\u4F5C\u8D85\u65F6
+NET_ERROR_SENIOR_VALIDATE_FAILED=\u9AD8\u7EA7\u6821\u9A8C\u5931\u8D25
+NET_ERROR_DEVICE_ID_NOT_EXIST=\u8BBE\u5907ID\u4E0D\u5B58\u5728
+NET_ERROR_UNSUPPORTED=\u4E0D\u652F\u6301\u5F53\u524D\u64CD\u4F5C
+NET_ERROR_PROXY_DLLLOAD=\u4EE3\u7406\u5E93\u52A0\u8F7D\u5931\u8D25
+NET_ERROR_PROXY_ILLEGAL_PARAM=\u4EE3\u7406\u7528\u6237\u53C2\u6570\u4E0D\u5408\u6CD5
+NET_ERROR_PROXY_INVALID_HANDLE=\u4EE3\u7406\u53E5\u67C4\u65E0\u6548
+NET_ERROR_PROXY_LOGIN_DEVICE_ERROR=\u4EE3\u7406\u767B\u5165\u524D\u7AEF\u8BBE\u5907\u5931\u8D25
+NET_ERROR_PROXY_START_SERVER_ERROR=\u542F\u52A8\u4EE3\u7406\u670D\u52A1\u5931\u8D25
+NET_ERROR_SPEAK_FAILED=\u8BF7\u6C42\u558A\u8BDD\u5931\u8D25
+NET_ERROR_NOT_SUPPORT_F6=\u8BBE\u5907\u4E0D\u652F\u6301\u6B64F6\u63A5\u53E3\u8C03\u7528
+NET_ERROR_CD_UNREADY=\u5149\u76D8\u672A\u5C31\u7EEA
+NET_ERROR_DIR_NOT_EXIST=\u76EE\u5F55\u4E0D\u5B58\u5728
+NET_ERROR_UNSUPPORTED_SPLIT_MODE=\u8BBE\u5907\u4E0D\u652F\u6301\u7684\u5206\u5272\u6A21\u5F0F
+NET_ERROR_OPEN_WND_PARAM=\u5F00\u7A97\u53C2\u6570\u4E0D\u5408\u6CD5
+NET_ERROR_LIMITED_WND_COUNT=\u5F00\u7A97\u6570\u91CF\u8D85\u8FC7\u9650\u5236
+NET_ERROR_UNMATCHED_REQUEST=\u8BF7\u6C42\u547D\u4EE4\u4E0E\u5F53\u524D\u6A21\u5F0F\u4E0D\u5339\u914D
+NET_RENDER_ENABLELARGEPICADJUSTMENT_ERROR=Render\u5E93\u542F\u7528\u9AD8\u6E05\u56FE\u50CF\u5185\u90E8\u8C03\u6574\u7B56\u7565\u51FA\u9519
+NET_ERROR_UPGRADE_FAILED=\u8BBE\u5907\u5347\u7EA7\u5931\u8D25
+NET_ERROR_NO_TARGET_DEVICE=\u627E\u4E0D\u5230\u76EE\u6807\u8BBE\u5907
+NET_ERROR_NO_VERIFY_DEVICE=\u627E\u4E0D\u5230\u9A8C\u8BC1\u8BBE\u5907
+NET_ERROR_CASCADE_RIGHTLESS=\u65E0\u7EA7\u8054\u6743\u9650
+NET_ERROR_LOW_PRIORITY=\u4F4E\u4F18\u5148\u7EA7
+NET_ERROR_REMOTE_REQUEST_TIMEOUT=\u8FDC\u7A0B\u8BBE\u5907\u8BF7\u6C42\u8D85\u65F6
+NET_ERROR_LIMITED_INPUT_SOURCE=\u8F93\u5165\u6E90\u8D85\u51FA\u6700\u5927\u8DEF\u6570\u9650\u5236
+NET_ERROR_SET_LOG_PRINT_INFO=\u8BBE\u7F6E\u65E5\u5FD7\u6253\u5370\u5931\u8D25
+NET_ERROR_PARAM_DWSIZE_ERROR=\u5165\u53C2\u7684dwsize\u5B57\u6BB5\u51FA\u9519
+NET_ERROR_LIMITED_MONITORWALL_COUNT=\u7535\u89C6\u5899\u6570\u91CF\u8D85\u8FC7\u4E0A\u9650
+NET_ERROR_PART_PROCESS_FAILED=\u90E8\u5206\u8FC7\u7A0B\u6267\u884C\u5931\u8D25
+NET_ERROR_TARGET_NOT_SUPPORT=\u8BE5\u529F\u80FD\u4E0D\u652F\u6301\u8F6C\u53D1
+NET_ERROR_VISITE_FILE=\u8BBF\u95EE\u6587\u4EF6\u5931\u8D25
+NET_ERROR_DEVICE_STATUS_BUSY=\u8BBE\u5907\u5FD9
+NET_USER_PWD_NOT_AUTHORIZED=\u4FEE\u6539\u5BC6\u7801\u65E0\u6743\u9650
+NET_USER_PWD_NOT_STRONG=\u5BC6\u7801\u5F3A\u5EA6\u4E0D\u591F
+NET_ERROR_NO_SUCH_CONFIG=\u6CA1\u6709\u5BF9\u5E94\u7684\u914D\u7F6E
+NET_ERROR_AUDIO_RECORD_FAILED=\u5F55\u97F3\u5931\u8D25
+NET_ERROR_SEND_DATA_FAILED=\u6570\u636E\u53D1\u9001\u5931\u8D25
+NET_ERROR_OBSOLESCENT_INTERFACE=\u5E9F\u5F03\u63A5\u53E3
+NET_ERROR_INSUFFICIENT_INTERAL_BUF=\u5185\u90E8\u7F13\u51B2\u4E0D\u8DB3
+NET_ERROR_NEED_ENCRYPTION_PASSWORD=\u4FEE\u6539\u8BBE\u5907ip\u65F6,\u9700\u8981\u6821\u9A8C\u5BC6\u7801
+NET_ERROR_NOSUPPORT_RECORD=\u8BBE\u5907\u4E0D\u652F\u6301\u6B64\u8BB0\u5F55\u96C6
+NET_ERROR_SERIALIZE_ERROR=\u6570\u636E\u5E8F\u5217\u5316\u9519\u8BEF
+NET_ERROR_DESERIALIZE_ERROR=\u6570\u636E\u53CD\u5E8F\u5217\u5316\u9519\u8BEF
+NET_ERROR_LOWRATEWPAN_ID_EXISTED=\u8BE5\u65E0\u7EBFID\u5DF2\u5B58\u5728
+NET_ERROR_LOWRATEWPAN_ID_LIMIT=\u65E0\u7EBFID\u6570\u91CF\u5DF2\u8D85\u9650
+NET_ERROR_LOWRATEWPAN_ID_ABNORMAL=\u65E0\u7EBF\u5F02\u5E38\u6DFB\u52A0
+NET_ERROR_ENCRYPT=\u52A0\u5BC6\u6570\u636E\u5931\u8D25
+NET_ERROR_PWD_ILLEGAL=\u65B0\u5BC6\u7801\u4E0D\u5408\u89C4\u8303
+NET_ERROR_DEVICE_ALREADY_INIT=\u8BBE\u5907\u5DF2\u7ECF\u521D\u59CB\u5316
+NET_ERROR_SECURITY_CODE=\u5B89\u5168\u7801\u9519\u8BEF
+NET_ERROR_SECURITY_CODE_TIMEOUT=\u5B89\u5168\u7801\u8D85\u51FA\u6709\u6548\u671F
+NET_ERROR_GET_PWD_SPECI=\u83B7\u53D6\u5BC6\u7801\u89C4\u8303\u5931\u8D25
+NET_ERROR_NO_AUTHORITY_OF_OPERATION=\u65E0\u6743\u9650\u8FDB\u884C\u8BE5\u64CD\u4F5C
+NET_ERROR_DECRYPT=\u89E3\u5BC6\u6570\u636E\u5931\u8D25
+NET_ERROR_2D_CODE=2Dcode\u6821\u9A8C\u5931\u8D25
+NET_ERROR_INVALID_REQUEST=\u975E\u6CD5\u7684RPC\u8BF7\u6C42
+NET_ERROR_PWD_RESET_DISABLE=\u5BC6\u7801\u91CD\u7F6E\u529F\u80FD\u5DF2\u5173\u95ED
+NET_ERROR_PLAY_PRIVATE_DATA=\u663E\u793A\u79C1\u6709\u6570\u636E\uFF0C\u6BD4\u5982\u89C4\u5219\u6846\u7B49\u5931\u8D25
+NET_ERROR_ROBOT_OPERATE_FAILED=\u673A\u5668\u4EBA\u64CD\u4F5C\u5931\u8D25
+NET_ERROR_PHOTOSIZE_EXCEEDSLIMIT=\u56FE\u7247\u5927\u5C0F\u8D85\u9650
+NET_ERROR_USERID_INVALID=\u7528\u6237ID\u4E0D\u5B58\u5728
+NET_ERROR_EXTRACTFEATURE_FAILED=\u7167\u7247\u7279\u5F81\u503C\u63D0\u53D6\u5931\u8D25
+NET_ERROR_PHOTO_EXIST=\u7167\u7247\u5DF2\u5B58\u5728
+NET_ERROR_PHOTO_OVERFLOW=\u7167\u7247\u6570\u91CF\u8D85\u8FC7\u4E0A\u9650
+NET_ERROR_CHANNEL_ALREADY_OPENED=\u901A\u9053\u5DF2\u7ECF\u6253\u5F00
+NET_ERROR_CREATE_SOCKET=\u521B\u5EFA\u5957\u63A5\u5B57\u5931\u8D25
+NET_ERROR_CHANNEL_NUM=\u901A\u9053\u53F7\u9519\u8BEF
+NET_ERROR_FACE_RECOGNITION_SERVER_GROUP_ID_EXCEED=\u7EC4ID\u8D85\u8FC7\u6700\u5927\u503C
+
+# RealPlay Info
+START_REALPLAY=\u5F00\u59CB\u9884\u89C8
+STOP_REALPLAY=\u505C\u6B62\u9884\u89C8
+ATTACH=\u667A\u80FD\u8BA2\u9605
+DETACH=\u53D6\u6D88\u8BA2\u9605
+REALPLAY_SUCCEED=\u5B9E\u65F6\u9884\u89C8\u6210\u529F
+REALPLAY_FAILED=\u5B9E\u65F6\u9884\u89C8\u5931\u8D25
+
+CHN=\u901A\u9053
+CHANNEL=\u901A\u9053
+STREAM_TYPE=\u7801\u6D41
+MASTER_AND_SUB_STREAM=\u4E3B\u8F85\u7801\u6D41
+MASTER_STREAM=\u4E3B\u7801\u6D41
+SUB_STREAM=\u8F85\u7801\u6D41
+
+# Capture Picture
+LOCAL_CAPTURE=\u672C\u5730\u6293\u56FE
+REMOTE_CAPTURE=\u8FDC\u7A0B\u6293\u56FE
+TIMER_CAPTURE=\u5B9A\u65F6\u6293\u56FE
+STOP_CAPTURE=\u505C\u6B62\u6293\u56FE
+INTERVAL=\u95F4\u9694
+
+TIME_INTERVAL_ILLEGAL=\u65F6\u95F4\u95F4\u9694\u8F93\u5165\u975E\u6CD5
+PLEASE_START_REALPLAY=\u8BF7\u5148\u6253\u5F00\u5B9E\u65F6\u9884\u89C8
+
+# PTZ Info
+PTZ_CONTROL=\u4E91\u53F0\u63A7\u5236
+LEFT_UP=\u5DE6\u4E0A
+UP=\u4E0A
+RIGHT_UP=\u53F3\u4E0A
+LEFT=\u5DE6
+RIGHT=\u53F3
+LEFT_DOWN=\u5DE6\u4E0B
+DOWN=\u4E0B
+RIGHT_DOWN=\u53F3\u4E0B
+
+ZOOM_ADD=\u53D8\u500D+
+ZOOM_DEC=\u53D8\u500D-
+FOCUS_ADD=\u8C03\u7126+
+FOCUS_DEC=\u8C03\u7126-
+IRIS_ADD=\u5149\u5708+
+IRIS_DEC=\u5149\u5708-
+
+SPEED=\u901F\u7387
+
+#ITS
+EVENT_INFO=\u4E8B\u4EF6\u4FE1\u606F
+EVENT_NAME=\u4E8B\u4EF6\u540D\u79F0
+EVENT_TIME=\u4E8B\u4EF6\u65F6\u95F4
+EVENT_PICTURE=\u4E8B\u4EF6\u4EE5\u53CA\u56FE\u7247
+PLATE_PICTURE=\u8F66\u724C\u56FE
+LICENSE_PLATE=\u8F66\u724C\u53F7
+PLATE_TYPE=\u8F66\u724C\u7C7B\u578B
+PLATE_COLOR=\u8F66\u724C\u989C\u8272
+VEHICLE_TYPE=\u8F66\u8F86\u7C7B\u578B
+VEHICLE_SIZE=\u8F66\u8F86\u5927\u5C0F
+VEHICLE_COLOR=\u8F66\u8F86\u989C\u8272
+FILE_COUNT=\u6587\u4EF6\u603B\u6570
+FILE_INDEX=\u6587\u4EF6\u7F16\u53F7
+GROUP_ID=\u7EC4ID
+ILLEGAL_PLACE=\u8FDD\u6CD5\u5730\u70B9
+LANE_NUMBER=\u8F66\u9053\u53F7
+MANUAL_CAPTURE=\u624B\u52A8\u6293\u62CD
+OPEN_STROBE=\u51FA\u5165\u53E3\u5F00\u95F8
+CLOSE_STROBE=\u51FA\u5165\u53E3\u5173\u95F8
+INDEX=\u5E8F\u53F7
+
+OPERATE=\u64CD\u4F5C
+FUNCTION=\u57FA\u672C
+
+UNDEFINED_COLOR=\u672A\u5B9A\u4E49\u989C\u8272
+BLACK=\u9ED1\u8272
+WHITE=\u767D\u8272
+RED=\u7EA2\u8272
+BLUE=\u84DD\u8272
+GREEN=\u7EFF\u8272
+YELLOW=\u9EC4\u8272
+GRAY=\u7070\u8272
+ORANGE=\u6A59\u8272
+
+LIGHT_DUTY=\u5C0F\u578B\u8F66
+MEDIUM=\u4E2D\u578B\u8F66
+OVER_SIZE=\u5927\u578B\u8F66
+MINI_SIZE=\u5FAE\u578B\u8F66
+LARGE_SIZE=\u957F\u8F66
+
+NO_PLATENUMBER=\u65E0\u8F66\u724C
+MANUALSNAP_SUCCEED=\u624B\u52A8\u6293\u62CD\u6210\u529F
+MANUALSNAP_FAILED=\u624B\u52A8\u6293\u62CD\u5931\u8D25
+
+OPEN_STROBE_SUCCEED=\u5F00\u95F8\u6210\u529F
+OPEN_STROBE_FAILED=\u5F00\u95F8\u5931\u8D25
+CLOSE_STROBE_SUCCEED=\u5173\u95F8\u6210\u529F
+CLOSE_STROBE_FAILED=\u5173\u95F8\u5931\u8D25
+
+EVENT_IVS_TRAFFICJUNCTION=\u4EA4\u901A\u5361\u53E3
+EVENT_IVS_TRAFFIC_RUNREDLIGHT=\u95EF\u7EA2\u706F
+EVENT_IVS_TRAFFIC_OVERLINE=\u538B\u8F66\u9053\u7EBF
+EVENT_IVS_TRAFFIC_RETROGRADE=\u9006\u884C
+EVENT_IVS_TRAFFIC_TURNLEFT=\u8FDD\u7AE0\u5DE6\u8F6C
+EVENT_IVS_TRAFFIC_TURNRIGHT=\u8FDD\u7AE0\u53F3\u8F6C
+EVENT_IVS_TRAFFIC_UTURN=\u8FDD\u7AE0\u6389\u5934
+EVENT_IVS_TRAFFIC_OVERSPEED=\u8D85\u901F
+EVENT_IVS_TRAFFIC_UNDERSPEED=\u4F4E\u901F
+EVENT_IVS_TRAFFIC_PARKING=\u8FDD\u7AE0\u505C\u8F66
+EVENT_IVS_TRAFFIC_WRONGROUTE=\u4E0D\u6309\u8F66\u9053\u884C\u9A76
+EVENT_IVS_TRAFFIC_CROSSLANE=\u8FDD\u7AE0\u53D8\u9053
+EVENT_IVS_TRAFFIC_OVERYELLOWLINE=\u538B\u9EC4\u7EBF
+EVENT_IVS_TRAFFIC_YELLOWPLATEINLANE=\u9EC4\u724C\u8F66\u5360\u9053
+EVENT_IVS_TRAFFIC_PEDESTRAINPRIORITY=\u6591\u9A6C\u7EBF\u884C\u4EBA\u4F18\u5148
+EVENT_IVS_TRAFFIC_MANUALSNAP=\u4EA4\u901A\u624B\u52A8\u6293\u62CD
+EVENT_IVS_TRAFFIC_VEHICLEINROUTE=\u6709\u8F66\u5360\u9053
+EVENT_IVS_TRAFFIC_VEHICLEINBUSROUTE=\u5360\u7528\u516C\u4EA4\u8F66\u9053
+EVENT_IVS_TRAFFIC_BACKING=\u8FDD\u7AE0\u5012\u8F66
+EVENT_IVS_TRAFFIC_PARKINGSPACEPARKING=\u8F66\u4F4D\u6709\u8F66
+EVENT_IVS_TRAFFIC_PARKINGSPACENOPARKING=\u8F66\u4F4D\u65E0\u8F66
+EVENT_IVS_TRAFFIC_WITHOUT_SAFEBELT=\u4EA4\u901A\u672A\u7CFB\u5B89\u5168\u5E26
+
+# DownLoad Info
+DOWNLOAD_RECORD_BYTIME=\u6309\u65F6\u95F4\u4E0B\u8F7D
+DOWNLOAD_RECORD_BYFILE=\u6309\u6587\u4EF6\u4E0B\u8F7D
+QUERY=\u67E5\u8BE2
+DOWNLOAD=\u4E0B\u8F7D
+STOP_DOWNLOAD=\u505C\u6B62\u4E0B\u8F7D
+START_TIME=\u5F00\u59CB\u65F6\u95F4
+END_TIME=\u7ED3\u675F\u65F6\u95F4
+RECORD_TYPE=\u5F55\u50CF\u7C7B\u578B
+
+GENERAL_RECORD=\u666E\u901A\u5F55\u50CF
+ALARM_RECORD=\u62A5\u8B66\u5F55\u50CF
+MOTION_DETECTION=\u79FB\u52A8\u68C0\u6D4B\u5F55\u50CF
+CARD_NUMBER_RECORD=\u5361\u53F7\u5F55\u50CF
+INTELLIGENT_DETECTION=\u667A\u80FD\u5F55\u50CF
+POS_RECORD=POS\u5F55\u50CF
+
+QUERY_RECORD_IS_NOT_EXIST=\u67E5\u8BE2\u5F55\u50CF\u4E0D\u5B58\u5728
+PLEASE_CHECK_RECORD_TIME=\u8BF7\u68C0\u67E5\u5F55\u50CF\u65F6\u95F4
+PLEASE_SELECT_TIME_AGAIN=\u8BF7\u91CD\u65B0\u9009\u62E9\u65F6\u95F4\uFF0C\u6700\u5927\u65F6\u95F4\u5DEE6\u5C0F\u65F6
+DOWNLOAD_COMPLETED=\u4E0B\u8F7D\u7ED3\u675F
+
+PLEASE_FIRST_QUERY_RECORD=\u8BF7\u5148\u67E5\u8BE2\u5F55\u50CF
+PLEASE_FIRST_SELECT_ROW_WITH_DATA=\u8BF7\u5148\u9009\u62E9\u6709\u5F55\u50CF\u7684\u4E00\u884C
+
+# Time Set
+YEAR=\u5E74
+MONTH=\u6708
+DAY=\u65E5
+HOUR=\u65F6
+MINUTE=\u5206
+SECOND=\u79D2
+CONFIRM=\u786E\u5B9A
+CANCEL=\u53D6\u6D88
+DATE_CHOOSER=\u65F6\u95F4\u9009\u62E9
+
+MONDAY=\u661F\u671F\u4E00
+TUESDAY=\u661F\u671F\u4E8C
+WEDNESDAY=\u661F\u671F\u4E09
+THURSDAY=\u661F\u671F\u56DB
+FRIDAY=\u661F\u671F\u4E94
+SATURDAY=\u661F\u671F\u516D
+SUNDAY=\u661F\u671F\u65E5
+
+# Talk
+TRANSMIT_TYPE=\u8F6C\u53D1\u7C7B\u578B
+LOCAL_TRANSMIT_TYPE=\u672C\u5730\uFF08\u4E0D\u8F6C\u53D1\uFF09
+REMOTE_TRANSMIT_TYPE=\u8FDC\u7A0B\uFF08\u8F6C\u53D1\uFF09
+TRANSMIT_CHANNEL=\u8F6C\u53D1\u901A\u9053
+START_TALK=\u5F00\u59CB\u901A\u8BDD
+STOP_TALK=\u7ED3\u675F\u901A\u8BDD
+TALK_FAILED=\u901A\u8BDD\u5931\u8D25
+
+# DeviceSearchAndInt
+DEVICESEARCH_OPERATE=\u8BBE\u5907\u641C\u7D22\u64CD\u4F5C
+DEVICESEARCH_RESULT=\u8BBE\u5907\u641C\u7D22\u7ED3\u679C
+DEVICEINIT=\u8BBE\u5907\u521D\u59CB\u5316
+
+DEVICESEARCH=\u8BBE\u5907\u641C\u7D22
+DEVICE_POINT_TO_POINT_SEARCH=\u8BBE\u5907IP\u70B9\u5BF9\u70B9\u641C\u7D22
+
+START_SEARCH=\u5F00\u59CB\u641C\u7D22
+STOP_SEARCH=\u505C\u6B62\u641C\u7D22
+
+START_IP=\u8D77\u59CBIP
+END_IP=\u7ED3\u675FIP
+
+DEVICE_TYPE=\u8BBE\u5907\u7C7B\u578B
+MAC=MAC
+SN=\u5E8F\u5217\u53F7
+DEVICE_INIT_STATE=\u521D\u59CB\u5316\u72B6\u6001
+INIT_PASSWD=\u521D\u59CB\u5316\u5BC6\u7801
+PHONE=\u624B\u673A\u53F7
+MAIL=\u90AE\u7BB1
+IP_VERSION=IP\u7248\u672C
+SUB_MASK=\u5B50\u7F51\u63A9\u7801
+GETWAY=\u7F51\u5173
+DETAIL_TYPE=\u8BE6\u7EC6\u7C7B\u578B
+HTTP_PORT=HTTP\u7AEF\u53E3\u53F7
+LOCAL_IP=\u672C\u5730ip
+CONFIRM_PASSWORD=\u786E\u8BA4\u5BC6\u7801
+
+OLD_DEVICE=\u8001\u8BBE\u5907
+DONOT_SUPPORT_INITIALIZATION=\u4E0D\u652F\u6301\u521D\u59CB\u5316
+NOT_INITIALIZED=\u672A\u521D\u59CB\u5316
+INITIALIZED=\u5DF2\u521D\u59CB\u5316
+
+THE_IP_CONTROL_SCOPE=\u8303\u56F4\u592A\u5927\uFF0C\u8BF7\u63A7\u5236\u57281000\u4E2A\u4E4B\u95F4
+PLEASE_FIRST_SELECT_INITIALIZED_DEVICE=\u8BF7\u5148\u9009\u62E9\u9700\u8981\u521D\u59CB\u5316\u7684\u8BBE\u5907
+PLEASE_INPUT_PHONE=\u8BF7\u8F93\u5165\u624B\u673A\u53F7
+PLEASE_INPUT_MAIL=\u8BF7\u8F93\u5165\u90AE\u7BB1
+INCONSISTENT=\u5BC6\u7801\u548C\u786E\u8BA4\u5BC6\u7801\u4E0D\u4E00\u81F4
+PLEASE_CHECK_IP=\u8BF7\u68C0\u67E5IP
+
+SEARCHING_WAITING=\u6B63\u5728\u641C\u7D22\uFF0C\u8BF7\u7B49\u5F85\u641C\u7D22\u7ED3\u675F
+
+START_LISTEN=\u5F00\u59CB\u76D1\u542C
+STOP_LISTEN=\u505C\u6B62\u76D1\u542C
+SHOW_ALARM_EVENT=\u62A5\u8B66\u4E8B\u4EF6\u7ED3\u679C\u4FE1\u606F
+ALARM_LISTEN_FAILED=\u62A5\u8B66\u76D1\u542C\u5931\u8D25
+ALARM_MESSAGE=\u62A5\u8B66\u4FE1\u606F
+
+EXTERNAL_ALARM=\u5916\u90E8\u62A5\u8B66
+MOTION_ALARM=\u52A8\u6001\u68C0\u6D4B\u62A5\u8B66
+VIDEOLOST_ALARM=\u89C6\u9891\u4E22\u5931\u62A5\u8B66
+SHELTER_ALARM=\u89C6\u9891\u906E\u6321\u62A5\u8B66
+DISKFULL_ALARM=\u786C\u76D8\u6EE1\u62A5\u8B66
+DISKERROR_ALARM=\u574F\u786C\u76D8\u62A5\u8B66
+START=\u5F00\u59CB
+STOP=\u7ED3\u675F
+
+CURRENT_TIME=\u5F53\u524D\u65F6\u95F4
+DEVICE_REBOOT=\u8BBE\u5907\u91CD\u542F
+SYNCHRONIZE_TIME=\u65F6\u95F4\u540C\u6B65
+REBOOT=\u91CD\u542F
+SET_TIME=\u8BBE\u7F6E\u65F6\u95F4
+GET_TIME=\u83B7\u53D6\u65F6\u95F4
+REBOOT_TIPS=\u60A8\u786E\u5B9A\u8981\u91CD\u542F\u5417\uFF1F
+OPERATE_SUCCESS=\u64CD\u4F5C\u6210\u529F
+
+#FaceRecognition
+FACE_GROUP_ID=\u4EBA\u8138\u5E93ID
+FACE_GROUP_NAME=\u4EBA\u8138\u5E93\u540D\u79F0
+PERSON_COUNT=\u4EBA\u5458\u4E2A\u6570
+
+GROUP_OPERATE=\u4EBA\u8138\u5E93\u64CD\u4F5C
+PERSON_OPERATE=\u4EBA\u5458\u64CD\u4F5C
+
+FACE_RECOGNITION_EVENT=\u76EE\u6807\u8BC6\u522B\u4E8B\u4EF6
+FACE_DETECT_EVENT=\u4EBA\u8138\u68C0\u6D4B\u4E8B\u4EF6
+
+GLOBAL_PICTURE=\u5168\u666F\u56FE
+PERSON_PICTURE=\u4EBA\u8138\u56FE
+CANDIDATE_PICTURE=\u5019\u9009\u4EBA\u56FE
+
+TIME=\u65F6\u95F4
+SEX=\u6027\u522B
+AGE=\u5E74\u9F84
+COLOR=
+EYE=\u773C\u775B
+MOUTH=\u5634\u5DF4
+MASK=\u53E3\u7F69
+BEARD=\u80E1\u5B50
+MALE=\u7537
+FEMALE=\u5973
+ID_CARD=\u8EAB\u4EFD\u8BC1
+OFFICE_CARD=\u519B\u5B98\u8BC1
+PASSPORT=\u62A4\u7167
+UNIDENTIFIED=\u672A\u8BC6\u522B
+HAVE_BEARD=\u6709\u80E1\u5B50
+NO_BEARD=\u6CA1\u80E1\u5B50
+OPEN_MOUTH=\u5F20\u5634
+CLOSE_MOUTH=\u95ED\u5634
+YELLOW_COLOR=
+BLACK_COLOR=
+WHITE_COLOR=
+OPEN_EYE=\u7741\u773C
+CLOSE_EYE=\u95ED\u773C
+SMILE=\u5FAE\u7B11
+ANGER=\u6124\u6012
+SADNESS=\u60B2\u4F24
+DISGUST=\u538C\u6076
+FEAR=\u5BB3\u6015
+SURPRISE=\u60CA\u8BB6
+NEUTRAL=\u6B63\u5E38
+LAUGH=\u5927\u7B11
+WEAR_MASK=\u6234\u53E3\u7F69
+NO_MASK=\u6CA1\u6234\u53E3\u7F69
+WEAR_GLASSES=\u6234\u773C\u955C
+NO_GLASSES=\u4E0D\u6234\u773C\u955C
+UNKNOW=\u672A\u77E5
+UNLIMITED=\u4E0D\u9650
+
+NAME=\u59D3\u540D
+BIRTHDAY=\u751F\u65E5
+ID_NO=\u8BC1\u4EF6\u53F7
+ID_TYPE=\u8BC1\u4EF6\u7C7B\u578B
+SIMILARITY=\u76F8\u4F3C\u5EA6
+UID=\u4EBA\u5458\u6807\u8BC6\u7B26
+STRANGER=\u964C\u751F\u4EBA
+GLASSES=\u773C\u955C
+PICTURE_PATH=\u56FE\u7247\u8DEF\u5F84
+FACE_LIBRARY_ID=\u4EBA\u8138\u5E93ID
+FACE_LIBRARY_NAME=\u4EBA\u8138\u5E93\u540D\u79F0
+
+
+ADD=\u6DFB\u52A0
+MODIFY=\u4FEE\u6539
+DELETE=\u5220\u9664
+FRESH=\u5237\u65B0
+ADD_GROUP=\u6DFB\u52A0\u4EBA\u8138\u5E93
+MODIFY_GROUP=\u4FEE\u6539\u4EBA\u8138\u5E93
+DEL_GROUP=\u5220\u9664\u4EBA\u8138\u5E93
+DISPOSITION=\u5E03\u63A7
+DEL_DISPOSITION=\u64A4\u63A7
+
+FIND_CONDITION=\u67E5\u627E\u6761\u4EF6
+FIND_PERSON=\u67E5\u627E\u4EBA\u5458
+ADD_PERSON=\u6DFB\u52A0\u4EBA\u5458
+MODIFY_PERSON=\u4FEE\u6539\u4EBA\u5458
+DEL_PERSON=\u5220\u9664\u4EBA\u5458
+
+PREVIOUSPAGE=\u4E0A\u4E00\u9875
+LASTPAGE=\u4E0B\u4E00\u9875
+SELECT_PICTURE=\u9009\u62E9\u56FE\u7247
+SEARCH_BY_PIC=\u4EE5\u56FE\u641C\u56FE
+DOWNLOAD_QUERY_PICTURE=\u4E0B\u8F7D\u67E5\u8BE2\u5230\u7684\u56FE\u7247
+FACE_LIBRARY=\u4EBA\u8138\u5E93
+HISTORY_LIBRARY=\u5386\u53F2\u5E93
+CHOOSE_FACE_PIC=\u8BF7\u9009\u62E9\u4EBA\u8138\u56FE\u7247
+EVENT_TYPE=\u4E8B\u4EF6\u7C7B\u578B
+PAGES_NUMBER=\u9875\u6570
+
+SIMILARITY_RANGE=\u76F8\u4F3C\u5EA6\u8303\u56F4[0, 100]
+PLEASE_INPUT_GROUPNAME=\u8BF7\u8F93\u5165\u4EBA\u8138\u5E93\u540D\u79F0
+PLEASE_SELECT_GROUP=\u8BF7\u9009\u62E9\u4EBA\u8138\u5E93
+
+PLEASE_SELECT_PERSON=\u8BF7\u9009\u62E9\u4EBA\u5458
+PLEASE_ADD_DISPOSITION_INFO=\u8BF7\u6DFB\u52A0\u5E03\u63A7\u4FE1\u606F
+PLEASE_SELECT_DEL_DISPOSITION_INFO=\u8BF7\u9009\u62E9\u64A4\u63A7\u4FE1\u606F
+
+#AutoRegister
+AUTOREGISTER_LISTEN=\u4E3B\u52A8\u6CE8\u518C\u76D1\u542C
+DEVICE_CONFIG=\u8BBE\u5907\u914D\u7F6E
+DEVICE_LIST=\u8BBE\u5907\u5217\u8868
+DEVICE_MANAGER=\u8BBE\u5907\u7BA1\u7406
+ADD_DEVICE=\u6DFB\u52A0\u8BBE\u5907
+MODIFY_DEVICE=\u4FEE\u6539\u8BBE\u5907
+DELETE_DEVICE=\u5220\u9664\u8BBE\u5907
+CLEAR_DEVICE=\u6E05\u7A7A\u8BBE\u5907
+IMPORT_DEVICE=\u5BFC\u5165\u8BBE\u5907
+EXPORT_DEVICE=\u5BFC\u51FA\u8BBE\u5907
+DEVICE_ID=\u8BBE\u5907ID
+ENABLE=\u542F\u7528
+REGISTER_ADDRESS=\u6CE8\u518C\u5730\u5740
+REGISTER_PORT=\u6CE8\u518C\u7AEF\u53E3\u53F7
+GET=\u83B7\u53D6
+SET=\u8BBE\u7F6E
+RECORD=\u5F55\u97F3
+DEVICE_LOGIN=\u8BBE\u5907\u5DF2\u767B\u5F55
+
+ALREADY_EXISTED=\u5DF2\u5B58\u5728
+ALREADY_EXISTED_WHETHER_OR_NOT_TO_COVER=\u5DF2\u5B58\u5728\uFF0C\u662F\u5426\u8986\u76D6(\u5426\uFF0C\u4E0D\u4F1A\u5BFC\u51FA)
+FILE_OPEN_PLEASE_CLOSE_FILE=\u6587\u4EF6\u88AB\u6253\u5F00\uFF0C\u8BF7\u5148\u5173\u95ED\u6587\u4EF6
+IMPORT_COMPLETION=\u5BFC\u5165\u5B8C\u6210
+EXPORT_COMPLETION=\u5BFC\u51FA\u5B8C\u6210
+FILE_NOT_EXIST=\u6587\u4EF6\u4E0D\u5B58\u5728
+
+PLEASE_INPUT=\u8BF7\u8F93\u5165
+MAX_SUPPORT_100=\u6700\u5927\u652F\u6301100\u4E2A
+
+#Attendance
+ATTENDANCE=\u8003\u52E4\u673A
+USER_ID=\u7528\u6237ID
+USER_NAME=\u7528\u6237\u540D
+CARD_NO=\u5361\u53F7
+QUERY_CONDITION=\u67E5\u8BE2\u6761\u4EF6
+USER_OPERATE=\u7528\u6237\u64CD\u4F5C
+FINGERPRINT_OPERATE=\u6307\u7EB9\u64CD\u4F5C
+OPERATE_BY_USER_ID=\u901A\u8FC7\u7528\u6237ID\u64CD\u4F5C\u6307\u7EB9
+OPERATE_BY_FINGERPRINT_ID=\u901A\u8FC7\u6307\u7EB9ID\u64CD\u4F5C\u6307\u7EB9
+FINGERPRINT_ID=\u6307\u7EB9ID
+SEARCH=\u67E5\u627E
+SEARCH_FINGERPRINT=\u67E5\u627E\u6307\u7EB9
+ADD_FINGERPRINT=\u6DFB\u52A0\u6307\u7EB9
+DELETE_FINGERPRINT=\u5220\u9664\u6307\u7EB9
+SUBSCRIBE=\u8BA2\u9605
+UNSUBSCRIBE=\u53D6\u6D88\u8BA2\u9605
+USER_LIST=\u7528\u6237\u5217\u8868
+NEXT_PAGE=\u4E0B\u4E00\u9875
+USER_INFO=\u7528\u6237\u4FE1\u606F
+DOOROPEN_METHOD=\u5F00\u95E8\u65B9\u5F0F
+FINGERPRINT=\u6307\u7EB9
+FINGERPRINT_INFO=\u6307\u7EB9\u4FE1\u606F
+FINGERPRINT_DATA=\u6307\u7EB9\u6570\u636E
+CARD=\u5361
+DELETE_FINGERPRINT_PROMPT=\u5C06\u4F1A\u5220\u9664\u8BE5\u7528\u6237\u4E0B\u6240\u6709\u6307\u7EB9\u6570\u636E
+SUBSCRIBE_FAILED=\u8BA2\u9605\u5931\u8D25
+FINGERPRINT_ID_ILLEGAL=\u6307\u7EB9ID\u975E\u6CD5
+FINGERPRINT_COLLECTION=\u6307\u7EB9\u91C7\u96C6
+START_COLLECTION=\u5F00\u59CB\u91C7\u96C6
+STOP_COLLECTION=\u505C\u6B62\u91C7\u96C6
+IN_THE_COLLECTION=\u91C7\u96C6\u4E2D...
+COLLECTION_COMPLETED=\u91C7\u96C6\u5B8C\u6210
+COLLECTION_FAILED=\u91C7\u96C6\u5931\u8D25
+FINGERPRINT_ID_NOT_EXIST=\u6307\u7EB9ID\u4E0D\u5B58\u5728
+USER_ID_EXCEED_LENGTH=\u7528\u6237ID\u8D85\u8FC7\u6700\u5927\u957F\u5EA6
+USER_NAME_EXCEED_LENGTH=\u7528\u6237\u540D\u8D85\u8FC7\u6700\u5927\u957F\u5EA6
+CARD_NO_EXCEED_LENGTH=\u5361\u53F7\u8D85\u8FC7\u6700\u5927\u957F\u5EA6
+CARD_NAME_EXCEED_LENGTH=\u5361\u540D\u8D85\u8FC7\u6700\u5927\u9650\u5236
+CARD_PASSWD_EXCEED_LENGTH=\u5361\u5BC6\u7801\u8D85\u8FC7\u6700\u5927\u9650\u5236
+
+#Gate
+
+GATE=\u4EBA\u8138\u5F00\u95E8
+CARD_OPERATE=\u5361\u64CD\u4F5C
+CARD_INFO=\u5361\u4FE1\u606F
+CARD_MANAGER=\u5361\u7BA1\u7406
+
+CLEAR=\u6E05\u7A7A
+
+OPEN_STATUS=\u5F00\u95E8\u72B6\u6001
+OPEN_METHOD=\u5F00\u95E8\u65B9\u5F0F
+
+TEMPERATURE=\u6E29\u5EA6
+MASK_STATUS=\u53E3\u7F69\u72B6\u6001
+
+CARD_UNKNOW=\u672A\u77E5\u5361
+CARD_GENERAL=\u4E00\u822C\u5361
+CARD_VIP=VIP\u5361
+CARD_GUEST=\u6765\u5BBE\u5361
+CARD_PATROL=\u5DE1\u903B\u5361
+CARD_BACKLIST=\u7981\u6B62\u540D\u5355\u5361
+CARD_COERCE=\u80C1\u8FEB\u5361
+CARD_POLLING=\u5DE1\u68C0\u5361
+CARD_MOTHERCARD=\u6BCD\u5361
+
+STATE_UNKNOWN=\u672A\u77E5
+STATE_NORMAL=\u6B63\u5E38
+STATE_LOSE=\u4E22\u5931
+STATE_LOGOFF=\u6CE8\u9500
+STATE_FREEZE=\u51BB\u7ED3
+STATE_ARREARS=\u6B20\u8D39
+STATE_OVERDUE=\u903E\u671F
+STATE_PREARREARS=\u9884\u6B20\u8D39
+
+RECORD_NO=\u8BB0\u5F55\u96C6\u7F16\u53F7
+CARD_NAME=\u5361\u540D
+CARD_STATUS=\u5361\u72B6\u6001
+CARD_PASSWORD=\u5361\u5BC6\u7801
+CARD_TYPE=\u5361\u7C7B\u578B
+CARD_NUM=\u8BC1\u4EF6\u53F7
+USE_TIMES=\u4F7F\u7528\u6B21\u6570
+IS_FIRST_ENTER=\u662F\u5426\u9996\u5361
+IS_VALID=\u662F\u5426\u6709\u6548
+VALID_PERIOD=\u6709\u6548\u671F
+VALID_START_TIME=\u6709\u6548\u5F00\u59CB\u65F6\u95F4
+VALID_END_TIME=\u6709\u6548\u7ED3\u675F\u65F6\u95F4
+FIRST_ENTER=\u9996\u5361
+NO_FIRST_ENTER=\u975E\u9996\u5361
+VALID=\u6709\u6548
+INVALID=\u65E0\u6548
+
+PLEASE_SELECT_CARD=\u8BF7\u9009\u62E9\u5361
+PLEASE_INPUT_CARDNO=\u8BF7\u8F93\u5165\u5361\u53F7
+PLEASE_INPUT_USERID=\u8BF7\u8F93\u5165\u7528\u6237ID
+WANT_CLEAR_ALL_INFO=\u4F60\u662F\u5426\u60F3\u8981\u6E05\u7A7A\u6240\u6709\u4FE1\u606F?
+
+ADD_CARD_INDO_FAILED=\u6DFB\u52A0\u5361\u4FE1\u606F\u5931\u8D25
+ADD_CARD_INFO_AND_PERSON_PICTURE_SUCCEED=\u6DFB\u52A0\u5361\u4FE1\u606F\u548C\u4EBA\u8138\u6210\u529F
+ADD_CARD_INFO_SUCCEED_BUT_ADD_PERSON_PICTURE_FAILED=\u6DFB\u52A0\u5361\u4FE1\u606F\u6210\u529F\uFF0C\u4F46\u6DFB\u52A0\u4EBA\u8138\u5931\u8D25
+CARD_EXISTED_ADD_PERSON_PICTURE_SUCCEED=\u5361\u4FE1\u606F\u5DF2\u5B58\u5728\uFF0C\u6DFB\u52A0\u4EBA\u8138\u6210\u529F
+
+MODIFY_CARD_INFO_SUCCEED=\u4FEE\u6539\u5361\u4FE1\u606F\u6210\u529F
+MODIFY_CARD_INFO_FAILED=\u4FEE\u6539\u5361\u4FE1\u606F\u5931\u8D25
+MODIFY_CARD_INFO_AND_PERSON_PICTURE_SUCCEED=\u4FEE\u6539\u5361\u4FE1\u606F\u548C\u4EBA\u8138\u6210\u529F
+MODIFY_CARD_INFO_SUCCEED_BUT_MODIFY_PERSON_PICTURE_FAILED=\u4FEE\u6539\u5361\u4FE1\u606F\u6210\u529F\uFF0C\u4F46\u4FEE\u6539\u4EBA\u8138\u5931\u8D25
+
+NET_ACCESS_DOOROPEN_METHOD_UNKNOWN=\u672A\u77E5
+NET_ACCESS_DOOROPEN_METHOD_PWD_ONLY=\u5BC6\u7801\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_CARD=\u5237\u5361\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_CARD_FIRST=\u5148\u5237\u5361\u540E\u5BC6\u7801\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_PWD_FIRST=\u5148\u5BC6\u7801\u540E\u5237\u5361\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_REMOTE=\u8FDC\u7A0B\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_BUTTON=\u5F00\u9501\u6309\u94AE\u8FDB\u884C\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT=\u6307\u7EB9\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_PWD_CARD_FINGERPRINT=\u5BC6\u7801+\u5237\u5361+\u6307\u7EB9\u7EC4\u5408\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_PWD_FINGERPRINT=\u5BC6\u7801+\u6307\u7EB9\u7EC4\u5408\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_CARD_FINGERPRINT=\u5237\u5361+\u6307\u7EB9\u7EC4\u5408\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_PERSONS=\u591A\u4EBA\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_KEY=\u94A5\u5319\u5F00\u95E8
+NET_ACCESS_DOOROPEN_METHOD_COERCE_PWD=\u80C1\u8FEB\u5BC6\u7801\u5F00\u95E8
+NET_ACCESS_DOOROPEN_METHOD_QRCODE=\u4E8C\u7EF4\u7801\u5F00\u95E8
+NET_ACCESS_DOOROPEN_METHOD_FACE_RECOGNITION=\u76EE\u6807\u8BC6\u522B\u5F00\u95E8
+NET_ACCESS_DOOROPEN_METHOD_FACEIDCARD=\u4EBA\u8BC1\u5BF9\u6BD4
+NET_ACCESS_DOOROPEN_METHOD_FACEIDCARD_AND_IDCARD=\u8EAB\u4EFD\u8BC1+ \u4EBA\u8BC1\u6BD4\u5BF9
+NET_ACCESS_DOOROPEN_METHOD_BLUETOOTH=\u84DD\u7259\u5F00\u95E8
+NET_ACCESS_DOOROPEN_METHOD_CUSTOM_PASSWORD=\u4E2A\u6027\u5316\u5BC6\u7801\u5F00\u95E8
+NET_ACCESS_DOOROPEN_METHOD_USERID_AND_PWD=UserID+\u5BC6\u7801
+NET_ACCESS_DOOROPEN_METHOD_FACE_AND_PWD=\u4EBA\u8138+\u5BC6\u7801\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_AND_PWD=\u6307\u7EB9+\u5BC6\u7801\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_AND_FACE=\u6307\u7EB9+\u4EBA\u8138\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_CARD_AND_FACE=\u5237\u5361+\u4EBA\u8138\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_FACE_OR_PWD=\u4EBA\u8138\u6216\u5BC6\u7801\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_OR_PWD=\u6307\u7EB9\u6216\u5BC6\u7801\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_OR_FACE=\u6307\u7EB9\u6216\u4EBA\u8138\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FACE=\u5237\u5361\u6216\u4EBA\u8138\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FINGERPRINT=\u5237\u5361\u6216\u6307\u7EB9\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_AND_FACE_AND_PWD=\u6307\u7EB9+\u4EBA\u8138+\u5BC6\u7801\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_CARD_AND_FACE_AND_PWD=\u5237\u5361+\u4EBA\u8138+\u5BC6\u7801\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_CARD_AND_FINGERPRINT_AND_PWD=\u5237\u5361+\u6307\u7EB9+\u5BC6\u7801\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_CARD_AND_PWD_AND_FACE=\u5361+\u6307\u7EB9+\u4EBA\u8138\u7EC4\u5408\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_OR_FACE_OR_PWD=\u6307\u7EB9\u6216\u4EBA\u8138\u6216\u5BC6\u7801
+NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FACE_OR_PWD =\u5361\u6216\u4EBA\u8138\u6216\u5BC6\u7801\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FINGERPRINT_OR_FACE=\u5361\u6216\u6307\u7EB9\u6216\u4EBA\u8138\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_CARD_AND_FINGERPRINT_AND_FACE_AND_PWD=\u5361+\u6307\u7EB9+\u4EBA\u8138+\u5BC6\u7801\u7EC4\u5408\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FINGERPRINT_OR_FACE_OR_PWD=\u5361\u6216\u6307\u7EB9\u6216\u4EBA\u8138\u6216\u5BC6\u7801\u5F00\u9501
+NET_ACCESS_DOOROPEN_METHOD_FACEIPCARDANDIDCARD_OR_CARD_OR_FACE=(\u8EAB\u4EFD\u8BC1+\u4EBA\u8BC1\u6BD4\u5BF9)\u6216 \u5237\u5361 \u6216 \u4EBA\u8138
+NET_ACCESS_DOOROPEN_METHOD_FACEIDCARD_OR_CARD_OR_FACE=\u4EBA\u8BC1\u6BD4\u5BF9 \u6216 \u5237\u5361(\u4E8C\u7EF4\u7801) \u6216 \u4EBA\u8138
+
+#ThemalCamera
+THERMAL_CAMERA=\u70ED\u6210\u50CF
+THERMAL_OPERATE=\u64CD\u4F5C
+POINT_QUERY=\u67E5\u8BE2\u6D4B\u6E29\u70B9
+ITEM_QUERY=\u67E5\u8BE2\u6D4B\u6E29\u9879
+TEMPER_QUERY=\u67E5\u8BE2\u6E29\u5EA6
+HEATMAP=\u70ED\u56FE\u4FE1\u606F
+POINT_TEMPER=\u6D4B\u6E29\u70B9
+ITEM_TEMPER=\u6D4B\u6E29\u9879
+X=X
+Y=Y
+COORDINATE_ILLEGAL=\u5750\u6807\u975E\u6CD5
+QUERY_RESULT=\u67E5\u8BE2\u7ED3\u679C
+METER_TYPE=\u6D4B\u6E29\u9879\u7C7B\u522B
+TEMPER_UNIT=\u6E29\u5EA6\u5355\u4F4D
+TEMPER=\u6E29\u5EA6
+UNKNOWN=\u672A\u77E5
+SPOT=\u70B9
+LINE=\u7EBF
+AREA=\u533A\u57DF
+CENTIGRADE=\u6444\u6C0F\u5EA6
+FAHRENHEIT=\u534E\u6C0F\u5EA6
+PRESET_ID=\u9884\u7F6E\u70B9\u7F16\u53F7
+RULE_ID=\u89C4\u5219\u7F16\u53F7
+TEMPER_AVER=\u5E73\u5747\u6E29\u5EA6
+TEMPER_MAX=\u6700\u9AD8\u6E29\u5EA6
+TEMPER_MIN=\u6700\u4F4E\u6E29\u5EA6
+TEMPER_MID=\u4E2D\u95F4\u6E29\u5EA6
+TEMPER_STD=\u6807\u51C6\u65B9\u5DEE
+INPUT_ILLEGAL=\u8F93\u5165\u975E\u6CD5
+TEMPER_INFO=\u6D4B\u6E29\u4FE1\u606F
+FIVE_MINUTES=\u4E94\u5206\u949F
+TEN_MINUTES=\u5341\u5206\u949F
+FIFTEEN_MINUTES=\u5341\u4E94\u5206\u949F
+THIRTY_MINUTES=\u4E09\u5341\u5206\u949F
+SAVE_PERIOD=\u4FDD\u5B58\u5468\u671F
+QUERY_LIST=\u67E5\u8BE2\u5217\u8868
+RECORD_TIME=\u8BB0\u5F55\u65F6\u95F4
+ITEM_NAME=\u540D\u79F0
+COORDINATE=\u5750\u6807
+NO_RECORD=\u65E0\u8BB0\u5F55
+HEATMAP_OPERATE=\u64CD\u4F5C
+IDLE=\u7A7A\u95F2
+ACQUIRING=\u83B7\u53D6\u4E2D
+RADIOMETRY_ATTACH=\u8BA2\u9605\u70ED\u56FE\u6570\u636E
+RADIOMETRY_DETACH=\u505C\u6B62\u8BA2\u9605
+RADIOMETRY_FETCH=\u83B7\u53D6\u70ED\u56FE
+SAVE_HEATMAP=\u4FDD\u5B58\u70ED\u56FE
+HEATMAP_METADATA_INFO=\u70ED\u56FE\u5143\u6570\u636E
+HEIGHT=\u9AD8
+WIDTH=\u5BBD
+LENGTH=\u6570\u636E\u5927\u5C0F
+SENSOR_TYPE=\u673A\u82AF\u7C7B\u578B
+HEATMAP_SAVE_SUCCESS=\u70ED\u56FE\u4FDD\u5B58\u6210\u529F
+
+# matrix screen
+MATRIX_SCREEN=\u70B9\u9635\u5C4F\u4E0B\u53D1
+PASSING_STATE=\u8FC7\u8F66\u72B6\u6001
+PASSING_CAR=\u8FC7\u8F66
+NO_CAR=\u65E0\u8F66
+IN_TIME=\u5165\u573A\u65F6\u95F4
+OUT_TIME=\u51FA\u573A\u65F6\u95F4
+PLATE_NUMBER=\u8F66\u724C\u53F7\u7801
+CAR_OWNER=\u8F66\u4E3B
+PARKING_TIME=\u505C\u8F66\u65F6\u957F
+USER_TYPE=\u7528\u6237\u7C7B\u578B
+MONTHLY_CARD_USER=\u6708\u5361\u7528\u6237
+ANNUAL_CARD_USER=\u5E74\u5361\u7528\u6237
+LONG_TERM_USER=\u957F\u671F\u7528\u6237/VIP
+TEMPORARY_USER=\u4E34\u65F6\u7528\u6237/Visitor
+PARKING_CHARGE=\u505C\u8F66\u8D39
+DAYS_DUE=\u5230\u671F\u5929\u6570
+REMAINING_PARKING_SPACES=\u5269\u4F59\u8F66\u4F4D
+VEHICLES_NOT_ALLOWED_TO_PASS=\u4E0D\u5141\u8BB8\u8F66\u8F86\u901A\u8FC7
+ALLOWED_VEHICLES_TO_PASS=\u5141\u8BB8\u8F66\u8F86\u901A\u8FC7
+SET_UP=\u8BBE\u7F6E
+SUCCESSFULLY_ISSUED=\u4E0B\u53D1\u6210\u529F
+DELIVERY_FAILED=\u4E0B\u53D1\u5931\u8D25
+CUSTOM_USER_CLASS=\u81EA\u5B9A\u4E49\u7528\u6237\u7C7B
+REMARKS_INFORMATION=\u5907\u6CE8\u4FE1\u606F
+CUSTOM_INFORMATION=\u81EA\u5B9A\u4E49\u4FE1\u606F
+
+# \uFFFD\uFFFD\uFFFD\uFFFD\u0373\uFFFD\uFFFD
+HUMAN_NUMBER_STATISTIC_TITLE=\u4EBA\u6570\u7EDF\u8BA1
+HUMAN_NUMBER_STATISTIC_CONTROL=\u4EBA\u6570\u7EDF\u8BA1\u63A7\u5236
+
+HUMAN_NUMBER_STATISTIC_EVENT_TITLE=\u4EBA\u6570\u7EDF\u8BA1\u4E8B\u4EF6\u5217\u8868
+
+HUMAN_NUMBER_STATISTIC_EVENT_CHANNEL=\u901A\u9053
+HUMAN_NUMBER_STATISTIC_EVENT_TIME=\u4E8B\u4EF6\u65F6\u523B
+HUMAN_NUMBER_STATISTIC_EVENT_HOUR_IN=\u672C\u5C0F\u65F6\u8FDB
+HUMAN_NUMBER_STATISTIC_EVENT_HOUR_OUT=\u672C\u5C0F\u65F6\u51FA
+HUMAN_NUMBER_STATISTIC_EVENT_TODAY_IN=\u4ECA\u65E5\u8FDB
+HUMAN_NUMBER_STATISTIC_EVENT_TODAY_OUT=\u4ECA\u65E5\u51FA
+HUMAN_NUMBER_STATISTIC_EVENT_TOTAL_IN=\u603B\u5171\u8FDB
+HUMAN_NUMBER_STATISTIC_EVENT_TOTAL_OUT=\u603B\u5171\u51FA
+
+HUMAN_NUMBER_STATIC_EVENT_OSD_CLEAR=OSD\u6E05\u9664
+
+VTO_ALARM_EVENT_ROOM_NO=\u623F\u95F4\u53F7
+VTO_ALARM_EVENT_CARD_NO=\u5361\u53F7
+VTO_ALARM_EVENT_TIME=\u65F6\u95F4
+VTO_ALARM_EVENT_OPEN_METHOD=\u5F00\u95E8\u65B9\u5F0F
+VTO_ALARM_EVENT_STATUS=\u72B6\u6001
+
+VTO_REAL_LOAD_ROOM_NO=\u623F\u95F4\u53F7
+VTO_REAL_LOAD_CARD_NO=\u5361\u53F7
+VTO_REAL_LOAD_TIME=\u65F6\u95F4
+VTO_REAL_LOAD_EVENT_INFO=\u4E8B\u4EF6\u4FE1\u606F
+
+VTO_OPERATE_MANAGER_TITLE=\u5361\u4E0E\u6307\u7EB9\u4E0E\u4EBA\u8138\u7BA1\u7406
+VTO_OPERATE_MANAGER_REC_NO=\u7F16\u53F7
+VTO_OPERATE_MANAGER_ROOM_NO=\u623F\u95F4\u53F7
+VTO_OPERATE_MANAGER_CARD_NO=\u5361\u53F7
+VTO_OPERATE_MANAGER_FINGER_PRINT_DATA=\u6307\u7EB9\u6570\u636E
+
+VTO_OPERATE_INFO_TITLE=\u589E\u52A0
+
+VTO_OPERATE_COLLECTION_FINGER_PRINT_TITLE=\u91C7\u96C6\u6307\u7EB9
+DOOR_OPEN=\u5F00\u95E8
+DOOR_CLOSE=\u5173\u95E8
+EVENT_OPERATE=\u4E8B\u4EF6\u64CD\u4F5C
+START_REAL_LOAD_PIC=\u5F00\u59CB\u667A\u80FD\u76D1\u542C
+STOP_REAL_LOAD_PIC=\u505C\u6B62\u667A\u80FD\u76D1\u542C
+ALARM_EVENT=\u62A5\u8B66\u4E8B\u4EF6
+REAL_LOAD_EVENT=\u667A\u80FD\u4E8B\u4EF6
+COLLECTION_RESULT=\u91C7\u96C6\u7ED3\u679C
+NEED_FINGER_PRINT=\u9700\u8981\u6307\u7EB9
+FACE_INFO=\u4EBA\u8138\u4FE1\u606F
+OPEN=\u6253\u5F00
+VTO=\u53EF\u89C6\u5BF9\u8BB2\u95E8\u53E3\u673A
+TRAFFIC_ALLOW_LIST=\u667A\u80FD\u4EA4\u901A\u5141\u8BB8\u540D\u5355
+MODIFY_CARD_FACE_FAILED=\u4FEE\u6539\u4EBA\u8138\u5931\u8D25
+EM_MASK_STATE_UNKNOWN=\u672A\u77E5
+EM_MASK_STATE_NODISTI=\u672A\u8BC6\u522B
+EM_MASK_STATE_NOMASK=\u6CA1\u6234\u53E3\u7F69
+EM_MASK_STATE_WEAR=\u6234\u53E3\u7F69
+
+END_SEARCH=\u67E5\u8BE2\u7ED3\u675F
+DOWNLOAD_PICTURE=\u4E0B\u8F7D\u56FE\u7247
+ENTER_PICTURE_PATH=\u8BF7\u8F93\u5165\u56FE\u7247\u8DEF\u5F84
+LOADING=\u8BBE\u5907\u6B63\u5728\u5904\u7406\u4E2D
+REMOTE_OPEN_DOOR=\u8FDC\u7A0B\u5F00\u95E8
+QUERY_CARD_EXIST_FAILED=\u68C0\u67E5\u5361\u53F7\u662F\u5426\u5B58\u5728\u5931\u8D25
+CARD_EXIST=\u5361\u53F7\u5DF2\u5B58\u5728
+INPUT_ROOM_NO=\u8BF7\u8F93\u5165\u623F\u95F4\u53F7
+ROOM_NO_EXCEED_LENGTH=\u623F\u95F4\u53F7\u8D85\u8FC7\u6700\u5927\u957F\u5EA6
+REMOVE_CARD_FACE_FAILED=\u5220\u9664\u4EBA\u8138\u5931\u8D25
+
+
+#SCADA
+SCADA=\u52A8\u73AF\u4E3B\u673A
+SCADA_DEVICE_LIST=\u8BBE\u5907\u8868
+SCADA_POINT_LIST=\u70B9\u4F4D\u8868
+SCADA_ATTACH_ALARM=\u8BA2\u9605\u62A5\u8B66
+SCADA_ATTACH_INFO=\u8BA2\u9605\u4FE1\u606F
+SCADA_ATTACH=\u8BA2\u9605
+BTN_LIST = \u83B7\u53D6
+BTN_ATTACH = \u8BA2\u9605
+
+STOP_LISTEN_FAILED=\u505C\u6B62\u76D1\u542C\u5931\u8D25
+
+SCREEN_NUMBER=\u5C4F\u5E55\u7F16\u53F7
+TEXT_CONTENT=\u6587\u672C\u5185\u5BB9
+TEXT_CONTENT_TYPE=\u6587\u672C\u7C7B\u578B
+TEXT_CONTENT_COLOR=\u6587\u672C\u989C\u8272
+SCROLL_TYPE=\u6EDA\u52A8\u7C7B\u578B
+SCROLL_SPEED=\u6EDA\u52A8\u901F\u5EA6
+
+ORDINARY=\u666E\u901A
+QR_CODE=\u4E8C\u7EF4\u7801
+LOCAL_TIME=\u672C\u5730\u65F6\u95F4
+RESOURCE=\u8D44\u6E90\u6587\u4EF6
+
+NOT_ROLLING=\u4E0D\u6EDA\u52A8
+SCROLL_LEFT_AND_RIGHT=\u5DE6\u53F3\u6EDA\u52A8
+SCROLL_UP_AND_DOWN=\u4E0A\u4E0B\u7FFB\u9875\u6EDA\u52A8
+
+NUMBER_STRING=\u6570\u5B57\u5B57\u7B26\u4E32
+VOICE_TEXT=\u8BED\u97F3\u6587\u672C
+ISSUED=\u4E0B\u53D1
+PROMPT=\u8BF7\u6DFB\u52A0\u5BF9\u5E94\u53C2\u6570
+
+DEVICE_NAME=\u8BBE\u5907\u540D\u79F0
+POINT_ID=\u70B9\u4F4DID
+IF_VALID_SIGNAL_POINT=\u662F\u5426\u6709\u6548\u4FE1\u53F7\u70B9
+POINT_NAME=\u70B9\u4F4D\u540D\u79F0
+ALARM_DESCRIBE=\u62A5\u8B66\u63CF\u8FF0
+ALARM_LEVEL=\u62A5\u8B66\u7EA7\u522B
+ALARM_DELAY=\u62A5\u8B66\u65F6\u5EF6
+ALARM_TYPE=\u62A5\u8B66\u7C7B\u578B
+ALARM_TIME=\u62A5\u8B66\u65F6\u95F4
+COLLECT_TIME=\u91C7\u96C6\u65F6\u95F4
+
+
+ALLOWLIST_OPERATION=\u5141\u8BB8\u540D\u5355\u64CD\u4F5C
+SINGLE_UPLOAD =\u5355\u4E2A\u4E0A\u4F20
+LICENSE_PLATE_RUN=\u8F93\u5165\u8981\u67E5\u7684\u8F66\u724C\u53F7
+FUZZY_QUERY=\u6A21\u7CCA\u67E5\u8BE2
+DELETE_ALL=\u5168\u90E8\u5220\u9664
+AUTHORIZATION=\u6388\u6743
+UNAUTHORIZATION=\u672A\u6388\u6743
+BATCH_UPLOAD=\u6279\u91CF\u4E0A\u4F20
+BROWSE=\u6D4F\u89C8
+UPLOAD=\u4E0A\u4F20
+QUERY_INFORMATION=\u67E5\u8BE2\u4FE1\u606F
+DIALOG=\u5BF9\u8BDD\u6846
+LICENSE_PLATE_NUMBER=\u8F66\u724C\u53F7
+MODIFY_PANEL=\u4FEE\u6539\u9762\u677F
+SERIAL_NUMBER=\u5E8F\u53F7
+OPEN_MODEL=\u5F00\u95F8\u6A21\u5F0F
+LICENSE_PLATE_LENGTH_TOO_LONG=\u8F66\u724C\u957F\u5EA6\u8FC7\u957F
+NAME_TOO_LONG=\u540D\u5B57\u957F\u5EA6\u8FC7\u957F
+ADD_SUCCESS=\u6DFB\u52A0\u6210\u529F
+ADD_FAIL=\u6DFB\u52A0\u5931\u8D25
+DELETE_SUCCESS=\u5220\u9664\u6210\u529F
+DELETE_FAIL=\u5220\u9664\u5931\u8D25
+MODIFY_SUCCESS=\u4FEE\u6539\u6210\u529F
+MODIFY_FAIL=\u4FEE\u6539\u5931\u8D25
+UPLOAD_SUCCESS=\u4E0A\u4F20\u6210\u529F
+ENTER_QUERY_DATA=\u8BF7\u8F93\u5165\u8981\u67E5\u8BE2\u7684\u6570\u636E
+FILLING_RULES=\u586B\u5199\u5408\u6CD5\u5B57\u7B26
+UPLOAD_FAIL=\u4E0A\u4F20\u5931\u8D25
+UPLOADING=\u6B63\u5728\u4E0A\u4F20
+SURE_UPLOAD=\u786E\u5B9A\u4E0A\u4F20?
+DATA_NUMBER=\u6761\u6570\u636E
+SELECT_DATA=\u8BF7\u9009\u62E9\u6570\u636E
+
+
diff --git a/ard-device/src/main/java/com/ard/device/camera/domain/ArdCamera.java b/ard-device/src/main/java/com/ard/device/camera/domain/ArdCamera.java
index 317f995..135810d 100644
--- a/ard-device/src/main/java/com/ard/device/camera/domain/ArdCamera.java
+++ b/ard-device/src/main/java/com/ard/device/camera/domain/ArdCamera.java
@@ -141,6 +141,13 @@
*/
private Integer chanNo;
+
+ /**
+ * 挂载机场ID
+ */
+ @Excel(name = "挂载机场")
+ private Integer dockId;
+
@Override
public int hashCode() {
return id.hashCode();
diff --git a/ard-device/src/main/resources/mapper/ArdCameraMapper.xml b/ard-device/src/main/resources/mapper/ArdCameraMapper.xml
index e764bdf..01354f1 100644
--- a/ard-device/src/main/resources/mapper/ArdCameraMapper.xml
+++ b/ard-device/src/main/resources/mapper/ArdCameraMapper.xml
@@ -19,6 +19,7 @@
<result property="longitude" column="longitude"/>
<result property="latitude" column="latitude"/>
<result property="altitude" column="altitude"/>
+ <result property="dockId" column="dock_id"/>
<result property="userId" column="user_id"/>
<result property="deptId" column="dept_id"/>
<result property="loginId" column="login_id"/>
@@ -78,6 +79,7 @@
c.longitude,
c.latitude,
c.altitude,
+ c.dock_id,
c.user_id,
c.dept_id,
c.login_id,
@@ -108,6 +110,7 @@
<if test="longitude != null ">and c.longitude = #{longitude}</if>
<if test="latitude != null ">and c.latitude = #{latitude}</if>
<if test="altitude != null ">and c.altitude = #{altitude}</if>
+ <if test="dockId != null ">and c.dock_id = #{dockId}</if>
<if test="loginId != null ">and c.login_id = #{loginId}</if>
<if test="state != null ">and c.state = #{state}</if>
<if test="deptId != null and deptId != 0">
@@ -145,6 +148,7 @@
<if test="longitude != null">longitude,</if>
<if test="latitude != null">latitude,</if>
<if test="altitude != null">altitude,</if>
+ <if test="dockId != null">dock_id,</if>
<if test="loginId != null">login_id,</if>
<if test="deptId != null">dept_id,</if>
<if test="userId != null">user_id,</if>
@@ -169,6 +173,7 @@
<if test="longitude != null">#{longitude},</if>
<if test="latitude != null">#{latitude},</if>
<if test="altitude != null">#{altitude},</if>
+ <if test="dockId != null">#{dockId},</if>
<if test="loginId != null">#{loginId},</if>
<if test="deptId != null">#{deptId},</if>
<if test="userId != null">#{userId},</if>
@@ -196,6 +201,7 @@
<if test="longitude != null">longitude = #{longitude},</if>
<if test="latitude != null">latitude = #{latitude},</if>
<if test="altitude != null">altitude = #{altitude},</if>
+ <if test="dockId != null">dock_id = #{dockId},</if>
<if test="loginId != null">login_id = #{loginId},</if>
<if test="deptId != null">dept_id = #{deptId},</if>
<if test="userId != null">user_id = #{userId},</if>
diff --git a/ard-work/pom.xml b/ard-work/pom.xml
index 1b5bcd0..6d3b0ce 100644
--- a/ard-work/pom.xml
+++ b/ard-work/pom.xml
@@ -106,6 +106,10 @@
<groupId>com.ard</groupId>
<artifactId>ard-vtdu</artifactId>
</dependency>
+ <dependency>
+ <groupId>com.ard</groupId>
+ <artifactId>ard-system</artifactId>
+ </dependency>
</dependencies>
<repositories>
<repository>
diff --git a/ard-work/src/main/java/com/ard/work/component/forest/TokenInterceptor.java b/ard-work/src/main/java/com/ard/work/component/forest/TokenInterceptor.java
index 72318db..e0d89c4 100644
--- a/ard-work/src/main/java/com/ard/work/component/forest/TokenInterceptor.java
+++ b/ard-work/src/main/java/com/ard/work/component/forest/TokenInterceptor.java
@@ -1,7 +1,7 @@
package com.ard.work.component.forest;
-import com.ard.work.config.TyConfiguration;
import com.ard.work.domain.receiver.AccessTokenReceiver;
+import com.ard.work.service.IArdServerService;
import com.dtflys.forest.http.ForestRequest;
import com.dtflys.forest.interceptor.Interceptor;
import lombok.extern.slf4j.Slf4j;
@@ -12,7 +12,7 @@
@Slf4j
public class TokenInterceptor<T> implements Interceptor<T> {
@Resource
- private TyConfiguration tyConfiguration;
+ private IArdServerService ardServerService;
/**
* 该方法在请求发送之前被调用, 若返回false则不会继续发送请求
@@ -21,14 +21,11 @@
*/
@Override
public boolean beforeExecute(ForestRequest req) {
- log.info("invoke Simple beforeExecute");
- // 执行在发送请求之前处理的代码
- // 从缓存里获取token
- AccessTokenReceiver accessToken = tyConfiguration.getAccessToken();
+ log.debug("invoke Simple beforeExecute");
+ String baseUrl = (String) req.getVariableValue("baseUrl");
+ AccessTokenReceiver accessToken = ardServerService.getAccessTokenByBaseUrl(baseUrl);
req.addHeader("x-cid", accessToken.getCompanyId());
req.addHeader("x-token", accessToken.getAccessToken());
- // req.addHeader("Authorization", "")); // 添加Header
- // req.addQuery("username", "foo"); // 添加URL的Query参数
return true; // 继续执行请求返回true
}
}
\ No newline at end of file
diff --git a/ard-work/src/main/java/com/ard/work/component/forest/TyClient.java b/ard-work/src/main/java/com/ard/work/component/forest/TyClient.java
index 5842d16..cc39ed4 100644
--- a/ard-work/src/main/java/com/ard/work/component/forest/TyClient.java
+++ b/ard-work/src/main/java/com/ard/work/component/forest/TyClient.java
@@ -15,43 +15,43 @@
* @author liusuyi
* @date 2024年10月21日14:45
**/
-@BaseRequest(
- baseURL = "http://#{tianyu.endpoint}" // 默认域名
-)
public interface TyClient {
/**
* 获取云盒TOKEN
*/
- @Post(TyConst.POST_TOKEN)
- TyHttpCommonReceiver<AccessTokenReceiver> getToken(@JSONBody TokenDTO tokenDTO);
+ @Post("{baseUrl}" + TyConst.POST_TOKEN)
+ TyHttpCommonReceiver<AccessTokenReceiver> getToken(@Var("baseUrl") String baseUrl, @JSONBody TokenDTO tokenDTO);
/**
* 获取云盒列表
*/
- @Get(value = TyConst.GET_BOX_LIST,interceptor = TokenInterceptor.class)
- TyHttpCommonReceiver<List<BoxInfoReceiver>> getBoxList();
+ @Get(value = "{baseUrl}" + TyConst.GET_BOX_LIST, interceptor = TokenInterceptor.class)
+ TyHttpCommonReceiver<List<BoxInfoReceiver>> getBoxList(@Var("baseUrl") String baseUrl);
/**
* 获取直播地址
*/
- @Get(value =TyConst.GET_BOX_LIVE_URL,interceptor = TokenInterceptor.class)
- TyHttpCommonReceiver<BoxStreamUrlReceiver> getBoxLiveUrl(@Var("boxSn") String boxSn);
+ @Get(value = "{baseUrl}" + TyConst.GET_BOX_LIVE_URL, interceptor = TokenInterceptor.class)
+ TyHttpCommonReceiver<BoxStreamUrlReceiver> getBoxLiveUrl(@Var("baseUrl") String baseUrl,
+ @Var("boxSn") String boxSn);
/**
* 获取飞行历史
*/
- @Post(value =TyConst.POST_BOX_HISTORY,interceptor = TokenInterceptor.class)
- TyHttpCommonReceiver<List<BoxHistoryReceiver>> getBoxHistory(@JSONBody BoxHistoryDTO boxHistoryDTO);
+ @Post(value = "{baseUrl}" + TyConst.POST_BOX_HISTORY, interceptor = TokenInterceptor.class)
+ TyHttpCommonReceiver<List<BoxHistoryReceiver>> getBoxHistory(@Var("baseUrl") String baseUrl,
+ @JSONBody BoxHistoryDTO boxHistoryDTO);
/**
* 获取任务照片
*/
- @Post(value =TyConst.POST_BOX_PHOTOS,interceptor = TokenInterceptor.class)
- TyHttpCommonReceiver<List<BoxPhotosReceiver>> getBoxPhotos(@JSONBody BoxPhotosDTO boxPhotosDTO);
+ @Post(value = "{baseUrl}" + TyConst.POST_BOX_PHOTOS, interceptor = TokenInterceptor.class)
+ TyHttpCommonReceiver<List<BoxPhotosReceiver>> getBoxPhotos(@Var("baseUrl") String baseUrl,
+ @JSONBody BoxPhotosDTO boxPhotosDTO);
/**
* 修改云盒设置
*/
- @Post(value =TyConst.POST_BOX_UPDATE,interceptor = TokenInterceptor.class)
- TyHttpCommonReceiver<?> updateBoxSettings(@JSONBody BoxSettingsDTO boxSettingsDTO);
+ @Post(value = "{baseUrl}" + TyConst.POST_BOX_UPDATE, interceptor = TokenInterceptor.class)
+ TyHttpCommonReceiver<?> updateBoxSettings(@Var("baseUrl") String baseUrl, @JSONBody BoxSettingsDTO boxSettingsDTO);
}
\ No newline at end of file
diff --git a/ard-work/src/main/java/com/ard/work/component/netty/NettyTcpClient.java b/ard-work/src/main/java/com/ard/work/component/netty/NettyTcpClient.java
deleted file mode 100644
index d64db45..0000000
--- a/ard-work/src/main/java/com/ard/work/component/netty/NettyTcpClient.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package com.ard.work.component.netty;
-
-import com.ard.work.config.TyConfiguration;
-import com.ard.work.domain.cache.TyTcpServerCache;
-import com.ard.work.component.netty.handler.ClientHandler;
-import com.ard.work.component.netty.handler.MessageProtocolDecoder;
-import com.ard.work.component.netty.handler.MessageProtocolEncoder;
-import io.netty.bootstrap.Bootstrap;
-import io.netty.channel.*;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioSocketChannel;
-import io.netty.handler.timeout.IdleStateHandler;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-import javax.annotation.PostConstruct;
-import javax.annotation.Resource;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-@Component
-@Slf4j
-public class NettyTcpClient {
-
- public static Map<String, TcpClientSession> channels = new HashMap<>();
-
- EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
-
- @Resource
- private TyConfiguration tyConfiguration;
- @Resource
- ClientHandler clientHandler;
-
- /**
- * 初始化Bootstrap
- */
- private Bootstrap getBootstrap() {
- Bootstrap bootstrap = new Bootstrap();
- bootstrap.group(eventLoopGroup)
- .channel(NioSocketChannel.class)
- .option(ChannelOption.TCP_NODELAY, true)
- .option(ChannelOption.SO_KEEPALIVE, true)
- .handler(new ChannelInitializer<SocketChannel>() {
- @Override
- protected void initChannel(SocketChannel socketChannel) throws Exception {
- ChannelPipeline pipeline = socketChannel.pipeline();
- pipeline.addLast("heart", new IdleStateHandler(0, 3, 0, TimeUnit.SECONDS));
- pipeline.addLast("encoder", new MessageProtocolEncoder());
- pipeline.addLast("decoder", new MessageProtocolDecoder());
- pipeline.addLast("handler", clientHandler);
- }
- });
- System.out.println("客户端 ok 。。。 ");
- return bootstrap;
- }
-
- /**
- * 初始化连接
- */
- public void initConnection(String host, Integer port) {
-
- log.info("初始化连接TCP服务器【{}:{}】", host, port);
- String clientId = "clientId_1";
- //判断是否已经存在连接,如果存在则关闭之前的连接
- if (channels.containsKey(host + ":" + port)) {
- clientId = channels.get(host + ":" + port).getClientId();
- channels.get(host + ":" + port).getChannelFuture().channel().close();
- }
-
- //异步连接tcp服务端
- Bootstrap bootstrap = getBootstrap();
- ChannelFuture future = bootstrap.connect(host, port).addListener((ChannelFuture futureListener) -> {
- if (futureListener.isSuccess()) {
- log.info("连接TCP服务器成功【{}:{}】", host, port);
- TyTcpServerCache.putTcpServerCache(host + ":" + port, true);
- } else {
- final EventLoop eventLoop = futureListener.channel().eventLoop();
- eventLoop.schedule(() -> {
- log.info("连接TCP服务器失败【{}:{}】,正尝试重连...", host, port);
- TyTcpServerCache.putTcpServerCache(host + ":" + port, false);
- try {
- initConnection(host, port);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }, 10, TimeUnit.SECONDS);
- }
- });
- //将连接存入集合
- channels.put(host + ":" + port,
- TcpClientSession.builder().ClientId(clientId).channelFuture(future).isReConnect(!clientId.isEmpty()).build());
- }
-
- //创建六合连接
- @PostConstruct
- public void createTyConnect() {
- try {
- initConnection(tyConfiguration.getTcpserver(), tyConfiguration.getTcpport());
- } catch (Exception e) {
- log.error("创建TCP连接异常:{}", e.getMessage());
- }
- }
-}
\ No newline at end of file
diff --git a/ard-work/src/main/java/com/ard/work/component/netty/TcpClientSession.java b/ard-work/src/main/java/com/ard/work/component/netty/TcpClientSession.java
index 1ad72ab..3ae32c8 100644
--- a/ard-work/src/main/java/com/ard/work/component/netty/TcpClientSession.java
+++ b/ard-work/src/main/java/com/ard/work/component/netty/TcpClientSession.java
@@ -12,6 +12,12 @@
@NoArgsConstructor
public class TcpClientSession {
+ private String serverId;
+
+ private String host;
+
+ private Integer port;
+
public String ClientId;
public ChannelFuture channelFuture;
diff --git a/ard-work/src/main/java/com/ard/work/component/netty/TyTcpClientManager.java b/ard-work/src/main/java/com/ard/work/component/netty/TyTcpClientManager.java
new file mode 100644
index 0000000..c087b4a
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/work/component/netty/TyTcpClientManager.java
@@ -0,0 +1,157 @@
+package com.ard.work.component.netty;
+
+import com.ard.work.component.netty.command.BaseCmd;
+import com.ard.work.component.netty.handler.ClientHandler;
+import com.ard.work.component.netty.handler.MessageProtocolDecoder;
+import com.ard.work.component.netty.handler.MessageProtocolEncoder;
+import com.ard.work.domain.cache.TyTcpServerCache;
+import com.ard.work.domain.entity.ArdServerInfo;
+import com.ard.work.service.IArdServerService;
+import io.netty.bootstrap.Bootstrap;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.SocketChannel;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.handler.timeout.IdleStateHandler;
+import io.netty.util.AttributeKey;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.net.InetSocketAddress;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+
+@Component
+@Slf4j
+public class TyTcpClientManager {
+ /**
+ * 以 serverId 作为唯一 key
+ */
+ public static final Map<String, TcpClientSession> channels = new ConcurrentHashMap<>();
+
+ private final EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
+
+ @Resource
+ private IArdServerService ardServerService; // ← 从数据库读取边缘服务器配置
+
+ @Resource
+ private ClientHandler clientHandler;
+
+ /**
+ * 初始化 Bootstrap
+ */
+ private Bootstrap getBootstrap() {
+ Bootstrap bootstrap = new Bootstrap();
+ bootstrap.group(eventLoopGroup)
+ .channel(NioSocketChannel.class)
+ .option(ChannelOption.TCP_NODELAY, true)
+ .option(ChannelOption.SO_KEEPALIVE, true)
+ .handler(new ChannelInitializer<SocketChannel>() {
+ @Override
+ protected void initChannel(SocketChannel socketChannel) {
+ ChannelPipeline pipeline = socketChannel.pipeline();
+ pipeline.addLast("heart", new IdleStateHandler(0, 3, 0, TimeUnit.SECONDS));
+ pipeline.addLast("encoder", new MessageProtocolEncoder());
+ pipeline.addLast("decoder", new MessageProtocolDecoder());
+ pipeline.addLast("handler", clientHandler);
+ }
+ });
+ return bootstrap;
+ }
+
+ /**
+ * 初始化与天宇服务器的连接
+ */
+ public void initConnection(String serverId, String host, Integer port) {
+ String key = host + ":" + port;
+ log.info("初始化连接边缘服务器 [{}] ({})", serverId, key);
+
+ // 如果存在旧连接则关闭
+ if (channels.containsKey(serverId)) {
+ TcpClientSession oldSession = channels.get(serverId);
+ if (oldSession != null && oldSession.getChannelFuture() != null) {
+ oldSession.getChannelFuture().channel().close();
+ }
+ }
+
+ // 异步连接 TCP 服务端
+ Bootstrap bootstrap = getBootstrap();
+ ChannelFuture future = bootstrap.connect(host, port).addListener((ChannelFuture futureListener) -> {
+ if (futureListener.isSuccess()) {
+ log.info("✅ 边缘服务器 [{}] 连接成功 ({})", serverId, key);
+ Channel channel = futureListener.channel();
+ // 绑定 serverId 到 channel
+ channel.attr(AttributeKey.valueOf("serverId")).set(serverId);
+ TyTcpServerCache.putTcpServerCache(key, true);
+ } else {
+ log.warn("❌ 边缘服务器 [{}] 连接失败 ({}),10 秒后重试", serverId, key);
+ TyTcpServerCache.putTcpServerCache(key, false);
+ final EventLoop eventLoop = futureListener.channel().eventLoop();
+ eventLoop.schedule(() -> initConnection(serverId, host, port), 10, TimeUnit.SECONDS);
+ }
+ });
+
+ // 存入连接缓存
+ TcpClientSession session = TcpClientSession.builder()
+ .ClientId("TY_" + serverId)
+ .channelFuture(future)
+ .isReConnect(true)
+ .serverId(serverId)
+ .host(host)
+ .port(port)
+ .build();
+
+ channels.put(serverId, session);
+ }
+
+ /**
+ * 向指定边缘服务器发送消息
+ */
+ public void sendMessage(Long serverId, BaseCmd msg) {
+ try {
+ TcpClientSession session = channels.get(serverId);
+ if (session == null) {
+ log.error("未找到天宇服务器 [{}] 的连接", serverId);
+ return;
+ }
+
+ ChannelFuture future = session.getChannelFuture();
+ if (future == null || !future.channel().isActive()) {
+ log.warn("天宇服务器 [{}] 连接未激活,无法发送消息", serverId);
+ return;
+ }
+
+ InetSocketAddress remote = (InetSocketAddress) future.channel().remoteAddress();
+ future.channel().writeAndFlush(msg);
+ log.debug("→ 向天宇服务器 [{}] ({}:{}) 发送消息,命令码:0x{}",
+ serverId, remote.getHostString(), remote.getPort(),
+ String.format("%02X", msg.getCmdCode() & 0xFF));
+ } catch (Exception e) {
+ log.error("发送消息到天宇服务器 [{}] 异常:{}", serverId, e.getMessage());
+ }
+ }
+
+ /**
+ * 启动时从数据库加载所有边缘服务器并建立 TCP 连接
+ */
+ @PostConstruct
+ public void createAllTyConnections() {
+ try {
+ var serverList = ardServerService.selectArdServerManagementList(new ArdServerInfo()); // ← 从数据库查询所有服务器配置
+ if (serverList == null || serverList.isEmpty()) {
+ log.warn("未在数据库中找到边缘服务器配置,跳过连接初始化");
+ return;
+ }
+
+ for (ArdServerInfo serverInfo : serverList) {
+ initConnection(serverInfo.getId(), serverInfo.getHost(), serverInfo.getTcpPort());
+ }
+
+ log.info("共初始化 {} 个边缘服务器连接", serverList.size());
+ } catch (Exception e) {
+ log.error("创建边缘服务器连接异常:{}", e.getMessage(), e);
+ }
+ }
+}
diff --git a/ard-work/src/main/java/com/ard/work/component/netty/handler/ClientHandler.java b/ard-work/src/main/java/com/ard/work/component/netty/handler/ClientHandler.java
index 1357559..88c39bd 100644
--- a/ard-work/src/main/java/com/ard/work/component/netty/handler/ClientHandler.java
+++ b/ard-work/src/main/java/com/ard/work/component/netty/handler/ClientHandler.java
@@ -1,14 +1,17 @@
package com.ard.work.component.netty.handler;
+import com.ard.work.component.netty.TyTcpClientManager;
+import com.ard.work.component.netty.command.register.HeartbeatCmd;
import com.ard.work.domain.cache.TyTcpServerCache;
-import com.ard.work.component.netty.NettyTcpClient;
import com.ard.work.component.netty.command.BaseCmd;
import com.ard.work.service.ITyService;
+import io.netty.channel.Channel;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent;
+import io.netty.util.AttributeKey;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@@ -25,21 +28,29 @@
private ITyService tyService;
@Resource
- private NettyTcpClient nettyTcpClient;
+ private TyTcpClientManager tyTcpClientManager;
@Override
public void channelRead0(ChannelHandlerContext ctx, BaseCmd command) {
- InetSocketAddress ipSocket = (InetSocketAddress) ctx.channel().remoteAddress();
- String host = ipSocket.getHostString();
- int port = ipSocket.getPort();
- tyService.processReplyMessage(host + ":" + port, command);
+ Channel channel = ctx.channel();
+ String serverId = (String) channel.attr(AttributeKey.valueOf("serverId")).get();
+ tyService.processReplyMessage(serverId, command);
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
//当客户端connect成功后,可以在最后一个handler等待用户输入
- log.info("连接成功建立!");
- tyService.registerMessage();
+ Channel channel = ctx.channel();
+ String serverId = (String) channel.attr(AttributeKey.valueOf("serverId")).get();
+
+ InetSocketAddress remoteAddress = (InetSocketAddress) channel.remoteAddress();
+ String host = remoteAddress.getHostString();
+ int port = remoteAddress.getPort();
+
+ log.info("与天宇服务器 [{}] 连接成功 ({}:{})", serverId, host, port);
+
+ // 针对当前连接的服务器进行注册
+ tyService.registerMessage(serverId);
super.channelActive(ctx);
}
@@ -50,32 +61,43 @@
}
@Override
- public void userEventTriggered(ChannelHandlerContext ctx, Object obj) {
- if (obj instanceof IdleStateEvent) {
- IdleStateEvent event = (IdleStateEvent) obj;
- if (event.state() == IdleState.READER_IDLE) {
- log.info("客户端读超时");
- } else if (event.state() == IdleState.WRITER_IDLE) {
- // log.info("写空闲发送⼼跳!");
- // HeartbeatCommand msg = new HeartbeatCommand(System.currentTimeMillis());
- //ctx.writeAndFlush(msg);
- } else if (event.state() == IdleState.ALL_IDLE) {
- log.info("客户端所有操作超时");
+ public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
+ if (evt instanceof IdleStateEvent) {
+ IdleStateEvent event = (IdleStateEvent) evt;
+ long timestamp = System.currentTimeMillis();
+
+ switch (event.state()) {
+ case READER_IDLE:
+ log.warn("读空闲超时 - 可能服务器未响应");
+ break;
+ case WRITER_IDLE:
+ // 写空闲时主动发心跳
+ HeartbeatCmd heartbeat = new HeartbeatCmd(timestamp);
+ ctx.writeAndFlush(heartbeat);
+ log.debug("写空闲 -> 发送心跳包 时间戳={}", timestamp);
+ break;
+ case ALL_IDLE:
+ log.info("读写都空闲 - 可考虑关闭连接或重连");
+ break;
}
+ } else {
+ super.userEventTriggered(ctx, evt);
}
}
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- InetSocketAddress ipSocket = (InetSocketAddress) ctx.channel().remoteAddress();
- int port = ipSocket.getPort();
- String host = ipSocket.getHostString();
+ Channel channel = ctx.channel();
+ String serverId = (String) channel.attr(AttributeKey.valueOf("serverId")).get();
+ InetSocketAddress remoteAddress = (InetSocketAddress) channel.remoteAddress();
+ String host = remoteAddress.getHostString();
+ int port = remoteAddress.getPort();
log.error("与六合服务{}:{}连接断开!", host, port);
TyTcpServerCache.putTcpServerCache(host + ":" + port, false);
ctx.channel().eventLoop().schedule(() -> {
log.error("六合服务端链接不上,开始重连操作...");
try {
- nettyTcpClient.initConnection(host, port);
+ tyTcpClientManager.initConnection(serverId,host, port);
} catch (Exception e) {
log.error("六合服务端连接异常: {}", e.getMessage());
}
diff --git a/ard-work/src/main/java/com/ard/work/config/TyConfiguration.java b/ard-work/src/main/java/com/ard/work/config/TyConfiguration.java
deleted file mode 100644
index bba31f8..0000000
--- a/ard-work/src/main/java/com/ard/work/config/TyConfiguration.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package com.ard.work.config;
-
-import com.ard.work.component.forest.TyClient;
-import com.ard.work.domain.dto.TokenDTO;
-import com.ard.work.domain.receiver.AccessTokenReceiver;
-import com.ard.work.domain.receiver.TyHttpCommonReceiver;
-import lombok.Data;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.util.DigestUtils;
-import javax.annotation.Resource;
-import java.util.Date;
-
-/**
- * TianyuConfiguration
- *
- * @author liusuyi
- * @date 2024年10月21日15:16
- **/
-@Configuration
-@Slf4j
-@Data
-@ConfigurationProperties(prefix = "tianyu")
-public class TyConfiguration {
-
- private String endpoint;
-
- private String accesskeyid;
-
- private String accesskeysecret;
-
- private String tcpserver;
-
- private Integer tcpport;
-
- private long timestamp;
-
- public long getTimeStamp() {
- timestamp = new Date().getTime();
- return timestamp;
- }
-
- private String encryptstr;
-
- public String getEncryptStr() {
- String sb = accesskeyid +
- accesskeysecret +
- getTimeStamp();
- encryptstr = DigestUtils.md5DigestAsHex(sb.getBytes());
- return encryptstr;
- }
-
- public String getIpPort() {
- return tcpserver + ":" + tcpport;
- }
-
- @Resource
- private TyClient tyClient;
-
- private AccessTokenReceiver accessToken;
-
- public AccessTokenReceiver getAccessToken() {
- if (accessToken != null)
- return accessToken;
- // 准备请求的json
- TokenDTO gtd = TokenDTO.builder()
- .accessKeyId(accesskeyid)
- .encryptStr(getEncryptStr())
- .timeStamp(timestamp)
- .build();
- try {
- TyHttpCommonReceiver<AccessTokenReceiver> getTokenRes = tyClient.getToken(gtd);
- accessToken = getTokenRes.getContent();
- } catch (Exception e) {
- log.error("获取token失败:{}", e.getMessage());
- }
- //{"state":0,"content":{"companyId":4127,"accessToken":"sOONT0MMVdoKcMBibb40xxgrUrq0Hw9RFiajic3KOzoNtk"}}
- return accessToken;
- }
-}
diff --git a/ard-work/src/main/java/com/ard/work/domain/dto/BoxPhotosDTO.java b/ard-work/src/main/java/com/ard/work/domain/dto/BoxPhotosDTO.java
index ea2c857..222a29b 100644
--- a/ard-work/src/main/java/com/ard/work/domain/dto/BoxPhotosDTO.java
+++ b/ard-work/src/main/java/com/ard/work/domain/dto/BoxPhotosDTO.java
@@ -12,6 +12,9 @@
@NoArgsConstructor
public class BoxPhotosDTO {
+ @JsonProperty("boxSn")
+ private String boxSn;
+
@JsonProperty("taskId")
private Integer taskId;
diff --git a/ard-work/src/main/java/com/ard/work/domain/receiver/BoxInfoReceiver.java b/ard-work/src/main/java/com/ard/work/domain/receiver/BoxInfoReceiver.java
index 2eaa35c..cc7e87e 100644
--- a/ard-work/src/main/java/com/ard/work/domain/receiver/BoxInfoReceiver.java
+++ b/ard-work/src/main/java/com/ard/work/domain/receiver/BoxInfoReceiver.java
@@ -62,7 +62,6 @@
/**
* 服务器实体对象ID
*/
- @JsonProperty("lastTaskId")
private String serverInfoId;
/**
diff --git a/ard-work/src/main/java/com/ard/work/mapper/ArdDroneInfoMapper.java b/ard-work/src/main/java/com/ard/work/mapper/ArdDroneInfoMapper.java
index d4910e3..30292fd 100644
--- a/ard-work/src/main/java/com/ard/work/mapper/ArdDroneInfoMapper.java
+++ b/ard-work/src/main/java/com/ard/work/mapper/ArdDroneInfoMapper.java
@@ -18,7 +18,7 @@
* @return 无人机盒子
*/
ArdDroneInfo selectArdDroneById(String id);
-
+ ArdDroneInfo selectArdDroneByBoxSn(String boxSn);
/**
* 查询无人机盒子列表
*
diff --git a/ard-work/src/main/java/com/ard/work/service/IArdDroneService.java b/ard-work/src/main/java/com/ard/work/service/IArdDroneService.java
index ad9d7fa..cbc9b01 100644
--- a/ard-work/src/main/java/com/ard/work/service/IArdDroneService.java
+++ b/ard-work/src/main/java/com/ard/work/service/IArdDroneService.java
@@ -21,7 +21,7 @@
* @return 无人机盒子
*/
public ArdDroneInfo selectArdDroneById(String id);
-
+ public ArdDroneInfo selectArdDroneByboxSn(String boxSn);
/**
* 查询无人机盒子列表
*
diff --git a/ard-work/src/main/java/com/ard/work/service/IArdServerService.java b/ard-work/src/main/java/com/ard/work/service/IArdServerService.java
index f506eae..bfd0108 100644
--- a/ard-work/src/main/java/com/ard/work/service/IArdServerService.java
+++ b/ard-work/src/main/java/com/ard/work/service/IArdServerService.java
@@ -1,5 +1,6 @@
package com.ard.work.service;
import com.ard.work.domain.entity.ArdServerInfo;
+import com.ard.work.domain.receiver.AccessTokenReceiver;
import java.util.List;
@@ -58,4 +59,13 @@
* @return 结果
*/
public int deleteArdServerManagementById(String id);
+
+ /**
+ * 根据 id 获取 token
+ */
+ public AccessTokenReceiver getAccessToken(String id);
+ /**
+ * 根据 baseUrl 获取 token(给拦截器使用)
+ */
+ public AccessTokenReceiver getAccessTokenByBaseUrl(String baseUrl);
}
diff --git a/ard-work/src/main/java/com/ard/work/service/ITyService.java b/ard-work/src/main/java/com/ard/work/service/ITyService.java
index 44ed108..a4caeb3 100644
--- a/ard-work/src/main/java/com/ard/work/service/ITyService.java
+++ b/ard-work/src/main/java/com/ard/work/service/ITyService.java
@@ -34,7 +34,7 @@
* 获取六合token信息
* @return
*/
- AccessTokenReceiver getAccessToken();
+ AccessTokenReceiver getAccessToken(String ServerId);
/**
@@ -88,7 +88,7 @@
/**
* 注册
*/
- Boolean registerMessage();
+ Boolean registerMessage(String serverId);
/**
* 云台转动(基于角度)
diff --git a/ard-work/src/main/java/com/ard/work/service/impl/ArdDroneServiceImpl.java b/ard-work/src/main/java/com/ard/work/service/impl/ArdDroneServiceImpl.java
index 9c9e3fc..63eaa19 100644
--- a/ard-work/src/main/java/com/ard/work/service/impl/ArdDroneServiceImpl.java
+++ b/ard-work/src/main/java/com/ard/work/service/impl/ArdDroneServiceImpl.java
@@ -42,6 +42,11 @@
return ArdDroneInfoMapper.selectArdDroneById(id);
}
+ @Override
+ public ArdDroneInfo selectArdDroneByboxSn(String boxSn) {
+ return ArdDroneInfoMapper.selectArdDroneByBoxSn(boxSn);
+ }
+
/**
* 查询无人机盒子列表
*
@@ -104,7 +109,7 @@
*
* @return 结果
*/
- @Scheduled(fixedRate = 1000 * 60)
+ @Scheduled(fixedRate = 1000 * 10)
public void syncBoxInfo() {
List<ArdDroneInfo> ArdDroneeListEntity = selectArdDroneList(new ArdDroneInfo());
// 将本地列表转换为Map,方便快速查找
diff --git a/ard-work/src/main/java/com/ard/work/service/impl/ArdServerServiceImpl.java b/ard-work/src/main/java/com/ard/work/service/impl/ArdServerServiceImpl.java
index 31a4650..beb5cf0 100644
--- a/ard-work/src/main/java/com/ard/work/service/impl/ArdServerServiceImpl.java
+++ b/ard-work/src/main/java/com/ard/work/service/impl/ArdServerServiceImpl.java
@@ -1,53 +1,62 @@
package com.ard.work.service.impl;
import com.ard.common.utils.uuid.IdUtils;
+import com.ard.work.component.forest.TyClient;
+import com.ard.work.domain.dto.TokenDTO;
import com.ard.work.domain.entity.ArdServerInfo;
+import com.ard.work.domain.receiver.AccessTokenReceiver;
+import com.ard.work.domain.receiver.TyHttpCommonReceiver;
import com.ard.work.mapper.ArdServerInfoMapper;
import com.ard.work.service.IArdServerService;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import org.springframework.util.DigestUtils;
+import javax.annotation.Resource;
+import java.util.Date;
import java.util.List;
/**
* 服务器管理Service业务层处理
- *
+ *
* @author xia
* @date 2025-10-10
*/
+@Slf4j
@Service
public class ArdServerServiceImpl implements IArdServerService {
- @Autowired
+ @Resource
private ArdServerInfoMapper ardServerInfoMapper;
+ @Resource
+ private TyClient tyClient;
/**
* 查询服务器管理
- *
+ *
* @param id 服务器管理主键
* @return 服务器管理
*/
@Override
- public ArdServerInfo selectArdServerManagementById(String id)
- {
+ public ArdServerInfo selectArdServerManagementById(String id) {
return ardServerInfoMapper.selectArdServerManagementById(id);
}
/**
* 查询服务器管理列表
- *
+ *
* @param ardServerInfo 服务器管理
* @return 服务器管理
*/
@Override
- public List<ArdServerInfo> selectArdServerManagementList(ArdServerInfo ardServerInfo)
- {
+ public List<ArdServerInfo> selectArdServerManagementList(ArdServerInfo ardServerInfo) {
return ardServerInfoMapper.selectArdServerManagementList(ardServerInfo);
}
/**
* 新增服务器管理
- *
+ *
* @param ardServerInfo 服务器管理
* @return 结果
*/
@@ -59,37 +68,84 @@
/**
* 修改服务器管理
- *
+ *
* @param ardServerInfo 服务器管理
* @return 结果
*/
@Override
- public int updateArdServerManagement(ArdServerInfo ardServerInfo)
- {
+ public int updateArdServerManagement(ArdServerInfo ardServerInfo) {
return ardServerInfoMapper.updateArdServerManagement(ardServerInfo);
}
/**
* 批量删除服务器管理
- *
+ *
* @param ids 需要删除的服务器管理主键
* @return 结果
*/
@Override
- public int deleteArdServerManagementByIds(String[] ids)
- {
+ public int deleteArdServerManagementByIds(String[] ids) {
return ardServerInfoMapper.deleteArdServerManagementByIds(ids);
}
/**
* 删除服务器管理信息
- *
+ *
* @param id 服务器管理主键
* @return 结果
*/
@Override
- public int deleteArdServerManagementById(String id)
- {
+ public int deleteArdServerManagementById(String id) {
return ardServerInfoMapper.deleteArdServerManagementById(id);
}
+
+ /**
+ * 根据 id 获取 服务器http接口token
+ */
+ @Override
+ public AccessTokenReceiver getAccessToken(String id) {
+ long timeStamp = getTimeStamp();
+ AccessTokenReceiver accessToken = null;
+ ArdServerInfo serverInfo = selectArdServerManagementById(id);
+ // 准备请求的json
+ TokenDTO gtd = TokenDTO.builder()
+ .accessKeyId(serverInfo.getAccessKeyId())
+ .encryptStr(getEncryptStr(serverInfo, timeStamp))
+ .timeStamp(timeStamp)
+ .build();
+ try {
+ String baseUrl = "http://" + serverInfo.getHost() + ":" + serverInfo.getHttpPort();
+ TyHttpCommonReceiver<AccessTokenReceiver> getTokenRes = tyClient.getToken(baseUrl, gtd);
+ accessToken = getTokenRes.getContent();
+ } catch (Exception e) {
+ log.error("获取token失败:{}", e.getMessage());
+ }
+ //{"state":0,"content":{"companyId":4127,"accessToken":"sOONT0MMVdoKcMBibb40xxgrUrq0Hw9RFiajic3KOzoNtk"}}
+ return accessToken;
+ }
+
+ private String getEncryptStr(ArdServerInfo serverInfo, long timeStamp) {
+ String sb = serverInfo.getAccessKeyId() + serverInfo.getAccessKeySecret() + timeStamp;
+ return DigestUtils.md5DigestAsHex(sb.getBytes());
+ }
+
+ private long getTimeStamp() {
+ return new Date().getTime();
+ }
+
+ /**
+ * 根据 baseUrl 获取 服务器http接口token(给拦截器使用)
+ */
+ @Override
+ public AccessTokenReceiver getAccessTokenByBaseUrl(String baseUrl) {
+ // 找到对应的 serverId
+ List<ArdServerInfo> servers = selectArdServerManagementList(new ArdServerInfo());
+ for (ArdServerInfo server : servers) {
+ String _baseUrl = "http://" + server.getHost() + ":" + server.getHttpPort();
+ if (_baseUrl.equals(baseUrl)) {
+ return getAccessToken(server.getId());
+ }
+ }
+ return null;
+ }
}
diff --git a/ard-work/src/main/java/com/ard/work/service/impl/TyServiceImpl.java b/ard-work/src/main/java/com/ard/work/service/impl/TyServiceImpl.java
index 37e86c0..4e5904d 100644
--- a/ard-work/src/main/java/com/ard/work/service/impl/TyServiceImpl.java
+++ b/ard-work/src/main/java/com/ard/work/service/impl/TyServiceImpl.java
@@ -3,6 +3,8 @@
import com.ard.common.utils.ByteUtils;
import com.ard.work.aspect.annotation.CheckTakeoffAltitude;
import com.ard.work.aspect.annotation.CheckControlRight;
+import com.ard.work.component.netty.TcpClientSession;
+import com.ard.work.component.netty.TyTcpClientManager;
import com.ard.work.component.netty.command.BaseCmd;
import com.ard.work.component.netty.command.camera.*;
import com.ard.work.component.netty.command.manual.*;
@@ -10,14 +12,14 @@
import com.ard.work.component.netty.command.settings.*;
import com.ard.work.component.netty.command.speaker.*;
import com.ard.work.component.netty.command.wayline.*;
-import com.ard.work.config.TyConfiguration;
import com.ard.work.domain.dto.camera.*;
import com.ard.work.domain.dto.manual.*;
import com.ard.work.domain.dto.speaker.*;
import com.ard.work.domain.dto.wayline.*;
+import com.ard.work.domain.entity.ArdDroneInfo;
+import com.ard.work.domain.entity.ArdServerInfo;
import com.ard.work.domain.receiver.*;
import com.ard.work.component.forest.TyClient;
-import com.ard.work.domain.cache.TyTcpServerCache;
import com.ard.work.domain.cache.UavSignalInfoCache;
import com.ard.work.domain.cache.UavStateCache;
import com.ard.work.domain.cache.UavTelemetryDataCache;
@@ -34,7 +36,6 @@
import com.ard.work.domain.dto.signal.SignalInfo;
import com.ard.work.domain.dto.state.UavState;
import com.ard.work.domain.dto.telemetry.TelemetryData;
-import com.ard.work.component.netty.NettyTcpClient;
import com.ard.work.component.netty.command.control.AbsAngleControlCmd;
import com.ard.work.component.netty.command.control.AngleControlCmd;
import com.ard.work.component.netty.command.control.SpeedControlCmd;
@@ -46,6 +47,8 @@
import com.ard.work.component.netty.command.real.UavTelemetryDataCmd;
import com.ard.work.component.netty.handler.ErrorCodeEnum;
import com.ard.work.component.netty.protobuf.TelemetryDataPB;
+import com.ard.work.service.IArdDroneService;
+import com.ard.work.service.IArdServerService;
import com.ard.work.service.ITyService;
import com.ard.work.domain.message.UavControlType;
import io.netty.channel.Channel;
@@ -56,8 +59,13 @@
import javax.annotation.Resource;
import java.net.InetSocketAddress;
-import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static com.ard.work.component.netty.TyTcpClientManager.channels;
/**
* TyServiceImpl
@@ -68,13 +76,12 @@
@Slf4j
@Service
public class TyServiceImpl implements ITyService {
-
+ @Resource
+ private IArdServerService ardServerService;
+ @Resource
+ private IArdDroneService ardDroneService;
@Resource
private TyClient tyClient;
-
- @Resource
- private TyConfiguration tyConfiguration;
-
/**
* 获取六合token信息
@@ -82,8 +89,9 @@
* @return AccessTokenReceiver
*/
@Override
- public AccessTokenReceiver getAccessToken() {
- return tyConfiguration.getAccessToken();
+ public AccessTokenReceiver getAccessToken(String serverId) {
+
+ return ardServerService.getAccessToken(serverId);
}
/**
@@ -93,15 +101,22 @@
*/
@Override
public List<BoxInfoReceiver> getBoxList() {
- //请求云盒列表
- try {
- TyHttpCommonReceiver<List<BoxInfoReceiver>> boxListReceiver = tyClient.getBoxList();
- return boxListReceiver.getContent();
- } catch (Exception e) {
- log.error("获取云盒列表失败:{}", e.getMessage());
- return new ArrayList<>();
- }
+ List<ArdServerInfo> ardServerInfos = ardServerService.selectArdServerManagementList(new ArdServerInfo());
+
+ return ardServerInfos.stream()
+ .flatMap(ardServerInfo -> {
+ String baseUrl = "http://" + ardServerInfo.getHost() + ":" + ardServerInfo.getHttpPort();
+ try {
+ List<BoxInfoReceiver> boxes = tyClient.getBoxList(baseUrl).getContent();
+ return Optional.ofNullable(boxes).orElse(Collections.emptyList()).stream();
+ } catch (Exception e) {
+ log.error("获取云盒列表失败: {}", baseUrl, e);
+ return Stream.empty();
+ }
+ })
+ .collect(Collectors.toList());
}
+
/**
* 获取直播地址
@@ -111,7 +126,9 @@
@Override
public BoxStreamUrlReceiver getBoxLiveUrl(String boxSn) {
- TyHttpCommonReceiver<BoxStreamUrlReceiver> boxLiveUrl = tyClient.getBoxLiveUrl(boxSn);
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(boxSn);
+ String baseUrl="http://"+ardDroneInfo.getArdServerInfo().getHost()+":"+ardDroneInfo.getArdServerInfo().getHttpPort();
+ TyHttpCommonReceiver<BoxStreamUrlReceiver> boxLiveUrl = tyClient.getBoxLiveUrl(baseUrl,boxSn);
return boxLiveUrl.getContent();
}
@@ -122,7 +139,9 @@
*/
@Override
public List<BoxHistoryReceiver> getBoxHistory(BoxHistoryDTO boxHistoryDTO) {
- TyHttpCommonReceiver<List<BoxHistoryReceiver>> boxHistory = tyClient.getBoxHistory(boxHistoryDTO);
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(boxHistoryDTO.getBoxSn());
+ String baseUrl="http://"+ardDroneInfo.getArdServerInfo().getHost()+":"+ardDroneInfo.getArdServerInfo().getHttpPort();
+ TyHttpCommonReceiver<List<BoxHistoryReceiver>> boxHistory = tyClient.getBoxHistory(baseUrl,boxHistoryDTO);
return boxHistory.getContent();
}
@@ -133,7 +152,9 @@
*/
@Override
public List<BoxPhotosReceiver> getBoxPhotos(BoxPhotosDTO boxPhotosDTO) {
- TyHttpCommonReceiver<List<BoxPhotosReceiver>> boxPhotos = tyClient.getBoxPhotos(boxPhotosDTO);
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(boxPhotosDTO.getBoxSn());
+ String baseUrl="http://"+ardDroneInfo.getArdServerInfo().getHost()+":"+ardDroneInfo.getArdServerInfo().getHttpPort();
+ TyHttpCommonReceiver<List<BoxPhotosReceiver>> boxPhotos = tyClient.getBoxPhotos(baseUrl,boxPhotosDTO);
return boxPhotos.getContent();
}
@@ -142,7 +163,9 @@
*/
@Override
public Boolean updateBoxSettings(BoxSettingsDTO boxSettingsDTO) {
- TyHttpCommonReceiver<?> result = tyClient.updateBoxSettings(boxSettingsDTO);
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(boxSettingsDTO.getBoxSn());
+ String baseUrl="http://"+ardDroneInfo.getArdServerInfo().getHost()+":"+ardDroneInfo.getArdServerInfo().getHttpPort();
+ TyHttpCommonReceiver<?> result = tyClient.updateBoxSettings(baseUrl,boxSettingsDTO);
return result.getState() == 1;
}
@@ -151,8 +174,9 @@
*/
@Override
public Boolean updateReturnHeight(ReturnHeightSettingDTO returnHeightSettingDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(returnHeightSettingDTO.getBoxSn());
ReturnHeightSettingCmd returnHeightSettingCmd = new ReturnHeightSettingCmd(returnHeightSettingDTO);
- this.sendMessage(tyConfiguration.getIpPort(), returnHeightSettingCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), returnHeightSettingCmd);
return true;
}
@@ -161,8 +185,9 @@
*/
@Override
public Boolean updateReturnPoint(ReturnPointSettingDTO returnPointSettingDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(returnPointSettingDTO.getBoxSn());
ReturnPointSettingCmd returnPointSettingCmd = new ReturnPointSettingCmd(returnPointSettingDTO);
- this.sendMessage(tyConfiguration.getIpPort(), returnPointSettingCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), returnPointSettingCmd);
return true;
}
@@ -171,8 +196,9 @@
*/
@Override
public Boolean updateVideoStream(VideoStreamSettingDTO videoStreamSettingDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(videoStreamSettingDTO.getBoxSn());
VideoStreamSettingCmd videoStreamSettingCmd = new VideoStreamSettingCmd(videoStreamSettingDTO);
- this.sendMessage(tyConfiguration.getIpPort(), videoStreamSettingCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), videoStreamSettingCmd);
return true;
}
@@ -180,11 +206,11 @@
* 注册六合平台
*/
@Override
- public Boolean registerMessage() {
+ public Boolean registerMessage(String serverId) {
try {
- AccessTokenReceiver tyToken = tyConfiguration.getAccessToken();
+ AccessTokenReceiver tyToken = ardServerService.getAccessToken(serverId);
RegisterCmd registerMessage = new RegisterCmd(tyToken.getCompanyId(), tyToken.getAccessToken().getBytes());
- this.sendMessage(tyConfiguration.getIpPort(), registerMessage);
+ this.sendMessage(serverId, registerMessage);
} catch (Exception e) {
log.error("注册六合平台失败:{}", e.getMessage());
}
@@ -197,8 +223,9 @@
@CheckControlRight(UavControlType.PAYLOAD)
@Override
public Boolean angleControl(AngleControlDTO angleControlDto) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(angleControlDto.getBoxSn());
AngleControlCmd controlAngleCommand = new AngleControlCmd(angleControlDto);
- this.sendMessage(tyConfiguration.getIpPort(), controlAngleCommand);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), controlAngleCommand);
return true;
}
@@ -208,8 +235,9 @@
@CheckControlRight(UavControlType.PAYLOAD)
@Override
public Boolean absAngleControl(AbsAngleControlDTO absAngleControlDto) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(absAngleControlDto.getBoxSn());
AbsAngleControlCmd absAngleControlCommand = new AbsAngleControlCmd(absAngleControlDto);
- this.sendMessage(tyConfiguration.getIpPort(), absAngleControlCommand);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), absAngleControlCommand);
return true;
}
@@ -219,8 +247,9 @@
@CheckControlRight(UavControlType.PAYLOAD)
@Override
public Boolean speedControl(SpeedControlDTO speedControlDto) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(speedControlDto.getBoxSn());
SpeedControlCmd speedControlCommand = new SpeedControlCmd(speedControlDto);
- this.sendMessage(tyConfiguration.getIpPort(), speedControlCommand);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), speedControlCommand);
return true;
}
@@ -229,8 +258,9 @@
*/
@Override
public Boolean updateCameraMode(CameraModeDTO cameraModeDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(cameraModeDTO.getBoxSn());
CameraModeCmd cameraModeCommand = new CameraModeCmd(cameraModeDTO);
- this.sendMessage(tyConfiguration.getIpPort(), cameraModeCommand);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), cameraModeCommand);
return true;
}
@@ -243,9 +273,9 @@
updateCameraMode(CameraModeDTO.builder().boxSn(capturePicDto.getBoxSn()).actionParam((byte) 0x01).build());
//设置拍照回传
photoReturnToggle(PhotoReturnToggleDTO.builder().boxSn(capturePicDto.getBoxSn()).actionParam((byte) 0x01).build());
-
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(capturePicDto.getBoxSn());
CapturePicCmd capturePicCommand = new CapturePicCmd(capturePicDto);
- this.sendMessage(tyConfiguration.getIpPort(), capturePicCommand);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), capturePicCommand);
return true;
}
@@ -261,7 +291,8 @@
} else {
baseCmd = new RecordStopCmd(recordDto);
}
- this.sendMessage(tyConfiguration.getIpPort(), baseCmd);
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(recordDto.getBoxSn());
+ this.sendMessage(ardDroneInfo.getServerInfoId(), baseCmd);
return true;
}
@@ -271,8 +302,9 @@
@CheckControlRight(UavControlType.PAYLOAD)
@Override
public Boolean zoom(ZoomDTO zoomDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(zoomDTO.getBoxSn());
ZoomCmd zoomCommand = new ZoomCmd(zoomDTO);
- this.sendMessage(tyConfiguration.getIpPort(), zoomCommand);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), zoomCommand);
return true;
}
@@ -282,8 +314,9 @@
@CheckControlRight(UavControlType.PAYLOAD)
@Override
public Boolean zoomToLevel(ZoomToLevelDTO zoomToLevelDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(zoomToLevelDTO.getBoxSn());
ZoomToLevelCmd zoomToLevelCommand = new ZoomToLevelCmd(zoomToLevelDTO);
- this.sendMessage(tyConfiguration.getIpPort(), zoomToLevelCommand);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), zoomToLevelCommand);
return true;
}
@@ -292,8 +325,9 @@
*/
@Override
public Boolean switchCamera(SwitchCameraDTO switchCameraDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(switchCameraDTO.getBoxSn());
SwitchCameraCmd switchCameraCmd = new SwitchCameraCmd(switchCameraDTO);
- this.sendMessage(tyConfiguration.getIpPort(), switchCameraCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), switchCameraCmd);
return true;
}
@@ -302,8 +336,9 @@
*/
@Override
public Boolean switchSource(SwitchSourceDTO switchSourceDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(switchSourceDTO.getBoxSn());
SwitchSourceCmd switchSourceCmd = new SwitchSourceCmd(switchSourceDTO);
- this.sendMessage(tyConfiguration.getIpPort(), switchSourceCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), switchSourceCmd);
return true;
}
@@ -312,8 +347,9 @@
*/
@Override
public Boolean photoReturnToggle(PhotoReturnToggleDTO photoReturnToggleDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(photoReturnToggleDTO.getBoxSn());
PhotoReturnToggleCmd photoReturnToggleCmd = new PhotoReturnToggleCmd(photoReturnToggleDTO);
- this.sendMessage(tyConfiguration.getIpPort(), photoReturnToggleCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), photoReturnToggleCmd);
return true;
}
@@ -322,8 +358,9 @@
*/
@Override
public Boolean switchUavControl(SwitchUavControlDTO switchUavControlDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(switchUavControlDTO.getBoxSn());
SwitchUavControlCmd switchUavControlCmd = new SwitchUavControlCmd(switchUavControlDTO);
- this.sendMessage(tyConfiguration.getIpPort(), switchUavControlCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), switchUavControlCmd);
return true;
}
@@ -333,8 +370,9 @@
@CheckControlRight(UavControlType.FLY)
@Override
public Boolean takeOff(TakeOffDTO takeOffDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(takeOffDTO.getBoxSn());
TakeOffCmd takeOffCmd = new TakeOffCmd(takeOffDTO);
- this.sendMessage(tyConfiguration.getIpPort(), takeOffCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), takeOffCmd);
return true;
}
@@ -344,8 +382,9 @@
@CheckControlRight(UavControlType.FLY)
@Override
public Boolean returnHome(ReturnHomeDTO returnHomeDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(returnHomeDTO.getBoxSn());
ReturnHomeCmd returnHomeCmd = new ReturnHomeCmd(returnHomeDTO);
- this.sendMessage(tyConfiguration.getIpPort(), returnHomeCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), returnHomeCmd);
return true;
}
@@ -355,8 +394,9 @@
@CheckControlRight(UavControlType.FLY)
@Override
public Boolean returnHomeCancel(ReturnHomeCancelDTO returnHomeCancelDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(returnHomeCancelDTO.getBoxSn());
ReturnHomeCancelCmd returnHomeCancelCmd = new ReturnHomeCancelCmd(returnHomeCancelDTO);
- this.sendMessage(tyConfiguration.getIpPort(), returnHomeCancelCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), returnHomeCancelCmd);
return true;
}
@@ -366,8 +406,9 @@
@CheckControlRight(UavControlType.FLY)
@Override
public Boolean land(LandDTO landDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(landDTO.getBoxSn());
LandCmd landCmd = new LandCmd(landDTO);
- this.sendMessage(tyConfiguration.getIpPort(), landCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), landCmd);
return true;
}
@@ -377,8 +418,9 @@
@CheckControlRight(UavControlType.FLY)
@Override
public Boolean landCancel(LandCancelDTO landCancelDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(landCancelDTO.getBoxSn());
LandCancelCmd landCancelCmd = new LandCancelCmd(landCancelDTO);
- this.sendMessage(tyConfiguration.getIpPort(), landCancelCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), landCancelCmd);
return true;
}
@@ -388,8 +430,9 @@
@CheckControlRight(UavControlType.FLY)
@Override
public Boolean landForced(LandForcedDTO landForcedDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(landForcedDTO.getBoxSn());
LandForcedCmd landForcedCmd = new LandForcedCmd(landForcedDTO);
- this.sendMessage(tyConfiguration.getIpPort(), landForcedCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), landForcedCmd);
return true;
}
@@ -400,8 +443,9 @@
@CheckTakeoffAltitude(minAltitude = 30.0)
@Override
public Boolean flyControl(FlyControlDTO flyControlDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(flyControlDTO.getBoxSn());
FlyControlCmd flyControlCmd = new FlyControlCmd(flyControlDTO);
- this.sendMessage(tyConfiguration.getIpPort(), flyControlCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), flyControlCmd);
return true;
}
@@ -412,8 +456,9 @@
@CheckTakeoffAltitude(minAltitude = 30.0)
@Override
public Boolean flyPointControl(FlyPointControlDTO flyPointControlDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(flyPointControlDTO.getBoxSn());
FlyPointControlCmd flyPointControlCmd = new FlyPointControlCmd(flyPointControlDTO);
- this.sendMessage(tyConfiguration.getIpPort(), flyPointControlCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), flyPointControlCmd);
return true;
}
@@ -423,8 +468,9 @@
@CheckControlRight(UavControlType.FLY)
@Override
public Boolean flyPointControlCancel(FlyPointControlCancelDTO flyPointControlCancelDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(flyPointControlCancelDTO.getBoxSn());
FlyPointControlCancelCmd flyPointControlCancelCmd = new FlyPointControlCancelCmd(flyPointControlCancelDTO);
- this.sendMessage(tyConfiguration.getIpPort(), flyPointControlCancelCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), flyPointControlCancelCmd);
return true;
}
@@ -434,8 +480,9 @@
@CheckControlRight(UavControlType.FLY)
@Override
public Boolean emeragencyBrake(EmeragencyBrakeDTO emeragencyBrakeDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(emeragencyBrakeDTO.getBoxSn());
EmergencyBrakeCmd emergencyBrakeCmd = new EmergencyBrakeCmd(emeragencyBrakeDTO);
- this.sendMessage(tyConfiguration.getIpPort(), emergencyBrakeCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), emergencyBrakeCmd);
return true;
}
@@ -468,8 +515,9 @@
*/
@Override
public void speakModeSwitch(SpeakModeSwitchDTO speakModeSwitchDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(speakModeSwitchDTO.getBoxSn());
SpeakModeSwitchCmd speakModeSwitchCmd = new SpeakModeSwitchCmd(speakModeSwitchDTO);
- this.sendMessage(tyConfiguration.getIpPort(), speakModeSwitchCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), speakModeSwitchCmd);
}
/**
@@ -477,8 +525,9 @@
*/
@Override
public void textSpeak(TextSpeakDTO textSpeakDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(textSpeakDTO.getBoxSn());
TextSpeakCmd textSpeakCmd = new TextSpeakCmd(textSpeakDTO);
- this.sendMessage(tyConfiguration.getIpPort(), textSpeakCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), textSpeakCmd);
}
/**
@@ -486,8 +535,9 @@
*/
@Override
public void realSpeak(RealSpeakDTO realSpeakDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(realSpeakDTO.getBoxSn());
RealSpeakCmd realSpeakCmd = new RealSpeakCmd(realSpeakDTO);
- this.sendMessage(tyConfiguration.getIpPort(), realSpeakCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), realSpeakCmd);
}
/**
@@ -495,8 +545,9 @@
*/
@Override
public void recordSpeak(RecordSpeakDTO recordSpeakDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(recordSpeakDTO.getBoxSn());
RecordSpeakCmd recordSpeakCmd = new RecordSpeakCmd(recordSpeakDTO);
- this.sendMessage(tyConfiguration.getIpPort(), recordSpeakCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), recordSpeakCmd);
}
/**
@@ -504,8 +555,9 @@
*/
@Override
public void volumeSetting(VolumeSettingDTO volumeSettingDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(volumeSettingDTO.getBoxSn());
VolumeSettingCmd volumeSettingCmd = new VolumeSettingCmd(volumeSettingDTO);
- this.sendMessage(tyConfiguration.getIpPort(), volumeSettingCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), volumeSettingCmd);
}
/**
@@ -513,8 +565,9 @@
*/
@Override
public void loopSetting(LoopSettingDTO loopSettingDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(loopSettingDTO.getBoxSn());
LoopSettingCmd loopSettingCmd = new LoopSettingCmd(loopSettingDTO);
- this.sendMessage(tyConfiguration.getIpPort(), loopSettingCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), loopSettingCmd);
}
/**
@@ -522,8 +575,9 @@
*/
@Override
public void stopSpeak(StopSpeakDTO stopSpeakDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(stopSpeakDTO.getBoxSn());
StopSpeakCmd stopSpeakCmd = new StopSpeakCmd(stopSpeakDTO);
- this.sendMessage(tyConfiguration.getIpPort(), stopSpeakCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), stopSpeakCmd);
}
/**
@@ -531,9 +585,10 @@
*/
@Override
public void wayLineUpload(WayLineUploadDTO wayLineUploadDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(wayLineUploadDTO.getBoxSn());
wayLineUploadDTO.setWayLineData(this.CreatePlanLineData());//设置航线数据
WayLineUploadCmd wayLineUploadCmd = new WayLineUploadCmd(wayLineUploadDTO);
- this.sendMessage(tyConfiguration.getIpPort(), wayLineUploadCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), wayLineUploadCmd);
}
//创建航线
@@ -576,8 +631,9 @@
@CheckControlRight(UavControlType.FLY)
@Override
public void wayLineBegin(WayLineBeginDTO wayLineBeginDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(wayLineBeginDTO.getBoxSn());
WayLineBeginCmd wayLineBeginCmd = new WayLineBeginCmd(wayLineBeginDTO);
- this.sendMessage(tyConfiguration.getIpPort(), wayLineBeginCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), wayLineBeginCmd);
}
/**
@@ -586,8 +642,9 @@
@CheckControlRight(UavControlType.FLY)
@Override
public void wayLinePause(WayLinePauseDTO wayLinePauseDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(wayLinePauseDTO.getBoxSn());
WayLinePauseCmd wayLinePauseCmd = new WayLinePauseCmd(wayLinePauseDTO);
- this.sendMessage(tyConfiguration.getIpPort(), wayLinePauseCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), wayLinePauseCmd);
}
/**
@@ -596,8 +653,9 @@
@CheckControlRight(UavControlType.FLY)
@Override
public void wayLineResume(WayLineResumeDTO wayLineResumeDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(wayLineResumeDTO.getBoxSn());
WayLineResumeCmd wayLineResumeCmd = new WayLineResumeCmd(wayLineResumeDTO);
- this.sendMessage(tyConfiguration.getIpPort(), wayLineResumeCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), wayLineResumeCmd);
}
/**
@@ -606,8 +664,9 @@
@CheckControlRight(UavControlType.FLY)
@Override
public void wayLineEnd(WayLineEndDTO wayLineEndDTO) {
+ ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(wayLineEndDTO.getBoxSn());
WayLineEndCmd wayLineEndCmd = new WayLineEndCmd(wayLineEndDTO);
- this.sendMessage(tyConfiguration.getIpPort(), wayLineEndCmd);
+ this.sendMessage(ardDroneInfo.getServerInfoId(), wayLineEndCmd);
}
/**
@@ -624,7 +683,7 @@
if (registerReplyCommand.getSuccess() != 1) {
// 注册失败,重新注册
log.info("注册失败,重新注册");
- registerMessage();
+ registerMessage(key);
}
break;
case 0x02:
@@ -674,7 +733,7 @@
if (tyCommand instanceof UavInitReplyCmd) {
UavInitReplyCmd uavInitReplyCmd = (UavInitReplyCmd) tyCommand;
UavInitInfoCmd uavInitCommand = new UavInitInfoCmd(uavInitReplyCmd.getBoxSn());
- this.sendMessage(tyConfiguration.getIpPort(), uavInitCommand);
+ this.sendMessage(key, uavInitCommand);
logPrint("无人机初始化详情", uavInitCommand.getBoxSn());
}
if (tyCommand instanceof UavReadyReplyCmd) {
@@ -808,26 +867,34 @@
ErrorCodeEnum.getDescByCode(errorCode));
}
- /**
- * 定时3秒发送心跳指令
- */
- @Scheduled(fixedRate = 3000)
- public void sendHeartBeat() {
- if (!TyTcpServerCache.getTcpServerCache(tyConfiguration.getTcpserver() + ":" + tyConfiguration.getTcpport())) {
- return;
- }
- long timestamp = System.currentTimeMillis();
- log.debug("定时向六合发送⼼跳,时间戳{}", timestamp);
- HeartbeatCmd heartbeatMessage = new HeartbeatCmd(timestamp);
- this.sendMessage(tyConfiguration.getIpPort(), heartbeatMessage);
- }
+ /**
+ * 定时向所有已连接的天宇服务器发送心跳
+ */
+ @Scheduled(fixedRate = 5000) // 每5秒执行一次
+ public void sendHeartBeat() {
+ long timestamp = System.currentTimeMillis();
+
+ for (TcpClientSession session : channels.values()) {
+ ChannelFuture future = session.getChannelFuture();
+ if (future == null || !future.channel().isActive()) {
+ log.warn("边缘服务器 [{}] 连接未激活,跳过心跳发送", session.getServerId());
+ continue;
+ }
+
+ HeartbeatCmd heartbeat = new HeartbeatCmd(timestamp);
+ future.channel().writeAndFlush(heartbeat);
+
+ log.info("→ 向边缘服务器 [{}] ({}:{}) 发送心跳,时间戳={}",
+ session.getServerId(), session.getHost(), session.getPort(), timestamp);
+ }
+ }
/**
* 发送消息
*/
private void sendMessage(String key, BaseCmd msg) {
try {
- ChannelFuture future = NettyTcpClient.channels.get(key).getChannelFuture();
+ ChannelFuture future = channels.get(key).getChannelFuture();
Channel channel = future.channel();
if (channel.isActive()) {
InetSocketAddress ipSocket = (InetSocketAddress) channel.remoteAddress();
diff --git a/ard-work/src/main/resources/mapper/ArdDroneInfoMapper.xml b/ard-work/src/main/resources/mapper/ArdDroneInfoMapper.xml
index 70c130f..c7f2d99 100644
--- a/ard-work/src/main/resources/mapper/ArdDroneInfoMapper.xml
+++ b/ard-work/src/main/resources/mapper/ArdDroneInfoMapper.xml
@@ -68,7 +68,10 @@
<include refid="selectArdDroneVo"/>
where id = #{id}
</select>
-
+ <select id="selectArdDroneByBoxSn" parameterType="String" resultMap="ArdDroneResult">
+ <include refid="selectArdDroneVo"/>
+ where box_sn = #{boxSn}
+ </select>
<insert id="insertArdDrone" parameterType="ArdDroneInfo">
insert into ard_drone_info
<trim prefix="(" suffix=")" suffixOverrides=",">
diff --git "a/\345\237\272\344\272\216\345\205\255\345\220\210\350\276\271\347\274\230\346\234\215\345\212\241\345\231\250\346\225\260\346\215\256\346\265\201\347\250\213.png" "b/\345\237\272\344\272\216\345\205\255\345\220\210\350\276\271\347\274\230\346\234\215\345\212\241\345\231\250\346\225\260\346\215\256\346\265\201\347\250\213.png"
new file mode 100644
index 0000000..56f65bd
--- /dev/null
+++ "b/\345\237\272\344\272\216\345\205\255\345\220\210\350\276\271\347\274\230\346\234\215\345\212\241\345\231\250\346\225\260\346\215\256\346\265\201\347\250\213.png"
Binary files differ
--
Gitblit v1.9.3