OctoPrint Action Commands 完整指南:固件到主机的 `// action:` 通信协议
物联网后端【免费下载链接】OctoPrintOctoPrint is the snappy web interface for your 3D printer!项目地址https://gitcode.com/gh_mirrors/oc/OctoPrint点击查看免费下载Action Commands 是 OctoPrint 针对 GCODE 系 RepRap 通信协议实现的一项特色功能允许打印机固件通过一行特殊的注释// action:command反向通知主机执行打印控制操作开始、取消、暂停、恢复、断开连接等实现由固件主导、主机配合的协作模式。本文以 docs/features/action_commands.rst 为骨架结合 serial_comm.py 的监控线程解析逻辑、Action Command Prompt 插件的对话框实现与octoprint.comm.protocol.action钩子机制完整讲解内置命令语义、SD 卡状态同步、可选的系统关机命令以及如何通过插件扩展新的 action 命令。一、背景RepRap 协议中的//调试行与 action 注释在 GCODE 通信中打印机固件随时可能向主机发送以//开头的调试信息行。这类行总是以//开头并且可以在任何时间被发送用来承载注释类内容任何主机都可以安全地忽略它们。OctoPrint 沿用了 Pronterface 定义的约定当//之后的内容形如// action:command时它不再是普通调试信息而是一个action 命令。由于它本质上仍是注释不支持该约定的其他主机软件会将其当作普通注释直接忽略因此该机制对既有生态完全向后兼容——固件可以放心发送不必担心破坏不支持者的通信。OctoPrint 的串口监控线程在读取到以//开头的行后会剥离前缀并检查是否以action:开头一旦命中就解析出 action 名称与可选参数并据此执行对应逻辑见 serial_comm.pyelif line.startswith(//): debugging_output line[2:].strip() if debugging_output.startswith(action:): action_command debugging_output[len(action:) :].strip() if in action_command: action_name, action_params action_command.split( , 1) action_name action_name.strip() else: action_name action_command action_params 从源码结构看action_name与action_params会被分别传递给后续逻辑与插件钩子name即命令名如pauseparams是// action:后剩余的部分如prompt_choice 选项文本中的选项文本。二、内置 Action Commands 完整语义OctoPrint 开箱即用地支持以下内置命令。它们的行为与点击界面上对应按钮的效果一致且每次触发都会携带trigger:serial.action_command.name标签便于在事件与日志中溯源。start1.5.0 起当打印机发送start时如果当前已选中一个打印任务且该任务尚未处于激活状态OctoPrint 会启动它效果等同于点击Start/Restart按钮。源码中只有在self._currentFile is not None时才执行self.startPrint(...)避免在无任务时误启动serial_comm.py。// action:startcancel收到cancel后OctoPrint 会取消当前打印任务效果等同于点击Cancel按钮serial_comm.py// action:cancelpause / paused这两个命令都会使 OctoPrint 暂停当前打印但语义有本质区别pause执行完整的暂停流程等同点击Pause按钮会触发暂停相关的 GCODE 脚本并向打印机发送 SD 打印控制命令serial_comm.pypaused只切换内部状态为已暂停不触发任何 GCODE 脚本也不发送任何 SD 打印控制命令。源码中对应self.setPause(True, local_handlingFalse, ...)serial_comm.py。paused适合固件全权管理暂停场景例如固件主导的换料流程固件只需告诉 OctoPrint打印应该处于暂停状态OctoPrint 不插手控制避免脚本或 SD 命令干扰固件自身流程。// action:pause // action:pausedresume / resumed与暂停对称resume执行完整恢复流程等同点击Resume按钮会触发恢复相关 GCODE 脚本并发送 SD 控制命令serial_comm.pyresumed仅切换状态为已恢复local_handlingFalse不触发脚本、不发送 SD 控制命令serial_comm.py。// action:resume // action:resumeddisconnect收到disconnect后OctoPrint 会立即断开与打印机的连接serial_comm.py// action:disconnectsd_inserted / sd_ejected / sd_updated1.6.0 起这三个命令用于让打印机向 OctoPrint 同步 SD 卡状态仅在 OctoPrint 启用了 SD 支持时才被识别源码中均以self._sdEnabled and ...作为前置条件sd_inserted假设打印机中已插入 SD 卡设置对应内部状态标志并主动发送一次文件列表请求self.refreshSdFiles()serial_comm.pysd_ejected假设 SD 卡已被移除清除内部状态标志与已缓存的 SD 文件列表serial_comm.pysd_updated假设 SD 卡上的内容发生了变化触发一次文件列表刷新serial_comm.py。// action:sd_inserted // action:sd_ejected // action:sd_updatedshutdown1.8.0 起默认关闭收到shutdown后OctoPrint 会立即关闭运行它的操作系统。该命令默认不启用——因为存在被恶意固件或被篡改的 GCODE 滥用导致系统被远程关闭的高风险。用户必须主动在Settings Serial Connection Firmware Protocol Action Commands中开启且系统必须配置了可用的系统关机命令system shutdown command二者缺一不可。源码中的双重校验清晰印证了这一点初始化时读取enableShutdownActionCommand设置serial_comm.py其配置默认值为False见 config_schema.py执行时只有self._enable_shutdown_action_command为真才调用system_command_manager().perform_system_shutdown()否则仅记录一条警告日志serial_comm.py。// action:shutdown三、Action Command Prompt通过prompt_*命令构建交互对话框如果内置的Action Command Prompt Support 插件action_command_prompt/init.py处于启用状态默认启用OctoPrint 还支持通过一系列prompt_*action 命令让固件在 Web 界面上创建交互式选择/确认对话框。该插件注册了octoprint.comm.protocol.action钩子其action_command_handler只处理以prompt_开头的 actionaction_command_prompt/init.py支持的命令序列如下action 命令作用prompt_begin text开始定义一个提示框text为展示给用户的文本若已有激活的提示框则忽略prompt_choice text为提示框添加一个可选按钮文本为textprompt_button为同义词prompt_show在 Web 界面弹出已定义好的提示框prompt_end关闭当前提示框并清空其定义典型用法是固件在换料等场景中询问用户// action:prompt_begin Do you want to change the filament? // action:prompt_choice Yes // action:prompt_choice No // action:prompt_show用户点击按钮后插件通过selectAPI 命令将所选序号发送回固件。源码中若配置的命令包含{choice}占位符则发送self._command.format(choicechoice)否则发送self._command S{choice}action_command_prompt/init.py。默认对话命令为M876COMMAND M876这正是许多固件如 RepRapFirmware 系用于处理主机交互的标准命令。交互对话框在前端由 action_command_prompt.js 渲染它以Message from your printer为标题弹出选择对话框按钮按prompt_choice添加顺序排列maycancel: true允许用户直接关闭onStartupComplete时会主动向后端请求当前激活的提示框状态保证页面刷新后提示框仍能恢复action_command_prompt.js。插件还通过以下机制与固件协商能力相关开关均可在插件设置页action_command_prompt_settings.jinja2调整enabledetected默认/always/never。detected模式下插件监听固件通过octoprint.comm.protocol.firmware.capabilities钩子上报的PROMPT_SUPPORT能力确认支持后才启用对话框action_command_prompt/init.pyenable_signal_support向固件回发M876 P1以宣告主机支持prompt_*actiondetected且检测到能力时、或always模式在连接事件时发送action_command_prompt/init.pyenable_emergency_sending当固件被阻塞时通过_emergency_force_send强制发送对话命令仅针对M876 Sx用于绕过固件中的阻塞性例程action_command_prompt/init.py。与提示框交互需要PLUGIN_ACTION_COMMAND_PROMPT_INTERACT权限默认授予user组的interact角色前端与 API 层均会进行校验action_command_prompt/init.py。四、通过插件扩展新的 Action CommandsOctoPrint 允许插件为 action 命令体系添加任意自定义命令。实现方式为注册octoprint.comm.protocol.action钩子钩子文档钩子签名与调用约定为def action_command_handler(self, comm, line, action, *args, **kwargs): # comm: 串口通信实例 # line: 原始的 // action:... 行 # action: 完整的 action 字符串如 prompt_begin Do you want to change the filament? # kwargs[name]: 解析出的命令名如 prompt_begin # kwargs[params]: 命令参数部分如 Do you want to change the filament? ...注册方式__plugin_hooks__ { octoprint.comm.protocol.action: __plugin_implementation__.action_command_handler, }内置的 Action Command Prompt 插件正是这一机制的典范实现action_command_prompt/init.py。串口监控线程在解析并处理完内置命令后会无条件遍历所有octoprint.comm.protocol.action钩子并逐一调用任何钩子抛出的异常都会被捕获并记录不会中断主流程serial_comm.py。五、实战要点与安全建议综合上述机制在实际固件与 GCODE 开发中值得注意以下几点约定保持兼容// action:...本质是注释行不支持该特性的主机只会忽略它。固件可以放心发送无需为旧主机做特殊降级处理。区分pause/paused与resume/resumed希望 OctoPrint 完整执行脚本与 SD 控制流程时用前者固件自行管理如固件主导换料时用后者避免 OctoPrint 干扰。shutdown需谨慎默认关闭启用前必须评估恶意固件/篡改 GCODE 的威胁模型并确保系统关机命令已配置且用户有相应权限。SD 卡命令依赖 SD 支持sd_inserted/sd_ejected/sd_updated仅在 OctoPrint 启用 SD 支持时生效否则会被忽略。对话命令协商优先让固件通过能力上报PROMPT_SUPPORT插件会在detected模式下自动协商M876 P1用于告知固件主机支持prompt_*。权限约束用户与前端交互提示框需要PLUGIN_ACTION_COMMAND_PROMPT_INTERACT权限自定义 action 插件同样应结合 access 权限体系 设计安全的交互入口。六、相关文档与源码索引功能文档docs/features/action_commands.rst核心解析与处理serial_comm.pyshutdown 开关默认值config_schema.py提示框插件实现action_command_prompt/init.py提示框前端渲染action_command_prompt.js提示框设置页action_command_prompt_settings.jinja2钩子机制参考docs/plugins/hooks.rst插件开发入门docs/plugins/gettingstarted.rst赞分享物联网后端【免费下载链接】OctoPrintOctoPrint is the snappy web interface for your 3D printer!项目地址https://gitcode.com/gh_mirrors/oc/OctoPrint点击查看免费下载相关推荐OctoPrint Action Command Notification 支持插件固件驱动打印机通知的完整指南OctoPrint Action Command Notification 支持插件固件驱动打印机通知的完整指南 导读 本指南面向 OctoPrint 用户与物联网后端如何实现超星学习通全类型签到自动化一站式解决方案深度解析如何实现超星学习通全类型签到自动化一站式解决方案深度解析 面对超星学习通多样化的签到需求你是否曾为频繁切换签到方式而烦恼传统的手动签到不仅耗时耗力更难以CLI后端前端RPACANN Ascend C MulAddRelu算子APIMulAddRelua nameZH CN_TOPIC_0000001787851724 /a 产品支持情况a namesection15505人工智能深度学习算子库CANNAscend上一篇CloudQuery 快速开始如何从零开始配置你的第一个数据同步下一篇跨平台文件访问终极指南5分钟掌握SSHFS-Win让远程服务器变成本地硬盘创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考