diff --git a/.gitignore b/.gitignore index 5e9050c..6cb9f0a 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,7 @@ .idea/* __pycache__/ **/__pycache__/ -*.py[cod] \ No newline at end of file +*.py[cod] + +*.mp4 +*.mkv \ No newline at end of file diff --git a/.gitignore b/.gitignore index 5e9050c..6cb9f0a 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,7 @@ .idea/* __pycache__/ **/__pycache__/ -*.py[cod] \ No newline at end of file +*.py[cod] + +*.mp4 +*.mkv \ No newline at end of file diff --git a/algo_main.py b/algo_main.py new file mode 100644 index 0000000..9ac9426 --- /dev/null +++ b/algo_main.py @@ -0,0 +1,46 @@ +import asyncio + +from algo.algo_runner import AlgoRunner +from algo.scene_runner import SceneRunner +from db.database import get_db +from services.device_model_relation_service import DeviceModelRelationService +from services.device_scene_relation_service import DeviceSceneRelationService +from services.device_service import DeviceService +from services.model_service import ModelService +from services.scene_service import SceneService + + +async def main(): + """主函数""" + db_gen = get_db() + db = await db_gen.__anext__() + + device_service = DeviceService(db) + model_service = ModelService(db) + model_relation_service = DeviceModelRelationService(db) + scene_service = SceneService(db) + scene_relation_service = DeviceSceneRelationService(db) + main_loop = asyncio.get_running_loop() + + algo_runner = AlgoRunner( + device_service=device_service, + model_service=model_service, + relation_service=model_relation_service, + ) + + scene_runner = SceneRunner( + device_service=device_service, + scene_service=scene_service, + relation_service=scene_relation_service, + tcp_manager=None, + main_loop=main_loop + ) + + await algo_runner.start() + await scene_runner.start() + + await asyncio.Event().wait() # 保持运行 + + +if __name__ == '__main__': + asyncio.run(main()) \ No newline at end of file diff --git a/.gitignore b/.gitignore index 5e9050c..6cb9f0a 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,7 @@ .idea/* __pycache__/ **/__pycache__/ -*.py[cod] \ No newline at end of file +*.py[cod] + +*.mp4 +*.mkv \ No newline at end of file diff --git a/algo_main.py b/algo_main.py new file mode 100644 index 0000000..9ac9426 --- /dev/null +++ b/algo_main.py @@ -0,0 +1,46 @@ +import asyncio + +from algo.algo_runner import AlgoRunner +from algo.scene_runner import SceneRunner +from db.database import get_db +from services.device_model_relation_service import DeviceModelRelationService +from services.device_scene_relation_service import DeviceSceneRelationService +from services.device_service import DeviceService +from services.model_service import ModelService +from services.scene_service import SceneService + + +async def main(): + """主函数""" + db_gen = get_db() + db = await db_gen.__anext__() + + device_service = DeviceService(db) + model_service = ModelService(db) + model_relation_service = DeviceModelRelationService(db) + scene_service = SceneService(db) + scene_relation_service = DeviceSceneRelationService(db) + main_loop = asyncio.get_running_loop() + + algo_runner = AlgoRunner( + device_service=device_service, + model_service=model_service, + relation_service=model_relation_service, + ) + + scene_runner = SceneRunner( + device_service=device_service, + scene_service=scene_service, + relation_service=scene_relation_service, + tcp_manager=None, + main_loop=main_loop + ) + + await algo_runner.start() + await scene_runner.start() + + await asyncio.Event().wait() # 保持运行 + + +if __name__ == '__main__': + asyncio.run(main()) \ No newline at end of file diff --git a/apis/device.py b/apis/device.py index f170ae3..e642254 100644 --- a/apis/device.py +++ b/apis/device.py @@ -8,13 +8,13 @@ from entity.device import Device, DeviceCreate, DeviceUpdate, DeviceInfo from services.device_service import DeviceService -from app_instance import get_app +# from app_instance import get_app router = APIRouter() -app = get_app() - -def get_service(): - return app.state.device_service +# app = get_app() +# +# def get_service(): +# return app.state.device_service @router.get("/list", response_model=StandardResponse[List[DeviceInfo]]) @@ -48,13 +48,15 @@ @router.post("/add", response_model=StandardResponse[DeviceInfo]) -async def create_device(device_data: DeviceCreate, service: DeviceService = Depends(get_service)): +async def create_device(device_data: DeviceCreate, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.create_device(device_data) return standard_response(data=device) @router.post("/update", response_model=StandardResponse[DeviceInfo]) -async def update_device(device_data: DeviceUpdate, service: DeviceService = Depends(get_service)): +async def update_device(device_data: DeviceUpdate, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.update_device(device_data) if not device: return standard_error_response(data=device_data, message="Device not found") @@ -62,7 +64,8 @@ @router.delete("/delete", response_model=StandardResponse[int]) -async def delete_device(device_id: int, service: DeviceService = Depends(get_service)): +async def delete_device(device_id: int, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.delete_device(device_id) if not device: return standard_error_response(data=device_id, message="Device not found") diff --git a/.gitignore b/.gitignore index 5e9050c..6cb9f0a 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,7 @@ .idea/* __pycache__/ **/__pycache__/ -*.py[cod] \ No newline at end of file +*.py[cod] + +*.mp4 +*.mkv \ No newline at end of file diff --git a/algo_main.py b/algo_main.py new file mode 100644 index 0000000..9ac9426 --- /dev/null +++ b/algo_main.py @@ -0,0 +1,46 @@ +import asyncio + +from algo.algo_runner import AlgoRunner +from algo.scene_runner import SceneRunner +from db.database import get_db +from services.device_model_relation_service import DeviceModelRelationService +from services.device_scene_relation_service import DeviceSceneRelationService +from services.device_service import DeviceService +from services.model_service import ModelService +from services.scene_service import SceneService + + +async def main(): + """主函数""" + db_gen = get_db() + db = await db_gen.__anext__() + + device_service = DeviceService(db) + model_service = ModelService(db) + model_relation_service = DeviceModelRelationService(db) + scene_service = SceneService(db) + scene_relation_service = DeviceSceneRelationService(db) + main_loop = asyncio.get_running_loop() + + algo_runner = AlgoRunner( + device_service=device_service, + model_service=model_service, + relation_service=model_relation_service, + ) + + scene_runner = SceneRunner( + device_service=device_service, + scene_service=scene_service, + relation_service=scene_relation_service, + tcp_manager=None, + main_loop=main_loop + ) + + await algo_runner.start() + await scene_runner.start() + + await asyncio.Event().wait() # 保持运行 + + +if __name__ == '__main__': + asyncio.run(main()) \ No newline at end of file diff --git a/apis/device.py b/apis/device.py index f170ae3..e642254 100644 --- a/apis/device.py +++ b/apis/device.py @@ -8,13 +8,13 @@ from entity.device import Device, DeviceCreate, DeviceUpdate, DeviceInfo from services.device_service import DeviceService -from app_instance import get_app +# from app_instance import get_app router = APIRouter() -app = get_app() - -def get_service(): - return app.state.device_service +# app = get_app() +# +# def get_service(): +# return app.state.device_service @router.get("/list", response_model=StandardResponse[List[DeviceInfo]]) @@ -48,13 +48,15 @@ @router.post("/add", response_model=StandardResponse[DeviceInfo]) -async def create_device(device_data: DeviceCreate, service: DeviceService = Depends(get_service)): +async def create_device(device_data: DeviceCreate, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.create_device(device_data) return standard_response(data=device) @router.post("/update", response_model=StandardResponse[DeviceInfo]) -async def update_device(device_data: DeviceUpdate, service: DeviceService = Depends(get_service)): +async def update_device(device_data: DeviceUpdate, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.update_device(device_data) if not device: return standard_error_response(data=device_data, message="Device not found") @@ -62,7 +64,8 @@ @router.delete("/delete", response_model=StandardResponse[int]) -async def delete_device(device_id: int, service: DeviceService = Depends(get_service)): +async def delete_device(device_id: int, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.delete_device(device_id) if not device: return standard_error_response(data=device_id, message="Device not found") diff --git a/apis/device_model_realtion.py b/apis/device_model_realtion.py index ddb5eb6..2aee16e 100644 --- a/apis/device_model_realtion.py +++ b/apis/device_model_realtion.py @@ -8,14 +8,14 @@ from entity.device_model_relation import DeviceModelRelationInfo, DeviceModelRelationCreate, DeviceModelRelation from services.device_model_relation_service import DeviceModelRelationService -from app_instance import get_app +# from app_instance import get_app router = APIRouter() -app = get_app() +# app = get_app() -def get_service(): - return app.state.model_relation_service +# def get_service(): +# return app.state.model_relation_service @router.get("/list_by_device", response_model=StandardResponse[List[DeviceModelRelationInfo]]) @@ -30,6 +30,7 @@ @router.post("/update_by_device", response_model=StandardResponse[List[DeviceModelRelation]]) async def update_by_device(relation_data: List[DeviceModelRelationCreate], device_id: int = Query(...), - service: DeviceModelRelationService = Depends(get_service)): + db: AsyncSession = Depends(get_db)): + service = DeviceModelRelationService(db) relations = await service.update_relations_by_device(device_id, relation_data) return standard_response(data=relations) diff --git a/.gitignore b/.gitignore index 5e9050c..6cb9f0a 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,7 @@ .idea/* __pycache__/ **/__pycache__/ -*.py[cod] \ No newline at end of file +*.py[cod] + +*.mp4 +*.mkv \ No newline at end of file diff --git a/algo_main.py b/algo_main.py new file mode 100644 index 0000000..9ac9426 --- /dev/null +++ b/algo_main.py @@ -0,0 +1,46 @@ +import asyncio + +from algo.algo_runner import AlgoRunner +from algo.scene_runner import SceneRunner +from db.database import get_db +from services.device_model_relation_service import DeviceModelRelationService +from services.device_scene_relation_service import DeviceSceneRelationService +from services.device_service import DeviceService +from services.model_service import ModelService +from services.scene_service import SceneService + + +async def main(): + """主函数""" + db_gen = get_db() + db = await db_gen.__anext__() + + device_service = DeviceService(db) + model_service = ModelService(db) + model_relation_service = DeviceModelRelationService(db) + scene_service = SceneService(db) + scene_relation_service = DeviceSceneRelationService(db) + main_loop = asyncio.get_running_loop() + + algo_runner = AlgoRunner( + device_service=device_service, + model_service=model_service, + relation_service=model_relation_service, + ) + + scene_runner = SceneRunner( + device_service=device_service, + scene_service=scene_service, + relation_service=scene_relation_service, + tcp_manager=None, + main_loop=main_loop + ) + + await algo_runner.start() + await scene_runner.start() + + await asyncio.Event().wait() # 保持运行 + + +if __name__ == '__main__': + asyncio.run(main()) \ No newline at end of file diff --git a/apis/device.py b/apis/device.py index f170ae3..e642254 100644 --- a/apis/device.py +++ b/apis/device.py @@ -8,13 +8,13 @@ from entity.device import Device, DeviceCreate, DeviceUpdate, DeviceInfo from services.device_service import DeviceService -from app_instance import get_app +# from app_instance import get_app router = APIRouter() -app = get_app() - -def get_service(): - return app.state.device_service +# app = get_app() +# +# def get_service(): +# return app.state.device_service @router.get("/list", response_model=StandardResponse[List[DeviceInfo]]) @@ -48,13 +48,15 @@ @router.post("/add", response_model=StandardResponse[DeviceInfo]) -async def create_device(device_data: DeviceCreate, service: DeviceService = Depends(get_service)): +async def create_device(device_data: DeviceCreate, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.create_device(device_data) return standard_response(data=device) @router.post("/update", response_model=StandardResponse[DeviceInfo]) -async def update_device(device_data: DeviceUpdate, service: DeviceService = Depends(get_service)): +async def update_device(device_data: DeviceUpdate, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.update_device(device_data) if not device: return standard_error_response(data=device_data, message="Device not found") @@ -62,7 +64,8 @@ @router.delete("/delete", response_model=StandardResponse[int]) -async def delete_device(device_id: int, service: DeviceService = Depends(get_service)): +async def delete_device(device_id: int, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.delete_device(device_id) if not device: return standard_error_response(data=device_id, message="Device not found") diff --git a/apis/device_model_realtion.py b/apis/device_model_realtion.py index ddb5eb6..2aee16e 100644 --- a/apis/device_model_realtion.py +++ b/apis/device_model_realtion.py @@ -8,14 +8,14 @@ from entity.device_model_relation import DeviceModelRelationInfo, DeviceModelRelationCreate, DeviceModelRelation from services.device_model_relation_service import DeviceModelRelationService -from app_instance import get_app +# from app_instance import get_app router = APIRouter() -app = get_app() +# app = get_app() -def get_service(): - return app.state.model_relation_service +# def get_service(): +# return app.state.model_relation_service @router.get("/list_by_device", response_model=StandardResponse[List[DeviceModelRelationInfo]]) @@ -30,6 +30,7 @@ @router.post("/update_by_device", response_model=StandardResponse[List[DeviceModelRelation]]) async def update_by_device(relation_data: List[DeviceModelRelationCreate], device_id: int = Query(...), - service: DeviceModelRelationService = Depends(get_service)): + db: AsyncSession = Depends(get_db)): + service = DeviceModelRelationService(db) relations = await service.update_relations_by_device(device_id, relation_data) return standard_response(data=relations) diff --git a/apis/model.py b/apis/model.py index fa2b191..389d7fe 100644 --- a/apis/model.py +++ b/apis/model.py @@ -4,17 +4,17 @@ from sqlalchemy.ext.asyncio import AsyncSession from apis.base import standard_response, StandardResponse, PageResponse, standard_error_response, convert_page_param -from app_instance import get_app +# from app_instance import get_app from db.database import get_db from entity.model import AlgoModel, AlgoModelCreate, AlgoModelUpdate, AlgoModelInfo from services.model_service import ModelService router = APIRouter() -app = get_app() - - -def get_service(): - return app.state.model_service +# app = get_app() +# +# +# def get_service(): +# return app.state.model_service @router.get("/list", response_model=StandardResponse[List[AlgoModelInfo]]) @@ -63,8 +63,9 @@ @router.post("/update", response_model=StandardResponse[AlgoModelInfo]) async def update_model(json_data: str = Form(..., description="JSON数据字段,内容为AlgoModelUpdate结构"), file: UploadFile = File(None, description="模型文件"), - service: ModelService = Depends(get_service)): + db: AsyncSession = Depends(get_db)): model_data = AlgoModelUpdate.parse_raw(json_data) + service = ModelService(db) model = await service.update_model(model_data, file) if not model: return standard_error_response(data=model_data, message="Model not found") diff --git a/.gitignore b/.gitignore index 5e9050c..6cb9f0a 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,7 @@ .idea/* __pycache__/ **/__pycache__/ -*.py[cod] \ No newline at end of file +*.py[cod] + +*.mp4 +*.mkv \ No newline at end of file diff --git a/algo_main.py b/algo_main.py new file mode 100644 index 0000000..9ac9426 --- /dev/null +++ b/algo_main.py @@ -0,0 +1,46 @@ +import asyncio + +from algo.algo_runner import AlgoRunner +from algo.scene_runner import SceneRunner +from db.database import get_db +from services.device_model_relation_service import DeviceModelRelationService +from services.device_scene_relation_service import DeviceSceneRelationService +from services.device_service import DeviceService +from services.model_service import ModelService +from services.scene_service import SceneService + + +async def main(): + """主函数""" + db_gen = get_db() + db = await db_gen.__anext__() + + device_service = DeviceService(db) + model_service = ModelService(db) + model_relation_service = DeviceModelRelationService(db) + scene_service = SceneService(db) + scene_relation_service = DeviceSceneRelationService(db) + main_loop = asyncio.get_running_loop() + + algo_runner = AlgoRunner( + device_service=device_service, + model_service=model_service, + relation_service=model_relation_service, + ) + + scene_runner = SceneRunner( + device_service=device_service, + scene_service=scene_service, + relation_service=scene_relation_service, + tcp_manager=None, + main_loop=main_loop + ) + + await algo_runner.start() + await scene_runner.start() + + await asyncio.Event().wait() # 保持运行 + + +if __name__ == '__main__': + asyncio.run(main()) \ No newline at end of file diff --git a/apis/device.py b/apis/device.py index f170ae3..e642254 100644 --- a/apis/device.py +++ b/apis/device.py @@ -8,13 +8,13 @@ from entity.device import Device, DeviceCreate, DeviceUpdate, DeviceInfo from services.device_service import DeviceService -from app_instance import get_app +# from app_instance import get_app router = APIRouter() -app = get_app() - -def get_service(): - return app.state.device_service +# app = get_app() +# +# def get_service(): +# return app.state.device_service @router.get("/list", response_model=StandardResponse[List[DeviceInfo]]) @@ -48,13 +48,15 @@ @router.post("/add", response_model=StandardResponse[DeviceInfo]) -async def create_device(device_data: DeviceCreate, service: DeviceService = Depends(get_service)): +async def create_device(device_data: DeviceCreate, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.create_device(device_data) return standard_response(data=device) @router.post("/update", response_model=StandardResponse[DeviceInfo]) -async def update_device(device_data: DeviceUpdate, service: DeviceService = Depends(get_service)): +async def update_device(device_data: DeviceUpdate, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.update_device(device_data) if not device: return standard_error_response(data=device_data, message="Device not found") @@ -62,7 +64,8 @@ @router.delete("/delete", response_model=StandardResponse[int]) -async def delete_device(device_id: int, service: DeviceService = Depends(get_service)): +async def delete_device(device_id: int, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.delete_device(device_id) if not device: return standard_error_response(data=device_id, message="Device not found") diff --git a/apis/device_model_realtion.py b/apis/device_model_realtion.py index ddb5eb6..2aee16e 100644 --- a/apis/device_model_realtion.py +++ b/apis/device_model_realtion.py @@ -8,14 +8,14 @@ from entity.device_model_relation import DeviceModelRelationInfo, DeviceModelRelationCreate, DeviceModelRelation from services.device_model_relation_service import DeviceModelRelationService -from app_instance import get_app +# from app_instance import get_app router = APIRouter() -app = get_app() +# app = get_app() -def get_service(): - return app.state.model_relation_service +# def get_service(): +# return app.state.model_relation_service @router.get("/list_by_device", response_model=StandardResponse[List[DeviceModelRelationInfo]]) @@ -30,6 +30,7 @@ @router.post("/update_by_device", response_model=StandardResponse[List[DeviceModelRelation]]) async def update_by_device(relation_data: List[DeviceModelRelationCreate], device_id: int = Query(...), - service: DeviceModelRelationService = Depends(get_service)): + db: AsyncSession = Depends(get_db)): + service = DeviceModelRelationService(db) relations = await service.update_relations_by_device(device_id, relation_data) return standard_response(data=relations) diff --git a/apis/model.py b/apis/model.py index fa2b191..389d7fe 100644 --- a/apis/model.py +++ b/apis/model.py @@ -4,17 +4,17 @@ from sqlalchemy.ext.asyncio import AsyncSession from apis.base import standard_response, StandardResponse, PageResponse, standard_error_response, convert_page_param -from app_instance import get_app +# from app_instance import get_app from db.database import get_db from entity.model import AlgoModel, AlgoModelCreate, AlgoModelUpdate, AlgoModelInfo from services.model_service import ModelService router = APIRouter() -app = get_app() - - -def get_service(): - return app.state.model_service +# app = get_app() +# +# +# def get_service(): +# return app.state.model_service @router.get("/list", response_model=StandardResponse[List[AlgoModelInfo]]) @@ -63,8 +63,9 @@ @router.post("/update", response_model=StandardResponse[AlgoModelInfo]) async def update_model(json_data: str = Form(..., description="JSON数据字段,内容为AlgoModelUpdate结构"), file: UploadFile = File(None, description="模型文件"), - service: ModelService = Depends(get_service)): + db: AsyncSession = Depends(get_db)): model_data = AlgoModelUpdate.parse_raw(json_data) + service = ModelService(db) model = await service.update_model(model_data, file) if not model: return standard_error_response(data=model_data, message="Model not found") diff --git a/app_instance.py b/app_instance.py index 275efd4..fb6a77f 100644 --- a/app_instance.py +++ b/app_instance.py @@ -53,7 +53,7 @@ tcp_manager = TcpClientManager(device_service=device_service, main_loop=main_loop) app.state.tcp_manager = tcp_manager - await tcp_manager.start() + # await tcp_manager.start() algo_runner = AlgoRunner( device_service=device_service, @@ -61,7 +61,7 @@ relation_service=model_relation_service, ) app.state.algo_runner = algo_runner - await algo_runner.start() + # await algo_runner.start() scene_runner = SceneRunner( device_service=device_service, diff --git a/.gitignore b/.gitignore index 5e9050c..6cb9f0a 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,7 @@ .idea/* __pycache__/ **/__pycache__/ -*.py[cod] \ No newline at end of file +*.py[cod] + +*.mp4 +*.mkv \ No newline at end of file diff --git a/algo_main.py b/algo_main.py new file mode 100644 index 0000000..9ac9426 --- /dev/null +++ b/algo_main.py @@ -0,0 +1,46 @@ +import asyncio + +from algo.algo_runner import AlgoRunner +from algo.scene_runner import SceneRunner +from db.database import get_db +from services.device_model_relation_service import DeviceModelRelationService +from services.device_scene_relation_service import DeviceSceneRelationService +from services.device_service import DeviceService +from services.model_service import ModelService +from services.scene_service import SceneService + + +async def main(): + """主函数""" + db_gen = get_db() + db = await db_gen.__anext__() + + device_service = DeviceService(db) + model_service = ModelService(db) + model_relation_service = DeviceModelRelationService(db) + scene_service = SceneService(db) + scene_relation_service = DeviceSceneRelationService(db) + main_loop = asyncio.get_running_loop() + + algo_runner = AlgoRunner( + device_service=device_service, + model_service=model_service, + relation_service=model_relation_service, + ) + + scene_runner = SceneRunner( + device_service=device_service, + scene_service=scene_service, + relation_service=scene_relation_service, + tcp_manager=None, + main_loop=main_loop + ) + + await algo_runner.start() + await scene_runner.start() + + await asyncio.Event().wait() # 保持运行 + + +if __name__ == '__main__': + asyncio.run(main()) \ No newline at end of file diff --git a/apis/device.py b/apis/device.py index f170ae3..e642254 100644 --- a/apis/device.py +++ b/apis/device.py @@ -8,13 +8,13 @@ from entity.device import Device, DeviceCreate, DeviceUpdate, DeviceInfo from services.device_service import DeviceService -from app_instance import get_app +# from app_instance import get_app router = APIRouter() -app = get_app() - -def get_service(): - return app.state.device_service +# app = get_app() +# +# def get_service(): +# return app.state.device_service @router.get("/list", response_model=StandardResponse[List[DeviceInfo]]) @@ -48,13 +48,15 @@ @router.post("/add", response_model=StandardResponse[DeviceInfo]) -async def create_device(device_data: DeviceCreate, service: DeviceService = Depends(get_service)): +async def create_device(device_data: DeviceCreate, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.create_device(device_data) return standard_response(data=device) @router.post("/update", response_model=StandardResponse[DeviceInfo]) -async def update_device(device_data: DeviceUpdate, service: DeviceService = Depends(get_service)): +async def update_device(device_data: DeviceUpdate, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.update_device(device_data) if not device: return standard_error_response(data=device_data, message="Device not found") @@ -62,7 +64,8 @@ @router.delete("/delete", response_model=StandardResponse[int]) -async def delete_device(device_id: int, service: DeviceService = Depends(get_service)): +async def delete_device(device_id: int, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.delete_device(device_id) if not device: return standard_error_response(data=device_id, message="Device not found") diff --git a/apis/device_model_realtion.py b/apis/device_model_realtion.py index ddb5eb6..2aee16e 100644 --- a/apis/device_model_realtion.py +++ b/apis/device_model_realtion.py @@ -8,14 +8,14 @@ from entity.device_model_relation import DeviceModelRelationInfo, DeviceModelRelationCreate, DeviceModelRelation from services.device_model_relation_service import DeviceModelRelationService -from app_instance import get_app +# from app_instance import get_app router = APIRouter() -app = get_app() +# app = get_app() -def get_service(): - return app.state.model_relation_service +# def get_service(): +# return app.state.model_relation_service @router.get("/list_by_device", response_model=StandardResponse[List[DeviceModelRelationInfo]]) @@ -30,6 +30,7 @@ @router.post("/update_by_device", response_model=StandardResponse[List[DeviceModelRelation]]) async def update_by_device(relation_data: List[DeviceModelRelationCreate], device_id: int = Query(...), - service: DeviceModelRelationService = Depends(get_service)): + db: AsyncSession = Depends(get_db)): + service = DeviceModelRelationService(db) relations = await service.update_relations_by_device(device_id, relation_data) return standard_response(data=relations) diff --git a/apis/model.py b/apis/model.py index fa2b191..389d7fe 100644 --- a/apis/model.py +++ b/apis/model.py @@ -4,17 +4,17 @@ from sqlalchemy.ext.asyncio import AsyncSession from apis.base import standard_response, StandardResponse, PageResponse, standard_error_response, convert_page_param -from app_instance import get_app +# from app_instance import get_app from db.database import get_db from entity.model import AlgoModel, AlgoModelCreate, AlgoModelUpdate, AlgoModelInfo from services.model_service import ModelService router = APIRouter() -app = get_app() - - -def get_service(): - return app.state.model_service +# app = get_app() +# +# +# def get_service(): +# return app.state.model_service @router.get("/list", response_model=StandardResponse[List[AlgoModelInfo]]) @@ -63,8 +63,9 @@ @router.post("/update", response_model=StandardResponse[AlgoModelInfo]) async def update_model(json_data: str = Form(..., description="JSON数据字段,内容为AlgoModelUpdate结构"), file: UploadFile = File(None, description="模型文件"), - service: ModelService = Depends(get_service)): + db: AsyncSession = Depends(get_db)): model_data = AlgoModelUpdate.parse_raw(json_data) + service = ModelService(db) model = await service.update_model(model_data, file) if not model: return standard_error_response(data=model_data, message="Model not found") diff --git a/app_instance.py b/app_instance.py index 275efd4..fb6a77f 100644 --- a/app_instance.py +++ b/app_instance.py @@ -53,7 +53,7 @@ tcp_manager = TcpClientManager(device_service=device_service, main_loop=main_loop) app.state.tcp_manager = tcp_manager - await tcp_manager.start() + # await tcp_manager.start() algo_runner = AlgoRunner( device_service=device_service, @@ -61,7 +61,7 @@ relation_service=model_relation_service, ) app.state.algo_runner = algo_runner - await algo_runner.start() + # await algo_runner.start() scene_runner = SceneRunner( device_service=device_service, diff --git a/common/ipc_utils.py b/common/ipc_utils.py new file mode 100644 index 0000000..dd3ce09 --- /dev/null +++ b/common/ipc_utils.py @@ -0,0 +1,19 @@ +from multiprocessing.connection import Client + + +def send_to_tcp(device_code, message): + try: + + text_bytes = str(device_code).encode('utf-8') + text_len = len(text_bytes).to_bytes(4, byteorder='big') # 4字节长度前缀 + + payload = text_len + text_bytes + message + + address = ('127.0.0.1', 6000) + secret = b'from_algo_to_tcp' + conn = Client(address, authkey=secret) + print(f"[IPC] send to {secret}:{payload}") + conn.send_bytes(payload) + conn.close() + except Exception as e: + print(f"[IPC] send to tcp failed: {e}") \ No newline at end of file diff --git a/.gitignore b/.gitignore index 5e9050c..6cb9f0a 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,7 @@ .idea/* __pycache__/ **/__pycache__/ -*.py[cod] \ No newline at end of file +*.py[cod] + +*.mp4 +*.mkv \ No newline at end of file diff --git a/algo_main.py b/algo_main.py new file mode 100644 index 0000000..9ac9426 --- /dev/null +++ b/algo_main.py @@ -0,0 +1,46 @@ +import asyncio + +from algo.algo_runner import AlgoRunner +from algo.scene_runner import SceneRunner +from db.database import get_db +from services.device_model_relation_service import DeviceModelRelationService +from services.device_scene_relation_service import DeviceSceneRelationService +from services.device_service import DeviceService +from services.model_service import ModelService +from services.scene_service import SceneService + + +async def main(): + """主函数""" + db_gen = get_db() + db = await db_gen.__anext__() + + device_service = DeviceService(db) + model_service = ModelService(db) + model_relation_service = DeviceModelRelationService(db) + scene_service = SceneService(db) + scene_relation_service = DeviceSceneRelationService(db) + main_loop = asyncio.get_running_loop() + + algo_runner = AlgoRunner( + device_service=device_service, + model_service=model_service, + relation_service=model_relation_service, + ) + + scene_runner = SceneRunner( + device_service=device_service, + scene_service=scene_service, + relation_service=scene_relation_service, + tcp_manager=None, + main_loop=main_loop + ) + + await algo_runner.start() + await scene_runner.start() + + await asyncio.Event().wait() # 保持运行 + + +if __name__ == '__main__': + asyncio.run(main()) \ No newline at end of file diff --git a/apis/device.py b/apis/device.py index f170ae3..e642254 100644 --- a/apis/device.py +++ b/apis/device.py @@ -8,13 +8,13 @@ from entity.device import Device, DeviceCreate, DeviceUpdate, DeviceInfo from services.device_service import DeviceService -from app_instance import get_app +# from app_instance import get_app router = APIRouter() -app = get_app() - -def get_service(): - return app.state.device_service +# app = get_app() +# +# def get_service(): +# return app.state.device_service @router.get("/list", response_model=StandardResponse[List[DeviceInfo]]) @@ -48,13 +48,15 @@ @router.post("/add", response_model=StandardResponse[DeviceInfo]) -async def create_device(device_data: DeviceCreate, service: DeviceService = Depends(get_service)): +async def create_device(device_data: DeviceCreate, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.create_device(device_data) return standard_response(data=device) @router.post("/update", response_model=StandardResponse[DeviceInfo]) -async def update_device(device_data: DeviceUpdate, service: DeviceService = Depends(get_service)): +async def update_device(device_data: DeviceUpdate, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.update_device(device_data) if not device: return standard_error_response(data=device_data, message="Device not found") @@ -62,7 +64,8 @@ @router.delete("/delete", response_model=StandardResponse[int]) -async def delete_device(device_id: int, service: DeviceService = Depends(get_service)): +async def delete_device(device_id: int, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.delete_device(device_id) if not device: return standard_error_response(data=device_id, message="Device not found") diff --git a/apis/device_model_realtion.py b/apis/device_model_realtion.py index ddb5eb6..2aee16e 100644 --- a/apis/device_model_realtion.py +++ b/apis/device_model_realtion.py @@ -8,14 +8,14 @@ from entity.device_model_relation import DeviceModelRelationInfo, DeviceModelRelationCreate, DeviceModelRelation from services.device_model_relation_service import DeviceModelRelationService -from app_instance import get_app +# from app_instance import get_app router = APIRouter() -app = get_app() +# app = get_app() -def get_service(): - return app.state.model_relation_service +# def get_service(): +# return app.state.model_relation_service @router.get("/list_by_device", response_model=StandardResponse[List[DeviceModelRelationInfo]]) @@ -30,6 +30,7 @@ @router.post("/update_by_device", response_model=StandardResponse[List[DeviceModelRelation]]) async def update_by_device(relation_data: List[DeviceModelRelationCreate], device_id: int = Query(...), - service: DeviceModelRelationService = Depends(get_service)): + db: AsyncSession = Depends(get_db)): + service = DeviceModelRelationService(db) relations = await service.update_relations_by_device(device_id, relation_data) return standard_response(data=relations) diff --git a/apis/model.py b/apis/model.py index fa2b191..389d7fe 100644 --- a/apis/model.py +++ b/apis/model.py @@ -4,17 +4,17 @@ from sqlalchemy.ext.asyncio import AsyncSession from apis.base import standard_response, StandardResponse, PageResponse, standard_error_response, convert_page_param -from app_instance import get_app +# from app_instance import get_app from db.database import get_db from entity.model import AlgoModel, AlgoModelCreate, AlgoModelUpdate, AlgoModelInfo from services.model_service import ModelService router = APIRouter() -app = get_app() - - -def get_service(): - return app.state.model_service +# app = get_app() +# +# +# def get_service(): +# return app.state.model_service @router.get("/list", response_model=StandardResponse[List[AlgoModelInfo]]) @@ -63,8 +63,9 @@ @router.post("/update", response_model=StandardResponse[AlgoModelInfo]) async def update_model(json_data: str = Form(..., description="JSON数据字段,内容为AlgoModelUpdate结构"), file: UploadFile = File(None, description="模型文件"), - service: ModelService = Depends(get_service)): + db: AsyncSession = Depends(get_db)): model_data = AlgoModelUpdate.parse_raw(json_data) + service = ModelService(db) model = await service.update_model(model_data, file) if not model: return standard_error_response(data=model_data, message="Model not found") diff --git a/app_instance.py b/app_instance.py index 275efd4..fb6a77f 100644 --- a/app_instance.py +++ b/app_instance.py @@ -53,7 +53,7 @@ tcp_manager = TcpClientManager(device_service=device_service, main_loop=main_loop) app.state.tcp_manager = tcp_manager - await tcp_manager.start() + # await tcp_manager.start() algo_runner = AlgoRunner( device_service=device_service, @@ -61,7 +61,7 @@ relation_service=model_relation_service, ) app.state.algo_runner = algo_runner - await algo_runner.start() + # await algo_runner.start() scene_runner = SceneRunner( device_service=device_service, diff --git a/common/ipc_utils.py b/common/ipc_utils.py new file mode 100644 index 0000000..dd3ce09 --- /dev/null +++ b/common/ipc_utils.py @@ -0,0 +1,19 @@ +from multiprocessing.connection import Client + + +def send_to_tcp(device_code, message): + try: + + text_bytes = str(device_code).encode('utf-8') + text_len = len(text_bytes).to_bytes(4, byteorder='big') # 4字节长度前缀 + + payload = text_len + text_bytes + message + + address = ('127.0.0.1', 6000) + secret = b'from_algo_to_tcp' + conn = Client(address, authkey=secret) + print(f"[IPC] send to {secret}:{payload}") + conn.send_bytes(payload) + conn.close() + except Exception as e: + print(f"[IPC] send to tcp failed: {e}") \ No newline at end of file diff --git a/db/safe-algo-pro.db b/db/safe-algo-pro.db index 3849239..3980f26 100644 --- a/db/safe-algo-pro.db +++ b/db/safe-algo-pro.db Binary files differ diff --git a/.gitignore b/.gitignore index 5e9050c..6cb9f0a 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,7 @@ .idea/* __pycache__/ **/__pycache__/ -*.py[cod] \ No newline at end of file +*.py[cod] + +*.mp4 +*.mkv \ No newline at end of file diff --git a/algo_main.py b/algo_main.py new file mode 100644 index 0000000..9ac9426 --- /dev/null +++ b/algo_main.py @@ -0,0 +1,46 @@ +import asyncio + +from algo.algo_runner import AlgoRunner +from algo.scene_runner import SceneRunner +from db.database import get_db +from services.device_model_relation_service import DeviceModelRelationService +from services.device_scene_relation_service import DeviceSceneRelationService +from services.device_service import DeviceService +from services.model_service import ModelService +from services.scene_service import SceneService + + +async def main(): + """主函数""" + db_gen = get_db() + db = await db_gen.__anext__() + + device_service = DeviceService(db) + model_service = ModelService(db) + model_relation_service = DeviceModelRelationService(db) + scene_service = SceneService(db) + scene_relation_service = DeviceSceneRelationService(db) + main_loop = asyncio.get_running_loop() + + algo_runner = AlgoRunner( + device_service=device_service, + model_service=model_service, + relation_service=model_relation_service, + ) + + scene_runner = SceneRunner( + device_service=device_service, + scene_service=scene_service, + relation_service=scene_relation_service, + tcp_manager=None, + main_loop=main_loop + ) + + await algo_runner.start() + await scene_runner.start() + + await asyncio.Event().wait() # 保持运行 + + +if __name__ == '__main__': + asyncio.run(main()) \ No newline at end of file diff --git a/apis/device.py b/apis/device.py index f170ae3..e642254 100644 --- a/apis/device.py +++ b/apis/device.py @@ -8,13 +8,13 @@ from entity.device import Device, DeviceCreate, DeviceUpdate, DeviceInfo from services.device_service import DeviceService -from app_instance import get_app +# from app_instance import get_app router = APIRouter() -app = get_app() - -def get_service(): - return app.state.device_service +# app = get_app() +# +# def get_service(): +# return app.state.device_service @router.get("/list", response_model=StandardResponse[List[DeviceInfo]]) @@ -48,13 +48,15 @@ @router.post("/add", response_model=StandardResponse[DeviceInfo]) -async def create_device(device_data: DeviceCreate, service: DeviceService = Depends(get_service)): +async def create_device(device_data: DeviceCreate, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.create_device(device_data) return standard_response(data=device) @router.post("/update", response_model=StandardResponse[DeviceInfo]) -async def update_device(device_data: DeviceUpdate, service: DeviceService = Depends(get_service)): +async def update_device(device_data: DeviceUpdate, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.update_device(device_data) if not device: return standard_error_response(data=device_data, message="Device not found") @@ -62,7 +64,8 @@ @router.delete("/delete", response_model=StandardResponse[int]) -async def delete_device(device_id: int, service: DeviceService = Depends(get_service)): +async def delete_device(device_id: int, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.delete_device(device_id) if not device: return standard_error_response(data=device_id, message="Device not found") diff --git a/apis/device_model_realtion.py b/apis/device_model_realtion.py index ddb5eb6..2aee16e 100644 --- a/apis/device_model_realtion.py +++ b/apis/device_model_realtion.py @@ -8,14 +8,14 @@ from entity.device_model_relation import DeviceModelRelationInfo, DeviceModelRelationCreate, DeviceModelRelation from services.device_model_relation_service import DeviceModelRelationService -from app_instance import get_app +# from app_instance import get_app router = APIRouter() -app = get_app() +# app = get_app() -def get_service(): - return app.state.model_relation_service +# def get_service(): +# return app.state.model_relation_service @router.get("/list_by_device", response_model=StandardResponse[List[DeviceModelRelationInfo]]) @@ -30,6 +30,7 @@ @router.post("/update_by_device", response_model=StandardResponse[List[DeviceModelRelation]]) async def update_by_device(relation_data: List[DeviceModelRelationCreate], device_id: int = Query(...), - service: DeviceModelRelationService = Depends(get_service)): + db: AsyncSession = Depends(get_db)): + service = DeviceModelRelationService(db) relations = await service.update_relations_by_device(device_id, relation_data) return standard_response(data=relations) diff --git a/apis/model.py b/apis/model.py index fa2b191..389d7fe 100644 --- a/apis/model.py +++ b/apis/model.py @@ -4,17 +4,17 @@ from sqlalchemy.ext.asyncio import AsyncSession from apis.base import standard_response, StandardResponse, PageResponse, standard_error_response, convert_page_param -from app_instance import get_app +# from app_instance import get_app from db.database import get_db from entity.model import AlgoModel, AlgoModelCreate, AlgoModelUpdate, AlgoModelInfo from services.model_service import ModelService router = APIRouter() -app = get_app() - - -def get_service(): - return app.state.model_service +# app = get_app() +# +# +# def get_service(): +# return app.state.model_service @router.get("/list", response_model=StandardResponse[List[AlgoModelInfo]]) @@ -63,8 +63,9 @@ @router.post("/update", response_model=StandardResponse[AlgoModelInfo]) async def update_model(json_data: str = Form(..., description="JSON数据字段,内容为AlgoModelUpdate结构"), file: UploadFile = File(None, description="模型文件"), - service: ModelService = Depends(get_service)): + db: AsyncSession = Depends(get_db)): model_data = AlgoModelUpdate.parse_raw(json_data) + service = ModelService(db) model = await service.update_model(model_data, file) if not model: return standard_error_response(data=model_data, message="Model not found") diff --git a/app_instance.py b/app_instance.py index 275efd4..fb6a77f 100644 --- a/app_instance.py +++ b/app_instance.py @@ -53,7 +53,7 @@ tcp_manager = TcpClientManager(device_service=device_service, main_loop=main_loop) app.state.tcp_manager = tcp_manager - await tcp_manager.start() + # await tcp_manager.start() algo_runner = AlgoRunner( device_service=device_service, @@ -61,7 +61,7 @@ relation_service=model_relation_service, ) app.state.algo_runner = algo_runner - await algo_runner.start() + # await algo_runner.start() scene_runner = SceneRunner( device_service=device_service, diff --git a/common/ipc_utils.py b/common/ipc_utils.py new file mode 100644 index 0000000..dd3ce09 --- /dev/null +++ b/common/ipc_utils.py @@ -0,0 +1,19 @@ +from multiprocessing.connection import Client + + +def send_to_tcp(device_code, message): + try: + + text_bytes = str(device_code).encode('utf-8') + text_len = len(text_bytes).to_bytes(4, byteorder='big') # 4字节长度前缀 + + payload = text_len + text_bytes + message + + address = ('127.0.0.1', 6000) + secret = b'from_algo_to_tcp' + conn = Client(address, authkey=secret) + print(f"[IPC] send to {secret}:{payload}") + conn.send_bytes(payload) + conn.close() + except Exception as e: + print(f"[IPC] send to tcp failed: {e}") \ No newline at end of file diff --git a/db/safe-algo-pro.db b/db/safe-algo-pro.db index 3849239..3980f26 100644 --- a/db/safe-algo-pro.db +++ b/db/safe-algo-pro.db Binary files differ diff --git a/http_server_main.py b/http_server_main.py new file mode 100644 index 0000000..37ddfb2 --- /dev/null +++ b/http_server_main.py @@ -0,0 +1,46 @@ +import uvicorn +import logging + +from fastapi import FastAPI +from fastapi.openapi.docs import get_swagger_ui_html +from fastapi.middleware.cors import CORSMiddleware +from fastapi.staticfiles import StaticFiles + +from common.global_logger import logger + +app = FastAPI() + +# 挂载静态文件夹 +app.mount("/static", StaticFiles(directory="static"), name="static") + + +# 自定义 Swagger 文档路由,指向本地的 Swagger UI 文件 +@app.get("/docs", include_in_schema=False) +async def custom_swagger_ui_html(): + return get_swagger_ui_html( + openapi_url="/openapi.json", + title= '安全生产一体机' + " - Swagger UI", + swagger_js_url="/static/swagger-ui/swagger-ui-bundle.js", + swagger_css_url="/static/swagger-ui/swagger-ui.css" + ) + +# 延迟导入 router 并注册路由 +from apis.router import router +app.include_router(router, prefix="/api") + +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +if __name__ == "__main__": + # 重定向 uvicorn 的日志 + uvicorn_logger = logging.getLogger("uvicorn") + uvicorn_logger.handlers = logger.handlers + uvicorn_logger.setLevel(logging.INFO) + + + uvicorn.run(app, host="0.0.0.0", port=9000, log_config=None) \ No newline at end of file diff --git a/.gitignore b/.gitignore index 5e9050c..6cb9f0a 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,7 @@ .idea/* __pycache__/ **/__pycache__/ -*.py[cod] \ No newline at end of file +*.py[cod] + +*.mp4 +*.mkv \ No newline at end of file diff --git a/algo_main.py b/algo_main.py new file mode 100644 index 0000000..9ac9426 --- /dev/null +++ b/algo_main.py @@ -0,0 +1,46 @@ +import asyncio + +from algo.algo_runner import AlgoRunner +from algo.scene_runner import SceneRunner +from db.database import get_db +from services.device_model_relation_service import DeviceModelRelationService +from services.device_scene_relation_service import DeviceSceneRelationService +from services.device_service import DeviceService +from services.model_service import ModelService +from services.scene_service import SceneService + + +async def main(): + """主函数""" + db_gen = get_db() + db = await db_gen.__anext__() + + device_service = DeviceService(db) + model_service = ModelService(db) + model_relation_service = DeviceModelRelationService(db) + scene_service = SceneService(db) + scene_relation_service = DeviceSceneRelationService(db) + main_loop = asyncio.get_running_loop() + + algo_runner = AlgoRunner( + device_service=device_service, + model_service=model_service, + relation_service=model_relation_service, + ) + + scene_runner = SceneRunner( + device_service=device_service, + scene_service=scene_service, + relation_service=scene_relation_service, + tcp_manager=None, + main_loop=main_loop + ) + + await algo_runner.start() + await scene_runner.start() + + await asyncio.Event().wait() # 保持运行 + + +if __name__ == '__main__': + asyncio.run(main()) \ No newline at end of file diff --git a/apis/device.py b/apis/device.py index f170ae3..e642254 100644 --- a/apis/device.py +++ b/apis/device.py @@ -8,13 +8,13 @@ from entity.device import Device, DeviceCreate, DeviceUpdate, DeviceInfo from services.device_service import DeviceService -from app_instance import get_app +# from app_instance import get_app router = APIRouter() -app = get_app() - -def get_service(): - return app.state.device_service +# app = get_app() +# +# def get_service(): +# return app.state.device_service @router.get("/list", response_model=StandardResponse[List[DeviceInfo]]) @@ -48,13 +48,15 @@ @router.post("/add", response_model=StandardResponse[DeviceInfo]) -async def create_device(device_data: DeviceCreate, service: DeviceService = Depends(get_service)): +async def create_device(device_data: DeviceCreate, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.create_device(device_data) return standard_response(data=device) @router.post("/update", response_model=StandardResponse[DeviceInfo]) -async def update_device(device_data: DeviceUpdate, service: DeviceService = Depends(get_service)): +async def update_device(device_data: DeviceUpdate, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.update_device(device_data) if not device: return standard_error_response(data=device_data, message="Device not found") @@ -62,7 +64,8 @@ @router.delete("/delete", response_model=StandardResponse[int]) -async def delete_device(device_id: int, service: DeviceService = Depends(get_service)): +async def delete_device(device_id: int, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.delete_device(device_id) if not device: return standard_error_response(data=device_id, message="Device not found") diff --git a/apis/device_model_realtion.py b/apis/device_model_realtion.py index ddb5eb6..2aee16e 100644 --- a/apis/device_model_realtion.py +++ b/apis/device_model_realtion.py @@ -8,14 +8,14 @@ from entity.device_model_relation import DeviceModelRelationInfo, DeviceModelRelationCreate, DeviceModelRelation from services.device_model_relation_service import DeviceModelRelationService -from app_instance import get_app +# from app_instance import get_app router = APIRouter() -app = get_app() +# app = get_app() -def get_service(): - return app.state.model_relation_service +# def get_service(): +# return app.state.model_relation_service @router.get("/list_by_device", response_model=StandardResponse[List[DeviceModelRelationInfo]]) @@ -30,6 +30,7 @@ @router.post("/update_by_device", response_model=StandardResponse[List[DeviceModelRelation]]) async def update_by_device(relation_data: List[DeviceModelRelationCreate], device_id: int = Query(...), - service: DeviceModelRelationService = Depends(get_service)): + db: AsyncSession = Depends(get_db)): + service = DeviceModelRelationService(db) relations = await service.update_relations_by_device(device_id, relation_data) return standard_response(data=relations) diff --git a/apis/model.py b/apis/model.py index fa2b191..389d7fe 100644 --- a/apis/model.py +++ b/apis/model.py @@ -4,17 +4,17 @@ from sqlalchemy.ext.asyncio import AsyncSession from apis.base import standard_response, StandardResponse, PageResponse, standard_error_response, convert_page_param -from app_instance import get_app +# from app_instance import get_app from db.database import get_db from entity.model import AlgoModel, AlgoModelCreate, AlgoModelUpdate, AlgoModelInfo from services.model_service import ModelService router = APIRouter() -app = get_app() - - -def get_service(): - return app.state.model_service +# app = get_app() +# +# +# def get_service(): +# return app.state.model_service @router.get("/list", response_model=StandardResponse[List[AlgoModelInfo]]) @@ -63,8 +63,9 @@ @router.post("/update", response_model=StandardResponse[AlgoModelInfo]) async def update_model(json_data: str = Form(..., description="JSON数据字段,内容为AlgoModelUpdate结构"), file: UploadFile = File(None, description="模型文件"), - service: ModelService = Depends(get_service)): + db: AsyncSession = Depends(get_db)): model_data = AlgoModelUpdate.parse_raw(json_data) + service = ModelService(db) model = await service.update_model(model_data, file) if not model: return standard_error_response(data=model_data, message="Model not found") diff --git a/app_instance.py b/app_instance.py index 275efd4..fb6a77f 100644 --- a/app_instance.py +++ b/app_instance.py @@ -53,7 +53,7 @@ tcp_manager = TcpClientManager(device_service=device_service, main_loop=main_loop) app.state.tcp_manager = tcp_manager - await tcp_manager.start() + # await tcp_manager.start() algo_runner = AlgoRunner( device_service=device_service, @@ -61,7 +61,7 @@ relation_service=model_relation_service, ) app.state.algo_runner = algo_runner - await algo_runner.start() + # await algo_runner.start() scene_runner = SceneRunner( device_service=device_service, diff --git a/common/ipc_utils.py b/common/ipc_utils.py new file mode 100644 index 0000000..dd3ce09 --- /dev/null +++ b/common/ipc_utils.py @@ -0,0 +1,19 @@ +from multiprocessing.connection import Client + + +def send_to_tcp(device_code, message): + try: + + text_bytes = str(device_code).encode('utf-8') + text_len = len(text_bytes).to_bytes(4, byteorder='big') # 4字节长度前缀 + + payload = text_len + text_bytes + message + + address = ('127.0.0.1', 6000) + secret = b'from_algo_to_tcp' + conn = Client(address, authkey=secret) + print(f"[IPC] send to {secret}:{payload}") + conn.send_bytes(payload) + conn.close() + except Exception as e: + print(f"[IPC] send to tcp failed: {e}") \ No newline at end of file diff --git a/db/safe-algo-pro.db b/db/safe-algo-pro.db index 3849239..3980f26 100644 --- a/db/safe-algo-pro.db +++ b/db/safe-algo-pro.db Binary files differ diff --git a/http_server_main.py b/http_server_main.py new file mode 100644 index 0000000..37ddfb2 --- /dev/null +++ b/http_server_main.py @@ -0,0 +1,46 @@ +import uvicorn +import logging + +from fastapi import FastAPI +from fastapi.openapi.docs import get_swagger_ui_html +from fastapi.middleware.cors import CORSMiddleware +from fastapi.staticfiles import StaticFiles + +from common.global_logger import logger + +app = FastAPI() + +# 挂载静态文件夹 +app.mount("/static", StaticFiles(directory="static"), name="static") + + +# 自定义 Swagger 文档路由,指向本地的 Swagger UI 文件 +@app.get("/docs", include_in_schema=False) +async def custom_swagger_ui_html(): + return get_swagger_ui_html( + openapi_url="/openapi.json", + title= '安全生产一体机' + " - Swagger UI", + swagger_js_url="/static/swagger-ui/swagger-ui-bundle.js", + swagger_css_url="/static/swagger-ui/swagger-ui.css" + ) + +# 延迟导入 router 并注册路由 +from apis.router import router +app.include_router(router, prefix="/api") + +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +if __name__ == "__main__": + # 重定向 uvicorn 的日志 + uvicorn_logger = logging.getLogger("uvicorn") + uvicorn_logger.handlers = logger.handlers + uvicorn_logger.setLevel(logging.INFO) + + + uvicorn.run(app, host="0.0.0.0", port=9000, log_config=None) \ No newline at end of file diff --git a/scene_handler/alarm_message_center.py b/scene_handler/alarm_message_center.py index a1f4730..3beca46 100644 --- a/scene_handler/alarm_message_center.py +++ b/scene_handler/alarm_message_center.py @@ -5,6 +5,7 @@ from threading import Thread, Lock from common.global_logger import logger +from common.ipc_utils import send_to_tcp ''' 队列消息取出规则: @@ -116,12 +117,13 @@ def send_message(self, message): """发送报警消息""" print(f"发送报警消息: {message['alarmContent']} (类别: {message['alarmCategory']}, 时间: {message['timestamp']})") - if self.tcp_manager: - asyncio.run_coroutine_threadsafe( - self.tcp_manager.send_message_to_device(device_id=self.device_id, - message=message['alarmSoundMessage'], - have_response=False), - self.main_loop) + send_to_tcp(self.device_id, message['alarmSoundMessage']) + # if self.tcp_manager: + # asyncio.run_coroutine_threadsafe( + # self.tcp_manager.send_message_to_device(device_id=self.device_id, + # message=message['alarmSoundMessage'], + # have_response=False), + # self.main_loop) def send_immediate_command(self, command): """ diff --git a/.gitignore b/.gitignore index 5e9050c..6cb9f0a 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,7 @@ .idea/* __pycache__/ **/__pycache__/ -*.py[cod] \ No newline at end of file +*.py[cod] + +*.mp4 +*.mkv \ No newline at end of file diff --git a/algo_main.py b/algo_main.py new file mode 100644 index 0000000..9ac9426 --- /dev/null +++ b/algo_main.py @@ -0,0 +1,46 @@ +import asyncio + +from algo.algo_runner import AlgoRunner +from algo.scene_runner import SceneRunner +from db.database import get_db +from services.device_model_relation_service import DeviceModelRelationService +from services.device_scene_relation_service import DeviceSceneRelationService +from services.device_service import DeviceService +from services.model_service import ModelService +from services.scene_service import SceneService + + +async def main(): + """主函数""" + db_gen = get_db() + db = await db_gen.__anext__() + + device_service = DeviceService(db) + model_service = ModelService(db) + model_relation_service = DeviceModelRelationService(db) + scene_service = SceneService(db) + scene_relation_service = DeviceSceneRelationService(db) + main_loop = asyncio.get_running_loop() + + algo_runner = AlgoRunner( + device_service=device_service, + model_service=model_service, + relation_service=model_relation_service, + ) + + scene_runner = SceneRunner( + device_service=device_service, + scene_service=scene_service, + relation_service=scene_relation_service, + tcp_manager=None, + main_loop=main_loop + ) + + await algo_runner.start() + await scene_runner.start() + + await asyncio.Event().wait() # 保持运行 + + +if __name__ == '__main__': + asyncio.run(main()) \ No newline at end of file diff --git a/apis/device.py b/apis/device.py index f170ae3..e642254 100644 --- a/apis/device.py +++ b/apis/device.py @@ -8,13 +8,13 @@ from entity.device import Device, DeviceCreate, DeviceUpdate, DeviceInfo from services.device_service import DeviceService -from app_instance import get_app +# from app_instance import get_app router = APIRouter() -app = get_app() - -def get_service(): - return app.state.device_service +# app = get_app() +# +# def get_service(): +# return app.state.device_service @router.get("/list", response_model=StandardResponse[List[DeviceInfo]]) @@ -48,13 +48,15 @@ @router.post("/add", response_model=StandardResponse[DeviceInfo]) -async def create_device(device_data: DeviceCreate, service: DeviceService = Depends(get_service)): +async def create_device(device_data: DeviceCreate, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.create_device(device_data) return standard_response(data=device) @router.post("/update", response_model=StandardResponse[DeviceInfo]) -async def update_device(device_data: DeviceUpdate, service: DeviceService = Depends(get_service)): +async def update_device(device_data: DeviceUpdate, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.update_device(device_data) if not device: return standard_error_response(data=device_data, message="Device not found") @@ -62,7 +64,8 @@ @router.delete("/delete", response_model=StandardResponse[int]) -async def delete_device(device_id: int, service: DeviceService = Depends(get_service)): +async def delete_device(device_id: int, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.delete_device(device_id) if not device: return standard_error_response(data=device_id, message="Device not found") diff --git a/apis/device_model_realtion.py b/apis/device_model_realtion.py index ddb5eb6..2aee16e 100644 --- a/apis/device_model_realtion.py +++ b/apis/device_model_realtion.py @@ -8,14 +8,14 @@ from entity.device_model_relation import DeviceModelRelationInfo, DeviceModelRelationCreate, DeviceModelRelation from services.device_model_relation_service import DeviceModelRelationService -from app_instance import get_app +# from app_instance import get_app router = APIRouter() -app = get_app() +# app = get_app() -def get_service(): - return app.state.model_relation_service +# def get_service(): +# return app.state.model_relation_service @router.get("/list_by_device", response_model=StandardResponse[List[DeviceModelRelationInfo]]) @@ -30,6 +30,7 @@ @router.post("/update_by_device", response_model=StandardResponse[List[DeviceModelRelation]]) async def update_by_device(relation_data: List[DeviceModelRelationCreate], device_id: int = Query(...), - service: DeviceModelRelationService = Depends(get_service)): + db: AsyncSession = Depends(get_db)): + service = DeviceModelRelationService(db) relations = await service.update_relations_by_device(device_id, relation_data) return standard_response(data=relations) diff --git a/apis/model.py b/apis/model.py index fa2b191..389d7fe 100644 --- a/apis/model.py +++ b/apis/model.py @@ -4,17 +4,17 @@ from sqlalchemy.ext.asyncio import AsyncSession from apis.base import standard_response, StandardResponse, PageResponse, standard_error_response, convert_page_param -from app_instance import get_app +# from app_instance import get_app from db.database import get_db from entity.model import AlgoModel, AlgoModelCreate, AlgoModelUpdate, AlgoModelInfo from services.model_service import ModelService router = APIRouter() -app = get_app() - - -def get_service(): - return app.state.model_service +# app = get_app() +# +# +# def get_service(): +# return app.state.model_service @router.get("/list", response_model=StandardResponse[List[AlgoModelInfo]]) @@ -63,8 +63,9 @@ @router.post("/update", response_model=StandardResponse[AlgoModelInfo]) async def update_model(json_data: str = Form(..., description="JSON数据字段,内容为AlgoModelUpdate结构"), file: UploadFile = File(None, description="模型文件"), - service: ModelService = Depends(get_service)): + db: AsyncSession = Depends(get_db)): model_data = AlgoModelUpdate.parse_raw(json_data) + service = ModelService(db) model = await service.update_model(model_data, file) if not model: return standard_error_response(data=model_data, message="Model not found") diff --git a/app_instance.py b/app_instance.py index 275efd4..fb6a77f 100644 --- a/app_instance.py +++ b/app_instance.py @@ -53,7 +53,7 @@ tcp_manager = TcpClientManager(device_service=device_service, main_loop=main_loop) app.state.tcp_manager = tcp_manager - await tcp_manager.start() + # await tcp_manager.start() algo_runner = AlgoRunner( device_service=device_service, @@ -61,7 +61,7 @@ relation_service=model_relation_service, ) app.state.algo_runner = algo_runner - await algo_runner.start() + # await algo_runner.start() scene_runner = SceneRunner( device_service=device_service, diff --git a/common/ipc_utils.py b/common/ipc_utils.py new file mode 100644 index 0000000..dd3ce09 --- /dev/null +++ b/common/ipc_utils.py @@ -0,0 +1,19 @@ +from multiprocessing.connection import Client + + +def send_to_tcp(device_code, message): + try: + + text_bytes = str(device_code).encode('utf-8') + text_len = len(text_bytes).to_bytes(4, byteorder='big') # 4字节长度前缀 + + payload = text_len + text_bytes + message + + address = ('127.0.0.1', 6000) + secret = b'from_algo_to_tcp' + conn = Client(address, authkey=secret) + print(f"[IPC] send to {secret}:{payload}") + conn.send_bytes(payload) + conn.close() + except Exception as e: + print(f"[IPC] send to tcp failed: {e}") \ No newline at end of file diff --git a/db/safe-algo-pro.db b/db/safe-algo-pro.db index 3849239..3980f26 100644 --- a/db/safe-algo-pro.db +++ b/db/safe-algo-pro.db Binary files differ diff --git a/http_server_main.py b/http_server_main.py new file mode 100644 index 0000000..37ddfb2 --- /dev/null +++ b/http_server_main.py @@ -0,0 +1,46 @@ +import uvicorn +import logging + +from fastapi import FastAPI +from fastapi.openapi.docs import get_swagger_ui_html +from fastapi.middleware.cors import CORSMiddleware +from fastapi.staticfiles import StaticFiles + +from common.global_logger import logger + +app = FastAPI() + +# 挂载静态文件夹 +app.mount("/static", StaticFiles(directory="static"), name="static") + + +# 自定义 Swagger 文档路由,指向本地的 Swagger UI 文件 +@app.get("/docs", include_in_schema=False) +async def custom_swagger_ui_html(): + return get_swagger_ui_html( + openapi_url="/openapi.json", + title= '安全生产一体机' + " - Swagger UI", + swagger_js_url="/static/swagger-ui/swagger-ui-bundle.js", + swagger_css_url="/static/swagger-ui/swagger-ui.css" + ) + +# 延迟导入 router 并注册路由 +from apis.router import router +app.include_router(router, prefix="/api") + +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +if __name__ == "__main__": + # 重定向 uvicorn 的日志 + uvicorn_logger = logging.getLogger("uvicorn") + uvicorn_logger.handlers = logger.handlers + uvicorn_logger.setLevel(logging.INFO) + + + uvicorn.run(app, host="0.0.0.0", port=9000, log_config=None) \ No newline at end of file diff --git a/scene_handler/alarm_message_center.py b/scene_handler/alarm_message_center.py index a1f4730..3beca46 100644 --- a/scene_handler/alarm_message_center.py +++ b/scene_handler/alarm_message_center.py @@ -5,6 +5,7 @@ from threading import Thread, Lock from common.global_logger import logger +from common.ipc_utils import send_to_tcp ''' 队列消息取出规则: @@ -116,12 +117,13 @@ def send_message(self, message): """发送报警消息""" print(f"发送报警消息: {message['alarmContent']} (类别: {message['alarmCategory']}, 时间: {message['timestamp']})") - if self.tcp_manager: - asyncio.run_coroutine_threadsafe( - self.tcp_manager.send_message_to_device(device_id=self.device_id, - message=message['alarmSoundMessage'], - have_response=False), - self.main_loop) + send_to_tcp(self.device_id, message['alarmSoundMessage']) + # if self.tcp_manager: + # asyncio.run_coroutine_threadsafe( + # self.tcp_manager.send_message_to_device(device_id=self.device_id, + # message=message['alarmSoundMessage'], + # have_response=False), + # self.main_loop) def send_immediate_command(self, command): """ diff --git a/tcp_main.py b/tcp_main.py new file mode 100644 index 0000000..6c77bd6 --- /dev/null +++ b/tcp_main.py @@ -0,0 +1,100 @@ +import asyncio +import threading +from multiprocessing.connection import Listener + +from db.database import get_db +from services.device_service import DeviceService +from services.global_config import GlobalConfig +from tcp.harmful_device_handler import HarmfulGasHandler +from tcp.tcp_client_manager import TcpClientManager +from tcp.tcp_server import TcpServer + +from common.global_logger import logger + + +async def main(): + """主函数""" + db_gen = get_db() + db = await db_gen.__anext__() + + global_config = GlobalConfig() + await global_config.init_config() + + device_service = DeviceService(db) + main_loop = asyncio.get_running_loop() + + # tcp client 用于连接安全树 + tcp_manager = TcpClientManager(device_service=device_service, main_loop=main_loop) + await tcp_manager.start() + + # tcp server 用于接收四合一等设备数据 + tcp_server = TcpServer() + harmful_handler = HarmfulGasHandler(main_loop=main_loop) + tcp_server.register_data_callback(harmful_handler.parse) + main_loop.create_task(tcp_server.start()) + + # 启动 listener 的后台线程 + listener_thread = threading.Thread( + target=start_listener, + args=(tcp_manager, main_loop), + daemon=True + ) + listener_thread.start() + + await asyncio.Event().wait() # 保持运行 + + +def start_listener(tcp_manager, loop): + """后台线程:监听进程通信""" + address = ('0.0.0.0', 6000) + secret = b'from_algo_to_tcp' + listener = Listener(address, authkey=secret) + + print(f"Listener started on {address}") + + while True: + conn = listener.accept() + try: + while True: + # msg = conn.recv() # 阻塞式 + # print(f"[IPC] Received from {secret}: {msg}") + # device_id = msg.split("_")[0] + # tcp_msg = msg.split("_")[1] + + try: + raw_data = conn.recv_bytes() # 接收原始字节 + print(f"[IPC] Received from {secret}: {raw_data}") + + # 解包长度前缀 + if len(raw_data) < 4: + raise ValueError("数据不足4字节") + + text_len = int.from_bytes(raw_data[:4], byteorder='big') + if len(raw_data) < 4 + text_len: + raise ValueError("device_id 长度不足") + + text_len = int.from_bytes(raw_data[:4], byteorder='big') + device_id = raw_data[4:4 + text_len].decode('utf-8') + tcp_msg = raw_data[4 + text_len:] + + # 把任务传给事件循环中运行 + asyncio.run_coroutine_threadsafe( + tcp_manager.send_message_to_device(int(device_id), tcp_msg), loop + ) + except EOFError: + print("[IPC] Connection closed by peer (EOF).") + break + + except Exception as e: + logger.exception(f"[IPC] Received from {secret} failed: {e}") + conn.close() + break + + except Exception as e: + logger.exception(f"[IPC] Listener error: {e}") + finally: + conn.close() + + +if __name__ == '__main__': + asyncio.run(main()) diff --git a/.gitignore b/.gitignore index 5e9050c..6cb9f0a 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,7 @@ .idea/* __pycache__/ **/__pycache__/ -*.py[cod] \ No newline at end of file +*.py[cod] + +*.mp4 +*.mkv \ No newline at end of file diff --git a/algo_main.py b/algo_main.py new file mode 100644 index 0000000..9ac9426 --- /dev/null +++ b/algo_main.py @@ -0,0 +1,46 @@ +import asyncio + +from algo.algo_runner import AlgoRunner +from algo.scene_runner import SceneRunner +from db.database import get_db +from services.device_model_relation_service import DeviceModelRelationService +from services.device_scene_relation_service import DeviceSceneRelationService +from services.device_service import DeviceService +from services.model_service import ModelService +from services.scene_service import SceneService + + +async def main(): + """主函数""" + db_gen = get_db() + db = await db_gen.__anext__() + + device_service = DeviceService(db) + model_service = ModelService(db) + model_relation_service = DeviceModelRelationService(db) + scene_service = SceneService(db) + scene_relation_service = DeviceSceneRelationService(db) + main_loop = asyncio.get_running_loop() + + algo_runner = AlgoRunner( + device_service=device_service, + model_service=model_service, + relation_service=model_relation_service, + ) + + scene_runner = SceneRunner( + device_service=device_service, + scene_service=scene_service, + relation_service=scene_relation_service, + tcp_manager=None, + main_loop=main_loop + ) + + await algo_runner.start() + await scene_runner.start() + + await asyncio.Event().wait() # 保持运行 + + +if __name__ == '__main__': + asyncio.run(main()) \ No newline at end of file diff --git a/apis/device.py b/apis/device.py index f170ae3..e642254 100644 --- a/apis/device.py +++ b/apis/device.py @@ -8,13 +8,13 @@ from entity.device import Device, DeviceCreate, DeviceUpdate, DeviceInfo from services.device_service import DeviceService -from app_instance import get_app +# from app_instance import get_app router = APIRouter() -app = get_app() - -def get_service(): - return app.state.device_service +# app = get_app() +# +# def get_service(): +# return app.state.device_service @router.get("/list", response_model=StandardResponse[List[DeviceInfo]]) @@ -48,13 +48,15 @@ @router.post("/add", response_model=StandardResponse[DeviceInfo]) -async def create_device(device_data: DeviceCreate, service: DeviceService = Depends(get_service)): +async def create_device(device_data: DeviceCreate, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.create_device(device_data) return standard_response(data=device) @router.post("/update", response_model=StandardResponse[DeviceInfo]) -async def update_device(device_data: DeviceUpdate, service: DeviceService = Depends(get_service)): +async def update_device(device_data: DeviceUpdate, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.update_device(device_data) if not device: return standard_error_response(data=device_data, message="Device not found") @@ -62,7 +64,8 @@ @router.delete("/delete", response_model=StandardResponse[int]) -async def delete_device(device_id: int, service: DeviceService = Depends(get_service)): +async def delete_device(device_id: int, db: AsyncSession = Depends(get_db)): + service = DeviceService(db) device = await service.delete_device(device_id) if not device: return standard_error_response(data=device_id, message="Device not found") diff --git a/apis/device_model_realtion.py b/apis/device_model_realtion.py index ddb5eb6..2aee16e 100644 --- a/apis/device_model_realtion.py +++ b/apis/device_model_realtion.py @@ -8,14 +8,14 @@ from entity.device_model_relation import DeviceModelRelationInfo, DeviceModelRelationCreate, DeviceModelRelation from services.device_model_relation_service import DeviceModelRelationService -from app_instance import get_app +# from app_instance import get_app router = APIRouter() -app = get_app() +# app = get_app() -def get_service(): - return app.state.model_relation_service +# def get_service(): +# return app.state.model_relation_service @router.get("/list_by_device", response_model=StandardResponse[List[DeviceModelRelationInfo]]) @@ -30,6 +30,7 @@ @router.post("/update_by_device", response_model=StandardResponse[List[DeviceModelRelation]]) async def update_by_device(relation_data: List[DeviceModelRelationCreate], device_id: int = Query(...), - service: DeviceModelRelationService = Depends(get_service)): + db: AsyncSession = Depends(get_db)): + service = DeviceModelRelationService(db) relations = await service.update_relations_by_device(device_id, relation_data) return standard_response(data=relations) diff --git a/apis/model.py b/apis/model.py index fa2b191..389d7fe 100644 --- a/apis/model.py +++ b/apis/model.py @@ -4,17 +4,17 @@ from sqlalchemy.ext.asyncio import AsyncSession from apis.base import standard_response, StandardResponse, PageResponse, standard_error_response, convert_page_param -from app_instance import get_app +# from app_instance import get_app from db.database import get_db from entity.model import AlgoModel, AlgoModelCreate, AlgoModelUpdate, AlgoModelInfo from services.model_service import ModelService router = APIRouter() -app = get_app() - - -def get_service(): - return app.state.model_service +# app = get_app() +# +# +# def get_service(): +# return app.state.model_service @router.get("/list", response_model=StandardResponse[List[AlgoModelInfo]]) @@ -63,8 +63,9 @@ @router.post("/update", response_model=StandardResponse[AlgoModelInfo]) async def update_model(json_data: str = Form(..., description="JSON数据字段,内容为AlgoModelUpdate结构"), file: UploadFile = File(None, description="模型文件"), - service: ModelService = Depends(get_service)): + db: AsyncSession = Depends(get_db)): model_data = AlgoModelUpdate.parse_raw(json_data) + service = ModelService(db) model = await service.update_model(model_data, file) if not model: return standard_error_response(data=model_data, message="Model not found") diff --git a/app_instance.py b/app_instance.py index 275efd4..fb6a77f 100644 --- a/app_instance.py +++ b/app_instance.py @@ -53,7 +53,7 @@ tcp_manager = TcpClientManager(device_service=device_service, main_loop=main_loop) app.state.tcp_manager = tcp_manager - await tcp_manager.start() + # await tcp_manager.start() algo_runner = AlgoRunner( device_service=device_service, @@ -61,7 +61,7 @@ relation_service=model_relation_service, ) app.state.algo_runner = algo_runner - await algo_runner.start() + # await algo_runner.start() scene_runner = SceneRunner( device_service=device_service, diff --git a/common/ipc_utils.py b/common/ipc_utils.py new file mode 100644 index 0000000..dd3ce09 --- /dev/null +++ b/common/ipc_utils.py @@ -0,0 +1,19 @@ +from multiprocessing.connection import Client + + +def send_to_tcp(device_code, message): + try: + + text_bytes = str(device_code).encode('utf-8') + text_len = len(text_bytes).to_bytes(4, byteorder='big') # 4字节长度前缀 + + payload = text_len + text_bytes + message + + address = ('127.0.0.1', 6000) + secret = b'from_algo_to_tcp' + conn = Client(address, authkey=secret) + print(f"[IPC] send to {secret}:{payload}") + conn.send_bytes(payload) + conn.close() + except Exception as e: + print(f"[IPC] send to tcp failed: {e}") \ No newline at end of file diff --git a/db/safe-algo-pro.db b/db/safe-algo-pro.db index 3849239..3980f26 100644 --- a/db/safe-algo-pro.db +++ b/db/safe-algo-pro.db Binary files differ diff --git a/http_server_main.py b/http_server_main.py new file mode 100644 index 0000000..37ddfb2 --- /dev/null +++ b/http_server_main.py @@ -0,0 +1,46 @@ +import uvicorn +import logging + +from fastapi import FastAPI +from fastapi.openapi.docs import get_swagger_ui_html +from fastapi.middleware.cors import CORSMiddleware +from fastapi.staticfiles import StaticFiles + +from common.global_logger import logger + +app = FastAPI() + +# 挂载静态文件夹 +app.mount("/static", StaticFiles(directory="static"), name="static") + + +# 自定义 Swagger 文档路由,指向本地的 Swagger UI 文件 +@app.get("/docs", include_in_schema=False) +async def custom_swagger_ui_html(): + return get_swagger_ui_html( + openapi_url="/openapi.json", + title= '安全生产一体机' + " - Swagger UI", + swagger_js_url="/static/swagger-ui/swagger-ui-bundle.js", + swagger_css_url="/static/swagger-ui/swagger-ui.css" + ) + +# 延迟导入 router 并注册路由 +from apis.router import router +app.include_router(router, prefix="/api") + +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +if __name__ == "__main__": + # 重定向 uvicorn 的日志 + uvicorn_logger = logging.getLogger("uvicorn") + uvicorn_logger.handlers = logger.handlers + uvicorn_logger.setLevel(logging.INFO) + + + uvicorn.run(app, host="0.0.0.0", port=9000, log_config=None) \ No newline at end of file diff --git a/scene_handler/alarm_message_center.py b/scene_handler/alarm_message_center.py index a1f4730..3beca46 100644 --- a/scene_handler/alarm_message_center.py +++ b/scene_handler/alarm_message_center.py @@ -5,6 +5,7 @@ from threading import Thread, Lock from common.global_logger import logger +from common.ipc_utils import send_to_tcp ''' 队列消息取出规则: @@ -116,12 +117,13 @@ def send_message(self, message): """发送报警消息""" print(f"发送报警消息: {message['alarmContent']} (类别: {message['alarmCategory']}, 时间: {message['timestamp']})") - if self.tcp_manager: - asyncio.run_coroutine_threadsafe( - self.tcp_manager.send_message_to_device(device_id=self.device_id, - message=message['alarmSoundMessage'], - have_response=False), - self.main_loop) + send_to_tcp(self.device_id, message['alarmSoundMessage']) + # if self.tcp_manager: + # asyncio.run_coroutine_threadsafe( + # self.tcp_manager.send_message_to_device(device_id=self.device_id, + # message=message['alarmSoundMessage'], + # have_response=False), + # self.main_loop) def send_immediate_command(self, command): """ diff --git a/tcp_main.py b/tcp_main.py new file mode 100644 index 0000000..6c77bd6 --- /dev/null +++ b/tcp_main.py @@ -0,0 +1,100 @@ +import asyncio +import threading +from multiprocessing.connection import Listener + +from db.database import get_db +from services.device_service import DeviceService +from services.global_config import GlobalConfig +from tcp.harmful_device_handler import HarmfulGasHandler +from tcp.tcp_client_manager import TcpClientManager +from tcp.tcp_server import TcpServer + +from common.global_logger import logger + + +async def main(): + """主函数""" + db_gen = get_db() + db = await db_gen.__anext__() + + global_config = GlobalConfig() + await global_config.init_config() + + device_service = DeviceService(db) + main_loop = asyncio.get_running_loop() + + # tcp client 用于连接安全树 + tcp_manager = TcpClientManager(device_service=device_service, main_loop=main_loop) + await tcp_manager.start() + + # tcp server 用于接收四合一等设备数据 + tcp_server = TcpServer() + harmful_handler = HarmfulGasHandler(main_loop=main_loop) + tcp_server.register_data_callback(harmful_handler.parse) + main_loop.create_task(tcp_server.start()) + + # 启动 listener 的后台线程 + listener_thread = threading.Thread( + target=start_listener, + args=(tcp_manager, main_loop), + daemon=True + ) + listener_thread.start() + + await asyncio.Event().wait() # 保持运行 + + +def start_listener(tcp_manager, loop): + """后台线程:监听进程通信""" + address = ('0.0.0.0', 6000) + secret = b'from_algo_to_tcp' + listener = Listener(address, authkey=secret) + + print(f"Listener started on {address}") + + while True: + conn = listener.accept() + try: + while True: + # msg = conn.recv() # 阻塞式 + # print(f"[IPC] Received from {secret}: {msg}") + # device_id = msg.split("_")[0] + # tcp_msg = msg.split("_")[1] + + try: + raw_data = conn.recv_bytes() # 接收原始字节 + print(f"[IPC] Received from {secret}: {raw_data}") + + # 解包长度前缀 + if len(raw_data) < 4: + raise ValueError("数据不足4字节") + + text_len = int.from_bytes(raw_data[:4], byteorder='big') + if len(raw_data) < 4 + text_len: + raise ValueError("device_id 长度不足") + + text_len = int.from_bytes(raw_data[:4], byteorder='big') + device_id = raw_data[4:4 + text_len].decode('utf-8') + tcp_msg = raw_data[4 + text_len:] + + # 把任务传给事件循环中运行 + asyncio.run_coroutine_threadsafe( + tcp_manager.send_message_to_device(int(device_id), tcp_msg), loop + ) + except EOFError: + print("[IPC] Connection closed by peer (EOF).") + break + + except Exception as e: + logger.exception(f"[IPC] Received from {secret} failed: {e}") + conn.close() + break + + except Exception as e: + logger.exception(f"[IPC] Listener error: {e}") + finally: + conn.close() + + +if __name__ == '__main__': + asyncio.run(main()) diff --git a/whls/lap-0.5.12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl b/whls/lap-0.5.12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl new file mode 100644 index 0000000..1955099 --- /dev/null +++ b/whls/lap-0.5.12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl Binary files differ