文本编码管理encoding_manager

该文件定义了文本编码管理的实现,包括注册编码操作、显示支持的编码方式、选择文件编码以及添加和删除字体操作方法。通过链表结构管理各种编码方式,并提供了初始化函数。

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

此文件把支持文本编码加入链表,和显示文件编码的所支持的方式,为文本选择适当的编码方式比如UTF-8或ansi,unicode,还有对为文本编码方式添加或删除入处理方法,比如freetype或点阵或者GBK等。。。
#include <config.h>
#include <encoding_manager.h>
#include <string.h>
#include <stdlib.h>

static PT_EncodingOpr g_ptEncodingOprHead;//文本存储操作结构 
/**********************************************************************
 * 函数名称: RegisterEncodingOpr
 * 功能描述: 注册"编码模块", 一行文字可能采用ASCII编码,也可能用UTF8等编码.
 *            怎么从一行文字中取出一个字,不同的编码取法不一样,
 *            每一种编码方式都调用RegisterEncodingOpr把相关结构体放入g_ptEncodingOprHead链表
 * 输入参数: ptEncodingOpr - 一个结构体,内含某种编码方式的操作函数
 */
int RegisterEncodingOpr(PT_EncodingOpr ptEncodingOpr)//文本存储操作结构 
{
	PT_EncodingOpr ptTmp;

	if (!g_ptEncodingOprHead)
	{
		g_ptEncodingOprHead   = ptEncodingOpr;
		ptEncodingOpr->ptNext = NULL;
	}
	else
	{
		ptTmp = g_ptEncodingOprHead;
		while (ptTmp->ptNext)
		{
			ptTmp = ptTmp->ptNext;
		}
		ptTmp->ptNext	      = ptEncodingOpr;
		ptEncodingOpr->ptNext = NULL;
	}

	return 0;
}

//显示本程序能支持的"编码方式"

void ShowEncodingOpr(void)
{
	int i = 0;
	PT_EncodingOpr ptTmp = g_ptEncodingOprHead;//文本存储操作结构 

	while (ptTmp)
	{
		printf("%02d %s\n", i++, ptTmp->name);
		ptTmp = ptTmp->ptNext;
	}
}
/*
* 功能描述: 给文件选择一个编码模块
 * 输入参数: pucFileBufHead - 文件头部, 即调用mmap映射文件所得到内存指针
*/
PT_EncodingOpr SelectEncodingOprForFile(unsigned char *pucFileBufHead)
{
	PT_EncodingOpr ptTmp = g_ptEncodingOprHead;//指向全局变量//文本存储操作结构 

	while (ptTmp)//在链表中找出适合文本的编码
	{	
		if (ptTmp->isSupport(pucFileBufHead))
			return ptTmp;//返回支持编码的结构体
		else
			ptTmp = ptTmp->ptNext;
	}
	return NULL;
}
/*
* 功能描述: 要显示一个字符, 涉及三个概念:
 *            1. 字符的编码值, 即这个文件用什么数值来表示, 比如'A'用0x41来表示,
 *               '中'的编码方式有多种, GBK编码方式里它的数值为0xD0D6, 而在UNICODE
 *               编码里它的数值为0x4E2D
 *            2. 编码值的表示方式, 比如UTF8/UTF16LE/UTF16BE是UNICODE编码的三种表示方式,例如:
 *               'A'的ASCII表示为0x41;UTF16-LE表示为0x41,0x00;UTF16-BE表示为0x00,0x41;UTF8表示为0x41
 *               '中'的GBK表示为0xD6,0xD0;UTF16-LE表示为0x2D,0x4E;UTF16-BE表示为0x4E,0x2D;UTF8表示为0xE4,0xB8,0xAD
 *               注意:UTF8/UTF16LE/UTF16BE只是UNICODE编码的不同表示方式,对于同一个字符,它们表达的编码值是一样的,只是表示方法不同
 *            3. 字符的位图,即字符应该怎么描画
 *            举例: 使用freetype矢量字库来显示UTF8编码格式的文件内容时,
 *                  我们要先取出UTF8的值用来解析出UNICODE值,然后根据UNICODE值去字库文件中取出位图,
 *                  最后在LCD上显示出来
 *            一个文本文件的编码方式是确定的,
 *        比如它要么是ANSI(字母用ASCII,汉字用GBK),要么是UTF8等等; 文件里字符的位图来源可以有多种,
 *        比如ASCII字符可以从确定的数组中获得它的位图, GBK字符可以从"HZK16"这个文件中获得它的位图,
 *        也可以从某个freetype矢量字库中获得它的位图.
 *           AddFontOprForEncoding函数就是给某个编码方式(ptEncodingOpr)提供字符的处理方法(ptFontOpr),
 *        ptFontOpr将被放入"ptEncodingOpr->ptFontOprSupportedHead"链表中
*/
int AddFontOprForEncoding(PT_EncodingOpr ptEncodingOpr, PT_FontOpr ptFontOpr/*编码操作作结构*/)
{
	PT_FontOpr ptFontOprCpy;
	
	if (!ptEncodingOpr || !ptFontOpr)
	{
		return -1;
	}
	else
	{
		ptFontOprCpy = malloc(sizeof(T_FontOpr));
		if (!ptFontOprCpy)
		{
			return -1;
		}
		else
		{
			//ptFontOpr将被放入"ptEncodingOpr->ptFontOprSupportedHead"链表中,往头加的 
			memcpy(ptFontOprCpy, ptFontOpr, sizeof(T_FontOpr));
			ptFontOprCpy->ptNext = ptEncodingOpr->ptFontOprSupportedHead;
			//移动头指针 
			ptEncodingOpr->ptFontOprSupportedHead = ptFontOprCpy;
			return 0;
		}		
	}
}
/* 功能描述: AddFontOprForEncoding的反函数,从PT_EncodingOpr->ptFontOprSupportedHead链表中把某个PT_FontOpr去掉
 * 输入参数: ptEncodingOpr - 编码方式
 *            ptFontOpr     - 字符处理结构体,内含"GetFontBitmap"函数(即根据编码值获得位图)
*/
int DelFontOprFrmEncoding(PT_EncodingOpr ptEncodingOpr, PT_FontOpr ptFontOpr)
{
	PT_FontOpr ptTmp;
	PT_FontOpr ptPre;
		
	if (!ptEncodingOpr || !ptFontOpr)
	{
		return -1;
	}
	else
	{
		ptTmp = ptEncodingOpr->ptFontOprSupportedHead;
		if (strcmp(ptTmp->name, ptFontOpr->name) == 0)
		{
			/* 删除头节点 */
			ptEncodingOpr->ptFontOprSupportedHead = ptTmp->ptNext;
			free(ptTmp);
			return 0;
		}

		ptPre = ptEncodingOpr->ptFontOprSupportedHead;
		ptTmp = ptPre->ptNext;
		while (ptTmp)
		{
			if (strcmp(ptTmp->name, ptFontOpr->name) == 0)
			{
				/* 从链表里取出、释放 */
				ptPre->ptNext = ptTmp->ptNext;
				free(ptTmp);
				return 0;
			}
			else
			{
				ptPre = ptTmp;
				ptTmp = ptTmp->ptNext;
			}
		}

		return -1;
	}
}
//功能描述: 调用各种编码方式的初始化函数
int EncodingInit(void)
{
	int iError;

	iError = AsciiEncodingInit();
	if (iError)
	{
		DBG_PRINTF("AsciiEncodingInit error!\n");
		return -1;
	}

	iError = Utf16leEncodingInit();
	if (iError)
	{
		DBG_PRINTF("Utf16leEncodingInit error!\n");
		return -1;
	}
	
	iError = Utf16beEncodingInit();
	if (iError)
	{
		DBG_PRINTF("Utf16beEncodingInit error!\n");
		return -1;
	}
	
	iError = Utf8EncodingInit();
	if (iError)
	{
		DBG_PRINTF("Utf8EncodingInit error!\n");
		return -1;
	}

	return 0;
}

# E:\AI_System\web_ui\server.py import sys import os import time import logging import json import traceback import threading import platform import psutil import datetime from pathlib import Path from flask import Flask, jsonify, request, render_template from logging.handlers import TimedRotatingFileHandler from flask_socketio import SocketIO, emit # ========== 配置系统 ========== class SystemConfig: def __init__(self): self.BASE_DIR = Path(__file__).resolve().parent.parent self.HOST = '127.0.0.1' self.PORT = 5000 self.LOG_LEVEL = 'INFO' self.SECRET_KEY = 'your_secret_key_here' self.DEBUG = True self.USE_GPU = False self.DEFAULT_MODEL = 'gpt-3.5-turbo' # 目录配置 self.LOG_DIR = self.BASE_DIR / 'logs' self.LOG_DIR.mkdir(parents=True, exist_ok=True) self.CONFIG_DIR = self.BASE_DIR / 'config' self.CONFIG_DIR.mkdir(parents=True, exist_ok=True) self.AGENT_PATH = self.BASE_DIR / 'agent' self.MODEL_CACHE_DIR = self.BASE_DIR / 'model_cache' self.MODEL_CACHE_DIR.mkdir(parents=True, exist_ok=True) def __str__(self): return f"SystemConfig(HOST={self.HOST}, PORT={self.PORT})" config = SystemConfig() # ========== 全局协调器 ========== coordinator = None def register_coordinator(coord): """注册意识系统协调器""" global coordinator coordinator = coord if coordinator and hasattr(coordinator, 'connect_to_ui'): coordinator.connect_to_ui(update_ui) def update_ui(event): """更新UI事件处理""" if 'socketio' in globals(): socketio.emit('system_event', event) # ========== 初始化日志系统 ========== def setup_logger(): """配置全局日志系统""" logger = logging.getLogger('WebServer') logger.setLevel(getattr(logging, config.LOG_LEVEL.upper(), logging.INFO)) # 日志格式 log_formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) # 文件日志处理器 (每天轮换,保留30天) file_handler = TimedRotatingFileHandler( config.LOG_DIR / 'web_server.log', when='midnight', backupCount=30, encoding='utf-8' ) file_handler.setFormatter(log_formatter) logger.addHandler(file_handler) # 控制台日志处理器 console_handler = logging.StreamHandler() console_handler.setFormatter(log_formatter) logger.addHandler(console_handler) # 安全日志处理装饰器 def safe_logger(func): def wrapper(*args, **kwargs): try: return func(*args, **kwargs) except UnicodeEncodeError: new_args = [] for arg in args: if isinstance(arg, str): new_args.append(arg.encode('ascii', 'ignore').decode('ascii')) else: new_args.append(arg) return func(*new_args, **kwargs) return wrapper # 应用安全日志处理 for level in ['debug', 'info', 'warning', 'error', 'critical']: setattr(logger, level, safe_logger(getattr(logger, level))) return logger # 初始化日志 logger = setup_logger() # ========== 系统初始化 ========== class SystemInitializer: """负责初始化系统核心组件""" def __init__(self): self.base_dir = Path(__file__).resolve().parent.parent self.ai_core = None self.hardware_manager = None self.life_scheduler = None self.ai_agent = None self.start_time = time.time() self.environment_manager = None def initialize_system_paths(self): """初始化系统路径""" sys.path.insert(0, str(self.base_dir)) logger.info(f"项目根目录: {self.base_dir}") sub_dirs = ['agent', 'core', 'utils', 'config', 'cognitive_arch', 'environment'] for sub_dir in sub_dirs: full_path = self.base_dir / sub_dir if full_path.exists(): sys.path.insert(0, str(full_path)) logger.info(f"添加路径: {full_path}") else: logger.warning(f"目录不存在: {full_path}") def initialize_environment_manager(self): """初始化环境管理器""" try: # 环境管理器模拟实现 class EnvironmentManager: def __init__(self, config): self.config = config self.state = { 'temperature': 22.5, 'humidity': 45.0, 'light_level': 75, 'objects': [], 'last_updated': datetime.datetime.now().isoformat() } def start(self): logger.info("环境管理器已启动") def get_state(self): # 更新模拟数据 self.state['temperature'] = 20 + 5 * (time.time() % 10) / 10 self.state['humidity'] = 40 + 10 * (time.time() % 10) / 10 self.state['light_level'] = 70 + 10 * (time.time() % 10) / 10 self.state['last_updated'] = datetime.datetime.now().isoformat() return self.state def execute_action(self, action, params): logger.info(f"执行环境动作: {action} 参数: {params}") if action == "adjust_temperature": self.state['temperature'] = params.get('value', 22.0) return True elif action == "adjust_light": self.state['light_level'] = params.get('level', 70) return True return False env_config = {'update_interval': 1.0, 'spatial': {'grid_size': 1.0}} self.environment_manager = EnvironmentManager(env_config) self.environment_manager.start() logger.info("✅ 环境管理器初始化成功") return self.environment_manager except Exception as e: logger.error(f"❌ 环境管理器初始化失败: {str(e)}") logger.warning("⚠️ 环境交互功能将不可用") return None def initialize_ai_core(self): """初始化AI核心系统""" class AICore: def __init__(self, base_dir): self.base_dir = Path(base_dir) self.genetic_code = self.load_genetic_code() self.physical_state = { "health": 100, "energy": 100, "mood": "calm" } self.dependencies = self.scan_dependencies() def load_genetic_code(self): code_path = self.base_dir / "core" / "genetic_code.py" try: if not code_path.exists(): # 创建默认遗传代码文件 default_code = """# 默认遗传代码 class AICore: def __init__(self): self.version = "1.0.0" self.capabilities = ["learning", "reasoning", "problem_solving"] def evolve(self): print("系统正在进化...") """ with open(code_path, "w", encoding="utf-8") as f: f.write(default_code) with open(code_path, "r", encoding="utf-8") as f: return f.read() except Exception as e: logger.error(f"加载遗传代码失败: {str(e)}") return "# 默认遗传代码\nclass AICore:\n pass" def scan_dependencies(self): return { "nervous_system": "flask", "memory": "sqlite", "perception": "opencv", "reasoning": "transformers" } def mutate(self, new_code): try: code_path = self.base_dir / "core" / "genetic_code.py" with open(code_path, "w", encoding="utf-8") as f: f.write(new_code) return True, "核心代码更新成功,系统已进化" except Exception as e: return False, f"进化失败: {str(e)}" def wear_dependency(self, dependency_name, version): self.dependencies[dependency_name] = version return f"已穿戴 {dependency_name}@{version}" def get_state(self): return { "genetic_code_hash": hash(self.genetic_code), "dependencies": self.dependencies, "physical_state": self.physical_state, "hardware_environment": self.get_hardware_info() } def get_hardware_info(self): return { "cpu": platform.processor(), "cpu_cores": psutil.cpu_count(logical=False), "cpu_threads": psutil.cpu_count(logical=True), "memory_gb": round(psutil.virtual_memory().total / (1024 ** 3), 1), "storage_gb": round(psutil.disk_usage('/').total / (1024 ** 3), 1), "os": f"{platform.system()} {platform.release()}" } self.ai_core = AICore(self.base_dir) logger.info("✅ AI核心系统初始化完成") return self.ai_core def initialize_hardware_manager(self): """初始化硬件管理器""" try: # 硬件管理器模拟实现 class HardwareManager: def __init__(self): self.available_hardware = { "cpu": ["Intel i9-13900K", "AMD Ryzen 9 7950X", "Apple M2 Max"], "gpu": ["NVIDIA RTX 4090", "AMD Radeon RX 7900 XTX", "Apple M2 GPU"], "memory": [16, 32, 64, 128], "storage": ["1TB SSD", "2TB SSD", "4TB SSD", "8TB HDD"], "peripherals": ["4K Camera", "3D Scanner", "High-Fidelity Microphone"] } self.current_setup = { "cpu": platform.processor(), "gpu": "Integrated Graphics", "memory": round(psutil.virtual_memory().total / (1024 ** 3), 1), "storage": round(psutil.disk_usage('/').total / (1024 ** 3), 1) } def request_hardware(self, hardware_type, specification): if hardware_type not in self.available_hardware: return False, f"不支持硬件类型: {hardware_type}" if specification not in self.available_hardware[hardware_type]: return False, f"不支持的规格: {specification}" self.current_setup[hardware_type] = specification return True, f"已请求 {hardware_type}: {specification}。请管理员完成安装。" def get_current_setup(self): return self.current_setup def get_performance_metrics(self): return { "cpu_usage": psutil.cpu_percent(), "memory_usage": psutil.virtual_memory().percent, "disk_usage": psutil.disk_usage('/').percent, "cpu_temp": 45.0, "gpu_temp": 55.0, "network_io": { "sent": psutil.net_io_counters().bytes_sent, "received": psutil.net_io_counters().bytes_recv }, "last_updated": datetime.datetime.now().isoformat() } self.hardware_manager = HardwareManager() logger.info("✅ 硬件管理器初始化成功") return self.hardware_manager except Exception as e: logger.error(f"❌ 硬件管理器初始化失败: {str(e)}") logger.warning("⚠️ 使用内置简单硬件管理器") return None def initialize_life_scheduler(self): """初始化生活调度器""" try: # 生活调度器模拟实现 class LifeScheduler: def __init__(self): self.daily_schedule = { "wake_up": "07:00", "breakfast": "08:00", "lunch": "12:30", "dinner": "19:00", "sleep": "23:00" } self.current_activity = "awake" self.energy_level = 100 self.mood = "calm" self.activity_log = [] def wake_up(self): self.current_activity = "awake" self.log_activity("醒来") def have_meal(self, meal_type): self.current_activity = f"eating_{meal_type}" self.energy_level = min(100, self.energy_level + 20) self.log_activity(f"用餐: {meal_type}") def go_to_sleep(self): self.current_activity = "sleeping" self.log_activity("睡觉") def log_activity(self, activity): timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") self.activity_log.append(f"{timestamp} - {activity}") # 保留最近的100条记录 if len(self.activity_log) > 100: self.activity_log.pop(0) def adjust_schedule(self, adjustments): for activity, new_time in adjustments.items(): if activity in self.daily_schedule: self.daily_schedule[activity] = new_time def get_current_state(self): return { "current_activity": self.current_activity, "next_scheduled": self._get_next_scheduled(), "energy_level": self.energy_level, "mood": self.mood } def get_recent_activities(self, count=10): return self.activity_log[-count:] def _get_next_scheduled(self): now = datetime.datetime.now() current_time = now.strftime("%H:%M") # 找到下一个计划活动 schedule_times = sorted( [(k, v) for k, v in self.daily_schedule.items()], key=lambda x: x[1] ) for activity, time_str in schedule_times: if time_str > current_time: return f"{activity} at {time_str}" # 如果没有找到,返回第二天的第一个活动 return f"{schedule_times[0][0]} at {schedule_times[0][1]} tomorrow" self.life_scheduler = LifeScheduler() logger.info("✅ 生活调度器初始化成功") # 启动生活系统后台线程 life_thread = threading.Thread( target=self._update_life_status, daemon=True, name="LifeSystemThread" ) life_thread.start() logger.info("✅ 生活系统后台线程已启动") return self.life_scheduler except Exception as e: logger.error(f"❌ 生活调度器初始化失败: {str(e)}") return None def _update_life_status(self): logger.info("🚦 生活系统后台线程启动") while True: try: now = datetime.datetime.now() current_hour = now.hour current_minute = now.minute current_time = f"{current_hour:02d}:{current_minute:02d}" # 根据时间更新活动状态 if 7 <= current_hour < 8 and self.life_scheduler.current_activity != "awake": self.life_scheduler.wake_up() elif 12 <= current_hour < 13 and self.life_scheduler.current_activity != "eating_lunch": self.life_scheduler.have_meal("lunch") elif 19 <= current_hour < 20 and self.life_scheduler.current_activity != "eating_dinner": self.life_scheduler.have_meal("dinner") elif (23 <= current_hour or current_hour < 6) and self.life_scheduler.current_activity != "sleeping": self.life_scheduler.go_to_sleep() # 自然能量消耗 if self.life_scheduler.current_activity != "sleeping": self.life_scheduler.energy_level = max(0, self.life_scheduler.energy_level - 0.1) time.sleep(60) except Exception as e: logger.error(f"生活系统更新失败: {str(e)}", exc_info=True) time.sleep(300) def initialize_ai_agent(self): """初始化AI智能体""" try: # AI智能体模拟实现 class AutonomousAgent: def __init__(self, model_path, cache_dir, use_gpu, default_model): self.model_name = default_model self.cache_dir = cache_dir self.use_gpu = use_gpu self.conversation_history = {} def process_input(self, user_input, user_id): # 初始化用户对话历史 if user_id not in self.conversation_history: self.conversation_history[user_id] = [] # 添加用户输入到历史 self.conversation_history[user_id].append({"role": "user", "content": user_input}) # 生成AI响应(模拟) if "你好" in user_input or "hello" in user_input: response = "你好!我是AI助手,有什么可以帮您的吗?" elif "时间" in user_input: response = f"现在是 {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}" elif "状态" in user_input: response = "系统运行正常,所有组件都在线。" else: response = f"我已收到您的消息: '{user_input}'。这是一个模拟响应,实际系统中我会分析您的问题并提供专业解答。" # 添加AI响应到历史 self.conversation_history[user_id].append({"role": "assistant", "content": response}) return response def get_status(self): return { "model": self.model_name, "cache_dir": str(self.cache_dir), "use_gpu": self.use_gpu, "active_conversations": len(self.conversation_history) } self.ai_agent = AutonomousAgent( model_path=config.AGENT_PATH, cache_dir=config.MODEL_CACHE_DIR, use_gpu=config.USE_GPU, default_model=config.DEFAULT_MODEL ) logger.info("✅ AI智能体初始化成功") return self.ai_agent except Exception as e: logger.error(f"❌ AI智能体初始化失败: {str(e)}") return None def start_evolution_monitor(self): def monitor(): while True: try: cpu_usage = psutil.cpu_percent() mem_usage = psutil.virtual_memory().percent # 根据系统负载调整AI状态 if cpu_usage > 80: self.ai_core.physical_state["energy"] = max(20, self.ai_core.physical_state["energy"] - 5) self.ai_core.physical_state["mood"] = "strained" elif cpu_usage < 30: self.ai_core.physical_state["energy"] = min(100, self.ai_core.physical_state["energy"] + 2) time.sleep(60) except Exception as e: logging.error(f"进化监控错误: {str(e)}") time.sleep(300) monitor_thread = threading.Thread(target=monitor, daemon=True) monitor_thread.start() logger.info("✅ 进化监控线程已启动") def initialize_all(self): logger.info("=" * 50) logger.info("🚀 开始初始化AI系统") logger.info("=" * 50) self.initialize_system_paths() self.initialize_ai_core() self.initialize_hardware_manager() self.initialize_life_scheduler() self.initialize_ai_agent() self.initialize_environment_manager() self.start_evolution_monitor() logger.info("✅ 所有系统组件初始化完成") return { "ai_core": self.ai_core, "hardware_manager": self.hardware_manager, "life_scheduler": self.life_scheduler, "ai_agent": self.ai_agent, "environment_manager": self.environment_manager } # ========== Flask应用工厂 ========== def create_app(): app = Flask( __name__, template_folder='templates', static_folder='static', static_url_path='/static' ) app.secret_key = config.SECRET_KEY system_initializer = SystemInitializer() components = system_initializer.initialize_all() app.config['SYSTEM_COMPONENTS'] = components app.config['START_TIME'] = system_initializer.start_time app.config['BASE_DIR'] = system_initializer.base_dir # 初始化SocketIO socketio = SocketIO(app, cors_allowed_origins="*", async_mode='threading') app.config['SOCKETIO'] = socketio # 注册路由 register_routes(app) register_error_handlers(app) return app, socketio # ========== 环境交互路由 ========== def register_environment_routes(app): @app.route('/environment') def environment_view(): return render_template('environment_view.html') @app.route('/api/environment/state', methods=['GET']) def get_environment_state(): env_manager = app.config['SYSTEM_COMPONENTS'].get('environment_manager') if not env_manager: return jsonify({"success": False, "error": "环境管理器未初始化"}), 503 try: state = env_manager.get_state() return jsonify(state) except Exception as e: app.logger.error(f"获取环境状态失败: {traceback.format_exc()}") return jsonify({"success": False, "error": str(e)}), 500 @app.route('/api/environment/action', methods=['POST']) def execute_environment_action(): env_manager = app.config['SYSTEM_COMPONENTS'].get('environment_manager') if not env_manager: return jsonify({"success": False, "error": "环境管理器未初始化"}), 503 try: data = request.json action = data.get('action') params = data.get('params', {}) if not action: return jsonify({"success": False, "error": "缺少动作参数"}), 400 success = env_manager.execute_action(action, params) return jsonify({"success": success, "action": action}) except Exception as e: app.logger.error(f"执行环境动作失败: {traceback.format_exc()}") return jsonify({"success": False, "error": str(e)}), 500 # ========== 环境状态广播 ========== def setup_environment_broadcast(app): socketio = app.config['SOCKETIO'] @socketio.on('connect', namespace='/environment') def handle_environment_connect(): app.logger.info('客户端已连接环境WebSocket') @socketio.on('disconnect', namespace='/environment') def handle_environment_disconnect(): app.logger.info('客户端已断开环境WebSocket') def broadcast_environment_state(): env_manager = app.config['SYSTEM_COMPONENTS'].get('environment_manager') if not env_manager: return while True: try: state = env_manager.get_state() socketio.emit('environment_update', state, namespace='/environment') time.sleep(1) except Exception as e: app.logger.error(f"环境状态广播失败: {str(e)}") time.sleep(5) broadcast_thread = threading.Thread( target=broadcast_environment_state, daemon=True, name="EnvironmentBroadcastThread" ) broadcast_thread.start() app.logger.info("✅ 环境状态广播线程已启动") # ========== 路由注册 ========== def register_routes(app): register_environment_routes(app) setup_environment_broadcast(app) @app.route('/') def index(): return render_template('agent_interface.html') @app.route('/status') def status(): try: components = app.config['SYSTEM_COMPONENTS'] status_data = { "server": { "status": "running", "uptime": time.time() - app.config['START_TIME'], "version": "1.0.0", "config": { "host": config.HOST, "port": config.PORT, "log_level": config.LOG_LEVEL, "default_model": config.DEFAULT_MODEL } }, "core": components['ai_core'].get_state(), "hardware": components['hardware_manager'].get_current_setup() } if components['environment_manager']: try: status_data["environment"] = components['environment_manager'].get_state() except Exception as e: status_data["environment"] = {"error": str(e)} if components['life_scheduler']: try: status_data["life_system"] = components['life_scheduler'].get_current_state() except Exception as e: status_data["life_system"] = {"error": str(e)} if components['ai_agent']: try: status_data["agent"] = components['ai_agent'].get_status() except Exception as e: status_data["agent"] = {"error": str(e)} return jsonify(status_data) except Exception as e: app.logger.error(f"获取状态失败: {traceback.format_exc()}") return jsonify({"error": "内部错误", "details": str(e)}), 500 # 核心系统路由 @app.route('/api/core/state') def get_core_state(): return jsonify(app.config['SYSTEM_COMPONENTS']['ai_core'].get_state()) @app.route('/api/core/mutate', methods=['POST']) def mutate_core(): data = request.get_json() new_code = data.get('genetic_code') if not new_code: return jsonify({"success": False, "error": "缺少遗传代码"}), 400 success, message = app.config['SYSTEM_COMPONENTS']['ai_core'].mutate(new_code) return jsonify({"success": success, "message": message}) @app.route('/api/core/wear', methods=['POST']) def wear_dependency(): data = request.get_json() dep_name = data.get('dependency') version = data.get('version', 'latest') if not dep_name: return jsonify({"success": False, "error": "缺少依赖名称"}), 400 result = app.config['SYSTEM_COMPONENTS']['ai_core'].wear_dependency(dep_name, version) return jsonify({"success": True, "message": result}) # 硬件管理路由 @app.route('/api/hardware/catalog') def get_hardware_catalog(): return jsonify(app.config['SYSTEM_COMPONENTS']['hardware_manager'].available_hardware) @app.route('/api/hardware/request', methods=['POST']) def request_hardware(): data = request.get_json() hw_type = data.get('type') spec = data.get('specification') if not hw_type or not spec: return jsonify({"success": False, "error": "缺少硬件类型或规格"}), 400 success, message = app.config['SYSTEM_COMPONENTS']['hardware_manager'].request_hardware(hw_type, spec) return jsonify({"success": success, "message": message}) @app.route('/api/hardware/current') def get_current_hardware(): return jsonify(app.config['SYSTEM_COMPONENTS']['hardware_manager'].get_current_setup()) # 生活系统路由 @app.route('/life') def life_dashboard(): return render_template('life_dashboard.html') @app.route('/api/life/status') def get_life_status(): components = app.config['SYSTEM_COMPONENTS'] if not components['life_scheduler']: return jsonify({"success": False, "error": "生活系统未初始化"}), 503 try: current_state = components['life_scheduler'].get_current_state() recent_activities = components['life_scheduler'].get_recent_activities(10) return jsonify({ "success": True, "current_activity": current_state.get("current_activity", "未知"), "next_scheduled": current_state.get("next_scheduled", "未知"), "recent_activities": recent_activities, "energy_level": current_state.get("energy_level", 100), "mood": current_state.get("mood", "平静") }) except Exception as e: app.logger.error(f"获取生活状态失败: {traceback.format_exc()}") return jsonify({"success": False, "error": str(e)}), 500 @app.route('/adjust_schedule', methods=['POST']) def adjust_schedule(): components = app.config['SYSTEM_COMPONENTS'] if not components['life_scheduler']: return jsonify({"success": False, "error": "生活系统未初始化"}), 503 try: data = request.json adjustments = data.get("adjustments", {}) valid_activities = ["wake_up", "breakfast", "lunch", "dinner", "sleep"] for activity, new_time in adjustments.items(): if activity not in valid_activities: return jsonify({"success": False, "error": f"无效的活动类型: {activity}"}), 400 if not isinstance(new_time, str) or len(new_time) != 5 or new_time[2] != ':': return jsonify({"success": False, "error": f"无效的时间格式: {new_time}"}), 400 components['life_scheduler'].adjust_schedule(adjustments) return jsonify({ "success": True, "message": "计划表已更新", "new_schedule": components['life_scheduler'].daily_schedule }) except Exception as e: app.logger.error(f"调整作息时间失败: {traceback.format_exc()}") return jsonify({"success": False, "error": str(e)}), 400 # 聊天路由 @app.route('/chat', methods=['POST']) def chat(): components = app.config['SYSTEM_COMPONENTS'] if not components['ai_agent']: return jsonify({"error": "Agent未初始化"}), 503 try: data = request.get_json() user_input = data.get('message', '') user_id = data.get('user_id', 'default') if not user_input: return jsonify({"error": "消息内容不能为空"}), 400 app.logger.info(f"聊天请求: 用户={user_id}, 内容长度={len(user_input)}") response = components['ai_agent'].process_input(user_input, user_id) return jsonify({"response": response}) except Exception as e: app.logger.error(f"聊天处理失败: {traceback.format_exc()}") return jsonify({"error": "聊天处理失败", "details": str(e)}), 500 # 家具管理路由 furniture_cache = {} CACHE_DURATION = 3600 # 1小时 @app.route('/api/furniture') def get_furniture(): try: room = request.args.get('room', 'workshop') app.logger.info(f"获取家具数据: 房间={room}") current_time = time.time() if room in furniture_cache and current_time - furniture_cache[room]['timestamp'] < CACHE_DURATION: return jsonify(furniture_cache[room]['data']) furniture_data = { "workshop": [ {"type": "desk", "position": {"x": 0, "y": -1.5, "z": -3}, "rotation": {"x": 0, "y": 0, "z": 0}}, {"type": "chair", "position": {"x": 0, "y": -1.5, "z": -1}, "rotation": {"x": 0, "y": 0, "z": 0}}, {"type": "bookshelf", "position": {"x": 3, "y": 0, "z": -3}, "rotation": {"x": 0, "y": 0, "z": 0}}, {"type": "computer", "position": {"x": 0.5, "y": -0.5, "z": -3.2}, "rotation": {"x": 0, "y": 0, "z": 0}} ], "living_room": [ {"type": "sofa", "position": {"x": 0, "y": 0, "z": -2}, "rotation": {"x": 0, "y": 0, "z": 0}}, {"type": "tv", "position": {"x": 0, "y": 1.5, "z": -3}, "rotation": {"x": 0, "y": 0, "z": 0}} ], "bedroom": [ {"type": "bed", "position": {"x": 0, "y": 0, "z": -3}, "rotation": {"x": 0, "y": 0, "z": 0}}, {"type": "nightstand", "position": {"x": 1.5, "y": 0, "z": -2.5}, "rotation": {"x": 0, "y": 0, "z": 0}} ] } furniture_cache[room] = { 'timestamp': current_time, 'data': furniture_data.get(room, []) } return jsonify(furniture_cache[room]['data']) except Exception as e: app.logger.error(f"获取家具数据失败: {traceback.format_exc()}") return jsonify({"error": "内部错误", "details": str(e)}), 500 # ========== 错误处理器 ========== def register_error_handlers(app): @app.errorhandler(404) def page_not_found(error): app.logger.warning(f"404错误: {request.path}") return jsonify({ "error": "资源未找到", "path": request.path, "method": request.method }), 404 @app.errorhandler(500) def internal_server_error(error): app.logger.error(f"500错误: {str(error)}") return jsonify({ "error": "服务器内部错误", "message": "系统遇到意外错误,请稍后重试" }), 500 @app.errorhandler(Exception) def handle_general_exception(error): app.logger.error(f"未处理异常: {traceback.format_exc()}") return jsonify({ "error": "未处理的异常", "type": type(error).__name__, "message": str(error) }), 500 # ========== WebSocket处理 ========== def setup_websocket_handlers(socketio): @socketio.on('connect') def handle_connect(): logger.info('客户端已连接') socketio.emit('system_status', {'status': 'ready'}) @socketio.on('disconnect') def handle_disconnect(): logger.info('客户端已断开连接') @socketio.on('user_message') def handle_user_message(data): user_id = data.get('user_id', 'guest') message = data.get('message', '') logger.info(f"收到来自 {user_id} 的消息: {message}") # 处理消息逻辑 response = f"已收到您的消息: {message}" # 如果有协调器,使用协调器处理 global coordinator if coordinator: try: response = coordinator.process_message(message) except Exception as e: logger.error(f"协调器处理消息失败: {str(e)}") socketio.emit('agent_response', { 'user_id': user_id, 'response': response }) # ========== 主程序入口 ========== if __name__ == '__main__': try: app, socketio = create_app() # 设置WebSocket处理器 setup_websocket_handlers(socketio) # 启动服务器 socketio.run( app, host=config.HOST, port=config.PORT, debug=config.DEBUG, use_reloader=False ) logger.info(f"服务器运行在 http://{config.HOST}:{config.PORT}") except KeyboardInterrupt: logger.info("服务器关闭") except Exception as e: logger.critical(f"服务器启动失败: {str(e)}") logger.error(traceback.format_exc())
最新发布
08-11
import os import re import logging import hashlib import json from urllib.parse import urljoin, urlparse from concurrent.futures import ThreadPoolExecutor, as_completed import time import requests from bs4 import BeautifulSoup from tqdm import tqdm # 配置项(可扩展) CONFIG = { 'REQUEST': { 'headers': { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Accept-Encoding': 'gzip, deflate', 'Referer': 'https://www.google.com/' }, 'timeout': 20, 'max_retries': 5, 'delay': 1.5, 'proxy': None # 格式: {'http': 'http://10.10.1.10:3128'} }, 'SAVING': { 'image_dir': 'downloads/images', 'text_dir': 'downloads/text', 'max_filename_length': 100, 'image_types': ['.jpg', '.png', '.webp'] }, 'PERFORMANCE': { 'max_workers': 10, 'batch_size': 50 }, 'ANTI_CRAWL': { 'rotate_user_agents': False, 'use_proxy_pool': False } } # 初始化目录 os.makedirs(CONFIG['SAVING']['image_dir'], exist_ok=True) os.makedirs(CONFIG['SAVING']['text_dir'], exist_ok=True) # 日志配置 logging.basicConfig( level=logging.INFO, format='%(asctime)s [%(levelname)s] %(message)s', handlers=[ logging.FileHandler('crawler.log', encoding='utf-8'), logging.StreamHandler() ] ) logger = logging.getLogger(__name__) class CrawlerSession: """爬虫会话管理""" def __init__(self): self.session = requests.Session() self.proxy = CONFIG['REQUEST']['proxy'] self.retry_count = 0 self.last_request_time = 0 def get(self, url): """带速率限制的请求""" self._rate_limit() try: response = self.session.get( url, headers=CONFIG['REQUEST']['headers'], proxies=self.proxy, timeout=CONFIG['REQUEST']['timeout'] ) response.raise_for_status() return response except requests.RequestException as e: logger.warning(f"请求失败: {url} - {str(e)}") return None def _rate_limit(self): """请求速率控制""" elapsed = time.time() - self.last_request_time if elapsed < CONFIG['REQUEST']['delay']: time.sleep(CONFIG['REQUEST']['delay'] - elapsed) self.last_request_time = time.time() class ContentParser: """内容解析器""" @staticmethod def safe_parse(html, parser=None): """安全解析HTML(自动选择可用解析器)""" try: # 尝试按优先级选择解析器 for p in ['lxml', 'html.parser', 'html5lib']: try: return BeautifulSoup(html, p) except Exception: continue return BeautifulSoup(html, 'html.parser') # 最终回退 except Exception as e: logger.error(f"解析失败: {str(e)}") return None @staticmethod def extract_links(soup, base_url): """提取页面链接""" links = [] for a in soup.find_all('a', href=True): link = urljoin(base_url, a['href']) links.append(link) return links @staticmethod def extract_images(soup, base_url): """提取图片链接""" img_urls = [] for img in soup.find_all('img'): sources = [img.get('src'), img.get('data-src'), img.get('data-original')] for src in sources: if src and src.strip(): img_url = urljoin(base_url, src.strip()) img_urls.append(img_url) break return img_urls class FileManager: """文件管理""" @staticmethod def sanitize_filename(filename): """生成安全文件名""" filename = re.sub(r'[\\/*?:"<>|]', "", filename)[:CONFIG['SAVING']['max_filename_length']] if not filename: return hashlib.md5(str(time.time()).encode()).hexdigest() return filename @staticmethod def save_image(content, extension): """保存图片文件""" filename = f"{hashlib.md5(content).hexdigest()}{extension}" path = os.path.join(CONFIG['SAVING']['image_dir'], filename) with open(path, 'wb') as f: f.write(content) return path @staticmethod def save_text(content, url): """保存文本文件""" filename = FileManager.sanitize_filename(urlparse(url).path) + '.txt' path = os.path.join(CONFIG['SAVING']['text_dir'], filename) with open(path, 'w', encoding='utf-8') as f: f.write(content) return path class CrawlerEngine: """爬虫引擎""" def __init__(self): self.visited_urls = set() self.session = CrawlerSession() self.parser = ContentParser() self.file_manager = FileManager() def crawl(self, start_url, max_depth=2, max_pages=100): """启动爬虫""" queue = [(start_url, 1)] results = [] with tqdm(total=max_pages, desc="爬取进度") as pbar: while queue and len(results) < max_pages: url, depth = queue.pop(0) if depth > max_depth: continue if url in self.visited_urls: continue self.visited_urls.add(url) # 处理当前页面 content = self._process_page(url) if content: results.append(content) pbar.update(1) # 提取新链接 soup = self.parser.safe_parse(content['html']) if soup: new_links = self.parser.extract_links(soup, url) queue.extend([(link, depth + 1) for link in new_links]) return results class CrawlerEngine: def _process_page(self, url): """增强版页面处理方法""" try: # 网络请求增强处理 try: response = self.session.get(url) response.raise_for_status() # 检查HTTP状态码 except requests.exceptions.RequestException as e: logger.error(f"请求失败: {url} - {str(e)}") return None except Exception as e: logger.error(f"未知请求错误: {url} - {str(e)}") return None # 响应内容验证 if not response or not response.text: logger.warning(f"空响应内容: {url}") return None # 自动检测编码 try: detected_encoding = response.apparent_encoding decoded_content = response.content.decode(detected_encoding) except UnicodeDecodeError: logger.warning(f"编码检测失败,使用备用解码: {url}") decoded_content = response.text # 回退到requests的自动解码 content = { 'url': url, 'html': decoded_content, 'images': [], 'text': '' } # 解析增强处理 try: soup = self.parser.safe_parse(content['html']) if not soup or not soup.find(): logger.warning(f"无效的HTML结构: {url}") return None except Exception as e: logger.error(f"解析异常: {url} - {str(e)}") return None # 文本提取增强 try: text = soup.get_text(strip=True) # 清理非法字符 text = re.sub(r'[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\x9f]', '', text) content['text'] = text except AttributeError: logger.warning(f"文本提取失败: {url}") content['text'] = '' except UnicodeEncodeError: logger.warning(f"编码标准化失败: {url}") content['text'] = text.encode('utf-8', 'replace').decode('utf-8') # 图片下载增强 try: img_urls = self.parser.extract_images(soup, url) with ThreadPoolExecutor(max_workers=CONFIG['PERFORMANCE']['max_workers']) as executor: futures = {executor.submit(self._download_image, img_url): img_url for img_url in img_urls} for future in as_completed(futures): img_url = futures[future] try: if image := future.result(): content['images'].append(image) except Exception as e: logger.warning(f"图片下载失败: {img_url} - {str(e)}") except Exception as e: logger.error(f"图片处理异常: {url} - {str(e)}") return content except Exception as e: logger.critical(f"页面处理严重错误: {url} - {str(e)}", exc_info=True) return None def _download_image(self, img_url): """下载单张图片""" response = self.session.get(img_url) if response and response.headers.get('Content-Type', '').startswith('image/'): ext = os.path.splitext(img_url)[1] if ext.lower() in CONFIG['SAVING']['image_types']: return self.file_manager.save_image(response.content, ext) return None def _save_content(self, content): """保存内容""" # 保存文本 self.file_manager.save_text(content['text'], content['url']) # 生成报告 report = { 'url': content['url'], 'images': len(content['images']), 'text_length': len(content['text']) } logger.info(json.dumps(report, ensure_ascii=False)) if __name__ == '__main__': engine = CrawlerEngine() start_url = "https://www.21ic.com/article/906177.html" try: results = engine.crawl(start_url, max_depth=2, max_pages=50) logger.info(f"爬取完成,共获取{len(results)}个页面") except KeyboardInterrupt: logger.info("用户中断爬取") except Exception as e: logger.error(f"爬取失败: {str(e)}")修改我代码,检查出错误并且修改正确,最后给出完整的代码
05-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值