1. 概述
论文平台充分利用互联网优势,也充分利用闲散的自主3D打印机资源,为广大3D设计爱好者、设计提供方、3D打印资源拥有者、系统管理方提供一个交流与协作的服务平台,让他们在新媒体的大环境中,能够很快的把自己的知识转化成生产力,并进一步促进产品设计的快速成型[1] 。3D打印机在工业、医疗、建筑等行业都有高可用性,因此对3D云打印的研究是十分必要和有意义的。
3D云打印服务平台的设计与实现已有另一篇文章详细介绍,本文介绍打印过程中,针对3D打印机任务要求的实时性、安全性与高效性,从如何捕获对其机器上模型文件的编辑命令和驱动打印机的打印命令,并将命令封装Web化和解析执行这几个方面研究了3D打印机接入平台的实现方法。编辑命令和驱动打印机命令的捕获、封装与解析的实现用相同的协议进行传输,但是执行两个命令的驱动对象不同。编辑命令经解析驱动的是UP软件,由UP软件执行命令;打印命令经解析后,是由UP软件执行驱动3D打印机。
系统故障或者是网络故障都会对3D云打印操作产生很大的影响,本论文就命令传输过程中可能出现的故障提出了解决方案,以确保当故障发生时,不会造成特大损失或给用户带来恶劣体验。
2. 操作3D云打印机命令的传输
多个用户通过Internet访问云端平台提供的3D打印服务,向Web服务器发送请求,3D打印机接入Internet平台,主要依靠操作命令在网络上的流转实现。以用户发送打印机驱动命令为例,打印机驱动命令在Internet上的流转如图1所示。
图中实线箭头表示驱动命令在公网上的流转方向,虚线表示打印机返回给用户信息的流转方向。
Step 01用户通过Web浏览器向服务器发送打印机驱动命令,按照HTTP协议传输,将打印机驱动命令封装成易于传输的指令数据;
Step 02 Web服务器接收驱动命令,并将指令数据集存储在临时资源池中,利用Web服务器缓存机制,可以存储命令;
Step 03经测试知道服务器端的临时资源池并不能持续安全的存储数据,有可能出现打印命令还没有执行的情况下命令丢失,这样会造成用户对模型操作命令丢失情况,为了避免这种情况的发生我们利用异步存储的机制将用户对模型的编辑指令数据集存储在数据库服务器的数据表中,防止临时资源池中的数据丢失;
Step 04待工作站上的守护进程,捕获到Web服务器端的驱动命令,Web服务器通过HTTP协议将指令数据集发送给工作站。

Figure 1. 3D cloud printer driver command flow chart on the Internet
图1. 3D云打印机驱动命令在Internet上的流转图
这里不采用服务器向工作站发送请求的方式,而是工作站上的守护进程 [2] 不断请求服务器,是因为与3D打印机直接相连接的工作站很可能没有可供外网访问的对外IP地址,更可能由于NAT和两端主机所在的防火墙等原因而无法从Web服务器向客户端直接建立TCP连接来传输数据 [3] ,因此,所设计的协议应当采用由客户端向Web服务器建立连接的方式来进行通信,此时,Web服务器同时充当了TCP服务器,由于HTTP协议也以TCP协议为传输层协议,Web服务所用的80端口在服务器上也必然打开;因而,一种可行的替代方案(也是最终实现时所采用的方案)是,以HTTP请求来代替建立TCP连接,以HTTP为基础协议来传输需要封装的字节流数据;
Step 05工作站接收Web服务器发送的指令数据集,按照HTTP协议格式解析指令(HTTP协议格式在第3章详细介绍),按照控制指令模拟人员操作UP软件,执行相应的操作;
Step 06操作命令若为打印命令,则由UP软件调用与打印机的接口,执行打印命令。
按照虚线箭头的方向,工作站端通过获取UP软件底部状态栏信息,将打印信息按照协议封装,经过网络传输发送给Web服务器,服务器将打印信息保存在数据库服务器上的数据表中,待用户查询打印状态时,将任务打印状态信息显示在Web浏览器上,供用户查看。
若用户执行的是编辑命令,则通过将UP软件界面置顶,然后截屏的方式,将执行结果以图片的形式,传输至Web浏览器端呈现给用户。
3. 3D打印机接入Internet平台的实现
由3D打印机驱动命令在Internet上的流转图可知,打印命令应该以一种安全且高速的方式在网络平台上传输。为了保证客户端与服务器的快速交互,我们采用HTTP协议传输操作指令,同时我们还需要考虑数据的安全性。我们采用虚拟工作站协议(Virtual Workstation Protocol,VWP)传输操作指令,用HTTP协议代替TCP协议作为传输协议,既保证了指令传输的高效性同时保证了数据的安全性。由于服务器端的内存保护机制,操作命令在服务器临时资源池中并不能存储很长时间,为了防止操作命令丢失,采用数据库服务器的备份方式保证用户操作不会丢失。
3.1. 操作3D打印机命令的Web化
为了快速传输3D打印机的驱动命令,我们采用HTTP协议封装的打印命令。同时考虑到3D打印编辑操作的有限性和操作参数的有限性,因此,命令的传输以HTTP协议进行传输的,HTTP消息有客户端到服务器的请求和服务器到客户端的响应组成。对打印机的控制也是由客户端发起,建立连接,等待服务器响应,返回客户端Web页面信息。由于HTTP协议支持客户/服务器模式,客户向服务器请求服务时,只需传送请求方法和路径。命令的传输采用post方法,可以传输任意类型的数据对象,正在传输的类型由Content-Type加以标记。HTTP协议的传输比较灵活,只需要客户端与服务器两端以统一的格式进行封装与解析即可 [4] 。
对于操作命令的封装需要按照一定的格式,HTTP协议的格式如下:
HTTP协议封装之后,传输数据正文格式为:format = X & type = X & parameters = X..。format表示传输数据类型,type表示执行操作类型,parameters表示参数值。Format和type可以用短整型传输参数,不同的数字代表不同的操作类型。以用户发送一次将模型扩大3倍的命令为例,由于缩放存在参数类型为负数的情况,且缩放比例有上限和下限要求,所以参数类型应该为有符号短整型数据,即取format = 3;缩放视图对应的操序号为5,因此type = 5;放大3倍,则parameters = +3。封装之后传输数据格式应该为:format = 3 & type = 5 & parameters = +3。
由于不同的用户会发送不同的命令,服务器会同时接受到很多命令,为了区分用户发送的命令,我们可以再传送一个uid参数,将用户id作为唯一标识符区分不同用户的发送的命令。
3.2. 操作3D云打印机命令的解析
每次工作站客户端向Web服务器进行请求之后,收到的响应内容都是如上格式定义的。3D打印机在执行操作命令之前必须在工作站端对操作指令解析。工作站客户端程序请求Web服务器,有HttpWebResponse的对象GetResponseStream()方法获取Web服务器响应的数据信息流,初始化StreamReader对象,使用StreamReader对象的ReadLine()方法获取服务器端响应命令数据,从而完成命令数据的接收。
工作站端接收到操作命令之后,需要按照协议格式进行解析 [5] ,Encoding.UTF8.GetBytes()方法获取传输数据正文,解析得到format,type,parameters对应的参数值。此时,获取的数据类型不是string类型,需使用toString()方法将参数转换为string类型,然后用switch语句匹配数值,执行相应的操作命令。首先获取format的值,匹配得到参数值类型,初始化存放参数值的形式参数。其次获取type的值,得到操作类型。最后获取参数值。模拟人员操作UP软件。以传输模型放大三倍的操作命令为例,操作命令在网络间以二进制流的形式传输,工作站端接收以后,按照固定的HTTP协议格式解析,分别得出format值为3,即传输数据类型为有符号短整型数据;type值为5,即操作方式是缩放模型;parameters的值为+3,即缩放倍数为+3,即为将模型放大3倍。
操作命令经过解析之后,获取到用户要执行的操作,然后向3D打印机控制软件(UP软件)发送控制命令,执行模型编辑操作。如何模拟人员操作UP软件,是本平台要解决的另一个难点。工作站上的UP软件并不存在实际的键盘,我们采用最直接的模拟方法就是:直接伪造一个键盘消息发给目标程序 [6] 。Windows提供了可以直接向目标程序发送消息的API函数,SendMessage()函数。
具体实现方式是,先用FindWindowEx这类API函数找到UP程序的句柄,再向它发送键盘消息。将操作命令发送到UP软件对应的控件,UP软件执行相应的操作。例如UP软件接收到将模型放大三倍的命令,则将数值+3赋值给UP软件对应的缩放控件,模拟人员执行操作。UP执行完模型放大操作之后,将执行结果以图片的形式经过HTTP协议封装,发送给Web服务器,服务器再返回给Web浏览器。
3.3. 操作3D打印机命令的存储
3D打印模型会用于工业、医疗等行业,对模型打印的精准性有很高的要求,因此,必须准确安全的保存用户的操作和选择。但是由于服务器端的内存保护机制,操作命令在服务器临时资源池中并不能存储很长时间,为了防止操作命令丢失,采用数据库服务器的备份进行恢复最初的状态。
3.3.1. 请求命令的存储
操作命令交互表:
userId存储发送命令用户的Id,userIP存储用户发送该命令的当前IP地址,workIP存储接收操作命令的工作站的IP,dataList存储操作命令,new字段存储当前命令是否执行。
用户向服务器发出操作3D打印机命令请求,服务器接收后会在命令交互表中添加新的数据,包括发送请求用户的Id,发送请求用户的当前IP地址,操作命令,是否执行(初始为1,表示未执行)等信息。服务器检查命令交互表相应条目的new值,判断当前的命令是否已发送至工作站,然后修改new字段的值为0 (已执行)。Web服务器端通过判断workIP值是否为空,确定是否已分配编辑模型的权限。获取权限后,用户发送各种编辑命令,保存到命令交互表中相应userId对应的dataList字段中,同时修改new字段的值为1 (未执行),并把数据存储到数据库相应表中,以防止数据的丢失。
3.3.2. 打印状态的存储
状态交互表:
userId存储发送打印命令的用户id,userIP存储用户发送打印命令时的IP地址,workIP存储执行打印命令的工作站的IP地址,dataList存储打印状态,new表示当前打印状态是否被用户查看过。
工作站端会把打印任务当前的状态,以合理的间隔发送到服务器端,服务器端通过检索状态交互表,修改相应条目的dataList值,同时修改new值为1 (未取),然后把数据保存到数据库。
当用户通过Web浏览器发送状态查看请求时,服务器根据用户userId字段检索状态交互表,将new字段值为1的dataList数据发送至浏览器端。
4. 操作3D云打印机命令故障处理
为了保证用户能够正常通过Internet操作3D打印机,我们做了必要的故障预处理工作。操作打印机命令发出后有可能出现异常,客户端与服务器之间网络中断、服务器故障、工作站故障等原因导致控制命令无法被执行。为了保证用户打印命令发出后能够正常被执行,我们做了以下工作:
客户端无法与服务器连接的情况下,用户的编辑命令或者打印命令无法被服务器接收,这种情况下的解决办法只有等待网络恢复之后,再执行编辑操作或者打印操作;
用户打印命令发出后,打印命令会存放在服务器上的临时资源池,同时利用异步存储 [7] 的方式存放在数据库服务器的上的操作命令交互表中,当服务器故障导致静态数据丢失时,可以通过数据库恢复数据;
由于用户打印过程中,打印进度同时是存储在Web服务器端的打印机状态交互表中,所以在工作站故障的情况下,打印状态保存在数据库服务器上,待工作站恢复工作之后,可以从数据库中找回打印状态,继续执行打印操作。
5. 结论
3D服务平台的打印命令开始由用户通过Web浏览器发送,将用户操作封装成为一种易于网络传输的格式,经过Web服务器传送至工作站,工作站接收到操作命令之后按照协议格式进行解析,然后模拟人员操作UP软件,执行操作命令。工作站利用UP软件连接打印设备,执行打印命令。Web浏览器与Web服务器之间通过网络进行命令的传送;工作站与打印设备之间命令的流转依靠UP软件作为打印机的驱程;而Web服务器与工作站之间命令的流转,则依靠在工作站的守护进程。工作站的实现保证了整个3D服务平台命令流转的畅通。
基金项目
天津市自然科学基金资助项目(No. 12ZCDZGX46500)、(No. 13ZCZDGX01108)、(13ZCZDGX02500)。