拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OctoPrint JavaScript 客户端库 printer 组件完全指南:通过 `OctoPrint.printer` 掌控你的 3D 打印机

OctoPrint JavaScript 客户端库 printer 组件完全指南:通过 `OctoPrint.printer` 掌控你的 3D 打印机 物联网后端【免费下载链接】OctoPrintOctoPrint 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 / feedratetoolUrlapi/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 拼装成查询字符串historytruelimitnexclude...。值得注意的是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 轴移动 -5mmZ 轴移动 0.2mm OctoPrint.printer.jog({y: -5.0, z: 0.2});从源码看printer.jsjog内部还会额外支持absolute布尔值决定是相对移动还是绝对坐标移动与speedmm/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时会默认回退为100printer.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命令只能在打印机处于可操作状态且未在打印时发送否则服务端返回409feedrate是唯一例外它甚至在打印中也可使用见 printer.py。控制喷头温度与挤出setTool* 系列与 selectTool/extrudesetToolTargetTemperatures(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/storageinitStorage(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.pyinit调用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弃用方法替代方法getSdStategetStorageStateinitSdinitStoragerefreshSdfiles.listForLocationreleaseSdreleaseStorage// 不要这样写已弃用 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与空响应体打印机不可操作未连接/未就绪时返回409jog、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.pyJS 客户端库总览与嵌入方式docs/jsclientlib/index.rst打印机状态推送与实时更新docs/jsclientlib/socket.rst赞分享物联网后端【免费下载链接】OctoPrintOctoPrint is the snappy web interface for your 3D printer!项目地址https://gitcode.com/gh_mirrors/oc/OctoPrint点击查看免费下载相关推荐CANN/GE获取模型输出维度aclmdlGetCurOutputDimsa nameZH CN_TOPIC_0000001265400378 /a 产品支持情况a name人工智能深度学习模型编译模型优化编译器Ascend酷安UWP客户端终极上手实战Windows电脑完整畅玩酷安社区的避坑指南酷安UWP客户端终极上手实战Windows电脑完整畅玩酷安社区的避坑指南 酷安是中文互联网里最活跃的数码社区之一可惜它长期长在手机上。想在工作间隙用电脑物联网后端如何快速构建现代化的Redis管理工具Medis完整开发指南如何快速构建现代化的Redis管理工具Medis完整开发指南 想要打造一个美观、高效且跨平台的Redis管理工具吗Medis for Windows正是这样上一篇【免费下载】 Avogadro 项目安装与使用教程下一篇VUX 虚拟组件Virtual Component原理与实战编译期按需内联的免 import 组件机制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表