commit 650643c9abd1627447d65101865d375379d427a6
Author: xyj <10908227994@qq.com>
Date: Wed Jan 24 15:32:58 2024 +0800
first
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..af68e56
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..e0a29fb
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..d18be63
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/xumu.iml b/.idea/xumu.iml
new file mode 100644
index 0000000..d0876a7
--- /dev/null
+++ b/.idea/xumu.iml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/__pycache__/config.cpython-311.pyc b/__pycache__/config.cpython-311.pyc
new file mode 100644
index 0000000..5d7d8a3
Binary files /dev/null and b/__pycache__/config.cpython-311.pyc differ
diff --git a/config.py b/config.py
new file mode 100644
index 0000000..a099506
--- /dev/null
+++ b/config.py
@@ -0,0 +1,27 @@
+# 数据库插入类型
+import base64
+
+rfid_type = ["TEXT", "TEXT", "FLOAT"]
+air_type = ["TEXT", "FLOAT", "FLOAT"]
+else_type = ["TEXT", "FLOAT"]
+dataTypes = {
+ 0: rfid_type,
+ 1: air_type,
+ 2: else_type,
+ 3: else_type,
+ 4: else_type,
+ 5: else_type,
+}
+baseHost = "https://iot.lihaink.cn/iotdb_restapi"
+# 注意这里前面不能加/
+insertUri = "rest/v2/insertRecords"
+queryUri = "rest/v2/query"
+# 鉴权
+username = 'root'
+password = 'root'
+code = (username + ":" + password).encode("utf-8")
+token = base64.encodebytes(code).decode("utf-8").strip()
+headers = {
+ 'ContentType': 'application/json',
+ 'Authorization': "Basic " + token
+}
diff --git a/main.py b/main.py
new file mode 100644
index 0000000..5b26278
--- /dev/null
+++ b/main.py
@@ -0,0 +1,146 @@
+import time
+import json
+from typing import Any
+
+import requests
+import uvicorn
+from fastapi import FastAPI, Request
+from pydantic import BaseModel
+from config import *
+
+# fastapi
+app = FastAPI()
+
+
+# 统一返回数据
+class BaseResponse(BaseModel):
+ code: int = 200
+ msg: str = "success"
+ data: Any = None
+
+
+# 设备注册实体
+class Device(BaseModel):
+ iccid: str = ""
+ deviceId: str = ""
+ type: int = None
+
+
+# 数据查询参数实体
+class DataQuery(BaseModel):
+ deviceId: str
+ limit: int = 1
+
+
+# 数据查询接口
+@app.post("/api/xumu/data/query")
+async def data_query(params: DataQuery):
+ try:
+ deviceId = params.deviceId
+ limit = params.limit
+ sql = f"select * from root.farm.{deviceId} order by time desc limit {limit}"
+ send_json = {
+ "sql": sql
+ }
+ r = requests.post(baseHost + queryUri, headers=headers, json=send_json)
+ return BaseResponse(data=r.json())
+ except Exception as e:
+ return BaseResponse(code=500, msg=str(e))
+
+
+# 原生查询接口
+@app.post("/api/xumu/rest/v2/query")
+async def rest_query(request: Request):
+ data = await request.json()
+ r = requests.post(baseHost + queryUri, headers=headers, json=data)
+ return BaseResponse(data=r.json())
+
+
+# 设备查询接口
+@app.post("/api/xumu/device/query")
+async def get_device(device: Device):
+ try:
+ sql = "SELECT * FROM root.device where 1=1"
+ # 检查iccid是否有值,如果有,添加到SQL语句中
+ if device.iccid:
+ sql += f" and iccid = '{device.iccid}'"
+ # 检查deviceId是否有值,如果有,添加到SQL语句中
+ if device.deviceId:
+ sql += f" and deviceId = '{device.deviceId}'"
+ # 检查type是否有值,如果有,添加到SQL语句中
+ if device.type is not None:
+ sql += f" and type = {device.type}"
+ send_json = {
+ "sql": sql
+ }
+ r = requests.post(baseHost + queryUri, headers=headers, json=send_json)
+ return BaseResponse(data=r.json())
+ except Exception as e:
+ return BaseResponse(code=500, msg=str(e))
+
+
+# 设备注册接口
+@app.post("/api/xumu/device/register")
+async def register(request: Request):
+ try:
+ data = await request.body()
+ data = data.decode("utf-8")
+ data = json.loads(data)
+ payload = data["payload"]
+ receive_len = len(payload)
+ payload = json.loads(payload)
+ send_len = payload["l"]
+ if receive_len != send_len:
+ return BaseResponse(code=301, msg="data valid error")
+ deviceId = payload["d"]
+ iccid = payload["cid"]
+ type = payload["t"]
+ send_json = {
+ "devices": ["root.device"],
+ "timestamps": [int(time.time() * 1000)],
+ "measurements_list": [["iccid", "deviceId", "type"]],
+ "data_types_list": [["TEXT", "TEXT", "INT32"]],
+ "values_list": [[iccid, deviceId, type]],
+ "is_aligned": False
+ }
+ r = requests.post(baseHost + insertUri, headers=headers, json=send_json)
+ return BaseResponse(data=r.json())
+ except Exception as e:
+ return BaseResponse(code=500, msg=str(e))
+
+
+# 数据上传接口
+@app.post("/api/xumu/data/collect")
+async def process_data(request: Request):
+ # TODO mqtt检测
+
+ try:
+ data = await request.body()
+ data = data.decode("utf-8")
+ data = json.loads(data)
+ payload = data["payload"]
+ receive_len = len(payload)
+ payload = json.loads(payload)
+ send_len = payload["l"]
+ if receive_len != send_len:
+ return 301
+ m = payload["m"]
+ v = payload["v"]
+ t = payload["t"]
+ cid = v[0]
+ send_json = {
+ "devices": ["root.farm." + cid],
+ "timestamps": [int(time.time() * 1000)],
+ "measurements_list": [m],
+ "data_types_list": [dataTypes[t]],
+ "values_list": [v],
+ "is_aligned": False
+ }
+ r = requests.post(baseHost + insertUri, headers=headers, json=send_json)
+ return BaseResponse(data=r.json())
+ except Exception as e:
+ return BaseResponse(code=500, msg=str(e))
+
+
+if __name__ == '__main__':
+ uvicorn.run(app, host="0.0.0.0", port=8002)