明树Git Lab
Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
L
letian_backend
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zengfanpei
letian_backend
Commits
e768aafd
Commit
e768aafd
authored
Oct 17, 2024
by
zengfanpei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update
parent
8efc7461
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
438 additions
and
310 deletions
+438
-310
deviceController.js
controller/deviceController.js
+1
-1
deviceCron.js
cron/deviceCron.js
+0
-182
index.js
cron/index.js
+46
-40
ipsCron.js
cron/ipsCron.js
+161
-0
smcCron.js
cron/smcCron.js
+9
-2
wsCron.js
cron/wsCron.js
+148
-0
collectDevice.js
db/models/collectDevice.js
+6
-6
collectIPSModule.js
module/collectIPSModule.js
+66
-78
deviceModule.js
module/deviceModule.js
+1
-1
No files found.
controller/deviceController.js
View file @
e768aafd
...
@@ -16,7 +16,7 @@ async function list(req, res, next) {
...
@@ -16,7 +16,7 @@ async function list(req, res, next) {
search
.
name
=
{
$regex
:
req
.
body
.
name
};
search
.
name
=
{
$regex
:
req
.
body
.
name
};
}
}
const
count
=
await
DB
.
Device
.
countDocuments
(
search
);
const
count
=
await
DB
.
Device
.
countDocuments
(
search
);
let
list
=
await
DB
.
Device
.
find
(
search
).
skip
(
skip
).
limit
(
pageSize
).
select
(
'deviceNumber creatTime deviceHQ
State deviceHQ
Type name'
).
populate
({
path
:
"land"
}).
lean
().
exec
();
let
list
=
await
DB
.
Device
.
find
(
search
).
skip
(
skip
).
limit
(
pageSize
).
select
(
'deviceNumber creatTime deviceHQType name'
).
populate
({
path
:
"land"
}).
lean
().
exec
();
let
deviceNumbers
=
[];
let
deviceNumbers
=
[];
//处理在线状态
//处理在线状态
let
onlineArr
=
await
deviceModule
.
getDeviceOnlineMap
();
let
onlineArr
=
await
deviceModule
.
getDeviceOnlineMap
();
...
...
cron/deviceCron.js
View file @
e768aafd
...
@@ -52,190 +52,8 @@ async function getAllDevice() {
...
@@ -52,190 +52,8 @@ async function getAllDevice() {
}
}
}
}
/* -------------------------------------------有诸多不确定因素,暂时分开,后续 请求日志需要分别按照不同设备种类区分类型------------------------------------------------------------------ */
/**
* 采集上述设备 3 的信息
*/
async
function
collectDeviceInfo3
({
deviceHQType
})
{
if
(
!
deviceHQType
)
{
return
;
}
// 查询有效状态、类型的设备信息
const
devices
=
await
deviceModule
.
findAll
({
deviceHQType
:
deviceHQType
||
3
,
deviceHQState
:
1
,
deviceNumber
:
{
$exists
:
true
}
},
[
'deviceNumber'
,
'deviceHQType'
]);
// if (col.includes("温度") && data[i]) {
// const dataArr = data[i].trim().split(' ');
// obj.soilTemperature = String(dataArr[0]).trim();
// obj.soilTemperatureUnit = String(dataArr[1]).trim();
// }
// if (col.includes("湿度")) {
// const dataArr = data[i].trim().split(' ');
// obj.soilMoisture = String(dataArr[0]).trim();
// obj.soilMoistureUnit = String(dataArr[1]).trim();
// }
// if (col.includes("氮")) {
// const dataArr = data[i].trim().split(' ');
// obj.nitrogen = String(dataArr[0]).trim();
// obj.nitrogenUnit = String(dataArr[1]).trim();
// }
// if (col.includes("磷")) {
// const dataArr = data[i].trim().split(' ');
// obj.phosphorus = String(dataArr[0]).trim();
// obj.phosphorusUnit = String(dataArr[1]).trim();
// }
// if (col.includes("钾")) {
// const dataArr = data[i].trim().split(' ');
// obj.potassium = String(dataArr[0]).trim();
// obj.potassiumUnit = String(dataArr[1]).trim();
// }
// if (col.includes("信号强度")) {
// const dataArr = data[i].trim().split(' ');
// obj.signalSterngth = String(dataArr[0]).trim();
// obj.signalSterngthUnit = String(dataArr[1]).trim();
// }
// if (col.includes("错误码")) {
// obj.errorCode = data[i].trim();
// }
// if (col.includes("版本号")) {
// obj.version = data[i].trim();
// }
}
/**
* 采集上述设备 4 的信息
*/
async
function
collectDeviceInfo4
({
deviceHQType
})
{
if
(
!
deviceHQType
)
{
return
;
}
const
url
=
sysConfig
.
device
.
getInsectNewCollectionResult
;
const
token
=
sysConfig
.
device
.
token
;
const
userName
=
sysConfig
.
device
.
userName
;
// const password = sysConfig.device.password;
// 查询有效状态、类型的设备信息
const
devices
=
await
deviceModule
.
findAll
({
deviceHQType
:
'4'
,
deviceHQState
:
1
},
[
'deviceNumber'
,
'deviceHQType'
]);
console
.
log
(
devices
.
length
)
for
(
let
index
=
0
;
index
<
devices
.
length
;
index
++
)
{
const
dev
=
devices
[
index
];
// console.log(dev);
const
result
=
await
httpRequest
({
url
,
method
:
"POST"
,
params
:
{
token
,
userName
,
deviceNumber
:
dev
.
deviceNumber
}
});
// console.log(result);
if
(
result
&&
result
.
data
&&
result
.
data
.
state
==
"success"
)
{
let
obj
=
result
.
data
.
data
||
{};
obj
.
name
=
obj
.
name
||
dev
.
name
;
await
collectIPSModule
.
insertHQData
(
obj
);
console
.
log
(
obj
);
// 3. 处理虫情每日种类数量记录
// handleIPS(obj);
// 4. 处理设备在线状态
handleDeviceOnLine
({
deviceNumber
:
obj
.
deviceNumber
,
online
:
obj
.
online
});
//onLineState 1在线0离线
}
}
}
/**-------------数据处理---------------- */
// colInfo是一个硬件设备的一条信息
async
function
handleCJData
(
colInfo
,
deviceHQType
)
{
let
handleData
=
{},
attrExistMap
=
{};
//1. 先获取到attr配置
let
attrs
=
await
DB
.
CollectAttribute
.
find
({
del
:
0
,
enable
:
true
,
deviceHQType
});
let
types
=
colInfo
.
type
.
split
(
'/'
);
let
data
=
colInfo
.
data
.
split
(
'|'
);
for
(
let
i
=
0
;
i
<
types
.
length
;
i
++
)
{
const
col
=
types
[
i
];
for
(
let
j
=
0
;
j
<
attrs
.
length
;
j
++
)
{
const
attr
=
attrs
[
j
];
if
(
col
.
includes
(
attr
.
deviceKey
))
{
if
([
'errorCode'
,
'version'
].
includes
(
attr
.
dbKey
))
{
handleData
[
attr
.
dbKey
]
=
data
[
i
].
trim
();
}
else
{
const
dataArr
=
data
[
i
].
trim
().
split
(
' '
);
if
(
attrExistMap
[
attr
.
dbKey
])
{
handleData
[
`
${
attr
.
dbKey
}
Arr`
]
=
handleData
[
`
${
attr
.
dbKey
}
Arr`
]
||
[];
handleData
[
`
${
attr
.
dbKey
}
Arr`
].
push
(
Number
(
String
(
dataArr
[
0
]).
trim
()));
}
else
{
handleData
[
attr
.
dbKey
]
=
Number
(
String
(
dataArr
[
0
]).
trim
());
}
handleData
[
`
${
attr
.
dbKey
}
Unit`
]
=
String
(
dataArr
[
1
]).
trim
();
}
}
}
}
for
(
let
index
=
0
;
index
<
attrs
.
length
;
index
++
)
{
const
attr
=
attrs
[
index
];
if
(
handleData
[
`
${
attr
.
dbKey
}
Arr`
]
&&
handleData
[
`
${
attr
.
dbKey
}
Arr`
].
length
)
{
handleData
[
attr
.
dbKey
]
=
(
_
.
sum
(
handleData
[
`
${
attr
.
dbKey
}
Arr`
])
/
handleData
[
`
${
attr
.
dbKey
}
Arr`
].
length
).
toFixed
(
2
)
}
}
return
handleData
;
}
async
function
handleDeviceOnLine
({
deviceNumber
,
online
})
{
// 虫情 online = 0;//在线状态 0false/1true
// 土壤 onLineState 1在线0离线
if
(
!
deviceNumber
)
{
return
;
}
//该方式待定
let
key
=
`device_online`
;
if
(
online
==
0
)
{
await
ioRedis
.
hdel
(
key
,
deviceNumber
);
}
else
{
let
obj
=
{};
obj
[
deviceNumber
]
=
1
;
await
ioRedis
.
hset
(
key
,
obj
)
}
}
async
function
handleDeviceThreshold
(
obj
)
{
let
ths
=
await
DB
.
CollectThreshold
.
find
({
del
:
0
,
enable
:
true
,
deviceNumber
:
obj
.
deviceNumber
}).
populate
({
path
:
"attrId"
}).
lean
().
exec
();
let
exceeds
=
[];
for
(
let
i
=
0
;
i
<
ths
.
length
;
i
++
)
{
const
element
=
ths
[
i
];
// console.log(element, "====", obj[element.dbKey], _.isNumber(obj[element.dbKey]), _.gt(obj[element.dbKey], element.max), _.isNumber(element.max))
if
(
_
.
isNumber
(
obj
[
element
.
dbKey
]))
{
if
(
_
.
isNumber
(
element
.
max
)
&&
_
.
gt
(
obj
[
element
.
dbKey
],
element
.
max
))
{
// 采集值 > 最大设置值
// exceeds.push({...element, collectValue: obj[element.dbKey], deviceNumber: obj.deviceNumber});
exceeds
.
push
(
`设备
${
obj
.
deviceNumber
}
, 采集值:
${
obj
[
element
.
dbKey
]}
, 最大阈值:
${
element
.
max
}
`
);
}
if
(
_
.
isNumber
(
element
.
min
)
&&
_
.
lt
(
obj
[
element
.
dbKey
],
element
.
min
))
{
// exceeds.push({...element, collectValue: obj[element.dbKey], deviceNumber: obj.deviceNumber});
exceeds
.
push
(
`设备
${
obj
.
deviceNumber
}
, 采集值:
${
obj
[
element
.
dbKey
]}
, 最小阈值:
${
element
.
min
}
`
);
}
}
}
console
.
log
(
exceeds
);
// 处理通知模板
if
(
exceeds
.
length
)
{
await
DB
.
Notice
.
create
({
sendUser
:
"66d6c4099f8480c6db53ce13"
,
receiveUser
:
"66d6c4099f8480c6db53ce13"
,
content
:
exceeds
.
join
(
"
\
\n
"
),
});
}
}
/**-------------数据处理---------------- */
// collectDeviceInfo1({deviceHQType:1});
// getDeviceList()
module
.
exports
=
{
module
.
exports
=
{
getDeviceList
,
getDeviceList
,
getAllDevice
,
getAllDevice
,
collectDeviceInfo3
,
collectDeviceInfo4
,
}
}
\ No newline at end of file
cron/index.js
View file @
e768aafd
...
@@ -4,6 +4,10 @@ const config = require('../config');
...
@@ -4,6 +4,10 @@ const config = require('../config');
const
deviceCron
=
require
(
'./deviceCron'
);
const
deviceCron
=
require
(
'./deviceCron'
);
//土壤
//土壤
const
smcCron
=
require
(
'./smcCron'
);
const
smcCron
=
require
(
'./smcCron'
);
//气象
const
wsCron
=
require
(
'./wsCron'
);
// 虫情
const
ipsCron
=
require
(
'./ipsCron'
);
/**
/**
根据config cron 配置 定时处理
根据config cron 配置 定时处理
...
@@ -20,63 +24,65 @@ const smcCron = require('./smcCron');
...
@@ -20,63 +24,65 @@ const smcCron = require('./smcCron');
const
cron
=
()
=>
{
const
cron
=
()
=>
{
/*-----------------------------采集设备信息-------------------------------------*/
/*-----------------------------采集设备信息-------------------------------------*/
// 1 土壤温湿度、土壤氮磷钾, 2 土壤ph、土壤电导率, 3 气象站
// 1 土壤温湿度、土壤氮磷钾, 2 土壤ph、土壤电导率, 3 气象站
if
(
sysConfig
&&
sysConfig
.
cron
&&
sysConfig
.
cron
.
getDeviceList
)
{
//
if (sysConfig && sysConfig.cron && sysConfig.cron.getDeviceList) {
console
.
log
(
"getDeviceList:"
,
new
Date
());
//
console.log("getDeviceList:", new Date());
// 每天10点30分 处理 1 30 10 * * *
//
// 每天10点30分 处理 1 30 10 * * *
// new nodeCron.schedule('1 30 10 * * *', async () => {
//
// new nodeCron.schedule('1 30 10 * * *', async () => {
new
nodeCron
.
schedule
(
'1 * * * * *'
,
async
()
=>
{
//
new nodeCron.schedule('1 * * * * *', async () => {
await
deviceCron
.
getDeviceList
();
//
await deviceCron.getDeviceList();
},
{
timezone
:
"Asia/Shanghai"
});
//
}, { timezone: "Asia/Shanghai" });
}
//
}
// 4 虫情
//
//
4 虫情
if
(
sysConfig
&&
sysConfig
.
cron
&&
sysConfig
.
cron
.
getAllDevice
)
{
//
if (sysConfig && sysConfig.cron && sysConfig.cron.getAllDevice) {
console
.
log
(
"getAllDevice:"
,
new
Date
());
//
console.log("getAllDevice:", new Date());
// new nodeCron.schedule('1 30 10 * * *', async () => {
//
// new nodeCron.schedule('1 30 10 * * *', async () => {
new
nodeCron
.
schedule
(
'1 * * * * *'
,
async
()
=>
{
//
new nodeCron.schedule('1 * * * * *', async () => {
await
deviceCron
.
getAllDevice
();
//
await deviceCron.getAllDevice();
},
{
timezone
:
"Asia/Shanghai"
});
//
}, { timezone: "Asia/Shanghai" });
}
//
}
/*-----------------------------采集数据信息-------------------------------------*/
/*-----------------------------采集数据信息-------------------------------------*/
// 土壤温湿度、氮磷钾 deviceHQType 1
// 土壤温湿度、氮磷钾 deviceHQType 1
if
(
sysConfig
&&
sysConfig
.
cron
&&
sysConfig
.
cron
.
collectDeviceInfo
)
{
// if (sysConfig && sysConfig.cron && sysConfig.cron.collectDeviceInfo) {
console
.
log
(
"collectDeviceInfo1:"
,
new
Date
());
// console.log("collectDeviceInfo1:", new Date());
// 每10分钟
// // 每10分钟
new
nodeCron
.
schedule
(
'0 */3 * * * *'
,
async
()
=>
{
// new nodeCron.schedule('0 */1 * * * *', async () => {
await
smcCron
.
collectDeviceInfo1
({
deviceHQType
:
1
});
// await smcCron.collectDeviceInfo1({ deviceHQType: 1 });
},
{
timezone
:
"Asia/Shanghai"
});
// }, { timezone: "Asia/Shanghai" });
}
// }
// 土壤ph土壤电导率 deviceHQType 2
if
(
sysConfig
&&
sysConfig
.
cron
&&
sysConfig
.
cron
.
collectDeviceInfo
)
{
console
.
log
(
"collectDeviceInfo2:"
,
new
Date
());
new
nodeCron
.
schedule
(
'0 */3 * * * *'
,
async
()
=>
{
await
smcCron
.
collectDeviceInfo1
({
deviceHQType
:
2
});
},
{
timezone
:
"Asia/Shanghai"
});
}
// //
获取设备上述设备 3 采集信息
// //
土壤ph土壤电导率 deviceHQType 2
// if (sysConfig && sysConfig.cron && sysConfig.cron.collectDeviceInfo) {
// if (sysConfig && sysConfig.cron && sysConfig.cron.collectDeviceInfo) {
// console.log("collectDeviceInfo
3
:", new Date());
// console.log("collectDeviceInfo
2
:", new Date());
// new nodeCron.schedule('
* */3
* * * *', async () => {
// new nodeCron.schedule('
30 */1
* * * *', async () => {
// await
deviceCron.collectDeviceInfo3({ deviceHQType: 3
});
// await
smcCron.collectDeviceInfo1({ deviceHQType: 2
});
// }, { timezone: "Asia/Shanghai" });
// }, { timezone: "Asia/Shanghai" });
// }
// }
// // 获取设备上述设备 4 采集信息
// // 3 气象站 获取设备上述设备 3 采集信息
// if (sysConfig && sysConfig.cron && sysConfig.cron.collectDeviceInfo) {
// if (sysConfig && sysConfig.cron && sysConfig.cron.collectDeviceInfo) {
// console.log("collectDeviceInfo
4
:", new Date());
// console.log("collectDeviceInfo
3
:", new Date());
// new nodeCron.schedule('
* */3
* * * *', async () => {
// new nodeCron.schedule('
50 */1
* * * *', async () => {
// await
deviceCron.collectDeviceInfo4({ deviceHQType: 4
});
// await
wsCron.collectDeviceInfo3({ deviceHQType: 3
});
// }, { timezone: "Asia/Shanghai" });
// }, { timezone: "Asia/Shanghai" });
// }
// }
// 获取设备上述设备 4 采集信息
if
(
sysConfig
&&
sysConfig
.
cron
&&
sysConfig
.
cron
.
collectDeviceInfo
)
{
console
.
log
(
"collectDeviceInfo4:"
,
new
Date
());
new
nodeCron
.
schedule
(
'1 */1 * * * *'
,
async
()
=>
{
await
ipsCron
.
collectDeviceInfo4
({
deviceHQType
:
4
});
},
{
timezone
:
"Asia/Shanghai"
});
}
}
}
module
.
exports
=
cron
;
module
.
exports
=
cron
;
\ No newline at end of file
cron/ipsCron.js
0 → 100644
View file @
e768aafd
// 气象
const
httpRequest
=
require
(
'../utils/httpRequest'
);
const
deviceModule
=
require
(
'../module/deviceModule'
);
const
collectIPSModule
=
require
(
'../module/collectIPSModule'
);
const
_
=
require
(
'lodash'
);
/**
* 采集上述设备 4 的信息
*/
async
function
collectDeviceInfo4
({
deviceHQType
})
{
// const url = sysConfig.device.getAllDevice;
// const token = sysConfig.device.token;
// const userName = sysConfig.device.userName;
// const password = sysConfig.device.password;
// // 查询有效状态、类型的设备信息
// const devices = await deviceModule.findAll({ deviceHQType: '4'}, ['deviceNumber', 'deviceHQType']);
// console.log(devices.length)
// for (let index = 0; index < devices.length; index++) {
// const dev = devices[index];
// // console.log(dev);
// const result = await httpRequest({
// url,
// method: "POST",
// params: { token, userName, deviceNumber: dev.deviceNumber }
// });
// // console.log(result);
// if(result && result.data && result.data.state == "success") {
// let obj = result.data.data || {};
// obj.name = obj.name || dev.name;
// await collectIPSModule.insertHQData(obj);
// console.log(obj);
// // 3. 处理虫情每日种类数量记录
// // 4. 处理设备在线状态
// handleDeviceOnLine({deviceNumber: obj.deviceNumber, online: obj.online}); //onLineState 1在线0离线
// } else {
// handleDeviceOnLine({deviceNumber: obj.deviceNumber, online: 0}); //onLineState 1在线0离线
// }
// }
/**
* 按硬件方要求 获取虫子的种类 和 数量 均调用设备列表接口
*/
const
url
=
sysConfig
.
device
.
getAllDevice
;
const
token
=
sysConfig
.
device
.
token
;
const
userName
=
sysConfig
.
device
.
userName
;
const
password
=
sysConfig
.
device
.
password
;
let
result
=
await
httpRequest
({
url
,
method
:
"POST"
,
params
:
{
token
,
userName
,
password
},
});
if
(
result
&&
result
.
data
&&
result
.
data
.
state
==
"success"
)
{
let
devArr
=
result
.
data
.
data
||
[];
for
(
let
index
=
0
;
index
<
devArr
.
length
;
index
++
)
{
const
element
=
devArr
[
index
];
let
obj
=
{
downloadUrl
:
element
.
imgUrl
,
newTime
:
element
.
latestCollectionTime
,
results
:
element
.
results
||
""
,
typeCount
:
element
.
typeCount
||
0
,
newCount
:
element
.
newCount
||
0
,
online
:
element
.
online
,
deviceNumber
:
element
.
deviceNumber
,
}
console
.
log
(
obj
,
"==================================="
)
await
collectIPSModule
.
insertHQData
(
obj
);
// 处理虫子种类入库 数量入库
handleDeviceOnLine
({
deviceNumber
:
obj
.
deviceNumber
,
online
:
obj
.
online
});
//onLineState 1在线0离线
}
}
}
/**
* {
data: [
{
id: 2041,
creatTime: '2024-10-15 09:48:55',
deviceNumber: 'FF35029f76da',
name: '乐田运行中心虫情检测仪1',
leader: '吴工',
phone: '15766510011',
position: '雷州市客路镇乐尾村',
latitudeAndLongitude: '110.04843,21.063616',
createUser: 'ZJLTNY',
latestCollectionCount: 0,
latestCollectionTime: '2024-10-17 14:58:00',
typeCount: 0,
imgUrl: 'picturesCompress/FF35029F76DA/orgin_2024-10-17-14-57-59.jpg',
readState: 1,
online: 0,
dayEarlyCount: 0,
rain: 0,
wind: 0,
startType: 'position',
hours: 0,
minute: 0,
sun: 0,
rainMouth: 0,
uploadInterval: 0,
isUpdate: 0,
deviceType: 0,
riseHour: '6',
riseMin: '36',
setHour: '18',
setMin: '13'
}
],
state: 'success'
}
*/
async
function
handleDeviceOnLine
({
deviceNumber
,
online
})
{
// 虫情 online = 0;//在线状态 0false/1true
// 土壤 onLineState 1在线0离线
if
(
!
deviceNumber
)
{
return
;
}
//该方式待定
let
key
=
`device_online`
;
if
(
online
==
0
)
{
await
ioRedis
.
hdel
(
key
,
deviceNumber
);
}
else
{
let
obj
=
{};
obj
[
deviceNumber
]
=
1
;
await
ioRedis
.
hset
(
key
,
obj
)
}
}
module
.
exports
=
{
collectDeviceInfo4
,
}
cron/smcCron.js
View file @
e768aafd
...
@@ -19,7 +19,7 @@ async function collectDeviceInfo1({ deviceHQType }) {
...
@@ -19,7 +19,7 @@ async function collectDeviceInfo1({ deviceHQType }) {
const
secretKey
=
sysConfig
.
device
.
secretKey
;
const
secretKey
=
sysConfig
.
device
.
secretKey
;
// 查询有效状态、类型的设备信息
// 查询有效状态、类型的设备信息
const
devices
=
await
deviceModule
.
findAll
({
deviceHQType
:
deviceHQType
,
device
HQState
:
1
,
device
Number
:
{
$exists
:
true
}
},
[
'deviceNumber'
,
'deviceHQType'
,
'name'
]);
const
devices
=
await
deviceModule
.
findAll
({
deviceHQType
:
deviceHQType
,
deviceNumber
:
{
$exists
:
true
}
},
[
'deviceNumber'
,
'deviceHQType'
,
'name'
]);
for
(
let
index
=
0
;
index
<
devices
.
length
;
index
++
)
{
for
(
let
index
=
0
;
index
<
devices
.
length
;
index
++
)
{
const
dev
=
devices
[
index
];
const
dev
=
devices
[
index
];
...
@@ -59,11 +59,18 @@ async function collectDeviceInfo1({ deviceHQType }) {
...
@@ -59,11 +59,18 @@ async function collectDeviceInfo1({ deviceHQType }) {
/**-------------数据处理---------------- */
/**-------------数据处理---------------- */
/**
* type: '土壤PH1 / 土壤电导率1 / 土壤PH2 / 土壤电导率2 / 土壤PH3 / 土壤电导率3 / 信号强度 / 错误码 / 版本号',
data: '3.03 PH | 207 us/cm | 3 PH | 202 us/cm | 3.06 PH | 216 us/cm | 31 RSSI | 0 | 11.7 Version',
type: '智壤仪温度1 / 智壤仪湿度1 / 土壤氮1 / 土壤磷1 / 土壤钾1 / 智壤仪温度2 / 智壤仪湿度2 / 土壤氮2 / 土壤磷2 / 土壤钾2 / 智壤仪温度3 / 智壤仪湿度3 / 土壤氮3 / 土壤磷3 / 土壤钾3 / 信号强度 / 错误码 / 版本号',
data: '30.2 ℃ | 11.4 % | 9 mg/kg | 10 mg/kg | 24 mg/kg | 30.1 ℃ | 10.9 % | 10 mg/kg | 12 mg/kg | 20 mg/kg | 30.7 ℃ | 0 % | 8 mg/kg | 11 mg/kg | 17 mg/kg | 31 RSSI | 0 | 11.7 Version',
*/
// colInfo是一个硬件设备的一条信息
// colInfo是一个硬件设备的一条信息
async
function
handleCJData
(
colInfo
,
deviceHQType
)
{
async
function
handleCJData
(
colInfo
,
deviceHQType
)
{
let
handleData
=
{},
attrExistMap
=
{};
let
handleData
=
{},
attrExistMap
=
{};
//1. 先获取到attr配置
//1. 先获取到attr配置
let
attrs
=
await
DB
.
CollectAttribute
.
find
({
del
:
0
,
enable
:
true
,
deviceHQType
});
let
attrs
=
await
DB
.
CollectAttribute
.
find
({
del
:
0
,
enable
:
true
,
deviceHQType
:
{
$in
:
[
0
,
deviceHQType
]}
});
console
.
log
(
attrs
)
console
.
log
(
attrs
)
let
types
=
colInfo
.
type
.
split
(
'/'
);
let
types
=
colInfo
.
type
.
split
(
'/'
);
let
data
=
colInfo
.
data
.
split
(
'|'
);
let
data
=
colInfo
.
data
.
split
(
'|'
);
...
...
cron/wsCron.js
0 → 100644
View file @
e768aafd
// 气象
const
httpRequest
=
require
(
'../utils/httpRequest'
);
const
deviceModule
=
require
(
'../module/deviceModule'
);
const
collectWSModule
=
require
(
'../module/collectWSModule'
);
const
_
=
require
(
'lodash'
);
/* -------------------------------------------有诸多不确定因素,暂时分开,后续 请求日志需要分别按照不同设备种类区分类型------------------------------------------------------------------ */
/**
* 采集上述设备 1 的信息
*/
async
function
collectDeviceInfo3
({
deviceHQType
})
{
if
(
!
deviceHQType
)
{
return
;
}
const
url
=
sysConfig
.
device
.
getDeviceInfo
;
const
secretKey
=
sysConfig
.
device
.
secretKey
;
// 查询有效状态、类型的设备信息
const
devices
=
await
deviceModule
.
findAll
({
deviceHQType
:
deviceHQType
,
deviceNumber
:
{
$exists
:
true
}
},
[
'deviceNumber'
,
'deviceHQType'
,
'name'
]);
for
(
let
index
=
0
;
index
<
devices
.
length
;
index
++
)
{
const
dev
=
devices
[
index
];
const
result
=
await
httpRequest
({
url
,
method
:
"GET"
,
params
:
{
secretKey
,
deviceNumber
:
dev
.
deviceNumber
}
});
if
(
result
&&
result
.
data
&&
result
.
data
.
state
==
"success"
)
{
let
colInfo
=
result
.
data
.
data
;
if
(
colInfo
&&
colInfo
.
deviceNumber
)
{
// 1. 处理 type 和 data
let
handleData
=
await
handleCJData
(
colInfo
,
deviceHQType
);
let
obj
=
{
...
colInfo
,
...
handleData
,
deviceHQType
};
obj
.
name
=
dev
.
name
||
obj
.
name
;
console
.
log
(
obj
,
"=============collectDeviceInfo3============="
)
// 2. 入库
await
collectWSModule
.
insertHQData
(
obj
);
// collectWSModule
// 3. 处理阈值报警通知
// handleDeviceThreshold(obj);
// 4. 处理设备在线状态
handleDeviceOnLine
({
deviceNumber
:
obj
.
deviceNumber
,
online
:
obj
.
onLineState
});
//onLineState 1在线0离线
}
else
{
//出错
// handleDeviceOnLine({deviceNumber: obj.deviceNumber, online: 0}); //onLineState 1在线0离线
}
}
else
{
handleDeviceOnLine
({
deviceNumber
:
dev
.
deviceNumber
,
online
:
0
});
//onLineState 1在线0离线
}
}
}
/**-------------数据处理---------------- */
/**
* type: '温度 / 湿度 / 光照度 / 风速 / 风向 / 雨量 / 信号强度 / 错误码 / 版本号',
data: '25.1 ℃ | 96.2 %RH | 33534 Lux | 2.4 m/s | 西南 | 0.2 mm | 31 RSSI | 0 | 11.7 Version',
*/
async
function
handleCJData
(
colInfo
,
deviceHQType
)
{
let
handleData
=
{};
//1. 先获取到attr配置
let
attrs
=
await
DB
.
CollectAttribute
.
find
({
del
:
0
,
enable
:
true
,
deviceHQType
:
{
$in
:
[
0
,
deviceHQType
]}});
console
.
log
(
attrs
)
let
types
=
colInfo
.
type
.
split
(
'/'
);
let
data
=
colInfo
.
data
.
split
(
'|'
);
for
(
let
i
=
0
;
i
<
types
.
length
;
i
++
)
{
const
col
=
types
[
i
];
for
(
let
j
=
0
;
j
<
attrs
.
length
;
j
++
)
{
const
attr
=
attrs
[
j
];
if
(
col
.
includes
(
attr
.
deviceKey
))
{
if
([
'errorCode'
,
'version'
,
'signalSterngth'
,
'windDirection'
].
includes
(
attr
.
dbKey
))
{
handleData
[
attr
.
dbKey
]
=
data
[
i
].
trim
();
}
else
{
const
dataArr
=
data
[
i
].
trim
().
split
(
' '
);
handleData
[
attr
.
dbKey
]
=
Number
(
String
(
dataArr
[
0
]).
trim
());
handleData
[
`
${
attr
.
dbKey
}
Unit`
]
=
String
(
dataArr
[
dataArr
.
length
-
1
]).
trim
()
||
""
;
}
}
}
}
console
.
log
(
handleData
,
"======1"
)
return
handleData
;
}
async
function
handleDeviceOnLine
({
deviceNumber
,
online
})
{
// 虫情 online = 0;//在线状态 0false/1true
// 土壤 onLineState 1在线0离线
if
(
!
deviceNumber
)
{
return
;
}
//该方式待定
let
key
=
`device_online`
;
if
(
online
==
0
)
{
await
ioRedis
.
hdel
(
key
,
deviceNumber
);
}
else
{
let
obj
=
{};
obj
[
deviceNumber
]
=
1
;
await
ioRedis
.
hset
(
key
,
obj
)
}
}
async
function
handleDeviceThreshold
(
obj
)
{
let
ths
=
await
DB
.
CollectThreshold
.
find
({
del
:
0
,
enable
:
true
,
deviceNumber
:
obj
.
deviceNumber
}).
populate
({
path
:
"attrId"
}).
lean
().
exec
();
let
exceeds
=
[];
for
(
let
i
=
0
;
i
<
ths
.
length
;
i
++
)
{
const
element
=
ths
[
i
];
// console.log(element, "====", obj[element.dbKey], _.isNumber(obj[element.dbKey]), _.gt(obj[element.dbKey], element.max), _.isNumber(element.max))
if
(
_
.
isNumber
(
obj
[
element
.
dbKey
]))
{
if
(
_
.
isNumber
(
element
.
max
)
&&
_
.
gt
(
obj
[
element
.
dbKey
],
element
.
max
))
{
// 采集值 > 最大设置值
// exceeds.push({...element, collectValue: obj[element.dbKey], deviceNumber: obj.deviceNumber});
exceeds
.
push
(
`设备
${
obj
.
deviceNumber
}
, 采集值:
${
obj
[
element
.
dbKey
]}
, 最大阈值:
${
element
.
max
}
`
);
}
if
(
_
.
isNumber
(
element
.
min
)
&&
_
.
lt
(
obj
[
element
.
dbKey
],
element
.
min
))
{
// exceeds.push({...element, collectValue: obj[element.dbKey], deviceNumber: obj.deviceNumber});
exceeds
.
push
(
`设备
${
obj
.
deviceNumber
}
, 采集值:
${
obj
[
element
.
dbKey
]}
, 最小阈值:
${
element
.
min
}
`
);
}
}
}
console
.
log
(
exceeds
);
// 处理通知模板
if
(
exceeds
.
length
)
{
await
DB
.
Notice
.
create
({
sendUser
:
"66d6c4099f8480c6db53ce13"
,
receiveUser
:
"66d6c4099f8480c6db53ce13"
,
content
:
exceeds
.
join
(
"
\
\n
"
),
});
}
}
/**-------------数据处理---------------- */
// collectDeviceInfo1({deviceHQType:1});
// getDeviceList()
module
.
exports
=
{
collectDeviceInfo3
,
}
\ No newline at end of file
db/models/collectDevice.js
View file @
e768aafd
...
@@ -89,12 +89,12 @@ const deviceSchema = new Schema({
...
@@ -89,12 +89,12 @@ const deviceSchema = new Schema({
ref
:
"Land"
,
ref
:
"Land"
,
},
},
/* -------------------------------------------------- */
/
/ /
* -------------------------------------------------- */
deviceHQState
:
{
//
deviceHQState: {
type
:
Number
,
//
type: Number,
default
:
1
,
//
default: 1,
comment
:
"通过http接口获取到的设备状态, 默认有效: 1,某次获取若设备消失,则状态置为失效: 0"
,
//
comment: "通过http接口获取到的设备状态, 默认有效: 1,某次获取若设备消失,则状态置为失效: 0",
},
//
},
deviceHQType
:
{
deviceHQType
:
{
type
:
Number
,
type
:
Number
,
comment
:
"用来获取数据的设备类型-(接口文档): 1.土壤温湿度、土壤氮磷钾, 2土壤ph、土壤电导率, 3 气象站, 4虫情"
,
comment
:
"用来获取数据的设备类型-(接口文档): 1.土壤温湿度、土壤氮磷钾, 2土壤ph、土壤电导率, 3 气象站, 4虫情"
,
...
...
module/collectIPSModule.js
View file @
e768aafd
...
@@ -32,14 +32,79 @@ async function insertHQData(data) {
...
@@ -32,14 +32,79 @@ async function insertHQData(data) {
if
(
!
(
data
.
deviceNumber
&&
data
.
newTime
))
{
if
(
!
(
data
.
deviceNumber
&&
data
.
newTime
))
{
return
;
return
;
}
}
data
.
time
=
data
.
newTime
;
data
.
time
=
data
.
newTime
;
// 为跟其他采集一致 ,都用time
let
check
=
await
DB
.
CollectIPS
.
findOne
({
newTime
:
data
.
newTime
});
let
check
=
await
DB
.
CollectIPS
.
findOne
({
newTime
:
data
.
newTime
});
if
(
!
check
)
{
if
(
!
check
)
{
let
ret
=
await
DB
.
CollectIPS
.
create
(
data
);
let
ret
=
await
DB
.
CollectIPS
.
create
(
data
);
ret
.
results
=
'蚊子:1'
handleIPSResult
(
ret
);
handleIPSResult
(
ret
);
}
}
}
}
/**
* 直接利用硬件的信息结果
* @param {*} data
*/
async
function
handleIPSResult
(
data
)
{
const
url
=
sysConfig
.
device
.
getPreventionToInsectName
;
const
token
=
sysConfig
.
device
.
token
;
const
userName
=
sysConfig
.
device
.
userName
;
try
{
if
(
data
.
results
&&
data
.
results
!=
"数据提取成功"
&&
data
.
results
.
includes
(
":"
))
{
let
retArr
=
data
.
results
.
split
(
','
)
||
[];
for
(
let
index
=
0
;
index
<
retArr
.
length
;
index
++
)
{
const
element
=
retArr
[
index
];
let
eleArr
=
element
.
split
(
':'
);
let
name
=
String
(
eleArr
[
0
]).
trim
();
let
count
=
Number
(
eleArr
[
1
])
||
0
;
// 记录虫子类型
let
bugType
=
await
DB
.
CollectIPSType
.
findOneAndUpdate
({
name
},
{
name
},
{
upsert
:
true
,
returnOriginal
:
false
});
// //获取防止建议---此处建议不从远端取,在本系统根据虫子种类维护建议即可
let
plan
;
try
{
let
preInRet
=
await
httpRequest
({
url
,
method
:
"GET"
,
params
:
{
token
,
userName
,
name
},
});
// console.log("000", preInRet)
if
(
preInRet
&&
preInRet
.
status
)
{
let
pData
=
preInRet
.
data
&&
preInRet
.
data
.
data
||
[];
for
(
let
pi
=
0
;
pi
<
pData
.
length
;
pi
++
)
{
const
pir
=
pData
[
pi
];
plan
=
await
DB
.
CollectIPSPlan
.
findOneAndUpdate
({
name
},
pir
,
{
upsert
:
true
,
returnOriginal
:
false
});
}
}
}
catch
(
error
)
{
console
.
log
(
"获取防治建议失败"
)
}
// 记录识别的每一次识别的 虫子 的种类 和 数量
// 此处暂时 每一次单独记录 不是对每一天做累加
await
DB
.
CollectIPSResult
.
create
({
deviceNumber
:
data
.
deviceNumber
,
name
,
count
:
count
,
time
:
data
.
time
||
data
.
newTime
,
type
:
bugType
&&
bugType
.
_id
,
plan
:
plan
&&
plan
.
_id
||
null
,
data
:
data
.
_id
,
});
}
// await DB.CollectIPS.updateOne({ _id: data._id }, { cameraRecognition: data.results });
}
}
catch
(
error
)
{
console
.
log
(
error
)
}
}
/**
/**
* 复杂版本 直接上传图片 获取结果
* 复杂版本 直接上传图片 获取结果
* @param {*} data
* @param {*} data
...
@@ -113,86 +178,9 @@ async function insertHQData(data) {
...
@@ -113,86 +178,9 @@ async function insertHQData(data) {
// }
// }
/**
* 直接利用硬件的信息结果
* @param {*} data
*/
async
function
handleIPSResult
(
data
)
{
try
{
const
url
=
sysConfig
.
device
.
getInsectNewCollectionResult
;
const
token
=
sysConfig
.
device
.
token
;
const
userName
=
sysConfig
.
device
.
userName
;
if
(
data
.
results
!=
"数据提取成功"
&&
data
.
results
.
includes
(
":"
))
{
let
retArr
=
data
.
results
.
split
(
','
)
||
[];
for
(
let
index
=
0
;
index
<
retArr
.
length
;
index
++
)
{
const
element
=
retArr
[
index
];
let
eleArr
=
element
.
split
(
':'
);
let
name
=
String
(
eleArr
[
0
]).
trim
();
// 记录虫子类型
let
bugType
=
await
DB
.
CollectIPSType
.
findOneAndUpdate
({
name
},
{
name
},
{
upsert
:
true
});
//获取防止建议---此处建议不从远端取,在本系统根据虫子种类维护建议即可
let
preInRet
=
await
httpRequest
({
url
:
sysConfig
.
device
.
getPreventionToInsectName
,
method
:
"GET"
,
params
:
{
token
,
userName
,
name
},
});
console
.
log
(
"000"
,
preInRet
)
let
plan
;
if
(
preInRet
&&
preInRet
.
status
)
{
let
pData
=
preInRet
.
data
&&
preInRet
.
data
.
data
||
[];
for
(
let
pi
=
0
;
pi
<
pData
.
length
;
pi
++
)
{
const
pir
=
pData
[
pi
];
plan
=
await
DB
.
CollectIPSPlan
.
findOneAndUpdate
({
name
},
pir
,
{
upsert
:
true
});
}
}
// 记录识别的每一次识别的 虫子 的种类 和 数量
// 此处暂时 每一次单独记录 不是对每一天做累加
await
DB
.
CollectIPSResult
.
create
({
deviceNumber
:
data
.
deviceNumber
,
name
,
// $inc: {count: 11},
count
:
element
.
newCount
,
time
:
data
.
time
||
data
.
newTime
,
type
:
bugType
&&
bugType
.
_id
,
plan
:
plan
&&
plan
.
_id
,
data
:
data
.
_id
,
});
}
await
DB
.
CollectIPS
.
updateOne
({
_id
:
data
.
_id
},
{
cameraRecognition
:
data
.
results
});
}
}
catch
(
error
)
{
console
.
log
(
error
)
}
}
// setTimeout(() => {
// handleIPSResult({
// downloadUrl: 'pictures/FF355138D5C3/2024-05-29-05-59-43.jpg',
// taggingImgUrl: 'picturesResult/FF355138D5C3/2024-05-29-05-59-43.jpg',
// downloadUrlCompress: 'picturesCompress/FF355138D5C3/orgin_2024-05-29-05-59-43.jpg',
// taggingImgUrlCompress: 'picturesCompress/FF355138D5C3/result_2024-05-29-05-59-43.jpg',
// deviceNumber: 'FF355138D5C3',
// newTime: '2024-05-29 05:59:43',
// results: '飞蛾:2',
// newCount: 2,
// typeCount: 1,
// oldCount: 0,
// oldTime: null,
// oldResults: null,
// oldTypeCount: 0,
// oldDownloadUrl: 'pictures/FF355138D5C3/2024-05-29-05-59-43.jpg',
// oldTaggingImgUrl: 'picturesResult/FF355138D5C3/2024-05-29-05-59-43.jpg',
// oldDownloadUrlCompress: null,
// oldTaggingImgUrlCompress: 'picturesCompress/FF355138D5C3/result_2024-05-29-05-59-43.jpg',
// name: undefined,
// time: '2024-05-29 05:59:43',
// "_id": "66d6d20cdc4220c02affe05d"
// })
// }, 5000)
...
...
module/deviceModule.js
View file @
e768aafd
...
@@ -31,7 +31,7 @@ async function insertHQDevice(datas, deviceHQType) {
...
@@ -31,7 +31,7 @@ async function insertHQDevice(datas, deviceHQType) {
const
element
=
datas
[
i
];
const
element
=
datas
[
i
];
if
(
element
.
deviceNumber
)
{
if
(
element
.
deviceNumber
)
{
devNumArr
.
push
(
element
.
deviceNumber
);
devNumArr
.
push
(
element
.
deviceNumber
);
await
DB
.
Device
.
findOneAndUpdate
({
deviceNumber
:
element
.
deviceNumber
},
{...
element
,
deviceHQType
,
deviceHQState
:
1
},
{
upsert
:
true
})
await
DB
.
Device
.
findOneAndUpdate
({
deviceNumber
:
element
.
deviceNumber
},
{...
element
,
deviceHQType
},
{
upsert
:
true
})
}
}
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment