Linux下获环境变量的值getenv,secure_getenv,例如获取用户主目录

本文介绍了一种在Linux环境下获取当前用户主目录的方法,通过调用标准库函数getenv实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Linux环境下编程,有时我们需要获取一些环境变量的值,例如,登录用户名,用户主目录,PATH路径,系统语言等,本篇记录使用getenv,secure_getenv函数获取相应变量的值。

开发环境 Ubuntu1804

首先我们可以通过env命令查看环境变量的相关设置值

 

1.getenv函数根据环境变量获取对应的值

函数名getenv
相关函数secure_getenv
表头文件#include<stdlib.h>
函数定义char *getenv(const char *name);
函数说明根据环境获取该环境变量的值,参数name是变量名,如果变量名不存在,返回值为nullptr
返回值返回变量值的指针

示例:

#include <iostream>
#include <stdio.h>
#include <string.h>  //strcpy
#include <stdlib.h> //getenv secure_getenv

using namespace std;

int main()
{
    char buf[200];
    char *home = getenv("HOME");  //用户主目录
    printf("home=========%s\n", home);
    strcpy(buf, home);
    printf("buf==========%s\n", buf);

    char *lang = getenv("LANG");  //系统语言编码
    printf("lang=========%s\n", lang);

    char *username = getenv("USERNAME");  //用户名
    printf("username=====%s\n", username);

    char *user = getenv("USER");  //用户
    printf("user=========%s\n", user);

    char *pwd = getenv("PWD");  //当前用户主目录
    printf("pwd==========%s\n", pwd);

    char *logname = getenv("LOGNAME");  //登录名
    printf("logname======%s\n", logname);

    char *path = getenv("PATH");  //path路径
    printf("home=========%s\n", path);

    char *shell = getenv("SHELL");  //SHELL目录
    printf("shell========%s\n", shell);
    char *aa = getenv("aa");  //不存在的变量
    printf("aa========%s\n", aa);
    cout << "Hello World!" << endl;
    return 0;
}

运行:

2.getenv函数在安全环境下搜索环境列表以查找环境变量名

函数名secure_getenv
相关函数getenv
表头文件#include<stdlib.h>
函数定义char *secure_getenv(const char *name);
函数说明secure_getenv()函数与getenv()类似,除了在需要“安全执行”的情况下,它返回nullptr
返回值返回变量值的指针

示例:

#include <iostream>
#include <stdio.h>
#include <string.h>  //strcpy
#include <stdlib.h> //getenv secure_getenv

using namespace std;

int main()
{
    char buf[200];
    char *home = secure_getenv("HOME");  //用户主目录
    printf("home=========%s\n", home);
    strcpy(buf, home);
    printf("buf==========%s\n", buf);

    char *lang = secure_getenv("LANG");  //系统语言编码
    printf("lang=========%s\n", lang);

    char *username = secure_getenv("USERNAME");  //用户名
    printf("username=====%s\n", username);

    char *user = secure_getenv("USER");  //用户
    printf("user=========%s\n", user);

    char *pwd = secure_getenv("PWD");  //当前用户主目录
    printf("pwd==========%s\n", pwd);

    char *logname = secure_getenv("LOGNAME");  //登录名
    printf("logname======%s\n", logname);

    char *path = secure_getenv("PATH");  //path路径
    printf("home=========%s\n", path);

    char *shell = secure_getenv("SHELL");  //SHELL目录
    printf("shell========%s\n", shell);
    char *aa = secure_getenv("aa");  //不存在的变量
    printf("aa========%s\n", aa);
    cout << "Hello World!" << endl;
    return 0;
}

运行结果:

那我们一个一个修复吧。# config/config_loader.py import os import sys import logging from dotenv import load_dotenv from pathlib import Path class ConfigLoader: _instance = None def __new__(cls): if cls._instance is None: cls._instance = super(ConfigLoader, cls).__new__(cls) cls._instance._load_config() return cls._instance def _load_config(self): """加载并解析环境变量""" # 设置日志记录器 self.logger = logging.getLogger('ConfigLoader') self.logger.setLevel(logging.INFO) # 优先使用环境变量指定的根目录 workspace_root = os.getenv('WORKSPACE_ROOT') # 如果没有环境变量,使用当前文件位置推断 if not workspace_root: try: base_path = Path(__file__).resolve().parent.parent # 检查是否是预期的工作区 if "AI_System" in str(base_path) and Path("E:/AI_System").exists(): base_path = Path("E:/AI_System") workspace_root = base_path self.logger.info(f"✅ 推断工作区根目录: {workspace_root}") except Exception as e: self.logger.error(f"❌ 推断工作区根目录失败: {str(e)}") workspace_root = Path.cwd() self.logger.warning(f"⚠️ 使用当前工作目录作为根目录: {workspace_root}") self.WORKSPACE_ROOT = Path(workspace_root) # 加载.env文件 env_path = self.WORKSPACE_ROOT / '.env' if env_path.exists(): load_dotenv(env_path) self.logger.info(f"✅ 已加载环境文件: {env_path}") else: self.logger.warning(f"⚠️ 未找到环境文件: {env_path} - 使用默认配置") # 基础配置 self.PROJECT_ROOT = self.WORKSPACE_ROOT self.ENV = os.getenv('FLASK_ENV', 'development') # 路径配置 - 使用环境变量或默认 self.AGENT_PATH = self._get_path('AGENT_PATH', 'agent') self.WEB_UI_PATH = self._get_path('WEB_UI_PATH', 'web_ui') self.MODEL_CACHE_DIR = self._get_path('MODEL_CACHE_DIR', 'model_cache') self.LOG_DIR = self._get_path('LOG_DIR', 'logs') self.CONFIG_DIR = self._get_path('CONFIG_DIR', 'config') self.CORE_DIR = self._get_path('CORE_DIR', 'core') self.COGNITIVE_ARCH_DIR = self._get_path('COGNITIVE_ARCH_DIR', 'cognitive_arch') # 服务器配置 - 根据环境选择 self._load_server_config() # 模型配置 self.USE_GPU = os.getenv('USE_GPU', 'false').lower() == 'true' self.DEFAULT_MODEL = os.getenv('DEFAULT_MODEL', 'minimal-model') # 安全配置 self.SECRET_KEY = os.getenv('SECRET_KEY', 'dev-secret-key') # 数据库配置 - 根据环境选择 self._load_database_config() # 生活系统配置 self.LIFE_SYSTEM_ENABLED = os.getenv('LIFE_SYSTEM_ENABLED', 'true').lower() == 'true' self.LIFE_SCHEDULE = { "wake_up": os.getenv('WAKE_UP', '08:00'), "breakfast": os.getenv('BREAKFAST', '08:30'), "lunch": os.getenv('LUNCH', '12:30'), "dinner": os.getenv('DINNER', '19:00'), "sleep": os.getenv('SLEEP', '23:00') } # 确保目录存在 self._ensure_dirs() # 打印关键配置 self.log_config() def _load_server_config(self): """根据环境加载服务器配置""" if self.ENV == 'production': self.HOST = os.getenv('PROD_HOST', os.getenv('HOST', '0.0.0.0')) self.PORT = int(os.getenv('PROD_PORT', os.getenv('FLASK_PORT', 8000))) self.LOG_LEVEL = os.getenv('PROD_LOG_LEVEL', 'INFO') elif self.ENV == 'testing': self.HOST = os.getenv('TEST_HOST', '127.0.0.1') self.PORT = int(os.getenv('TEST_PORT', 5001)) self.LOG_LEVEL = os.getenv('TEST_LOG_LEVEL', 'DEBUG') else: # development self.HOST = os.getenv('HOST', '0.0.0.0') self.PORT = int(os.getenv('FLASK_PORT', 8000)) self.LOG_LEVEL = os.getenv('LOG_LEVEL', 'INFO') # GradIO 端口(所有环境) self.GRADIO_PORT = int(os.getenv('GRADIO_PORT', 7860)) def _load_database_config(self): """根据环境加载数据库配置""" if self.ENV == 'production': self.DB_HOST = os.getenv('DB_HOST', 'localhost') self.DB_USER = os.getenv('DB_USER', 'ai_user') self.DB_PASSWORD = os.getenv('DB_PASSWORD', 'secure_password') elif self.ENV == 'testing': self.DB_HOST = os.getenv('TEST_DB_HOST', 'localhost') self.DB_USER = os.getenv('TEST_DB_USER', 'test_ai_user') self.DB_PASSWORD = os.getenv('TEST_DB_PASSWORD', 'test_password') else: # development self.DB_HOST = os.getenv('DB_HOST', 'localhost') self.DB_USER = os.getenv('DB_USER', 'dev_ai_user') self.DB_PASSWORD = os.getenv('DB_PASSWORD', 'dev_password') def _get_path(self, env_var, default_dir): """获取路径配置,优先使用环境变量""" env_path = os.getenv(env_var) if env_path: path = Path(env_path) if not path.is_absolute(): path = self.WORKSPACE_ROOT / path self.logger.info(f"📁 {env_var}: {path}") return path return self.WORKSPACE_ROOT / default_dir def _ensure_dirs(self): """确保所需目录存在""" required_dirs = [ self.LOG_DIR, self.MODEL_CACHE_DIR, self.AGENT_PATH, self.WEB_UI_PATH, self.CONFIG_DIR, self.CORE_DIR, self.COGNITIVE_ARCH_DIR ] for path in required_dirs: try: path.mkdir(parents=True, exist_ok=True) self.logger.debug(f"✅ 确保目录存在: {path}") except Exception as e: self.logger.error(f"❌ 创建目录失败 {path}: {str(e)}") def log_config(self): """记录关键配置信息""" self.logger.info("=" * 60) self.logger.info(f"🏠 工作区根目录: {self.WORKSPACE_ROOT}") self.logger.info(f"🌿 环境: {self.ENV}") self.logger.info(f"🌐 主机: {self.HOST}:{self.PORT}") self.logger.info(f"📡 GradIO 端口: {self.GRADIO_PORT}") self.logger.info(f"📝 日志级别: {self.LOG_LEVEL}") self.logger.info(f"💾 模型缓存: {self.MODEL_CACHE_DIR}") self.logger.info(f"🤖 默认模型: {self.DEFAULT_MODEL}") self.logger.info(f"🎮 使用GPU: {self.USE_GPU}") self.logger.info(f"🔑 安全密钥: {'*****' if self.SECRET_KEY != 'dev-secret-key' else self.SECRET_KEY}") self.logger.info(f"⏰ 生活系统: {'启用' if self.LIFE_SYSTEM_ENABLED else '禁用'}") self.logger.info(f"🗄️ 数据库: {self.DB_USER}@{self.DB_HOST}") self.logger.info("=" * 60) def get_paths(self): """返回所有路径配置""" return { "workspace_root": self.WORKSPACE_ROOT, "agent_path": self.AGENT_PATH, "web_ui_path": self.WEB_UI_PATH, "model_cache_dir": self.MODEL_CACHE_DIR, "log_dir": self.LOG_DIR, "config_dir": self.CONFIG_DIR, "core_dir": self.CORE_DIR, "cognitive_arch_dir": self.COGNITIVE_ARCH_DIR } # 全局配置实例 config = ConfigLoader() # 测试配置 if __name__ == '__main__': logging.basicConfig(level=logging.INFO) logger = logging.getLogger('ConfigTest') logger.info("测试配置加载...") logger.info(f"工作区根目录: {config.WORKSPACE_ROOT}") logger.info(f"模型缓存目录: {config.MODEL_CACHE_DIR}") logger.info(f"服务器端口: {config.PORT}") logger.info(f"数据库用户: {config.DB_USER}") logger.info(f"路径配置: {config.get_paths()}") 请把改好的完整版发给我辛苦啦
最新发布
08-10
我原来的# config/config_loader.py import os import sys from dotenv import load_dotenv from pathlib import Path class ConfigLoader: _instance = None def __new__(cls): if cls._instance is None: cls._instance = super(ConfigLoader, cls).__new__(cls) cls._instance._load_config() return cls._instance def _load_config(self): """加载并解析环境变量""" # 优先使用环境变量指定的根目录 workspace_root = os.getenv('WORKSPACE_ROOT') # 如果没有环境变量,使用当前文件位置推断 if not workspace_root: # 获取当前文件所在目录的父目录(即项目根目录) base_path = Path(__file__).resolve().parent.parent # 检查是否是预期的工作区 if "AI_System" in str(base_path) and Path("E:/AI_Workspace").exists(): base_path = Path("E:/AI_Workspace") workspace_root = base_path self.WORKSPACE_ROOT = Path(workspace_root) print(f"✅ 工作区根目录设置为: {self.WORKSPACE_ROOT}") # 加载.env文件 env_path = self.WORKSPACE_ROOT / '.env' if env_path.exists(): load_dotenv(env_path) print(f"✅ 已加载环境文件: {env_path}") else: print(f"⚠️ 未找到环境文件: {env_path}") # 基础配置 self.PROJECT_ROOT = self.WORKSPACE_ROOT self.ENV = os.getenv('FLASK_ENV', 'development') # 路径配置 - 使用WORKSPACE_ROOT作为基准 self.AGENT_PATH = self.WORKSPACE_ROOT / 'agent' self.WEB_UI_PATH = self.WORKSPACE_ROOT / 'web_ui' self.MODEL_CACHE_DIR = self.WORKSPACE_ROOT / 'model_cache' self.LOG_DIR = self.WORKSPACE_ROOT / 'logs' # 服务器配置 self.HOST = os.getenv('HOST', '127.0.0.1') self.PORT = int(os.getenv('PORT', 8000)) self.SECRET_KEY = os.getenv('SECRET_KEY', 'dev-secret-key') self.LOG_LEVEL = os.getenv('LOG_LEVEL', 'INFO') # 模型配置 self.USE_GPU = os.getenv('USE_GPU', 'false').lower() == 'true' self.DEFAULT_MODEL = os.getenv('DEFAULT_MODEL', 'minimal-model') # 确保目录存在 self._ensure_dirs() # 打印关键配置 print("=" * 50) print(f"工作区: {self.WORKSPACE_ROOT}") print(f"环境: {self.ENV}") print(f"主机: {self.HOST}:{self.PORT}") print(f"日志级别: {self.LOG_LEVEL}") print(f"模型缓存: {self.MODEL_CACHE_DIR}") print("=" * 50) def _ensure_dirs(self): """确保所需目录存在""" for path in [self.LOG_DIR, self.MODEL_CACHE_DIR]: path.mkdir(parents=True, exist_ok=True) print(f"确保目录存在: {path}") # 全局配置实例 config = ConfigLoader() 你看看怎么改,改好了 发我完整版
08-10
# config/config_loader.py import os from dotenv import load_dotenv from pathlib import Path class ConfigLoader: _instance = None def __new__(cls): if cls._instance is None: cls._instance = super(ConfigLoader, cls).__new__(cls) cls._instance._load_config() return cls._instance def _load_config(self): """加载并解析环境变量""" # 加载.env文件 env_path = Path(__file__).parent.parent / '.env' load_dotenv(env_path) # 基础配置 self.PROJECT_ROOT = Path(__file__).parent.parent self.ENV = os.getenv('FLASK_ENV', 'production') # 路径配置 self.AGENT_PATH = Path(os.getenv('AGENT_PATH', self.PROJECT_ROOT / 'agent')) self.WEB_UI_PATH = Path(os.getenv('WEB_UI_PATH', self.PROJECT_ROOT / 'web_ui')) self.MODEL_CACHE_DIR = Path(os.getenv('MODEL_CACHE_DIR', self.PROJECT_ROOT / 'model_cache')) self.LOG_DIR = Path(os.getenv('LOG_DIR', self.PROJECT_ROOT / 'logs')) # 根据环境选择配置 if self.ENV == 'production': self.HOST = os.getenv('PROD_HOST', '0.0.0.0') self.PORT = int(os.getenv('PROD_PORT', 8000)) self.LOG_LEVEL = os.getenv('PROD_LOG_LEVEL', 'INFO') self.DB_URI = f"mysql://{os.getenv('DB_USER')}:{os.getenv('DB_PASSWORD')}@{os.getenv('DB_HOST')}/prod_db" elif self.ENV == 'test': self.HOST = os.getenv('TEST_HOST', '127.0.0.1') self.PORT = int(os.getenv('TEST_PORT', 5001)) self.LOG_LEVEL = os.getenv('TEST_LOG_LEVEL', 'DEBUG') self.DB_URI = f"sqlite:///{self.PROJECT_ROOT}/test_db.sqlite" else: # development self.HOST = os.getenv('HOST', '127.0.0.1') self.PORT = int(os.getenv('FLASK_PORT', 5000)) self.LOG_LEVEL = os.getenv('LOG_LEVEL', 'DEBUG') self.DB_URI = f"sqlite:///{self.PROJECT_ROOT}/dev_db.sqlite" # 模型配置 self.USE_GPU = os.getenv('USE_GPU', 'false').lower() == 'true' self.DEFAULT_MODEL = os.getenv('DEFAULT_MODEL', 'minimal-model') # 安全配置 self.SECRET_KEY = os.getenv('SECRET_KEY', 'dev-secret-key') # 确保目录存在 self._ensure_dirs() def _ensure_dirs(self): """确保所需目录存在""" self.LOG_DIR.mkdir(parents=True, exist_ok=True) self.MODEL_CACHE_DIR.mkdir(parents=True, exist_ok=True) # 全局配置实例 config = ConfigLoader 还有一个问题 我的E:\AI_Workspace 是工作区域,但是我看老是有E:\AI_System\AI_Workspace这里建的空文件夹,我不懂到底是怎么了?
08-10
我们将在飞牛NAS上部署一个Docker容器,该容器运行一个WebSocket服务器,要求:1.可以不用密钥验证功能2.接收数据并存储到SQLite数据库3.提供API接口用于查询实时数据、历史数据4.支持根据指定Tag生成历史曲线图##解决方案###1.项目结构创建项目目录ws-server,结构如下:ws-server/├──Dockerfile├──requirements.txt├──app/│├──main.py#主程序,包含WebSocket和API服务│├──auth.py#密钥验证│├──database.py#数据库操作│└──plotter.py#绘图功能###2.代码实现####2.1密钥验证(auth.py)pythonfromfastapiimportHTTPException,HeaderSECRET_KEY="your_secure_key_123"#实际部署时使用环境变量asyncdefverify_token(authorization:str=Header(None)):ifauthorizationisNoneorauthorization!=f"Bearer{SECRET_KEY}":raiseHTTPException(status_code=403,detail="Invalidauthenticationtoken")####2.2数据库操作(database.py)pythonimportsqlite3importosDB_PATH=os.getenv('DB_PATH','sensor_data.db')definit_db():conn=sqlite3.connect(DB_PATH)c=conn.cursor()c.execute('''CREATETABLEIFNOTEXISTSsensor_data(idINTEGERPRIMARYKEYAUTOINCREMENT,timestampDATETIMEDEFAULTCURRENT_TIMESTAMP,tag_idINTEGER,tag_nameTEXT,valueREAL,data_timeTEXT)''')conn.commit()conn.close()definsert_data(tag_id:int,tag_name:str,value:float,data_time:str):conn=sqlite3.connect(DB_PATH)c=conn.cursor()c.execute("INSERTINTOsensor_data(tag_id,tag_name,value,data_time)VALUES(?,?,?,?)",(tag_id,tag_name,value,data_time))conn.commit()conn.close()defget_latest_data(tag_id:int,limit:int=1):conn=sqlite3.connect(DB_PATH)c=conn.cursor()c.execute("SELECT*FROMsensor_dataWHEREtag_id=?ORDERBYtimestampDESCLIMIT?",(tag_id,limit))result=c.fetchall()conn.close()returnresultdefget_historical_data(tag_id:int,hours:int=24):conn=sqlite3.connect(DB_PATH)c=conn.cursor()#获取最近hours小时的数据c.execute("SELECT*FROMsensor_dataWHEREtag_id=?ANDtimestamp>=datetime('now',?)ORDERBYtimestamp",(tag_id,f'-{hours}hours'))result=c.fetchall()conn.close()returnresult####2.3绘图功能(plotter.py)pythonimportmatplotlib.pyplotaspltimportnumpyasnpfromdatetimeimportdatetimeimportosfrom.databaseimportget_historical_dataPLOT_DIR='plots'defgenerate_plot(tag_id:int,hours:int=24):#确保绘图目录存在ifnotos.path.exists(PLOT_DIR):os.makedirs(PLOT_DIR)#获取数据data=get_historical_data(tag_id,hours)ifnotdata:returnNonetimestamps=[row[1]forrowindata]#时间戳values=[row[4]forrowindata]##将时间字符串转换为datetime对象timestamps=[datetime.strptime(ts,'%Y-%m-%d%H:%M:%S')fortsintimestamps]plt.figure(figsize=(10,6))plt.plot(timestamps,values,'b-')plt.title(f'TagID:{tag_id}-Last{hours}Hours')plt.xlabel('Time')plt.ylabel('Value')plt.grid(True)plt.xticks(rotation=45)plt.tight_layout()#保存图像plot_path=os.path.join(PLOT_DIR,f'tag_{tag_id}_{hours}h.png')plt.savefig(plot_path)plt.close()returnplot_path####2.4主程序(main.py)pythonimportasyncioimportwebsocketsimportjsonimportosfromfastapiimportFastAPI,APIRouter,Depends,HTTPExceptionfromfastapi.responsesimportFileResponsefrom.importauth,database,plotterapp=FastAPI()api_router=APIRouter()#初始化数据库database.init_db()#WebSocket服务器asyncdefsensor_server(websocket,path):try:#第一步:接收密钥进行验证token=awaitwebsocket.recv()iftoken!=auth.SECRET_KEY:awaitwebsocket.close(code=1008,reason="Authenticationfailed")return#第二步:接收数据asyncformessageinwebsocket:try:data=json.loads(message)#数据格式:{"TagId":1,"TagName":"1#注浆A液压力","Value":0.76,"DataTime":"2025-6-182:28"}database.insert_data(tag_id=data['TagId'],tag_name=data['TagName'],value=data['Value'],data_time=data['DataTime'])print(f"Inserteddatafortag{data['TagId']}")exceptExceptionase:print(f"Errorprocessingmessage:{e}")exceptwebsockets.exceptions.ConnectionClosedase:print(f"Clientdisconnected:{e}")#API路由@api_router.get("/data/latest/{tag_id}")asyncdefget_latest_data(tag_id:int,_:str=Depends(auth.verify_token)):data=database.get_latest_data(tag_id)ifnotdata:raiseHTTPException(status_code=404,detail="Datanotfound")returndata[0]#返回最新一条@api_router.get("/data/history/{tag_id}")asyncdefget_history_data(tag_id:int,hours:int=24,_:str=Depends(auth.verify_token)):data=database.get_historical_data(tag_id,hours)ifnotdata:raiseHTTPException(status_code=404,detail="Datanotfound")returndata@api_router.get("/plot/{tag_id}")asyncdefget_plot(tag_id:int,hours:int=24,_:str=Depends(auth.verify_token)):plot_path=plotter.generate_plot(tag_id,hours)ifplot_pathisNone:raiseHTTPException(status_code=404,detail="Nodataavailableforplotting")returnFileResponse(plot_path)app.include_router(api_router,prefix="/api")#启动WebSocket服务器和FastAPI服务asyncdefstart_servers():#启动WebSocket服务器ws_server=awaitwebsockets.serve(sensor_server,"0.0.0.0",8765)print("WebSocketserverstartedonport8765")#注意:FastAPI服务需要单独启动,这里我们使用uvicorn,在Dockerfile中启动if__name__=="__main__":asyncio.run(start_servers())###3.Docker配置####3.1Dockerfile````dockerfileFROMpython:3.9-slimWORKDIR/app#安装依赖RUNapt-getupdate&&apt-getinstall-ylibsqlite3-devCOPYrequirements.txt.RUNpipinstall--no-cache-dir-rrequirements.txtCOPY..#设置环境变量(密钥通过环境变量传入)ENVSECRET_KEY=your_actual_key_here#启动命令:同时启动WebSocket服务器和FastAPI服务CMD["sh","-c","uvicornapp.main:app--host0.0.0.0--port8000&python-mapp.main"]```####3.2requirements.txt````fastapiuvicornwebsocketssqlalchemymatplotlibpython-multipart###4.在飞牛NAS上部署1.**构建镜像**:将整个`ws-server`目录上传到飞牛NAS,然后进入该目录执行:bashdockerbuild-tws-sensor-server.2.**运行容器**:bashdockerrun-d--namesensor-server-p8765:8765#WebSocket端口-p8000:8000#API端口-v/path/on/nas/data:/app/data#挂载数据库和绘图目录-eSECRET_KEY=“your_actual_key_here”\ws-sensor-server3.**飞牛NAS图形界面操作**:-打开飞牛NAS的Docker管理界面-选择“镜像”并导入构建好的`ws-sensor-server`镜像-创建容器,配置端口映射:8765和8000-设置环境变量:`SECRET_KEY=your_actual_key_here`-挂载数据卷:将NAS上的目录挂载到容器内的`/app/data`-启动容器###5.功能测试####5.1WebSocket数据发送pythonimportasyncioimportwebsocketsimportjsonasyncdefsend_data():asyncwithwebsockets.connect(‘ws://your_nas_ip:8765’)asws:#先发送密钥awaitws.send(“your_actual_key_here”)#发送数据data={“TagId”:1,“TagName”:“1#注浆A液压力”,“Value”:0.76,“DataTime”:“2025-06-1802:28:00”}awaitws.send(json.dumps(data))print(“Datasent”)asyncio.run(send_data())```####5.2API接口调用-获取最新数据:`GEThttp://your_nas_ip:8000/api/data/latest/1`需在Header中添加:`Authorization:Beareryour_actual_key_here`-获取历史数据:`GEThttp://your_nas_ip:8000/api/data/history/1?hours=24`-获取曲线图:`GEThttp://your_nas_ip:8000/api/plot/1?hours=72`###6.注意事项1.密钥管理:在实际部署中,应通过环境变量设置密钥,避免硬编码。2.数据持久化:通过挂载卷将数据库文件和绘图目录保存在NAS上,避免容器重启数据丢失。3.性能优化:对于高频数据,考虑使用批量插入和数据库索引优化。4.安全性:建议在生产环境中使用HTTPS加密API和WebSocket通信(可通过Nginx反向代理实现)。§§相关问题§§1.如何为SQLite数据库添加索引以提高查询性能?2.如何在Docker容器中安全地管理密钥?3.如何通过Nginx为WebSocket和API服务添加HTTPS加密?4.如何扩展此系统以支持多客户端并发连接?5.如何实现数据存储的分区或分表以优化大量历史数据的查询?
06-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值