☰
OctoPrint JavaScript 客户端库 printer 组件完全指南:通过 `OctoPrint.printer` 掌控你的 3D 打印机
2026/9/25 6:52:10 网站建设 项目流程
  • 物联网
  • 后端

【免费下载链接】OctoPrint

OctoPrint is the snappy web interface for your 3D printer!

项目地址:https://gitcode.com/gh_mirrors/oc/OctoPrint
点击查看免费下载

导读

本文聚焦 OctoPrint JavaScript 客户端库(JS Client Library)中的printer组件——它是浏览器端控制打印机硬件的一站式接口。围绕 docs/jsclientlib/printer.rst 中定义的 20 余个方法,你将从零掌握如何查询打印机完整状态、读写喷头/热床/腔室温度、控制打印头移动与归位、挤出耗材,以及管理打印机内部存储(如 SD 卡)。读完本文,你将能够基于全局OctoPrint.printer实例或自建的多服务器客户端,编写出可落地的浏览器端打印机控制代码,并理解每个方法背后的 REST API 端点、权限要求与 Promise 语义。

背景:printer 组件与 REST API 的对应关系

printer组件是OctoPrintClient的注册组件之一,其实现位于 src/octoprint/static/js/app/client/printer.js,通过OctoPrintClient.registerComponent("printer", OctoPrintPrinterClient)挂载到客户端原型上。组件内部预定义了与服务器端 REST API 一一对应的资源地址:

常量URL 路径用途
urlapi/printer获取完整打印机状态
printheadUrlapi/printer/printhead打印头命令(jog / home / feedrate)
toolUrlapi/printer/tool工具(喷头)命令与温度查询
bedUrlapi/printer/bed热床命令与温度查询
chamberUrlapi/printer/chamber加热腔室命令与温度查询
storageUrlapi/printer/storage内部存储初始化/释放/状态查询
errorUrlapi/printer/error最近一次错误信息

这些路由的服务器端实现在 src/octoprint/server/api/printer.py 中:查询类端点(GET)要求STATUS权限,命令类端点(POST)要求CONTROL权限。其中/printer/sd作为/printer/storage的向后兼容别名保留(见 printer.py)。

必须先理解的 Promise 语义

原文档开头有一条贯穿全局的重要说明:所有与打印机交互的方法(凡是会向打印机发送命令的方法),其返回的 jQuery Promise 只会在“服务器已把命令加入队列”时 resolve,而不是在命令真正发送给打印机或被打印机处理时 resolve。原因在 docs/api/printer.rst 中有详细解释:OctoPrint 内部基于 Flask/WSGI,其 Web 服务器是单线程同步模型,无法在 REST 请求中非阻塞地等待打印机的串口响应;同时大量固件存在难以追踪命令输出的缺陷,无法可靠地将输出与命令对应。因此你需要通过 SockJS 推送(socket组件)订阅打印机状态变化,而不是依赖命令调用的返回值。

查询打印机状态:getFullState 与 flags 参数

getFullState(flags, opts)

OctoPrintClient.printer.getFullState(flags, opts)检索打印机完整状态,包括温度信息、SD/存储状态与一般打印机状态。flags对象支持以下属性:

  • history:布尔值,是否包含温度历史记录(true包含),默认不包含;
  • limit:整数,包含多少条历史记录条目;
  • exclude:字符串,逗号分隔的要从返回结果中排除的字段。

从源码看(printer.js),客户端会把这些 flags 拼装成查询字符串:history=true&limit=n&exclude=...。值得注意的是,exclude中的"sd"会被自动映射为"storage",这是对 2.0.0 起存储概念重命名的兼容处理。服务端exclude参数的有效取值是temperature、storage、state(见 docs/api/printer.rst)。

// 获取完整状态,附带最近 2 条温度历史 OctoPrint.printer.getFullState({history: true, limit: 2}) .done(function(response) { var tool0 = response.temperature.tool0; var bed = response.temperature.bed; var storageReady = response.storage.ready; var stateText = response.state.text; });

getFullState对应的 HTTP 请求是GET /api/printer,成功返回200与 Full State Response(包含temperature、storage、state三个可选字段),打印机不可操作时返回409(见 docs/api/printer.rst)。

getToolState / getBedState / getChamberState

这三个方法分别查询喷头、热床、加热腔室的当前温度信息(actual / target / offset),并可选附带温度历史。三者的flags参数语义一致:

  • history:布尔值,是否包含温度历史(默认不包含);
  • limit:整数,包含多少条历史记录。
// 查询喷头温度 + 最近 5 条历史 OctoPrint.printer.getToolState({history: true, limit: 5}) .done(function(response) { console.log(response.tool0.actual, response.tool0.target); }); // 查询热床状态(不要求历史) OctoPrint.printer.getBedState(); // 查询加热腔室状态 OctoPrint.printer.getChamberState();

它们分别对应GET /api/printer/tool、GET /api/printer/bed、GET /api/printer/chamber。需要特别注意的是:如果当前选择的打印机配置文件中没有配置热床或加热腔室,对应的 bed/chamber 查询会返回409(见 docs/api/printer.rst 与 docs/api/printer.rst)。若需要同时获取喷头与热床温度,直接使用getFullState更高效。

控制打印头:jog、home 与进给速率

jog(amounts, opts)

OctoPrintClient.printer.jog(amounts, opts)按指定距离相对移动打印头。amounts是一个键值对对象,键为要移动的轴(x、y、z),值为移动距离(mm,可为负)。

// X 轴移动 10mm OctoPrint.printer.jog({"x": 10.0}); // Y 轴移动 -5mm,Z 轴移动 0.2mm OctoPrint.printer.jog({"y": -5.0, "z": 0.2});

从源码看(printer.js),jog内部还会额外支持absolute(布尔值,决定是相对移动还是绝对坐标移动)与speed(mm/min 的移动速度)两个可选属性,最终通过issuePrintheadCommand("jog", payload, opts)发送 POST 请求。服务端在 printer.py 中校验每个轴的值必须是数字,否则返回400。

home(axes, opts)

OctoPrintClient.printer.home(axes, opts)对指定的轴执行归位操作。axes是字符串数组,合法值为x、y、z中的一个或多个。

// 归位 X 和 Y 轴 OctoPrint.printer.home(["x", "y"]); // 归位 Z 轴 OctoPrint.printer.home(["z"]);

服务端会逐个校验轴名是否合法(printer.py),非法轴名返回400。

setFeedrate(factor, opts)

OctoPrintClient.printer.setFeedrate(factor, opts)设置进给速率(feedrate)倍率。factor是大于 0 的整数,表示新的进给速率百分比。REST API 文档说明取值范围为50~200(整数)或0.5~2.0(浮点)之间(见 docs/api/printer.rst)。源码中未提供factor时会默认回退为100(printer.js)。

// 将进给速率设为 105% OctoPrint.printer.setFeedrate(105);

setFlowrate(factor, opts)

OctoPrintClient.printer.setFlowrate(factor, opts)设置当前挤出速率(flowrate)倍率。factor同样是大于 0 的整数百分比,REST API 文档规定的合法范围为75~125(整数)或0.75~1.25(浮点)(见 docs/api/printer.rst)。与setFeedrate不同,flowrate属于工具命令,走的是api/printer/tool端点。

// 将挤出速率设为 95% OctoPrint.printer.setFlowrate(95);

一个容易混淆的细节:feedrate只影响轴移动速度(对应 G 代码的G1 F...),而flowrate影响挤出量比例,二者应用场景不同。此外,jog、home命令只能在打印机处于可操作状态且未在打印时发送,否则服务端返回409;feedrate是唯一例外,它甚至在打印中也可使用(见 printer.py)。

控制喷头温度与挤出:setTool* 系列与 selectTool/extrude

setToolTargetTemperatures(targets, opts)

OctoPrintClient.printer.setToolTargetTemperatures(targets, opts)为打印机的挤出机设置目标温度。targets是一个对象,键为工具标识符(tool表示当前激活的挤出机,tool{n}表示索引为 n 的挤出机,n 从 0 开始),值为目标温度。

// 第一个喷头设为 220°C,第二个喷头设为 205°C OctoPrint.printer.setToolTargetTemperatures({"tool0": 220, "tool1": 205}); // 只设置当前激活喷头到 220°C OctoPrint.printer.setToolTargetTemperatures({"tool": 220});

目标温度设为0会关闭对应加热器。此方法对应target工具命令(见 docs/api/printer.rst)。

setToolTemperatureOffsets(offsets, opts)

OctoPrintClient.printer.setToolTemperatureOffsets(offsets, opts)为打印机的挤出机设置温度偏移量。offsets同样是“工具标识符 → 偏移值”的对象。偏移量会叠加在读取到的实际温度上(例如喷头测得的 actual 值会加上该偏移)。

// 第一个喷头偏移 +10°C,第二个喷头偏移 -5°C OctoPrint.printer.setToolTemperatureOffsets({"tool0": 10, "tool1": -5});

selectTool(tool, opts) 与 extrude(amount, opts)

selectTool选择当前激活的挤出机,tool参数格式为tool{n}。extrude在当前选中的挤出机上挤出(正数)或回抽(负数)指定毫米数的耗材。二者组合使用即可实现“换工具 + 挤出/回抽”的完整操作:

// 选择第二个工具,挤出 5mm 耗材,再切回第一个工具 OctoPrint.printer.selectTool("tool1") .done(function(response) { OctoPrint.printer.extrude(5.0) .done(function(response) { OctoPrint.printer.selectTool("tool0"); }); }); // 挤出 5mm 后再回抽 2mm OctoPrint.printer.extrude(5.0) .done(function(response) { OctoPrint.printer.extrude(-2.0); });

注意:extrude命令还支持可选的speed参数(挤出速度,mm/min),未提供时使用打印机配置文件中 E 轴的最大速度;select与extrude只能在打印机可操作且未在打印时发送(见 docs/api/printer.rst)。

控制热床与加热腔室:bed / chamber 命令

setBedTargetTemperature(target, opts)

为打印机的热床设置目标温度(前提是当前打印机配置文件配置了热床)。target为浮点目标温度,0关闭加热器。

// 热床设为 90°C OctoPrint.printer.setBedTargetTemperature(90.0);

setBedTemperatureOffset(offset, opts)

为热床设置温度偏移。

// 热床温度偏移设为 -5°C OctoPrint.printer.setBedTemperatureOffset(-5);

setChamberTargetTemperature(target, opts) 与 setChamberTemperatureOffset(offset, opts)

与热床对应,这两组方法操作加热腔室(如果当前打印机配置文件配置了腔室):

// 腔室设为 50°C OctoPrint.printer.setChamberTargetTemperature(50.0); // 腔室温度偏移设为 -5°C OctoPrint.printer.setChamberTemperatureOffset(-5);

bed / chamber 的target与offset命令(对应POST /api/printer/bed、POST /api/printer/chamber)都要求打印机可操作,若所选打印机配置文件未配置热床/腔室则返回409;数值非法或超出支持范围返回400(见 docs/api/printer.rst 与 docs/api/printer.rst)。

管理内部存储:getStorageState / initStorage / releaseStorage

自 2.0.0 起,原先的 SD 卡概念被推广为“打印机内部存储”(internal storage),客户端组件也随之更新:

  • getStorageState(opts):查询打印机内部存储的当前就绪状态(ready: true/false),对应GET /api/printer/storage;
  • initStorage(opts):指示打印机初始化并挂载内部存储(如存在),对应init命令;若 OctoPrint 在连接打印机时检测到可用存储(如 SD 卡),会自动尝试初始化,一般无需手动调用;
  • releaseStorage(opts):指示打印机卸载内部存储(如存在且允许),对应release命令,执行后存储将不可用。
// 查询存储状态 OctoPrint.printer.getStorageState() .done(function(response) { console.log(response.ready); // true / false }); // 初始化(挂载)内部存储 OctoPrint.printer.initStorage(); // 释放(卸载)内部存储 OctoPrint.printer.releaseStorage();

服务端实现见 printer.py:init调用printer.mount_storage(),release调用printer.unmount_storage(),refresh则强制刷新文件列表。存储支持可通过feature.sdSupport设置项关闭,关闭后访问存储端点返回404。此外,refresh命令(刷新内部存储文件列表)在客户端层面已被弃用,改由OctoPrintClient.files.listForLocation完成。

已弃用的 SD 方法

原文档明确标注了四个2.0.0起弃用、计划在3.0.0移除的方法,使用它们会在控制台输出警告(OctoPrintClient.deprecated包装器,见 base.js):

弃用方法替代方法
getSdStategetStorageState
initSdinitStorage
refreshSdfiles.listForLocation
releaseSdreleaseStorage
// 不要这样写(已弃用): OctoPrint.printer.initSd(); // 请这样写: OctoPrint.printer.initStorage();

补充:getErrorInfo 与底层实现原理

除原文档列出的方法外,printer 组件还提供了getErrorInfo(opts)(printer.js),对应GET /api/printer/error,返回最近一次错误的信息(error、reason、consequence、faq、logs等字段,见 docs/api/printer.rst),可用于在界面上展示故障详情。

issueCommand 与组件注册机制

所有命令方法最终都汇入OctoPrintClient.prototype.issueCommand(url, command, payload, opts)(base.js):它把command字段与payload合并为 JSON,通过postJson发送 POST 请求。例如setToolTargetTemperatures({"tool0": 220})实际发出的请求体是:

{ "command": "target", "targets": {"tool0": 220} }

请求头方面(base.js):若配置了options.apikey则发送X-Api-Key;否则在浏览器上下文中为非 GET/HEAD/OPTIONS 请求附加 CSRF token 头(X-CSRF-Token);还可通过options.locale与options.apiVersion分别携带X-Locale与X-OctoPrint-Api-Version。

统一命令约束

所有命令类方法共享以下服务端约束(printer.py):

  • 成功执行返回204 No Content与空响应体;
  • 打印机不可操作(未连接/未就绪)时返回409;
  • jog、home、select、extrude在打印进行中发送会返回409;
  • 参数非法(非数字的轴值、非法轴名、越界的倍率因子、非tool{n}格式的工具标识符)返回400;
  • 命令端点需要CONTROL权限,状态查询端点需要STATUS权限。

实战:一个完整的浏览器端温度控制场景

将本文内容组合起来,即可在页面脚本中实现一个完整的“预热 → 打印头就位 → 挤出测试 → 清理”流程:

// 1. 设置喷头与热床目标温度,并读取完整状态 OctoPrint.printer.setToolTargetTemperatures({"tool0": 220}); OctoPrint.printer.setBedTargetTemperature(60.0); OctoPrint.printer.getFullState({history: true, limit: 5}) .done(function(state) { console.log("当前状态:", state.state.text); console.log("tool0:", state.temperature.tool0); console.log("bed:", state.temperature.bed); console.log("存储就绪:", state.storage.ready); }); // 2. 归位 X/Y 轴,随后将打印头移动到 (10, 10, 0.2) OctoPrint.printer.home(["x", "y"]) .done(function() { OctoPrint.printer.jog({"x": 10.0, "y": 10.0, "z": 0.2}); }); // 3. 挤出测试:挤出 5mm 后回抽 2mm OctoPrint.printer.extrude(5.0) .done(function() { OctoPrint.printer.extrude(-2.0); }); // 4. 打印结束后清理:关闭加热并卸载存储 OctoPrint.printer.setToolTargetTemperatures({"tool0": 0}); OctoPrint.printer.setBedTargetTemperature(0); OctoPrint.printer.releaseStorage();

需要再次强调的是:上述每个.done()回调都只代表命令已被服务器成功入队,实际执行结果(如温度是否达到目标、打印头是否到位)需要结合socket组件的推送事件(如temperature、stateChanged等)来观察,这也是 OctoPrint 客户端设计的核心约定。

延伸阅读

  • REST API 完整规范(含数据模型、请求/响应示例):docs/api/printer.rst
  • 客户端组件实现源码:src/octoprint/static/js/app/client/printer.js
  • 基础客户端(issueCommand、认证头、组件注册):src/octoprint/static/js/app/client/base.js
  • 服务器端端点实现:src/octoprint/server/api/printer.py
  • JS 客户端库总览与嵌入方式:docs/jsclientlib/index.rst
  • 打印机状态推送与实时更新:docs/jsclientlib/socket.rst
  • 物联网
  • 后端

【免费下载链接】OctoPrint

OctoPrint is the snappy web interface for your 3D printer!

项目地址:https://gitcode.com/gh_mirrors/oc/OctoPrint
点击查看免费下载
上一篇:【免费下载】 Avogadro 项目安装与使用教程
下一篇:VUX 虚拟组件(Virtual Component)原理与实战:编译期按需内联的免 import 组件机制

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询