Files
zmkgC/api/video_hat/ws2/ws2.4.go

154 lines
4.8 KiB
Go
Raw Normal View History

2025-07-07 20:11:59 +08:00
package ws2
import (
"encoding/json"
"errors"
"fmt"
"github.com/gogf/gf/v2/frame/g"
"github.com/tiger1103/gfast/v3/api/constant"
"github.com/tiger1103/gfast/v3/api/video_hat/alarm"
"io/ioutil"
"log"
"net/http"
"strconv"
"time"
)
type CaInfo struct {
UserID string `json:"user_id"`
DeviceID string `json:"device_id"`
CaVer string `json:"ca_ver"`
Mobile string `json:"mobile"`
SIM string `json:"sim"`
Password string `json:"pwd"`
CTime string `json:"c_time"`
AppLastLoginTime string `json:"app_last_login_time"`
CaLastLoginTime string `json:"ca_last_login_time"`
UserName string `json:"user_name"`
RealName string `json:"real_name"`
UserImg string `json:"user_img"`
Department string `json:"department"`
Role string `json:"role"`
FID string `json:"f_id"`
CapType string `json:"cap_type"`
}
type ServerPushCaSipSos struct {
Cmd string `json:"cmd"`
Type string `json:"type"`
RoomID string `json:"room_id"`
SosRoomID string `json:"sos_room_id"`
PictureQuality string `json:"picture_quality"`
CaInfo CaInfo `json:"ca_info"`
XPoint string `json:"x_point"`
YPoint string `json:"y_point"`
Time int64 `json:"time"`
}
// 处理SOS信息
func HandlePushCaSipSos(jsonString string) {
var response ServerPushCaSipSos
err := json.Unmarshal([]byte(jsonString), &response)
deviceID := response.CaInfo.DeviceID
var videoHat VideoDeviceHat
g.Model("device_video_hat").Where("dev_num = ?", deviceID).Scan(&videoHat)
// 发送请求去获取设备的 sip_id 信息 https://caps.runde.pro/api/index.php?ctl=device&act=get_user_sip_id
res, _ := getSipId(constant.Token, videoHat.Uid)
sipid := res.Data.SIPID
// 收到了报警 SOS 信息,把数据写入数据库,处理标记为未处理
data := alarm.HatAlarm{
DevNum: deviceID,
DevName: videoHat.DevName,
ProjectID: int(videoHat.ProjectID),
BatteryLevel: videoHat.BatteryLevel,
IsLowBattery: videoHat.IsLowBattery,
RoomID: response.RoomID,
SipId: sipid,
IsHandle: strconv.Itoa(0),
HandleAt: time.Time{},
}
g.Model("hat_alarm").Data(data).Insert()
if err != nil {
log.Fatal("Error decoding JSON to struct:", err)
}
}
func getSipId(token string, userId int) (res *Response, err error) {
res = new(Response)
// 创建请求
req, err := http.NewRequest("GET", "https://caps.runde.pro/api/index.php?ctl=device&act=get_user_sip_id", nil)
if err != nil {
return res, err
}
// 添加请求头
req.Header.Set("Authentication", token)
// 添加查询参数
query := req.URL.Query()
query.Add("user_id", strconv.Itoa(userId))
req.URL.RawQuery = query.Encode()
// 发送请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return res, err
}
defer resp.Body.Close()
// 读取响应体
respBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
return res, err
}
// 检查响应状态码
if resp.StatusCode != http.StatusOK {
return res, errors.New(fmt.Sprintf("unexpected status code: %d", resp.StatusCode))
}
// 反序列化响应体到结构体
err = json.Unmarshal(respBody, &res)
if err != nil {
return res, err
}
return res, nil
}
type Response struct {
Status bool `json:"status"`
Msg string `json:"msg"`
Data DataObject `json:"data"`
MsgCode string `json:"msg_code"`
}
type DataObject struct {
SIPID string `json:"sip_id"`
}
type VideoDeviceHat struct {
DevNum string `json:"dev_num"` // 设备编号
DevName string `json:"dev_name"` // 设备名
Status int `json:"status"` // 安全帽状态(0离线1在线2监控中3通话中4隐私模式)
ProjectID int64 `json:"project_id"` // 项目id
UserID string `json:"user_id"` // 用户id
BatteryLevel string `json:"battery_level"` // 电量
IsLowBattery bool `json:"is_low_battery"` // 是否处于低电量true代表低电量false则不是低电量
CreateTime time.Time `json:"create_time"` // 创建时间
UpdatedAt time.Time `json:"updated_at"` // 更新时间
Longitude string `json:"longitude"` // 最新的经度
Latitude string `json:"latitude"` // 最新的维度
SipId int `json:"sip_id"` // SIPID
Uid int `json:"uid"` // 安全帽厂商返回的用户ID
PushStatus string `json:"push_status"` // 推流状态
Nickname string `json:"nick_name"` // 用户名称
UserName string `json:"user_name"` // 真实名称
HeadIcon string `json:"head_icon"` // 头像
Phone string `json:"phone"` // 电话
}