ServerDemon and MySql
目录
ServerDemon位于ManageTools解决方案中,是一个基于C#的跨平台控制台应用,可以部署为服务器上的服务程序,支持windows和linux,也有使用docker部署的案例。
ServerDemon的功能很简单,把MQTT收到的所有消息保存到MySql数据库里面。数据库架构很简单,仅涉及几张很简单的表,但足以支持按网关和消息类别等条件查询数据。
ServerDemon的代码非常简单,主要就是MQTT和MySql的连接,连接参数就在代码里,可以根据需要修改。
ManageTool界面上有个MySql图标按钮,点一下就可以查询数据库的信息。
ManageTool界面上也有个InfluxDB图标按钮,如果在ServerDemon的代码里开启InfluxDB的相关代码,也可以把数据插入到InfluxDB里面。
为了快速验证本系统,可以在本地安装MySql数据库,推荐使用9.01版(当然,完全没有用到任何罕见数据库特性,任何一个版本应该都是没有问题的)。
源码里默认的连接方式为:127.0.0.1,默认端口,数据库名“gateway”,用户名和密码都是“user1”。
CREATE DATABASE IF NOT EXISTS `gateway` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
USE `gateway`;
-- MySQL dump 10.13 Distrib 8.0.38, for Win64 (x86_64)
--
-- Host: 127.0.0.1 Database: gateway
-- ------------------------------------------------------
-- Server version 9.0.1
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `gw_config`
--
DROP TABLE IF EXISTS `gw_config`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `gw_config` (
`gw_sn` varchar(30) NOT NULL COMMENT '网关序列号',
`gw_model` varchar(30) DEFAULT NULL COMMENT '型号',
`gw_iccid` varchar(30) DEFAULT NULL COMMENT 'ICCID(如果有)',
`sw_version` varchar(45) DEFAULT NULL COMMENT '软件版本',
`confirmed_data_sequence` int DEFAULT NULL COMMENT '已确认的数据序列',
`last_data_sequence` int DEFAULT NULL COMMENT '最新数据序列',
`use_gm` int DEFAULT NULL COMMENT '是否使用国密',
`key_seq` int DEFAULT NULL COMMENT '密钥标识(设置值)',
PRIMARY KEY (`gw_sn`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='网关配置(平台侧)';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `gw_config`
--
LOCK TABLES `gw_config` WRITE;
/*!40000 ALTER TABLE `gw_config` DISABLE KEYS */;
INSERT INTO `gw_config` VALUES ('GW-5G-VM-DELL','GW-5G',NULL,NULL,NULL,NULL,NULL,NULL);
/*!40000 ALTER TABLE `gw_config` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `gw_key`
--
DROP TABLE IF EXISTS `gw_key`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `gw_key` (
`gw_sn` varchar(30) NOT NULL COMMENT '网关序列号',
`gw_key_seq` int NOT NULL COMMENT 'key标识',
`gw_key` varchar(128) DEFAULT NULL COMMENT 'key',
PRIMARY KEY (`gw_sn`,`gw_key_seq`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='网关key信息';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `gw_key`
--
LOCK TABLES `gw_key` WRITE;
/*!40000 ALTER TABLE `gw_key` DISABLE KEYS */;
INSERT INTO `gw_key` VALUES ('GW-5G-VM-DELL',0,'123'),('GW-5G-VM-DELL',1,'12345'),('GW-5G-VM-DELL',2,'1234567');
/*!40000 ALTER TABLE `gw_key` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `gw_message_list`
--
DROP TABLE IF EXISTS `gw_message_list`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `gw_message_list` (
`id` int NOT NULL AUTO_INCREMENT,
`gw_sn` varchar(30) DEFAULT NULL,
`func` varchar(30) DEFAULT NULL,
`ts_str` varchar(30) DEFAULT NULL,
`insert_time` datetime DEFAULT CURRENT_TIMESTAMP,
`topic` varchar(255) DEFAULT NULL,
`message` mediumtext COMMENT '消息体,超长部分被丢弃',
`uid` varchar(45) DEFAULT NULL COMMENT '消息标识',
`respond_for_uid` varchar(45) DEFAULT NULL COMMENT '如果是应答,针对的uid',
`data_seq` int DEFAULT NULL,
`summary` varchar(255) DEFAULT NULL COMMENT '摘要,超过长度的部分被丢弃',
PRIMARY KEY (`id`),
KEY `i_sn` (`gw_sn`,`insert_time`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='网关消息列表';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `gw_message_list`
--
LOCK TABLES `gw_message_list` WRITE;
/*!40000 ALTER TABLE `gw_message_list` DISABLE KEYS */;
/*!40000 ALTER TABLE `gw_message_list` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `gw_report_info`
--
DROP TABLE IF EXISTS `gw_report_info`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `gw_report_info` (
`gw_sn` varchar(30) NOT NULL COMMENT '网关序列号',
`gw_model` varchar(30) DEFAULT NULL COMMENT '型号',
`gw_iccid` varchar(30) DEFAULT NULL COMMENT 'ICCID(如果有)',
`sw_version` varchar(45) DEFAULT NULL COMMENT '软件版本',
`confirmed_data_sequence` int DEFAULT NULL COMMENT '已确认的数据序列',
`last_data_sequence` int DEFAULT NULL COMMENT '最新数据序列',
`start_time` varchar(30) DEFAULT NULL COMMENT '启动时间(程序)',
`last_time` varchar(30) DEFAULT NULL COMMENT '上一次上报信息的时间(包含上报数据)',
`last_data_time` varchar(30) DEFAULT NULL COMMENT '上一次上报数据的时间',
`use_gm` int DEFAULT NULL COMMENT '是否使用国密',
`key_seq` int DEFAULT NULL COMMENT '密钥标识(设置值)',
`current_key_seq` int DEFAULT NULL COMMENT '当前密钥标识(使用值)',
PRIMARY KEY (`gw_sn`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='网关列表';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `gw_report_info`
--
LOCK TABLES `gw_report_info` WRITE;
/*!40000 ALTER TABLE `gw_report_info` DISABLE KEYS */;
/*!40000 ALTER TABLE `gw_report_info` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `tenant_gw`
--
DROP TABLE IF EXISTS `tenant_gw`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `tenant_gw` (
`tenant_name` varchar(64) NOT NULL COMMENT '租户名称',
`gw_sn` varchar(30) NOT NULL COMMENT '网关序列号',
`gw_north_config_name` varchar(64) DEFAULT NULL COMMENT '网关北向配置',
`gw_source_config_name` varchar(64) DEFAULT NULL COMMENT '网关南向配置',
`gw_hardware_config_name` varchar(64) DEFAULT NULL COMMENT '网关硬件配置',
PRIMARY KEY (`tenant_name`,`gw_sn`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='租户的网关';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `tenant_gw`
--
LOCK TABLES `tenant_gw` WRITE;
/*!40000 ALTER TABLE `tenant_gw` DISABLE KEYS */;
/*!40000 ALTER TABLE `tenant_gw` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `tenant_hardware_config`
--
DROP TABLE IF EXISTS `tenant_hardware_config`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `tenant_hardware_config` (
`tenant_name` varchar(64) NOT NULL COMMENT '租户名称',
`hardware_config_name` varchar(64) NOT NULL,
`hardware_cinfig_data` varchar(16000) DEFAULT NULL,
PRIMARY KEY (`tenant_name`,`hardware_config_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='硬件配置';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `tenant_hardware_config`
--
LOCK TABLES `tenant_hardware_config` WRITE;
/*!40000 ALTER TABLE `tenant_hardware_config` DISABLE KEYS */;
/*!40000 ALTER TABLE `tenant_hardware_config` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `tenant_info`
--
DROP TABLE IF EXISTS `tenant_info`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `tenant_info` (
`tenant_name` varchar(64) NOT NULL COMMENT '租户名称',
`tenant_contact` varchar(45) DEFAULT NULL COMMENT '联系人',
`tenant_phone_number` varchar(45) DEFAULT NULL COMMENT '电话',
PRIMARY KEY (`tenant_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='租户信息';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `tenant_info`
--
LOCK TABLES `tenant_info` WRITE;
/*!40000 ALTER TABLE `tenant_info` DISABLE KEYS */;
INSERT INTO `tenant_info` VALUES ('default_tenant','联系人','电话');
/*!40000 ALTER TABLE `tenant_info` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `tenant_north_config`
--
DROP TABLE IF EXISTS `tenant_north_config`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `tenant_north_config` (
`tenant_name` varchar(64) NOT NULL COMMENT '租户名称',
`north_config_name` varchar(32) NOT NULL COMMENT '配置名称',
`north_type` varchar(45) DEFAULT NULL COMMENT 'MQTT/MQTTS',
`host` varchar(45) DEFAULT NULL COMMENT '地址',
`port` int DEFAULT NULL COMMENT '端口',
`user` varchar(45) DEFAULT NULL COMMENT '用户名',
`passowrd` varchar(45) DEFAULT NULL COMMENT '密码',
PRIMARY KEY (`tenant_name`,`north_config_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='租户的北向配置';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `tenant_north_config`
--
LOCK TABLES `tenant_north_config` WRITE;
/*!40000 ALTER TABLE `tenant_north_config` DISABLE KEYS */;
/*!40000 ALTER TABLE `tenant_north_config` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `tenant_south_config`
--
DROP TABLE IF EXISTS `tenant_south_config`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `tenant_south_config` (
`tenant_name` varchar(64) NOT NULL COMMENT '租户名称',
`south_config_name` varchar(64) NOT NULL,
`south_config_data` mediumtext COMMENT '配置数据',
PRIMARY KEY (`tenant_name`,`south_config_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='南向配置(数采)';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `tenant_south_config`
--
LOCK TABLES `tenant_south_config` WRITE;
/*!40000 ALTER TABLE `tenant_south_config` DISABLE KEYS */;
/*!40000 ALTER TABLE `tenant_south_config` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2025-04-29 12:03:05
名称 |
说明 |
gw_config |
网关配置(平台侧) |
gw_report_info |
网关上报信息(网关侧配置) |
gw_message_list |
网关消息列表 |
gw_key |
网关key信息 |
tenant_info |
租户 |
tenant_gw |
租户拥有的网关 |
tenant_north_config |
平台连接配置(MQTT) |
tenant_sourth_config |
设备连接配置(MODBUS等) |
tenant_hardware_config |
硬件配置(IP) |
网关平台侧配置信息,与网关实际可能不一致。
列名 |
空 |
类型 |
说明 |
confirmed_data_sequence |
YES |
int |
已确认的数据序列 |
gw_iccid |
YES |
varchar(30) |
ICCID(如果有) |
gw_model |
YES |
varchar(30) |
型号 |
gw_sn |
NO |
varchar(30) |
网关序列号 |
key_seq |
YES |
int |
密钥标识(设置值) |
last_data_sequence |
YES |
int |
最新数据序列 |
sw_version |
YES |
varchar(45) |
软件版本 |
use_gm |
YES |
int |
是否使用国密 |
PK:gw_sn
网关上报的信息,符合网关实际但与平台配置不一定一致。
列名 |
空 |
类型 |
说明 |
confirmed_data_sequence |
YES |
int |
已确认的数据序列 |
current_key_seq |
YES |
int |
当前密钥标识(使用值) |
gw_iccid |
YES |
varchar(30) |
ICCID(如果有) |
gw_model |
YES |
varchar(30) |
型号 |
gw_sn |
NO |
varchar(30) |
网关序列号 |
key_seq |
YES |
int |
密钥标识(设置值) |
last_data_sequence |
YES |
int |
最新数据序列 |
last_data_time |
YES |
varchar(30) |
上一次上报数据的时间 |
last_time |
YES |
varchar(30) |
上一次上报信息的时间(包含上报数据) |
start_time |
YES |
varchar(30) |
启动时间(程序) |
sw_version |
YES |
varchar(45) |
软件版本 |
use_gm |
YES |
int |
是否使用国密 |
PK:gw_sn
网关消息(超长信息被截断)。
列名 |
空 |
类型 |
说明 |
data_seq |
YES |
int |
|
func |
YES |
varchar(30) |
|
gw_sn |
YES |
varchar(30) |
|
id |
NO |
int |
自动增量 |
insert_time |
YES |
datetime |
|
message |
YES |
mediumtext |
消息体,超长部分被丢弃 |
respond_for_uid |
YES |
varchar(45) |
如果是应答,针对的uid |
summary |
YES |
varchar(255) |
摘要,超过长度的部分被丢弃 |
topic |
YES |
varchar(255) |
|
ts_str |
YES |
varchar(30) |
|
uid |
YES |
varchar(45) |
消息标识 |
PK:id
Index:gw_sn,insert_time(不唯一)
网关密钥序列。
列名 |
空 |
类型 |
说明 |
gw_key |
YES |
varchar(128) |
key |
gw_key_seq |
NO |
int |
key标识 |
gw_sn |
NO |
varchar(30) |
网关序列号 |
PK:gw_sn,gw_key_seq
列名 |
空 |
类型 |
说明 |
tenant_contact |
YES |
varchar(45) |
联系人 |
tenant_name |
NO |
varchar(64) |
租户名称 |
tenant_phone_number |
YES |
varchar(45) |
电话 |
列名 |
空 |
类型 |
说明 |
tenant_name |
NO |
varchar(64) |
租户名称 |
gw_hardware_config_name |
YES |
varchar(64) |
网关硬件配置 |
gw_north_config_name |
YES |
varchar(64) |
网关北向配置 |
gw_sn |
NO |
varchar(30) |
网关序列号 |
gw_source_config_name |
YES |
varchar(64) |
网关南向配置 |
tenant_name |
NO |
varchar(64) |
租户名称 |
列名 |
空 |
类型 |
说明 |
tenant_name |
NO |
varchar(64) |
租户名称 |
host |
YES |
varchar(45) |
地址 |
north_config_name |
NO |
varchar(32) |
配置名称 |
north_type |
YES |
varchar(45) |
MQTT/MQTTS |
passowrd |
YES |
varchar(45) |
密码 |
port |
YES |
int |
端口 |
user |
YES |
varchar(45) |
用户名 |
列名 |
空 |
类型 |
说明 |
south_config_data |
YES |
mediumtext |
配置数据 |
south_config_name |
NO |
varchar(64) |
|
tenant_name |
NO |
varchar(64) |
租户名称 |
列名 |
空 |
类型 |
说明 |
hardware_cinfig_data |
YES |
varchar(16000) |
|
hardware_config_name |
NO |
varchar(64) |
|
tenant_name |
NO |
varchar(64) |
租户名称 |
注意ServerDemon和ManageTools有两个相同的nuget依赖包,与MySql有关的部分是完全相同的。
可以在Visual Studio里直接运行,也可以打包之后放在Windows或linux服务器上运行。
如果连接参数没什么问题,应该一切正常。
运行日志:
2025-04-29 13:28:25.620 tid 主线程 [Info ]C:\working\ctGateway\ManageTools\ServerDemon\Program.cs :55行 :ServerDemon 2024.09.13 16:39
2025-04-29 13:28:25.633 tid 主线程 [Info ]C:\working\ctGateway\ManageTools\ServerDemon\Program.cs :58行 :-debug
2025-04-29 13:28:25.633 tid 主线程 [Info ]C:\working\ctGateway\ManageTools\ServerDemon\Program.cs :71行 :调试模式:True
2025-04-29 13:28:25.634 tid 主线程 [Info ]C:\working\ctGateway\ManageTools\ServerDemon\Program.cs :72行 :BaseInfluxDBTools.url =
2025-04-29 13:28:26.546 tid 主线程 [Info ]C:\working\ctGateway\ManageTools\ServerDemon\Program.cs :19行 :GW-5G-VM-DELL
2025-04-29 13:28:26.547 tid 主线程 [Info ]C:\working\ctGateway\ManageTools\ServerDemon\Program.cs :19行 :GW-5G-VM-DELL
2025-04-29 13:28:26.547 tid 主线程 [Info ]C:\working\ctGateway\ManageTools\ServerDemon\Program.cs :19行 :GW-5G-VM-DELL
2025-04-29 13:28:26.624 tid 主线程 [Info ]C:\working\ctGateway\ManageTools\ServerDemon\Program.cs :27行 :mysql连接成功
2025-04-29 13:28:26.626 tid 主线程 [Info ] :0行 :记录总数 3 错误 0
2025-04-29 13:28:26.650 tid 主线程 [Info ]C:\working\ctGateway\ManageTools\ServerDemon\Program.cs :48行 :Mqtt客户端正在连接......
2025-04-29 13:28:26.657 tid 主线程 [Info ]C:\working\ctGateway\ManageTools\ServerDemon\Program.cs :91行 :成功连接到 localtest MQTTS 127.0.0.1
2025-04-29 13:28:26.706 tid 11 [Info ]C:\working\ctGateway\ManageTools\ServerDemon\Program.cs :48行 :Mqtt客户端连接成功(1).
2025-04-29 13:28:26.717 tid 11 [Info ] :0行 :device_gateway/reg 订阅成功
2025-04-29 13:28:26.718 tid 11 [Info ] :0行 :device_gateway/# 订阅成功
2025-04-29 13:28:40.794 tid 06 [Debug] :0行 :收到来自[GW-5G-VM-DELL]的消息
2025-04-29 13:28:40.796 tid 06 [Info ]C:\working\ctGateway\ManageTools\ServerDemon\Program.cs :37行 :GW-5G-VM-DELL
主界面上有个MySql图标:
点一下MySql图标:
功能其实挺乱的,尚未认真设计,意思意思吧。
查看网关的所有消息:
如果网关不在gw_config里面,可以用菜单的“网关管理”-“注册信息更新到配置”来把右边选中的网关添加到gw_config里面。
主要就是消息列表gw_message_list: