xyj 1b26df75e2 | ||
---|---|---|
.idea | ||
sql | ||
.gitignore | ||
Readme.md | ||
config.py | ||
requirements.txt | ||
xumu.py |
Readme.md
设备类型和字段
设备字段
1、RFID设备
字段 | 说明 | 类型 | 别名 |
---|---|---|---|
iccid | 设备实际iccid | String | cid |
temperature | 设备检测温度 | Float | t |
RFID | rfid值 | String | r |
type | 设备类型(默认0) | INT32 | t |
2、空气设备
字段 | 说明 | 类型 | 别名 |
---|---|---|---|
iccid | 设备实际iccid | String | cid |
air_temperature | 空气温度 | Float | at |
air_humidity | 空气湿度 | Float | ah |
type | 设备类型(默认1) | INT32 | t |
2、其他设备
字段 | 说明 | 类型 | 别名 |
---|---|---|---|
iccid | 设备实际iccid | String | cid |
value | 设备检测值 | Float | v |
type | 设备类型 | INT32 | t |
设备类型(type字段)
字段 | 说明 |
---|---|
0 | RFID设备(耳环) |
1 | 空气设备 |
2 | 氮气 |
3 | 甲烷 |
4 | 噪音 |
5 | 烟雾(防火) |
设备查询接口
请求接口:GET /api/xumu/device/query
参数:iccid
,deviceId
说明:
该接口通过iccid
和deviceId
参数,构造动态sql语句进行查询,两个参数都是可选。sql语句如下:
sql = "SELECT * FROM root.device where time>=0"
# 检查iccid是否有值,如果有,添加到SQL语句中
if iccid:
sql += f" and iccid = '{iccid}'"
# 检查deviceId是否有值,如果有,添加到SQL语句中
if deviceId:
sql += f" and deviceId = '{deviceId}'"
RFID设备数据查询接口
RFID设备是指耳环设备
请求接口:GET /api/xumu/rfid/query
参数:rfid
说明:
该接口通过rfid
参数,构建sql语句进行查询,sql语句如下:
select deviceId from root.rfid where rfid='{rfid}'
其他设备数据查询接口
其他设备包括空气设备、氮气设备、甲烷设备、噪音设备和烟雾设备。
请求接口:GET /api/xumu/data/query
参数:deviceId
说明:
该接口通过deviceId
参数,构建sql语句进行查询,sql语句如下,只查询最新的一条数据:
select last * from root.farm.{deviceId}
监控视频地址接口
请求接口:GET /api/xumu/video
参数:username
摄像机网页登录密码:lihai123
摄像机网页登录用户名:admin
摄像机网页地址:192.168.0.123
报警数据接口
请求接口:GET /api/xumu/warning
参数:deviceId
该接口通过deviceId
参数,构造动态sql语句进行查询。sql语句如下:
select * from root.warning.{deviceId}
项目设计架构
该项目通过iotdb存储嵌入式设备上传数据。iotdb的结构如下:
-
root.device 设备注册时,会将设备的注册信息存储到该表。表的字段为:
iccid:设备的实际出厂编号 deviceId:设备映射编号 type:设备类型
-
root.rfid 嵌入式设备上传数据时,rfid会上传到对应的4G中转站。此时将rfid和对应的中转站设备进行关联。表的字段为:
rfid:设备的rfid编号 deviceId:中转设备的编号
-
root.farm
设备数据库包含三种类型的表,第一种是root.farm.b001
,root.farm.b002
,root.farm.b003
,其中b001
、b002
、b003
代表deviceId
。
第一种类型是项圈设备,第二种类型是空气检测设备,第三种是普通检测设备。其中,普通设备包括甲烷检测设备、氮气检测设备、噪音检测设备和烟雾检测设备。
项圈设备包含的字段:
iccid: 设备的iccid编号
temperature:设备检测温度值
RFID:rfid编号
type:设备类型
空气检测设备包含的字段:
iccid: 设备的iccid编号
air_temperature:设备检测空气温度值
air_humidity:设备检测空气湿度值
type:设备类型
普通检测设备包含的字段:
iccid: 设备的iccid编号
value:设备检测值
type:设备类型
- root.warning 嵌入式设备上传数据时,进行校验,不符合校验的数据保存到报警数据表。表的字段和root.farm一致。
设备注册流程
- 首先,嵌入式设备将数据传到MQTT服务器,MQTT转发到HTTP设备注册接口。
- 然后对接收到的数据进行校验,检验失败则丢弃。
- 然后查询该设备是否注册过,即查询root.device表,查看是否有iccid, deviceId对应的设备
- 如果没有注册过,则将设备信息插入到root.device表。表示该设备已注册。
- 设备注册后,创建相应的数据存储表,即在root.farm表,根据相应的设备类型创建相应的字段。
- 然后在root.warning数据库中,根据相应的设备类型创建相应的字段。和root.farm保持一致。
设备数据上传流程
- 首先,嵌入式设备将数据传到MQTT服务器,MQTT转发到HTTP设备数据上传接口。
- 然后对接收到的数据进行校验,检验失败则丢弃。
- 判断是否为RFID设备,如果是,则将RFID和deviceId进行一个映射。即插入root.rfid表。
- 将数据插入到root.farm表
- 判断数据是否为异常数据,如果是异常数据,则插入到root.warning表。
报警数据统计接口
请求接口:GET /api/xumu/warning/statistics
参数:deviceId
返回:totoal_warning_count
,today_warning_count
。分别代表总的报警数量和当天报警数量
说明:获取该设备的所有报警数据数量和当天报警数据数量
- 获取当天报警数据数量,sql语句 通过限制time不小于当天0点,获取当天所有的报警数量
select count(iccid) from root.warning.{deviceId} where time >= {now}T00:00:00"
- 获取所有报警数量,sql语句
select count(iccid) from root.warning.{deviceId}
报警7天历史数据接口
请求接口:/api/xumu/warning/past_seven_days
参数:deviceId
说明:获取该设备的7天历史数据,但每天只返回一个数据。总共返回7条数据。该项目返回当天数据的最大值。
- 如果是空气设备,则返回两个字段,即空气温度和空气湿度,sql语句如下,past_6_days_date代表过去第6天的时间,tomorow表示当天晚上12点时间,1d代表时间间隔为1天。
select MAX_VALUE(air_temperature),MAX_VALUE(air_humidity) from root.warning.{deviceId} group by ([{past_6_days_date}, {tomorrow}), 1d)
- 如果是其他普通设备,则返回一个字段,即传感器检测值,sql语句如下:
select MAX_VALUE(value) from root.warning.{deviceId} group by ([{past_6_days_date}, {tomorrow}), 1d)
报警数据所有接口
请求接口:GET /api/xumu/warning
参数:deviceId
, limit
, offset
sql语句:
select * from root.warning.{deviceId} limit {limit} offset {offset}