liusuyi
2025-10-11 56189f93858d1228705cc3dcfae0fc77f3c74231
调整tcp和http多服务业务
4 files added
20 files modified
2 files deleted
3020 ■■■■■ changed files
ard-admin/src/main/java/com/ard/web/controller/work/UavBaseController.java 6 ●●●●● patch | view | raw | blame | history
ard-admin/src/main/resources/application-prod.yml 32 ●●●●● patch | view | raw | blame | history
ard-admin/src/main/resources/application.yml 8 ●●●●● patch | view | raw | blame | history
ard-admin/src/main/resources/resources_en_US.properties 1071 ●●●●● patch | view | raw | blame | history
ard-admin/src/main/resources/resources_zh_CN.properties 1074 ●●●●● patch | view | raw | blame | history
ard-device/src/main/java/com/ard/device/camera/domain/ArdCamera.java 7 ●●●●● patch | view | raw | blame | history
ard-device/src/main/resources/mapper/ArdCameraMapper.xml 6 ●●●●● patch | view | raw | blame | history
ard-work/pom.xml 4 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/component/forest/TokenInterceptor.java 13 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/component/forest/TyClient.java 30 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/component/netty/NettyTcpClient.java 104 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/component/netty/TcpClientSession.java 6 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/component/netty/TyTcpClientManager.java 157 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/component/netty/handler/ClientHandler.java 68 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/config/TyConfiguration.java 81 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/domain/dto/BoxPhotosDTO.java 3 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/domain/receiver/BoxInfoReceiver.java 1 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/mapper/ArdDroneInfoMapper.java 2 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/service/IArdDroneService.java 2 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/service/IArdServerService.java 10 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/service/ITyService.java 4 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/service/impl/ArdDroneServiceImpl.java 7 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/service/impl/ArdServerServiceImpl.java 92 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/service/impl/TyServiceImpl.java 227 ●●●●● patch | view | raw | blame | history
ard-work/src/main/resources/mapper/ArdDroneInfoMapper.xml 5 ●●●●● patch | view | raw | blame | history
基于六合边缘服务器数据流程.png patch | view | raw | blame | history
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("获取六合盒子列表")
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
  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
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
    #active: prod-druid,prod
    active: dev-druid,dev
ard-admin/src/main/resources/resources_en_US.properties
New file
@@ -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
ard-admin/src/main/resources/resources_zh_CN.properties
New file
@@ -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
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();
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>
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>
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
    }
}
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);
}
ard-work/src/main/java/com/ard/work/component/netty/NettyTcpClient.java
File was deleted
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;
ard-work/src/main/java/com/ard/work/component/netty/TyTcpClientManager.java
New file
@@ -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);
        }
    }
}
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());
            }
ard-work/src/main/java/com/ard/work/config/TyConfiguration.java
File was deleted
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;
ard-work/src/main/java/com/ard/work/domain/receiver/BoxInfoReceiver.java
@@ -62,7 +62,6 @@
    /**
     * 服务器实体对象ID
     */
    @JsonProperty("lastTaskId")
    private String serverInfoId;
    /**
ard-work/src/main/java/com/ard/work/mapper/ArdDroneInfoMapper.java
@@ -18,7 +18,7 @@
     * @return 无人机盒子
     */
    ArdDroneInfo selectArdDroneById(String id);
    ArdDroneInfo selectArdDroneByBoxSn(String boxSn);
    /**
     * 查询无人机盒子列表
     *
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);
    /**
     * 查询无人机盒子列表
     * 
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);
}
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);
    /**
     * 云台转动(基于角度)
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,方便快速查找
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;
    }
}
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();
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=",">
基于六合边缘服务器数据流程.png