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)