运行后端
# 运行后端代码
# 下载代码
GitHub - lyl-xf/sana (opens new window)
下载完成之后进入项目目录可以看到以下结构:
|----sana
|----doc #文档
|----sana-abutment #设备接入模块
|----sana-base #基础功能模块
|----sana-devices #设备管理模块
|----sana-rules #规则管理模块
|----sana-service #主服务模块
|----sana-system #系统管理模块
|----sana-camera #摄像头模块
..... #待归化模块
|----sana-web #前端项目
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
- sana为整个项目的根目录,也是后端的根目录,直接使用后端编辑器打开sana项目即可。
- 其中sana-web为前端项目,需要单独独拷贝出去编译,并启动。
# 初始化数据库:
# 1、初始化mysql数据库
- 连接到mysql数据库,创建数据库sana。
- 运行sql文件:doc/mysql/sana.sql
# 2、初始化TDengine数据库
可以使用TDengineGUI,也可以通过命令行来操作,下面介绍的是命令行的方式:
- 命令行进入taos界面

找到文件:doc/TDengine/TD.sql
使用建表语句(这里存储时长是3650天,可自行修改):
CREATE DATABASE sana PRECISION 'ms' KEEP 3650 DURATION 10 BUFFER 16;
1

- 使用刚刚创建的sana数据库:
use sana;
1
- 创建日志超级表,建表语句如下:
CREATE STABLE sys_log_operate (ts timestamp,
module NCHAR(200),
name NCHAR(100),
req_uri NCHAR(200),
req_method NCHAR(200),
req_params NCHAR(4000),
ip NCHAR(50),
user_agent NCHAR(300),
operate_type INT,
status INT,
real_name NCHAR(50)
) TAGS (user_id BIGINT);
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
- 查看表是否存在

# 配置后端环境
# 1、使用编辑器打开sana项目,配置mavne

配置好之后,请使用maven编译项目,确保项目可以编译通过(先clena,后install)。

# 2、修改本项目的sdk版本信息,确保和后端要求的sdk版本一致

# 修改配置文件
# 1、修改application.yml
文件位置: sana-server/src/main/resources/application.yml
主要关注以下配置:
# Tomcat
server:
port: 28081
servlet:
context-path: /sana
session:
cookie:
http-only: true
spring:
# 环境 dev|test|prod
profiles:
active: dev
application:
name: sana
jackson:
time-zone: GMT+8
servlet:
multipart:
max-file-size: 400MB
max-request-size: 400MB
# 任务调度
quartz:
job-store-type: "jdbc" # 任务存储类型
wait-for-jobs-to-complete-on-shutdown: false # 关闭时等待任务完成
overwrite-existing-jobs: true # 是否覆盖已有的任务
auto-startup: true # 是否自动启动计划程序
startup-delay: 0s # 延迟启动
jdbc:
initialize-schema: "never" # 数据库架构初始化模式(never:从不进行初始化;always:每次都清空数据库进行初始化;embedded:只初始化内存数据库(默认值))
properties: # 相关属性配置
org:
quartz:
scheduler:
instanceName: SanaScheduler # 调度器实例名称
instanceId: AUTO # 分布式节点ID自动生成
jobStore:
class: org.springframework.scheduling.quartz.LocalDataSourceJobStore
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
tablePrefix: QRTZ_ # 表前缀
isClustered: false # 是否开启集群
dataSource: quartz # 数据源别名(自定义)
clusterCheckinInterval: 10000 # 分布式节点有效性检查时间间隔(毫秒)
useProperties: false
# 线程池配置
threadPool:
class: org.quartz.simpl.SimpleThreadPool
threadCount: 10
threadPriority: 5
threadsInheritContextClassLoaderOfInitializingThread: true
sana:
version: '@project.version@'
resetPassword: 'sana.password' #重置密码功能中默认要修改的密码
logging-enabled: true #是否开启日志存储(如果关闭,则不会进行日志数据的存储)
logging-save-type: mysql #日志存储类型(tdengine\mysql)
devicedata-enabled: true #是否开启设备数据存储
log-save-speed: 20 # 日志每次存储条数(建议根据实际配置、实际操作数量修改)
device-data-speed: 20 # 设备存储每次存储条数(建议根据实际配置、实际操作数量修改)
aviator-path: #aviator规则脚本存储位置,如果不设置,则默认为当前程序运行的目录下的:/sana-rules/src/main/resources/script中
rule-priority: listening #(timing\listening) #规则优先,定时:timing,监听:listening。这里要特别说明一下:如果设置为timing,则定时优先,如果是listening,则监听优先(这种情况发生在同一个设备同时属于定时、监听规则的情况下,并且在相同时间内触发,选择性的执行哪一个)
rule-action: #rule配置
queue-type: REDIS # 队列类型(REDIS:已实现,KAFKA:暂无实现,或将放在后期)
core-size: 2 # 线程池大小
queue-capacity: 500 # 队列大小
mybatis-plus:
mapper-locations: classpath*:/mapper/**/*.xml
typeAliasesPackage: com.sana.*.entity
global-config:
db-config:
id-type: AUTO
logic-delete-value: 1
logic-not-delete-value: 0
banner: false
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
call-setters-on-nulls: true
jdbc-type-for-null: 'null'
configuration-properties:
prefix:
blobType: BLOB
boolValue: TRUE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# 1、修改application-dev.yml(上面的配置中,active为:dev)
文件位置: sana-server/src/main/resources/application-dev.yml
主要关注以下配置(将:文件存储minio配置、redis配置、数据库‘mysql’、‘TDengine’配置 更换为自己部署的信息。):
############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
sa-token:
cookie:
secure: false
httpOnly: true
token-name: Authorization # token 名称(同时也是 cookie 名称)
timeout: 2592000 # token 有效期(单位:秒) 默认30天,-1 代表永久有效
active-timeout: -1 # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
is-concurrent: true # 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
is-share: false # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)
token-style: uuid # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
is-log: true # 是否输出操作日志
jwt-secret-key: sanakeyidSDWsdjnusadFaaDWedwfdasefAS # jwt秘钥
ignore-config:
paths:
- /swagger/**
- /swagger-resources/**
- /swagger-ui.html
- /doc.html
- /swagger-ui/**
- /favicon.ico
# 文件存储
storage:
minio:
access-key: Y2j5CZqWkTYjhRsadas
secret-key: ro2TfKWjV07uOTXBqp5PGzzRQNsadasXRY
end-point: http://127.0.0.1:9000
bucket-name: dev
spring:
# 是否开启登录验证码
captchaEnabled: true
# 数据库连接信心
data:
redis:
database: 1
host: 127.0.0.1
port: 6379
password: 123456
timeout: 6000ms # 连接超时时长(毫秒)
lettuce:
pool:
max-active: 20 # 最大活跃连接数
max-idle: 10 # 最大空闲连接
min-idle: 5 # 最小空闲连接
max-wait: 5000ms # 获取连接最大等待时间
time-between-eviction-runs: 30000ms # 空闲连接检查周期
stream:
core-pool-size: 3 #处理逻辑时线程池的核心线程数
max-pool-size: 3 #线程池最大线程数
queue-capacity: 500 # 队列容量,默认:500
batch-size: 40 #批量消费数量(一次最多获取多少条消息)
poll-timeout-seconds: 3 # Stream中没有消息时,等待时间
streams: # 环境运行的时候,请一定要先创建好对应的stream;
- name: sana:stream:topic-ruleo # 设备规则处理stream1
group: group-rule1
- name: sana:stream:topic-rulet # 设备规则处理stream2
group: group-rule2
- name: sana:stream:topic-rulej # 定时规则处理stream
group: group-rulejob
datasource:
dynamic:
hikari: # Hikari 连接池全局配置
connection-timeout: 30000 # 等待连接池分配链接的最大时长(毫秒),超过这个时长还没有可用的连接则发生 SQLException,默认:30 秒
minimum-idle: 2 # 最小空闲连接数
maximum-pool-size: 10 # 最大连接数
idle-timeout: 600000 # 连接超时的最大时长(毫秒),超时则被释放(retired),默认:10 分钟
max-lifetime: 1800000 # 连接的生命时长(毫秒),超时而且没被使用则被释放(retired),默认: 30 分钟
connection-test-query: SELECT 1
primary: mysql
datasource:
mysql:
# MySQL8
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/sana?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
username: root
password: 123456
# TDengine
tdengine:
#原生链接,需要配置客户端
#driver-class-name: com.taosdata.jdbc.TSDBDriver
#url: jdbc:TAOS://127.0.0.1:6041/sana?charset=UTF-8&locale=en_US.UTF-8&timezone=UTC-8
#REST 连接
driver-class-name: com.taosdata.jdbc.rs.RestfulDriver
url: jdbc:TAOS-RS://127.0.0.1:6041/sana?charset=UTF-8&locale=en_US.UTF-8&timezone=UTC-8
username: root
password: admin1234...
# ZLMediaKit,目前计划整合GB28181、拉流两种方式,前端播放以webrtc为主。
zlm:
enable: true # 是否启用,未启用不会加载
balance: round_robin # 节点负载均衡算法,默认round_robin
nodes: # zlm节点列表,每个节点配置如下
- server-id: zlm-node-1 # 节点ID,可自定义
host: "127.0.0.1" # 节点地址
secret: KqErX1KUSnoGn3IpHsdsdl8KyLSAdmVgLlpa # 节点密钥
enabled: true # 节点是否启用
hook-enabled: true # 节点是否启用hook接口,启用hook会注入hook接口,默认true,需要注意拦截器放通
- server-id: zlm-node-2 # 可配置多个节点
host: "127.0.0.1"
secret: KqErX1KUSnoGn3IpHl8KyLSAdmVgLlpa
enabled: false
hook-enabled: true
# mqtt
mqtt:
mqtt-message: # 服务端配置
core-size: 2 # 线程池核心线程数
queue-capacity: 500 # 队列容量,默认:500
server:
enabled: true # 是否开启服务端,默认:true
ip: 0.0.0.0 # 服务端 ip 默认为0.0.0.0,
port: 1884 # 端口,默认:1883
name: Mqtt-broker(测试环境不开放端口) # 名称,默认:Mica-Mqtt-Server
heartbeat-timeout: 120000 # 心跳超时,单位毫秒,默认: 1000 * 120
read-buffer-size: 8KB # 接收数据的 buffer size,默认:8k
max-bytes-in-message: 10MB # 消息解析最大 bytes 长度,默认:10M
auth:
enable: true # 是否开启 mqtt 认证
username: root # mqtt 认证用户名
password: MqttNB!%#... # mqtt 认证密码
debug: false # 如果开启 prometheus 指标收集建议关闭
stat-enable: false # 开启指标收集,debug 和 prometheus 开启时需要打开,默认开启,关闭节省内存
proxy-protocol-enable: false # 代理协议支持,nginx 可开启 tcp proxy_protocol on; 时转发源 ip 信息。2.4.1 版本开始支持
web-port: 8084 # http、websocket 端口,默认:8083
websocket-enable: true # 是否开启 websocket,默认: true
http-enable: true # 是否开启 http api,默认: false
http-basic-auth:
enable: true # 是否开启 http basic auth,默认: false
username: root # http basic auth 用户名
password: MqttNB!%#... # http basic auth 密码
ssl: # mqtt tcp ssl 认证
enabled: false # 是否开启 ssl 认证,2.1.0 开始支持双向认证
keystore-path: # 必须参数:ssl keystore 目录,支持 classpath:/ 路径。
keystore-pass: # 必选参数:ssl keystore 密码
truststore-path: # 可选参数:ssl 双向认证 truststore 目录,支持 classpath:/ 路径。
truststore-pass: # 可选参数:ssl 双向认证 truststore 密码
client-auth: none # 是否需要客户端认证(双向认证),默认:NONE(不需要),REQUIRE(需要)
linkType: 0 # 连接类型,暂无用处,后续预留
client:
enabled: true # 是否开启客户端,默认:true
proxy-prefix : '/SB/#' # 代理前缀(以‘SB’前缀为例,则默认订阅已经连接broker的:/SB/#)
proxy-status-prefix : /SBSTUTA # 代理前缀(以‘SBSTUTA’前缀为例,则默认订阅已经连接broker的:/SBSTUTA,用于检测代理的设备连接状态。注意:如果使用的emqx,则需要配置一条上下线的规则,转发到该主题上来)
ip: 192.168.3.121 # 连接的服务端 ip(这里的ip为emqx,或者是其他第三方的mqtt-broker) ,默认:127.0.0.1
port: 1883 # 端口:默认:1883
name: Mqtt-client(作为代理服务器的 代理监听客户端) # 名称,默认:Mica-Mqtt-Client
client-id: lana-mqttClient # 客户端Id(非常重要,一般为设备 sn,不可重复)
user-name: admin # 认证的用户名
password: 123456 # 认证的密码
global-subscribe: # 全局订阅的 topic,可被全局监听到,保留 session 停机重启,依然可以接受到消息。(2.2.9开始支持)
timeout: 5 # 超时时间,单位:秒,默认:5秒
reconnect: true # 是否重连,默认:true
re-interval: 5000 # 重连时间,默认 5000 毫秒
version: mqtt_3_1_1 # mqtt 协议版本,可选 MQTT_3_1、mqtt_3_1_1、mqtt_5,默认:mqtt_3_1_1
read-buffer-size: 8KB # 接收数据的 buffer size,默认:8k
max-bytes-in-message: 10MB # 消息解析最大 bytes 长度,默认:10M
keep-alive-secs: 60 # keep-alive 时间,单位:秒
heartbeat-mode: LAST_REQ # 心跳模式,支持最后发送或接收心跳时间来计算心跳,默认:最后发送心跳的时间。(2.4.3 开始支持)
heartbeat-timeout-strategy: PING # 心跳超时策略,支持发送 PING 和 CLOSE 断开连接,默认:最大努力发送 PING。(2.4.3 开始支持)
clean-session: true # mqtt clean session,默认:true
session-expiry-interval-secs: 0 # 开启保留 session 时,session 的有效期,默认:0(2.4.2 开始支持)
biz-thread-pool-size: 2 # mqtt 工作线程数,默认:2,如果消息量比较大,处理较慢,例如做 emqx 的转发消息处理,可以调大此参数(2.4.2 开始支持)
ssl:
enabled: false # 是否开启 ssl 认证,2.1.0 开始支持双向认证
keystore-path: # 可选参数:ssl 双向认证 keystore 目录,支持 classpath:/ 路径。
keystore-pass: # 可选参数:ssl 双向认证 keystore 密码
truststore-path: # 可选参数:ssl 双向认证 truststore 目录,支持 classpath:/ 路径。
truststore-pass: # 可选参数:ssl 双向认证 truststore 密码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# 启动后端程序
找到SanaServerApplication启动文件(sana-server/src/main/java/com/sana/SanaServerApplication)
右键,选择: Run 'SanaServerAppl....mian()',即可启动项目
启动效果:

上次更新: 2025/06/04