change protocol to WebSocket

This commit is contained in:
Sabina Abdiganieva 2024-01-19 02:58:17 +03:00
parent 2177dd5b42
commit 9f60c14bd9
5 changed files with 75 additions and 43 deletions

View File

@ -19,6 +19,7 @@ dependencies {
testImplementation("org.junit.jupiter:junit-jupiter") testImplementation("org.junit.jupiter:junit-jupiter")
implementation("io.ktor:ktor-server-core:2.3.7") implementation("io.ktor:ktor-server-core:2.3.7")
implementation("io.ktor:ktor-server-netty:2.3.7") implementation("io.ktor:ktor-server-netty:2.3.7")
implementation("io.ktor:ktor-server-websockets:2.3.7")
api(project(":numass-control:vac")) api(project(":numass-control:vac"))
api(project(":dataforge-core:dataforge-json")) api(project(":dataforge-core:dataforge-json"))

View File

@ -9,18 +9,60 @@ import io.ktor.server.http.content.*
import io.ktor.server.netty.* import io.ktor.server.netty.*
import io.ktor.server.response.* import io.ktor.server.response.*
import io.ktor.server.routing.* import io.ktor.server.routing.*
import io.ktor.server.websocket.*
import io.ktor.websocket.*
import javafx.application.Application import javafx.application.Application
import javafx.stage.Stage import javafx.stage.Stage
import java.io.ByteArrayOutputStream
import java.nio.file.Paths import java.nio.file.Paths
import java.util.*
import java.util.concurrent.atomic.AtomicInteger
class Connection(val session: DefaultWebSocketServerSession) {
companion object {
val lastId = AtomicInteger(0)
}
val name = "user${lastId.getAndIncrement()}"
}
class ReadVacSvr : ReadVac() { class ReadVacSvr : ReadVac() {
var server : NettyApplicationEngine? = null var server : NettyApplicationEngine? = null
var clickNumber = 0
override fun start(stage: Stage) { override fun start(stage: Stage) {
super.start(stage) super.start(stage)
this.server = embeddedServer(Netty, port = 8000) { this.server = embeddedServer(Netty, port = 8000) {
install(WebSockets)
routing { routing {
staticFiles("/", Paths.get(this.javaClass.classLoader.getResource("index.html").toURI()).toFile().parentFile) staticFiles("/", Paths.get(this.javaClass.classLoader.getResource("index.html").toURI()).toFile().parentFile)
val connections = Collections.synchronizedSet<Connection?>(LinkedHashSet())
webSocket("/echo") {
val thisConnection = Connection(this)
connections += thisConnection
try {
// Sending device list
val stream = ByteArrayOutputStream()
JSONMetaWriter.write(stream, this@ReadVacSvr.getDeviceMeta(this@ReadVacSvr.getDeviceConfig()))
send("{ \"devices\": $stream }")
for (frame in incoming) {
frame as? Frame.Text ?: continue
val receivedText = frame.readText()
when (receivedText) {
"" -> {
println("button was pressed")
connections.forEach {
it.session.send("{ \"measurement\" : true}")
}
}
"bye" -> close(CloseReason(CloseReason.Codes.NORMAL, "Client said BYE"))
}
}
} catch (e: Exception) {
println(e.localizedMessage)
} finally {
println("Removing $thisConnection")
connections -= thisConnection
}
}
get ("/api") { get ("/api") {
call.respondText(call.parameters.toString()) call.respondText(call.parameters.toString())
} }
@ -29,9 +71,6 @@ class ReadVacSvr : ReadVac() {
JSONMetaWriter.write(this, this@ReadVacSvr.getDeviceMeta(this@ReadVacSvr.getDeviceConfig())) JSONMetaWriter.write(this, this@ReadVacSvr.getDeviceMeta(this@ReadVacSvr.getDeviceConfig()))
} }
} }
get ("/api/clicker") {
call.respondText(this@ReadVacSvr.clickNumber++.toString())
}
} }
} }

View File

@ -8,16 +8,8 @@
</head> </head>
<body> <body>
<div class="toolbar"> <div class="toolbar">
<button id="measure" type="button" class="myButton toolbarButton" onclick="measurement()">Measure</button> <button id="measure" type="button" class="myButton toolbarButton">Measure</button>
<button id="store" type="button" class="myButton toolbarButton" onclick="storage()">Store</button> <button id="store" type="button" class="myButton toolbarButton">Store</button>
<span class="vl"></span>
Update interval:
<input type="radio" value="1" name="interval" checked />
<input type="radio" value="5" name="interval" />
<input type="radio" value="10" name="interval" />
<input type="radio" value="15" name="interval" />
<button id="log" type="button" class="logButton toolbarButton">Log</button> <button id="log" type="button" class="logButton toolbarButton">Log</button>
</div> </div>

View File

@ -1,23 +1,3 @@
function clickCounter(e) {
fetch("/api/clicker")
.then((response) => response.text())
.then((text) => { document.querySelector("#click1").innerHTML=text } )
}
function measurement(e) {
console.log("measure")
}
function storage(e) {
console.log("storage")
}
function cycle() {
console.log("asdffg")
setTimeout(cycle, document.querySelector("input[name='interval']:checked").value * 1000)
}
// Creates device card // Creates device card
function drawCard(device_name = "Default", col = "red", measure = "---", power = false) { function drawCard(device_name = "Default", col = "red", measure = "---", power = false) {
let card = document.createElement("div") let card = document.createElement("div")
@ -41,7 +21,7 @@ function drawCard(device_name = "Default", col = "red", measure = "---", power =
let middleSection = document.createElement("div") let middleSection = document.createElement("div")
middleSection.classList = "middleSection" middleSection.classList = "middleSection"
let measurement = document.createElement("span") let measurement = document.createElement("span")
measurement.classList = "measure" measurement.classList = "measureValue"
measurement.textContent = measure measurement.textContent = measure
measurement.style.color = col measurement.style.color = col
let mbar = document.createElement("span") let mbar = document.createElement("span")
@ -67,10 +47,20 @@ function drawCard(device_name = "Default", col = "red", measure = "---", power =
} }
document.querySelector("#sidebar").appendChild(card) document.querySelector("#sidebar").appendChild(card)
} }
var devices = [] var devices = []
const nuWebSocket = new WebSocket("ws://" + window.location.host + "/echo")
//document.querySelector("#click1").addEventListener('click', clickCounter) nuWebSocket.onmessage = (event) => {
console.log(event.data)
const msg = JSON.parse(event.data)
if (msg.devices) {
msg.devices.sensor.forEach((device) => {
devices.push(device.name)
drawCard(device.name, device.color, "---", (device.sensorType == "mks") )
})
}
// if (msg.)
}
/*
fetch("/api/devices") fetch("/api/devices")
.then((response) => response.json()) .then((response) => response.json())
.then((json) => { .then((json) => {
@ -80,7 +70,7 @@ fetch("/api/devices")
drawCard(device.name, device.color, "---", (device.sensorType == "mks") ) drawCard(device.name, device.color, "---", (device.sensorType == "mks") )
}) })
}) })
*/
var data = [] var data = []
var layout = { var layout = {
@ -93,6 +83,16 @@ var layout = {
}; };
Plotly.newPlot('plot', data, layout, { responsive: true }); Plotly.newPlot('plot', data, layout, { responsive: true });
console.log(devices)
//drawCard() document.querySelector("#measure").addEventListener("click", (e) => {
cycle() nuWebSocket.send("pressed")
console.log("pressed")
})
let onClick = null
let click = () -> { ... onClick("myBotton") }
onClick = (name) => { console.log("Button " + name + " pressed") };
click() // Button myButton pressed
onClick = (name) => { console.log("Button " + name + " pressed!!!") };
click() // Button myButton pressed!!!

View File

@ -120,7 +120,7 @@ input.switch:checked:before {
padding-right: 0.8em; padding-right: 0.8em;
} }
.measure { .measureValue {
font-size: 2.5em; font-size: 2.5em;
} }