From ae98f8d6965e41ff321ad6f527ecbf9f6d51e6a5 Mon Sep 17 00:00:00 2001
From: Neil Gershenfeld <gersh@cba.mit.edu>
Date: Sat, 16 Sep 2017 17:35:04 -0400
Subject: [PATCH] working on servers
---
files.html | 18 ++---
js/printserver.js | 145 ++++++++++++++++++++++++++++++++++++++
js/serialserver.js | 172 +++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 327 insertions(+), 8 deletions(-)
create mode 100644 js/printserver.js
create mode 100644 js/serialserver.js
diff --git a/files.html b/files.html
index ccb783e..56c2375 100644
--- a/files.html
+++ b/files.html
@@ -9,26 +9,28 @@
}
</script>
<i> .git</i><br>
+ <a href='./.gitignore'>.gitignore</a><br>
<a href='./README.md'>README.md</a><br>
<a href='./files.html'>files.html</a><br>
<a href='./index.html'>index.html</a><br>
<i> js</i><br>
-<i> Windows</i><br>
-<i> node_modules</i><br>
- <a href='./js/Windows/printserverWin.js'>printserverWin.js</a><br>
- <a href='./js/echoserver.js'>echoserver.js</a><br>
- <a href='./js/evalserver.js'>evalserver.js</a><br>
<a href='./js/files.js'>files.js</a><br>
- <a href='./js/fileserver.js'>fileserver.js</a><br>
<a href='./js/load.js'>load.js</a><br>
<a href='./js/mods.js'>mods.js</a><br>
<i> node_modules</i><br>
- <a href='./js/printerserver.js'>printerserver.js</a><br>
+<i> old_servers</i><br>
+ <a href='./js/old_servers/echoserver.js'>echoserver.js</a><br>
+ <a href='./js/old_servers/evalserver.js'>evalserver.js</a><br>
+ <a href='./js/old_servers/fileserver.js'>fileserver.js</a><br>
+ <a href='./js/old_servers/printerserver.js'>printerserver.js</a><br>
+ <a href='./js/old_servers/printserver.js'>printserver.js</a><br>
+ <a href='./js/old_servers/printserverWin.js'>printserverWin.js</a><br>
+ <a href='./js/old_servers/serialserver.js'>serialserver.js</a><br>
+ <a href='./js/old_servers/udpserver.js'>udpserver.js</a><br>
<a href='./js/printserver.js'>printserver.js</a><br>
<a href='./js/serialserver.js'>serialserver.js</a><br>
<i> three.js</i><br>
<a href='./js/three.js/three.min.js'>three.min.js</a><br>
- <a href='./js/udpserver.js'>udpserver.js</a><br>
<a href='./make'>make</a><br>
<i> modules</i><br>
<i> apa</i><br>
diff --git a/js/printserver.js b/js/printserver.js
new file mode 100644
index 0000000..d8a353c
--- /dev/null
+++ b/js/printserver.js
@@ -0,0 +1,145 @@
+//
+// printserver.js
+// WebSocket print server
+//
+// dependencies:
+// npm install printer ws
+// Windows
+// npm install --global windows-build-tools
+// Linux
+// sudo apt-get install node-gyp
+// sudo apt-get install libcups2-dev
+//
+// Neil Gershenfeld
+// (c) Massachusetts Institute of Technology 2017
+//
+// This work may be reproduced, modified, distributed, performed, and
+// displayed for any purpose, but must acknowledge the mods
+// project. Copyright is retained and must be preserved. The work is
+// provided as is no warranty is provided, and users accept all
+// liability.
+//
+// check command line
+//
+if (process.argv.length < 4) {
+ console.log("command line: node printserver.js client_address server_port")
+ process.exit(-1)
+ }
+//
+// start server
+//
+var client_address = process.argv[2]
+var server_port = process.argv[3]
+console.log("listening for connection from client address "+client_address+" on server port "+server_port)
+//
+// requires
+//
+var printer = require("printer")
+//var util = require('util')
+var WebSocketServer = require('ws').Server
+//
+// start WebSocket server
+//
+wss = new WebSocketServer({port:server_port})
+//
+// handle connection
+//
+wss.on('connection',function(ws) {
+ //
+ // check address
+ //
+ if (!ws._socket.remoteAddress) {
+ console.log("connection rejected from "+ws._socket.remoteAddress)
+ ws.send('socket closed')
+ ws.close()
+ }
+ else {
+ console.log("connection accepted from "+ws._socket.remoteAddress)
+ }
+ //
+ // handle messages
+ //
+ var cancel
+ var pagesPrinted
+ ws.on("message",function(msg) {
+ //
+ // cancel job
+ //
+ if (msg == 'cancel') {
+ cancel = true
+ }
+ //
+ // start job
+ //
+ else {
+ pagesPrinted = 0
+ var printerName = printer.getDefaultPrinterName()
+ var job = JSON.parse(msg)
+ console.log('writing ' + job.name + ' (length ' + job.contents.length + ') to printer ' + printerName)
+ console.log(job.contents)
+ cancel = false
+ print()
+ //
+ // print all
+ //
+ function print() {
+ printer.printDirect({data:job.contents
+ //, printer:'Roland GS-24' // printer name, if missing then will print to default printer
+ //, printer: job.device
+ , type: 'RAW' // type: RAW, TEXT, PDF, JPEG, .. depends on platform
+ , success: function (jobID) {
+ console.log("sent to printer with ID: " + jobID)
+ check_process()
+ //
+ // Check process
+ //
+ function check_process() {
+ var jobInfo
+ try {
+ jobInfo = printer.getJob(printerName, jobID)
+ } catch (err) {
+ ws.send('done')
+ return
+ }
+
+ pagesPrinted = jobInfo.pagesPrinted
+ console.log("current job info:" + util.inspect(jobInfo, { depth: 10, colors: true }))
+ if (jobInfo.status.indexOf('PRINTED') !== -1) {
+ ws.send('done')
+ return
+ }
+
+ //
+ // cancel
+ //
+ if (cancel) {
+ console.log('cancelling...')
+ ws.send('cancel')
+ var is_ok = printer.setJob(printerName, jobID, 'CANCEL')
+ console.log("cancelled: " + is_ok)
+ }
+ //
+ // continue
+ //
+ else {
+ ws.send(jobInfo.status[0])
+ setTimeout(check_process, 1000)
+ }
+ }
+ }
+ , error:function(err){
+ console.log(err)
+ ws.send('error '+err+' 0 '+ 0)
+ }
+ })
+
+ }
+ }
+ })
+ //
+ // close
+ //
+ ws.on("close",function() {
+ console.log("connection closed")
+ })
+ })
diff --git a/js/serialserver.js b/js/serialserver.js
new file mode 100644
index 0000000..1c3c019
--- /dev/null
+++ b/js/serialserver.js
@@ -0,0 +1,172 @@
+//
+// serialserver.js
+// WebSocket serial server
+//
+// Neil Gershenfeld
+// (c) Massachusetts Institute of Technology 2016
+//
+// This work may be reproduced, modified, distributed, performed, and
+// displayed for any purpose, but must acknowledge the mods
+// project. Copyright is retained and must be preserved. The work is
+// provided as is; no warranty is provided, and users accept all
+// liability.
+//
+// check command line
+//
+if (process.argv.length < 4) {
+ console.log("command line: node serialserver.js client_address server_port")
+ process.exit(-1)
+ }
+//
+// start server
+//
+var client_address = process.argv[2]
+var server_port = process.argv[3]
+console.log("listening for connection from client address "+client_address+" on server port "+server_port)
+var SerialPort = require('serialport')
+var port = null
+var WebSocketServer = require('ws').Server
+wss = new WebSocketServer({port:server_port})
+//
+// handle connection
+//
+wss.on('connection',function(ws) {
+ //
+ // check address
+ //
+ if (ws._socket.remoteAddress != client_address) {
+ console.log("connection rejected from "+ws._socket.remoteAddress)
+ ws.send('socket closed')
+ ws.close()
+ }
+ else {
+ console.log("connection accepted from "+ws._socket.remoteAddress)
+ }
+ //
+ // handle messages
+ //
+ var cancel
+ ws.on("message",function(message) {
+ var msg = JSON.parse(message)
+ //
+ // open port
+ //
+ if (msg.type == 'open') {
+ var device = msg.device
+ var baud = parseInt(msg.baud)
+ var flow = msg.flow
+ console.log('open '+device+' at '+baud+' flow '+flow)
+ if (flow == 'none')
+ port = new SerialPort(device,{baudRate:baud,parser:SerialPort.parsers.byteLength(1)})
+ else if (flow == 'rtscts')
+ port = new SerialPort(device,{baudRate:baud,parser:SerialPort.parsers.byteLength(1),rtscts:true})
+ port.on('open',function() {
+ ws.send('serial port opened')
+ if (flow == 'dsrdtr') {
+ port.set({dsr:true,dtr:true})
+ port.set({rts:false,cts:false})
+ }
+ })
+ port.on('error',function(err) {
+ ws.send(err.message)
+ })
+ port.on('data',function(data) {
+ ws.send(data.toString('binary'))
+ })
+ }
+ //
+ // close port
+ //
+ else if (msg.type == 'close') {
+ var device = msg.device
+ console.log('close '+device)
+ ws.send('serial port closed')
+ port.close()
+ port = null
+ }
+ //
+ // send string
+ //
+ else if (msg.type == 'string') {
+ console.log(msg.string)
+ port.write(msg.string,function(){
+ port.drain(function(err){
+ if (err)
+ ws.send(err.message)
+ })
+ })
+ }
+ //
+ // send command
+ //
+ else if (msg.type == 'command') {
+ console.log(msg.contents)
+ port.write(msg.contents,function(){
+ port.drain(function(err){
+ if (err)
+ ws.send(err.message)
+ else
+ ws.send('done')
+ })
+ })
+ }
+ //
+ // cancel job
+ //
+ if (msg.type == 'cancel') {
+ cancel = true
+ }
+ //
+ // send file
+ //
+ else if (msg.type == 'file') {
+ var count = 0
+ console.log('writing '+msg.name+' length '+msg.contents.length)
+ cancel = false
+ write_char()
+ //
+ // character writer
+ //
+ function write_char() {
+ //
+ // cancel
+ //
+ if (cancel) {
+ console.log('cancel')
+ ws.send('cancel')
+ }
+ //
+ // continue
+ //
+ else {
+ port.write(msg.contents[count],function(){
+ port.drain(function(err){
+ if (err)
+ ws.send('error '+err.message)
+ else {
+ ws.send((count+1)+'/'+msg.contents.length)
+ count += 1
+ if (count < msg.contents.length)
+ write_char()
+ else {
+ console.log('done')
+ ws.send('done')
+ }
+ }
+
+ })
+ })
+ }
+ }
+ }
+ })
+ //
+ // close
+ //
+ ws.on("close",function() {
+ console.log("connection closed")
+ if (port != null)
+ port.close()
+ port = null
+ })
+ })
--
GitLab