This commit is contained in:
tfl
2024-08-21 17:35:50 +08:00
parent 34ea7472b7
commit dd5b38b4e3
24 changed files with 328 additions and 133 deletions

View File

@@ -7,7 +7,6 @@ package api
// ==========================================================================
import (
"fmt"
"pandax/apps/device/util"
"pandax/kit/biz"
"pandax/kit/model"
"pandax/kit/restfulx"
@@ -131,6 +130,18 @@ func (p *DeviceApi) GetDeviceStatus(rc *restfulx.ReqCtx) {
rc.ResData = res
}
func (p *DeviceApi) GetDeviceEvents(rc *restfulx.ReqCtx) {
pageNum := restfulx.QueryInt(rc, "pageNum", 1)
pageSize := restfulx.QueryInt(rc, "pageSize", 10)
deviceId := restfulx.PathParam(rc, "id")
ty := restfulx.QueryParam(rc, "type")
offset := pageSize * (pageNum - 1)
sql := `select * from ? where deviceId = ? and type = ? DESC LIMIT ?,? `
list, err := global.TdDb.GetAllEvents(sql, deviceId, ty, offset, pageSize)
biz.ErrIsNilAppendErr(err, "查询设备事件历史失败")
rc.ResData = list
}
// GetDeviceTelemetryHistory 获取Device属性的遥测历史
func (p *DeviceApi) GetDeviceTelemetryHistory(rc *restfulx.ReqCtx) {
id := restfulx.PathParam(rc, "id")
@@ -146,21 +157,6 @@ func (p *DeviceApi) GetDeviceTelemetryHistory(rc *restfulx.ReqCtx) {
rc.ResData = rs
}
// 下发设备属性
func (p *DeviceApi) DownAttribute(rc *restfulx.ReqCtx) {
id := restfulx.PathParam(rc, "id")
key := restfulx.QueryParam(rc, "key")
value := restfulx.QueryParam(rc, "value")
biz.NotEmpty(value, "请设置属性值")
err := util.BuildRunDeviceRpc(id, "single", map[string]interface{}{
"method": "setAttributes",
"params": map[string]interface{}{
key: value,
},
})
biz.ErrIsNilAppendErr(err, "下发失败:")
}
// InsertDevice 添加Device
func (p *DeviceApi) InsertDevice(rc *restfulx.ReqCtx) {
var data entity.Device

View File

@@ -3,17 +3,15 @@ package api
// ==========================================================================
import (
"encoding/json"
"pandax/apps/device/util"
"pandax/kit/biz"
"pandax/kit/model"
"pandax/kit/restfulx"
"pandax/kit/utils"
"pandax/pkg/global"
devicerpc "pandax/pkg/device_rpc"
"strings"
"time"
"pandax/apps/device/entity"
"pandax/apps/device/services"
"pandax/apps/device/util"
)
type DeviceCmdLogApi struct {
@@ -50,22 +48,12 @@ func (p *DeviceCmdLogApi) InsertDeviceCmdLog(rc *restfulx.ReqCtx) {
err := json.Unmarshal([]byte(data.CmdContent), &ms)
biz.ErrIsNil(err, "指令格式不正确")
biz.IsTrue(len(ms) > 0, "指令格式不正确")
data.Id = utils.GenerateID()
data.State = "2"
data.RequestTime = time.Now().Format("2006-01-02 15:04:05")
go func() {
err := util.BuildRunDeviceRpc(data.DeviceId, data.Mode, map[string]interface{}{
"method": data.CmdName,
"params": ms,
})
if err != nil {
global.Log.Error("规则链执行失败", err)
data.State = "1"
} else {
data.State = "0"
rpc := devicerpc.RpcPayload{
Method: data.CmdName,
Params: ms,
}
data.ResponseTime = time.Now().Format("2006-01-02 15:04:05.000")
err = p.DeviceCmdLogApp.Insert(data)
err := util.BuildRunDeviceRpc(data.DeviceId, data.Mode, rpc)
biz.ErrIsNil(err, "添加指令记录失败")
}()
}

View File

@@ -80,6 +80,18 @@ func InitDeviceRouter(container *restful.Container) {
Returns(200, "OK", []entity.DeviceStatusVo{}).
Returns(404, "Not Found", nil))
ws.Route(ws.GET("/{id}/event").To(func(request *restful.Request, response *restful.Response) {
restfulx.NewReqCtx(request, response).WithLog("获取设备事件历史").Handle(s.GetDeviceEvents)
}).
Doc("获取设备事件历史").
Param(ws.QueryParameter("pageNum", "页数").Required(true).DataType("int")).
Param(ws.QueryParameter("pageSize", "每页条数").Required(true).DataType("int")).
Param(ws.PathParameter("id", "设备ID").Required(true).DataType("string")).
Param(ws.QueryParameter("type", "事件类型").Required(true).DataType("string")).
Metadata(restfulspec.KeyOpenAPITags, tags). // on the response
Returns(200, "OK", []map[string]any{}).
Returns(404, "Not Found", nil))
ws.Route(ws.GET("/{id}/property/history").To(func(request *restful.Request, response *restful.Response) {
restfulx.NewReqCtx(request, response).WithLog("获取设备属性的遥测历史").Handle(s.GetDeviceTelemetryHistory)
}).
@@ -93,15 +105,6 @@ func InitDeviceRouter(container *restful.Container) {
Returns(200, "OK", []map[string]any{}).
Returns(404, "Not Found", nil))
ws.Route(ws.GET("/{id}/attribute/down").To(func(request *restful.Request, response *restful.Response) {
restfulx.NewReqCtx(request, response).WithLog("获取Device属性下发").Handle(s.DownAttribute)
}).
Doc("获取Device属性下发").
Param(ws.PathParameter("id", "Id").DataType("string")).
Param(ws.QueryParameter("key", "属性KEY").Required(false).DataType("string")).
Param(ws.QueryParameter("value", "属性Value").Required(false).DataType("string")).
Metadata(restfulspec.KeyOpenAPITags, tags))
ws.Route(ws.POST("").To(func(request *restful.Request, response *restful.Response) {
restfulx.NewReqCtx(request, response).WithLog("添加Device信息").Handle(s.InsertDevice)
}).

View File

@@ -10,6 +10,7 @@ type (
ProductTemplateModel interface {
Insert(data entity.ProductTemplate) (*entity.ProductTemplate, error)
FindOne(id string) (*entity.ProductTemplate, error)
FindOneByKey(deviceId, key string) (*entity.ProductTemplate, error)
FindListPage(page, pageSize int, data entity.ProductTemplate) (*[]entity.ProductTemplate, int64, error)
FindListAttrs(data entity.ProductTemplate) (*[]entity.ProductTemplate, error)
FindList(data entity.ProductTemplate) (*[]entity.ProductTemplate, error)
@@ -38,6 +39,13 @@ func (m *templateModelImpl) FindOne(id string) (*entity.ProductTemplate, error)
return resData, err
}
func (m *templateModelImpl) FindOneByKey(deviceId, key string) (*entity.ProductTemplate, error) {
resData := new(entity.ProductTemplate)
db := global.Db.Table(m.table).Where("pid = ?", deviceId).Where("key = ?", key)
err := db.First(resData).Error
return resData, err
}
func (m *templateModelImpl) FindListPage(page, pageSize int, data entity.ProductTemplate) (*[]entity.ProductTemplate, int64, error) {
list := make([]entity.ProductTemplate, 0)
var total int64 = 0

View File

@@ -7,13 +7,15 @@ import (
"pandax/apps/device/services"
ruleEntity "pandax/apps/rule/entity"
ruleService "pandax/apps/rule/services"
"pandax/pkg/cache"
devicerpc "pandax/pkg/device_rpc"
"pandax/pkg/global"
"pandax/pkg/rule_engine"
"pandax/pkg/rule_engine/message"
"pandax/pkg/tool"
)
func BuildRunDeviceRpc(deviceId, mode string, msgData map[string]interface{}) error {
func BuildRunDeviceRpc(deviceId, mode string, rp devicerpc.RpcPayload) error {
device, err := services.DeviceModelDao.FindOne(deviceId)
if err != nil {
return err
@@ -35,10 +37,21 @@ func BuildRunDeviceRpc(deviceId, mode string, msgData map[string]interface{}) er
dataCode := ruleData.LfData.DataCode
code, _ := json.Marshal(dataCode)
//新建规则链实体
instance, errs := rule_engine.NewRuleChainInstance(findOne.Id, code)
if err != nil {
return errs
instance := &rule_engine.RuleChainInstance{}
ruleInstance, bo := cache.GetProductRule(device.Product.Id)
if !bo {
instance, err = rule_engine.NewRuleChainInstance(findOne.Id, code)
if err != nil {
return err
}
} else {
if data, ok := ruleInstance.(*rule_engine.RuleChainInstance); ok {
instance = data
} else {
return errors.New("规则实体解析错误")
}
}
metadataVals := map[string]interface{}{
"deviceId": device.Id,
"mode": mode,
@@ -49,10 +62,11 @@ func BuildRunDeviceRpc(deviceId, mode string, msgData map[string]interface{}) er
"orgId": device.OrgId,
"owner": device.Owner,
}
msg := message.NewMessage(device.Owner, message.RpcRequestToDevice, msgData, metadataVals)
msg := message.NewMessage(device.Owner, message.RpcRequestToDevice, rp.ToMap(), metadataVals)
err = instance.StartRuleChain(context.Background(), msg)
if err != nil {
global.Log.Error("规则链执行失败", errs)
global.Log.Error("规则链执行失败", err)
}
return err
}