Skip to content
Snippets Groups Projects
Commit 88513ff4 authored by Sylvain Renault's avatar Sylvain Renault
Browse files

Some trst implementation for REST.

First websocket functions (register, send poses...)
parent f2663162
No related branches found
No related tags found
2 merge requests!2Some trst implementation for REST.,!1Some trst implementation for REST.
Showing with 187 additions and 27 deletions
...@@ -53,7 +53,22 @@ namespace ETSI.ARF.OpenAPI.WorldAnalysis.Controllers ...@@ -53,7 +53,22 @@ namespace ETSI.ARF.OpenAPI.WorldAnalysis.Controllers
/// </summary> /// </summary>
public override IActionResult GetCapabilities([FromHeader (Name = "token")]string token, [FromHeader (Name = "sessionID")]string sessionID) public override IActionResult GetCapabilities([FromHeader (Name = "token")]string token, [FromHeader (Name = "sessionID")]string sessionID)
{ {
return StatusCode(405, "Not supported yet!"); // Get all capabilities from all anchors/trackables
// test
Capability capability = new Capability();
capability.Framerate = 24;
capability.Latency = 0;
capability.TrackableType = TrackableType.FIDUCIALMARKEREnum;
// Create list
List<Capability> capabilities = new List<Capability>();
capabilities.Add(capability);
// Create repsonse object
GetCapabilities200Response response = new GetCapabilities200Response();
response.Capabilities = capabilities;
return new ObjectResult(response);
//return StatusCode(405, "Not supported yet!");
} }
/// <summary> /// <summary>
...@@ -61,7 +76,12 @@ namespace ETSI.ARF.OpenAPI.WorldAnalysis.Controllers ...@@ -61,7 +76,12 @@ namespace ETSI.ARF.OpenAPI.WorldAnalysis.Controllers
/// </summary> /// </summary>
public override IActionResult GetSupport([FromRoute (Name = "trackableOrAnchorUUID")][Required]Guid trackableOrAnchorUUID, [FromHeader (Name = "token")]string token, [FromHeader (Name = "sessionID")]string sessionID) public override IActionResult GetSupport([FromRoute (Name = "trackableOrAnchorUUID")][Required]Guid trackableOrAnchorUUID, [FromHeader (Name = "token")]string token, [FromHeader (Name = "sessionID")]string sessionID)
{ {
return StatusCode(405, "Not supported yet!"); Capability capability = new Capability();
capability.Framerate = 24;
capability.Latency = 0;
capability.TrackableType = TrackableType.FIDUCIALMARKEREnum;
return (null != capability) ? new ObjectResult(capability) : StatusCode(404, "Not found, could not find capability for UUID: " + trackableOrAnchorUUID);
//return StatusCode(405, "Not supported yet!");
} }
} }
} }
...@@ -85,7 +85,14 @@ namespace ETSI.ARF.OpenAPI.WorldAnalysis.Controllers ...@@ -85,7 +85,14 @@ namespace ETSI.ARF.OpenAPI.WorldAnalysis.Controllers
/// </summary> /// </summary>
public override IActionResult SubscribeToPose([FromBody]SubscribeToPoseRequest subscribeToPoseRequest, [FromHeader (Name = "token")]string token, [FromHeader (Name = "sessionID")]string sessionID) public override IActionResult SubscribeToPose([FromBody]SubscribeToPoseRequest subscribeToPoseRequest, [FromHeader (Name = "token")]string token, [FromHeader (Name = "sessionID")]string sessionID)
{ {
return StatusCode(405, "Not supported yet!"); SubscribeToPose200Response response = new SubscribeToPose200Response();
response.Target = subscribeToPoseRequest.Target;
response.Mode = subscribeToPoseRequest.Mode[0];
response.WebhookUrl = subscribeToPoseRequest.WebhookUrl;
response.WebsocketUrl = Request.Host.ToString(); ;
return new ObjectResult(response);
//return StatusCode(405, "Not supported yet!");
} }
/// <summary> /// <summary>
......
...@@ -31,6 +31,8 @@ using Microsoft.AspNetCore.Http; ...@@ -31,6 +31,8 @@ using Microsoft.AspNetCore.Http;
using Swashbuckle.AspNetCore.Annotations; using Swashbuckle.AspNetCore.Annotations;
using Swashbuckle.AspNetCore.SwaggerGen; using Swashbuckle.AspNetCore.SwaggerGen;
using ETSI.ARF.OpenAPI.WorldAnalysis.Models;
#pragma warning disable CS1591 // Fehlendes XML-Kommentar fr ffentlich sichtbaren Typ oder Element #pragma warning disable CS1591 // Fehlendes XML-Kommentar fr ffentlich sichtbaren Typ oder Element
namespace ETSI.ARF.OpenAPI.WorldStorage.Services namespace ETSI.ARF.OpenAPI.WorldStorage.Services
{ {
...@@ -40,6 +42,11 @@ namespace ETSI.ARF.OpenAPI.WorldStorage.Services ...@@ -40,6 +42,11 @@ namespace ETSI.ARF.OpenAPI.WorldStorage.Services
// //
public class WebSocketController : ControllerBase public class WebSocketController : ControllerBase
{ {
private string currentName = "";
private bool registered = false;
private bool firstTime = true;
private int timeCnt = 3;
[HttpGet("/ws")] [HttpGet("/ws")]
public async Task Get() public async Task Get()
{ {
...@@ -47,12 +54,14 @@ namespace ETSI.ARF.OpenAPI.WorldStorage.Services ...@@ -47,12 +54,14 @@ namespace ETSI.ARF.OpenAPI.WorldStorage.Services
{ {
using var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync(); using var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync();
if (webSocket.State == WebSocketState.Open) if (webSocket.State == WebSocketState.Connecting)
{ {
// Response an OK message // Response an OK message
await SendText(webSocket, "Hello, here is the ARF World Analysis services!");
} }
await Echo(HttpContext, webSocket); else if (webSocket.State == WebSocketState.Open)
{
await HandleClientData(HttpContext, webSocket);
}
} }
else else
{ {
...@@ -76,17 +85,22 @@ namespace ETSI.ARF.OpenAPI.WorldStorage.Services ...@@ -76,17 +85,22 @@ namespace ETSI.ARF.OpenAPI.WorldStorage.Services
// //
// Send the time all seconds // Send the time all seconds
// //
//[HttpGet("/ws/time")]
private async Task SendTime(WebSocket webSocket) private async Task SendTime(WebSocket webSocket)
{ {
while (true) while (true)
{ {
var message = "Hello, my time is: " + DateTime.Now.ToLocalTime(); var message = "ARF World Analysis Server, Time = " + DateTime.Now.ToLocalTime();
var bytes = Encoding.UTF8.GetBytes(message);
var arraySegment = new ArraySegment<byte>(bytes, 0, bytes.Length);
if (webSocket.State == WebSocketState.Open) if (webSocket.State == WebSocketState.Open)
{ {
await webSocket.SendAsync(arraySegment, WebSocketMessageType.Text, true, CancellationToken.None); timeCnt--;
if (timeCnt < 0)
{
await SendText(webSocket, "Stop");
break;
}
else await SendText(webSocket, message);
} }
else if (webSocket.State == WebSocketState.Closed || webSocket.State == WebSocketState.Aborted) else if (webSocket.State == WebSocketState.Closed || webSocket.State == WebSocketState.Aborted)
{ {
...@@ -96,28 +110,145 @@ namespace ETSI.ARF.OpenAPI.WorldStorage.Services ...@@ -96,28 +110,145 @@ namespace ETSI.ARF.OpenAPI.WorldStorage.Services
} }
} }
// float rotInc = 0;
// Echo incoming messages private async Task SendPose(WebSocket webSocket)
// {
private async Task Echo(HttpContext context, WebSocket webSocket) while (true)
{
if (webSocket.State == WebSocketState.Open)
{
timeCnt--;
if (timeCnt < 0)
{
await SendText(webSocket, "Stop");
break;
}
else
{
PoseValue val = new PoseValue();
val.Unit = UnitSystem.MEnum;
val.Position = new List<float>() { 1, 2, 3 };
val.Rotation = new List<float>() { rotInc, 0, 0, 0 };
rotInc += 0.01f;
Pose pose = new Pose();
pose.Uuid = new Guid();
pose.EstimationState = Pose.EstimationStateEnum.OKEnum;
//pose.SubscriptionUrl = "";
pose.Value = val;
pose.Timestamp = (int)DateTime.Now.ToFileTime();
pose.Confidence = 1;
pose.Mode = ModeWorldAnalysis.DEVICETOTRACKABLESEnum;
string json = pose.ToJson();
await SendText(webSocket, json);
}
}
else if (webSocket.State == WebSocketState.Closed || webSocket.State == WebSocketState.Aborted)
{
break;
}
Thread.Sleep(250);
}
}
private async void OnReceiveText(WebSocket webSocket, string msg)
{
if (firstTime)
{
// Register the client/module
if (msg.ToLower().StartsWith("module:"))
{
registered = true;
firstTime = false;
currentName = msg.Split(':')[1];
await SendText(webSocket, "ARF World Analysis Server: You are now registered as a module: " + currentName);
}
else if (msg.ToLower().StartsWith("client:"))
{
registered = true;
firstTime = false;
currentName = msg.Split(':')[1];
await SendText(webSocket, "ARF World Analysis Server: You are now registered as a client: " + currentName);
}
else
{
registered = false;
await SendText(webSocket, "ARF World Analysis Server: Cannot register " + msg);
}
}
else if (registered)
{
if (msg.ToLower().StartsWith("startsendingpose"))
{
if (msg.Contains(':')) timeCnt = int.Parse(msg.Split(':')[1]);
else timeCnt = 3;
await SendPose(webSocket);
}
else if (msg.ToLower().StartsWith("time"))
{
if (msg.Contains(':')) timeCnt = int.Parse(msg.Split(':')[1]);
else timeCnt = 3;
await SendTime(webSocket);
}
else if (msg.ToLower() == "unregister")
{
// Unregister client/user
currentName = "";
firstTime = true;
registered = false;
await SendText(webSocket, "Stop");
}
else
{
// Send a response
await SendText(webSocket, "ARF World Analysis Server: I got this unknown message: " + msg);
}
}
}
private async Task HandleClientData(HttpContext context, WebSocket webSocket)
{ {
var buffer = new byte[1024 * 4]; var buffer = new byte[1024 * 4];
// get the first data block // Read/get the first data block
WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None); WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
while (!result.CloseStatus.HasValue) if (result.MessageType == WebSocketMessageType.Text)
{ {
// test string getMsg = System.Text.Encoding.UTF8.GetString(buffer, 0, result.Count);
await SendText(webSocket, "Thanks, I got this message:"); OnReceiveText(webSocket, getMsg);
}
// echo the message back to the client
await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None);
// get the next block // Entering the loop
while (!result.CloseStatus.HasValue)
{
// Read/get the next block
result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None); result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
if (result.MessageType == WebSocketMessageType.Text)
{
string getMsg = System.Text.Encoding.UTF8.GetString(buffer, 0, result.Count);
OnReceiveText(webSocket, getMsg);
}
} }
await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
} }
//
// Echo incoming messages
//
private async Task Echo(WebSocketReceiveResult context, WebSocket webSocket)
{
var buffer = new byte[1024 * 4];
// Read/get the first data block
WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
// Send/echo the message back to the client
await SendText(webSocket, "ARF World Analysis Server: I got this (raw) message: ");
await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None);
}
} }
} }
#pragma warning restore CS1591 // Fehlendes XML-Kommentar fr ffentlich sichtbaren Typ oder Element #pragma warning restore CS1591 // Fehlendes XML-Kommentar fr ffentlich sichtbaren Typ oder Element
......
...@@ -161,14 +161,15 @@ namespace ETSI.ARF.OpenAPI.WorldAnalysis ...@@ -161,14 +161,15 @@ namespace ETSI.ARF.OpenAPI.WorldAnalysis
app.UseHsts(); app.UseHsts();
} }
// ETSI-ARF Websocket implementation // ETSI-ARF Websockets implementation
var webSocketOptions = new WebSocketOptions() var webSocketOptions = new WebSocketOptions()
{ {
KeepAliveInterval = TimeSpan.FromSeconds(120), //KeepAliveInterval = TimeSpan.FromSeconds(120),
//AllowedOrigins.Add("https://etsi.hhi.fraunhofer.de"),
//AllowedOrigins.Add("https://www.client.com")
}; };
//webSocketOptions.AllowedOrigins.Add("https://etsi.hhi.fraunhofer.de"); app.UseWebSockets(webSocketOptions);
//webSocketOptions.AllowedOrigins.Add("https://www.client.com"); //app.UseWebSockets();
app.UseWebSockets();
app.UseHttpsRedirection(); app.UseHttpsRedirection();
app.UseDefaultFiles(); app.UseDefaultFiles();
......
...@@ -71,6 +71,7 @@ ...@@ -71,6 +71,7 @@
var port = document.location.port ? (":" + document.location.port) : ""; var port = document.location.port ? (":" + document.location.port) : "";
connectionUrl.value = scheme + "://" + document.location.hostname + port + "/ws" ; connectionUrl.value = scheme + "://" + document.location.hostname + port + "/ws" ;
//connectionUrl.value = scheme + "://" + "etsi.hhi.fraunhofer.de" + "/ws" ;
function updateState() { function updateState() {
function disable() { function disable() {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment