diff --git a/iot/device-cloud.go b/iot/device-iot.go similarity index 100% rename from iot/device-cloud.go rename to iot/device-iot.go diff --git a/iot/group-ciot.go b/iot/group-iot.go similarity index 100% rename from iot/group-ciot.go rename to iot/group-iot.go diff --git a/iot/model/person-model.go b/iot/model/person-model.go new file mode 100644 index 0000000..73df137 --- /dev/null +++ b/iot/model/person-model.go @@ -0,0 +1,36 @@ +package model + +type PersonCreateData struct { + Person + DynamicCode string `json:"dynamicCode"` + MaxOpenDoorTime int `json:"maxOpenDoorTime"` + CallNumbers []string `json:"callNumbers"` + FloorNumbers []int `json:"floorNumbers"` + LocalUIRight int `json:"localUIRight"` +} + +type PersonReq struct { + EmployeeNo string `json:"employeeNo"` //编号,必填 + PersonName string `json:"personName"` //姓名,必填 + PersonPhone string `json:"personPhone"` + FaceImageBase64 string `json:"faceImageBase64"` + VerifyImage bool `json:"verifyImage"` //是否进行人脸质量校验,默认true +} + +type PersonOperation struct { + PersonStatisticsId string `json:"personStatisticsId"` + FaceStatisticsId string `json:"faceStatisticsId"` +} + +type Person struct { + EmployeeNo string `json:"employeeNo"` + PersonName string `json:"personName"` + PersonPhone string `json:"personPhone"` + FaceUrl string `json:"faceUrl"` + PersonType string `json:"personType"` + FloorNo int `json:"floorNo"` + RoomNo int `json:"roomNo"` + ValidBeginTime string `json:"validBeginTime"` + ValidEndTime string `json:"validEndTime"` + PlanTemplateNos []int `json:"planTemplateNos"` +} diff --git a/iot/oauth_test.go b/iot/oauth_test.go index edd6754..be2a8f0 100644 --- a/iot/oauth_test.go +++ b/iot/oauth_test.go @@ -1,18 +1,37 @@ package iot import ( + "encoding/base64" "fmt" "log" + "os" "testing" ) func TestOauth(t *testing.T) { - // serial := "AF8534579" - // accesstoken := "a08a8044-3770-41f5-b5a5-048004a723ac" - result, err := DeivceList("02", 1, 20) + imgfile, err := os.ReadFile("../image.jpg") + if err != nil { + log.Fatal(err.Error()) + } + imgbase64 := base64.StdEncoding.EncodeToString(imgfile) + p, err := PersonDetail("02") if err != nil { log.Fatal(err) } - - fmt.Println(*result) + fmt.Println(p) + person, err := PersonFaceUpdate("02", imgbase64, true) + if err != nil { + log.Fatal(err.Error()) + } + p, err = PersonDetail("02") + if err != nil { + log.Fatal(err) + } + r, err := PersonFaceDelete("02") + if err != nil { + log.Fatal(err) + } + fmt.Println("r ", r) + fmt.Println("p ", p) + fmt.Println("person ", person) } diff --git a/iot/person-iot.go b/iot/person-iot.go new file mode 100644 index 0000000..2e27a8f --- /dev/null +++ b/iot/person-iot.go @@ -0,0 +1,205 @@ +package iot + +import ( + "encoding/json" + "fmt" + + "myschools.me/suguo/hikvision/iot/model" +) + +const ( + PERSON_BASE = "https://api2.hik-cloud.com/api/v1/open/basic/persons" + PERSON_CREATE = PERSON_BASE + "/create" + PERSON_UPDARE = PERSON_BASE + "/update" + PERSON_DELETE = PERSON_BASE + "/delete" + PERSON_DETAIL = PERSON_BASE + "/get" + + PERSON_FACE_SETCFG = "https://api2.hik-cloud.com/api/v1/open/basic/tenantConfigs/actions/updateTenantConfig" + + FACE_BASE = "https://api2.hik-cloud.com/api/v1/open/basic/faces" + PERSON_FACE_UPDATE = FACE_BASE + "/update" + PERSON_FACE_DELETE = FACE_BASE + "/delete" +) + +// 添加人员 +func PersonCreate(employeeNo, personName, personPhone, faceImageBase64 string, verifyImage bool) (*model.PersonCreateData, error) { + req := &model.PersonReq{ + EmployeeNo: employeeNo, + PersonName: personName, + PersonPhone: personPhone, + FaceImageBase64: faceImageBase64, + VerifyImage: verifyImage, + } + + resp, err := hikvisionRequest("POST", PERSON_CREATE, req) + if err != nil { + return nil, err + } + var result = &struct { + model.Hikvision + Data model.PersonCreateData `json:"data"` + }{} + if err := json.Unmarshal(resp, &result); err != nil { + return nil, err + } + + if result.Code != 200 { + return nil, fmt.Errorf("result errcode:%d errmsg:%s", result.Code, result.Message) + } + return &result.Data, nil +} + +// 更新人员信息 +func PersonUpdate(employeeNo, personName, personPhone, faceImageBase64 string, verifyImage bool) (*model.PersonOperation, error) { + req := &model.PersonReq{ + EmployeeNo: employeeNo, + PersonName: personName, + PersonPhone: personPhone, + FaceImageBase64: faceImageBase64, + VerifyImage: verifyImage, + } + + resp, err := hikvisionRequest("POST", PERSON_UPDARE, req) + if err != nil { + return nil, err + } + var result = &struct { + model.Hikvision + Data model.PersonOperation `json:"data"` + }{} + if err := json.Unmarshal(resp, &result); err != nil { + return nil, err + } + + if result.Code != 200 { + return nil, fmt.Errorf("result errcode:%d errmsg:%s", result.Code, result.Message) + } + return &result.Data, nil +} + +// 删除人员信息 +func PersonDelete(employeeNo string) (*model.PersonOperation, error) { + + resp, err := hikvisionRequest("POST", fmt.Sprintf("%s?employeeNo=%s", PERSON_DELETE, employeeNo), nil) + if err != nil { + return nil, err + } + var result = &struct { + model.Hikvision + Data model.PersonOperation `json:"data"` + }{} + if err := json.Unmarshal(resp, &result); err != nil { + return nil, err + } + + if result.Code != 200 { + return nil, fmt.Errorf("result errcode:%d errmsg:%s", result.Code, result.Message) + } + return &result.Data, nil +} + +// 获得单个人员详情 +func PersonDetail(employeeNo string) (*model.Person, error) { + + resp, err := hikvisionRequest("GET", fmt.Sprintf("%s?employeeNo=%s", PERSON_DETAIL, employeeNo), nil) + if err != nil { + return nil, err + } + var result = &struct { + model.Hikvision + Data model.Person `json:"data"` + }{} + if err := json.Unmarshal(resp, &result); err != nil { + return nil, err + } + + if result.Code != 200 { + return nil, fmt.Errorf("result errcode:%d errmsg:%s", result.Code, result.Message) + } + return &result.Data, nil +} + +// 人脸评分标准配置接口 +// 更新人员信息 +func PersonUpdateTenantConfig(pointsQuality float64, eyeDistance, clearity, posePitchMin, posePitchMax, poseYawMin, poseYawMax, uncovered, totalQuality float64) (*model.Hikvision, error) { + req := &struct { + PointsQuality float64 `json:"pointsQuality"` + EyeDistance float64 `json:"eyeDistance"` + Clearity float64 `json:"clearity"` + PosePitchMin float64 `json:"posePitchMin"` + PosePitchMax float64 `json:"posePitchMax"` + PoseYawMin float64 `json:"poseYawMin"` + PoseYawMax float64 `json:"poseYawMax"` + Uncovered float64 `json:"uncovered"` + TotalQuality float64 `json:"totalQuality"` + }{ + PointsQuality: pointsQuality, + EyeDistance: eyeDistance, + Clearity: clearity, + PosePitchMin: posePitchMin, + PosePitchMax: posePitchMax, + PoseYawMin: poseYawMin, + PoseYawMax: poseYawMax, + Uncovered: uncovered, + TotalQuality: totalQuality, + } + + resp, err := hikvisionRequest("POST", PERSON_FACE_SETCFG, req) + if err != nil { + return nil, err + } + var result = &model.Hikvision{} + if err := json.Unmarshal(resp, &result); err != nil { + return nil, err + } + + if result.Code != 200 { + return nil, fmt.Errorf("result errcode:%d errmsg:%s", result.Code, result.Message) + } + return result, nil +} + +// 人员人脸更新 +func PersonFaceUpdate(employeeNo, faceImageBase64 string, verifyImage bool) (*model.Hikvision, error) { + req := &struct { + EmployeeNo string `json:"employeeNo"` + VerifyImage bool `json:"verifyImage"` + FaceImageBase64 string `json:"faceImageBase64"` + }{ + EmployeeNo: employeeNo, + VerifyImage: verifyImage, + FaceImageBase64: faceImageBase64, + } + + resp, err := hikvisionRequest("POST", PERSON_FACE_UPDATE, req) + if err != nil { + return nil, err + } + var result = &model.Hikvision{} + if err := json.Unmarshal(resp, &result); err != nil { + return nil, err + } + + if result.Code != 200 { + return nil, fmt.Errorf("result errcode:%d errmsg:%s", result.Code, result.Message) + } + return result, nil +} + +// 人员人脸删除 +func PersonFaceDelete(employeeNo string) (*model.Hikvision, error) { + + resp, err := hikvisionRequest("POST", fmt.Sprintf("%s?employeeNo=%s", PERSON_FACE_DELETE, employeeNo), nil) + if err != nil { + return nil, err + } + var result = &model.Hikvision{} + if err := json.Unmarshal(resp, &result); err != nil { + return nil, err + } + + if result.Code != 200 { + return nil, fmt.Errorf("result errcode:%d errmsg:%s", result.Code, result.Message) + } + return result, nil +} diff --git a/iot/readme.md b/iot/readme.md index 606df70..1b2a199 100644 --- a/iot/readme.md +++ b/iot/readme.md @@ -1 +1,13 @@ -海康云眸平台IOT \ No newline at end of file +### 海康云眸平台(iot) + +``` +environment: + clientID = os.Getenv("HIK_IOT_CLIENTID") + clientSecret = os.Getenv("HIK_IOT_CLIENTSECRET") + scope = os.Getenv("HIK_IOT_SCOPE") +``` +- 基础管理 +- - 分组管理 +- - 接入管理 +- - 校时配置 +- - 人员管理 diff --git a/readme.md b/readme.md index 52bea1f..5b09171 100644 --- a/readme.md +++ b/readme.md @@ -1,3 +1,18 @@ -海康SDK +