/** * Websocket interface for building control unit * $Id$ * $HeadURL$ * $Author$ * Created by Christian Ehrlicher, SLSE, 2017-01-30 */ #include "web_socket_handler.h" #include "guez_nasat_telegrams.h" #include /* python: import websocket import json import time ws = websocket.create_connection("ws://127.0.0.1:8420") ws.recv() ws.recv() aircraftId == NasatId uuid, wird wohl ignoriert d = { 'type' : 'NasatPosition', 'data': {'aircraftId': 1, 'timestamp': -1, 'position': { 'lat': 53.0654, 'lon': 8.9804, 'height': 1000 } } } d = { 'type' : 'NasatPosition', 'data': {'aircraftId': 1234, 'timestamp': -1, 'position': { 'lat': 53.0000, 'lon': 8.9704, 'height': 1000 } } } d = { 'type' : 'NasatWeaponRelease', 'data': {'aircraftId': 1234, 'timestamp': -1, 'impactPosition': { 'lat': 53.1000, 'lon': 8.9704 }, 'flightTime': 50, 'munition': 1, 'fuseType': 1, 'releaseMode': 1 } } // May 2020: d = { 'type' : 'NasatPosition', 'data': {'aircraftId': 1, 'timestamp': -1, 'position': { 'lat': 53.0653, 'lon': 8.9704, 'height': 1000 } } } // org d = {'data':{'aircraftId':6,'altitudeTarget':55,'altitudeTargetMode':1, 'distance2InitialPointMode':1,'distanceInitialPoint2Target':925.9999956432568,'finalAttackHeading':{'heading':120,'headingHigh':270,'headingLow':10},'finalAttackHeadingMode':2,'friendlies':{'bearing':88,'distance':333.6000442504983}, 'heading2InitialPointMode':2,'headingInitialPoint2Target':315,'initialPoint':{'lat':52.477682630051689,'lon':11.597559126751433}, 'initialPointMode':1,'modeFriendlies':1,'targetPosition':{'lat':33.47476840055018,'lon':11.589788466760311},'targetPositionMode':1,'timeForTarget':57600,'timeForTargetMode':2,'timestamp':1589384815.5303969},'type':'NasatNineLiner','uuid':'blasdbasd-kjladjaslasdklj'} d = {'data':{'aircraftId':4711,'altitudeTarget':55,'altitudeTargetMode':1, 'distance2InitialPointMode':1,'distanceInitialPoint2Target':925.9999956432568,'finalAttackHeading':{'heading':120,'headingHigh':270,'headingLow':10},'finalAttackHeadingMode':2,'friendlies':{'bearing':88,'distance':333.6000442504983}, 'heading2InitialPointMode':2,'headingInitialPoint2Target':315,'initialPoint':{'lat':52.477682630051689,'lon':11.597559126751433}, 'initialPointMode':1,'modeFriendlies':1,'targetPosition':{'lat':33.47476840055018,'lon':11.589788466760311},'targetPositionMode':1,'timeForTarget':57600,'timeForTargetMode':2,'timestamp':1589384815.5303969},'type':'NasatNineLiner','uuid':'blasdbasd-kjladjaslasdklj'} // Bremen d = {'data':{'aircraftId':1,'altitudeTarget':55,'altitudeTargetMode':1, 'distance2InitialPointMode':1,'distanceInitialPoint2Target':925.9999956432568,'finalAttackHeading':{'heading':120,'headingHigh':270,'headingLow':10},'finalAttackHeadingMode':2,'friendlies':{'bearing':88,'distance':333.6000442504983}, 'heading2InitialPointMode':2,'headingInitialPoint2Target':315,'initialPoint':{'lat':52.477682630051689,'lon':11.597559126751433}, 'initialPointMode':1,'modeFriendlies':1,'targetPosition':{'lat':33.47476840055018,'lon':11.589788466760311},'targetPositionMode':1,'timeForTarget':57600,'timeForTargetMode':2,'timestamp':1589384815.5303969},'type':'NasatNineLiner','uuid':'blasdbasd-kjladjaslasdklj'} d = {'data':{'aircraftId':1,'altitudeTarget':55,'altitudeTargetMode':1, 'distance2InitialPointMode':1,'distanceInitialPoint2Target':925.9,'finalAttackHeading':{'heading':120,'headingHigh':270,'headingLow':10},'finalAttackHeadingMode':2,'friendlies':{'bearing':88,'distance':333.6}, 'heading2InitialPointMode':2,'headingInitialPoint2Target':315,'initialPoint':{'lat':53.06,'lon':8.97}, 'initialPointMode':1,'modeFriendlies':1,'targetPosition':{'lat':53.06,'lon':8.971},'targetPositionMode':1,'timeForTarget':57600,'timeForTargetMode':2,'timestamp':-1},'type':'NasatNineLiner','uuid':'blasdbasd-kjladjaslasdklj'} d = {'data':{'aircraftId':1,'altitudeTarget':55,'altitudeTargetMode':1, 'distance2InitialPointMode':1,'distanceInitialPoint2Target':725.9999956432568,'finalAttackHeading':{'heading':120,'headingHigh':270,'headingLow':10},'finalAttackHeadingMode':2,'friendlies':{'bearing':88,'distance':333.6000442504983}, 'heading2InitialPointMode':2,'headingInitialPoint2Target':315,'initialPoint':{'lat':52.477682630051689,'lon':11.597559126751433}, 'initialPointMode':1,'modeFriendlies':1,'targetPosition':{'lat':33.47476840055018,'lon':11.589788466760311},'targetPositionMode':1,'timeForTarget':57600,'timeForTargetMode':2,'timestamp':1589384815.5303969},'type':'NasatNineLiner','uuid':'blasdbasd-kjladjaslasdklj'} d = {'data':{'aircraftId':1,'altitudeTarget':56,'altitudeTargetMode':1, 'distance2InitialPointMode':1,'distanceInitialPoint2Target':925.9,'finalAttackHeading':{'heading':120,'headingHigh':270,'headingLow':10},'finalAttackHeadingMode':2,'friendlies':{'bearing':88,'distance':333.6}, 'heading2InitialPointMode':2,'headingInitialPoint2Target':315,'initialPoint':{'lat':53.06,'lon':8.97}, 'initialPointMode':1,'modeFriendlies':1,'targetPosition':{'lat':53.06,'lon':8.971},'targetPositionMode':1,'timeForTarget':57600,'timeForTargetMode':2,'timestamp':-1},'type':'NasatNineLiner','uuid':'blasdbasd-kjladjaslasdklj'} // 2021-01-15 12:13:33.027 DEBUG GNA::TcpSocketHandler |#| incoming telegram: {"data":{"aircraftId":99,"flightTime":5.3000001907348633,"fuseType":1,"impactPosition":{"lat":52.473540999999997,"lon":11.582856},"munition":2,"releaseMode":0,"timestamp":1610712812.968688},"type":"NasatWeaponRelease","uuid":"3d564e8c-b3a0-4687-a365-0893cf84c26e"} (/Lts/Proxies/GuezNasat/abstract_socket_handler.cpp:53) // flightTime -> Flugzeit des Geschosses vom AusklingPunkt bis zum Einschlag!?! d = {'data':{'aircraftId':99,'flightTime':5.3000001907348633,'fuseType':1,'impactPosition':{'lat':52.473540999999997,'lon':11.582856},'munition':2,'releaseMode':0,'timestamp':-1},'type':'NasatWeaponRelease','uuid':'Blalaa'} d = f"Hallo" ws.send(json.dumps(d)) ws.close() */ /* switch tp Filips simulator: -- simulate movement: python nasat_simulator.py -a1 ^ aircraft Id -- simulate NineLiner: -- uses nine_liner_template.json and the embedded tele. But teleTYPE has to be specified explicit: python nasat_simulator.py -a1 -f nine_liner_template.json -t NasatNineLiner -- simulate NasatWeaponRelease: uses XY.json and the embedded tele. But teleTYPE has to be specified explicit: (small distance of NineLiner and Impact of NasatWeaponRelease is intended) python nasat_simulator.py -a1 -f nasat_weapon_release_template.json -t NasatWeaponRelease */ namespace GuezNasat { WebSocketHandler::WebSocketHandler(QObject *parent) : AbstractSocketHandler("WebSocketHandler", parent) , m_webSocketServer(new QWebSocketServer(QStringLiteral("GNA"), QWebSocketServer::NonSecureMode, this)) { TRACE_LOG(m_logger) << LOGFUNCTION << " START"; TRACE_LOG(m_logger) << LOGFUNCTION << " END"; } WebSocketHandler::~WebSocketHandler() { TRACE_LOG(m_logger) << LOGFUNCTION << " START"; for (auto s : qAsConst(m_webSockets)) { s->disconnect(this); s->close(); } qDeleteAll(m_webSockets); TRACE_LOG(m_logger) << LOGFUNCTION << " END"; } bool WebSocketHandler::init(quint16 listenPort) { TRACE_LOG(m_logger) << LOGFUNCTION << " START, listenPort=" << listenPort; if (!m_webSocketServer->listen(QHostAddress::Any, listenPort)) { WARNING_LOG(m_logger) << "Cannot listen on port " << listenPort << " - aborting"; return false; } DEBUG_LOG(m_logger) << "Listening on port " << listenPort; connect(m_webSocketServer, &QWebSocketServer::newConnection, this, &WebSocketHandler::onNewConnection); TRACE_LOG(m_logger) << LOGFUNCTION << " END, listenPort=" << listenPort; return true; } void WebSocketHandler::onNewConnection() { TRACE_LOG(m_logger) << LOGFUNCTION << " START"; QWebSocket *ws = m_webSocketServer->nextPendingConnection(); if (!ws) return; NOTICE_LOG(m_logger) << "New websocket connection from " << ws->peerAddress().toString() << ":" << ws->peerPort() << ", ptr: " << ws; connect(ws, &QWebSocket::textMessageReceived, this, &WebSocketHandler::onTextMessageReceived); connect(ws, &QWebSocket::disconnected, this, &WebSocketHandler::onWebSocketDisconnected); m_webSockets += ws; TRACE_LOG(m_logger) << LOGFUNCTION << " END"; } bool WebSocketHandler::sendTelegramInternal(const QByteArray &tele) { const QString msg = QString::fromUtf8(tele); bool bOk = false; for (QWebSocket *ws : qAsConst(m_webSockets)) { if (ws->sendTextMessage(msg)) bOk = true; } return bOk; } void WebSocketHandler::onTextMessageReceived(const QString &msg) { TRACE_LOG(m_logger) << LOGFUNCTION << " START, msg='" << msg << "'"; const QByteArray baJson = msg.toUtf8(); textMessageReceived(baJson); TRACE_LOG(m_logger) << LOGFUNCTION << " END, msg='" << msg << "'"; } void WebSocketHandler::onWebSocketDisconnected() { TRACE_LOG(m_logger) << LOGFUNCTION << " START"; QWebSocket *ws = qobject_cast(sender()); if (!ws) return; NOTICE_LOG(m_logger) << "Websocket connection closed, ptr: " << ws; m_webSockets.remove(ws); ws->deleteLater(); TRACE_LOG(m_logger) << LOGFUNCTION << " END"; } } // namespace GuezNasat