init project
|
@ -0,0 +1,7 @@
|
|||
.idea
|
||||
vendor
|
||||
logs
|
||||
edge-db-data
|
||||
hummingbird
|
||||
mqtt-broker
|
||||
go.sum
|
|
@ -0,0 +1,13 @@
|
|||
.PHONY: build clean test docker run
|
||||
|
||||
GO=CGO_ENABLED=0 GOOS=linux go
|
||||
GOCGO=CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go
|
||||
|
||||
cmd/hummingbird-core/hummingbird-core:
|
||||
$(GOCGO) build -ldflags "-s -w" -o $@ ./cmd/hummingbird-core
|
||||
|
||||
cmd/mqtt-broker/mqtt-broker:
|
||||
$(GO) build -ldflags "-s -w" -o $@ ./cmd/mqtt-broker
|
||||
|
||||
generate/api:
|
||||
cd cmd/hummingbird-core && swag init --parseDependency --parseInternal --parseDepth 10
|
|
@ -0,0 +1,98 @@
|
|||
<p align="center">
|
||||
<img src="manifest/image/logo.png" width="100">
|
||||
<br>
|
||||
|
||||
<a href='https://gitee.com/winc-link/hummingbird/stargazers'>
|
||||
<img src='https://gitee.com/winc-link/hummingbird/badge/star.svg?theme=gvp' alt='star'></img>
|
||||
</a>
|
||||
<a href='https://gitee.com/winc-link/hummingbird/members'>
|
||||
<img src='https://gitee.com/winc-link/hummingbird/badge/fork.svg?theme=gvp' alt='fork'></img>
|
||||
</a>
|
||||
<br>
|
||||
</p>
|
||||
|
||||
# 产品简介
|
||||
|
||||
蜂鸟(HummingBird) 是Golang语言实现的超轻量级物联网开发平台,他的核心服务完全由团队自行研发,从这个平台设计之初,轻量级、性能优异当作我们的一条开发准则。所以它服务都是采用Golang语言编写,占用内存极低。在数据存储上,我们创新的使用了SQLite和LevelDB当作了我们存储数据库,得益于SQLite的轻量级和LevelDB对数据的高吞吐和高压缩的特点, 经过实际测试,在1C/1G 100G存储的物理机上,可实现数千设备的连接和8000W条的消息存储。
|
||||
|
||||
当然,如果您对数据有可靠行、海量存储等要求,您完全可以把SQLite和LevelDB换为MySQL和TDengine,蜂鸟物联网平台兼容多种数据库连接,用户可以根据自己的业务需要选择适合自己的数据库。
|
||||
|
||||
“麻雀(蜂鸟)虽小,五脏俱全” 虽然蜂鸟作为一个超轻量级物联网平台,但是他的核心功能并不会消减。设备接入、产品管理、物模型、告警中心、规则引擎...这些所有物联网平台的标配功能,都可以在本平台中找到。
|
||||
|
||||
|
||||
|
||||
![](manifest/image/architecture.png)
|
||||
|
||||
|
||||
|
||||
# 部分页面展示
|
||||
|
||||
| ![](manifest/image/1.png) | ![](manifest/image/2.png) |
|
||||
|:------------------------------------------------------------------------|:----------------------------------------------------------------------------|
|
||||
| ![](manifest/image/3.png)) | ![](manifest/image/4.png) |
|
||||
| ![](manifest/image/5.png) | ![](manifest/image/6.png) |
|
||||
| ![](manifest/image/7.png) | ![](manifest/image/8.png) |
|
||||
|
||||
# 在线演示
|
||||
|
||||
演示地址:https://demo.winc-link.com
|
||||
账号:admin
|
||||
密码:123456
|
||||
|
||||
# 官方文档
|
||||
|
||||
官方文档地址:https://doc.hummingbird.winc-link.com/
|
||||
|
||||
# 主要功能
|
||||
|
||||
- 产品管理
|
||||
- 设备管理
|
||||
- 镜像管理
|
||||
- 驱动管理
|
||||
- 驱动市场
|
||||
- 系统监控
|
||||
- 告警中心
|
||||
- 资源管理
|
||||
- 规则引擎
|
||||
- 场景联动
|
||||
- 插件市场(企业版本)
|
||||
- 数据大屏(企业版本)
|
||||
|
||||
# 产品优势
|
||||
|
||||
- **免费开源**:我们源代码全部开源,可供个人学。
|
||||
- **性能优异**:经过实际测试,在2C4G主机上,可支持60k的设备连接。模拟4k设备以1000ms的间隔向服务端发送16kb长度的属性数据,cpu使用率稳定在百分之60、内存使用率稳定在百分之16。
|
||||
- **多数据支持**:平台支持SQLite、LevelDB和MySQL、TDengine数据库,用户可以根据自己的项目需要,选择适合自己的数据库。
|
||||
- **云插件**:平台实现了阿里云、腾讯云、华为云、oneNet等物联网平台的对接,支持把数据上报到各大物联网平台中。
|
||||
- **支持可视化大屏**:用户只需要进行简单拖拽,无需写任何代码,即可完成可视化大屏开发设计。
|
||||
- **内置产品模版库**: 平台内部预置产品模版(390条),帮助用户一键创建产品。
|
||||
- **文档清晰**:平台文档清晰完整,文档内部有大量使用案例和视频教程,帮助用户快速理解产品和使用产品。
|
||||
- **部署简单**:平台所有服务都是以docker形式运行,支持docker-compose命令一键启动。
|
||||
- **成本优势**:在中小型物联网项目(设备数<=5000)中,只需要2C4G主机即可,并且还可以支持本地部署。
|
||||
|
||||
# 讨论区
|
||||
|
||||
我们正在使用讨论作为与我们社区其他成员联系的地方。您可以在([Gitee](https://gitee.com/winc-link/hummingbird/issues/I7WC1A)
|
||||
下方发表你的评论,告诉大家你要讨论的问题、关于 Hummingbird 好的发展建议、一些奇思妙想 🚀🛸🚤!
|
||||
|
||||
# 联系我们
|
||||
|
||||
如果你在使用或者部署过程遇到任何问题,请在 QQ 群讨论或者联系作者微信。
|
||||
|
||||
🌟 请记住我们不收费,代码完全开源,如果你想把蜂鸟物联网平台进行商用,请提前找作者授权!最后请点个 Start 鼓励我们吧!🌟
|
||||
|
||||
<p align="center">
|
||||
<img src="manifest/image/jietu.png" width="600">
|
||||
<br>
|
||||
|
||||
|
||||
# 开源贡献
|
||||
|
||||
- 从 `master` 分支 `checkout` 一个新分支(**注**:请务必保证 `master` 代码是最新的)
|
||||
- 新分支命名格式:`feature/username/description`,例如:`feature/pick/mqtt_driver`
|
||||
- 在新分支上编辑文档、代码,并提交代码
|
||||
- 提交 `PR` 合并到 `develop` 分支,等待作者合并即可
|
||||
|
||||
# 开源协议
|
||||
|
||||
`Hummingbird` 开源平台遵循 [Apache 2.0 协议](https://www.apache.org/licenses/LICENSE-2.0.html) 如果你想把蜂鸟物联网平台进行商用,请提前找作者授权!
|
|
@ -0,0 +1,44 @@
|
|||
# ----------------------------------------------------------------------------------
|
||||
# Copyright 2018 Dell Technologies, Inc.
|
||||
# Copyright 2018 Cavium
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
# ----------------------------------------------------------------------------------
|
||||
|
||||
ARG BUILDER_BASE=registry.cn-shanghai.aliyuncs.com/winc-edgex/edgex:1.18.8-alpine3.16
|
||||
|
||||
FROM ${BUILDER_BASE} AS builder
|
||||
|
||||
WORKDIR /edge
|
||||
|
||||
COPY . .
|
||||
|
||||
RUN make cmd/hummingbird-core/hummingbird-core
|
||||
|
||||
#Next image - Copy built Go binary into new workspace
|
||||
FROM alpine:3.16
|
||||
|
||||
ENV APP_PORT=58081
|
||||
ENV WEB_PORT=3000
|
||||
EXPOSE $APP_PORT
|
||||
EXPOSE $WEB_PORT
|
||||
|
||||
WORKDIR /var/bin/
|
||||
|
||||
|
||||
COPY --from=builder /edge/cmd/hummingbird-core/hummingbird-core /bin/
|
||||
COPY --from=builder /edge/cmd/hummingbird-core/res/configuration.toml.dist /etc/hummingbird-core/configuration.toml
|
||||
COPY --from=builder /edge/cmd/hummingbird-ui/build /var/bin/cmd/hummingbird-ui/build
|
||||
|
||||
CMD ["/bin/sh", "-c", "/bin/hummingbird-core --confdir=/etc/hummingbird-core/configuration.toml"]
|
|
@ -0,0 +1,40 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2018 Dell Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/winc-link/hummingbird/internal/hummingbird/core"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// @title 赢创万联(蜂鸟) API
|
||||
// @version 1.0
|
||||
// @description Swagger API for Golang Project hummingbird.
|
||||
// @termsOfService http://swagger.io/terms/
|
||||
|
||||
// @contact.name API Support
|
||||
// @contact.email email@winc-link.com
|
||||
|
||||
// @BasePath /api/v1
|
||||
|
||||
// @securityDefinitions.apikey ApiKeyAuth
|
||||
// @in header
|
||||
// @name x-token
|
||||
func main() {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
gin.SetMode(gin.ReleaseMode)
|
||||
core.Main(ctx, cancel, gin.Default())
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
[Writable]
|
||||
LogLevel = 'INFO'
|
||||
LogPath = 'hummingbird/logs/hummingbird-core.log'
|
||||
|
||||
[Service]
|
||||
BootTimeout = 30000
|
||||
CheckInterval = '10s'
|
||||
Host = '0.0.0.0'
|
||||
ServerBindAddr = '' # Leave blank so default to Host value unless different value is needed.
|
||||
Port = 58081
|
||||
Protocol = 'http'
|
||||
MaxResultCount = 50000
|
||||
StartupMsg = 'This is the Core Resource Microservice'
|
||||
Timeout = 45000
|
||||
|
||||
[RpcServer]
|
||||
Address = '0.0.0.0:57081'
|
||||
UseTLS = false
|
||||
CertFile = ''
|
||||
KeyFile = ''
|
||||
|
||||
[Clients]
|
||||
[Clients.Ekuiper]
|
||||
Protocol = 'http'
|
||||
Host = '127.0.0.1'
|
||||
Port = 9081
|
||||
|
||||
[WebServer]
|
||||
Host = '0.0.0.0'
|
||||
Port = 3000
|
||||
Timeout = 120
|
||||
|
||||
[Databases]
|
||||
[Databases.Metadata]
|
||||
[Databases.Metadata.Primary]
|
||||
Type = 'sqlite'
|
||||
DataSource = 'hummingbird/db-data/core-data/core.db?_timeout=5000'
|
||||
|
||||
[Databases.Data]
|
||||
[Databases.Data.Primary]
|
||||
Type = 'leveldb'
|
||||
DataSource = 'hummingbird/db-data/leveldb-core-data/'
|
||||
|
||||
[MessageQueue]
|
||||
Protocol = 'tcp'
|
||||
Host = '127.0.0.1'
|
||||
Port = 58090
|
||||
Type = 'mqtt'
|
||||
PublishTopicPrefix = 'eventbus/in'
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
[Writable]
|
||||
LogLevel = 'INFO'
|
||||
LogPath = 'hummingbird/logs/hummingbird-core.log'
|
||||
|
||||
[Service]
|
||||
BootTimeout = 30000
|
||||
CheckInterval = '10s'
|
||||
Host = '0.0.0.0'
|
||||
ServerBindAddr = '' # Leave blank so default to Host value unless different value is needed.
|
||||
Port = 58081
|
||||
Protocol = 'http'
|
||||
MaxResultCount = 50000
|
||||
StartupMsg = 'This is the Core Resource Microservice'
|
||||
Timeout = 45000
|
||||
|
||||
[RpcServer]
|
||||
Address = '0.0.0.0:57081'
|
||||
UseTLS = false
|
||||
CertFile = ''
|
||||
KeyFile = ''
|
||||
|
||||
[Clients]
|
||||
[Clients.Ekuiper]
|
||||
Protocol = 'http'
|
||||
Host = 'ekuiper'
|
||||
Port = 9081
|
||||
|
||||
[WebServer]
|
||||
Host = '0.0.0.0'
|
||||
Port = 3000
|
||||
Timeout = 120
|
||||
|
||||
[Databases]
|
||||
[Databases.Metadata]
|
||||
[Databases.Metadata.Primary]
|
||||
Type = 'sqlite'
|
||||
DataSource = 'hummingbird/db-data/core-data/core.db?_timeout=5000'
|
||||
|
||||
[Databases.Data]
|
||||
[Databases.Data.Primary]
|
||||
Type = 'leveldb'
|
||||
DataSource = 'hummingbird/db-data/leveldb-core-data/'
|
||||
|
||||
[MessageQueue]
|
||||
Protocol = 'tcp'
|
||||
Host = 'mqtt-broker'
|
||||
Port = 58090
|
||||
Type = 'mqtt'
|
||||
PublishTopicPrefix = 'eventbus/in'
|
|
@ -0,0 +1,33 @@
|
|||
{
|
||||
"files": {
|
||||
"main.css": "/static/css/main.21abe5ff.css",
|
||||
"main.js": "/static/js/main.4ec9d86b.js",
|
||||
"static/js/342.e07172ae.chunk.js": "/static/js/342.e07172ae.chunk.js",
|
||||
"static/js/558.d067177e.chunk.js": "/static/js/558.d067177e.chunk.js",
|
||||
"static/js/324.bf4cc54f.chunk.js": "/static/js/324.bf4cc54f.chunk.js",
|
||||
"static/js/258.efff4014.chunk.js": "/static/js/258.efff4014.chunk.js",
|
||||
"static/js/787.d3befce1.chunk.js": "/static/js/787.d3befce1.chunk.js",
|
||||
"ts.worker.js": "/ts.worker.js",
|
||||
"json.worker.js": "/json.worker.js",
|
||||
"editor.worker.js": "/editor.worker.js",
|
||||
"static/media/head-bg.8b029587.png": "/static/media/head-bg.8b029587.60f3a93d8a581efd4c49.png",
|
||||
"static/media/bg.ad187fed.png": "/static/media/bg.ad187fed.a47d112f49f56eb1cfa5.png",
|
||||
"static/media/codicon.ttf": "/static/media/codicon.b797181c93b3755f4fa1.ttf",
|
||||
"static/media/bg-1.7f3acdfb.png": "/static/media/bg-1.7f3acdfb.aad6275b1801455a76c0.png",
|
||||
"static/media/newlogo.png": "/static/media/newlogo.e2ad3c36f34a1c2c10d1.png",
|
||||
"static/media/default.32752796.png": "/static/media/default.32752796.9e3b4c5313ccb5060485.png",
|
||||
"static/media/background.png": "/static/media/background.8ed5e5404edf817e15f5.png",
|
||||
"index.html": "/index.html",
|
||||
"main.21abe5ff.css.map": "/static/css/main.21abe5ff.css.map",
|
||||
"main.4ec9d86b.js.map": "/static/js/main.4ec9d86b.js.map",
|
||||
"342.e07172ae.chunk.js.map": "/static/js/342.e07172ae.chunk.js.map",
|
||||
"558.d067177e.chunk.js.map": "/static/js/558.d067177e.chunk.js.map",
|
||||
"324.bf4cc54f.chunk.js.map": "/static/js/324.bf4cc54f.chunk.js.map",
|
||||
"258.efff4014.chunk.js.map": "/static/js/258.efff4014.chunk.js.map",
|
||||
"787.d3befce1.chunk.js.map": "/static/js/787.d3befce1.chunk.js.map"
|
||||
},
|
||||
"entrypoints": [
|
||||
"static/css/main.21abe5ff.css",
|
||||
"static/js/main.4ec9d86b.js"
|
||||
]
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
|
After Width: | Height: | Size: 1.6 KiB |
|
@ -0,0 +1 @@
|
|||
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><link rel="apple-touch-icon" href="/favicon.ico"/><link rel="manifest" href="/manifest.json"/><title>登录</title><script defer="defer" src="/static/js/main.4ec9d86b.js"></script><link href="/static/css/main.21abe5ff.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
|
|
@ -0,0 +1,8 @@
|
|||
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
|
||||
|
||||
/*!-----------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Version: 0.34.1(547870b6881302c5b4ff32173c16d06009e3588f)
|
||||
* Released under the MIT license
|
||||
* https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
|
||||
*-----------------------------------------------------------------------------*/
|
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 5.2 KiB |
After Width: | Height: | Size: 9.4 KiB |
|
@ -0,0 +1,25 @@
|
|||
{
|
||||
"short_name": "React App",
|
||||
"name": "Create React App Sample",
|
||||
"icons": [
|
||||
{
|
||||
"src": "logo.png",
|
||||
"sizes": "64x64 32x32 24x24 16x16",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "logo192.png",
|
||||
"type": "image/png",
|
||||
"sizes": "192x192"
|
||||
},
|
||||
{
|
||||
"src": "logo512.png",
|
||||
"type": "image/png",
|
||||
"sizes": "512x512"
|
||||
}
|
||||
],
|
||||
"start_url": ".",
|
||||
"display": "standalone",
|
||||
"theme_color": "#000000",
|
||||
"background_color": "#ffffff"
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
# https://www.robotstxt.org/robotstxt.html
|
||||
User-agent: *
|
||||
Disallow:
|
|
@ -0,0 +1,6 @@
|
|||
/*!-----------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Version: 0.34.1(547870b6881302c5b4ff32173c16d06009e3588f)
|
||||
* Released under the MIT license
|
||||
* https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
|
||||
*-----------------------------------------------------------------------------*/
|
|
@ -0,0 +1,2 @@
|
|||
"use strict";(self.webpackChunkmyapp=self.webpackChunkmyapp||[]).push([[787],{787:function(e,t,n){n.r(t),n.d(t,{getCLS:function(){return y},getFCP:function(){return g},getFID:function(){return C},getLCP:function(){return P},getTTFB:function(){return D}});var i,r,a,o,u=function(e,t){return{name:e,value:void 0===t?-1:t,delta:0,entries:[],id:"v2-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12)}},c=function(e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){if("first-input"===e&&!("PerformanceEventTiming"in self))return;var n=new PerformanceObserver((function(e){return e.getEntries().map(t)}));return n.observe({type:e,buffered:!0}),n}}catch(e){}},f=function(e,t){var n=function n(i){"pagehide"!==i.type&&"hidden"!==document.visibilityState||(e(i),t&&(removeEventListener("visibilitychange",n,!0),removeEventListener("pagehide",n,!0)))};addEventListener("visibilitychange",n,!0),addEventListener("pagehide",n,!0)},s=function(e){addEventListener("pageshow",(function(t){t.persisted&&e(t)}),!0)},m=function(e,t,n){var i;return function(r){t.value>=0&&(r||n)&&(t.delta=t.value-(i||0),(t.delta||void 0===i)&&(i=t.value,e(t)))}},v=-1,p=function(){return"hidden"===document.visibilityState?0:1/0},d=function(){f((function(e){var t=e.timeStamp;v=t}),!0)},l=function(){return v<0&&(v=p(),d(),s((function(){setTimeout((function(){v=p(),d()}),0)}))),{get firstHiddenTime(){return v}}},g=function(e,t){var n,i=l(),r=u("FCP"),a=function(e){"first-contentful-paint"===e.name&&(f&&f.disconnect(),e.startTime<i.firstHiddenTime&&(r.value=e.startTime,r.entries.push(e),n(!0)))},o=window.performance&&performance.getEntriesByName&&performance.getEntriesByName("first-contentful-paint")[0],f=o?null:c("paint",a);(o||f)&&(n=m(e,r,t),o&&a(o),s((function(i){r=u("FCP"),n=m(e,r,t),requestAnimationFrame((function(){requestAnimationFrame((function(){r.value=performance.now()-i.timeStamp,n(!0)}))}))})))},h=!1,T=-1,y=function(e,t){h||(g((function(e){T=e.value})),h=!0);var n,i=function(t){T>-1&&e(t)},r=u("CLS",0),a=0,o=[],v=function(e){if(!e.hadRecentInput){var t=o[0],i=o[o.length-1];a&&e.startTime-i.startTime<1e3&&e.startTime-t.startTime<5e3?(a+=e.value,o.push(e)):(a=e.value,o=[e]),a>r.value&&(r.value=a,r.entries=o,n())}},p=c("layout-shift",v);p&&(n=m(i,r,t),f((function(){p.takeRecords().map(v),n(!0)})),s((function(){a=0,T=-1,r=u("CLS",0),n=m(i,r,t)})))},E={passive:!0,capture:!0},w=new Date,L=function(e,t){i||(i=t,r=e,a=new Date,F(removeEventListener),S())},S=function(){if(r>=0&&r<a-w){var e={entryType:"first-input",name:i.type,target:i.target,cancelable:i.cancelable,startTime:i.timeStamp,processingStart:i.timeStamp+r};o.forEach((function(t){t(e)})),o=[]}},b=function(e){if(e.cancelable){var t=(e.timeStamp>1e12?new Date:performance.now())-e.timeStamp;"pointerdown"==e.type?function(e,t){var n=function(){L(e,t),r()},i=function(){r()},r=function(){removeEventListener("pointerup",n,E),removeEventListener("pointercancel",i,E)};addEventListener("pointerup",n,E),addEventListener("pointercancel",i,E)}(t,e):L(t,e)}},F=function(e){["mousedown","keydown","touchstart","pointerdown"].forEach((function(t){return e(t,b,E)}))},C=function(e,t){var n,a=l(),v=u("FID"),p=function(e){e.startTime<a.firstHiddenTime&&(v.value=e.processingStart-e.startTime,v.entries.push(e),n(!0))},d=c("first-input",p);n=m(e,v,t),d&&f((function(){d.takeRecords().map(p),d.disconnect()}),!0),d&&s((function(){var a;v=u("FID"),n=m(e,v,t),o=[],r=-1,i=null,F(addEventListener),a=p,o.push(a),S()}))},k={},P=function(e,t){var n,i=l(),r=u("LCP"),a=function(e){var t=e.startTime;t<i.firstHiddenTime&&(r.value=t,r.entries.push(e),n())},o=c("largest-contentful-paint",a);if(o){n=m(e,r,t);var v=function(){k[r.id]||(o.takeRecords().map(a),o.disconnect(),k[r.id]=!0,n(!0))};["keydown","click"].forEach((function(e){addEventListener(e,v,{once:!0,capture:!0})})),f(v,!0),s((function(i){r=u("LCP"),n=m(e,r,t),requestAnimationFrame((function(){requestAnimationFrame((function(){r.value=performance.now()-i.timeStamp,k[r.id]=!0,n(!0)}))}))}))}},D=function(e){var t,n=u("TTFB");t=function(){try{var t=performance.getEntriesByType("navigation")[0]||function(){var e=performance.timing,t={entryType:"navigation",startTime:0};for(var n in e)"navigationStart"!==n&&"toJSON"!==n&&(t[n]=Math.max(e[n]-e.navigationStart,0));return t}();if(n.value=n.delta=t.responseStart,n.value<0||n.value>performance.now())return;n.entries=[t],e(n)}catch(e){}},"complete"===document.readyState?setTimeout(t,0):addEventListener("load",(function(){return setTimeout(t,0)}))}}}]);
|
||||
//# sourceMappingURL=787.d3befce1.chunk.js.map
|
|
@ -0,0 +1,117 @@
|
|||
/*!
|
||||
Copyright (c) 2018 Jed Watson.
|
||||
Licensed under the MIT License (MIT), see
|
||||
http://jedwatson.github.io/classnames
|
||||
*/
|
||||
|
||||
/*! @license DOMPurify 2.3.1 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/2.3.1/LICENSE */
|
||||
|
||||
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
|
||||
|
||||
/*!-----------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Version: 0.34.1(547870b6881302c5b4ff32173c16d06009e3588f)
|
||||
* Released under the MIT license
|
||||
* https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
|
||||
*-----------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* @license
|
||||
* Lodash <https://lodash.com/>
|
||||
* Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
|
||||
* Released under MIT license <https://lodash.com/license>
|
||||
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
|
||||
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
||||
*/
|
||||
|
||||
/**
|
||||
* @license React
|
||||
* react-dom.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @license React
|
||||
* react-jsx-runtime.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @license React
|
||||
* react.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @license React
|
||||
* scheduler.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @license React
|
||||
* use-sync-external-store-shim.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @remix-run/router v1.0.3
|
||||
*
|
||||
* Copyright (c) Remix Software Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE.md file in the root directory of this source tree.
|
||||
*
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
/**
|
||||
* React Router DOM v6.4.3
|
||||
*
|
||||
* Copyright (c) Remix Software Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE.md file in the root directory of this source tree.
|
||||
*
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
/**
|
||||
* React Router v6.4.3
|
||||
*
|
||||
* Copyright (c) Remix Software Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE.md file in the root directory of this source tree.
|
||||
*
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
/** @license React v16.13.1
|
||||
* react-is.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 46 KiB |
After Width: | Height: | Size: 113 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 154 KiB |
After Width: | Height: | Size: 24 KiB |
|
@ -0,0 +1,8 @@
|
|||
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
|
||||
|
||||
/*!-----------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Version: 0.34.1(547870b6881302c5b4ff32173c16d06009e3588f)
|
||||
* Released under the MIT license
|
||||
* https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
|
||||
*-----------------------------------------------------------------------------*/
|
|
@ -0,0 +1,157 @@
|
|||
module github.com/winc-link/hummingbird
|
||||
|
||||
go 1.18
|
||||
|
||||
require (
|
||||
github.com/BurntSushi/toml v1.1.0
|
||||
github.com/alexmullins/zip v0.0.0-20180717182244-4affb64b04d0
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible
|
||||
github.com/docker/distribution v2.8.1+incompatible
|
||||
github.com/docker/docker v20.10.17+incompatible
|
||||
github.com/docker/go-connections v0.4.0
|
||||
github.com/eclipse/paho.mqtt.golang v1.4.2
|
||||
github.com/gin-contrib/pprof v1.4.0
|
||||
github.com/gin-contrib/static v0.0.1
|
||||
github.com/gin-gonic/gin v1.8.1
|
||||
github.com/go-gormigrate/gormigrate/v2 v2.0.0
|
||||
github.com/gogf/gf/v2 v2.5.0
|
||||
github.com/golang/mock v1.5.0
|
||||
github.com/golang/protobuf v1.5.2
|
||||
github.com/gomodule/redigo v1.8.9
|
||||
github.com/google/uuid v1.3.0
|
||||
github.com/gorilla/schema v1.2.0
|
||||
github.com/gorilla/websocket v1.5.0
|
||||
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0
|
||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0
|
||||
github.com/hashicorp/go-sockaddr v1.0.0
|
||||
github.com/hashicorp/logutils v1.0.0
|
||||
github.com/hashicorp/serf v0.8.2
|
||||
github.com/hpcloud/tail v1.0.0
|
||||
github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c
|
||||
github.com/jinzhu/gorm v1.9.16
|
||||
github.com/kirinlabs/HttpRequest v1.1.1
|
||||
github.com/mitchellh/mapstructure v1.4.3
|
||||
github.com/nicksnyder/go-i18n/v2 v2.2.0
|
||||
github.com/patrickmn/go-cache v2.1.0+incompatible
|
||||
github.com/pelletier/go-toml v1.9.5
|
||||
github.com/pelletier/go-toml/v2 v2.0.5
|
||||
github.com/pkg/errors v0.9.1
|
||||
github.com/robfig/cron/v3 v3.0.1
|
||||
github.com/shirou/gopsutil/v3 v3.22.2
|
||||
github.com/spf13/cobra v1.5.0
|
||||
github.com/spf13/pflag v1.0.5
|
||||
github.com/stretchr/testify v1.8.0
|
||||
github.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a
|
||||
github.com/swaggo/gin-swagger v1.5.3
|
||||
github.com/swaggo/swag v1.8.7
|
||||
github.com/syndtr/goleveldb v1.0.0
|
||||
github.com/taosdata/driver-go/v3 v3.5.0
|
||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.617
|
||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms v1.0.617
|
||||
github.com/tencentyun/cos-go-sdk-v5 v0.7.39
|
||||
github.com/winc-link/edge-driver-proto v0.0.0-20230208100708-287ba270a685
|
||||
github.com/xuri/excelize/v2 v2.5.0
|
||||
go.uber.org/atomic v1.9.0
|
||||
go.uber.org/zap v1.21.0
|
||||
golang.org/x/crypto v0.5.0
|
||||
golang.org/x/sys v0.4.0
|
||||
golang.org/x/text v0.6.0
|
||||
golang.org/x/time v0.0.0-20220609170525-579cf78fd858
|
||||
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c
|
||||
google.golang.org/grpc v1.49.0
|
||||
google.golang.org/protobuf v1.28.1
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0
|
||||
gopkg.in/yaml.v2 v2.4.0
|
||||
gopkg.in/yaml.v3 v3.0.1
|
||||
gorm.io/driver/mysql v1.0.1
|
||||
gorm.io/driver/sqlite v1.3.6
|
||||
gorm.io/gorm v1.23.8
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/KyleBanks/depth v1.2.1 // indirect
|
||||
github.com/Microsoft/go-winio v0.5.2 // indirect
|
||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect
|
||||
github.com/beorn7/perks v1.0.1 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.1.2 // indirect
|
||||
github.com/clbanning/mxj v1.8.4 // indirect
|
||||
github.com/clbanning/mxj/v2 v2.5.5 // indirect
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/docker/go-units v0.4.0 // indirect
|
||||
github.com/fatih/color v1.13.0 // indirect
|
||||
github.com/fsnotify/fsnotify v1.5.4 // indirect
|
||||
github.com/gin-contrib/sse v0.1.0 // indirect
|
||||
github.com/go-logr/logr v1.2.3 // indirect
|
||||
github.com/go-logr/stdr v1.2.2 // indirect
|
||||
github.com/go-ole/go-ole v1.2.6 // indirect
|
||||
github.com/go-openapi/jsonpointer v0.19.5 // indirect
|
||||
github.com/go-openapi/jsonreference v0.20.0 // indirect
|
||||
github.com/go-openapi/spec v0.20.7 // indirect
|
||||
github.com/go-openapi/swag v0.22.3 // indirect
|
||||
github.com/go-playground/locales v0.14.0 // indirect
|
||||
github.com/go-playground/universal-translator v0.18.0 // indirect
|
||||
github.com/go-playground/validator/v10 v10.11.1 // indirect
|
||||
github.com/go-sql-driver/mysql v1.5.0 // indirect
|
||||
github.com/goccy/go-json v0.9.11 // indirect
|
||||
github.com/gogo/protobuf v1.3.2 // indirect
|
||||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db // indirect
|
||||
github.com/google/btree v1.0.0 // indirect
|
||||
github.com/google/go-querystring v1.0.0 // indirect
|
||||
github.com/grokify/html-strip-tags-go v0.0.1 // indirect
|
||||
github.com/hashicorp/errwrap v1.0.0 // indirect
|
||||
github.com/hashicorp/go-immutable-radix v1.0.0 // indirect
|
||||
github.com/hashicorp/go-msgpack v0.5.3 // indirect
|
||||
github.com/hashicorp/go-multierror v1.0.0 // indirect
|
||||
github.com/hashicorp/golang-lru v0.5.1 // indirect
|
||||
github.com/hashicorp/memberlist v0.1.3 // indirect
|
||||
github.com/inconshreveable/mousetrap v1.0.0 // indirect
|
||||
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||
github.com/jinzhu/now v1.1.5 // indirect
|
||||
github.com/josharian/intern v1.0.0 // indirect
|
||||
github.com/json-iterator/go v1.1.12 // indirect
|
||||
github.com/leodido/go-urn v1.2.1 // indirect
|
||||
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
|
||||
github.com/magiconair/properties v1.8.6 // indirect
|
||||
github.com/mailru/easyjson v0.7.7 // indirect
|
||||
github.com/mattn/go-colorable v0.1.9 // indirect
|
||||
github.com/mattn/go-isatty v0.0.16 // indirect
|
||||
github.com/mattn/go-runewidth v0.0.9 // indirect
|
||||
github.com/mattn/go-sqlite3 v1.14.12 // indirect
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
|
||||
github.com/miekg/dns v1.0.14 // indirect
|
||||
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
|
||||
github.com/morikuni/aec v1.0.0 // indirect
|
||||
github.com/mozillazg/go-httpheader v0.2.1 // indirect
|
||||
github.com/olekukonko/tablewriter v0.0.5 // indirect
|
||||
github.com/opencontainers/go-digest v1.0.0 // indirect
|
||||
github.com/opencontainers/image-spec v1.0.2 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
|
||||
github.com/prometheus/client_golang v1.13.0 // indirect
|
||||
github.com/prometheus/client_model v0.2.0 // indirect
|
||||
github.com/prometheus/common v0.37.0 // indirect
|
||||
github.com/prometheus/procfs v0.8.0 // indirect
|
||||
github.com/richardlehane/mscfb v1.0.3 // indirect
|
||||
github.com/richardlehane/msoleps v1.0.1 // indirect
|
||||
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect
|
||||
github.com/sirupsen/logrus v1.9.0 // indirect
|
||||
github.com/tklauser/go-sysconf v0.3.9 // indirect
|
||||
github.com/tklauser/numcpus v0.3.0 // indirect
|
||||
github.com/ugorji/go/codec v1.2.7 // indirect
|
||||
github.com/xuri/efp v0.0.0-20210322160811-ab561f5b45e3 // indirect
|
||||
github.com/yusufpapurcu/wmi v1.2.2 // indirect
|
||||
go.opentelemetry.io/otel v1.7.0 // indirect
|
||||
go.opentelemetry.io/otel/sdk v1.7.0 // indirect
|
||||
go.opentelemetry.io/otel/trace v1.7.0 // indirect
|
||||
go.uber.org/multierr v1.6.0 // indirect
|
||||
golang.org/x/net v0.5.0 // indirect
|
||||
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect
|
||||
golang.org/x/tools v0.2.0 // indirect
|
||||
gopkg.in/fsnotify.v1 v1.4.7 // indirect
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
|
||||
gotest.tools/v3 v3.3.0 // indirect
|
||||
)
|
|
@ -0,0 +1,130 @@
|
|||
//
|
||||
// Copyright (C) 2021 IOTech Ltd
|
||||
//
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package dtos
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"github.com/winc-link/hummingbird/internal/models"
|
||||
//"gitlab.com/tedge/edgex/internal/models"
|
||||
)
|
||||
|
||||
// swagger:response ServicesStats
|
||||
type ServicesStats []ServiceStats
|
||||
|
||||
func (s ServicesStats) Len() int {
|
||||
return len(s)
|
||||
}
|
||||
|
||||
func (s ServicesStats) Less(i, j int) bool {
|
||||
return s[i].Name < s[j].Name
|
||||
}
|
||||
|
||||
func (s ServicesStats) Swap(i, j int) {
|
||||
s[i], s[j] = s[j], s[i]
|
||||
}
|
||||
|
||||
type ServiceStats struct {
|
||||
Id string `json:"id" binding:"required"` //
|
||||
Name string `json:"name" binding:"required"`
|
||||
Healthy bool `json:"healthy"` // 健康状态
|
||||
Created string `json:"created"`
|
||||
LogPath string `json:"log_path"` // 日志地址, 宿主主机日志路径
|
||||
Started string `json:"started"` // 服务最近启动时间
|
||||
ServiceType string `json:"service_type" binding:"required"`
|
||||
}
|
||||
|
||||
func FromModelsServiceStatsToDTO(s models.ServiceStats) ServiceStats {
|
||||
return ServiceStats{
|
||||
Id: s.Id,
|
||||
Name: s.Name,
|
||||
Healthy: s.Healthy,
|
||||
Created: s.Created,
|
||||
Started: s.Started,
|
||||
LogPath: s.LogPath,
|
||||
ServiceType: s.ServiceType,
|
||||
}
|
||||
}
|
||||
|
||||
func FromDTOServiceStatsToModel(s ServiceStats) models.ServiceStats {
|
||||
return models.ServiceStats{
|
||||
Id: s.Id,
|
||||
Name: s.Name,
|
||||
Healthy: s.Healthy,
|
||||
Created: s.Created,
|
||||
Started: s.Started,
|
||||
LogPath: s.LogPath,
|
||||
ServiceType: s.ServiceType,
|
||||
}
|
||||
}
|
||||
|
||||
type Logging struct {
|
||||
Log string `json:"log"`
|
||||
}
|
||||
|
||||
type MetricsQuery struct {
|
||||
Service string `form:"service" binding:"required"` // 服务ID
|
||||
MetricsType string `form:"metrics_type" binding:"oneof=minute hour halfday day"` // 监控类型,范围: minute hour halfday day
|
||||
MetricsRangeQuery
|
||||
}
|
||||
|
||||
type SystemMetricsQuery struct {
|
||||
Iface string `form:"iface"`
|
||||
MetricsType string `form:"metrics_type" binding:"oneof=hour halfday day"`
|
||||
}
|
||||
|
||||
type MetricsRangeQuery struct {
|
||||
Start int64 `form:"start" binding:"gt=0"` // 开始时间戳
|
||||
End int64 `form:"end" binding:"gt=0"` // 结束时间戳
|
||||
}
|
||||
|
||||
// swagger:response MetricsResult
|
||||
type MetricsResult struct {
|
||||
Total int `json:"total"`
|
||||
Metrics []Metrics `json:"metrics"` // 性能点列表
|
||||
}
|
||||
|
||||
type Metrics struct {
|
||||
Timestamp int64 `json:"timestamp"` // 时间戳
|
||||
CpuUsedPercent float64 `json:"cpuUsedPercent"` // cpu 使用率百分比
|
||||
MemoryUsed int64 `json:"memoryUsed"` // 内存使用大小,单位:字节
|
||||
}
|
||||
|
||||
func FromModelsMetricsToDTO(m models.Metrics) Metrics {
|
||||
return Metrics{
|
||||
Timestamp: m.Timestamp,
|
||||
CpuUsedPercent: m.CpuUsedPercent,
|
||||
MemoryUsed: m.MemoryUsed,
|
||||
}
|
||||
}
|
||||
|
||||
func (m Metrics) ToJSON() string {
|
||||
marshal, _ := json.Marshal(m)
|
||||
return string(marshal)
|
||||
}
|
||||
|
||||
type LogParam struct {
|
||||
Line int `form:"line"`
|
||||
}
|
||||
|
||||
type TerminalParams struct {
|
||||
Cmd string `json:"cmd" binding:"required"`
|
||||
Args []string `json:"args" binding:"required"`
|
||||
TimeoutSeconds int `json:"timeout_seconds" binding:"min=1,max=60"`
|
||||
}
|
||||
|
||||
type AgentRequest struct {
|
||||
Cmd string `json:"cmd"`
|
||||
Args []string `json:"args"`
|
||||
TimeoutSeconds int `json:"timeout_seconds"`
|
||||
}
|
||||
|
||||
type AgentResponse struct {
|
||||
Operation string `json:"operation"`
|
||||
Service string `json:"service"`
|
||||
Executor string `json:"executor"`
|
||||
Success bool `json:"success"`
|
||||
ErrorMessage string `json:"errorMessage"`
|
||||
}
|
|
@ -0,0 +1,106 @@
|
|||
package dtos
|
||||
|
||||
import (
|
||||
"github.com/winc-link/hummingbird/internal/models"
|
||||
"github.com/winc-link/hummingbird/internal/pkg/constants"
|
||||
"github.com/winc-link/hummingbird/internal/pkg/errort"
|
||||
"github.com/winc-link/hummingbird/internal/pkg/i18n"
|
||||
"time"
|
||||
)
|
||||
|
||||
const (
|
||||
SYSTEM_ALERT models.AlertType = iota + 1 // 系统告警
|
||||
DRIVER_ALERT // 驱动告警
|
||||
LICENSE_ALERT //证书过期
|
||||
)
|
||||
|
||||
const (
|
||||
ERROR models.AlertLevel = iota + 1 // 告警级别:错误
|
||||
WARN // 告警级别:警告
|
||||
NOTIFY // 告警级别: 通知
|
||||
)
|
||||
|
||||
var (
|
||||
AlertTypeTrans = map[models.AlertType]string{
|
||||
SYSTEM_ALERT: i18n.AgentAlertSystem,
|
||||
DRIVER_ALERT: i18n.AgentAlertDriver,
|
||||
LICENSE_ALERT: i18n.LicenseAlertExpire,
|
||||
}
|
||||
AlertLevelTrans = map[models.AlertLevel]string{
|
||||
NOTIFY: i18n.AgentAlertNotify,
|
||||
WARN: i18n.AgentAlertWarn,
|
||||
ERROR: i18n.AgentAlertError,
|
||||
}
|
||||
)
|
||||
|
||||
// AlertContent 服务和驱动上报告警消息
|
||||
type (
|
||||
ReportAlertsReq struct {
|
||||
BaseRequest `json:",inline"`
|
||||
ServiceName string `json:"name"` // 服务名
|
||||
Type models.AlertType `json:"type" binding:"oneof=1 2"` // 告警类型
|
||||
Level models.AlertLevel `json:"level" binding:"oneof=1 2 3"` // 告警级别
|
||||
T int64 `json:"time"` // 告警时间
|
||||
Content string `json:"content"`
|
||||
}
|
||||
|
||||
AlertContentDTO struct {
|
||||
ServiceName string `json:"name"` // 服务名
|
||||
Type models.AlertType `json:"type" binding:"oneof=1 2" swaggertype:"integer"` // 告警类型
|
||||
TypeValue string `json:"typeValue"`
|
||||
Level models.AlertLevel `json:"level" binding:"oneof=1 2 3" swaggertype:"integer"` // 告警级别
|
||||
LevelValue string `json:"levelValue"`
|
||||
T int64 `json:"time"` // 告警时间
|
||||
Content string `json:"content"` // 告警内容
|
||||
}
|
||||
)
|
||||
|
||||
func NewReportAlertsReq(serviceName string, tp models.AlertType, l models.AlertLevel, t int64, content string) ReportAlertsReq {
|
||||
return ReportAlertsReq{
|
||||
BaseRequest: NewBaseRequest(),
|
||||
ServiceName: serviceName,
|
||||
Type: tp,
|
||||
Level: l,
|
||||
T: t,
|
||||
Content: content,
|
||||
}
|
||||
}
|
||||
|
||||
func ToAlertContent(req ReportAlertsReq) models.AlertContent {
|
||||
return models.AlertContent{
|
||||
ServiceName: req.ServiceName,
|
||||
Type: req.Type,
|
||||
Level: req.Level,
|
||||
T: req.T,
|
||||
Content: req.Content,
|
||||
}
|
||||
}
|
||||
|
||||
func AlertContentToDTO(ac models.AlertContent) AlertContentDTO {
|
||||
return AlertContentDTO{
|
||||
ServiceName: ac.ServiceName,
|
||||
Type: ac.Type,
|
||||
Level: ac.Level,
|
||||
T: ac.T,
|
||||
Content: ac.Content,
|
||||
}
|
||||
}
|
||||
|
||||
type ReportAlertRequest struct {
|
||||
ServiceName string `json:"serviceName"`
|
||||
AlertType int `json:"alertType"` // constants.AlertType_SERVICE
|
||||
AlertLevel int `json:"alertLevel"` // constants.AlertLevel_ERROR
|
||||
AlertTime int64 `json:"alertTime"`
|
||||
Content string `json:"content"`
|
||||
}
|
||||
|
||||
// GenServerAlert 生成服务警告内容
|
||||
func GenServerAlert(lvl models.AlertLevel, err error) ReportAlertsReq {
|
||||
errw := errort.NewCommonEdgeXWrapper(err)
|
||||
return NewReportAlertsReq(
|
||||
constants.CoreServiceKey,
|
||||
SYSTEM_ALERT,
|
||||
lvl,
|
||||
time.Now().Unix(),
|
||||
i18n.TransCodeDefault(errw.Code(), nil))
|
||||
}
|
|
@ -0,0 +1,308 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2017.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
|
||||
package dtos
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/winc-link/hummingbird/internal/models"
|
||||
"github.com/winc-link/hummingbird/internal/pkg/constants"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type RuleAddRequest struct {
|
||||
Name string `json:"name"` //名字
|
||||
AlertType constants.AlertType `json:"alert_type"` //告警类型
|
||||
AlertLevel constants.AlertLevel `json:"alert_level"` //告警级别
|
||||
Description string `json:"description"` //描述
|
||||
}
|
||||
|
||||
type RuleFieldUpdate struct {
|
||||
Id string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
AlertLevel constants.AlertLevel `json:"alert_level"`
|
||||
Description string `json:"description"`
|
||||
}
|
||||
|
||||
type RuleUpdateRequest struct {
|
||||
Id string `json:"id"`
|
||||
Condition constants.WorkerCondition `json:"condition"` //执行条件
|
||||
SubRule []SubRule `json:"sub_rule"`
|
||||
Notify []Notify `json:"notify"`
|
||||
SilenceTime int64 `json:"silence_time"` //静默时间
|
||||
}
|
||||
|
||||
type AlertTreatedRequest struct {
|
||||
Id string `json:"id"`
|
||||
Message string `json:"message"`
|
||||
}
|
||||
|
||||
type Notify struct {
|
||||
Name constants.AlertWay `json:"name"` //告警方式
|
||||
Option map[string]string `json:"option"`
|
||||
StartEffectTime string `json:"start_effect_time"` //生效开始时间
|
||||
EndEffectTime string `json:"end_effect_time"` //生效结束时间
|
||||
}
|
||||
|
||||
func (b *RuleUpdateRequest) BuildEkuiperSql(deviceId string, specsType constants.SpecsType) string {
|
||||
var sql string
|
||||
switch specsType {
|
||||
case constants.SpecsTypeInt, constants.SpecsTypeFloat:
|
||||
var s int
|
||||
switch b.SubRule[0].Option["value_cycle"] {
|
||||
case "1分钟周期":
|
||||
s = 60
|
||||
case "5分钟周期":
|
||||
s = 60 * 5
|
||||
case "15分钟周期":
|
||||
s = 60 * 15
|
||||
case "30分钟周期":
|
||||
s = 60 * 30
|
||||
case "60分钟周期":
|
||||
s = 60 * 60
|
||||
default:
|
||||
if b.SubRule[0].Option["value_type"] != constants.Original {
|
||||
return ""
|
||||
}
|
||||
}
|
||||
switch b.SubRule[0].Option["value_type"] {
|
||||
case constants.Original:
|
||||
code := b.SubRule[0].Option["code"]
|
||||
decideCondition := b.SubRule[0].Option["decide_condition"]
|
||||
originalTemp := `SELECT rule_id(),json_path_query(data, "$.%s.time") as report_time ,deviceId FROM mqtt_stream where deviceId = "%s" and messageType = "PROPERTY_REPORT" and json_path_exists(data, "$.%s") = true and json_path_query(data, "$.%s.value") %s`
|
||||
sql = fmt.Sprintf(originalTemp, code, deviceId, code, code, decideCondition)
|
||||
|
||||
case constants.Avg:
|
||||
code := b.SubRule[0].Option["code"]
|
||||
decideCondition := b.SubRule[0].Option["decide_condition"]
|
||||
sqlTemp := `SELECT window_start(),window_end(),rule_id(),deviceId,avg(json_path_query(data, "$.%s.value")) as avg_%s FROM mqtt_stream where deviceId = "%s" and messageType = "PROPERTY_REPORT" and json_path_exists(data, "$.%s") = true GROUP BY %s HAVING avg_%s %s`
|
||||
sql = fmt.Sprintf(sqlTemp, code, code, deviceId, code, fmt.Sprintf("TUMBLINGWINDOW(ss, %d)", s), code, decideCondition)
|
||||
case constants.Max:
|
||||
code := b.SubRule[0].Option["code"]
|
||||
decideCondition := b.SubRule[0].Option["decide_condition"]
|
||||
sqlTemp := `SELECT window_start(),window_end(),rule_id(),deviceId,max(json_path_query(data, "$.%s.value")) as max_%s FROM mqtt_stream where deviceId = "%s" and messageType = "PROPERTY_REPORT" and json_path_exists(data, "$.%s") = true GROUP BY %s HAVING max_%s %s`
|
||||
sql = fmt.Sprintf(sqlTemp, code, code, deviceId, code, fmt.Sprintf("TUMBLINGWINDOW(ss, %d)", s), code, decideCondition)
|
||||
case constants.Min:
|
||||
code := b.SubRule[0].Option["code"]
|
||||
decideCondition := b.SubRule[0].Option["decide_condition"]
|
||||
sqlTemp := `SELECT window_start(),window_end(),rule_id(),deviceId,min(json_path_query(data, "$.%s.value")) as min_%s FROM mqtt_stream where deviceId = "%s" and messageType = "PROPERTY_REPORT" and json_path_exists(data, "$.%s") = true GROUP BY %s HAVING min_%s %s`
|
||||
sql = fmt.Sprintf(sqlTemp, code, code, deviceId, code, fmt.Sprintf("TUMBLINGWINDOW(ss, %d)", s), code, decideCondition)
|
||||
case constants.Sum:
|
||||
code := b.SubRule[0].Option["code"]
|
||||
decideCondition := b.SubRule[0].Option["decide_condition"]
|
||||
sqlTemp := `SELECT window_start(),window_end(),rule_id(),deviceId,sum(json_path_query(data, "$.%s.value")) as sum_%s FROM mqtt_stream where deviceId = "%s" and messageType = "PROPERTY_REPORT" and json_path_exists(data, "$.%s") = true GROUP BY %s HAVING sum_%s %s`
|
||||
sql = fmt.Sprintf(sqlTemp, code, code, deviceId, code, fmt.Sprintf("TUMBLINGWINDOW(ss, %d)", s), code, decideCondition)
|
||||
}
|
||||
return sql
|
||||
case constants.SpecsTypeText:
|
||||
code := b.SubRule[0].Option["code"]
|
||||
decideCondition := b.SubRule[0].Option["decide_condition"]
|
||||
st := strings.Split(decideCondition, " ")
|
||||
if len(st) != 2 {
|
||||
return ""
|
||||
}
|
||||
sqlTemp := `SELECT rule_id(),json_path_query(data, "$.%s.time") as report_time,deviceId FROM mqtt_stream where deviceId = "%s" and messageType = "PROPERTY_REPORT" and json_path_exists(data, "$.%s") = true and json_path_query(data, "$.%s.value") = "%s"`
|
||||
sql = fmt.Sprintf(sqlTemp, code, deviceId, code, code, st[1])
|
||||
case constants.SpecsTypeEnum:
|
||||
code := b.SubRule[0].Option["code"]
|
||||
decideCondition := b.SubRule[0].Option["decide_condition"]
|
||||
st := strings.Split(decideCondition, " ")
|
||||
if len(st) != 2 {
|
||||
return ""
|
||||
}
|
||||
sqlTemp := `SELECT rule_id(),json_path_query(data, "$.%s.time") as report_time,deviceId FROM mqtt_stream where deviceId = "%s" and messageType = "PROPERTY_REPORT" and json_path_exists(data, "$.%s") = true and json_path_query(data, "$.%s.value") = %s`
|
||||
sql = fmt.Sprintf(sqlTemp, code, deviceId, code, code, st[1])
|
||||
case constants.SpecsTypeBool:
|
||||
code := b.SubRule[0].Option["code"]
|
||||
decideCondition := b.SubRule[0].Option["decide_condition"]
|
||||
st := strings.Split(decideCondition, " ")
|
||||
if len(st) != 2 {
|
||||
return ""
|
||||
}
|
||||
sqlTemp := `SELECT rule_id(),json_path_query(data, "$.%s.time") as report_time,deviceId FROM mqtt_stream where deviceId = "%s" and messageType = "PROPERTY_REPORT" and json_path_exists(data, "$.%s") = true and json_path_query(data, "$.%s.value") = %s`
|
||||
if st[1] == "true" {
|
||||
sql = fmt.Sprintf(sqlTemp, code, deviceId, code, code, "1")
|
||||
} else if st[1] == "false" {
|
||||
sql = fmt.Sprintf(sqlTemp, code, deviceId, code, code, "0")
|
||||
}
|
||||
|
||||
}
|
||||
return sql
|
||||
}
|
||||
|
||||
func ReplaceRuleFields(ds *models.AlertRule, patch RuleFieldUpdate) {
|
||||
if patch.Name != "" {
|
||||
ds.Name = patch.Name
|
||||
}
|
||||
if patch.AlertLevel != "" {
|
||||
ds.AlertLevel = patch.AlertLevel
|
||||
}
|
||||
if patch.Description != "" {
|
||||
ds.Description = patch.Description
|
||||
}
|
||||
}
|
||||
|
||||
func ReplaceRuleModelFields(ds *models.AlertRule, patch RuleUpdateRequest) {
|
||||
if patch.Condition != "" {
|
||||
ds.Condition = patch.Condition
|
||||
}
|
||||
if patch.SilenceTime > 0 {
|
||||
ds.SilenceTime = patch.SilenceTime
|
||||
}
|
||||
if len(patch.SubRule) > 0 {
|
||||
var newSubRule models.SubRule
|
||||
for _, rule := range patch.SubRule {
|
||||
newSubRule = append(newSubRule, models.Rule{
|
||||
Trigger: rule.Trigger,
|
||||
ProductId: rule.ProductId,
|
||||
DeviceId: rule.DeviceId,
|
||||
Option: rule.Option,
|
||||
})
|
||||
}
|
||||
ds.SubRule = newSubRule
|
||||
} else {
|
||||
ds.SubRule = nil
|
||||
}
|
||||
if len(patch.Notify) > 0 {
|
||||
var newNotify models.Notify
|
||||
for _, notify := range patch.Notify {
|
||||
newNotify = append(newNotify, models.SubNotify{
|
||||
Name: notify.Name,
|
||||
Option: notify.Option,
|
||||
StartEffectTime: notify.StartEffectTime,
|
||||
EndEffectTime: notify.EndEffectTime,
|
||||
})
|
||||
}
|
||||
ds.Notify = newNotify
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
type SubRule struct {
|
||||
Trigger constants.Trigger `json:"trigger"`
|
||||
ProductId string `json:"product_id"`
|
||||
DeviceId string `json:"device_id"`
|
||||
Option map[string]string `json:"option"`
|
||||
}
|
||||
|
||||
type RuleResponse struct {
|
||||
Id string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
AlertType constants.AlertType `json:"alert_type"`
|
||||
AlertLevel constants.AlertLevel `json:"alert_level"`
|
||||
Status constants.RuleStatus `json:"status"`
|
||||
Condition constants.WorkerCondition `json:"condition"`
|
||||
SubRule RuleSubRules `json:"sub_rule"`
|
||||
Notify models.Notify `json:"notify"`
|
||||
SilenceTime int64 `json:"silence_time"`
|
||||
Description string `json:"description"`
|
||||
Created int64 `json:"created"`
|
||||
Modified int64 `json:"modified"`
|
||||
}
|
||||
|
||||
type RuleSubRules []RuleSubRule
|
||||
|
||||
type RuleSubRule struct {
|
||||
Trigger constants.Trigger `json:"trigger"` //触发方式
|
||||
ProductId string `json:"product_id"`
|
||||
ProductName string `json:"product_name"`
|
||||
DeviceId string `json:"device_id"`
|
||||
DeviceName string `json:"device_name"`
|
||||
Code string `json:"code"`
|
||||
Condition string `json:"condition"`
|
||||
Option map[string]string `json:"option"`
|
||||
}
|
||||
|
||||
//type RuleNotifys []RuleNotify
|
||||
//
|
||||
//type RuleNotify struct {
|
||||
// Name constants.AlertWay `json:"name"` //告警方式
|
||||
// Option map[string]string `json:"option"`
|
||||
// StartEffectTime string `json:"start_effect_time"` //生效开始时间
|
||||
// EndEffectTime string `json:"end_effect_time"` //生效结束时间
|
||||
//}
|
||||
|
||||
type AlertRuleSearchQueryRequest struct {
|
||||
BaseSearchConditionQuery `schema:",inline"`
|
||||
Name string `schema:"name,omitempty"`
|
||||
Status string `schema:"status,omitempty"`
|
||||
Msg string `schema:"msg,omitempty"`
|
||||
}
|
||||
|
||||
type AlertRuleSearchQueryResponse struct {
|
||||
Id string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Description string `json:"description"`
|
||||
AlertType constants.AlertType `json:"alert_type"`
|
||||
AlertLevel constants.AlertLevel `json:"alert_level"`
|
||||
Created int64 `json:"created"`
|
||||
Status constants.RuleStatus `json:"status"`
|
||||
SubRule []SubRule `json:"sub_rule"`
|
||||
}
|
||||
|
||||
func RuleSearchQueryResponseFromModel(p models.AlertRule) AlertRuleSearchQueryResponse {
|
||||
var subRule []SubRule
|
||||
for _, rule := range p.SubRule {
|
||||
subRule = append(subRule, SubRule{
|
||||
Trigger: rule.Trigger,
|
||||
ProductId: rule.ProductId,
|
||||
DeviceId: rule.DeviceId,
|
||||
Option: rule.Option,
|
||||
})
|
||||
}
|
||||
return AlertRuleSearchQueryResponse{
|
||||
Id: p.Id,
|
||||
Name: p.Name,
|
||||
Description: p.Description,
|
||||
AlertType: p.AlertType,
|
||||
AlertLevel: p.AlertLevel,
|
||||
Status: p.Status,
|
||||
Created: p.Created,
|
||||
SubRule: subRule,
|
||||
}
|
||||
}
|
||||
|
||||
type AlertSearchQueryRequest struct {
|
||||
BaseSearchConditionQuery `schema:",inline"`
|
||||
Name string `schema:"name,omitempty"`
|
||||
AlertLevel string `schema:"alert_level,omitempty"`
|
||||
Status string `schema:"status,omitempty"`
|
||||
TriggerStartTime int `schema:"trigger_start_time,omitempty"`
|
||||
TriggerEndTime int `schema:"trigger_end_time,omitempty"`
|
||||
}
|
||||
|
||||
type AlertSearchQueryResponse struct {
|
||||
Id string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
//Description string `json:"description"`
|
||||
AlertResult string `json:"alert_result"`
|
||||
AlertLevel constants.AlertLevel `json:"alert_level"`
|
||||
TriggerTime int64 `json:"trigger_time"`
|
||||
TreatedTime int64 `json:"treated_time"`
|
||||
Status string `json:"status"`
|
||||
Message string `json:"message"`
|
||||
IsSend bool `json:"is_send"`
|
||||
}
|
||||
|
||||
type AlertAddRequest struct {
|
||||
DeviceId string `json:"device_id"`
|
||||
TriggerTime int64 `json:"trigger_time"` //触发时间
|
||||
RuleId string `json:"rule_id"`
|
||||
Content string `json:"content"`
|
||||
}
|
||||
|
||||
type AlertPlateQueryResponse struct {
|
||||
Count int `json:"count"`
|
||||
AlertLevel constants.AlertLevel `json:"alert_level"`
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2017.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
|
||||
package dtos
|
||||
|
||||
const (
|
||||
BackupFileTypeDbResource = "db_resource"
|
||||
BackupFileTypeDbExpert = "db_expert"
|
||||
BackupFileTypeDbGateway = "db_gateway"
|
||||
BackupFileTypeCheck = "check.json"
|
||||
BackupUnZipDir = "/tmp/edge-recover"
|
||||
)
|
||||
|
||||
// 备份/恢复时的校验文件
|
||||
type BackupFileCheck struct {
|
||||
GatewayId string `json:"gateway_id"`
|
||||
Version string `json:"version"`
|
||||
}
|
||||
|
||||
type BackupCommand struct {
|
||||
BackupType int
|
||||
}
|
|
@ -0,0 +1,70 @@
|
|||
//
|
||||
// Copyright (C) 2020 IOTech Ltd
|
||||
//
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package dtos
|
||||
|
||||
import (
|
||||
"github.com/google/uuid"
|
||||
"github.com/winc-link/hummingbird/internal/pkg/constants"
|
||||
//"gitlab.com/tedge/edgex/internal/pkg/constants"
|
||||
)
|
||||
|
||||
// Request defines the base content for request DTOs (data transfer objects).
|
||||
// This object and its properties correspond to the BaseRequest object in the APIv2 specification:
|
||||
// https://app.swaggerhub.com/apis-docs/EdgeXFoundry1/core-data/2.x#/BaseRequest
|
||||
type BaseRequest struct {
|
||||
Versionable `json:",inline"`
|
||||
RequestId string `json:"requestId" validate:"len=0|uuid"`
|
||||
}
|
||||
|
||||
func NewBaseRequest() BaseRequest {
|
||||
return BaseRequest{
|
||||
Versionable: NewVersionable(),
|
||||
RequestId: uuid.NewString(),
|
||||
}
|
||||
}
|
||||
|
||||
// BaseResponse defines the base content for response DTOs (data transfer objects).
|
||||
// This object and its properties correspond to the BaseResponse object in the APIv2 specification:
|
||||
// https://app.swaggerhub.com/apis-docs/EdgeXFoundry1/core-data/2.x#/BaseResponse
|
||||
type BaseResponse struct {
|
||||
Versionable `json:",inline"`
|
||||
RequestId string `json:"requestId"`
|
||||
Message interface{} `json:"message,omitempty"`
|
||||
StatusCode int `json:"statusCode"`
|
||||
}
|
||||
|
||||
// Versionable shows the API version in DTOs
|
||||
type Versionable struct {
|
||||
ApiVersion string `json:"apiVersion"`
|
||||
}
|
||||
|
||||
// BaseWithIdResponse defines the base content for response DTOs (data transfer objects).
|
||||
// This object and its properties correspond to the BaseWithIdResponse object in the APIv2 specification:
|
||||
// https://app.swaggerhub.com/apis-docs/EdgeXFoundry1/core-data/2.x#/BaseWithIdResponse
|
||||
type BaseWithIdResponse struct {
|
||||
BaseResponse `json:",inline"`
|
||||
Id string `json:"id"`
|
||||
}
|
||||
|
||||
func NewBaseResponse(requestId string, message string, statusCode int) BaseResponse {
|
||||
return BaseResponse{
|
||||
Versionable: NewVersionable(),
|
||||
RequestId: requestId,
|
||||
Message: message,
|
||||
StatusCode: statusCode,
|
||||
}
|
||||
}
|
||||
|
||||
func NewVersionable() Versionable {
|
||||
return Versionable{ApiVersion: constants.ApiVersion}
|
||||
}
|
||||
|
||||
func NewBaseWithIdResponse(requestId string, message string, statusCode int, id string) BaseWithIdResponse {
|
||||
return BaseWithIdResponse{
|
||||
BaseResponse: NewBaseResponse(requestId, message, statusCode),
|
||||
Id: id,
|
||||
}
|
||||
}
|
|
@ -0,0 +1,87 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2017 Dell Inc.
|
||||
* Copyright (c) 2019 Intel Corporation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
package dtos
|
||||
|
||||
import "github.com/winc-link/hummingbird/internal/models"
|
||||
|
||||
type CategoryTemplateRequest struct {
|
||||
BaseSearchConditionQuery `schema:",inline"`
|
||||
CategoryName string `schema:"category_name"`
|
||||
Scene string `schema:"scene"`
|
||||
}
|
||||
|
||||
type CategoryTemplateSyncRequest struct {
|
||||
VersionName string `json:"version_name"`
|
||||
}
|
||||
|
||||
type ThingModelTemplateSyncRequest struct {
|
||||
VersionName string `json:"version_name"`
|
||||
}
|
||||
|
||||
func CategoryTemplateResponseFromModel(m models.CategoryTemplate) CategoryTemplateResponse {
|
||||
return CategoryTemplateResponse{
|
||||
Id: m.Id,
|
||||
CategoryName: m.CategoryName,
|
||||
CategoryKey: m.CategoryKey,
|
||||
Scene: m.Scene,
|
||||
}
|
||||
}
|
||||
|
||||
type CategoryTemplateResponse struct {
|
||||
Id string `json:"id"`
|
||||
CategoryName string `json:"category_name"` //品类名称
|
||||
CategoryKey string `json:"category_key"`
|
||||
Scene string `json:"scene"` //所属场景
|
||||
}
|
||||
|
||||
type CosCategoryTemplateResponse struct {
|
||||
CategoryName string `json:"category_name"`
|
||||
CategoryKey string `json:"category_key"`
|
||||
Scene string `json:"scene"`
|
||||
}
|
||||
|
||||
type ThingModelTemplateRequest struct {
|
||||
BaseSearchConditionQuery `schema:",inline"`
|
||||
CategoryKey string `schema:"category_key"`
|
||||
CategoryName string `schema:"category_name"`
|
||||
}
|
||||
|
||||
type ThingModelTemplateResponse struct {
|
||||
Id string `json:"id"`
|
||||
CategoryName string `json:"category_name"` //品类名称
|
||||
CategoryKey string `json:"category_key"`
|
||||
ThingModelJSON string `json:"thing_model_json"`
|
||||
//models.Properties
|
||||
Properties interface{} `json:"properties"`
|
||||
Events interface{} `json:"events"`
|
||||
Actions interface{} `json:"actions"`
|
||||
}
|
||||
|
||||
func ThingModelTemplateResponseFromModel(m models.ThingModelTemplate) ThingModelTemplateResponse {
|
||||
p, e, a := GetModelPropertyEventActionByThingModelTemplate(m.ThingModelJSON)
|
||||
return ThingModelTemplateResponse{
|
||||
CategoryKey: m.CategoryKey,
|
||||
CategoryName: m.CategoryName,
|
||||
Properties: p,
|
||||
Events: e,
|
||||
Actions: a,
|
||||
}
|
||||
}
|
||||
|
||||
type CosThingModelTemplateResponse struct {
|
||||
CategoryName string `json:"category_name"`
|
||||
CategoryKey string `json:"category_key"`
|
||||
ThingModelJSON string `json:"thing_model_json"`
|
||||
}
|
|
@ -0,0 +1,61 @@
|
|||
package dtos
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// DebugAssistantReq 调试助手请求参数 TODO 可以直接使用 DpMessage
|
||||
type DebugAssistantReq struct {
|
||||
DeviceId string `json:"deviceId,omitempty"`
|
||||
OpType int32 `json:"opType,omitempty"`
|
||||
Data map[string]interface{} `json:"data" binding:"required"`
|
||||
Protocol int32 `json:"protocol" binding:"required"`
|
||||
S int64 `json:"s"`
|
||||
T int64 `json:"t" binding:"required"`
|
||||
}
|
||||
|
||||
func (r DebugAssistantReq) DataString() string {
|
||||
body, _ := json.Marshal(r)
|
||||
return string(body)
|
||||
}
|
||||
|
||||
// 北向指令
|
||||
type CmdRequest struct {
|
||||
Cid string
|
||||
Protocol int32
|
||||
S int64
|
||||
T int64
|
||||
Data []byte // json encode
|
||||
}
|
||||
|
||||
func (cr CmdRequest) String() string {
|
||||
return fmt.Sprintf("cid: %s, protocol: %d, s: %d, t: %d, data: %s", cr.Cid, cr.Protocol, cr.S, cr.T, string(cr.Data))
|
||||
}
|
||||
|
||||
type CommandResponse struct {
|
||||
Id string `json:"id"` // uuid
|
||||
Cid string `json:"cid"` // 设备ID
|
||||
Protocol int32 `json:"protocol"` // 协议号
|
||||
Timestamp int64 `json:"timestamp"`
|
||||
Data map[string]interface{} `json:"data"` // 序列化后的数据
|
||||
}
|
||||
|
||||
func (cmd CommandResponse) DataJSON() string {
|
||||
b, _ := json.Marshal(cmd.Data)
|
||||
return string(b)
|
||||
}
|
||||
|
||||
type CommandQueryRequest struct {
|
||||
DeviceId string `form:"device_id" binding:"required"`
|
||||
}
|
||||
|
||||
type ListCommandResponse struct {
|
||||
List []CommandResponse `json:"list"`
|
||||
}
|
||||
|
||||
func NewListCommandResponse() ListCommandResponse {
|
||||
return ListCommandResponse{
|
||||
List: []CommandResponse{},
|
||||
}
|
||||
}
|
|
@ -0,0 +1,109 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2017 Dell Inc.
|
||||
* Copyright (c) 2019 Intel Corporation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
package dtos
|
||||
|
||||
import "strings"
|
||||
|
||||
type PageRequest struct {
|
||||
NameLike string `json:"nameLike" form:"nameLike"`
|
||||
Page int `json:"page" form:"page"`
|
||||
PageSize int `json:"pageSize" form:"pageSize"`
|
||||
}
|
||||
|
||||
//func (p *PageRequest) ToRpc() *common.PageRequest {
|
||||
// return &common.PageRequest{
|
||||
// NameLike: p.NameLike,
|
||||
// Page: int64(p.Page),
|
||||
// PageSize: int64(p.PageSize),
|
||||
// }
|
||||
//}
|
||||
|
||||
|
||||
type BaseSearchConditionQuery struct {
|
||||
Page int `schema:"page,omitempty" form:"page"`
|
||||
PageSize int `schema:"pageSize,omitempty" form:"pageSize" json:"pageSize"`
|
||||
Id string `schema:"id,omitempty" form:"id"`
|
||||
Ids string `schema:"ids,omitempty" form:"ids"`
|
||||
LikeId string `schema:"likeId,omitempty" form:"likeId"`
|
||||
Name string `schema:"name,omitempty" form:"name"`
|
||||
NameLike string `schema:"nameLike,omitempty" form:"nameLike"`
|
||||
IsAll bool `schema:"isAll,omitempty" form:"isAll"`
|
||||
OrderBy string `schema:"orderBy,omitempty" form:"orderBy"`
|
||||
}
|
||||
|
||||
func (req BaseSearchConditionQuery) GetPage() (int, int) {
|
||||
var (
|
||||
offset = (req.Page - 1) * req.PageSize
|
||||
limit = req.PageSize
|
||||
)
|
||||
if req.Page == 0 && req.PageSize == 0 {
|
||||
offset = 0
|
||||
limit = -1
|
||||
}
|
||||
if req.IsAll {
|
||||
offset = 0
|
||||
limit = -1
|
||||
}
|
||||
return offset, limit
|
||||
}
|
||||
|
||||
|
||||
func ApiParamsStringToArray(str string) []string {
|
||||
return strings.Split(str, ",")
|
||||
}
|
||||
|
||||
/**
|
||||
前端/后端请求查询的通用order by,查询key必须是models里存在的值
|
||||
比如 通过models.Device.ProductName 排序, 那么key的值为 ProductName或则对应的数据库字段 product_name, 不能是 pn
|
||||
*/
|
||||
type ApiOrderBy struct {
|
||||
Key string
|
||||
IsDesc bool
|
||||
}
|
||||
|
||||
func ApiParamsStringToOrderBy(str string) []ApiOrderBy {
|
||||
orderBys := make([]ApiOrderBy, 0)
|
||||
arr := strings.Split(str, ",")
|
||||
if len(arr) <= 0 {
|
||||
return nil
|
||||
}
|
||||
for _, v := range arr {
|
||||
vArr := strings.Split(v, ":")
|
||||
if len(vArr) <= 1 {
|
||||
continue
|
||||
}
|
||||
switch vArr[1] {
|
||||
case "desc":
|
||||
orderBys = append(orderBys, ApiOrderBy{
|
||||
Key: vArr[0],
|
||||
IsDesc: true,
|
||||
})
|
||||
case "asc":
|
||||
orderBys = append(orderBys, ApiOrderBy{
|
||||
Key: vArr[0],
|
||||
IsDesc: false,
|
||||
})
|
||||
default:
|
||||
continue
|
||||
}
|
||||
}
|
||||
return orderBys
|
||||
}
|
||||
|
||||
|
||||
func ApiParamsArrayToString(arr []string) string {
|
||||
return strings.Join(arr, ",")
|
||||
}
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
package dtos
|
||||
|
||||
import (
|
||||
"github.com/winc-link/hummingbird/internal/models"
|
||||
"github.com/winc-link/hummingbird/internal/pkg/constants"
|
||||
//"github.com/winc-link/hummingbird/proto/resource"
|
||||
//"github.com/winc-link/hummingbird/proto/strategy"
|
||||
)
|
||||
|
||||
type AdvanceConfig struct {
|
||||
// 日志级别 默认为DEBUG
|
||||
LogLevel constants.LogLevel
|
||||
// 持久化存储开关 默认关闭
|
||||
PersistStorage bool
|
||||
// 存储时长 默认为0
|
||||
StorageHour int32
|
||||
}
|
||||
|
||||
func AdvanceConfigFromModelToDTO(config models.AdvanceConfig) AdvanceConfig {
|
||||
return AdvanceConfig{
|
||||
LogLevel: config.LogLevel,
|
||||
PersistStorage: config.PersistStorage,
|
||||
StorageHour: config.StorageHour,
|
||||
}
|
||||
}
|
||||
|
||||
func AdvanceConfigFromDTOToModel(config AdvanceConfig) models.AdvanceConfig {
|
||||
return models.AdvanceConfig{
|
||||
ID: constants.DefaultAdvanceConfigID,
|
||||
LogLevel: config.LogLevel,
|
||||
PersistStorage: config.PersistStorage,
|
||||
StorageHour: config.StorageHour,
|
||||
}
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
package dtos
|
||||
|
||||
import "encoding/json"
|
||||
|
||||
type ConfigNetWork struct {
|
||||
NcId string `json:"ncId"`
|
||||
LocalIp string `json:"localIp,omitempty"`
|
||||
GwIp string `json:"gwIp,omitempty"`
|
||||
SmIp string `json:"smIp,omitempty"`
|
||||
Netlink bool `json:"netlink,omitempty"`
|
||||
}
|
||||
|
||||
type ConfigNetworkUpdateRequest struct {
|
||||
NcId string `json:"ncId" binding:"required"`
|
||||
LocalIp string `json:"localIp" binding:"required,ipv4"`
|
||||
GwIp string `json:"gwIp" binding:"required,ipv4"`
|
||||
SmIp string `json:"smIp" binding:"required,ipv4"`
|
||||
}
|
||||
|
||||
type ConfigDnsUpdateRequest struct {
|
||||
Dns []string `json:"dns,omitempty" binding:"required"`
|
||||
OpenSwitch bool `json:"openSwitch,omitempty"`
|
||||
}
|
||||
|
||||
type ConfigNetWorkResponse struct {
|
||||
List []ConfigNetWork `json:"list"`
|
||||
}
|
||||
|
||||
func NewConfigNetWorkResponse() ConfigNetWorkResponse {
|
||||
return ConfigNetWorkResponse{List: make([]ConfigNetWork, 0)}
|
||||
}
|
||||
|
||||
func (d ConfigNetWorkResponse) MarshalBinary() ([]byte, error) {
|
||||
return json.Marshal(d)
|
||||
}
|
||||
|
||||
func (d *ConfigNetWorkResponse) UnmarshalBinary(data []byte) error {
|
||||
return json.Unmarshal(data, &d)
|
||||
}
|
||||
|
||||
type ConfigDnsResponse struct {
|
||||
Dns []string `json:"dns"`
|
||||
OpenSwitch bool `json:"openSwitch"`
|
||||
}
|
||||
|
||||
func (d ConfigDnsResponse) MarshalBinary() ([]byte, error) {
|
||||
return json.Marshal(d)
|
||||
}
|
|
@ -0,0 +1,60 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2017.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
|
||||
package dtos
|
||||
|
||||
import (
|
||||
"github.com/winc-link/hummingbird/internal/models"
|
||||
"github.com/winc-link/hummingbird/internal/pkg/constants"
|
||||
)
|
||||
|
||||
type DataResourceSearchQueryRequest struct {
|
||||
BaseSearchConditionQuery `schema:",inline"`
|
||||
Type string `schema:"type,omitempty"`
|
||||
Health string `schema:"health,omitempty"`
|
||||
}
|
||||
|
||||
type DataResourceInfo struct {
|
||||
Name string `json:"name"`
|
||||
Type string `json:"type"`
|
||||
Option map[string]interface{} `json:"option"`
|
||||
}
|
||||
|
||||
type AddDataResourceReq struct {
|
||||
Name string `json:"name"`
|
||||
Type string `json:"type"`
|
||||
Option map[string]interface{} `json:"option"`
|
||||
}
|
||||
|
||||
type UpdateDataResource struct {
|
||||
Id string `json:"id"`
|
||||
Name *string `json:"name"`
|
||||
Type *string `json:"type"`
|
||||
Option *map[string]interface{} `json:"option"`
|
||||
}
|
||||
|
||||
func ReplaceDataResourceModelFields(ds *models.DataResource, patch UpdateDataResource) {
|
||||
if patch.Name != nil {
|
||||
ds.Name = *patch.Name
|
||||
}
|
||||
if patch.Type != nil {
|
||||
ds.Type = constants.DataResourceType(*patch.Type)
|
||||
}
|
||||
if patch.Option != nil {
|
||||
ds.Option = *patch.Option
|
||||
ds.Option["sendSingle"] = true
|
||||
}
|
||||
ds.Health = false
|
||||
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2018 Dell Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
|
||||
package dtos
|
||||
|
||||
type Configuration struct {
|
||||
DbType string
|
||||
Host string
|
||||
Port string
|
||||
Timeout int
|
||||
DatabaseName string
|
||||
Username string
|
||||
Password string
|
||||
BatchSize int
|
||||
Dsn string
|
||||
// 添加sqlite数据库存储地址
|
||||
DataSource string
|
||||
// 添加tqlite集群地址
|
||||
Cluster []string
|
||||
}
|
|
@ -0,0 +1,324 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2017 Dell Inc.
|
||||
* Copyright (c) 2019 Intel Corporation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
package dtos
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"github.com/winc-link/hummingbird/internal/models"
|
||||
"github.com/winc-link/hummingbird/internal/pkg/constants"
|
||||
"github.com/winc-link/hummingbird/internal/pkg/utils"
|
||||
)
|
||||
|
||||
type DeviceSyncRequest struct {
|
||||
CloudInstanceId string `json:"cloud_instance_id"`
|
||||
DriveInstanceId string `json:"driver_instance_id"`
|
||||
//Extra struct{
|
||||
//
|
||||
//} `json:"extra"`
|
||||
//Aliyun *struct {
|
||||
// ResourceGroupId string `json:"resource_group_id"`
|
||||
//} `json:"ali_yun"`
|
||||
//HuaweiYun *struct {
|
||||
// ProjectId string `json:"project_id"`
|
||||
// AppId string `json:"app_id"`
|
||||
//} `json:"huawei_yun"`
|
||||
}
|
||||
|
||||
type DeviceSyncByIdRequest struct {
|
||||
DeviceId string `json:"device_id"`
|
||||
}
|
||||
|
||||
type DeviceStatusRequest struct {
|
||||
DeviceId string `json:"device_id"`
|
||||
}
|
||||
|
||||
type DeviceSearchQueryRequest struct {
|
||||
BaseSearchConditionQuery `schema:",inline"`
|
||||
Platform string `schema:"platform,omitempty"`
|
||||
Name string `schema:"name,omitempty"`
|
||||
ProductId string `schema:"product_id,omitempty"`
|
||||
CloudProductId string `schema:"cloud_product_id,omitempty"`
|
||||
CloudInstanceId string `schema:"cloud_instance_id,omitempty"`
|
||||
DriveInstanceId string `schema:"drive_instance_id,omitempty"`
|
||||
Status string `schema:"status,omitempty"`
|
||||
}
|
||||
|
||||
type DeviceSearchQueryResponse struct {
|
||||
Id string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
ProductId string `json:"product_id"`
|
||||
Status constants.DeviceStatus `json:"status"`
|
||||
Platform constants.IotPlatform `json:"platform"`
|
||||
CloudInstanceId string `json:"cloud_instance_id"`
|
||||
CloudProductId string `json:"cloud_product_id"`
|
||||
DriverServiceName string `json:"driver_service_name"`
|
||||
ProductName string `json:"product_name"`
|
||||
LastSyncTime int64 `json:"last_sync_time"`
|
||||
LastOnlineTime int64 `json:"last_online_time"`
|
||||
DriveInstanceId string `json:"drive_instance_id"`
|
||||
Created int64 `json:"created"`
|
||||
Description string `json:"description"`
|
||||
}
|
||||
|
||||
func DeviceResponseFromModel(p models.Device, deviceServiceName string) DeviceSearchQueryResponse {
|
||||
return DeviceSearchQueryResponse{
|
||||
Id: p.Id,
|
||||
ProductId: p.ProductId,
|
||||
Name: p.Name,
|
||||
Platform: p.Platform,
|
||||
Status: p.Status,
|
||||
DriverServiceName: deviceServiceName,
|
||||
CloudInstanceId: p.CloudInstanceId,
|
||||
CloudProductId: p.CloudProductId,
|
||||
ProductName: p.Product.Name,
|
||||
LastSyncTime: p.LastSyncTime,
|
||||
LastOnlineTime: p.LastOnlineTime,
|
||||
DriveInstanceId: p.DriveInstanceId,
|
||||
Created: p.Created,
|
||||
Description: p.Description,
|
||||
}
|
||||
}
|
||||
|
||||
type OpenApiDeviceStatus struct {
|
||||
Status constants.DeviceStatus `json:"status"`
|
||||
}
|
||||
|
||||
type OpenApiDeviceInfoResponse struct {
|
||||
Id string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Platform constants.IotPlatform `json:"platform"`
|
||||
Status constants.DeviceStatus `json:"status"`
|
||||
Description string `json:"description"`
|
||||
ProductId string `json:"product_id"`
|
||||
ProductName string `json:"product_name"`
|
||||
//Secret string `json:"secret"`
|
||||
LastOnlineTime int64 `json:"last_online_time"`
|
||||
Created int64 `json:"created_at"`
|
||||
}
|
||||
|
||||
func OpenApiDeviceInfoResponseFromModel(p models.Device) OpenApiDeviceInfoResponse {
|
||||
return OpenApiDeviceInfoResponse{
|
||||
Id: p.Id,
|
||||
Name: p.Name,
|
||||
Platform: p.Platform,
|
||||
Status: p.Status,
|
||||
Description: p.Description,
|
||||
ProductId: p.ProductId,
|
||||
ProductName: p.Product.Name,
|
||||
//Secret: p.Secret,
|
||||
LastOnlineTime: p.LastOnlineTime,
|
||||
Created: p.Created,
|
||||
}
|
||||
}
|
||||
|
||||
type DeviceInfoResponse struct {
|
||||
Id string `json:"id"`
|
||||
CloudDeviceId string `json:"cloud_device_id"`
|
||||
CloudProductId string `json:"cloud_product_id"`
|
||||
CloudInstanceId string `json:"cloud_instance_id"`
|
||||
Name string `json:"name"`
|
||||
Status constants.DeviceStatus `json:"status"`
|
||||
Description string `json:"description"`
|
||||
ProductId string `json:"product_id"`
|
||||
ProductName string `json:"product_name"`
|
||||
Secret string `json:"secret"`
|
||||
Platform constants.IotPlatform `json:"platform"`
|
||||
DeviceServiceName string `json:"device_service_name"`
|
||||
LastSyncTime int64 `json:"last_sync_time"`
|
||||
LastOnlineTime int64 `json:"last_online_time"`
|
||||
Created int64 `json:"create_at"`
|
||||
}
|
||||
|
||||
func DeviceInfoResponseFromModel(p models.Device, deviceServiceName string) DeviceInfoResponse {
|
||||
return DeviceInfoResponse{
|
||||
Id: p.Id,
|
||||
CloudDeviceId: p.CloudDeviceId,
|
||||
CloudProductId: p.CloudProductId,
|
||||
Name: p.Name,
|
||||
Status: p.Status,
|
||||
Description: p.Description,
|
||||
ProductId: p.ProductId,
|
||||
ProductName: p.Product.Name,
|
||||
Secret: p.Secret,
|
||||
Platform: p.Platform,
|
||||
DeviceServiceName: deviceServiceName,
|
||||
LastSyncTime: p.LastSyncTime,
|
||||
LastOnlineTime: p.LastOnlineTime,
|
||||
Created: p.Created,
|
||||
CloudInstanceId: p.CloudInstanceId,
|
||||
}
|
||||
}
|
||||
|
||||
type DeviceReportPropertiesValueSearchRequest struct {
|
||||
DeviceId string `json:"device_id"`
|
||||
}
|
||||
|
||||
type PropertyInfo struct {
|
||||
Code string `json:"code,omitempty"`
|
||||
Value string `json:"value,omitempty"`
|
||||
DataType string `json:"dataType,omitempty"`
|
||||
Time string `json:"time,omitempty"`
|
||||
Unit string `json:"unit,omitempty"`
|
||||
Name string `json:"name,omitempty"`
|
||||
}
|
||||
|
||||
type DeviceReportPropertiesValueSearchResponse struct {
|
||||
PropertyInfoList []PropertyInfo `json:"property_info_list"`
|
||||
}
|
||||
|
||||
type DeviceAddRequest struct {
|
||||
DeviceId string `json:"device_id"`
|
||||
Name string `json:"name"`
|
||||
ProductId string `json:"product_id"`
|
||||
Description string `json:"description"`
|
||||
Platform constants.IotPlatform `json:"platform"`
|
||||
DriverInstanceId string `json:"driver_instance_id"`
|
||||
//CloudDeviceId string `json:"cloud_device_id"`
|
||||
//CloudProductId string `json:"cloud_product_id"`
|
||||
//CloudInstanceId string `gorm:"index"`
|
||||
//Status constants.DeviceStatus `json:"status"`
|
||||
//Secret string `json:"secret"`
|
||||
}
|
||||
|
||||
type DeviceAuthInfoResponse struct {
|
||||
ClientId string `json:"clientId"`
|
||||
UserName string `json:"username"`
|
||||
Password string `json:"password"`
|
||||
Host string `json:"mqttHostUrl"`
|
||||
Port int `json:"port"`
|
||||
}
|
||||
|
||||
func DeviceAuthInfoResponseFromModel(p models.MqttAuth) DeviceAuthInfoResponse {
|
||||
ip, _ := utils.GetOutBoundIP()
|
||||
return DeviceAuthInfoResponse{
|
||||
ClientId: p.ClientId,
|
||||
UserName: p.UserName,
|
||||
Password: p.Password,
|
||||
Host: ip,
|
||||
Port: 58090,
|
||||
}
|
||||
}
|
||||
|
||||
type DeviceUpdateRequest struct {
|
||||
Id string `json:"id"`
|
||||
Description *string `json:"description"`
|
||||
//Ip *string `json:"ip"`
|
||||
//Lat *string `json:"lat"`
|
||||
//Lon *string `json:"lon"`
|
||||
Name *string `json:"name"`
|
||||
InstallLocation *string `json:"install_location"`
|
||||
DriveInstanceId *string `json:"drive_instance_id"`
|
||||
}
|
||||
|
||||
func ReplaceDeviceModelFields(ds *models.Device, patch DeviceUpdateRequest) {
|
||||
if patch.Description != nil {
|
||||
ds.Description = *patch.Description
|
||||
}
|
||||
if patch.Name != nil {
|
||||
ds.Name = *patch.Name
|
||||
}
|
||||
//
|
||||
//if patch.Lat != nil {
|
||||
// ds.Lat = *patch.Lat
|
||||
//}
|
||||
//
|
||||
//if patch.Lon != nil {
|
||||
// ds.Lon = *patch.Lon
|
||||
//}
|
||||
if patch.DriveInstanceId != nil {
|
||||
ds.DriveInstanceId = *patch.DriveInstanceId
|
||||
}
|
||||
|
||||
if patch.InstallLocation != nil {
|
||||
ds.InstallLocation = *patch.InstallLocation
|
||||
}
|
||||
}
|
||||
|
||||
type DeviceUpdateOrCreateCallBack struct {
|
||||
Id string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Description string `json:"description"`
|
||||
ProductId string `json:"product_id"`
|
||||
Status constants.DeviceStatus `json:"status"`
|
||||
Platform constants.IotPlatform `json:"platform"`
|
||||
DriveInstanceId string `json:"drive_instance_id"`
|
||||
}
|
||||
|
||||
type DeviceDeleteCallBack struct {
|
||||
Id string `json:"id"`
|
||||
DriveInstanceId string `json:"drive_instance_id"`
|
||||
}
|
||||
|
||||
type DeviceImportTemplateRequest struct {
|
||||
}
|
||||
|
||||
type DevicesImport struct {
|
||||
ProductId string `schema:"product_id,omitempty"`
|
||||
DriverInstanceId string `schema:"driver_instance_id,omitempty"`
|
||||
}
|
||||
|
||||
type DeviceBatchDelete struct {
|
||||
DeviceIds []string `json:"device_ids"`
|
||||
}
|
||||
|
||||
type DevicesBindDriver struct {
|
||||
DeviceIds []string `json:"device_ids"`
|
||||
DriverInstanceId string `json:"driver_instance_id,omitempty"`
|
||||
}
|
||||
|
||||
type DevicesBindProductId struct {
|
||||
ProductId string `json:"product_id"`
|
||||
DriverInstanceId string `json:"driver_instance_id,omitempty"`
|
||||
}
|
||||
|
||||
type DevicesUnBindDriver struct {
|
||||
DeviceIds []string `json:"device_ids"`
|
||||
}
|
||||
|
||||
type AddMqttAuthInfoRequest struct {
|
||||
Id string `json:"id"`
|
||||
ClientId string `json:"client_id"`
|
||||
UserName string `json:"username"`
|
||||
Password string `json:"password"`
|
||||
ResourceId string `json:"resource_id"`
|
||||
ResourceType string `json:"resource_type"`
|
||||
}
|
||||
|
||||
type DeviceExecRes struct {
|
||||
Result bool `json:"result"`
|
||||
Message string `json:"message"`
|
||||
}
|
||||
|
||||
func (d *DeviceExecRes) ToString() string {
|
||||
b, _ := json.Marshal(d)
|
||||
return string(b)
|
||||
}
|
||||
|
||||
type JobAction struct {
|
||||
ActionType string `json:"actionType"`
|
||||
ProductId string `json:"productId"`
|
||||
ProductName string `json:"product_name"`
|
||||
DeviceId string `json:"deviceId"`
|
||||
DeviceName string `json:"deviceName"`
|
||||
Code string `json:"code"`
|
||||
DateType string `json:"dateType"`
|
||||
Value interface{} `json:"value"`
|
||||
}
|
||||
|
||||
type InvokeDeviceServiceReq struct {
|
||||
DeviceId string `json:"deviceId"`
|
||||
Code string `json:"code"`
|
||||
Items map[string]interface{} `json:"inputParams"`
|
||||
}
|
|
@ -0,0 +1,205 @@
|
|||
package dtos
|
||||
|
||||
import (
|
||||
"github.com/winc-link/hummingbird/internal/models"
|
||||
)
|
||||
|
||||
type DeviceLibrary struct {
|
||||
Id string
|
||||
Name string // 容器名/软件名
|
||||
Alias string
|
||||
Description string
|
||||
Protocol string
|
||||
Version string
|
||||
LibFile string
|
||||
ConfigFile string
|
||||
Config string
|
||||
DockerConfigId string
|
||||
DockerRepoName string
|
||||
DockerImageId string
|
||||
//SupportVersions []DeviceLibrarySupportVersion
|
||||
IsInternal bool
|
||||
OperateStatus string // 下载状态
|
||||
}
|
||||
|
||||
func DeviceLibraryFromModel(d models.DeviceLibrary) DeviceLibrary {
|
||||
return DeviceLibrary{
|
||||
Id: d.Id,
|
||||
Name: d.Name,
|
||||
Description: d.Description,
|
||||
Protocol: d.Protocol,
|
||||
Version: d.Version,
|
||||
//LibFile: d.LibFile,
|
||||
//ConfigFile: d.ConfigFile,
|
||||
DockerConfigId: d.DockerConfigId,
|
||||
DockerRepoName: d.DockerRepoName,
|
||||
DockerImageId: d.DockerImageId,
|
||||
//SupportVersions: SupperVersionsFromModel(d.SupportVersions),
|
||||
}
|
||||
}
|
||||
|
||||
type DeviceLibraryAddRequest struct {
|
||||
Id string `json:"id,omitempty"`
|
||||
Name string `json:"name" binding:"required"`
|
||||
Description string `json:"description,omitempty"`
|
||||
Protocol string `json:"protocol"`
|
||||
Version string `json:"version" binding:"required"`
|
||||
ContainerName string `json:"container_name" binding:"required"`
|
||||
DockerConfigId string `json:"docker_config_id" binding:"required"`
|
||||
DockerRepoName string `json:"docker_repo_name" binding:"required"`
|
||||
Language string `json:"language"` //代码语言
|
||||
SupportVersion struct {
|
||||
IsDefault bool `json:"is_default"`
|
||||
DockerParamsSwitch bool `json:"docker_params_switch"`
|
||||
DockerParams string `json:"docker_params"`
|
||||
ExpertMode bool `json:"expert_mode"`
|
||||
ExpertModeContent string `json:"expert_mode_content"`
|
||||
ConfigJson string `json:"config_json"`
|
||||
} `json:"support_version"`
|
||||
}
|
||||
|
||||
func FromDeviceLibraryRpcToModel(p *DeviceLibraryAddRequest) models.DeviceLibrary {
|
||||
dl := models.DeviceLibrary{
|
||||
Id: p.Id,
|
||||
Name: p.Name,
|
||||
Description: p.Description,
|
||||
Protocol: p.Protocol,
|
||||
Version: p.Version,
|
||||
ContainerName: p.ContainerName,
|
||||
DockerRepoName: p.DockerRepoName,
|
||||
DockerConfigId: p.DockerConfigId,
|
||||
Language: p.Language,
|
||||
}
|
||||
//dl.SupportVersions = append(dl.SupportVersions, models.SupportVersion{
|
||||
// Version: p.Version,
|
||||
// IsDefault: p.IsDefault,
|
||||
// ConfigJson: p.ConfigJson,
|
||||
// ConfigFile: p.ConfigFile,
|
||||
// DockerParamsSwitch: p.DockerParamsSwitch,
|
||||
// DockerParams: s.DockerParams,
|
||||
// ExpertMode: s.ExpertMode,
|
||||
// ExpertModeContent: s.ExpertModeContent,
|
||||
//})
|
||||
return dl
|
||||
}
|
||||
|
||||
type DeviceLibrarySearchQueryRequest struct {
|
||||
BaseSearchConditionQuery `schema:",inline"`
|
||||
DockerConfigId string `form:"docker_config_id" json:"docker_config_id"`
|
||||
IsInternal string `form:"is_internal" json:"is_internal"`
|
||||
ClassifyId int `form:"classify_id" json:"classify_id"`
|
||||
DockerRepoName string `form:"docker_repo_name" json:"docker_repo_name"`
|
||||
NameAliasLike string `form:"name_alias_like" json:"name_alias_like"`
|
||||
DownloadStatus string `form:"download_status" json:"download_status"`
|
||||
DriverType int `form:"driver_type" json:"driver_type" binding:"omitempty,oneof=1 2"` // 驱动库类型,1:驱动,2:三方应用
|
||||
NoInIds string // 约定,没有from的为 内置查询条件
|
||||
ImageIds string // 内置条件
|
||||
NoInImageIds string // 内置条件
|
||||
}
|
||||
|
||||
type DeviceLibraryResponse struct {
|
||||
Id string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
//Alias string `json:"alias"`
|
||||
Description string `json:"description"`
|
||||
//Manufacturer string `json:"manufacturer"`
|
||||
Protocol string `json:"protocol"`
|
||||
Version string `json:"version"`
|
||||
ContainerName string `json:"container_name"`
|
||||
//ConfigFile string `json:"config_file"`
|
||||
DockerConfigId string `json:"docker_config_id"`
|
||||
DockerRepoName string `json:"docker_repo_name"`
|
||||
OperateStatus string `json:"operate_status"`
|
||||
IsInternal bool `json:"is_internal"`
|
||||
Manual string `json:"manual"`
|
||||
Icon string `json:"icon"`
|
||||
ClassifyId int `json:"classify_id"`
|
||||
Created int64 `json:"created"`
|
||||
Language string `json:"language"`
|
||||
SupportVersions []DeviceLibrarySupportVersionSimple `json:"support_versions"` // 用于前端展示可供下载/更新的版本号 key:value == 版本号:配置文件
|
||||
}
|
||||
|
||||
func DeviceLibraryResponseFromModel(dl models.DeviceLibrary) DeviceLibraryResponse {
|
||||
// 如果docker镜像id为空,那么返回给前端的版本为 `-`
|
||||
if dl.DockerImageId == "" {
|
||||
dl.Version = "-"
|
||||
}
|
||||
//if dl.ConfigFile != "" {
|
||||
// dl.ConfigFile = path.Base(dl.ConfigFile)
|
||||
//}
|
||||
|
||||
return DeviceLibraryResponse{
|
||||
Id: dl.Id,
|
||||
Name: dl.Name,
|
||||
Description: dl.Description,
|
||||
Protocol: dl.Protocol,
|
||||
Version: dl.Version,
|
||||
ContainerName: dl.ContainerName,
|
||||
//ConfigFile: dl.ConfigFile,
|
||||
IsInternal: dl.IsInternal,
|
||||
DockerConfigId: dl.DockerConfigId,
|
||||
DockerRepoName: dl.DockerRepoName,
|
||||
OperateStatus: dl.OperateStatus,
|
||||
Icon: dl.Icon,
|
||||
Manual: dl.Manual,
|
||||
ClassifyId: dl.ClassifyId,
|
||||
Created: dl.Created,
|
||||
Language: dl.Language,
|
||||
SupportVersions: DeviceLibrarySupportVersionSimpleFromModel(dl.SupportVersions),
|
||||
}
|
||||
}
|
||||
|
||||
type DeviceLibraryUpgradeRequest struct {
|
||||
Id string `json:"id" binding:"required"`
|
||||
Version string `json:"version" binding:"required"`
|
||||
}
|
||||
|
||||
type DeviceLibraryUpgradeResponse struct {
|
||||
Id string `json:"id"`
|
||||
Version string `json:"version"`
|
||||
OperateStatus string `json:"operate_status"`
|
||||
}
|
||||
|
||||
func GetLibrarySimpleBaseConfig() string {
|
||||
return `{"deviceServer": {},"deviceProtocols": {},"deviceDpAttrs": []}`
|
||||
}
|
||||
|
||||
type UpdateDeviceLibrary struct {
|
||||
Id string `json:"id" binding:"required"`
|
||||
Name *string `json:"name"`
|
||||
Description *string `json:"description"`
|
||||
DockerConfigId *string `json:"docker_config_id"`
|
||||
Protocol *string `json:"protocol"`
|
||||
Language *string `json:"language"`
|
||||
Manual *string `json:"manual"`
|
||||
Icon *string `json:"icon"`
|
||||
}
|
||||
|
||||
func ReplaceDeviceLibraryModelFieldsWithDTO(deviceLibrary *models.DeviceLibrary, patch UpdateDeviceLibrary) {
|
||||
if patch.Name != nil {
|
||||
deviceLibrary.Name = *patch.Name
|
||||
}
|
||||
|
||||
if patch.DockerConfigId != nil {
|
||||
deviceLibrary.DockerConfigId = *patch.DockerConfigId
|
||||
}
|
||||
|
||||
if patch.Description != nil {
|
||||
deviceLibrary.Description = *patch.Description
|
||||
}
|
||||
|
||||
if patch.Protocol != nil {
|
||||
deviceLibrary.Protocol = *patch.Protocol
|
||||
}
|
||||
|
||||
if patch.Language != nil {
|
||||
deviceLibrary.Language = *patch.Language
|
||||
}
|
||||
|
||||
if patch.Manual != nil {
|
||||
deviceLibrary.Manual = *patch.Manual
|
||||
}
|
||||
if patch.Icon != nil {
|
||||
deviceLibrary.Icon = *patch.Icon
|
||||
}
|
||||
}
|
|
@ -0,0 +1,343 @@
|
|||
package dtos
|
||||
|
||||
import (
|
||||
"github.com/winc-link/hummingbird/internal/models"
|
||||
"github.com/winc-link/hummingbird/internal/pkg/constants"
|
||||
|
||||
//"gitlab.com/tedge/edgex/internal/models"
|
||||
//devicelibraryProto "gitlab.com/tedge/edgex/proto/devicelibrary"
|
||||
//deviceserviceProto "gitlab.com/tedge/edgex/proto/deviceservice"
|
||||
"gopkg.in/yaml.v3"
|
||||
)
|
||||
|
||||
type DeviceService struct {
|
||||
Id string `json:"id,omitempty"`
|
||||
Name string `json:"name"`
|
||||
Created int64 `json:"created,omitempty"`
|
||||
Modified int64 `json:"modified,omitempty"`
|
||||
BaseAddress string `json:"baseAddress"`
|
||||
DeviceLibraryId string `json:"deviceLibraryId"`
|
||||
Config map[string]interface{} `json:"config"`
|
||||
DockerContainerId string `json:"dockerContainerId"`
|
||||
ExpertMode bool `json:"isExpertMode"`
|
||||
ExpertModeContent string `json:"expertModeContent"`
|
||||
DockerParamsSwitch bool `json:"dockerParamsSwitch"`
|
||||
DockerParams string `json:"dockerParams"`
|
||||
ContainerName string `json:"container_name"`
|
||||
}
|
||||
|
||||
// 启动实例时对应的配置
|
||||
type RunServiceCfg struct {
|
||||
ImageRepo string
|
||||
RunConfig string
|
||||
DockerMountDevices []string
|
||||
DockerParams string
|
||||
DriverName string // 驱动名
|
||||
}
|
||||
|
||||
func DeviceServiceFromModel(ds models.DeviceService) DeviceService {
|
||||
var dto DeviceService
|
||||
dto.Id = ds.Id
|
||||
dto.Name = ds.Name
|
||||
dto.BaseAddress = ds.BaseAddress
|
||||
dto.DeviceLibraryId = ds.DeviceLibraryId
|
||||
dto.Config = ds.Config
|
||||
dto.DockerContainerId = ds.DockerContainerId
|
||||
dto.ExpertMode = ds.ExpertMode
|
||||
dto.ExpertModeContent = ds.ExpertModeContent
|
||||
dto.DockerParamsSwitch = ds.DockerParamsSwitch
|
||||
dto.DockerParams = ds.DockerParams
|
||||
dto.ContainerName = ds.ContainerName
|
||||
return dto
|
||||
}
|
||||
|
||||
//func FromDeviceServiceModelToRPC(mds models.DeviceService) *deviceserviceProto.DeviceService {
|
||||
// byteConfig, _ := json.Marshal(mds.Config)
|
||||
// var ds deviceserviceProto.DeviceService
|
||||
// ds.Id = mds.Id
|
||||
// ds.Name = mds.Name
|
||||
// ds.BaseAddress = mds.BaseAddress
|
||||
// ds.DeviceLibraryId = mds.DeviceLibraryId
|
||||
// ds.DockerContainerId = mds.DockerContainerId
|
||||
// ds.Config = byteConfig
|
||||
// ds.ExpertMode = mds.ExpertMode
|
||||
// ds.ExpertModeContent = mds.ExpertModeContent
|
||||
// ds.DockerParamsSwitch = mds.DockerParamsSwitch
|
||||
// ds.DockerParams = mds.DockerParams
|
||||
// ds.LogLevel = int64(mds.LogLevel)
|
||||
// ds.RunStatus = int32(mds.RunStatus)
|
||||
// ds.ImageExist = mds.ImageExist
|
||||
// return &ds
|
||||
//}
|
||||
|
||||
//func FromDeviceServiceRpcToModel(ds *deviceserviceProto.DeviceService) models.DeviceService {
|
||||
// var config map[string]interface{}
|
||||
// if ds.Config != nil {
|
||||
// _ = json.Unmarshal(ds.Config, &config)
|
||||
// }
|
||||
//
|
||||
// var mds models.DeviceService
|
||||
// mds.Id = ds.Id
|
||||
// mds.Name = ds.Name
|
||||
// mds.BaseAddress = ds.BaseAddress
|
||||
// mds.DeviceLibraryId = ds.DeviceLibraryId
|
||||
// mds.DockerContainerId = ds.DockerContainerId
|
||||
// mds.RunStatus = int(ds.RunStatus)
|
||||
// mds.Config = config
|
||||
// mds.ExpertMode = ds.ExpertMode
|
||||
// mds.ExpertModeContent = ds.ExpertModeContent
|
||||
// mds.DockerParamsSwitch = ds.DockerParamsSwitch
|
||||
// mds.DockerParams = ds.DockerParams
|
||||
// mds.ImageExist = ds.ImageExist
|
||||
// mds.DriverType = int(ds.DriverType)
|
||||
// return mds
|
||||
//}
|
||||
|
||||
type DeviceServiceAddRequest struct {
|
||||
Id string `json:"id,omitempty" binding:"omitempty,t-special-char"`
|
||||
Name string `json:"name"`
|
||||
DeviceLibraryId string `json:"deviceLibraryId" binding:"required"`
|
||||
Config map[string]interface{} `json:"config" binding:"required"`
|
||||
ExpertMode bool `json:"expertMode"`
|
||||
ExpertModeContent string `json:"expertModeContent"`
|
||||
DockerParamsSwitch bool `json:"dockerParamsSwitch"`
|
||||
DockerParams string `json:"dockerParams"`
|
||||
DriverType int `json:"driverType" binding:"omitempty,oneof=1 2"` //驱动库类型,1:驱动,2:三方应用
|
||||
}
|
||||
|
||||
//func FromDeviceServiceAddToRpc(req DeviceServiceAddRequest) *deviceserviceProto.DeviceService {
|
||||
// byteConfig, _ := json.Marshal(req.Config)
|
||||
// return &deviceserviceProto.DeviceService{
|
||||
// Id: req.Id,
|
||||
// Name: req.Name,
|
||||
// DeviceLibraryId: req.DeviceLibraryId,
|
||||
// Config: byteConfig,
|
||||
// ExpertMode: req.ExpertMode,
|
||||
// ExpertModeContent: req.ExpertModeContent,
|
||||
// DockerParamsSwitch: req.DockerParamsSwitch,
|
||||
// DockerParams: req.DockerParams,
|
||||
// DriverType: int32(req.DriverType),
|
||||
// }
|
||||
//}
|
||||
|
||||
func DeviceServiceFromDeviceServiceAddRequest(ds DeviceServiceAddRequest) models.DeviceService {
|
||||
var mds models.DeviceService
|
||||
mds.Id = ds.Id
|
||||
mds.Name = ds.Name
|
||||
mds.Config = ds.Config
|
||||
mds.DeviceLibraryId = ds.DeviceLibraryId
|
||||
mds.ExpertMode = ds.ExpertMode
|
||||
mds.ExpertModeContent = ds.ExpertModeContent
|
||||
mds.DockerParamsSwitch = ds.DockerParamsSwitch
|
||||
mds.DockerParams = ds.DockerParams
|
||||
mds.DriverType = ds.DriverType
|
||||
return mds
|
||||
}
|
||||
|
||||
type DeviceServiceUpdateRequest struct {
|
||||
Id string `json:"id" binding:"required"`
|
||||
DeviceLibraryId *string `json:"deviceLibraryId"`
|
||||
Name *string `json:"name"`
|
||||
Config *map[string]interface{} `json:"config"`
|
||||
ExpertMode *bool `json:"expertMode"`
|
||||
ExpertModeContent *string `json:"expertModeContent"`
|
||||
DockerParamsSwitch *bool `json:"docker_params_switch"`
|
||||
DockerParams *string `json:"docker_params"`
|
||||
Platform constants.IotPlatform `json:"platform"`
|
||||
//IsIgnoreRunStatus bool
|
||||
}
|
||||
|
||||
//func FromRpcToUpdateDeviceService(rpc *deviceserviceProto.UpdateDeviceService) DeviceServiceUpdateRequest {
|
||||
// var config map[string]interface{}
|
||||
// if rpc.Config != nil {
|
||||
// _ = json.Unmarshal(rpc.Config, &config)
|
||||
// }
|
||||
// return DeviceServiceUpdateRequest{
|
||||
// Id: rpc.Id,
|
||||
// Name: rpc.Name,
|
||||
// DeviceLibraryId: rpc.DeviceLibraryId,
|
||||
// Config: &config,
|
||||
// ExpertMode: rpc.ExpertMode,
|
||||
// ExpertModeContent: rpc.ExpertModeContent,
|
||||
// DockerParamsSwitch: rpc.DockerParamsSwitch,
|
||||
// DockerParams: rpc.DockerParams,
|
||||
// }
|
||||
//}
|
||||
|
||||
type UpdateDeviceServiceRunStatusRequest struct {
|
||||
Id string `json:"id"`
|
||||
RunStatus int `json:"run_status" binding:"required,oneof=1 2"`
|
||||
}
|
||||
|
||||
type DeviceServiceRunLogRequest struct {
|
||||
Id string `json:"id"`
|
||||
Operate int `json:"operate" binding:"required,oneof=1 2"`
|
||||
}
|
||||
|
||||
type DeviceServiceDeleteRequest struct {
|
||||
Id string `json:"id" binding:"required"`
|
||||
}
|
||||
|
||||
//func FromUpdateDeviceServiceRunStatusToRpc(req UpdateDeviceServiceRunStatusRequest) *deviceserviceProto.UpdateDeviceServiceRunStatusRequest {
|
||||
// return &deviceserviceProto.UpdateDeviceServiceRunStatusRequest{
|
||||
// Id: req.Id,
|
||||
// RunStatus: int32(req.RunStatus),
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//func FromDeviceServiceSearchQueryRequestToRpc(req DeviceServiceSearchQueryRequest) *deviceserviceProto.DeviceServiceSearchRequest {
|
||||
// return &deviceserviceProto.DeviceServiceSearchRequest{
|
||||
// BaseSearchConditionQuery: FromBaseSearchConditionQueryToRpc(req.BaseSearchConditionQuery),
|
||||
// DeviceLibraryId: req.DeviceLibraryId,
|
||||
// DriverType: int32(req.DriverType),
|
||||
// }
|
||||
//}
|
||||
|
||||
//func FromRpcToUpdateDeviceServiceRunStatus(rpc *deviceserviceProto.UpdateDeviceServiceRunStatusRequest) UpdateDeviceServiceRunStatusRequest {
|
||||
// return UpdateDeviceServiceRunStatusRequest{
|
||||
// Id: rpc.Id,
|
||||
// RunStatus: int(rpc.RunStatus),
|
||||
// }
|
||||
//}
|
||||
|
||||
func ReplaceDeviceServiceModelFieldsWithDTO(ds *models.DeviceService, patch DeviceServiceUpdateRequest) {
|
||||
if patch.Config != nil {
|
||||
ds.Config = *patch.Config
|
||||
}
|
||||
if patch.DeviceLibraryId != nil {
|
||||
ds.DeviceLibraryId = *patch.DeviceLibraryId
|
||||
}
|
||||
if patch.ExpertMode != nil {
|
||||
ds.ExpertMode = *patch.ExpertMode
|
||||
}
|
||||
if patch.ExpertModeContent != nil {
|
||||
ds.ExpertModeContent = *patch.ExpertModeContent
|
||||
}
|
||||
if patch.DockerParamsSwitch != nil {
|
||||
ds.DockerParamsSwitch = *patch.DockerParamsSwitch
|
||||
}
|
||||
if patch.DockerParams != nil {
|
||||
ds.DockerParams = *patch.DockerParams
|
||||
}
|
||||
if patch.Platform != "" {
|
||||
ds.Platform = patch.Platform
|
||||
}
|
||||
}
|
||||
|
||||
type DeviceServiceSearchQueryRequest struct {
|
||||
BaseSearchConditionQuery `schema:",inline"`
|
||||
ProductId string `form:"productId"`
|
||||
CloudProductId string `form:"cloudProductId"`
|
||||
DeviceLibraryId string `form:"deviceLibraryId"` // 驱动库ID
|
||||
DeviceLibraryIds string `form:"deviceLibraryIds"` // 驱动库IDs
|
||||
Platform string `form:"platform"`
|
||||
DriverType int `form:"driver_type" binding:"omitempty,oneof=1 2"` //驱动库类型,1:驱动,2:三方应用
|
||||
}
|
||||
|
||||
//func ToDeviceServiceSearchQueryRequestDTO(req *deviceserviceProto.DeviceServiceSearchRequest) DeviceServiceSearchQueryRequest {
|
||||
//
|
||||
// if req.BaseSearchConditionQuery == nil {
|
||||
// return DeviceServiceSearchQueryRequest{
|
||||
// DeviceLibraryId: req.DeviceLibraryId,
|
||||
// DriverType: int(req.DriverType),
|
||||
// }
|
||||
// } else {
|
||||
// return DeviceServiceSearchQueryRequest{
|
||||
// BaseSearchConditionQuery: ToBaseSearchConditionQueryDTO(req.BaseSearchConditionQuery),
|
||||
// DeviceLibraryId: req.DeviceLibraryId,
|
||||
// DriverType: int(req.DriverType),
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
//func FromDeviceServiceUpdateToRpc(req DeviceServiceUpdateRequest) *deviceserviceProto.UpdateDeviceService {
|
||||
// var byteConfig []byte
|
||||
// if req.Config != nil {
|
||||
// byteConfig, _ = json.Marshal(&req.Config)
|
||||
// } else {
|
||||
// byteConfig = nil
|
||||
// }
|
||||
//
|
||||
// return &deviceserviceProto.UpdateDeviceService{
|
||||
// Id: req.Id,
|
||||
// Name: req.Name,
|
||||
// DeviceLibraryId: req.DeviceLibraryId,
|
||||
// Config: byteConfig,
|
||||
// ExpertMode: req.ExpertMode,
|
||||
// ExpertModeContent: req.ExpertModeContent,
|
||||
// DockerParamsSwitch: req.DockerParamsSwitch,
|
||||
// DockerParams: req.DockerParams,
|
||||
// }
|
||||
//}
|
||||
|
||||
/************** Response **************/
|
||||
|
||||
type DeviceServiceResponse struct {
|
||||
Id string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
DeviceLibrary DeviceLibraryResponse `json:"deviceLibrary"`
|
||||
//Version string `json:"version"`
|
||||
RunStatus int `json:"runStatus"`
|
||||
Config interface{} `json:"config"`
|
||||
ExpertMode bool `json:"expertMode"`
|
||||
ExpertModeContent string `json:"expertModeContent"`
|
||||
DockerParamsSwitch bool `json:"dockerParamsSwitch"`
|
||||
DockerParams string `json:"dockerParams"`
|
||||
CreateAt int64 `json:"create_at"`
|
||||
ImageExist bool `json:"imageExist"`
|
||||
Platform string `json:"platform"`
|
||||
}
|
||||
|
||||
func DeviceServiceResponseFromModel(ds models.DeviceService, dl models.DeviceLibrary) DeviceServiceResponse {
|
||||
return DeviceServiceResponse{
|
||||
Id: ds.Id,
|
||||
Name: ds.Name,
|
||||
//Version: DeviceLibraryResponseFromModel(dl).Version,
|
||||
DeviceLibrary: DeviceLibraryResponseFromModel(dl),
|
||||
RunStatus: ds.RunStatus,
|
||||
Config: ds.Config,
|
||||
ExpertMode: ds.ExpertMode,
|
||||
ExpertModeContent: ds.ExpertModeContent,
|
||||
DockerParamsSwitch: ds.DockerParamsSwitch,
|
||||
DockerParams: ds.DockerParams,
|
||||
ImageExist: ds.ImageExist,
|
||||
CreateAt: ds.Created,
|
||||
Platform: string(ds.Platform),
|
||||
}
|
||||
}
|
||||
|
||||
//func FromDeviceServiceRpcToResponse(ds *deviceserviceProto.DeviceService, dl *devicelibraryProto.DeviceLibrary) DeviceServiceResponse {
|
||||
// var cfg map[string]interface{}
|
||||
// _ = json.Unmarshal(ds.Config, &cfg)
|
||||
// return DeviceServiceResponse{
|
||||
// Id: ds.Id,
|
||||
// Name: ds.Name,
|
||||
// RunStatus: int(ds.RunStatus),
|
||||
// DeviceLibrary: FromDeviceLibraryRpcToResponse(dl),
|
||||
// Config: cfg,
|
||||
// ExpertMode: ds.ExpertMode,
|
||||
// ExpertModeContent: ds.ExpertModeContent,
|
||||
// DockerParamsSwitch: ds.DockerParamsSwitch,
|
||||
// DockerParams: ds.DockerParams,
|
||||
// ImageExist: ds.ImageExist,
|
||||
// }
|
||||
//}
|
||||
|
||||
func FromYamlStrToMap(yamlStr string) (m map[string]interface{}, err error) {
|
||||
err = yaml.Unmarshal([]byte(yamlStr), &m)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return m, nil
|
||||
}
|
||||
|
||||
type UpdateDeviceServiceRunStatusResponse struct {
|
||||
Id string `json:"id"`
|
||||
RunStatus int `json:"run_status"`
|
||||
}
|
||||
|
||||
type UpdateServiceLogLevelConfigRequest struct {
|
||||
Id string `json:"id"` // 驱动或应用ID
|
||||
LogLevel int64 `json:"logLevel"`
|
||||
}
|
|
@ -0,0 +1,93 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2017 Dell Inc.
|
||||
* Copyright (c) 2019 Intel Corporation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
package dtos
|
||||
|
||||
import (
|
||||
"github.com/winc-link/hummingbird/internal/models"
|
||||
"github.com/winc-link/hummingbird/internal/pkg/constants"
|
||||
)
|
||||
|
||||
type DockerConfig struct {
|
||||
Id string
|
||||
Address string
|
||||
Account string
|
||||
Password string
|
||||
SaltKey string
|
||||
}
|
||||
|
||||
func DockerConfigFromModel(dc models.DockerConfig) DockerConfig {
|
||||
return DockerConfig{
|
||||
Id: dc.Id,
|
||||
Address: dc.Address,
|
||||
Account: dc.Account,
|
||||
Password: dc.Password,
|
||||
SaltKey: dc.SaltKey,
|
||||
}
|
||||
}
|
||||
|
||||
func WincLinkDockerConfig() DockerConfig {
|
||||
return DockerConfig{
|
||||
Address: constants.Address,
|
||||
Password: constants.Password,
|
||||
Account: constants.Account,
|
||||
SaltKey: constants.SaltKey,
|
||||
}
|
||||
}
|
||||
|
||||
type DockerConfigAddRequest struct {
|
||||
Id string `json:"id"`
|
||||
Address string `json:"address" binding:"required"` // 仓库地址 true
|
||||
Account string `json:"account,omitempty"` // 账户
|
||||
Password string `json:"password,omitempty"` // 密码
|
||||
}
|
||||
|
||||
type DockerConfigSearchQueryRequest struct {
|
||||
BaseSearchConditionQuery `schema:",inline"`
|
||||
Address string `schema:"address"`
|
||||
Account string `schema:"account"`
|
||||
}
|
||||
|
||||
type DockerConfigResponse struct {
|
||||
Id string `json:"id"`
|
||||
Address string `json:"address"`
|
||||
Account string `json:"account"`
|
||||
}
|
||||
|
||||
func DockerConfigResponseFromModel(dc models.DockerConfig) DockerConfigResponse {
|
||||
return DockerConfigResponse{
|
||||
Id: dc.Id,
|
||||
Address: dc.Address,
|
||||
Account: dc.Account,
|
||||
}
|
||||
}
|
||||
|
||||
type DockerConfigUpdateRequest struct {
|
||||
Id string `json:"id" binding:"required"`
|
||||
Address *string `json:"address"`
|
||||
Account *string `json:"account"`
|
||||
Password *string `json:"password"`
|
||||
}
|
||||
|
||||
func ReplaceDockerConfigModelFieldsWithDTO(ds *models.DockerConfig, patch DockerConfigUpdateRequest) {
|
||||
if patch.Address != nil {
|
||||
ds.Address = *patch.Address
|
||||
}
|
||||
if patch.Account != nil {
|
||||
ds.Account = *patch.Account
|
||||
}
|
||||
if patch.Password != nil {
|
||||
ds.Password = *patch.Password
|
||||
}
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2017 Dell Inc.
|
||||
* Copyright (c) 2019 Intel Corporation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
package dtos
|
||||
|
||||
type DriverClassifyResponse struct {
|
||||
Id string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
}
|
||||
|
||||
type DriverClassifyQueryRequest struct {
|
||||
BaseSearchConditionQuery `schema:",inline"`
|
||||
Name string `schema:"name"`
|
||||
|
||||
}
|
|
@ -0,0 +1,93 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2017 Dell Inc.
|
||||
* Copyright (c) 2019 Intel Corporation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
package dtos
|
||||
|
||||
import (
|
||||
"github.com/winc-link/hummingbird/internal/pkg/constants"
|
||||
"github.com/winc-link/hummingbird/internal/pkg/utils"
|
||||
"sync"
|
||||
)
|
||||
|
||||
var dcMutex sync.Mutex
|
||||
|
||||
type DriverConfigManage struct {
|
||||
HostRootDir string // 宿主主机dir
|
||||
NetWorkName string
|
||||
DockerManageConfig
|
||||
}
|
||||
|
||||
type DockerManageConfig struct {
|
||||
ContainerConfigPath string // 容器内部驱动运行启动的配置文件路径
|
||||
DockerApiVersion string // docker 版本号
|
||||
DockerRunMode string // 默认运行模式 默认是host
|
||||
DockerSelfName string // edge启动的容器名
|
||||
Privileged bool // 容器特权
|
||||
}
|
||||
|
||||
func (m *DriverConfigManage) SetHostRootDir(dir string) {
|
||||
dcMutex.Lock()
|
||||
defer dcMutex.Unlock()
|
||||
m.HostRootDir = dir
|
||||
}
|
||||
|
||||
func (m *DriverConfigManage) SetNetworkName(networkName string) {
|
||||
dcMutex.Lock()
|
||||
defer dcMutex.Unlock()
|
||||
m.NetWorkName = networkName
|
||||
}
|
||||
|
||||
// 存储驱动上传配置定义文件目录 /var/tedge/edgex-driver-data/driver-library/
|
||||
func (m *DriverConfigManage) GetLibraryDir() string {
|
||||
return utils.GetPwdDir() + "/" + constants.DriverLibraryDir + "/"
|
||||
}
|
||||
|
||||
// 驱动二进制文件路径 /var/tedge/edgex-driver-data/bin/modbus-1234
|
||||
func (m *DriverConfigManage) GetBinPath(serverName string) string {
|
||||
return utils.GetPwdDir() + "/" + constants.DriverBinDir + "/" + serverName
|
||||
}
|
||||
|
||||
// 驱动启动的配置文件路径 /var/edge/run-config/modbus-1234.toml
|
||||
func (m *DriverConfigManage) GetRunConfigPath(serviceName string) string {
|
||||
return constants.DockerHummingbirdRootDir + "/" + constants.DriverRunConfigDir + "/" + serviceName + constants.ConfigSuffix
|
||||
}
|
||||
|
||||
// docker挂载
|
||||
func (m *DriverConfigManage) GetHostRunConfigPath(serviceName string) string {
|
||||
return m.HostRootDir + "/" + constants.DriverRunConfigDir + "/" + serviceName + constants.ConfigSuffix
|
||||
}
|
||||
|
||||
// 二进制版本路径
|
||||
// 驱动启动的配置文件路径 /var/edge/mnt/modbus-1234.toml
|
||||
func (m *DriverConfigManage) GetMntDir(serviceName string) string {
|
||||
return constants.DockerHummingbirdRootDir + "/" + constants.DriverMntDir + "/" + serviceName
|
||||
}
|
||||
|
||||
// docker挂载 的日志:只针对docker版本,二进制版本需要改动日志存储地址 /var/edge/mnt/modbus-1234.toml
|
||||
func (m *DriverConfigManage) GetHostMntDir(serviceName string) string {
|
||||
return m.HostRootDir + "/" + constants.DriverMntDir + "/" + serviceName
|
||||
}
|
||||
|
||||
// 二进制版本 驱动运行日志文件 /var/tedge/mnt/modbus-1234/logs/driver.log
|
||||
func (m *DriverConfigManage) GetLogFilePath(serviceName string) string {
|
||||
return utils.GetPwdDir() + "/" + constants.DriverMntDir + "/" + serviceName + "/" + constants.DriverDefaultLogPath
|
||||
}
|
||||
|
||||
// docker挂载
|
||||
//logfilePath = "/var/edge/edge-driver-data/mnt/aliyun-iot/edgex-aliyun-cloud.log"
|
||||
|
||||
///var/edge/edge-driver-data/mnt/aliyun-iot
|
||||
func (m *DriverConfigManage) GetHostLogFilePath(serviceName string) string {
|
||||
return constants.DockerHummingbirdRootDir + "/" + constants.DriverMntDir + "/" + serviceName + "/" + constants.DriverDefaultLogPath
|
||||
}
|
|
@ -0,0 +1,120 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2017.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
|
||||
package dtos
|
||||
|
||||
type GetRuleInfoResponse struct {
|
||||
Triggered bool `json:"triggered"`
|
||||
Id string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Sql string `json:"sql"`
|
||||
Actions []map[string]interface{} `json:"actions"`
|
||||
Options map[string]interface{} `json:"options"`
|
||||
}
|
||||
|
||||
type GetRuleStatusResponse struct {
|
||||
Status string `json:"status"`
|
||||
}
|
||||
|
||||
type CreateRule struct {
|
||||
Triggered bool `json:"triggered"`
|
||||
Id string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Sql string `json:"sql"`
|
||||
Actions []Actions `json:"actions"`
|
||||
}
|
||||
|
||||
type Actions struct {
|
||||
Rest map[string]interface{} `json:"rest,omitempty"`
|
||||
MQTT map[string]interface{} `json:"mqtt,omitempty"`
|
||||
Kafka map[string]interface{} `json:"kafka,omitempty"`
|
||||
Zmq map[string]interface{} `json:"zmq,omitempty"`
|
||||
Redis map[string]interface{} `json:"redis,omitempty"`
|
||||
Influx map[string]interface{} `json:"influx,omitempty"`
|
||||
Tdengine map[string]interface{} `json:"tdengine,omitempty"`
|
||||
}
|
||||
|
||||
type Rest struct {
|
||||
Method string `json:"method,omitempty"`
|
||||
Url string `json:"url,omitempty"`
|
||||
BodyType string `json:"bodyType,omitempty"`
|
||||
Timeout int `json:"timeout,omitempty"`
|
||||
RunAsync bool `json:"runAsync,omitempty"`
|
||||
OmitIfEmpty bool `json:"omitIfEmpty,omitempty"`
|
||||
SendSingle bool `json:"sendSingle,omitempty"`
|
||||
BufferLength int `json:"bufferLength,omitempty"`
|
||||
EnableCache bool `json:"enableCache,omitempty"`
|
||||
Format string `json:"format,omitempty"`
|
||||
}
|
||||
|
||||
type MQTT struct {
|
||||
Server string `json:"server,omitempty"`
|
||||
Topic string `json:"topic,omitempty"`
|
||||
ClientId string `json:"clientId,omitempty"`
|
||||
ProtocolVersion string `json:"protocolVersion,omitempty"`
|
||||
Qos int `json:"qos,omitempty"`
|
||||
Username string `json:"username,omitempty"`
|
||||
Password string `json:"password,omitempty"`
|
||||
CertificationPath string `json:"certificationPath,omitempty"`
|
||||
PrivateKeyPath string `json:"privateKeyPath,omitempty"`
|
||||
RootCaPath string `json:"rootCaPath,omitempty"`
|
||||
InsecureSkipVerify string `json:"insecureSkipVerify,omitempty"`
|
||||
Retained bool `json:"retained,omitempty"`
|
||||
//compression string `json:"compression"`
|
||||
}
|
||||
|
||||
func (b CreateRule) BuildCreateRuleParam(actions []Actions, ruleId, sql string) CreateRule {
|
||||
b.Triggered = false
|
||||
b.Id = ruleId
|
||||
b.Name = ruleId
|
||||
b.Sql = sql
|
||||
b.Actions = actions
|
||||
return b
|
||||
}
|
||||
|
||||
func GetRuleAlertEkuiperActions(actionUrl string) []Actions {
|
||||
var a []Actions
|
||||
rest := make(map[string]interface{})
|
||||
rest["method"] = "POST"
|
||||
rest["url"] = "http://hummingbird-core:58081" + "/api/v1/ekuiper/alert"
|
||||
rest["bodyType"] = "json"
|
||||
rest["timeout"] = 5000
|
||||
rest["runAsync"] = false
|
||||
rest["omitIfEmpty"] = false
|
||||
rest["sendSingle"] = true
|
||||
rest["enableCache"] = false
|
||||
rest["format"] = "json"
|
||||
a = append(a, Actions{
|
||||
Rest: rest,
|
||||
})
|
||||
return a
|
||||
}
|
||||
|
||||
func GetRuleSceneEkuiperActions(actionUrl string) []Actions {
|
||||
var a []Actions
|
||||
rest := make(map[string]interface{})
|
||||
rest["method"] = "POST"
|
||||
rest["url"] = actionUrl + "/api/v1/ekuiper/scene"
|
||||
rest["bodyType"] = "json"
|
||||
rest["timeout"] = 5000
|
||||
rest["runAsync"] = false
|
||||
rest["omitIfEmpty"] = false
|
||||
rest["sendSingle"] = true
|
||||
rest["enableCache"] = false
|
||||
rest["format"] = "json"
|
||||
a = append(a, Actions{
|
||||
Rest: rest,
|
||||
})
|
||||
return a
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
package dtos
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/xuri/excelize/v2"
|
||||
)
|
||||
|
||||
const (
|
||||
DevicesFilename = "Devices"
|
||||
)
|
||||
|
||||
var (
|
||||
FuncPointImmutableHeader = []string{"DP ID", "Name", "DataType", "TransferType"}
|
||||
FuncPointIntegerHeader = []string{"Scale", "ValueType"}
|
||||
)
|
||||
|
||||
type ExportFile struct {
|
||||
Excel *excelize.File
|
||||
FileName string
|
||||
}
|
||||
|
||||
func NewExportFile(filename string) (*ExportFile, error) {
|
||||
ef := &ExportFile{
|
||||
FileName: newFileName(filename),
|
||||
Excel: excelize.NewFile(),
|
||||
}
|
||||
return ef, nil
|
||||
}
|
||||
|
||||
func newFileName(name string) string {
|
||||
date := time.Now().Format("2006-01-02")
|
||||
unix := strconv.FormatInt(time.Now().Unix(), 10)
|
||||
return fmt.Sprintf("%s_%s_%s.xlsx", name, date, unix)
|
||||
}
|
||||
|
||||
func (f *ExportFile) GetCenterStyle() int {
|
||||
style, _ := f.Excel.NewStyle(`{"alignment":{"horizontal": "center","vertical": "center"}}`)
|
||||
return style
|
||||
}
|
||||
|
||||
func (f *ExportFile) GetRequiredStyle() int {
|
||||
style, _ := f.Excel.NewStyle(`{"alignment":{"horizontal": "center","vertical": "center"},"font":{"color": "#ea4335"}}`)
|
||||
return style
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
package dtos
|
||||
|
||||
type NetIface struct {
|
||||
Ifaces []string `json:"ifaces"`
|
||||
}
|
||||
|
||||
type EdgeBaseConfig struct {
|
||||
}
|
||||
|
||||
type EdgeGwConfig struct {
|
||||
GwId string `json:"gwId"`
|
||||
SecKey string `json:"secKey"`
|
||||
LocalKey string `json:"localKey"`
|
||||
Status bool `json:"status"`
|
||||
}
|
||||
|
||||
type EdgeConfig struct {
|
||||
//BaseConfig EdgeBaseConfig `yaml:"baseconfig"`
|
||||
//GwConfig EdgeGwConfig `yaml:"gwconfig"`
|
||||
//SubDeviceLimit int64 `yaml:"subdevicelimit"`
|
||||
//ExpiryTime int64 `yaml:"expiry"`
|
||||
//ActiveTime int64 `yaml:"activeTime"`
|
||||
//LastExitTime int64 `yaml:"lastExitTime"`
|
||||
//IsExpired bool `yaml:"isExpired"`
|
||||
|
||||
GwId string `yaml:"gwid"`
|
||||
SecKey string `yaml:"seckey"`
|
||||
Status bool `yaml:"status"`
|
||||
ActiveTime string `yaml:"activetime"`
|
||||
VersionNumber string `yaml:"versionnumber"`
|
||||
SubDeviceLimit int64 `yaml:"subdevicelimit"`
|
||||
}
|
||||
|
||||
func (c EdgeConfig) GetGatewayNumber() string {
|
||||
switch c.VersionNumber {
|
||||
case "ireland":
|
||||
return "Ireland(爱尔兰)"
|
||||
case "seattle":
|
||||
return "Seattle(西雅图)"
|
||||
case "kamakura(镰仓)":
|
||||
return "Kamakura"
|
||||
default:
|
||||
return c.VersionNumber
|
||||
}
|
||||
}
|
||||
|
||||
func (c EdgeConfig) IsActivated() bool {
|
||||
return c.Status
|
||||
}
|
||||
|
||||
func (c EdgeConfig) CheckThingModelActiveGw() bool {
|
||||
return c.GwId != "" && c.SecKey != ""
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
package dtos
|
||||
|
||||
import "fmt"
|
||||
|
||||
type Gps struct {
|
||||
Longitude float64 `json:"longitude"`
|
||||
Latitude float64 `json:"latitude"`
|
||||
}
|
||||
|
||||
func (gps Gps) ToLocation() string {
|
||||
return fmt.Sprintf("%f,%f", gps.Latitude, gps.Longitude)
|
||||
}
|
|
@ -0,0 +1,88 @@
|
|||
/*******************************************************************************
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
package dtos
|
||||
|
||||
type HomePageRequest struct {
|
||||
}
|
||||
|
||||
type HomePageResponse struct {
|
||||
PageInfo struct {
|
||||
Product struct {
|
||||
Total uint32 `json:"total"`
|
||||
Self uint32 `json:"self"`
|
||||
Other uint32 `json:"other"`
|
||||
} `json:"product"`
|
||||
Device struct {
|
||||
Total uint32 `json:"total"`
|
||||
Self uint32 `json:"self"`
|
||||
Other uint32 `json:"other"`
|
||||
} `json:"device"`
|
||||
CloudInstance struct {
|
||||
Count uint32 `json:"count"`
|
||||
RunCount uint32 `json:"run_count"`
|
||||
StopCount uint32 `json:"stop_count"`
|
||||
//InstanceName string `json:"instanceName"`
|
||||
//Status string `json:"status"`
|
||||
} `json:"cloudInstance"`
|
||||
Alert struct {
|
||||
Total uint32 `json:"total"`
|
||||
} `json:"alert"`
|
||||
} `json:"pageInfo"`
|
||||
QuickNavigation []QuickNavigation `json:"quickNavigation"`
|
||||
Docs Docs `json:"docs"`
|
||||
AlertPlate []AlertPlateQueryResponse `json:"alertPlate"`
|
||||
MsgGather []MsgGather `json:"msg_gather"`
|
||||
}
|
||||
|
||||
type PlatformInfo struct {
|
||||
VersionName string `json:"version_name"`
|
||||
DbName string `json:"db_name"`
|
||||
}
|
||||
|
||||
type NetWorkInfo struct {
|
||||
NewWork []NewWork `json:"newWork"`
|
||||
Dns string `json:"dns"`
|
||||
}
|
||||
type NewWork struct {
|
||||
NcId string `json:"ncId"`
|
||||
LocalIp string `json:"localIp,omitempty"`
|
||||
GwIp string `json:"gwIp,omitempty"`
|
||||
SmIp string `json:"smIp,omitempty"`
|
||||
Netlink bool `json:"netlink"`
|
||||
}
|
||||
|
||||
type QuickNavigation struct {
|
||||
Id string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Icon string `json:"icon"`
|
||||
//JumpLink string `json:"jumpLink,omitempty"`
|
||||
}
|
||||
|
||||
type Doc struct {
|
||||
Name string `json:"name"`
|
||||
JumpLink string `json:"jumpLink,omitempty"`
|
||||
}
|
||||
|
||||
type Docs struct {
|
||||
More string `json:"more"`
|
||||
Doc []Doc `json:"info"`
|
||||
}
|
||||
|
||||
type Alert struct {
|
||||
Count int `json:"count"`
|
||||
AlertLevel string `json:"alert_level"`
|
||||
}
|
||||
|
||||
type MsgGather struct {
|
||||
Count int `json:"count"`
|
||||
Date string `json:"date"`
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
package dtos
|
||||
|
||||
import (
|
||||
"io"
|
||||
|
||||
"github.com/xuri/excelize/v2"
|
||||
)
|
||||
|
||||
type ImportFile struct {
|
||||
Excel *excelize.File
|
||||
}
|
||||
|
||||
func NewImportFile(f io.Reader) (*ImportFile, error) {
|
||||
file, err := excelize.OpenReader(f)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &ImportFile{
|
||||
Excel: file,
|
||||
}, nil
|
||||
}
|
||||
|
||||
type DeviceAddResponse struct {
|
||||
List []DeviceAddResult `json:"list"`
|
||||
ProcessNum int `json:"processNum"`
|
||||
SuccessNum int `json:"successNum"`
|
||||
FailNum int `json:"failNum"`
|
||||
}
|
||||
|
||||
type DeviceAddResult struct {
|
||||
Id string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Status bool `json:"status"`
|
||||
Message string `json:"message"`
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2017 Dell Inc.
|
||||
* Copyright (c) 2019 Intel Corporation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
package dtos
|
||||
|
||||
type LanguageSDK struct {
|
||||
Name string `json:"name"`
|
||||
Icon string `json:"icon"`
|
||||
Sort int `json:"sort"`
|
||||
Addr string `json:"addr"`
|
||||
Description string `json:"description"`
|
||||
}
|
||||
|
||||
type LanguageSDKSyncRequest struct {
|
||||
VersionName string `json:"version_name"`
|
||||
}
|
||||
|
||||
type LanguageSDKSearchQueryRequest struct {
|
||||
BaseSearchConditionQuery `schema:",inline"`
|
||||
}
|
||||
|
||||
type LanguageSDKSearchResponse struct {
|
||||
Name string `json:"name"`
|
||||
Icon string `json:"icon"`
|
||||
Addr string `json:"addr"`
|
||||
Description string `json:"description"`
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
package dtos
|
||||
|
||||
import (
|
||||
"context"
|
||||
)
|
||||
|
||||
type ConnectHandler func(ctx context.Context)
|
||||
|
||||
type CallbackHandler func(context.Context, CallbackMessage)
|
||||
|
||||
type CallbackMessage struct {
|
||||
Error error
|
||||
}
|
||||
|
||||
type NewMQTTClient struct {
|
||||
Broker string `json:"broker"`
|
||||
ClientId string `json:"client_id"`
|
||||
Username string `json:"username"`
|
||||
Password string `json:"password"`
|
||||
PubTopic string `json:"pub_topic"`
|
||||
SubTopics []string `json:"sub_topics"`
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2017.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
|
||||
package dtos
|
||||
|
||||
type MsgGatherSearchQueryRequest struct {
|
||||
BaseSearchConditionQuery `schema:",inline"`
|
||||
Date []string `schema:"date"`
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
//
|
||||
// Copyright (C) 2021 IOTech Ltd
|
||||
//
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package dtos
|
||||
|
||||
import "encoding/json"
|
||||
|
||||
/*
|
||||
* An Operation for SMA processing.
|
||||
*
|
||||
*
|
||||
* Operation struct
|
||||
*/
|
||||
type Operation struct {
|
||||
Action string `json:"action,omitempty" binding:"oneof=start stop restart"` // 动作,重启 restart
|
||||
Service string `json:"service,omitempty" binding:"required"` // 服务名称
|
||||
}
|
||||
|
||||
// String returns a JSON encoded string representation of the model
|
||||
func (o Operation) String() string {
|
||||
out, err := json.Marshal(o)
|
||||
if err != nil {
|
||||
return err.Error()
|
||||
}
|
||||
return string(out)
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
package dtos
|
||||
|
||||
type ReqPageInfo struct {
|
||||
Page int `json:"page" form:"page"`
|
||||
PageSize int `json:"page_size" form:"page_size"`
|
||||
}
|
||||
|
||||
type ResPageResult struct {
|
||||
List interface{} `json:"list"`
|
||||
Total uint32 `json:"total"`
|
||||
Page int `json:"page"`
|
||||
PageSize int `json:"pageSize"`
|
||||
}
|
||||
|
||||
func NewPageResult(responses interface{}, total uint32, page int, pageSize int) ResPageResult {
|
||||
if responses == nil {
|
||||
responses = make([]interface{}, 0)
|
||||
}
|
||||
return ResPageResult{
|
||||
List: responses,
|
||||
Total: total,
|
||||
Page: page,
|
||||
PageSize: pageSize,
|
||||
}
|
||||
}
|
||||
|
||||
type CommonResponse struct {
|
||||
Success bool `json:"success"`
|
||||
ErrorMsg string `json:"errorMsg"`
|
||||
ErrorCode int `json:"errorCode"`
|
||||
Result interface{} `json:"result"`
|
||||
}
|
||||
|
||||
const (
|
||||
PageDefault = 1
|
||||
PageSizeDefault = 10
|
||||
PageSizeMaxDefault = 1000
|
||||
)
|
||||
|
||||
// 校验并设置PageRequest参数
|
||||
func CorrectionPageRequest(query *PageRequest) {
|
||||
if query.Page <= 0 {
|
||||
query.Page = PageDefault
|
||||
}
|
||||
|
||||
if query.PageSize >= PageSizeMaxDefault {
|
||||
query.PageSize = PageSizeMaxDefault
|
||||
} else if query.PageSize <= 0 {
|
||||
query.PageSize = PageSizeDefault
|
||||
}
|
||||
}
|
||||
|
||||
// 校验并设置page参数
|
||||
func CorrectionPageParam(query *BaseSearchConditionQuery) {
|
||||
if query.Page <= 0 {
|
||||
query.Page = PageDefault
|
||||
}
|
||||
|
||||
if query.PageSize >= PageSizeMaxDefault {
|
||||
query.PageSize = PageSizeMaxDefault
|
||||
} else if query.PageSize <= 0 {
|
||||
query.PageSize = PageSizeDefault
|
||||
}
|
||||
}
|
|
@ -0,0 +1,289 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2017 Dell Inc.
|
||||
* Copyright (c) 2019 Intel Corporation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
package dtos
|
||||
|
||||
import (
|
||||
"github.com/winc-link/hummingbird/internal/models"
|
||||
"github.com/winc-link/hummingbird/internal/pkg/constants"
|
||||
)
|
||||
|
||||
type ProductSearchQueryRequest struct {
|
||||
BaseSearchConditionQuery `schema:",inline"`
|
||||
Platform string `schema:"platform,omitempty"`
|
||||
Name string `schema:"name,omitempty"`
|
||||
ProductId string `schema:"product_id,omitempty"`
|
||||
CloudInstanceId string `schema:"cloud_instance_id,omitempty"`
|
||||
//DeviceLibraryId string `schema:"deviceLibraryId,omitempty"`
|
||||
}
|
||||
|
||||
type ProductSearchQueryResponse struct {
|
||||
Id string `json:"id"`
|
||||
ProductId string `json:"product_id"`
|
||||
Name string `json:"name"`
|
||||
Key string `json:"key"`
|
||||
NodeType string `json:"node_type"`
|
||||
Platform string `json:"platform"`
|
||||
Status string `json:"status"`
|
||||
CreatedAt int64 `json:"created_at"`
|
||||
CategoryName string `json:"category_name"`
|
||||
}
|
||||
|
||||
func ProductResponseFromModel(p models.Product) ProductSearchQueryResponse {
|
||||
return ProductSearchQueryResponse{
|
||||
Id: p.Id,
|
||||
ProductId: p.CloudProductId,
|
||||
Name: p.Name,
|
||||
Key: p.Key,
|
||||
NodeType: string(p.NodeType),
|
||||
Platform: string(p.Platform),
|
||||
Status: string(p.Status),
|
||||
CreatedAt: p.Created,
|
||||
}
|
||||
}
|
||||
|
||||
type ProductSearchByIdResponse struct {
|
||||
Id string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Key string `json:"key"`
|
||||
CloudProductId string `json:"cloud_product_id"`
|
||||
CloudInstanceId string `json:"cloud_instance_id"`
|
||||
Platform string `json:"platform"`
|
||||
Protocol string `json:"protocol"`
|
||||
NodeType string `json:"node_type"`
|
||||
NetType string `json:"net_type"`
|
||||
DataFormat string `json:"data_format"`
|
||||
Factory string `json:"factory"`
|
||||
Description string `json:"description"`
|
||||
Status string `json:"status"`
|
||||
CreatedAt int64 `json:"created_at"`
|
||||
LastSyncTime int64 `json:"last_sync_time"`
|
||||
Properties interface{} `json:"properties"`
|
||||
Events interface{} `json:"events"`
|
||||
Actions interface{} `json:"actions"`
|
||||
}
|
||||
|
||||
func ProductSearchByIdFromModel(p models.Product) ProductSearchByIdResponse {
|
||||
return ProductSearchByIdResponse{
|
||||
Id: p.Id,
|
||||
Name: p.Name,
|
||||
CloudProductId: p.CloudProductId,
|
||||
CloudInstanceId: p.CloudInstanceId,
|
||||
Platform: string(p.Platform),
|
||||
Protocol: p.Protocol,
|
||||
Key: p.Key,
|
||||
NodeType: string(p.NodeType),
|
||||
NetType: string(p.NetType),
|
||||
DataFormat: p.DataFormat,
|
||||
Factory: p.Factory,
|
||||
Description: p.Description,
|
||||
CreatedAt: p.Created,
|
||||
LastSyncTime: p.LastSyncTime,
|
||||
Status: string(p.Status),
|
||||
Properties: p.Properties,
|
||||
Events: p.Events,
|
||||
Actions: p.Actions,
|
||||
}
|
||||
}
|
||||
|
||||
type ProductSearchByIdOpenApiResponse struct {
|
||||
Id string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Key string `json:"key"`
|
||||
Platform string `json:"platform"`
|
||||
Protocol string `json:"protocol"`
|
||||
NodeType string `json:"node_type"`
|
||||
NetType string `json:"net_type"`
|
||||
DataFormat string `json:"data_format"`
|
||||
Factory string `json:"factory"`
|
||||
Status string `json:"status"`
|
||||
Description string `json:"description"`
|
||||
CreatedAt int64 `json:"created_at"`
|
||||
//Properties []OpenApiProperties `json:"properties"`
|
||||
//Events []OpenApiEvents `json:"events"`
|
||||
//Actions []OpenApiActions `json:"services"`
|
||||
}
|
||||
|
||||
type OpenApiProperties struct {
|
||||
Id string `json:"id"`
|
||||
ProductId string `json:"product_id"` // 产品ID
|
||||
Name string `json:"name"` // 属性名称
|
||||
Code string `json:"code"` // 标识符
|
||||
AccessMode string `json:"access_mode"` // 数据传输类型
|
||||
Required bool `json:"required"`
|
||||
TypeSpec OpenApiTypeSpec `json:"type_spec"` // 数据属性
|
||||
Description string `json:"description"`
|
||||
CreatedAt int64 `json:"created_at"`
|
||||
}
|
||||
|
||||
type OpenApiEvents struct {
|
||||
Id string `json:"id"`
|
||||
ProductId string `json:"product_id"`
|
||||
Name string `json:"name"` // 功能名称
|
||||
Code string `json:"code"` // 标识符
|
||||
EventType string `json:"event_type"`
|
||||
Required bool `json:"required"`
|
||||
OutputParams []OpenApiOutPutParams `json:"output_params"`
|
||||
Description string `json:"description"`
|
||||
CreatedAt int64 `json:"created_at"`
|
||||
}
|
||||
|
||||
//
|
||||
//func (t *OpenApiEvents) TransformModelInPutParams() (inPutParams models.InPutParams) {
|
||||
// for _, datum := range t.OutputParams {
|
||||
// var inputOutput models.InputOutput
|
||||
// inputOutput.Code = datum.Code
|
||||
// inputOutput.Name = datum.Name
|
||||
// inputOutput.TypeSpec = getThingModelTemplateTypeSpec(string(datum.TypeSpec.Type), datum.TypeSpec.Specs, nil)
|
||||
// inPutParams = append(inPutParams, inputOutput)
|
||||
// }
|
||||
// return
|
||||
//}
|
||||
|
||||
type OpenApiOutPutParams struct {
|
||||
Code string `json:"code"`
|
||||
Name string `json:"name"`
|
||||
TypeSpec OpenApiTypeSpec `json:"type_spec"`
|
||||
}
|
||||
|
||||
type OpenApiInPutParams struct {
|
||||
Code string `json:"code"`
|
||||
Name string `json:"name"`
|
||||
TypeSpec OpenApiTypeSpec `json:"type_spec"`
|
||||
}
|
||||
|
||||
type OpenApiActions struct {
|
||||
Id string `json:"id"`
|
||||
ProductId string `json:"product_id"`
|
||||
Name string `json:"name"` // 功能名称
|
||||
Code string `json:"code"` // 标识符
|
||||
Required bool `json:"required"`
|
||||
CallType constants.CallType `json:"call_type"`
|
||||
InputParams []OpenApiInPutParams `json:"input_params"` // 输入参数
|
||||
OutputParams []OpenApiOutPutParams `json:"output_params"` // 输出参数
|
||||
CreatedAt int64 `json:"created_at"`
|
||||
Description string `json:"description"`
|
||||
}
|
||||
|
||||
type OpenApiTypeSpec struct {
|
||||
Type constants.SpecsType `json:"type,omitempty"`
|
||||
Specs string `json:"specs,omitempty"`
|
||||
}
|
||||
|
||||
func ProductSearchByIdOpenApiFromModel(p models.Product) ProductSearchByIdOpenApiResponse {
|
||||
return ProductSearchByIdOpenApiResponse{
|
||||
Id: p.Id,
|
||||
Name: p.Name,
|
||||
Key: p.Key,
|
||||
Platform: string(p.Platform),
|
||||
Protocol: p.Protocol,
|
||||
NodeType: string(p.NodeType),
|
||||
NetType: string(p.NetType),
|
||||
DataFormat: p.DataFormat,
|
||||
Factory: p.Factory,
|
||||
Status: string(p.Status),
|
||||
Description: p.Description,
|
||||
CreatedAt: p.Created,
|
||||
}
|
||||
}
|
||||
|
||||
type ProductSearchOpenApiResponse struct {
|
||||
Id string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Key string `json:"key"`
|
||||
Platform string `json:"platform"`
|
||||
Protocol string `json:"protocol"`
|
||||
NodeType string `json:"node_type"`
|
||||
NetType string `json:"net_type"`
|
||||
DataFormat string `json:"data_format"`
|
||||
Factory string `json:"factory"`
|
||||
Status string `json:"status"`
|
||||
Description string `json:"description"`
|
||||
CreatedAt int64 `json:"created_at"`
|
||||
}
|
||||
|
||||
func ProductSearchOpenApiFromModel(p models.Product) ProductSearchOpenApiResponse {
|
||||
return ProductSearchOpenApiResponse{
|
||||
Id: p.Id,
|
||||
Name: p.Name,
|
||||
Key: p.Key,
|
||||
Platform: string(p.Platform),
|
||||
Protocol: p.Protocol,
|
||||
NodeType: string(p.NodeType),
|
||||
NetType: string(p.NetType),
|
||||
DataFormat: p.DataFormat,
|
||||
Factory: p.Factory,
|
||||
Status: string(p.Status),
|
||||
Description: p.Description,
|
||||
CreatedAt: p.Created,
|
||||
}
|
||||
}
|
||||
|
||||
type ProductSyncRequest struct {
|
||||
CloudInstanceId string `json:"cloud_instance_id"`
|
||||
//Extra struct{
|
||||
//
|
||||
//} `json:"extra"`
|
||||
//Aliyun *struct {
|
||||
// ResourceGroupId string `json:"resource_group_id"`
|
||||
//} `json:"ali_yun"`
|
||||
//HuaweiYun *struct {
|
||||
// ProjectId string `json:"project_id"`
|
||||
// AppId string `json:"app_id"`
|
||||
//} `json:"huawei_yun"`
|
||||
}
|
||||
|
||||
type ProductSyncByIdRequest struct {
|
||||
ProductId string `json:"product_id"`
|
||||
}
|
||||
|
||||
type ProductAddRequest struct {
|
||||
Name string `json:"name"` //产品名字
|
||||
//Platform string `json:"platform"`
|
||||
Key string `json:"key"`
|
||||
CategoryTemplateId string `json:"category_template_id"` //如果是自定义 id固定传递"1"
|
||||
Protocol string `json:"protocol"` //协议
|
||||
NodeType string `json:"node_type"` //节点类型
|
||||
NetType string `json:"net_type"` //联网模式
|
||||
DataFormat string `json:"data_format"` //数据类型
|
||||
Factory string `json:"factory"` //厂家
|
||||
Description string `json:"description"` //描述
|
||||
}
|
||||
|
||||
type OpenApiAddProductRequest struct {
|
||||
Name string `json:"name"` //产品名字
|
||||
Protocol string `json:"protocol"` //协议
|
||||
NodeType string `json:"node_type"` //节点类型
|
||||
NetType string `json:"net_type"` //联网模式
|
||||
DataFormat string `json:"data_format"` //数据类型
|
||||
Factory string `json:"factory"` //厂家
|
||||
Description string `json:"description"` //描述
|
||||
//Properties []OpenApiProperties `json:"properties"`
|
||||
//Events []OpenApiEvents `json:"events"`
|
||||
//Actions []OpenApiActions `json:"services"`
|
||||
}
|
||||
|
||||
type OpenApiUpdateProductRequest struct {
|
||||
Id string `json:"id"`
|
||||
Name *string `json:"name"` //产品名字
|
||||
Protocol *string `json:"protocol"` //协议
|
||||
NodeType *string `json:"node_type"` //节点类型
|
||||
NetType *string `json:"net_type"` //联网模式
|
||||
DataFormat *string `json:"data_format"` //数据类型
|
||||
Factory *string `json:"factory"` //厂家
|
||||
Description *string `json:"description"` //描述
|
||||
//Properties []OpenApiProperties `json:"properties"`
|
||||
//Events []OpenApiEvents `json:"events"`
|
||||
//Actions []OpenApiActions `json:"services"`
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
/*******************************************************************************
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
package dtos
|
||||
|
||||
type QuickNavigationSearchQueryRequest struct {
|
||||
BaseSearchConditionQuery `schema:",inline"`
|
||||
Name string `schema:"name,omitempty"`
|
||||
}
|
||||
|
||||
type DocsSearchQueryRequest struct {
|
||||
BaseSearchConditionQuery `schema:",inline"`
|
||||
Name string `schema:"name,omitempty"`
|
||||
}
|
||||
|
||||
type CosQuickNavigationTemplateResponse struct {
|
||||
Name string `json:"Name"`
|
||||
Sort int `json:"Sort"`
|
||||
Icon string `json:"Icon"`
|
||||
JumpLink string `json:"JumpLink"`
|
||||
}
|
||||
|
||||
type CosDocTemplateResponse struct {
|
||||
Name string `json:"Name"`
|
||||
Sort int `json:"Sort"`
|
||||
JumpLink string `json:"JumpLink"`
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
package dtos
|
||||
|
||||
import "encoding/json"
|
||||
|
||||
type InvokeLog struct {
|
||||
Req interface{} `json:"req"`
|
||||
Reply interface{} `json:"reply"`
|
||||
Success bool `json:"success"`
|
||||
Method string `json:"method"`
|
||||
Duration string `json:"duration"`
|
||||
Error string `json:"error"`
|
||||
}
|
||||
|
||||
func (il InvokeLog) ToString() string {
|
||||
data, _ := json.Marshal(il)
|
||||
return string(data)
|
||||
}
|
||||
|
||||
type HandleLog struct {
|
||||
Req interface{} `json:"req"`
|
||||
Reply interface{} `json:"reply"`
|
||||
Success bool `json:"success"`
|
||||
Method string `json:"method"`
|
||||
Duration string `json:"duration"`
|
||||
Error string `json:"error"`
|
||||
}
|
||||
|
||||
func (hl HandleLog) ToString() string {
|
||||
data, _ := json.Marshal(hl)
|
||||
return string(data)
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2017 Dell Inc.
|
||||
* Copyright (c) 2019 Intel Corporation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
package dtos
|
||||
|
||||
import "encoding/json"
|
||||
|
||||
type RpcData struct {
|
||||
Code WsCode
|
||||
ReqId string
|
||||
ErrCode uint32
|
||||
Data interface{}
|
||||
}
|
||||
|
||||
func (rd *RpcData) String() string {
|
||||
str, _ := json.Marshal(rd)
|
||||
return string(str)
|
||||
}
|
|
@ -0,0 +1,114 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2017.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
|
||||
package dtos
|
||||
|
||||
import (
|
||||
"github.com/winc-link/hummingbird/internal/models"
|
||||
)
|
||||
|
||||
type RuleEngineRequest struct {
|
||||
Name string `json:"name"` //名字
|
||||
Description string `json:"description"` //描述
|
||||
Filter Filter `json:"filter"`
|
||||
DataResourceId string `json:"data_resource_id"`
|
||||
}
|
||||
|
||||
func (r RuleEngineRequest) BuildEkuiperSql() string {
|
||||
return r.Filter.Sql
|
||||
}
|
||||
|
||||
type Filter struct {
|
||||
MessageSource string `json:"message_source"`
|
||||
SelectName string `json:"select_name"`
|
||||
Condition string `json:"condition"`
|
||||
Sql string `json:"sql"`
|
||||
}
|
||||
|
||||
type RuleEngineUpdateRequest struct {
|
||||
Id string `json:"id"`
|
||||
Name *string `json:"name"` //名字
|
||||
Description *string `json:"description"` //描述
|
||||
Filter *Filter `json:"filter"`
|
||||
DataResourceId *string `json:"data_resource_id"`
|
||||
}
|
||||
|
||||
func ReplaceRuleEngineModelFields(ds *models.RuleEngine, patch RuleEngineUpdateRequest) {
|
||||
if patch.Name != nil {
|
||||
ds.Name = *patch.Name
|
||||
}
|
||||
if patch.Description != nil {
|
||||
ds.Description = *patch.Description
|
||||
}
|
||||
if patch.Filter != nil {
|
||||
ds.Filter = models.Filter(*patch.Filter)
|
||||
}
|
||||
if patch.DataResourceId != nil {
|
||||
ds.DataResourceId = *patch.DataResourceId
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func (r RuleEngineUpdateRequest) BuildEkuiperSql() string {
|
||||
return r.Filter.Sql
|
||||
}
|
||||
|
||||
type RuleEngineFieldUpdateRequest struct {
|
||||
Id string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
//AlertLevel constants.AlertLevel `json:"alert_level"`
|
||||
Description string `json:"description"`
|
||||
}
|
||||
|
||||
type RuleEngineResponse struct {
|
||||
Id string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Description string `json:"description"`
|
||||
Filter Filter `json:"filter"`
|
||||
Created int64 `json:"created"`
|
||||
DataResourceId string `json:"data_resource_id"`
|
||||
DataResource DataResourceInfo `json:"dataResource"`
|
||||
Modified int64 `json:"modified"`
|
||||
}
|
||||
|
||||
type RuleEngineSearchQueryRequest struct {
|
||||
BaseSearchConditionQuery `schema:",inline"`
|
||||
Name string `schema:"name,omitempty"`
|
||||
Status string `schema:"status,omitempty"`
|
||||
}
|
||||
|
||||
type RuleEngineSearchQueryResponse struct {
|
||||
Id string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Description string `json:"description"`
|
||||
Created int64 `json:"created"`
|
||||
Status string `json:"status"`
|
||||
ResourceType string `json:"resource_type"`
|
||||
DataResource DataResourceInfo `json:"dataResource"`
|
||||
}
|
||||
|
||||
func RuleEngineSearchQueryResponseFromModel(p models.RuleEngine) RuleEngineSearchQueryResponse {
|
||||
var dataResource DataResourceInfo
|
||||
dataResource.Name = p.DataResource.Name
|
||||
dataResource.Type = string(p.DataResource.Type)
|
||||
dataResource.Option = p.DataResource.Option
|
||||
return RuleEngineSearchQueryResponse{
|
||||
Id: p.Id,
|
||||
Name: p.Name,
|
||||
Description: p.Description,
|
||||
Created: p.Created,
|
||||
Status: string(p.Status),
|
||||
DataResource: dataResource,
|
||||
}
|
||||
}
|
|
@ -0,0 +1,94 @@
|
|||
package dtos
|
||||
|
||||
type (
|
||||
// LogConfig logger common
|
||||
LogConfig struct {
|
||||
FileName string
|
||||
LogLevel string
|
||||
}
|
||||
|
||||
CloudInstanceLogConfig struct {
|
||||
FileName string
|
||||
LogSwitch bool
|
||||
LogFilter []string
|
||||
}
|
||||
|
||||
// RPCConfig internal grpc server common
|
||||
RPCConfig struct {
|
||||
Address string
|
||||
UseTLS bool
|
||||
CertFile string
|
||||
KeyFile string
|
||||
}
|
||||
|
||||
// ClientInfo provides the host and port of another service in tedge.
|
||||
ClientInfo struct {
|
||||
Address string
|
||||
// 是否启用tls
|
||||
UseTLS bool
|
||||
// ca cert
|
||||
CertFilePath string
|
||||
// mqtt clientId
|
||||
ClientId string
|
||||
// mqtt username
|
||||
Username string
|
||||
// mqtt password
|
||||
Password string
|
||||
}
|
||||
ServiceInfo struct {
|
||||
// ID 驱动实例化后生成的唯一ID,驱动管理服务自动生成。
|
||||
// 驱动实例启动后会通过该ID去元数据服务同步设备和更新驱动配置。
|
||||
ID string
|
||||
Name string
|
||||
Server RPCConfig
|
||||
// ProductList 驱动对应的产品ID列表
|
||||
//ProductList []string
|
||||
//GwId string
|
||||
//LocalKey string
|
||||
// 跳过激活检查
|
||||
Activated bool
|
||||
}
|
||||
|
||||
DriverConfig struct {
|
||||
Logger LogConfig
|
||||
Clients map[string]ClientInfo
|
||||
Service ServiceInfo
|
||||
CustomParam string
|
||||
}
|
||||
|
||||
CloudInstanceConfig struct {
|
||||
Logger CloudInstanceLogConfig
|
||||
Clients map[string]ClientInfo
|
||||
Authorization AuthorizationInfo
|
||||
Service ServiceInfo
|
||||
}
|
||||
AuthorizationInfo struct {
|
||||
AK string
|
||||
SK string
|
||||
Regions string
|
||||
ProjectId string
|
||||
InstanceId string
|
||||
Endpoint string
|
||||
MqttHost string
|
||||
MqttPort string
|
||||
}
|
||||
|
||||
AppServiceConfig struct {
|
||||
Log struct {
|
||||
LogLevel string
|
||||
LogPath string
|
||||
}
|
||||
Tedge struct {
|
||||
Host string
|
||||
Port int32
|
||||
}
|
||||
Server struct {
|
||||
ID string
|
||||
Name string
|
||||
Host string
|
||||
Port int32
|
||||
}
|
||||
//应用私有配置
|
||||
CustomConfig map[string]interface{}
|
||||
}
|
||||
)
|
|
@ -0,0 +1,88 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2017.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
|
||||
package dtos
|
||||
|
||||
import (
|
||||
"github.com/winc-link/hummingbird/internal/models"
|
||||
)
|
||||
|
||||
type SceneAddRequest struct {
|
||||
Name string `json:"name"` //名字
|
||||
Description string `json:"description"` //描述
|
||||
}
|
||||
|
||||
type SceneUpdateRequest struct {
|
||||
Id string `json:"id"`
|
||||
//Condition constants.WorkerCondition `json:"condition"` //执行条件
|
||||
Conditions []Condition `json:"conditions"`
|
||||
Actions []Action `json:"actions"`
|
||||
}
|
||||
|
||||
func ReplaceSceneModelFields(scene *models.Scene, req SceneUpdateRequest) {
|
||||
//scene.Conditions = req.Conditions
|
||||
|
||||
var modelConditions models.Conditions
|
||||
for _, condition := range req.Conditions {
|
||||
modelConditions = append(modelConditions, models.Condition{
|
||||
ConditionType: condition.ConditionType,
|
||||
Option: condition.Option,
|
||||
})
|
||||
}
|
||||
scene.Conditions = modelConditions
|
||||
|
||||
var modelAction models.Actions2
|
||||
for _, action := range req.Actions {
|
||||
modelAction = append(modelAction, models.Action{
|
||||
ProductName: action.ProductName,
|
||||
ProductID: action.ProductID,
|
||||
DeviceName: action.DeviceName,
|
||||
DeviceID: action.DeviceID,
|
||||
Code: action.Code,
|
||||
DataType: action.DataType,
|
||||
Value: action.Value,
|
||||
})
|
||||
}
|
||||
scene.Actions = modelAction
|
||||
}
|
||||
|
||||
type Condition struct {
|
||||
ConditionType string `json:"condition_type"`
|
||||
Option map[string]string `json:"option"`
|
||||
//CronExpression string `json:"cron_expression"`
|
||||
}
|
||||
|
||||
type Action struct {
|
||||
ProductID string `json:"product_id"`
|
||||
ProductName string `json:"product_name"`
|
||||
DeviceID string `json:"device_id"`
|
||||
DeviceName string `json:"device_name"`
|
||||
Code string `json:"code"`
|
||||
DataType string `json:"data_type"`
|
||||
Value string `json:"value"`
|
||||
}
|
||||
|
||||
type SceneSearchQueryRequest struct {
|
||||
BaseSearchConditionQuery `schema:",inline"`
|
||||
Name string `json:"name"`
|
||||
Status string `json:"status"`
|
||||
}
|
||||
|
||||
type SceneLogSearchQueryRequest struct {
|
||||
BaseSearchConditionQuery `schema:",inline"`
|
||||
//Name string `schema:"name,omitempty"`
|
||||
StartAt int64 `schema:"start_time"`
|
||||
EndAt int64 `schema:"end_time"`
|
||||
SceneId string `json:"scene_id"`
|
||||
}
|
|
@ -0,0 +1,149 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2017 Dell Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
|
||||
package dtos
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"github.com/winc-link/hummingbird/internal/models"
|
||||
)
|
||||
|
||||
type StatsResp struct {
|
||||
MemoryStats MemoryStats `json:"memory_stats"`
|
||||
CpuStats CpuStats `json:"cpu_stats"`
|
||||
PrecpuStats CpuStats `json:"precpu_stats"`
|
||||
}
|
||||
|
||||
type CpuStats struct {
|
||||
CpuUsage CpuUsage `json:"cpu_usage"`
|
||||
SystemCpuUsage int64 `json:"system_cpu_usage"`
|
||||
OnlineCpus int64 `json:"online_cpus"`
|
||||
}
|
||||
|
||||
type CpuUsage struct {
|
||||
PercpuUsage []int64 `json:"percpu_usage"`
|
||||
TotalUsage int64 `json:"total_usage"`
|
||||
}
|
||||
|
||||
type MemoryStats struct {
|
||||
Usage int64 `json:"usage"`
|
||||
Limit int64 `json:"limit"`
|
||||
MaxUsage int64 `json:"max_usage"`
|
||||
Stats MemoryStatsDetail `json:"stats"`
|
||||
}
|
||||
|
||||
type MemoryStatsDetail struct {
|
||||
Cache int64 `json:"cache"`
|
||||
Rss int64 `json:"rss"`
|
||||
}
|
||||
|
||||
func (s StatsResp) UsedMemory() int64 {
|
||||
return s.MemoryStats.Usage - s.MemoryStats.Stats.Cache
|
||||
}
|
||||
|
||||
// MemoryUsage %
|
||||
func (s StatsResp) MemoryUsage() float64 {
|
||||
if s.MemoryStats.Limit <= 0 {
|
||||
return 0
|
||||
}
|
||||
return float64(s.UsedMemory()/s.MemoryStats.Limit) * 100.0
|
||||
}
|
||||
|
||||
func (s StatsResp) CpuDelta() float64 {
|
||||
return float64(s.CpuStats.CpuUsage.TotalUsage - s.PrecpuStats.CpuUsage.TotalUsage)
|
||||
}
|
||||
|
||||
func (s StatsResp) SystemCpuDelta() float64 {
|
||||
return float64(s.CpuStats.SystemCpuUsage - s.PrecpuStats.SystemCpuUsage)
|
||||
}
|
||||
|
||||
// CpuUsage %
|
||||
func (s StatsResp) CpuUsage() float64 {
|
||||
scd := s.SystemCpuDelta()
|
||||
if scd <= 0 {
|
||||
return 0
|
||||
}
|
||||
return (s.CpuDelta() / scd) * float64(s.CpuStats.OnlineCpus) * 100.0
|
||||
}
|
||||
|
||||
type SystemMetrics struct {
|
||||
Timestamp int64 `json:"timestamp"` // 时间戳
|
||||
CpuUsedPercent float64 `json:"cpu_used_percent"` // cpu 使用率百分比
|
||||
CpuAvg float64 `json:"cpu_avg"` // cpu 负载,1分钟
|
||||
Memory SystemMemory `json:"memory"` // 内存
|
||||
Disk SystemDisk `json:"disk"` // 磁盘使用率
|
||||
Network map[string]SystemNetwork `json:"network"` // 网卡en/eth的IO
|
||||
Openfiles int `json:"openfiles"` // 文件数,linux 才有
|
||||
}
|
||||
|
||||
type SystemMemory struct {
|
||||
Total uint64 `json:"total"` // 大小
|
||||
Used uint64 `json:"used"` // 使用大小 bytes
|
||||
UsedPercent float64 `json:"used_percent"` // 百分比
|
||||
}
|
||||
|
||||
type SystemDisk struct {
|
||||
Path string `json:"path"` // 获取 / 目录信息
|
||||
Total uint64 `json:"total"` // 大小 bytes
|
||||
Used uint64 `json:"used"` // 使用值
|
||||
UsedPercent float64 `json:"used_percent"` // 使用百分比
|
||||
}
|
||||
|
||||
type SystemNetwork struct {
|
||||
Name string `json:"name"`
|
||||
BytesSent uint64 `json:"bytes_sent"` // 总发送字节
|
||||
BytesRecv uint64 `json:"bytes_recv"` // 总接收字节
|
||||
BytesSentPre uint64 `json:"bytes_sent_pre"` // 单位时间内发送的字节,1分钟
|
||||
BytesRecvPre uint64 `json:"bytes_recv_pre"` // 单位时间内接收的字节,1分钟
|
||||
Last int64 `json:"-"` // 采集时记录,不做输出
|
||||
}
|
||||
|
||||
func FromModelsSystemMetricsToDTO(m models.SystemMetrics) (SystemMetrics, error) {
|
||||
var s SystemMetrics
|
||||
if err := json.Unmarshal([]byte(m.Data), &s); err != nil {
|
||||
return SystemMetrics{}, err
|
||||
}
|
||||
return s, nil
|
||||
}
|
||||
|
||||
func (s SystemNetwork) String() string {
|
||||
bytes, _ := json.Marshal(s)
|
||||
return string(bytes)
|
||||
}
|
||||
|
||||
func (s SystemMetrics) String() string {
|
||||
bytes, _ := json.Marshal(s)
|
||||
return string(bytes)
|
||||
}
|
||||
|
||||
// Response
|
||||
|
||||
type SystemMetricsResponse struct {
|
||||
Total int `json:"total"`
|
||||
Metrics []SystemStatResponse `json:"metrics"`
|
||||
}
|
||||
|
||||
type SystemStatResponse struct {
|
||||
Timestamp int64 `json:"timestamp"` // 时间戳
|
||||
CpuUsedPercent float64 `json:"cpu_used_percent"` // cpu 使用率百分比
|
||||
MemoryTotal uint64 `json:"memory_total"` // 内存使用
|
||||
MemoryUsed uint64 `json:"memory_used"` // 内存使用
|
||||
MemoryUsedPercent float64 `json:"memory_used_percent"` // 内存使用率
|
||||
DiskTotal uint64 `json:"disk_total"`
|
||||
DiskUsed uint64 `json:"disk_used"`
|
||||
DiskUsedPercent float64 `json:"disk_used_percent"` // 磁盘使用率
|
||||
NetSentBytes uint64 `json:"net_sent_bytes"` // 网卡发送字节
|
||||
NetRecvBytes uint64 `json:"net_recv_bytes"` // 网卡接收字节
|
||||
Openfiles int `json:"openfiles"` // 文件句柄数,linux 才有
|
||||
}
|
|
@ -0,0 +1,95 @@
|
|||
package dtos
|
||||
|
||||
import (
|
||||
//"gitlab.com/tedge/edgex/internal/models"
|
||||
//"gitlab.com/tedge/edgex/proto/devicelibrary"
|
||||
"github.com/winc-link/hummingbird/internal/models"
|
||||
)
|
||||
|
||||
type DeviceLibrarySupportVersion struct {
|
||||
Version string `json:"version"`
|
||||
IsDefault bool `json:"is_default"`
|
||||
DockerParamsSwitch bool `json:"docker_params_switch"`
|
||||
DockerParams string `json:"docker_params"`
|
||||
ExpertMode bool `json:"expert_mode"`
|
||||
ExpertModeContent string `json:"expert_mode_content"`
|
||||
ConfigFile string `json:"config_file"`
|
||||
ConfigJson string `json:"config_json"`
|
||||
}
|
||||
|
||||
func SupperVersionsFromModel(versions []models.SupportVersion) []DeviceLibrarySupportVersion {
|
||||
ret := make([]DeviceLibrarySupportVersion, 0)
|
||||
for _, v := range versions {
|
||||
ret = append(ret, DeviceLibrarySupportVersion{
|
||||
Version: v.Version,
|
||||
IsDefault: v.IsDefault,
|
||||
DockerParamsSwitch: v.DockerParamsSwitch,
|
||||
DockerParams: v.DockerParams,
|
||||
ExpertMode: v.ExpertMode,
|
||||
ExpertModeContent: v.ExpertModeContent,
|
||||
ConfigJson: v.ConfigJson,
|
||||
ConfigFile: v.ConfigFile,
|
||||
})
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
//func FromDeviceLibrarySupperVersionsToRpc(versions []models.SupportVersion) []*devicelibrary.SupportVersion {
|
||||
// ret := make([]*devicelibrary.SupportVersion, 0)
|
||||
// for _, v := range versions {
|
||||
// ret = append(ret, &devicelibrary.SupportVersion{
|
||||
// Version: v.Version,
|
||||
// IsDefault: v.IsDefault,
|
||||
// DockerParamsSwitch: v.DockerParamsSwitch,
|
||||
// DockerParams: v.DockerParams,
|
||||
// ExpertMode: v.ExpertMode,
|
||||
// ExpertModeContent: v.ExpertModeContent,
|
||||
// ConfigJson: v.ConfigJson,
|
||||
// ConfigFile: v.ConfigFile,
|
||||
// })
|
||||
// }
|
||||
// return ret
|
||||
//}
|
||||
|
||||
type DeviceLibrarySupportVersionSimple struct {
|
||||
Version string `json:"version"`
|
||||
IsDefault bool `json:"is_default"`
|
||||
ConfigFile string `json:"config_file"`
|
||||
}
|
||||
|
||||
func DeviceLibrarySupportVersionSimpleFromModel(versions models.SupportVersions) []DeviceLibrarySupportVersionSimple {
|
||||
ret := make([]DeviceLibrarySupportVersionSimple, len(versions))
|
||||
for i, v := range versions {
|
||||
ret[i] = DeviceLibrarySupportVersionSimple{
|
||||
Version: v.Version,
|
||||
IsDefault: v.IsDefault,
|
||||
//ConfigFile: v.ConfigFile,
|
||||
}
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
//func FromSupportVersionSimpleRpcToDto(resp *devicelibrary.DeviceLibrary) []DeviceLibrarySupportVersionSimple {
|
||||
// ret := make([]DeviceLibrarySupportVersionSimple, 0)
|
||||
// for _, v := range resp.SupportVersions {
|
||||
// ret = append(ret, DeviceLibrarySupportVersionSimple{
|
||||
// Version: v.Version,
|
||||
// IsDefault: v.IsDefault,
|
||||
// ConfigFile: v.ConfigFile,
|
||||
// })
|
||||
// }
|
||||
// return ret
|
||||
//}
|
||||
//
|
||||
//func ModelSupportVersionFromRPC(s *devicelibrary.SupportVersion) models.SupportVersion {
|
||||
// return models.SupportVersion{
|
||||
// Version: s.Version,
|
||||
// IsDefault: s.IsDefault,
|
||||
// ConfigJson: s.ConfigJson,
|
||||
// ConfigFile: s.ConfigFile,
|
||||
// DockerParamsSwitch: s.DockerParamsSwitch,
|
||||
// DockerParams: s.DockerParams,
|
||||
// ExpertMode: s.ExpertMode,
|
||||
// ExpertModeContent: s.ExpertModeContent,
|
||||
// }
|
||||
//}
|
|
@ -0,0 +1,135 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2017 Dell Inc.
|
||||
* Copyright (c) 2019 Intel Corporation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
package dtos
|
||||
|
||||
import (
|
||||
"github.com/winc-link/hummingbird/internal/models"
|
||||
"github.com/winc-link/hummingbird/internal/pkg/constants"
|
||||
)
|
||||
|
||||
type ThingModelAddOrUpdateReq struct {
|
||||
Id string `json:"id"`
|
||||
ProductId string `json:"product_id"`
|
||||
ThingModelType string `json:"thing_model_type"`
|
||||
//ModelName string `json:"model_name"`
|
||||
Name string `json:"name"`
|
||||
Code string `json:"code"`
|
||||
Description string `json:"description"`
|
||||
Tag string `json:"tag"`
|
||||
Property *ThingModelProperties `json:"property"`
|
||||
Event *ThingModelEvents `json:"event"`
|
||||
Action *ThingModelActions `json:"action"`
|
||||
}
|
||||
|
||||
type ThingModelProperties struct {
|
||||
AccessModel string `json:"access_model"`
|
||||
Require bool `json:"require"`
|
||||
DataType constants.SpecsType `json:"type"`
|
||||
TypeSpec interface{} `json:"specs"`
|
||||
}
|
||||
|
||||
type ThingModelEventAction struct {
|
||||
Code string `json:"code"`
|
||||
Name string `json:"name"`
|
||||
DataType constants.SpecsType `json:"type"`
|
||||
TypeSpec interface{} `json:"specs"`
|
||||
}
|
||||
|
||||
type ThingModelEvents struct {
|
||||
EventType string `json:"event_type"`
|
||||
OutPutParam []ThingModelEventAction `json:"output_param"`
|
||||
}
|
||||
|
||||
type ThingModelActions struct {
|
||||
CallType constants.CallType `json:"call_type"`
|
||||
InPutParam []ThingModelEventAction `json:"input_param"`
|
||||
OutPutParam []ThingModelEventAction `json:"output_param"`
|
||||
}
|
||||
|
||||
type ThingModelDeleteReq struct {
|
||||
ThingModelId string `json:"thing_model_id"`
|
||||
ThingModelType string `json:"thing_model_type"`
|
||||
}
|
||||
|
||||
type SystemThingModelSearchReq struct {
|
||||
ModelName string `schema:"modelName"`
|
||||
ThingModelType string `schema:"thingModelType"`
|
||||
}
|
||||
|
||||
type OpenApiThingModelProperties struct {
|
||||
Id string `json:"id"`
|
||||
//ProductId string `json:"product_id"` // 产品ID
|
||||
Name string `json:"name"` // 属性名称
|
||||
Code string `json:"code"` // 标识符
|
||||
AccessMode string `json:"access_mode"` // 数据传输类型
|
||||
Require bool `json:"require"`
|
||||
TypeSpec models.TypeSpec `json:"type_spec"` // 数据属性
|
||||
Description string `json:"description"`
|
||||
}
|
||||
|
||||
type OpenApiThingModelEvents struct {
|
||||
Id string `json:"id"`
|
||||
//ProductId string `json:"product_id"`
|
||||
EventType string `json:"event_type"`
|
||||
Name string `json:"name"` // 功能名称
|
||||
Code string `json:"code"` // 标识符
|
||||
Description string `json:"description"`
|
||||
Require bool `json:"require"`
|
||||
OutputParams models.OutPutParams `json:"output_params"`
|
||||
}
|
||||
|
||||
type OpenApiThingModelServices struct {
|
||||
Id string `json:"id"`
|
||||
//ProductId string `json:"product_id"`
|
||||
Name string `json:"name"` // 功能名称
|
||||
Code string `json:"code"` // 标识符
|
||||
Description string `json:"description"`
|
||||
Require bool `json:"require"`
|
||||
CallType constants.CallType `json:"call_type"`
|
||||
InputParams models.InPutParams `json:"input_params"` // 输入参数
|
||||
OutputParams models.OutPutParams `json:"output_params"` // 输出参数
|
||||
}
|
||||
|
||||
type OpenApiThingModelAddOrUpdateReq struct {
|
||||
ProductId string `json:"product_id"`
|
||||
Properties []OpenApiThingModelProperties `json:"properties"`
|
||||
Events []OpenApiThingModelEvents `json:"events"`
|
||||
Services []OpenApiThingModelServices `json:"services"`
|
||||
}
|
||||
|
||||
type OpenApiQueryThingModelReq struct {
|
||||
ProductId string `schema:"product_id,omitempty"`
|
||||
}
|
||||
|
||||
type OpenApiQueryThingModel struct {
|
||||
Properties []OpenApiThingModelProperties `json:"properties"`
|
||||
Events []OpenApiThingModelEvents `json:"events"`
|
||||
Services []OpenApiThingModelServices `json:"services"`
|
||||
}
|
||||
|
||||
type OpenApiThingModelDeleteReq struct {
|
||||
ProductId string `json:"product_id"`
|
||||
PropertyIds []string `json:"property_ids"`
|
||||
EventIds []string `json:"event_ids"`
|
||||
ServiceIds []string `json:"service_ids"`
|
||||
}
|
||||
|
||||
type OpenApiSetDeviceThingModel struct {
|
||||
DeviceId string `json:"deviceId"`
|
||||
Item map[string]interface{} `json:"item"`
|
||||
}
|
||||
|
||||
type OpenApiQueryDevicePropertyData struct {
|
||||
}
|
|
@ -0,0 +1,107 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2017 Dell Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
|
||||
package dtos
|
||||
|
||||
type ThingModelDataBaseRequest struct {
|
||||
First bool `json:"first"`
|
||||
Last bool `json:"last"`
|
||||
//Page int `json:"page"`
|
||||
//PageSize int `json:"pageSize"`
|
||||
Range []int64 `json:"range"`
|
||||
}
|
||||
|
||||
type ThingModelPropertyDataRequest struct {
|
||||
BaseSearchConditionQuery `schema:",inline"`
|
||||
ThingModelDataBaseRequest
|
||||
DeviceId string ` json:"deviceId"`
|
||||
Code string `json:"code"`
|
||||
}
|
||||
|
||||
type ThingModelEventDataRequest struct {
|
||||
BaseSearchConditionQuery `schema:",inline"`
|
||||
ThingModelDataBaseRequest
|
||||
DeviceId string ` json:"deviceId"`
|
||||
EventCode string `json:"eventCode"`
|
||||
EventType string `json:"eventType"`
|
||||
}
|
||||
|
||||
type ThingModelEventDataResponse struct {
|
||||
EventCode string `json:"event_code"`
|
||||
EventType string `json:"event_type"`
|
||||
OutputData map[string]interface{} `json:"output_data"`
|
||||
ReportTime int64 `json:"report_time"`
|
||||
Name string `json:"name"`
|
||||
}
|
||||
|
||||
type ThingModelEventDataResponseArray []ThingModelEventDataResponse
|
||||
|
||||
func (array ThingModelEventDataResponseArray) Len() int {
|
||||
return len(array)
|
||||
}
|
||||
|
||||
func (array ThingModelEventDataResponseArray) Less(i, j int) bool {
|
||||
return array[i].ReportTime > array[j].ReportTime //从小到大, 若为大于号,则从大到小
|
||||
}
|
||||
|
||||
func (array ThingModelEventDataResponseArray) Swap(i, j int) {
|
||||
array[i], array[j] = array[j], array[i]
|
||||
}
|
||||
|
||||
type ThingModelServiceDataResponse struct {
|
||||
ReportTime int64 `json:"report_time"`
|
||||
Code string `json:"code"`
|
||||
ServiceName string `json:"service_name"`
|
||||
InputData map[string]interface{} `json:"input_data"`
|
||||
OutputData map[string]interface{} `json:"output_data"`
|
||||
}
|
||||
|
||||
type ThingModelServiceDataResponseArray []ThingModelServiceDataResponse
|
||||
|
||||
func (array ThingModelServiceDataResponseArray) Len() int {
|
||||
return len(array)
|
||||
}
|
||||
|
||||
func (array ThingModelServiceDataResponseArray) Less(i, j int) bool {
|
||||
return array[i].ReportTime > array[j].ReportTime //从小到大, 若为大于号,则从大到小
|
||||
}
|
||||
|
||||
func (array ThingModelServiceDataResponseArray) Swap(i, j int) {
|
||||
array[i], array[j] = array[j], array[i]
|
||||
}
|
||||
|
||||
type ThingModelDataResponse struct {
|
||||
ReportData
|
||||
Code string `json:"code"`
|
||||
DataType string `json:"data_type"`
|
||||
Unit string `json:"unit"`
|
||||
Name string `json:"name"`
|
||||
AccessMode string `json:"access_mode"`
|
||||
}
|
||||
|
||||
type ThingModelPropertyDataResponse struct {
|
||||
ReportData interface{} `json:"report_data"`
|
||||
Code string `json:"code"`
|
||||
DataType string `json:"data_type"`
|
||||
Unit string `json:"unit"`
|
||||
Name string `json:"name"`
|
||||
AccessMode string `json:"access_mode"`
|
||||
}
|
||||
|
||||
type ThingModelServiceDataRequest struct {
|
||||
BaseSearchConditionQuery `schema:",inline"`
|
||||
ThingModelDataBaseRequest
|
||||
DeviceId string ` json:"deviceId"`
|
||||
Code string `json:"code"`
|
||||
}
|
|
@ -0,0 +1,576 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2017 Dell Inc.
|
||||
* Copyright (c) 2019 Intel Corporation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
package dtos
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"github.com/winc-link/hummingbird/internal/models"
|
||||
"github.com/winc-link/hummingbird/internal/pkg/constants"
|
||||
"github.com/winc-link/hummingbird/internal/pkg/utils"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
type ThingModelTemplate struct {
|
||||
Properties []ThingModelTemplateProperties `json:"properties"`
|
||||
Events []ThingModelTemplateEvents `json:"events"`
|
||||
Services []ThingModelTemplateServices `json:"services"`
|
||||
}
|
||||
|
||||
//------------------------------------------------------------
|
||||
//array
|
||||
//{
|
||||
//"childDataType":"TEXT",
|
||||
//"customFlag":true,
|
||||
//"dataType":"ARRAY",
|
||||
//"size":128
|
||||
//}
|
||||
type ThingModelTemplateArray struct {
|
||||
ChildDataType string `json:"childDataType"`
|
||||
Size int `json:"size"`
|
||||
}
|
||||
|
||||
//------------------------------------------------------------
|
||||
//{
|
||||
// "dataType":"DOUBLE",
|
||||
// "max":"23",
|
||||
// "min":"16",
|
||||
// "precise":7,
|
||||
// "step":"0.01",
|
||||
// "unit":"°C",
|
||||
// "unitName":"摄氏度"
|
||||
//}
|
||||
type ThingModelTemplateIntOrFloat struct {
|
||||
Max string `json:"max"`
|
||||
Min string `json:"min"`
|
||||
Step string `json:"step"`
|
||||
Unit string `json:"unit"`
|
||||
UnitName string `json:"unitName"`
|
||||
}
|
||||
|
||||
//------------------------------------------------------------
|
||||
//[
|
||||
//{
|
||||
//"dataType":"BOOL",
|
||||
//"name":"未查询",
|
||||
//"value":0
|
||||
//},
|
||||
//{
|
||||
//"dataType":"BOOL",
|
||||
//"name":"查询",
|
||||
//"value":1
|
||||
//}
|
||||
//]
|
||||
type ThingModelTemplateBool struct {
|
||||
Name string `json:"name"`
|
||||
Value int `json:"value"`
|
||||
}
|
||||
|
||||
//------------------------------------------------------------
|
||||
//{
|
||||
//"dataType":"TEXT",
|
||||
//"length":255
|
||||
//}
|
||||
type ThingModelTemplateText struct {
|
||||
Length int `json:"length"`
|
||||
}
|
||||
|
||||
//------------------------------------------------------------
|
||||
//{
|
||||
//"dataType":"Date",
|
||||
//"length":255
|
||||
//}
|
||||
type ThingModelTemplateDate struct {
|
||||
Length string `json:"length"`
|
||||
}
|
||||
|
||||
//------------------------------------------------------------
|
||||
//[
|
||||
//{
|
||||
//"dataType":"ENUM",
|
||||
//"name":"电源",
|
||||
//"value":0
|
||||
//},
|
||||
//{
|
||||
//"dataType":"ENUM",
|
||||
//"name":"电池",
|
||||
//"value":1
|
||||
//}
|
||||
//]
|
||||
type ThingModelTemplateEnum struct {
|
||||
Name string `json:"name"`
|
||||
Value int `json:"value"`
|
||||
}
|
||||
|
||||
type ThingModelTemplateStruct struct {
|
||||
ChildDataType string `json:"childDataType"`
|
||||
ChildName string `json:"childName"`
|
||||
Identifier string `json:"identifier"`
|
||||
ChildSpecsDTO interface{} `json:"childSpecsDTO"`
|
||||
}
|
||||
|
||||
//------------------------------------------------------------
|
||||
// INT DOUBLE FLOAT TEXT ARRAY=> dataSpecs
|
||||
//BOOL ENUM STRUCT=> dataSpecsList
|
||||
|
||||
type ThingModelTemplateProperties struct {
|
||||
Name string `json:"name"`
|
||||
Identifier string `json:"identifier"`
|
||||
DataType string `json:"dataType"`
|
||||
Description string `json:"description"`
|
||||
Required bool `json:"required"`
|
||||
RwFlag string `json:"rwFlag"`
|
||||
DataSpecs interface{} `json:"dataSpecs"`
|
||||
DataSpecsList interface{} `json:"dataSpecsList"`
|
||||
}
|
||||
|
||||
func (t *ThingModelTemplateProperties) TransformModelTypeSpec() (typeSpec models.TypeSpec) {
|
||||
return getThingModelTemplateTypeSpec(t.DataType, t.DataSpecs, t.DataSpecsList)
|
||||
}
|
||||
|
||||
func getModelSpecByDataType(specType constants.SpecsType, dto interface{}) string {
|
||||
switch specType {
|
||||
case constants.SpecsTypeInt, constants.SpecsTypeFloat:
|
||||
thingModelTemplateIntOrFloat := new(ThingModelTemplateIntOrFloat)
|
||||
b, _ := json.Marshal(dto)
|
||||
err := json.Unmarshal(b, thingModelTemplateIntOrFloat)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
var modelTypeSpecIntOrFloat models.TypeSpecIntOrFloat
|
||||
modelTypeSpecIntOrFloat.Max = thingModelTemplateIntOrFloat.Max
|
||||
modelTypeSpecIntOrFloat.Min = thingModelTemplateIntOrFloat.Min
|
||||
modelTypeSpecIntOrFloat.Step = thingModelTemplateIntOrFloat.Step
|
||||
modelTypeSpecIntOrFloat.Unit = thingModelTemplateIntOrFloat.Unit
|
||||
modelTypeSpecIntOrFloat.UnitName = thingModelTemplateIntOrFloat.UnitName
|
||||
return modelTypeSpecIntOrFloat.TransformTostring()
|
||||
case constants.SpecsTypeText:
|
||||
thingModelTemplateText := new(ThingModelTemplateText)
|
||||
b, _ := json.Marshal(dto)
|
||||
err := json.Unmarshal(b, thingModelTemplateText)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
var modelTypeSpecText models.TypeSpecText
|
||||
modelTypeSpecText.Length = strconv.Itoa(thingModelTemplateText.Length)
|
||||
return modelTypeSpecText.TransformTostring()
|
||||
case constants.SpecsTypeDate:
|
||||
var modelTypeSpecText models.TypeSpecDate
|
||||
return modelTypeSpecText.TransformTostring()
|
||||
case constants.SpecsTypeBool:
|
||||
thingModelTemplateBool := new([]ThingModelTemplateBool)
|
||||
b, _ := json.Marshal(dto)
|
||||
err := json.Unmarshal(b, thingModelTemplateBool)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
var modelTypeSpecBool models.TypeSpecBool
|
||||
modelTypeSpecBool = make(map[string]string)
|
||||
if thingModelTemplateBool != nil {
|
||||
for _, templateBool := range *thingModelTemplateBool {
|
||||
modelTypeSpecBool[strconv.Itoa(templateBool.Value)] = templateBool.Name
|
||||
}
|
||||
}
|
||||
return modelTypeSpecBool.TransformTostring()
|
||||
case constants.SpecsTypeEnum:
|
||||
thingModelTemplateEnum := new([]ThingModelTemplateEnum)
|
||||
b, _ := json.Marshal(dto)
|
||||
err := json.Unmarshal(b, thingModelTemplateEnum)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
var modelTypeSpecEunm models.TypeSpecEnum
|
||||
modelTypeSpecEunm = make(map[string]string)
|
||||
if thingModelTemplateEnum != nil {
|
||||
for _, templateEunm := range *thingModelTemplateEnum {
|
||||
modelTypeSpecEunm[strconv.Itoa(templateEunm.Value)] = templateEunm.Name
|
||||
}
|
||||
}
|
||||
return modelTypeSpecEunm.TransformTostring()
|
||||
case constants.SpecsTypeArray:
|
||||
thingModelTemplateArray := new(ThingModelTemplateArray)
|
||||
b, _ := json.Marshal(dto)
|
||||
err := json.Unmarshal(b, thingModelTemplateArray)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
var modelTypeSpecArray models.TypeSpecArray
|
||||
modelTypeSpecArray.Size = strconv.Itoa(thingModelTemplateArray.Size)
|
||||
modelTypeSpecArray.Item = models.Item{
|
||||
Type: thingModelTemplateArray.ChildDataType,
|
||||
}
|
||||
return modelTypeSpecArray.TransformTostring()
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func transformSpecType(specType string) constants.SpecsType {
|
||||
var specs constants.SpecsType
|
||||
switch specType {
|
||||
case "INT":
|
||||
specs = constants.SpecsTypeInt
|
||||
case "DOUBLE", "FLOAT":
|
||||
specs = constants.SpecsTypeFloat
|
||||
case "TEXT":
|
||||
specs = constants.SpecsTypeText
|
||||
case "ARRAY":
|
||||
specs = constants.SpecsTypeArray
|
||||
case "BOOL":
|
||||
specs = constants.SpecsTypeBool
|
||||
case "ENUM":
|
||||
specs = constants.SpecsTypeEnum
|
||||
case "STRUCT":
|
||||
specs = constants.SpecsTypeStruct
|
||||
case "DATE":
|
||||
specs = constants.SpecsTypeDate
|
||||
}
|
||||
return specs
|
||||
}
|
||||
|
||||
//ASYNC SYNC
|
||||
type ThingModelTemplateServices struct {
|
||||
ServiceName string `json:"serviceName"`
|
||||
Identifier string `json:"identifier"`
|
||||
Description string `json:"description"`
|
||||
Required bool `json:"required"`
|
||||
CallType constants.CallType `json:"callType"`
|
||||
InputParams []ThingModelTemplateServicesInputParam `json:"inputParams"`
|
||||
OutParams []ThingModelTemplateServicesOutParam `json:"outParams"`
|
||||
}
|
||||
|
||||
type ThingModelTemplateServicesInputParam struct {
|
||||
Name string `json:"name"`
|
||||
Identifier string `json:"identifier"`
|
||||
DataType string `json:"dataType"`
|
||||
DataSpecs interface{} `json:"dataSpecs"`
|
||||
DataSpecsList interface{} `json:"dataSpecsList"`
|
||||
}
|
||||
|
||||
type ThingModelTemplateServicesOutParam struct {
|
||||
Name string `json:"name"`
|
||||
Identifier string `json:"identifier"`
|
||||
DataType string `json:"dataType"`
|
||||
DataSpecs interface{} `json:"dataSpecs"`
|
||||
DataSpecsList interface{} `json:"dataSpecsList"`
|
||||
}
|
||||
|
||||
func (t *ThingModelTemplateServices) TransformModelInPutParams() (inPutParams models.InPutParams) {
|
||||
for _, datum := range t.InputParams {
|
||||
var inputOutput models.InputOutput
|
||||
inputOutput.Code = datum.Identifier
|
||||
inputOutput.Name = datum.Name
|
||||
inputOutput.TypeSpec = getThingModelTemplateTypeSpec(datum.DataType, datum.DataSpecs, datum.DataSpecsList)
|
||||
inPutParams = append(inPutParams, inputOutput)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (t *ThingModelTemplateServices) TransformModelOutPutParams() (outPutParams models.OutPutParams) {
|
||||
for _, datum := range t.OutParams {
|
||||
var inputOutput models.InputOutput
|
||||
inputOutput.Code = datum.Identifier
|
||||
inputOutput.Name = datum.Name
|
||||
inputOutput.TypeSpec = getThingModelTemplateTypeSpec(datum.DataType, datum.DataSpecs, datum.DataSpecsList)
|
||||
outPutParams = append(outPutParams, inputOutput)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
type ThingModelTemplateEvents struct {
|
||||
EventName string `json:"eventName"`
|
||||
EventType string `json:"eventType"`
|
||||
Identifier string `json:"identifier"`
|
||||
Description string `json:"description"`
|
||||
Required bool `json:"required"`
|
||||
OutputData []ThingModelTemplateEventsOutputData `json:"outputData"`
|
||||
}
|
||||
|
||||
type ThingModelTemplateEventsOutputData struct {
|
||||
Name string `json:"name"`
|
||||
Identifier string `json:"identifier"`
|
||||
DataType string `json:"dataType"`
|
||||
Required bool `json:"required"`
|
||||
DataSpecs interface{} `json:"dataSpecs"`
|
||||
DataSpecsList interface{} `json:"dataSpecsList"`
|
||||
}
|
||||
|
||||
func (t *ThingModelTemplateEvents) TransformModelOutputParams() (outPutParams models.OutPutParams) {
|
||||
for _, datum := range t.OutputData {
|
||||
var inputOutput models.InputOutput
|
||||
inputOutput.Code = datum.Identifier
|
||||
inputOutput.Name = datum.Name
|
||||
inputOutput.TypeSpec = getThingModelTemplateTypeSpec(datum.DataType, datum.DataSpecs, datum.DataSpecsList)
|
||||
outPutParams = append(outPutParams, inputOutput)
|
||||
}
|
||||
return outPutParams
|
||||
}
|
||||
|
||||
func getThingModelTemplateTypeSpec(dataType string, dataSpecs, dataSpecsList interface{}) (typeSpec models.TypeSpec) {
|
||||
typeSpec.Type = transformSpecType(dataType)
|
||||
switch typeSpec.Type {
|
||||
case constants.SpecsTypeInt, constants.SpecsTypeFloat:
|
||||
thingModelTemplateIntOrFloat := new(ThingModelTemplateIntOrFloat)
|
||||
b, _ := json.Marshal(dataSpecs)
|
||||
err := json.Unmarshal(b, thingModelTemplateIntOrFloat)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
var modelTypeSpecIntOrFloat models.TypeSpecIntOrFloat
|
||||
modelTypeSpecIntOrFloat.Max = thingModelTemplateIntOrFloat.Max
|
||||
modelTypeSpecIntOrFloat.Min = thingModelTemplateIntOrFloat.Min
|
||||
modelTypeSpecIntOrFloat.Step = thingModelTemplateIntOrFloat.Step
|
||||
modelTypeSpecIntOrFloat.Unit = thingModelTemplateIntOrFloat.Unit
|
||||
modelTypeSpecIntOrFloat.UnitName = thingModelTemplateIntOrFloat.UnitName
|
||||
typeSpec.Specs = modelTypeSpecIntOrFloat.TransformTostring()
|
||||
|
||||
case constants.SpecsTypeText:
|
||||
thingModelTemplateText := new(ThingModelTemplateText)
|
||||
b, _ := json.Marshal(dataSpecs)
|
||||
err := json.Unmarshal(b, thingModelTemplateText)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
var modelTypeSpecText models.TypeSpecText
|
||||
modelTypeSpecText.Length = strconv.Itoa(thingModelTemplateText.Length)
|
||||
typeSpec.Specs = modelTypeSpecText.TransformTostring()
|
||||
case constants.SpecsTypeDate:
|
||||
var modelTypeSpecText models.TypeSpecDate
|
||||
typeSpec.Specs = modelTypeSpecText.TransformTostring()
|
||||
case constants.SpecsTypeBool:
|
||||
thingModelTemplateBool := new([]ThingModelTemplateBool)
|
||||
b, _ := json.Marshal(dataSpecsList)
|
||||
err := json.Unmarshal(b, thingModelTemplateBool)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
var modelTypeSpecBool models.TypeSpecBool
|
||||
modelTypeSpecBool = make(map[string]string)
|
||||
if thingModelTemplateBool != nil {
|
||||
for _, templateBool := range *thingModelTemplateBool {
|
||||
modelTypeSpecBool[strconv.Itoa(templateBool.Value)] = templateBool.Name
|
||||
}
|
||||
}
|
||||
typeSpec.Specs = modelTypeSpecBool.TransformTostring()
|
||||
case constants.SpecsTypeEnum:
|
||||
thingModelTemplateEnum := new([]ThingModelTemplateEnum)
|
||||
b, _ := json.Marshal(dataSpecsList)
|
||||
err := json.Unmarshal(b, thingModelTemplateEnum)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
var modelTypeSpecEunm models.TypeSpecEnum
|
||||
modelTypeSpecEunm = make(map[string]string)
|
||||
if thingModelTemplateEnum != nil {
|
||||
for _, templateEunm := range *thingModelTemplateEnum {
|
||||
modelTypeSpecEunm[strconv.Itoa(templateEunm.Value)] = templateEunm.Name
|
||||
}
|
||||
}
|
||||
typeSpec.Specs = modelTypeSpecEunm.TransformTostring()
|
||||
case constants.SpecsTypeArray:
|
||||
thingModelTemplateArray := new(ThingModelTemplateArray)
|
||||
b, _ := json.Marshal(dataSpecs)
|
||||
err := json.Unmarshal(b, thingModelTemplateArray)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
var modelTypeSpecArray models.TypeSpecArray
|
||||
modelTypeSpecArray.Size = strconv.Itoa(thingModelTemplateArray.Size)
|
||||
modelTypeSpecArray.Item = models.Item{
|
||||
Type: strings.ToLower(thingModelTemplateArray.ChildDataType),
|
||||
}
|
||||
typeSpec.Specs = modelTypeSpecArray.TransformTostring()
|
||||
case constants.SpecsTypeStruct:
|
||||
thingModelTemplateStruct := new([]ThingModelTemplateStruct)
|
||||
b, _ := json.Marshal(dataSpecsList)
|
||||
err := json.Unmarshal(b, thingModelTemplateStruct)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
var modelTypeSpecStruct []models.TypeSpecStruct
|
||||
if thingModelTemplateStruct != nil {
|
||||
for _, templateStruct := range *thingModelTemplateStruct {
|
||||
modelTypeSpecStruct = append(modelTypeSpecStruct, models.TypeSpecStruct{
|
||||
Code: templateStruct.Identifier,
|
||||
Name: templateStruct.ChildName,
|
||||
DataType: models.TypeSpec{
|
||||
Type: transformSpecType(templateStruct.ChildDataType),
|
||||
Specs: getModelSpecByDataType(transformSpecType(templateStruct.ChildDataType), templateStruct.ChildSpecsDTO),
|
||||
},
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
bm, _ := json.Marshal(modelTypeSpecStruct)
|
||||
typeSpec.Specs = string(bm)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func GetModelPropertyEventActionByThingModelTemplate(thingModelJSON string) (properties []models.Properties, events []models.Events, actions []models.Actions) {
|
||||
thingModelTemplate := new(ThingModelTemplate)
|
||||
err := json.Unmarshal([]byte(thingModelJSON), thingModelTemplate)
|
||||
if err == nil {
|
||||
for _, property := range thingModelTemplate.Properties {
|
||||
var accessMode string
|
||||
if property.RwFlag == "READ_ONLY" {
|
||||
accessMode = "R"
|
||||
} else if property.RwFlag == "READ_WRITE" {
|
||||
accessMode = "RW"
|
||||
} else if property.RwFlag == "WRITE_ONLY" {
|
||||
accessMode = "W"
|
||||
}
|
||||
properties = append(properties, models.Properties{
|
||||
Id: utils.RandomNum(),
|
||||
Name: property.Name,
|
||||
Code: property.Identifier,
|
||||
AccessMode: accessMode,
|
||||
Require: property.Required,
|
||||
Description: property.Description,
|
||||
TypeSpec: property.TransformModelTypeSpec(),
|
||||
Tag: string(constants.TagNameSystem),
|
||||
Timestamps: models.Timestamps{
|
||||
Created: time.Now().UnixMilli(),
|
||||
},
|
||||
})
|
||||
}
|
||||
for _, event := range thingModelTemplate.Events {
|
||||
var eventType constants.EventType
|
||||
if event.EventType == "ALERT_EVENT_TYPE" {
|
||||
eventType = constants.EventTypeAlert
|
||||
} else if event.EventType == "INFO_EVENT_TYPE" {
|
||||
eventType = constants.EventTypeInfo
|
||||
} else if event.EventType == "ERROR_EVENT_TYPE" {
|
||||
eventType = constants.EventTypeError
|
||||
}
|
||||
events = append(events, models.Events{
|
||||
Id: utils.RandomNum(),
|
||||
Name: event.EventName,
|
||||
EventType: string(eventType),
|
||||
Code: event.Identifier,
|
||||
Require: event.Required,
|
||||
Description: event.Description,
|
||||
OutputParams: event.TransformModelOutputParams(),
|
||||
Tag: string(constants.TagNameSystem),
|
||||
Timestamps: models.Timestamps{
|
||||
Created: time.Now().UnixMilli(),
|
||||
},
|
||||
})
|
||||
}
|
||||
for _, service := range thingModelTemplate.Services {
|
||||
actions = append(actions, models.Actions{
|
||||
Id: utils.RandomNum(),
|
||||
Name: service.ServiceName,
|
||||
Code: service.Identifier,
|
||||
CallType: service.CallType,
|
||||
Require: service.Required,
|
||||
Description: service.Description,
|
||||
InputParams: service.TransformModelInPutParams(),
|
||||
OutputParams: service.TransformModelOutPutParams(),
|
||||
Tag: string(constants.TagNameSystem),
|
||||
Timestamps: models.Timestamps{
|
||||
Created: time.Now().UnixMilli(),
|
||||
},
|
||||
})
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
//func OpenApiGetModelPropertyEventActionByThingModelTemplate(req OpenApiAddRequest) (properties []models.Properties, events []models.Events, actions []models.Actions) {
|
||||
// for _, property := range req.Properties {
|
||||
// properties = append(properties, models.Properties{
|
||||
// Id: utils.RandomNum(),
|
||||
// Name: property.Name,
|
||||
// Code: property.Code,
|
||||
// AccessMode: property.AccessMode,
|
||||
// Require: property.Required,
|
||||
// Description: property.Description,
|
||||
// TypeSpec: models.TypeSpec(property.TypeSpec),
|
||||
// Tag: string(constants.TagNameCustom),
|
||||
// Timestamps: models.Timestamps{
|
||||
// Created: time.Now().UnixMilli(),
|
||||
// },
|
||||
// })
|
||||
// }
|
||||
//
|
||||
// for _, event := range req.Events {
|
||||
// var outPutParams models.OutPutParams
|
||||
// for _, param := range event.OutputParams {
|
||||
// outPutParams = append(outPutParams, models.InputOutput{
|
||||
// Code: param.Code,
|
||||
// Name: param.Name,
|
||||
// TypeSpec: models.TypeSpec{
|
||||
// Type: param.TypeSpec.Type,
|
||||
// Specs: param.TypeSpec.Specs,
|
||||
// },
|
||||
// })
|
||||
// }
|
||||
// events = append(events, models.Events{
|
||||
// Id: utils.RandomNum(),
|
||||
// Name: event.Name,
|
||||
// EventType: event.EventType,
|
||||
// Code: event.Code,
|
||||
// Require: event.Required,
|
||||
// Description: event.Description,
|
||||
// OutputParams: outPutParams,
|
||||
// Tag: string(constants.TagNameCustom),
|
||||
// Timestamps: models.Timestamps{
|
||||
// Created: time.Now().UnixMilli(),
|
||||
// },
|
||||
// })
|
||||
// }
|
||||
//
|
||||
// for _, action := range req.Actions {
|
||||
// var inPutParams models.InPutParams
|
||||
// var outPutParams models.OutPutParams
|
||||
// for _, param := range action.InputParams {
|
||||
// inPutParams = append(inPutParams, models.InputOutput{
|
||||
// Code: param.Code,
|
||||
// Name: param.Name,
|
||||
// TypeSpec: models.TypeSpec{
|
||||
// Type: param.TypeSpec.Type,
|
||||
// Specs: param.TypeSpec.Specs,
|
||||
// },
|
||||
// })
|
||||
// }
|
||||
// for _, param := range action.OutputParams {
|
||||
// outPutParams = append(outPutParams, models.InputOutput{
|
||||
// Code: param.Code,
|
||||
// Name: param.Name,
|
||||
// TypeSpec: models.TypeSpec{
|
||||
// Type: param.TypeSpec.Type,
|
||||
// Specs: param.TypeSpec.Specs,
|
||||
// },
|
||||
// })
|
||||
// }
|
||||
// actions = append(actions, models.Actions{
|
||||
// Id: utils.RandomNum(),
|
||||
// Name: action.Name,
|
||||
// Code: action.Code,
|
||||
// CallType: action.CallType,
|
||||
// Require: action.Required,
|
||||
// Description: action.Description,
|
||||
// InputParams: inPutParams,
|
||||
// OutputParams: outPutParams,
|
||||
// Tag: string(constants.TagNameCustom),
|
||||
// Timestamps: models.Timestamps{
|
||||
// Created: time.Now().UnixMilli(),
|
||||
// },
|
||||
// })
|
||||
// }
|
||||
// return
|
||||
//}
|
|
@ -0,0 +1,227 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2017 Dell Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
|
||||
package dtos
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"github.com/winc-link/edge-driver-proto/drivercommon"
|
||||
"github.com/winc-link/edge-driver-proto/thingmodel"
|
||||
)
|
||||
|
||||
type ThingModelMessage struct {
|
||||
BaseRequest *drivercommon.BaseRequestMessage
|
||||
Cid string `json:"cid"` // 下发的目标设备id
|
||||
OpType int32 `json:"op_type"` // 消息类型
|
||||
Data string `json:"data"` // 云端下发消息内容
|
||||
}
|
||||
|
||||
func (m *ThingModelMessage) String() string {
|
||||
b, _ := json.Marshal(m)
|
||||
return string(b)
|
||||
}
|
||||
|
||||
type MessageBus struct {
|
||||
DeviceId string `json:"deviceId"`
|
||||
MessageType string `json:"messageType"`
|
||||
Data interface{} `json:"data"`
|
||||
}
|
||||
|
||||
func (m *ThingModelMessage) TransformMessageBus() []byte {
|
||||
var messageBus MessageBus
|
||||
messageBus.DeviceId = m.Cid
|
||||
messageBus.MessageType = thingmodel.OperationType_name[m.OpType]
|
||||
data := make(map[string]interface{})
|
||||
err := json.Unmarshal([]byte(m.Data), &data)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
messageBus.Data = data["data"]
|
||||
b, _ := json.Marshal(messageBus)
|
||||
return b
|
||||
}
|
||||
|
||||
func (m *ThingModelMessage) GetOpType() thingmodel.OperationType {
|
||||
return thingmodel.OperationType(m.OpType)
|
||||
}
|
||||
|
||||
func (m *ThingModelMessage) IsPersistent() bool {
|
||||
var isPersistent bool
|
||||
switch m.GetOpType() {
|
||||
case thingmodel.OperationType_PROPERTY_REPORT, thingmodel.OperationType_EVENT_REPORT:
|
||||
isPersistent = true
|
||||
default:
|
||||
return isPersistent
|
||||
}
|
||||
return isPersistent
|
||||
}
|
||||
|
||||
func (m *ThingModelMessage) TransformMessageDataByProperty() (EdgeXDevicePropertyReport, error) {
|
||||
var dataMsg EdgeXDevicePropertyReport
|
||||
err := json.Unmarshal([]byte(m.Data), &dataMsg)
|
||||
return dataMsg, err
|
||||
}
|
||||
|
||||
func (m *ThingModelMessage) TransformMessageDataByEvent() (EdgeXDeviceEventReport, error) {
|
||||
var dataMsg EdgeXDeviceEventReport
|
||||
err := json.Unmarshal([]byte(m.Data), &dataMsg)
|
||||
return dataMsg, err
|
||||
}
|
||||
|
||||
func (m *ThingModelMessage) TransformMessageDataByService() (SaveServiceIssueData, error) {
|
||||
var dataMsg SaveServiceIssueData
|
||||
err := json.Unmarshal([]byte(m.Data), &dataMsg)
|
||||
return dataMsg, err
|
||||
}
|
||||
|
||||
func (m *ThingModelMessage) TransformMessageDataByServiceExec() (ServiceExecResponse, error) {
|
||||
var dataMsg ServiceExecResponse
|
||||
err := json.Unmarshal([]byte(m.Data), &dataMsg)
|
||||
return dataMsg, err
|
||||
}
|
||||
|
||||
func (m *ThingModelMessage) TransformMessageDataByBatchReport() (DeviceBatchReport, error) {
|
||||
var dataMsg DeviceBatchReport
|
||||
err := json.Unmarshal([]byte(m.Data), &dataMsg)
|
||||
return dataMsg, err
|
||||
}
|
||||
|
||||
func ThingModelMessageFromThingModelMsg(msg *thingmodel.ThingModelMsg) ThingModelMessage {
|
||||
return ThingModelMessage{
|
||||
BaseRequest: msg.BaseRequest,
|
||||
Cid: msg.DeviceId,
|
||||
OpType: int32(msg.OperationType),
|
||||
Data: msg.Data,
|
||||
}
|
||||
}
|
||||
|
||||
type EdgeXDevicePropertyReport struct {
|
||||
MsgId string `json:"msgId"`
|
||||
Version string `json:"version"`
|
||||
//Time int64 `json:"time"`
|
||||
Sys struct {
|
||||
Ack int `json:"ack"`
|
||||
} `json:"sys"`
|
||||
Data map[string]ReportData `json:"data"`
|
||||
}
|
||||
|
||||
type DeviceBatchReport struct {
|
||||
MsgId string `json:"msgId"`
|
||||
Version string `json:"version"`
|
||||
Time int64 `json:"time"`
|
||||
Sys struct {
|
||||
Ack int `json:"ack"`
|
||||
} `json:"sys"`
|
||||
Data BatchData `json:"data"`
|
||||
}
|
||||
|
||||
type BatchData struct {
|
||||
Properties map[string]BatchProperty `json:"properties"`
|
||||
Events map[string]BatchEvent `json:"events"`
|
||||
}
|
||||
|
||||
type BatchProperty struct {
|
||||
Value interface{} `json:"value"`
|
||||
//Time int64 `json:"time"`
|
||||
}
|
||||
type BatchEvent struct {
|
||||
//EventTime int64 `json:"eventTime"`
|
||||
OutputParams map[string]interface{} `json:"outputParams"`
|
||||
}
|
||||
|
||||
type ReportData struct {
|
||||
Value interface{} `json:"value"`
|
||||
Time int64 `json:"time"`
|
||||
}
|
||||
|
||||
func (r *ReportData) Marshal() ([]byte, error) {
|
||||
return json.Marshal(r)
|
||||
}
|
||||
|
||||
type EdgeXDeviceEventReport struct {
|
||||
MsgId string `json:"msgId"`
|
||||
Version string `json:"version"`
|
||||
Sys struct {
|
||||
Ack int `json:"ack"`
|
||||
} `json:"sys"`
|
||||
Data EventData `json:"data"`
|
||||
}
|
||||
|
||||
type EventData struct {
|
||||
EventCode string `json:"eventCode"`
|
||||
EventTime int64 `json:"eventTime"`
|
||||
OutputParams map[string]interface{} `json:"outputParams"`
|
||||
}
|
||||
|
||||
func (r *EventData) Marshal() ([]byte, error) {
|
||||
return json.Marshal(r)
|
||||
}
|
||||
|
||||
//operationType:SERVICE_EXECUTE data:"topic:\"/sys/hq85KDcqGI6/test_008/thing/service/DeleteAlgorithmModel\"
|
||||
//message:\"{\\\"id\\\":\\\"2130175210\\\",\\\"version\\\":\\\"1.0.0\\\",\\\"code\\\":\\\"DeleteAlgorithmModel\\\",\\\"params\\\":{\\\"ForceDelete\\\":3}}\""
|
||||
type InvokeDeviceService struct {
|
||||
MsgId string `json:"msgId"`
|
||||
Version string `json:"version"`
|
||||
Time int64 `json:"time"`
|
||||
Data ServiceData `json:"data"`
|
||||
}
|
||||
|
||||
type ServiceData struct {
|
||||
Code string `json:"code"`
|
||||
InputParams map[string]interface{} `json:"inputParams"`
|
||||
}
|
||||
|
||||
func (r *ServiceData) Marshal() ([]byte, error) {
|
||||
return json.Marshal(r)
|
||||
}
|
||||
|
||||
func (r *InvokeDeviceService) ToString() string {
|
||||
s, _ := json.Marshal(r)
|
||||
return string(s)
|
||||
}
|
||||
|
||||
type SaveServiceIssueData struct {
|
||||
MsgId string `json:"msgId"`
|
||||
Code string `json:"code"`
|
||||
Time int64 `json:"time"`
|
||||
InputParams map[string]interface{} `json:"inputParams"`
|
||||
OutputParams map[string]interface{} `json:"outputParams"`
|
||||
}
|
||||
|
||||
func (r *SaveServiceIssueData) Marshal() ([]byte, error) {
|
||||
return json.Marshal(r)
|
||||
}
|
||||
|
||||
type ServiceExecResponse struct {
|
||||
MsgId string `json:"msgId"`
|
||||
Code string `json:"code"`
|
||||
Time int64 `json:"time"`
|
||||
OutputParams map[string]interface{} `json:"outputParams"`
|
||||
}
|
||||
|
||||
func (r *ServiceExecResponse) Marshal() ([]byte, error) {
|
||||
return json.Marshal(r)
|
||||
}
|
||||
|
||||
type PropertySet struct {
|
||||
Version string `json:"version"`
|
||||
MsgId string `json:"msgId"`
|
||||
Time int64 `json:"time"`
|
||||
Params map[string]interface{} `json:"data"`
|
||||
}
|
||||
|
||||
func (r *PropertySet) ToString() string {
|
||||
s, _ := json.Marshal(r)
|
||||
return string(s)
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2017 Dell Inc.
|
||||
* Copyright (c) 2019 Intel Corporation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
package dtos
|
||||
|
||||
import "github.com/winc-link/hummingbird/internal/models"
|
||||
|
||||
type UnitRequest struct {
|
||||
BaseSearchConditionQuery `schema:",inline"`
|
||||
UnitName string `schema:"unitName" json:"unitName"`
|
||||
}
|
||||
|
||||
type UnitResponse struct {
|
||||
Id string `json:"id"`
|
||||
Symbol string `json:"symbol"`
|
||||
UnitName string `json:"unit_name"`
|
||||
}
|
||||
|
||||
type CosUnitTemplateResponse struct {
|
||||
UnitName string `json:"Name"`
|
||||
Symbol string `json:"Symbol"`
|
||||
}
|
||||
|
||||
func UnitTemplateResponseFromModel(unitModel models.Unit) UnitResponse {
|
||||
return UnitResponse{
|
||||
Id: unitModel.Id,
|
||||
Symbol: unitModel.Symbol,
|
||||
UnitName: unitModel.UnitName,
|
||||
}
|
||||
}
|
||||
|
||||
type UnitTemplateSyncRequest struct {
|
||||
VersionName string `json:"version_name"`
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
package dtos
|
||||
|
||||
type LoginRequest struct {
|
||||
Username string `json:"username" binding:"required"`
|
||||
Password string `json:"password" binding:"required"`
|
||||
}
|
||||
|
||||
type UpdatePasswordRequest struct {
|
||||
CurrentPassword string `json:"currentPassword" binding:"required"`
|
||||
NewPassword string `json:"newPassword" binding:"required"`
|
||||
}
|
||||
|
||||
type UpdateLangRequest struct {
|
||||
Lang string `json:"lang" binding:"required"`
|
||||
}
|
||||
|
||||
type InitPasswordRequest struct {
|
||||
NewPassword string `json:"newPassword" binding:"required"`
|
||||
}
|
||||
|
||||
/************** Response **************/
|
||||
|
||||
type LoginResponse struct {
|
||||
User UserResponse `json:"user"`
|
||||
Token string `json:"token"`
|
||||
ExpiresAt int64 `json:"expiresAt"`
|
||||
}
|
||||
|
||||
type UserResponse struct {
|
||||
Username string `json:"username"`
|
||||
Lang string `json:"lang"`
|
||||
}
|
||||
|
||||
type InitInfoResponse struct {
|
||||
IsInit bool `json:"isInit"`
|
||||
}
|
||||
|
||||
type TokenDetail struct {
|
||||
AccessId string `json:"access_id"`
|
||||
RefreshId string `json:"refresh_id"`
|
||||
AccessToken string `json:"access_token"`
|
||||
RefreshToken string `json:"refresh_token"`
|
||||
AtExpires int64 `json:"at_expires"`
|
||||
RtExpires int64 `json:"rt_expires"`
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2017 Dell Inc.
|
||||
* Copyright (c) 2019 Intel Corporation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
package dtos
|
||||
|
||||
type WsCode uint32
|
||||
|
||||
const (
|
||||
WsCodeDeviceLibraryUpgrade WsCode = 10001 // 驱动下载/升级
|
||||
WsCodeDeviceServiceRunStatus WsCode = 10002 // 驱动重启
|
||||
WsCodeDeviceLibraryDelete WsCode = 10003 // 驱动删除
|
||||
WsCodeDeviceServiceLog WsCode = 10004 // 驱动日志
|
||||
|
||||
WsCodeCloudServiceDownload WsCode = 20001 // 云服务下载
|
||||
WsCodeCloudServiceRunStatus WsCode = 20002 // 云服务重启/停止
|
||||
WsCodeCloudServiceRunDelete WsCode = 20003 // 云服务删除
|
||||
WsCodeCloudServiceRunLog WsCode = 20004 // 云服务日志
|
||||
|
||||
WsCodeCheckLang WsCode = 30001 // 切换语言
|
||||
|
||||
// 云端网络情况
|
||||
WsCodeCloudState WsCode = 10007 // 云端网络情况
|
||||
//OTA
|
||||
WsCodeOTAUpgradeProgress WsCode = 10100 // OTA升级进度
|
||||
WsCodeOTAFirmwareUpgrade WsCode = 10101 // OTA升级
|
||||
// 严重警告
|
||||
WsCodeSeriousAlert WsCode = 10200
|
||||
)
|
|
@ -0,0 +1,191 @@
|
|||
package models
|
||||
|
||||
import (
|
||||
"database/sql/driver"
|
||||
"encoding/json"
|
||||
"github.com/winc-link/hummingbird/internal/pkg/constants"
|
||||
)
|
||||
|
||||
// TypeSpec 物模型的属性、事件、动作的基础信息字段
|
||||
type TypeSpec struct {
|
||||
Type constants.SpecsType `json:"type,omitempty"`
|
||||
Specs string `json:"specs,omitempty"`
|
||||
}
|
||||
|
||||
type TypeSpecIntOrFloat struct {
|
||||
Min string `json:"min,omitempty"`
|
||||
Max string `json:"max,omitempty"`
|
||||
Step string `json:"step,omitempty"`
|
||||
Unit string `json:"unit,omitempty"`
|
||||
UnitName string `json:"unitName,omitempty"`
|
||||
}
|
||||
|
||||
func (t *TypeSpecIntOrFloat) TransformTostring() string {
|
||||
b, _ := json.Marshal(t)
|
||||
return string(b)
|
||||
}
|
||||
|
||||
type TypeSpecText struct {
|
||||
Length string `json:"length,omitempty"`
|
||||
}
|
||||
|
||||
func (t *TypeSpecText) TransformTostring() string {
|
||||
b, _ := json.Marshal(t)
|
||||
return string(b)
|
||||
}
|
||||
|
||||
type TypeSpecBool map[string]string
|
||||
|
||||
func (t *TypeSpecBool) TransformTostring() string {
|
||||
b, _ := json.Marshal(t)
|
||||
return string(b)
|
||||
}
|
||||
|
||||
type TypeSpecArray struct {
|
||||
Size string `json:"size,omitempty"`
|
||||
Item Item `json:"item,omitempty"`
|
||||
}
|
||||
|
||||
func (t *TypeSpecArray) TransformTostring() string {
|
||||
b, _ := json.Marshal(t)
|
||||
return string(b)
|
||||
}
|
||||
|
||||
type TypeSpecEnum map[string]string
|
||||
|
||||
func (t *TypeSpecEnum) TransformTostring() string {
|
||||
b, _ := json.Marshal(t)
|
||||
return string(b)
|
||||
}
|
||||
|
||||
type TypeSpecStruct struct {
|
||||
Code string `json:"code"`
|
||||
Name string `json:"name"`
|
||||
DataType TypeSpec `json:"data_type"`
|
||||
}
|
||||
|
||||
func (t *TypeSpecStruct) TransformTostring() string {
|
||||
b, _ := json.Marshal(t)
|
||||
return string(b)
|
||||
}
|
||||
|
||||
type TypeSpecDate struct {
|
||||
}
|
||||
|
||||
func (t *TypeSpecDate) TransformTostring() string {
|
||||
b, _ := json.Marshal(t)
|
||||
return string(b)
|
||||
}
|
||||
|
||||
type Item struct {
|
||||
Type string `json:"type,omitempty"`
|
||||
}
|
||||
|
||||
func (c Item) Value() (driver.Value, error) {
|
||||
return GormValueWrap(c)
|
||||
}
|
||||
|
||||
func (c *Item) Scan(value interface{}) error {
|
||||
return GormScanWrap(value, c)
|
||||
}
|
||||
|
||||
type Properties struct {
|
||||
Id string `json:"id" gorm:"id;primaryKey;not null;type:string;size:255;comment:主键"`
|
||||
ProductId string `json:"product_id" gorm:"type:string;size:255;comment:产品ID"`
|
||||
Name string `json:"name" gorm:"type:string;size:255;comment:名字"`
|
||||
Code string `json:"code" gorm:"type:string;size:255;comment:标识符"`
|
||||
AccessMode string `json:"access_mode" gorm:"type:string;size:50;comment:读写模型"`
|
||||
Require bool `json:"require" gorm:"comment:是否必须"`
|
||||
TypeSpec TypeSpec `json:"type_spec" gorm:"type:text;comment:属性物模型详情"`
|
||||
Description string `json:"description" gorm:"type:text;comment:描述"`
|
||||
Tag string `json:"tag" gorm:"type:string;size:50;comment:标签"`
|
||||
System bool `json:"system" gorm:"comment:系统内置"`
|
||||
Timestamps
|
||||
}
|
||||
|
||||
func (c TypeSpec) Value() (driver.Value, error) {
|
||||
return GormValueWrap(c)
|
||||
}
|
||||
|
||||
func (c *TypeSpec) Scan(value interface{}) error {
|
||||
return GormScanWrap(value, c)
|
||||
}
|
||||
|
||||
func (p *Properties) TableName() string {
|
||||
return "properties"
|
||||
}
|
||||
|
||||
func (p *Properties) Get() interface{} {
|
||||
return *p
|
||||
}
|
||||
|
||||
type Actions struct {
|
||||
Id string `json:"id" gorm:"id;primaryKey;not null;type:string;size:255;comment:主键"`
|
||||
ProductId string `json:"product_id" gorm:"type:string;size:255;comment:产品ID"`
|
||||
Code string `json:"code" gorm:"type:string;size:255;comment:标识符"`
|
||||
Name string `json:"name" gorm:"type:string;size:255;comment:名字"`
|
||||
Description string `json:"description" gorm:"type:text;comment:描述"`
|
||||
Require bool `json:"require" gorm:"comment:是否必须"`
|
||||
CallType constants.CallType `json:"call_type" gorm:"type:string;size:50;comment:调用方式"`
|
||||
InputParams InPutParams `json:"input_params" gorm:"type:text;comment:输入参数"` // 输入参数
|
||||
OutputParams OutPutParams `json:"output_params" gorm:"type:text;comment:输入参数"` // 输出参数
|
||||
Tag string `json:"tag" gorm:"type:string;size:50;comment:标签"`
|
||||
System bool `json:"system" gorm:"comment:系统内置"`
|
||||
Timestamps
|
||||
}
|
||||
|
||||
type InPutParams []InputOutput
|
||||
|
||||
type InputOutput struct {
|
||||
Code string `json:"code"`
|
||||
Name string `json:"name"`
|
||||
TypeSpec TypeSpec `json:"type_spec"`
|
||||
}
|
||||
|
||||
func (c InPutParams) Value() (driver.Value, error) {
|
||||
return GormValueWrap(c)
|
||||
}
|
||||
|
||||
func (c *InPutParams) Scan(value interface{}) error {
|
||||
return GormScanWrap(value, c)
|
||||
}
|
||||
|
||||
type OutPutParams []InputOutput
|
||||
|
||||
func (c OutPutParams) Value() (driver.Value, error) {
|
||||
return GormValueWrap(c)
|
||||
}
|
||||
|
||||
func (c *OutPutParams) Scan(value interface{}) error {
|
||||
return GormScanWrap(value, c)
|
||||
}
|
||||
|
||||
func (table *Actions) TableName() string {
|
||||
return "actions"
|
||||
}
|
||||
|
||||
func (table *Actions) Get() interface{} {
|
||||
return *table
|
||||
}
|
||||
|
||||
type Events struct {
|
||||
Id string `json:"id" gorm:"id;primaryKey;not null;type:string;size:255;comment:主键"`
|
||||
ProductId string `json:"product_id" gorm:"type:string;size:255;comment:产品ID"`
|
||||
EventType string `json:"event_type" gorm:"type:string;size:255;comment:事件类型"`
|
||||
Code string `json:"code" gorm:"type:string;size:255;comment:标识符"`
|
||||
Name string `json:"name" gorm:"type:string;size:255;comment:名字"`
|
||||
Description string `json:"description" gorm:"type:text;comment:描述"`
|
||||
Require bool `json:"require" gorm:"comment:是否必须"`
|
||||
OutputParams OutPutParams `json:"output_params" gorm:"type:text;comment:输入参数"`
|
||||
Tag string `json:"tag" gorm:"type:string;size:50;comment:标签"`
|
||||
System bool `json:"system" gorm:"comment:系统内置"`
|
||||
Timestamps
|
||||
}
|
||||
|
||||
func (table *Events) TableName() string {
|
||||
return "events"
|
||||
}
|
||||
|
||||
func (table *Events) Get() interface{} {
|
||||
return *table
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2017.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
* or implied. See the License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*******************************************************************************/
|
||||
|
||||
package models
|
||||
|
||||
import "github.com/winc-link/hummingbird/internal/pkg/constants"
|
||||
|
||||
type AdvanceConfig struct {
|
||||
ID int `json:"id" gorm:"id;primaryKey;not null;type:string;size:255;comment:主键"`
|
||||
LogLevel constants.LogLevel `gorm:"default:1;comment:日志等级"` // 日志级别 默认为INFO
|
||||
PersistStorage bool `gorm:"default:0;comment:存储开关"`
|
||||
StorageHour int32 `gorm:"default:24;comment:存储时长"`
|
||||
}
|
||||
|
||||
func (table *AdvanceConfig) TableName() string {
|
||||
return "advance_config"
|
||||
}
|
||||
|
||||
func (table *AdvanceConfig) Get() interface{} {
|
||||
return *table
|
||||
}
|