Forráskód Böngészése

Code optimization

liqudong 2 éve
szülő
commit
9e4129cd7d

+ 16 - 12
AES_crypt.py

@@ -33,7 +33,7 @@ class AESCrypt:
         elif self.model == AES.MODE_ECB:
             aes = AES.new(self.key, self.model)
         encrypt_text = aes.encrypt(text)
-        return base64.encodebytes(encrypt_text).decode('utf8')
+        return base64.encodebytes(encrypt_text).decode('utf8').rstrip("\n")
 
     def aesdecrypt(self, text):
         if self.model == AES.MODE_CBC:
@@ -66,15 +66,19 @@ def decrypt(text):
     return aes_cryptor.aesdecrypt(text)
 
 
+def encrypt(text):
+    aes_cryptor = AESCrypt(passwd, AES.MODE_CBC, iv)
+    return aes_cryptor.aesencrypt(text)
+
+
 if __name__ == '__main__':
-    activation_verify('B3VLrUgeo8+Xp/+ouVTlQ==\n')
-    # passwd = "123456781234567"
-    # iv = '1234567812345678'
-    #
-    # aescryptor = AESCrypt(passwd, AES.MODE_CBC, iv)  # CBC模式
-    # # aescryptor = Aescrypt(passwd,AES.MODE_ECB,"") # ECB模式
-    # text = "123456"
-    # en_text = aescryptor.aesencrypt(text)
-    # print("密文:", en_text)
-    # text = aescryptor.aesdecrypt(en_text)
-    # print("明文:", text)
+    passwd = "123456781234567"
+    iv = '1234567812345678'
+
+    aescryptor = AESCrypt(passwd, AES.MODE_CBC, iv)  # CBC模式
+    # aescryptor = Aescrypt(passwd,AES.MODE_ECB,"") # ECB模式
+    text = "root"
+    en_text = aescryptor.aesencrypt(text)
+    print("密文:", en_text)
+    text = aescryptor.aesdecrypt(en_text)
+    print("明文:", text)

+ 2 - 1
apis/operate_mysql.py

@@ -3,6 +3,7 @@ import traceback
 import time
 import datetime
 from configuration import Configuration
+from AES_crypt import decrypt
 
 
 class OperateMysql():
@@ -12,7 +13,7 @@ class OperateMysql():
     def __init__(self, config=config, port=3306, charset='utf8'):
         self.host = config['ip']
         self.user = config['username']
-        self.passwd = config['password']
+        self.passwd = decrypt(config['password'])
         self.db = config['dataBaseName']
         self.port = port
         self.charset = charset

+ 1 - 1
config.json

@@ -9,5 +9,5 @@
     "ip": "127.0.0.1",
     "port": 6379
   },
-  "activation_code": "gB3VLrUgeo8+Xp/+ouVTlQ==\n"
+  "activation_code": "gB3VLrUgeo8+Xp/+ouVTlQ=="
 }

+ 29 - 10
configuration.py

@@ -7,24 +7,39 @@ from AES_crypt import decrypt
 class Configuration:
     def __init__(self, path='config.json'):
         self.path = path
-
-    def get_config(self):
-        """"读取配置"""
         try:
             with open(self.path) as json_file:
-                config = json.load(json_file)
-                config['hardDiskdataBase']['password'] = decrypt(config['hardDiskdataBase']['password'])
-            return config
+                self.config = json.load(json_file)
         except FileNotFoundError as e:
             error_logger.error(f"config file does not exist:{e}")
             sys.exit()
+
+    def get_config(self):
+        """"读取配置"""
+        return self.config
         # 解密密码和序列号
         # config['hardDiskdataBase']['password'] = DesEncrypt(
         #     config['hardDiskdataBase']['password']).decode('utf-8')
         # config['code'] = DesEncrypt(config['code']).decode('utf-8')
 
-    def set_config(self):
-        pass
+    def set_config(self, **kwargs):
+        config = self.get_config()
+        for k, v in kwargs.items():
+            k = k.split('.')
+            len_k = len(k)
+            try:
+                if len_k == 1:
+                    config[k[0]] = v
+                elif len_k == 2:
+                    config[k[0]][k[1]] = v
+                elif len_k == 3:
+                    config[k[0]][k[1]][k[2]] = v
+            except KeyError as e:
+                print("键名错误", e)
+                return False
+        with open(self.path, "w") as f:
+            json.dump(config, f)
+        return True
 
     def add_device(self):
         pass
@@ -37,5 +52,9 @@ class Configuration:
 
 
 if __name__ == '__main__':
-    config = Configuration().get_config()
-    print(config)
+    # config = Configuration("./config.json")
+    # dict = {"hardDiskdataBase.username": "zz", "hardDiskdataBase.ip": "127.0.0.1"}
+    # config.set_config(**dict)
+    config = Configuration()
+    res = config.set_config(**{"activation_code": "local_code"})
+    print(res)

+ 16 - 9
connectors/shuizhi_tcp_connector.py

@@ -131,11 +131,16 @@ class ShuizhiTcpConnector(Connector, threading.Thread):
         threading.Thread(target=self.SocketReceive, args=(self.__sock,)).start()
         # 循环发送指令
         while 1:
-            time.sleep(0.2)
+            time.sleep(0.5)
             if not self.__connected:
                 continue
             try:
-                self.__sock.send(instruct_list[sendFlag])
+                for i in instruct_list:
+                    # self.__sock.send(instruct_list[sendFlag])\
+                    time.sleep(.5)
+                    self.__sock.send(i)
+                    time.sleep(.5)
+                    self.__sock.send(i)
             except Exception as e:
                 self.__connected = False
                 self.__reconnect()
@@ -162,20 +167,22 @@ class ShuizhiTcpConnector(Connector, threading.Thread):
             try:
                 recvData = clientSocket.recv(1024)
             except Exception as e:
-                logger.debug(f"Socket receive error:{e}")
+                logger.info(f"Socket receive error:{e}")
                 break
             length = len(recvData)
             if length == 15:
                 fmt = str(length) + 'B'
                 res = struct.unpack(fmt, recvData)
                 t = int_to_hex(res[3], res[4], res[5], res[6])
-                logger.debug(time.strftime('%Y-%m-%d %H:%M:%S'), self._param_id[res[12]], "   t=", t)
+                logger.info(f" {self._param_id[res[12]]},   t= {t}")
                 self.save_format_data(t, self._param_id[res[12]])
-                if sendFlag == self._len_param - 1:
-                    logger.debug("-------------------")
-                    sendFlag = 0
-                else:
-                    sendFlag = sendFlag + 1
+            else:
+                logger.info(f"读取错误:{recvData},跳过。")
+            # if sendFlag == self._len_param - 1:
+            #     logger.info("-------------------")
+            #     sendFlag = 0
+            # else:
+            #     sendFlag = sendFlag + 1
         clientSocket.close()
         logger.info("Client closed.")
 

+ 2 - 2
connectors/tcp_connector.py

@@ -49,7 +49,7 @@ class TcpConnector(Connector, threading.Thread):
         self.__sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         self.__sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # 允许重用本地地址和端口
         self.__sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)  # 在客户端开启心跳维护
-        self.__sock.settimeout(10)  # 设置超时时间3mins
+        self.__sock.settimeout(180)  # 设置超时时间3mins
         try:
             self.__sock.connect((self.__ip, self.__port))
             logger.info(f'Connect to [{self.get_name()}]:[{self.__ip}]:[{self.__port}] success !')
@@ -67,7 +67,7 @@ class TcpConnector(Connector, threading.Thread):
                 self.__sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                 self.__sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
                 self.__sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)  # 在客户端开启心跳维护
-                self.__sock.settimeout(10)  # 设置超时时间3mins
+                self.__sock.settimeout(180)  # 设置超时时间3mins
                 self.__sock.connect((self.__ip, self.__port))
                 self.__connected = True
                 logger.info(f'Reconnect to [{self.get_name()}]:[{self.__ip}]:[{self.__port}] success !')

+ 2 - 3
converters/nmea0183_converter.py

@@ -59,19 +59,18 @@ class NEMA0183Converter(Converter):
             return False
 
     def check_type(self, config, data):
+        logger.info(f"原始数据(波高传感器):len:{len(data)}, data: {data}")
         dict = {}
         data = data.split('*')
         # Splits up the NMEA data by comma
         data = data[0].split(',')
-        logger.debug('len:', len(data), 'data:', data)
         if data[0] == '$PMIRWM':
             for index in config:
                 name = 'c' + str(index['serial_number'])
                 i = int(index['address'])
                 dict[name] = data[i]
-            logger.debug(dict)
+            logger.info(f"解析后数据(波高传感器):len:{len(dict)}, dict: {dict}")
             return dict
-
         # return data[0]
 
     def nmea2utc(self, data):

+ 24 - 3
converters/td266_converter.py

@@ -6,6 +6,26 @@ from converter import Converter
 
 
 class TD266Converter(Converter):
+    def convert(self, config, data):
+        try:
+            data = data.decode('utf-8').split('\t')
+            logger.info(f"原始数据(单点流速仪): {data}")
+            dict = {}
+            for index in config:
+                name = 'c' + str(index['serial_number'])
+                i = int(index['address'])
+                if index['divisor'] is None:
+                    dict[name] = float(data[i])
+                else:
+                    dict[name] = round((float(data[i]) / index['divisor']), 2)
+            logger.info(f"解析后数据(单点流速仪):{data}")
+            return dict
+        except Exception as e:
+            logger.error(e)
+            return "error"
+
+
+"""
     def convert(self, config, data):
         # 原始data: data = b'4420\t1194\t29.823\t104.507\t-7.471\t28.872\t253.153\t9.369\t1.816\t91.491\t-59.593\t100\t9.542\t9.589\t0.015\r\n'
         # 去除结尾\r\n: data = b'4420\t1194\t29.823\t104.507\t-7.471\t28.872\t253.153\t9.369\t1.816\t91.491\t-59.593\t100\t9.542\t9.589\t0.015'
@@ -21,9 +41,9 @@ class TD266Converter(Converter):
             index_start = index_start.span()[0]
             # index_end = index_end.span()[1]
             data = data[index_start:75]  # 只获取流速和流向,大约取25个字符即可
-            logger.debug(data)
+            logger.info(data)
             data = data.decode('utf-8').split('\t')
-            logger.debug(data)
+            logger.info(data)
             dict = {}
             try:
                 for index in config:
@@ -33,10 +53,11 @@ class TD266Converter(Converter):
                         dict[name] = float(data[i])
                     else:
                         dict[name] = round((float(data[i]) / index['divisor']), 2)
-                logger.debug(dict)
+                logger.info(dict)
                 return dict
             except Exception as e:
                 logger.error(e)
                 return "error"
         else:
             return 'pass'
+"""

+ 3 - 0
converters/wxt536_converter.py

@@ -14,10 +14,12 @@ class WXT536Converter(Converter):
     '''
 
     def convert(self, config, data):
+        logger.info(f"data: {data}")
         if data:
             dict = {}
             try:
                 list = data.decode().split(",")
+                logger.info(f"list: {list}, len: {len(list)}")
                 if len(list) == 9:
                     for index in config:
                         name = 'c' + str(index['serial_number'])
@@ -26,6 +28,7 @@ class WXT536Converter(Converter):
                             dict[name] = re.findall(r"\d+\.?\d*", list[i])[0]
                         else:
                             dict[name] = "null"
+                    logger.info(f"解析后数据(气象传感器):{dict}")
                     return dict
                 elif len(list) > 0:
                     return "pass"

+ 17 - 5
gateway.py

@@ -2,7 +2,6 @@ import asyncio
 import datetime
 import sys
 import time
-import logging.config
 
 import wmi
 from sanic import Sanic
@@ -17,11 +16,10 @@ from alarm import Alarm
 from historical_data_storage import HistoricalDataStorage
 from hard_disk_storage import HardDiskStorage
 from api_context import ApiContext
-from AES_crypt import decrypt
-from sanic.log import logger
-from my_log_config import MY_LOGGING_CONFIG
+from AES_crypt import decrypt, encrypt
+from logging_config import LOGGING_CONFIG
 
-app = Sanic(__name__, log_config=MY_LOGGING_CONFIG)
+app = Sanic(__name__, log_config=LOGGING_CONFIG)
 CORS(app)
 
 
@@ -143,6 +141,20 @@ def verify_app(request):
         return response.json({'status': 'no'})
 
 
+@app.post('/activate')
+def acvivate(request):
+    activate_code = request.json['code']
+    for cpu in wmi.WMI().Win32_Processor():
+        cpu_code = cpu.ProcessorId.strip()
+    de_activate_code = decrypt(activate_code)
+    if de_activate_code == cpu_code:
+        config = Configuration()
+        res = config.set_config(**{"activation_code": activate_code})
+        if res:
+            return response.json({'status': 'yes'})
+    return response.json({'status': 'no'})
+
+
 # def overrun_alarm(alarms):
 #     print('async overrun_alarm')
 #     await asyncio.sleep(.1)

+ 10 - 3
gateway.spec

@@ -1,14 +1,16 @@
 # -*- mode: python ; coding: utf-8 -*-
 
+
 block_cipher = None
 
 
 a = Analysis(['gateway.py'],
-             pathex=['D:\\DevTools\\Python38\\Lib\\site-packages', 'E:\\WorkSpace\\DataCollection'],
+             pathex=['E:\\WorkSpace\\shuicai\\DataCollectionDevice\\venv\\Lib\\site-packages'],
              binaries=[],
              datas=[],
              hiddenimports=[],
              hookspath=[],
+             hooksconfig={},
              runtime_hooks=[],
              excludes=[],
              win_no_prefer_redirects=False,
@@ -17,11 +19,12 @@ a = Analysis(['gateway.py'],
              noarchive=False)
 pyz = PYZ(a.pure, a.zipped_data,
              cipher=block_cipher)
+
 exe = EXE(pyz,
           a.scripts,
           a.binaries,
           a.zipfiles,
-          a.datas,
+          a.datas,  
           [],
           name='gateway',
           debug=False,
@@ -30,4 +33,8 @@ exe = EXE(pyz,
           upx=True,
           upx_exclude=[],
           runtime_tmpdir=None,
-          console=True )
+          console=True,
+          disable_windowed_traceback=False,
+          target_arch=None,
+          codesign_identity=None,
+          entitlements_file=None )

+ 2 - 1
hard_disk_storage.py

@@ -4,13 +4,14 @@ import openpyxl
 import pymysql
 import traceback
 import time
+from AES_crypt import decrypt
 
 
 class HardDiskStorage:
     def __init__(self, config, port=3306, charset='utf8'):
         self.host = config['ip']
         self.user = config['username']
-        self.passwd = config['password']
+        self.passwd = decrypt(config['password'])
         self.db = config['dataBaseName']
         self.port = port
         self.charset = charset

+ 14 - 16
my_log_config.py → logging_config.py

@@ -1,6 +1,13 @@
+"""
+@File  : log_config.py
+@Author: lee
+@Date  : 2022/7/13/0013 11:08:55
+@Desc  :
+"""
+import logging
 import sys
 
-MY_LOGGING_CONFIG = dict(
+LOGGING_CONFIG = dict(
     version=1,
     disable_existing_loggers=False,
     loggers={
@@ -15,7 +22,7 @@ MY_LOGGING_CONFIG = dict(
             "qualname": "sanic.error",
         },
         "sanic.access": {
-            "level": "INFO",
+            "level": "WARNING",
             "handlers": ["access_console"],
             "propagate": True,
             "qualname": "sanic.access",
@@ -37,30 +44,21 @@ MY_LOGGING_CONFIG = dict(
             "formatter": "access",
             "stream": sys.stdout,
         },
-        "file": {
-            "class": "logging.handlers.RotatingFileHandler",
-            "formatter": "myFormatter",
-            "filename": "gateway.log",
-            "maxBytes": 1024 * 1024,
-            "backupCount": 5,
-        },
     },
     formatters={
         "generic": {
-            "format": "[%(asctime)s] -[%(threadName)s:%(thread)d] - %(filename)s[line:%(lineno)d][%(processName)s:%(process)d] [%(levelname)s] %(message)s",
+            "format": "%(asctime)s [%(process)d] [%(filename)s:%(lineno)d] [%(levelname)s] %(message)s",
             "datefmt": "[%Y-%m-%d %H:%M:%S %z]",
             "class": "logging.Formatter",
         },
         "access": {
-            "format": "%(asctime)s - (%(name)s)[%(levelname)s][%(host)s]: "
+            "format": "%(asctime)s - (%(name)s) [%(levelname)s][%(host)s]: "
                       + "%(request)s %(message)s %(status)d %(byte)d",
             "datefmt": "[%Y-%m-%d %H:%M:%S %z]",
             "class": "logging.Formatter",
         },
-        "myFormatter": {
-            "format": "[%(asctime)s] -[%(threadName)s:%(thread)d] - %(filename)s[line:%(lineno)d] - %(levelname)s - %(message)s",
-            "datefmt": "[%Y-%m-%d %H:%M:%S %z]",
-            "class": "logging.Formatter",
-        },
     },
 )
+logger = logging.getLogger("sanic.root")
+error_logger = logging.getLogger("sanic.error")
+access_logger = logging.getLogger("sanic.access")

+ 23 - 0
make_code.py

@@ -0,0 +1,23 @@
+"""
+@File  : make_code.py.py
+@Author: lee
+@Date  : 2022/4/7/0007 16:51:10
+@Desc  :
+"""
+import wmi
+from AES_crypt import encrypt
+
+cpu_code = None
+code_file_name = "activate_code.txt"
+for cpu in wmi.WMI().Win32_Processor():
+    cpu_code = cpu.ProcessorId.strip()
+if cpu_code is not None:
+    activate_code = encrypt(cpu_code)
+    fo = open(code_file_name, "w")
+    fo.write(f"activate code: {activate_code}")
+    # 关闭打开的文件
+    fo.close()
+    print("CPU序列号为:", activate_code, ", 已存储到文件:", code_file_name)
+    temps = input("按任意键关闭窗口。\n")
+else:
+    print('获取CPU序列号失败!')

+ 4 - 1
readme.md

@@ -3,6 +3,7 @@
 ## 程序打包exe命令
 pyinstaller -F -p C:\Users\wenge\AppData\Local\Programs\Python\Python38\Lib\site-packages  gateway.spec
 pyinstaller -F -p D:\DevTools\Python38\Lib\site-packages  gateway.spec
+pyinstaller -F -p D:DevTools\Python38\Lib\site-packages gateway.py
 ## 更新日志
 1. 第一次提交。时间:2021/07/19 15:23:21
 2. 修改一些代码bug,删除不必要注释。时间:2021/08/19 13:35:50
@@ -13,4 +14,6 @@ pyinstaller -F -p D:\DevTools\Python38\Lib\site-packages  gateway.spec
 7. 修改水质传感器连接器部分,更新分页查询bug。时间:2021/12/29 09:32:11
 8. 更新日志系统和多线程结构。时间:2022/03/02 14:35:29
 9. 增加加密功能和优化日志系统。时间:2022/03/09 15:58:20
-10. 更新README文件。时间:2022/03/09 16:28:15
+10. 更新README文件。时间:2022/03/09 16:28:15
+11. 日志采用sanic日志系统输出。时间:2022/04/18 16:10:40
+12. 根据经海6号测试,优化水质传感器连接器、单点流速仪解析器,增加创建数据库标准sql文件。 时间:2022/07/19 

BIN
requirements.txt


+ 167 - 0
shucai.sql

@@ -0,0 +1,167 @@
+-- Adminer 4.8.0 MySQL 5.7.26 dump
+
+SET NAMES utf8;
+SET time_zone = '+00:00';
+SET foreign_key_checks = 0;
+SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
+
+CREATE DATABASE `shucai` /*!40100 DEFAULT CHARACTER SET utf8 */;
+USE `shucai`;
+
+DROP TABLE IF EXISTS `command`;
+CREATE TABLE `command` (
+  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+  `station_name` varchar(30) NOT NULL,
+  `command` json NOT NULL,
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+DROP TABLE IF EXISTS `data_point_tbl`;
+CREATE TABLE `data_point_tbl` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `station_name` varchar(120) DEFAULT NULL COMMENT '站点名称',
+  `serial_number` int(11) DEFAULT NULL COMMENT '序列号',
+  `device_id` varchar(20) DEFAULT NULL COMMENT '设备ID',
+  `device_name` varchar(120) DEFAULT NULL COMMENT '设备名称',
+  `io_point_name` varchar(120) DEFAULT NULL COMMENT 'IO点名称',
+  `unit` varchar(120) DEFAULT NULL COMMENT '单位',
+  `address` varchar(20) DEFAULT NULL COMMENT '地址',
+  `data_type` varchar(20) DEFAULT NULL COMMENT '数据类型',
+  `offset` float DEFAULT NULL COMMENT '偏移量',
+  `divisor` float DEFAULT NULL COMMENT '除数',
+  `decimal` int(11) DEFAULT NULL COMMENT '保留小数的位数',
+  `storage_type` varchar(20) DEFAULT NULL COMMENT '存储类型',
+  `low_limit` float DEFAULT NULL COMMENT '下限',
+  `up_limit` float DEFAULT NULL COMMENT '上限',
+  `alarm_low_limit` float DEFAULT NULL COMMENT '越下报警限',
+  `alarm_up_limit` float DEFAULT NULL COMMENT '越上报警限',
+  `negation` tinyint(4) DEFAULT NULL COMMENT '取反',
+  `signal_type` enum('Switch','Analog') DEFAULT NULL COMMENT '开关量、模拟量',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+INSERT INTO `data_point_tbl` (`id`, `station_name`, `serial_number`, `device_id`, `device_name`, `io_point_name`, `unit`, `address`, `data_type`, `offset`, `divisor`, `decimal`, `storage_type`, `low_limit`, `up_limit`, `alarm_low_limit`, `alarm_up_limit`, `negation`, `signal_type`) VALUES
+(1,	'wxt536',	1,	'1',	'wxt536',	'风向',	'°',	'1',	NULL,	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(2,	'wxt536',	2,	'1',	'wxt536',	'风速',	'm/s',	'2',	NULL,	NULL,	NULL,	2,	'float',	0,	60,	0,	30,	NULL,	'Analog'),
+(3,	'wxt536',	3,	'1',	'wxt536',	'气温',	'°C',	'3',	NULL,	NULL,	NULL,	2,	'float',	-30,	50,	0,	36,	NULL,	'Analog'),
+(4,	'wxt536',	4,	'1',	'wxt536',	'相对湿度',	'%RH',	'4',	NULL,	NULL,	NULL,	2,	'float',	0,	100,	0,	1000,	NULL,	'Analog'),
+(5,	'wxt536',	5,	'1',	'wxt536',	'气压',	'hPa',	'5',	NULL,	NULL,	NULL,	2,	'float',	600,	1300,	600,	1300,	NULL,	'Analog'),
+(6,	'wxt536',	6,	'1',	'wxt536',	'日降雨量',	'mm',	'6',	NULL,	NULL,	NULL,	2,	'float',	0,	1000,	0,	1000,	NULL,	'Analog'),
+(7,	'td266',	7,	'1',	'td266',	'流速',	'm/s',	'2',	NULL,	NULL,	100,	2,	'float',	0,	10,	0,	300,	NULL,	'Analog'),
+(8,	'td266',	8,	'1',	'td266',	'流向',	'Deg.M',	'3',	NULL,	NULL,	NULL,	2,	'float',	0,	360,	0,	360,	NULL,	'Analog'),
+(9,	'td266',	9,	'1',	'td266',	'艏向',	'Deg.M',	'6',	NULL,	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(10,	'td266',	10,	'1',	'td266',	'X轴姿态',	'Deg',	'7',	NULL,	NULL,	NULL,	2,	'float',	-45,	45,	NULL,	NULL,	NULL,	'Analog'),
+(11,	'td266',	11,	'1',	'td266',	'Y轴姿态',	'Deg',	'8',	NULL,	NULL,	NULL,	2,	'float',	-45,	45,	NULL,	NULL,	NULL,	'Analog'),
+(12,	'shuizhi',	12,	'1',	'shuizhi',	'溶解氧',	'mg/L',	'',	'',	NULL,	NULL,	2,	'float',	0,	100,	0,	100,	NULL,	'Analog'),
+(13,	'shuizhi',	13,	'1',	'shuizhi',	'温度',	'°C',	'',	'',	NULL,	NULL,	2,	'float',	-5,	40,	-5,	40,	NULL,	'Analog'),
+(14,	'shuizhi',	14,	'1',	'shuizhi',	'盐度',	'PSU',	'',	'',	NULL,	NULL,	2,	'float',	0,	100,	0,	100,	NULL,	'Analog'),
+(15,	'shuizhi',	15,	'1',	'shuizhi',	'PH',	'',	'',	'',	NULL,	NULL,	2,	'float',	0,	14,	0,	14,	NULL,	'Analog'),
+(16,	'shuizhi',	16,	'1',	'shuizhi',	'叶绿素',	'μg/L',	'',	'',	NULL,	NULL,	2,	'float',	0,	100,	0,	100,	NULL,	'Analog'),
+(17,	'shuizhi',	17,	'1',	'shuizhi',	'深度',	'm',	'',	'',	NULL,	NULL,	2,	'float',	0,	100,	0,	100,	NULL,	'Analog'),
+(18,	'adcp',	18,	'1',	'adcp',	'1m流速',	'm/s',	'1',	NULL,	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(19,	'adcp',	19,	'1',	'adcp',	'2m流速',	'm/s',	'2',	NULL,	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(20,	'adcp',	20,	'1',	'adcp',	'3m流速',	'm/s',	'3',	NULL,	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(21,	'adcp',	21,	'1',	'adcp',	'4m流速',	'm/s',	'4',	NULL,	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(22,	'adcp',	22,	'1',	'adcp',	'5m流速',	'm/s',	'5',	NULL,	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(23,	'adcp',	23,	'1',	'adcp',	'6m流速',	'm/s',	'6',	NULL,	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(24,	'adcp',	24,	'1',	'adcp',	'7m流速',	'm/s',	'7',	NULL,	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(25,	'adcp',	25,	'1',	'adcp',	'8m流速',	'm/s',	'8',	NULL,	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(26,	'adcp',	26,	'1',	'adcp',	'9m流速',	'm/s',	'9',	NULL,	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(27,	'adcp',	27,	'1',	'adcp',	'10m流速',	'm/s',	'10',	NULL,	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(28,	'adcp',	28,	'1',	'adcp',	'11m流速',	'm/s',	'11',	NULL,	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(29,	'adcp',	29,	'1',	'adcp',	'12m流速',	'm/s',	'12',	NULL,	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(30,	'adcp',	30,	'1',	'adcp',	'13m流速',	'm/s',	'13',	NULL,	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(31,	'adcp',	31,	'1',	'adcp',	'14m流速',	'm/s',	'14',	NULL,	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(32,	'adcp',	32,	'1',	'adcp',	'15m流速',	'm/s',	'15',	NULL,	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(33,	'adcp',	33,	'1',	'adcp',	'16m流速',	'm/s',	'16',	NULL,	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(34,	'adcp',	34,	'1',	'adcp',	'17m流速',	'm/s',	'17',	NULL,	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(35,	'adcp',	35,	'1',	'adcp',	'18m流速',	'm/s',	'18',	NULL,	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(36,	'adcp',	36,	'1',	'adcp',	'19m流速',	'm/s',	'19',	NULL,	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(37,	'adcp',	37,	'1',	'adcp',	'20m流速',	'm/s',	'20',	NULL,	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(38,	'adcp',	38,	'1',	'adcp',	'21m流速',	'm/s',	'21',	NULL,	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(39,	'adcp',	39,	'1',	'adcp',	'22m流速',	'm/s',	'22',	NULL,	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(40,	'adcp',	40,	'1',	'adcp',	'23m流速',	'm/s',	'23',	NULL,	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(41,	'adcp',	41,	'1',	'adcp',	'24m流速',	'm/s',	'24',	NULL,	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(42,	'adcp',	42,	'1',	'adcp',	'25m流速',	'm/s',	'25',	'',	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(43,	'adcp',	43,	'1',	'adcp',	'26m流速',	'm/s',	'26',	'',	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(44,	'adcp',	44,	'1',	'adcp',	'27m流速',	'm/s',	'27',	'',	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(45,	'adcp',	45,	'1',	'adcp',	'28m流速',	'm/s',	'28',	'',	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(46,	'adcp',	46,	'1',	'adcp',	'29m流速',	'm/s',	'29',	'',	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(47,	'adcp',	47,	'1',	'adcp',	'30m流速',	'm/s',	'30',	'',	NULL,	NULL,	2,	'float',	0,	5,	NULL,	NULL,	NULL,	'Analog'),
+(48,	'adcp',	48,	'1',	'adcp',	'1m流向',	'°',	'31',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(49,	'adcp',	49,	'1',	'adcp',	'2m流向',	'°',	'32',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(50,	'adcp',	50,	'1',	'adcp',	'3m流向',	'°',	'33',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(51,	'adcp',	51,	'1',	'adcp',	'4m流向',	'°',	'34',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(52,	'adcp',	52,	'1',	'adcp',	'5m流向',	'°',	'35',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(53,	'adcp',	53,	'1',	'adcp',	'6m流向',	'°',	'36',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(54,	'adcp',	54,	'1',	'adcp',	'7m流向',	'°',	'37',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(55,	'adcp',	55,	'1',	'adcp',	'8m流向',	'°',	'38',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(56,	'adcp',	56,	'1',	'adcp',	'9m流向',	'°',	'39',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(57,	'adcp',	57,	'1',	'adcp',	'10流向',	'°',	'40',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(58,	'adcp',	58,	'1',	'adcp',	'11流向',	'°',	'41',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(59,	'adcp',	59,	'1',	'adcp',	'12流向',	'°',	'42',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(60,	'adcp',	60,	'1',	'adcp',	'13流向',	'°',	'43',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(61,	'adcp',	61,	'1',	'adcp',	'14流向',	'°',	'44',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(62,	'adcp',	62,	'1',	'adcp',	'15流向',	'°',	'45',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(63,	'adcp',	63,	'1',	'adcp',	'16流向',	'°',	'46',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(64,	'adcp',	64,	'1',	'adcp',	'17流向',	'°',	'47',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(65,	'adcp',	65,	'1',	'adcp',	'18流向',	'°',	'48',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(66,	'adcp',	66,	'1',	'adcp',	'19流向',	'°',	'49',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(67,	'adcp',	67,	'1',	'adcp',	'20流向',	'°',	'50',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(68,	'adcp',	68,	'1',	'adcp',	'21流向',	'°',	'51',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(69,	'adcp',	69,	'1',	'adcp',	'22流向',	'°',	'52',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(70,	'adcp',	70,	'1',	'adcp',	'23流向',	'°',	'53',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(71,	'adcp',	71,	'1',	'adcp',	'24流向',	'°',	'54',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(72,	'adcp',	72,	'1',	'adcp',	'25流向',	'°',	'55',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(73,	'adcp',	73,	'1',	'adcp',	'26流向',	'°',	'56',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(74,	'adcp',	74,	'1',	'adcp',	'27流向',	'°',	'57',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(75,	'adcp',	75,	'1',	'adcp',	'28流向',	'°',	'58',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(76,	'adcp',	76,	'1',	'adcp',	'29流向',	'°',	'59',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(77,	'adcp',	77,	'1',	'adcp',	'30流向',	'°',	'60',	'',	NULL,	NULL,	2,	'float',	0,	360,	NULL,	NULL,	NULL,	'Analog'),
+(78,	'sm140',	78,	'1',	'sm140',	'有效波高',	'm',	'8',	'',	NULL,	NULL,	2,	'float',	0,	50,	0,	50,	NULL,	'Analog'),
+(79,	'sm140',	79,	'1',	'sm140',	'最大波高',	'm',	'10',	'',	NULL,	NULL,	2,	'float',	0,	50,	0,	50,	NULL,	'Analog'),
+(81,	'sm140',	81,	'1',	'sm140',	'有效波周期',	's',	'20',	'',	NULL,	NULL,	2,	'float',	0,	100,	0,	100,	NULL,	'Analog'),
+(82,	'sm140',	82,	'1',	'sm140',	'平均波周期',	's',	'28',	'',	NULL,	NULL,	2,	'float',	0,	100,	0,	100,	NULL,	'Analog'),
+(83,	'sm140',	83,	'1',	'sm140',	'最大波周期',	's',	'30',	'',	NULL,	NULL,	2,	'float',	0,	100,	0,	100,	NULL,	'Analog'),
+(84,	'sm140',	84,	'1',	'sm140',	'最大波高的波周期',	's',	'32',	'',	NULL,	NULL,	2,	'float',	0,	100,	0,	100,	NULL,	'Analog');
+
+DROP TABLE IF EXISTS `shuizhi_insitu_instruct`;
+CREATE TABLE `shuizhi_insitu_instruct` (
+  `parameter_id` int(6) NOT NULL COMMENT 'id,用于判断是哪个参数',
+  `name` varchar(10) CHARACTER SET utf8 NOT NULL COMMENT '参数名称',
+  `units_id` int(6) DEFAULT NULL COMMENT '单位id,判断单位值',
+  `station_code` varchar(8) CHARACTER SET utf8 NOT NULL COMMENT '站号',
+  `function_code` varchar(8) CHARACTER SET utf8 NOT NULL COMMENT '功能码',
+  `address` int(6) NOT NULL COMMENT '寄存器的位置'
+) ENGINE=InnoDB DEFAULT CHARSET=utf16 COMMENT='读取水质参数,组合In-situ发送指令';
+
+INSERT INTO `shuizhi_insitu_instruct` (`parameter_id`, `name`, `units_id`, `station_code`, `function_code`, `address`) VALUES
+(3,	'深度',	NULL,	'01',	'03',	5464),
+(12,	'盐度',	NULL,	'01',	'03',	5527),
+(17,	'PH',	NULL,	'01',	'03',	5562),
+(51,	'叶绿素',	NULL,	'01',	'03',	5800),
+(1,	'温度',	NULL,	'01',	'03',	5450),
+(20,	'溶解氧',	NULL,	'01',	'03',	5583);
+
+DROP TABLE IF EXISTS `station_info_tbl`;
+CREATE TABLE `station_info_tbl` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT,
+  `station_name` varchar(120) NOT NULL,
+  `connector_module` varchar(120) NOT NULL,
+  `connector` varchar(120) NOT NULL,
+  `connector_config` json NOT NULL,
+  `converter_module` varchar(120) NOT NULL,
+  `converter` varchar(120) NOT NULL,
+  `status` tinyint(4) DEFAULT NULL,
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+INSERT INTO `station_info_tbl` (`id`, `station_name`, `connector_module`, `connector`, `connector_config`, `converter_module`, `converter`, `status`) VALUES
+(1,	'wxt536',	'tcp_connector',	'TcpConnector',	'{\"ip\": \"192.168.1.84\", \"port\": 4001, \"save_frequency\": 5, \"alarm_save_frequency\": 15}',	'wxt536_converter',	'WXT536Converter',	1),
+(2,	'sm140',	'tcp_connector',	'TcpConnector',	'{\"ip\": \"192.168.1.83\", \"port\": 4001, \"save_frequency\": 5, \"alarm_save_frequency\": 15}',	'nmea0183_converter',	'NEMA0183Converter',	1),
+(3,	'td266',	'tcp_connector',	'TcpConnector',	'{\"ip\": \"192.168.1.89\", \"port\": 4001, \"save_frequency\": 180, \"alarm_save_frequency\": 15}',	'td266_converter',	'TD266Converter',	1),
+(4,	'adcp',	'tcp_connector',	'TcpConnector',	'{\"ip\": \"192.168.1.252\", \"port\": 4001, \"save_frequency\": 180, \"alarm_save_frequency\": 15}',	'adcp_converter',	'AdcpConverter',	1),
+(5,	'shuizhi',	'shuizhi_tcp_connector',	'ShuizhiTcpConnector',	'{\"ip\": \"192.168.1.254\", \"port\": 4001, \"save_frequency\": 5, \"alarm_save_frequency\": 15}',	'shuizhi_converter',	'ShuizhiConverter',	1);
+
+-- 2022-07-19 03:10:34