|
|
|
@ -3,11 +3,11 @@ package main
|
|
|
|
import (
|
|
|
|
import (
|
|
|
|
"database/sql"
|
|
|
|
"database/sql"
|
|
|
|
"fmt"
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"strconv"
|
|
|
|
"time"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
|
|
_ "github.com/denisenkom/go-mssqldb"
|
|
|
|
_ "github.com/denisenkom/go-mssqldb"
|
|
|
|
_ "github.com/go-sql-driver/mysql"
|
|
|
|
_ "github.com/go-sql-driver/mysql"
|
|
|
|
"github.com/google/uuid"
|
|
|
|
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// DatabaseConfig 数据库配置结构
|
|
|
|
// DatabaseConfig 数据库配置结构
|
|
|
|
@ -22,20 +22,28 @@ type DatabaseConfig struct {
|
|
|
|
SSLMode string `json:"ssl_mode,omitempty"` // for mysql
|
|
|
|
SSLMode string `json:"ssl_mode,omitempty"` // for mysql
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Camera 摄像头数据库模型
|
|
|
|
// Camera 摄像头数据库模型 - 适配qsc_camera表
|
|
|
|
type Camera struct {
|
|
|
|
type Camera struct {
|
|
|
|
ID string `json:"id" db:"id"`
|
|
|
|
CameraID int `json:"camera_id" db:"camera_id"`
|
|
|
|
Name string `json:"name" db:"name"`
|
|
|
|
IP string `json:"ip" db:"ip"`
|
|
|
|
IP string `json:"ip" db:"ip"`
|
|
|
|
Port int `json:"port" db:"port"`
|
|
|
|
Username string `json:"username" db:"username"`
|
|
|
|
Username string `json:"username" db:"username"`
|
|
|
|
Password string `json:"password" db:"password"`
|
|
|
|
Password string `json:"password" db:"password"`
|
|
|
|
RTSPURL string `json:"rtsp_url" db:"rtsp_url"`
|
|
|
|
URL string `json:"url" db:"url"`
|
|
|
|
Enabled bool `json:"enabled" db:"enabled"`
|
|
|
|
CameraProduce string `json:"camera_produce" db:"camera_produce"`
|
|
|
|
OnDemand bool `json:"on_demand" db:"on_demand"`
|
|
|
|
CameraName string `json:"camera_name" db:"camera_name"`
|
|
|
|
Audio bool `json:"audio" db:"audio"`
|
|
|
|
DeviceType string `json:"device_type" db:"device_type"`
|
|
|
|
Debug bool `json:"debug" db:"debug"`
|
|
|
|
UnitCode string `json:"unit_code" db:"unit_code"`
|
|
|
|
CreatedAt time.Time `json:"created_at" db:"created_at"`
|
|
|
|
NvrProduce string `json:"nvr_produce" db:"nvr_produce"`
|
|
|
|
UpdatedAt time.Time `json:"updated_at" db:"updated_at"`
|
|
|
|
NvrPath string `json:"nvr_path" db:"nvr_path"`
|
|
|
|
|
|
|
|
PlayBack string `json:"play_back" db:"play_back"`
|
|
|
|
|
|
|
|
DelFlag string `json:"del_flag" db:"del_flag"`
|
|
|
|
|
|
|
|
CreateBy string `json:"create_by" db:"create_by"`
|
|
|
|
|
|
|
|
CreateTime time.Time `json:"create_time" db:"create_time"`
|
|
|
|
|
|
|
|
UpdateBy string `json:"update_by" db:"update_by"`
|
|
|
|
|
|
|
|
UpdateTime time.Time `json:"update_time" db:"update_time"`
|
|
|
|
|
|
|
|
UserID int64 `json:"user_id" db:"user_id"`
|
|
|
|
|
|
|
|
DeptID int64 `json:"dept_id" db:"dept_id"`
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// DatabaseManager 数据库管理器
|
|
|
|
// DatabaseManager 数据库管理器
|
|
|
|
@ -139,11 +147,14 @@ func (dm *DatabaseManager) initTables() error {
|
|
|
|
return err
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetAllCameras 获取所有摄像头
|
|
|
|
// GetAllCameras 获取所有摄像头 - 适配qsc_camera表
|
|
|
|
func (dm *DatabaseManager) GetAllCameras() ([]Camera, error) {
|
|
|
|
func (dm *DatabaseManager) GetAllCameras() ([]Camera, error) {
|
|
|
|
query := `SELECT id, name, ip, username, password, rtsp_url, enabled, on_demand, audio, debug, created_at, updated_at FROM cameras WHERE enabled = ?`
|
|
|
|
query := `SELECT camera_id, ip, port, username, password, url, camera_produce,
|
|
|
|
|
|
|
|
camera_name, device_type, unit_code, nvr_produce, nvr_path, play_back,
|
|
|
|
|
|
|
|
del_flag, create_by, create_time, update_by, update_time, user_id, dept_id
|
|
|
|
|
|
|
|
FROM qsc_camera WHERE del_flag != '1'`
|
|
|
|
|
|
|
|
|
|
|
|
rows, err := dm.db.Query(query, true)
|
|
|
|
rows, err := dm.db.Query(query)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -152,9 +163,11 @@ func (dm *DatabaseManager) GetAllCameras() ([]Camera, error) {
|
|
|
|
var cameras []Camera
|
|
|
|
var cameras []Camera
|
|
|
|
for rows.Next() {
|
|
|
|
for rows.Next() {
|
|
|
|
var camera Camera
|
|
|
|
var camera Camera
|
|
|
|
err := rows.Scan(&camera.ID, &camera.Name, &camera.IP, &camera.Username,
|
|
|
|
err := rows.Scan(&camera.CameraID, &camera.IP, &camera.Port, &camera.Username,
|
|
|
|
&camera.Password, &camera.RTSPURL, &camera.Enabled, &camera.OnDemand,
|
|
|
|
&camera.Password, &camera.URL, &camera.CameraProduce, &camera.CameraName,
|
|
|
|
&camera.Audio, &camera.Debug, &camera.CreatedAt, &camera.UpdatedAt)
|
|
|
|
&camera.DeviceType, &camera.UnitCode, &camera.NvrProduce, &camera.NvrPath,
|
|
|
|
|
|
|
|
&camera.PlayBack, &camera.DelFlag, &camera.CreateBy, &camera.CreateTime,
|
|
|
|
|
|
|
|
&camera.UpdateBy, &camera.UpdateTime, &camera.UserID, &camera.DeptID)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -164,14 +177,49 @@ func (dm *DatabaseManager) GetAllCameras() ([]Camera, error) {
|
|
|
|
return cameras, nil
|
|
|
|
return cameras, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetCameraByID 根据ID获取摄像头
|
|
|
|
// GetCamerasByUnitCode 根据unitcode获取摄像头列表 - 适配qsc_camera表
|
|
|
|
|
|
|
|
func (dm *DatabaseManager) GetCamerasByUnitCode(unitCode string) ([]Camera, error) {
|
|
|
|
|
|
|
|
query := `SELECT camera_id, ip, port, username, password, url, camera_produce,
|
|
|
|
|
|
|
|
camera_name, device_type, unit_code, nvr_produce, nvr_path, play_back,
|
|
|
|
|
|
|
|
del_flag, create_by, create_time, update_by, update_time, user_id, dept_id
|
|
|
|
|
|
|
|
FROM qsc_camera WHERE unit_code = ? AND del_flag != '1'`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rows, err := dm.db.Query(query, unitCode)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
defer rows.Close()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var cameras []Camera
|
|
|
|
|
|
|
|
for rows.Next() {
|
|
|
|
|
|
|
|
var camera Camera
|
|
|
|
|
|
|
|
err := rows.Scan(&camera.CameraID, &camera.IP, &camera.Port, &camera.Username,
|
|
|
|
|
|
|
|
&camera.Password, &camera.URL, &camera.CameraProduce, &camera.CameraName,
|
|
|
|
|
|
|
|
&camera.DeviceType, &camera.UnitCode, &camera.NvrProduce, &camera.NvrPath,
|
|
|
|
|
|
|
|
&camera.PlayBack, &camera.DelFlag, &camera.CreateBy, &camera.CreateTime,
|
|
|
|
|
|
|
|
&camera.UpdateBy, &camera.UpdateTime, &camera.UserID, &camera.DeptID)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
cameras = append(cameras, camera)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return cameras, nil
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// GetCameraByID 根据ID获取摄像头 - 适配qsc_camera表
|
|
|
|
func (dm *DatabaseManager) GetCameraByID(id string) (*Camera, error) {
|
|
|
|
func (dm *DatabaseManager) GetCameraByID(id string) (*Camera, error) {
|
|
|
|
query := `SELECT id, name, ip, username, password, rtsp_url, enabled, on_demand, audio, debug, created_at, updated_at FROM cameras WHERE id = ?`
|
|
|
|
query := `SELECT camera_id, ip, port, username, password, url, camera_produce,
|
|
|
|
|
|
|
|
camera_name, device_type, unit_code, nvr_produce, nvr_path, play_back,
|
|
|
|
|
|
|
|
del_flag, create_by, create_time, update_by, update_time, user_id, dept_id
|
|
|
|
|
|
|
|
FROM qsc_camera WHERE camera_id = ? AND del_flag = '0'`
|
|
|
|
|
|
|
|
|
|
|
|
var camera Camera
|
|
|
|
var camera Camera
|
|
|
|
err := dm.db.QueryRow(query, id).Scan(&camera.ID, &camera.Name, &camera.IP,
|
|
|
|
err := dm.db.QueryRow(query, id).Scan(&camera.CameraID, &camera.IP, &camera.Port,
|
|
|
|
&camera.Username, &camera.Password, &camera.RTSPURL, &camera.Enabled,
|
|
|
|
&camera.Username, &camera.Password, &camera.URL, &camera.CameraProduce,
|
|
|
|
&camera.OnDemand, &camera.Audio, &camera.Debug, &camera.CreatedAt, &camera.UpdatedAt)
|
|
|
|
&camera.CameraName, &camera.DeviceType, &camera.UnitCode, &camera.NvrProduce,
|
|
|
|
|
|
|
|
&camera.NvrPath, &camera.PlayBack, &camera.DelFlag, &camera.CreateBy,
|
|
|
|
|
|
|
|
&camera.CreateTime, &camera.UpdateBy, &camera.UpdateTime, &camera.UserID, &camera.DeptID)
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
if err == sql.ErrNoRows {
|
|
|
|
if err == sql.ErrNoRows {
|
|
|
|
@ -183,41 +231,44 @@ func (dm *DatabaseManager) GetCameraByID(id string) (*Camera, error) {
|
|
|
|
return &camera, nil
|
|
|
|
return &camera, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// CreateCamera 创建摄像头
|
|
|
|
// CreateCamera 创建摄像头 - 适配qsc_camera表
|
|
|
|
func (dm *DatabaseManager) CreateCamera(camera *Camera) error {
|
|
|
|
func (dm *DatabaseManager) CreateCamera(camera *Camera) error {
|
|
|
|
if camera.ID == "" {
|
|
|
|
camera.CreateTime = time.Now()
|
|
|
|
camera.ID = uuid.New().String()
|
|
|
|
camera.UpdateTime = time.Now()
|
|
|
|
}
|
|
|
|
|
|
|
|
camera.CreatedAt = time.Now()
|
|
|
|
|
|
|
|
camera.UpdatedAt = time.Now()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
query := `INSERT INTO cameras (id, name, ip, username, password, rtsp_url, enabled, on_demand, audio, debug, created_at, updated_at)
|
|
|
|
query := `INSERT INTO qsc_camera (ip, port, username, password, url, camera_produce,
|
|
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
|
|
|
|
camera_name, device_type, unit_code, nvr_produce, nvr_path, play_back,
|
|
|
|
|
|
|
|
del_flag, create_by, create_time, update_by, update_time, user_id, dept_id)
|
|
|
|
|
|
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
|
|
|
|
|
|
|
|
|
|
|
|
_, err := dm.db.Exec(query, camera.ID, camera.Name, camera.IP, camera.Username,
|
|
|
|
_, err := dm.db.Exec(query, camera.IP, camera.Port, camera.Username, camera.Password,
|
|
|
|
camera.Password, camera.RTSPURL, camera.Enabled, camera.OnDemand,
|
|
|
|
camera.URL, camera.CameraProduce, camera.CameraName, camera.DeviceType,
|
|
|
|
camera.Audio, camera.Debug, camera.CreatedAt, camera.UpdatedAt)
|
|
|
|
camera.UnitCode, camera.NvrProduce, camera.NvrPath, camera.PlayBack,
|
|
|
|
|
|
|
|
camera.DelFlag, camera.CreateBy, camera.CreateTime, camera.UpdateBy,
|
|
|
|
|
|
|
|
camera.UpdateTime, camera.UserID, camera.DeptID)
|
|
|
|
|
|
|
|
|
|
|
|
return err
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// UpdateCamera 更新摄像头
|
|
|
|
// UpdateCamera 更新摄像头 - 适配qsc_camera表
|
|
|
|
func (dm *DatabaseManager) UpdateCamera(camera *Camera) error {
|
|
|
|
func (dm *DatabaseManager) UpdateCamera(camera *Camera) error {
|
|
|
|
camera.UpdatedAt = time.Now()
|
|
|
|
camera.UpdateTime = time.Now()
|
|
|
|
|
|
|
|
|
|
|
|
query := `UPDATE cameras SET name=?, ip=?, username=?, password=?, rtsp_url=?,
|
|
|
|
query := `UPDATE qsc_camera SET ip=?, port=?, username=?, password=?, url=?,
|
|
|
|
enabled=?, on_demand=?, audio=?, debug=?, updated_at=? WHERE id=?`
|
|
|
|
camera_produce=?, camera_name=?, device_type=?, unit_code=?, nvr_produce=?,
|
|
|
|
|
|
|
|
nvr_path=?, play_back=?, update_by=?, update_time=? WHERE camera_id=?`
|
|
|
|
|
|
|
|
|
|
|
|
_, err := dm.db.Exec(query, camera.Name, camera.IP, camera.Username,
|
|
|
|
_, err := dm.db.Exec(query, camera.IP, camera.Port, camera.Username, camera.Password,
|
|
|
|
camera.Password, camera.RTSPURL, camera.Enabled, camera.OnDemand,
|
|
|
|
camera.URL, camera.CameraProduce, camera.CameraName, camera.DeviceType,
|
|
|
|
camera.Audio, camera.Debug, camera.UpdatedAt, camera.ID)
|
|
|
|
camera.UnitCode, camera.NvrProduce, camera.NvrPath, camera.PlayBack,
|
|
|
|
|
|
|
|
camera.UpdateBy, camera.UpdateTime, camera.CameraID)
|
|
|
|
|
|
|
|
|
|
|
|
return err
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// DeleteCamera 删除摄像头
|
|
|
|
// DeleteCamera 删除摄像头 - 适配qsc_camera表
|
|
|
|
func (dm *DatabaseManager) DeleteCamera(id string) error {
|
|
|
|
func (dm *DatabaseManager) DeleteCamera(id string) error {
|
|
|
|
query := `DELETE FROM cameras WHERE id = ?`
|
|
|
|
query := `UPDATE qsc_camera SET del_flag = '1' WHERE camera_id = ?`
|
|
|
|
_, err := dm.db.Exec(query, id)
|
|
|
|
_, err := dm.db.Exec(query, id)
|
|
|
|
return err
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -230,39 +281,61 @@ func (dm *DatabaseManager) Close() error {
|
|
|
|
return nil
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// CameraToStream 将摄像头转换为流配置
|
|
|
|
// CameraToStream 将摄像头转换为流配置 - 适配qsc_camera表
|
|
|
|
func CameraToStream(camera Camera) StreamST {
|
|
|
|
func CameraToStream(camera Camera) StreamST {
|
|
|
|
|
|
|
|
// 构建RTSP URL
|
|
|
|
|
|
|
|
rtspURL := camera.URL
|
|
|
|
|
|
|
|
if rtspURL == "" {
|
|
|
|
|
|
|
|
// 如果URL为空,根据IP、端口、用户名密码构建RTSP URL
|
|
|
|
|
|
|
|
if camera.Username != "" && camera.Password != "" {
|
|
|
|
|
|
|
|
rtspURL = fmt.Sprintf("rtsp://%s:%s@%s:%d/stream1",
|
|
|
|
|
|
|
|
camera.Username, camera.Password, camera.IP, camera.Port)
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
rtspURL = fmt.Sprintf("rtsp://%s:%d/stream1", camera.IP, camera.Port)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return StreamST{
|
|
|
|
return StreamST{
|
|
|
|
Name: camera.Name,
|
|
|
|
Name: camera.CameraName,
|
|
|
|
Channels: map[string]ChannelST{
|
|
|
|
Channels: map[string]ChannelST{
|
|
|
|
"0": {
|
|
|
|
"0": {
|
|
|
|
Name: camera.Name,
|
|
|
|
Name: camera.CameraName,
|
|
|
|
URL: camera.RTSPURL,
|
|
|
|
URL: rtspURL,
|
|
|
|
OnDemand: camera.OnDemand,
|
|
|
|
OnDemand: false, // 根据需要设置
|
|
|
|
Debug: camera.Debug,
|
|
|
|
Debug: false, // 根据需要设置
|
|
|
|
Audio: camera.Audio,
|
|
|
|
Audio: true, // 根据需要设置
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// StreamToCamera 将流配置转换为摄像头
|
|
|
|
// StreamToCamera 将流配置转换为摄像头 - 适配qsc_camera表
|
|
|
|
func StreamToCamera(id string, stream StreamST) Camera {
|
|
|
|
func StreamToCamera(id string, stream StreamST) Camera {
|
|
|
|
|
|
|
|
// 创建基础摄像头对象 - 适配qsc_camera表
|
|
|
|
|
|
|
|
cameraID, _ := strconv.Atoi(id)
|
|
|
|
camera := Camera{
|
|
|
|
camera := Camera{
|
|
|
|
ID: id,
|
|
|
|
CameraID: cameraID,
|
|
|
|
Name: stream.Name,
|
|
|
|
CameraName: stream.Name,
|
|
|
|
Enabled: true,
|
|
|
|
IP: "", // 从URL中解析
|
|
|
|
CreatedAt: time.Now(),
|
|
|
|
Port: 554, // 默认RTSP端口
|
|
|
|
UpdatedAt: time.Now(),
|
|
|
|
Username: "", // 从URL中解析
|
|
|
|
|
|
|
|
Password: "", // 从URL中解析
|
|
|
|
|
|
|
|
URL: "", // 将从第一个通道获取
|
|
|
|
|
|
|
|
DeviceType: "网络摄像头",
|
|
|
|
|
|
|
|
UnitCode: "DEFAULT",
|
|
|
|
|
|
|
|
DelFlag: "0",
|
|
|
|
|
|
|
|
CreateBy: "system",
|
|
|
|
|
|
|
|
CreateTime: time.Now(),
|
|
|
|
|
|
|
|
UpdateBy: "system",
|
|
|
|
|
|
|
|
UpdateTime: time.Now(),
|
|
|
|
|
|
|
|
UserID: 1,
|
|
|
|
|
|
|
|
DeptID: 1,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取第一个通道的配置
|
|
|
|
// 获取第一个通道的配置
|
|
|
|
if len(stream.Channels) > 0 {
|
|
|
|
if len(stream.Channels) > 0 {
|
|
|
|
for _, channel := range stream.Channels {
|
|
|
|
for _, channel := range stream.Channels {
|
|
|
|
camera.RTSPURL = channel.URL
|
|
|
|
camera.URL = channel.URL
|
|
|
|
camera.OnDemand = channel.OnDemand
|
|
|
|
|
|
|
|
camera.Debug = channel.Debug
|
|
|
|
|
|
|
|
camera.Audio = channel.Audio
|
|
|
|
|
|
|
|
break
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|