Rewrite off IOT module

added nodered handeling
This commit is contained in:
Martijn Scheepers
2022-08-10 16:02:12 +02:00
parent cd801d7c27
commit b9deaa3f24
15 changed files with 306 additions and 300 deletions

View File

@@ -1,117 +0,0 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace UCS.IOTServer.UnitTest
{
[TestClass]
public class HttpMessageTest
{
[TestMethod]
public void HttpMessage_PRTG()
{
//GET /WSEN0000?content=<prtg><result><channel>channel1</channel><value>1</value></result><result><channel>channel2</channel><value>1</value></result><result><channel>channel3</channel><value>0</value></result><result><channel>channel4</channel><value>0</value></result></prtg> HTTP/1.1
//Host: 192.168.0.140
//Connection: close
String requestData = "GET /WSEN0000?content=<prtg><result><channel>channel1</channel><value>1</value></result><result><channel>channel2</channel><value>1</value></result><result><channel>channel3</channel><value>0</value></result><result><channel>channel4</channel><value>0</value></result></prtg> HTTP/1.1\r\n" +
"Host: 192.168.0.140\r\n" +
"Connection: close\r\n\r\n";
HttpMessage message = new HttpMessage(requestData);
Assert.AreEqual(6, message.GetHeaderCount());
Assert.AreEqual("GET", message.GetHeaderValue("RequestMethod"));
Assert.AreEqual("HTTP/1.1", message.GetHeaderValue("RequestVersion"));
Assert.AreEqual("/WSEN0000?content=<prtg><result><channel>channel1</channel><value>1</value></result><result><channel>channel2</channel><value>1</value></result><result><channel>channel3</channel><value>0</value></result><result><channel>channel4</channel><value>0</value></result></prtg>", message.GetHeaderValue("Url"));
Assert.AreEqual("GET /WSEN0000?content=<prtg><result><channel>channel1</channel><value>1</value></result><result><channel>channel2</channel><value>1</value></result><result><channel>channel3</channel><value>0</value></result><result><channel>channel4</channel><value>0</value></result></prtg> HTTP/1.1", message.GetHeaderValue("Request"));
Assert.AreEqual("192.168.0.140", message.GetHeaderValue("Host"));
Assert.AreEqual("close", message.GetHeaderValue("Connection"));
Assert.AreEqual(null, message.GetHeaderValue("Content"));
}
[TestMethod]
public void HttpMessage_PRTG_WidthSpaces()
{
//GET /WSEN0000?content=<prtg><result><channel>channel1</channel><value>1</value></result><result><channel>channel2</channel><value>1</value></result><result><channel>channel3</channel><value>0</value></result><result><channel>channel4</channel><value>0</value></result></prtg> HTTP/1.1
//Host: 192.168.0.140
//Connection: close
String requestData = "GET /WSEN0000?content=<prtg><result><channel>channel 1</channel><value>open 1</value></result></prtg> HTTP/1.1\r\n\r\n";
HttpMessage message = new HttpMessage(requestData);
Assert.AreEqual(4, message.GetHeaderCount());
Assert.AreEqual("GET", message.GetHeaderValue("RequestMethod"));
Assert.AreEqual("HTTP/1.1", message.GetHeaderValue("RequestVersion"));
Assert.AreEqual("/WSEN0000?content=<prtg><result><channel>channel 1</channel><value>open 1</value></result></prtg>", message.GetHeaderValue("Url"));
Assert.AreEqual("GET /WSEN0000?content=<prtg><result><channel>channel 1</channel><value>open 1</value></result></prtg> HTTP/1.1", message.GetHeaderValue("Request"));
Assert.AreEqual(null, message.GetHeaderValue("Content"));
}
[TestMethod]
public void HttpMessage_NodeRed()
{
//POST /Default HTTP/1.1\r\nHost: 192.168.0.140:5050\r\nUser-Agent: ESP8266HTTPClient\r\nConnection: keep-alive\r\nAccept-Encoding: identity;q=1,chunked;q=0.1,*;q=0\r\nContent-Type: application/json\r\nContent-Length: 55\r\n\r\n{\"device\":\"WSEN0000\",\"ip\":\"192.168.0.116\",\"channel4\":0}
String requestData = "POST /Default HTTP/1.1\r\n" +
"Host: 192.168.0.140:5050\r\n" +
"User-Agent: ESP8266HTTPClient\r\n" +
"Connection: keep-alive\r\n" +
"Accept-Encoding: identity;q=1,chunked;q=0.1,*;q=0\r\n" +
"Content-Type: application/json\r\n" +
"Content-Length: 55\r\n\r\n" +
"{\"device\":\"WSEN0000\",\"ip\":\"192.168.0.116\",\"channel4\":0}";
HttpMessage message = new HttpMessage(requestData);
Assert.AreEqual(11, message.GetHeaderCount());
Assert.AreEqual("POST", message.GetHeaderValue("RequestMethod"));
Assert.AreEqual("HTTP/1.1", message.GetHeaderValue("RequestVersion"));
Assert.AreEqual("/Default", message.GetHeaderValue("Url"));
Assert.AreEqual("POST /Default HTTP/1.1", message.GetHeaderValue("Request"));
Assert.AreEqual("192.168.0.140:5050", message.GetHeaderValue("Host"));
Assert.AreEqual("ESP8266HTTPClient", message.GetHeaderValue("User-Agent"));
Assert.AreEqual("keep-alive", message.GetHeaderValue("Connection"));
Assert.AreEqual("identity;q=1,chunked;q=0.1,*;q=0", message.GetHeaderValue("Accept-Encoding"));
Assert.AreEqual("application/json", message.GetHeaderValue("Content-Type"));
Assert.AreEqual("55", message.GetHeaderValue("Content-Length"));
Assert.AreEqual("{\"device\":\"WSEN0000\",\"ip\":\"192.168.0.116\",\"channel4\":0}", message.GetHeaderValue("Content"));
}
[TestMethod]
public void HttpMessage_FireFox()
{
//GET / HTTP/1.1\r\nHost: 192.168.0.140:5050\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nAccept-Language: nl,en-US;q=0.7,en;q=0.3\r\nAccept-Encoding: gzip, deflate\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\n\r\n
String requestData = "GET / HTTP/1.1\r\n" +
"Host: 192.168.0.140:5050\r\n" +
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0\r\n" +
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n" +
"Accept-Language: nl,en-US;q=0.7,en;q=0.3\r\n" +
"Accept-Encoding: gzip, deflate\r\n" +
"Connection: keep-alive\r\n" +
"Upgrade-Insecure-Requests: 1\r\n\r\n";
HttpMessage message = new HttpMessage(requestData);
Assert.AreEqual(11, message.GetHeaderCount());
Assert.AreEqual("GET / HTTP/1.1", message.GetHeaderValue("Request"));
Assert.AreEqual("GET", message.GetHeaderValue("RequestMethod"));
Assert.AreEqual("HTTP/1.1", message.GetHeaderValue("RequestVersion"));
Assert.AreEqual("/", message.GetHeaderValue("Url"));
Assert.AreEqual("192.168.0.140:5050", message.GetHeaderValue("Host"));
Assert.AreEqual("Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0", message.GetHeaderValue("User-Agent"));
Assert.AreEqual("text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", message.GetHeaderValue("Accept"));
Assert.AreEqual("nl,en-US;q=0.7,en;q=0.3", message.GetHeaderValue("Accept-Language"));
Assert.AreEqual("gzip, deflate", message.GetHeaderValue("Accept-Encoding"));
Assert.AreEqual("keep-alive", message.GetHeaderValue("Connection"));
Assert.AreEqual("1", message.GetHeaderValue("Upgrade-Insecure-Requests"));
Assert.AreEqual(null, message.GetHeaderValue("Content"));
}
}
}

View File

@@ -0,0 +1,82 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace UCS.IOTServer.UnitTest
{
[TestClass]
public class NoderedMessageTest
{
[TestMethod]
public void NoderedMessage_CreateDictionary()
{
Dictionary<string, int> dict = new Dictionary<string, int>();
dict.Add("channel1", 1);
dict.Add("channel2", 0);
dict.Add("channel3", 1);
dict.Add("channel4", 0);
string json = JsonConvert.SerializeObject(dict);
Assert.AreEqual("{\"channel1\":1,\"channel2\":0,\"channel3\":1,\"channel4\":0}", json);
}
[TestMethod]
public void NoderedMessage_AllChannels()
{
string data = "{\"device\":\"WSEN0000\",\"ip\":\"192.168.0.123\",\"version\":\"3.7-1-g718200c-dirty\",\"serial\":\"1602IOT038\",\"channels\":{\"channel1\":0,\"channel2\":1,\"channel3\":1,\"channel4\":0}}";
NoderedMessage message = JsonConvert.DeserializeObject<NoderedMessage>(data);
Assert.AreEqual("WSEN0000", message.Device);
Assert.AreEqual("192.168.0.123", message.Ip);
Assert.AreEqual("3.7-1-g718200c-dirty", message.Version);
Assert.AreEqual("1602IOT038", message.Serial);
Assert.AreEqual(4, message.Channels.Count);
Assert.AreEqual(false, message.Channels["channel1"]);
Assert.AreEqual(true, message.Channels["channel2"]);
Assert.AreEqual(true, message.Channels["channel3"]);
Assert.AreEqual(false, message.Channels["channel4"]);
}
[TestMethod]
public void NoderedMessage_OneChannels()
{
string data = "{\"device\":\"WSEN0000\",\"ip\":\"192.168.0.123\",\"version\":\"3.7-1-g718200c-dirty\",\"serial\":\"1602IOT038\",\"channels\":{\"bla bla\":1}}";
NoderedMessage message = JsonConvert.DeserializeObject<NoderedMessage>(data);
Assert.AreEqual("WSEN0000", message.Device);
Assert.AreEqual("192.168.0.123", message.Ip);
Assert.AreEqual("3.7-1-g718200c-dirty", message.Version);
Assert.AreEqual("1602IOT038", message.Serial);
Assert.AreEqual(1, message.Channels.Count);
Assert.AreEqual(true, message.Channels["bla bla"]);
}
[TestMethod]
public void NoderedMessage_MissingPropertys()
{
string data = "{\"device\":\"WSEN0000\",\"serial\":\"1602IOT038\",\"channels\":{\"channel1\":1}}";
NoderedMessage message = JsonConvert.DeserializeObject<NoderedMessage>(data);
Assert.AreEqual("WSEN0000", message.Device);
Assert.AreEqual(null, message.Ip);
Assert.AreEqual(null, message.Version);
Assert.AreEqual("1602IOT038", message.Serial);
Assert.AreEqual(1, message.Channels.Count);
Assert.AreEqual(true, message.Channels["channel1"]);
}
}
}

View File

@@ -64,6 +64,9 @@
<Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\MSTest.TestFramework.2.2.7\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.ComponentModel.Composition" />
<Reference Include="System.Core" />
@@ -73,7 +76,7 @@
<Reference Include="System.Xml.Linq" />
</ItemGroup>
<ItemGroup>
<Compile Include="HttpMessageTest.cs" />
<Compile Include="NoderedMessageTest.cs" />
<Compile Include="PrtgMessageTest.cs" />
<Compile Include="ServerTest.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />

View File

@@ -2,4 +2,5 @@
<packages>
<package id="MSTest.TestAdapter" version="2.2.7" targetFramework="net48" />
<package id="MSTest.TestFramework" version="2.2.7" targetFramework="net48" />
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="net48" />
</packages>

View File

@@ -1,78 +0,0 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace UCS.IOTServer
{
public class HttpMessage
{
private readonly Dictionary<String, String> _headers = new Dictionary<string, string>();
private Boolean _isContent = false;
private Boolean _isHeaders = false;
public HttpMessage(String data)
{
ParseRequestData(data);
}
private void ParseRequestData(String data)
{
foreach (var requestLine in data.Split(new[] { "\r\n" }, StringSplitOptions.None))
{
if (requestLine == "")
{
_isContent = true;
continue;
}
ParseRequestLine(requestLine);
}
}
private void ParseRequestLine(String requestLine)
{
if (_isHeaders == false)
{
_headers.Add("Request", requestLine);
_headers.Add("RequestMethod", requestLine.Substring(0, requestLine.IndexOf(' ')));
requestLine = requestLine.Remove(0, requestLine.IndexOf(' ') + 1);
_headers.Add("RequestVersion", requestLine.Substring(requestLine.LastIndexOf(' ') + 1));
_headers.Add("Url", requestLine.Substring(0, requestLine.LastIndexOf(' ')));
_isHeaders = true;
return;
}
if (_isContent)
{
_headers.Add("Content", requestLine);
return;
}
string headerKey = requestLine.Substring(0, requestLine.IndexOf(':'));
string headerValue = requestLine.Substring(requestLine.IndexOf(':') + 1).TrimStart(' ');
_headers.Add(headerKey, headerValue);
}
public String GetHeaderValue(String name)
{
try
{
return _headers[name];
}
catch (Exception)
{
return null;
}
}
public int GetHeaderCount()
{
return _headers.Count();
}
}
}

View File

@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace UCS.IOTServer
{
public class IOTMessage
{
public string Device { get; set; }
public Dictionary<string, string> Channels { get; set; } = new Dictionary<string, string>();
public IOTMessage(PrtgMessage message)
{
Device = message.Device;
foreach (var channel in message.PrtgData.Result)
{
Channels.Add(channel.Channel, channel.Value);
}
}
public IOTMessage(NoderedMessage message)
{
Device = message.Device;
foreach (var channel in message.Channels)
{
Channels.Add(channel.Key, channel.Value ? "1" : "0");
}
}
}
}

View File

@@ -0,0 +1,42 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using System.Xml.Serialization;
using Newtonsoft.Json;
namespace UCS.IOTServer
{
public class NoderedMessage
{
//{
// "device":"WSEN0000",
// "ip":"192.168.0.123",
// "version":"3.7-1-g718200c-dirty",
// "serial":"1602IOT038",
// "channels":[{
// "channel1":0,
// "channel2":0,
// "channel3":0,
// "channel4":0
// }]
//}
[JsonProperty("device", Required = Required.Always)]
public string Device { get; set; }
[JsonProperty("ip")]
public string Ip { get; set; }
[JsonProperty("version")]
public string Version { get; set; }
[JsonProperty("serial")]
public string Serial { get; set; }
[JsonProperty("channels")]
public Dictionary<string, bool> Channels { get; set; }
}
}

View File

@@ -1,24 +1,30 @@
using System;
using Newtonsoft.Json;
using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices.ComTypes;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading.Tasks;
using static System.Net.Mime.MediaTypeNames;
namespace UCS.IOTServer
{
public class Server
public static class Server
{
private static readonly NLog.Logger Errorlog = NLog.LogManager.GetLogger("IOTServer");
public IPAddress ServerIPAddress { get; set; }
public static IPAddress ServerIPAddress { get; set; }
public event EventHandler<string> RxLogEventFired;
public event EventHandler<PrtgMessage> ReceiveEventFiredIOTServerObject;
public static event EventHandler<string> RxLogEventFired;
public static event EventHandler<IOTMessage> ReceiveEventFiredIOTServerObject;
private Boolean _Stopping = false;
private static Boolean _Stopping = false;
public Server()
public static void Start(int port)
{
IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
foreach (var iPAddress in ipHostInfo.AddressList)
@@ -29,109 +35,115 @@ namespace UCS.IOTServer
break;
}
}
}
public void Start(int port)
{
Errorlog.Info($"IOTServer wordt gestart - {ServerIPAddress}:{port}");
try
{
TcpListener listener = new TcpListener(ServerIPAddress, port);
//run command to add port
//netsh http add urlacl url="http://+:5050/" user=everyone
//netsh http delete urlacl url="http://+:5050"
HttpListener listener = new HttpListener();
listener.Prefixes.Add("http://+:" + port.ToString() + "/");
listener.Start();
listener.BeginAcceptTcpClient(new AsyncCallback(AcceptTcpClientCallback), listener);
listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);
}
catch (Exception ex)
{
Errorlog.Error(ex, "IOTServer start error");
Errorlog.Error("Access denied:run cmd \"netsh http add urlacl url=\"http://+:5050/\" user=everyone\"");
throw;
}
}
public void Stop()
public static void Stop()
{
Errorlog.Info("IOTServer wordt gestopt");
_Stopping = true;
}
private void AcceptTcpClientCallback(IAsyncResult ar)
private static void ListenerCallback(IAsyncResult result)
{
TcpListener listener = (TcpListener)ar.AsyncState;
if (listener.Server == null || !listener.Server.IsBound || _Stopping == true)
return;
listener.BeginAcceptTcpClient(new AsyncCallback(AcceptTcpClientCallback), listener);
using (TcpClient client = listener.EndAcceptTcpClient(ar))
HttpListener listener = (HttpListener)result.AsyncState;
if (_Stopping == true)
{
using (NetworkStream stream = client.GetStream())
listener.Close();
return;
}
listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);
if (listener.IsListening)
{
HttpListenerContext context = listener.EndGetContext(result);
HttpListenerRequest request = context.Request;
//foreach (string key in request.Headers)
//{
// string[] values = request.Headers.GetValues(key);
// if (values.Length > 0)
// {
// foreach (string value in values)
// {
// Debug.WriteLine($"key:{key} value:{value}");
// }
// }
//}
//RxLogEventFired?.Invoke(null, request.ToString());
if (request.HttpMethod == "GET")
{
if (stream.CanRead == false)
//PRTG message
PrtgMessage prtgMessage = new PrtgMessage(request.RawUrl);
if (prtgMessage.PrtgData == null)
{
SendBadRequest(stream);
SendFailed(context);
return;
}
byte[] buffer = new byte[2048];
int bytes = stream.Read(buffer, 0, buffer.Length);
if (bytes <= 0)
IOTMessage iOTMessage = new IOTMessage(prtgMessage);
ReceiveEventFiredIOTServerObject?.Invoke(null, iOTMessage);
}
if (request.HttpMethod == "POST")
{
//Nodered message
using (var reader = new StreamReader(request.InputStream, request.ContentEncoding))
{
SendBadRequest(stream);
return;
}
string strData = Encoding.UTF8.GetString(buffer);
//Debug.WriteLine(strData);
RxLogEventFired?.Invoke(this, strData);
HttpMessage message = new HttpMessage(strData);
if (message.GetHeaderCount() == 0)
{
SendBadRequest(stream);
return;
}
if (message.GetHeaderValue("RequestMethod") == "GET")
{
PrtgMessage prtgMessage = new PrtgMessage(message.GetHeaderValue("Url"));
if (prtgMessage.PrtgData == null)
try
{
SendBadRequest(stream);
NoderedMessage noderedMessage = JsonConvert.DeserializeObject<NoderedMessage>(reader.ReadToEnd());
IOTMessage iOTMessage = new IOTMessage(noderedMessage);
ReceiveEventFiredIOTServerObject?.Invoke(null, iOTMessage);
}
catch (Exception ex)
{
SendFailed(context);
Errorlog.Error(ex, "Nodered json Deserialize error");
return;
}
//foreach (var item in prtgMessage.PrtgData.Result)
//{
// Debug.WriteLine($"Channel:{item.Channel} Value:{item.Value}");
//}
ReceiveEventFiredIOTServerObject?.Invoke(this, prtgMessage);
}
SendOk(stream);
}
SendOk(context);
}
}
private void SendBadRequest(NetworkStream stream)
private static void SendOk(HttpListenerContext context)
{
String responseMsg = "HTTP/1.1 400 Bad Request\r\n" +
"Content-type: text/plain\r\n" +
"Connection: close\r\n" +
"\r\n" +
"Failed";
byte[] response = Encoding.ASCII.GetBytes(responseMsg);
stream.Write(response, 0, response.Length);
byte[] buffer = Encoding.UTF8.GetBytes("OK");
context.Response.ContentLength64 = buffer.Length;
context.Response.StatusCode = 200;
Stream output = context.Response.OutputStream;
output.Write(buffer, 0, buffer.Length);
output.Close();
}
private void SendOk(NetworkStream stream)
private static void SendFailed(HttpListenerContext context)
{
String responseMsg = "HTTP/1.1 200 OK\r\n" +
"Content-type: text/plain\r\n" +
"Connection: close\r\n" +
"\r\n" +
"OK";
byte[] response = Encoding.ASCII.GetBytes(responseMsg);
stream.Write(response, 0, response.Length);
byte[] buffer = Encoding.UTF8.GetBytes("failed");
context.Response.ContentLength64 = buffer.Length;
context.Response.StatusCode = 400;
Stream output = context.Response.OutputStream;
output.Write(buffer, 0, buffer.Length);
output.Close();
}
}
}

View File

@@ -50,6 +50,9 @@
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<ItemGroup>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
<HintPath>..\packages\NLog.4.7.12\lib\net45\NLog.dll</HintPath>
</Reference>
@@ -70,7 +73,8 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="HttpMessage.cs" />
<Compile Include="IOTMessage.cs" />
<Compile Include="NoderedMessage.cs" />
<Compile Include="PrtgData.cs" />
<Compile Include="PrtgMessage.cs" />
<Compile Include="Server.cs" />

View File

@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="net48" />
<package id="NLog" version="4.7.12" targetFramework="net48" />
</packages>

View File

@@ -45,6 +45,7 @@ namespace UCS.URLPost
PingTimer.Interval = 5 * 60 * 1000; //5 min
PingTimer.Elapsed += OnTimedEvent;
PingTimer.Enabled = true;
PingTimer.Start();
}
}
}
@@ -67,7 +68,6 @@ namespace UCS.URLPost
await PostJsonContent(url, jsonContent);
});
}
private static bool AlreadySendLine(UCS.ConfigFile.GraphicsIdListLine configLine)
@@ -112,9 +112,8 @@ namespace UCS.URLPost
Task.Run(async () =>
{
var postdata = new PostData(configLine.TxString, configLine.TxData, configFile.Initiation_Data.Titlebar, configFile.Initiation_Data.Initatior);
string jsonContent = JsonConvert.SerializeObject(postdata, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
string jsonContent = JsonConvert.SerializeObject(postdata, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
//Console.WriteLine($"Content = {jsonContent}");
await PostJsonContent(configLine.TxRemoteID, jsonContent);
});
}
@@ -127,10 +126,11 @@ namespace UCS.URLPost
{
using (var httpClient = new HttpClient() { Timeout = TimeSpan.FromSeconds(5) })
{
var response = await httpClient.PostAsync(url, httpContent);
var response = await httpClient.PostAsync(url, httpContent);
//Console.WriteLine($"--Response = {response}");
//Console.WriteLine($"--StatusCode = {response.StatusCode}");
var contents = await response.Content.ReadAsStringAsync();
//Console.WriteLine($"--Contents = {contents}");
//if (contents == "OK" && response.StatusCode == System.Net.HttpStatusCode.OK)
@@ -141,6 +141,7 @@ namespace UCS.URLPost
}
catch (Exception e)
{
Console.WriteLine($"URL Post server = {url} - data = {jsonContent} - error = {e.Message}");
Errorlog.Info($"URL Post server = {url} - data = {jsonContent}");
Errorlog.Error(e);
}

View File

@@ -13,9 +13,7 @@ Module GlobalVariable
Friend ProgramName As String = "UCS"
Friend LoadedConfigFile As String
Friend IOTServer As New UCS.IOTServer.Server
Friend IOTServerConfigFile As New UCS.ConfigFile.IOTServerConfigFile
Friend BACnetConfigFile As New ConfigFile.BACnetConfigFile
Friend StentofonConfigFile As New ConfigFile.StentofonConfigFile
Friend VOIPConfigFile As New ConfigFile.VOIPConfigFile

View File

@@ -29,18 +29,22 @@ Partial Class IOTServerConfiguration
Me.ServerPortLabel = New System.Windows.Forms.Label()
Me.IOTServerLog = New System.Windows.Forms.RichTextBox()
Me.IOTMessageLog = New System.Windows.Forms.RichTextBox()
Me.TextBox1 = New System.Windows.Forms.TextBox()
Me.TextBox2 = New System.Windows.Forms.TextBox()
Me.ServerSettingsGroupBox.SuspendLayout()
Me.SuspendLayout()
'
'ServerSettingsGroupBox
'
Me.ServerSettingsGroupBox.Controls.Add(Me.TextBox2)
Me.ServerSettingsGroupBox.Controls.Add(Me.TextBox1)
Me.ServerSettingsGroupBox.Controls.Add(Me.ServerIP)
Me.ServerSettingsGroupBox.Controls.Add(Me.ServerIPLabel)
Me.ServerSettingsGroupBox.Controls.Add(Me.ServerPort)
Me.ServerSettingsGroupBox.Controls.Add(Me.ServerPortLabel)
Me.ServerSettingsGroupBox.Location = New System.Drawing.Point(14, 12)
Me.ServerSettingsGroupBox.Name = "ServerSettingsGroupBox"
Me.ServerSettingsGroupBox.Size = New System.Drawing.Size(276, 75)
Me.ServerSettingsGroupBox.Size = New System.Drawing.Size(796, 75)
Me.ServerSettingsGroupBox.TabIndex = 0
Me.ServerSettingsGroupBox.TabStop = False
Me.ServerSettingsGroupBox.Text = "IOT Server Settings"
@@ -84,9 +88,9 @@ Partial Class IOTServerConfiguration
Me.IOTServerLog.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.IOTServerLog.Location = New System.Drawing.Point(296, 13)
Me.IOTServerLog.Location = New System.Drawing.Point(296, 93)
Me.IOTServerLog.Name = "IOTServerLog"
Me.IOTServerLog.Size = New System.Drawing.Size(555, 662)
Me.IOTServerLog.Size = New System.Drawing.Size(555, 582)
Me.IOTServerLog.TabIndex = 1
Me.IOTServerLog.Text = ""
'
@@ -100,6 +104,24 @@ Partial Class IOTServerConfiguration
Me.IOTMessageLog.TabIndex = 2
Me.IOTMessageLog.Text = ""
'
'TextBox1
'
Me.TextBox1.Location = New System.Drawing.Point(322, 19)
Me.TextBox1.Name = "TextBox1"
Me.TextBox1.ReadOnly = True
Me.TextBox1.Size = New System.Drawing.Size(384, 20)
Me.TextBox1.TabIndex = 3
Me.TextBox1.Text = "netsh http add urlacl url=""http://+:5050/"" user=everyone"
'
'TextBox2
'
Me.TextBox2.Location = New System.Drawing.Point(322, 45)
Me.TextBox2.Name = "TextBox2"
Me.TextBox2.ReadOnly = True
Me.TextBox2.Size = New System.Drawing.Size(384, 20)
Me.TextBox2.TabIndex = 3
Me.TextBox2.Text = "netsh http delete urlacl url=""http://+:5050"""
'
'IOTServerConfiguration
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
@@ -112,6 +134,7 @@ Partial Class IOTServerConfiguration
Me.Name = "IOTServerConfiguration"
Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show
Me.Text = "IOT Server Configuratie"
Me.TopMost = True
Me.ServerSettingsGroupBox.ResumeLayout(False)
Me.ServerSettingsGroupBox.PerformLayout()
Me.ResumeLayout(False)
@@ -124,4 +147,6 @@ Partial Class IOTServerConfiguration
Friend WithEvents ServerIPLabel As System.Windows.Forms.Label
Friend WithEvents IOTServerLog As System.Windows.Forms.RichTextBox
Friend WithEvents IOTMessageLog As System.Windows.Forms.RichTextBox
Friend WithEvents TextBox2 As TextBox
Friend WithEvents TextBox1 As TextBox
End Class

View File

@@ -4,16 +4,16 @@
Private ReadOnly Errorlog As NLog.Logger = NLog.LogManager.GetLogger("Error")
Private Sub IOTServerConfiguration_Load(sender As Object, e As EventArgs) Handles MyBase.Load
AddHandler GlobalVariable.IOTServer.RxLogEventFired, AddressOf Me.IOTServerLogEventFired
AddHandler GlobalVariable.IOTServer.ReceiveEventFiredIOTServerObject, AddressOf Me.IOTMessageLogEventFired
AddHandler IOTServer.Server.RxLogEventFired, AddressOf Me.IOTServerLogEventFired
AddHandler IOTServer.Server.ReceiveEventFiredIOTServerObject, AddressOf Me.IOTMessageLogEventFired
ServerIP.Text = GlobalVariable.IOTServer.ServerIPAddress.ToString()
ServerPort.Text = GlobalVariable.IOTServerConfigFile.ServerPort.ToString()
ServerIP.Text = IOTServer.Server.ServerIPAddress.ToString()
ServerPort.Text = IOTServerConfigFile.ServerPort.ToString()
End Sub
Private Sub IOTServerConfiguration_Closing(sender As Object, e As EventArgs) Handles MyBase.FormClosing
RemoveHandler GlobalVariable.IOTServer.RxLogEventFired, AddressOf Me.IOTServerLogEventFired
RemoveHandler GlobalVariable.IOTServer.ReceiveEventFiredIOTServerObject, AddressOf Me.IOTMessageLogEventFired
RemoveHandler IOTServer.Server.RxLogEventFired, AddressOf Me.IOTServerLogEventFired
RemoveHandler IOTServer.Server.ReceiveEventFiredIOTServerObject, AddressOf Me.IOTMessageLogEventFired
FrmMain.IOTServerToolStripMenuItem.Checked = False
End Sub
@@ -43,12 +43,11 @@
End If
End Sub
Friend Sub IOTMessageLogEventFired(sender As Object, msg As IOTServer.PrtgMessage)
Friend Sub IOTMessageLogEventFired(sender As Object, msg As IOTServer.IOTMessage)
Try
If IOTMessageLog.IsHandleCreated Then
For Each iten In msg.PrtgData.Result
Me.Invoke(New Action(Of String)(AddressOf AddToMessageLog), $"{msg.Device} - Channel:{iten.Channel} - Value:{iten.Value}")
For Each iten In msg.Channels
Me.Invoke(New Action(Of String)(AddressOf AddToMessageLog), $"{msg.Device} - Channel:{iten.Key} - Value:{iten.Value}")
Next
End If
Catch ex As ObjectDisposedException

View File

@@ -174,8 +174,8 @@ Public Class FrmMain
Return
End If
If IOTServerConfigFile.IOTEnable = True AndAlso NetworkConnectionStatus = True Then
GlobalVariable.IOTServer.Start(IOTServerConfigFile.ServerPort)
AddHandler GlobalVariable.IOTServer.ReceiveEventFiredIOTServerObject, AddressOf ReceiveIotServerObjectHandler
AddHandler IOTServer.Server.ReceiveEventFiredIOTServerObject, AddressOf ReceiveIotServerObjectHandler
IOTServer.Server.Start(IOTServerConfigFile.ServerPort)
Else
IOTServerToolStripMenuItem.Enabled = False
End If
@@ -303,8 +303,11 @@ Public Class FrmMain
Me.Text = "IOT Server Stoppen"
If IOTServerConfigFile.IOTEnable = True Then
RemoveHandler GlobalVariable.IOTServer.ReceiveEventFiredIOTServerObject, AddressOf ReceiveIotServerObjectHandler
GlobalVariable.IOTServer.Stop()
'RemoveHandler GlobalVariable.IOTServer.ReceiveEventFiredIOTServerObject, AddressOf ReceiveIotServerObjectHandler
'GlobalVariable.IOTServer.Stop()
RemoveHandler IOTServer.Server.ReceiveEventFiredIOTServerObject, AddressOf ReceiveIotServerObjectHandler
IOTServer.Server.Stop()
End If
If VOIPConfigFile.VOIPEnable = True Then
@@ -689,7 +692,6 @@ Public Class FrmMain
Stentofon.Stentofon.SendConfigLine(Button)
End If
Case CommType.URL
'UCS.URLPost.URLPost.SendMessage(Button.TxRemoteID, Button.TxString, Button.TxData)
UCS.URLPost.URLPost.SendMessage(Button, UCSConfigFile)
End Select
@@ -754,11 +756,10 @@ Public Class FrmMain
Telemetry.Telemetry.UpdateConnectionState(monitorObject.UserInfo, monitorObject.RemoteId, monitorObject.ConnectionState, monitorObject.LastDataDate)
End Sub
Friend Sub ReceiveIotServerObjectHandler(sender As Object, message As IOTServer.PrtgMessage)
For Each channel In message.PrtgData.Result
Dim rxBoxLines = UCSConfigFile.Graphics_IDList.AsParallel().Where(Function(row) row.RxComm = CommType.IOT AndAlso row.RxRemoteId = message.Device AndAlso row.RxString = channel.Channel AndAlso row.RxData = channel.Value)
Dim lastdata As String = $"{message.Device} : {channel.Channel} - {channel.Value}"
Friend Sub ReceiveIotServerObjectHandler(sender As Object, message As IOTServer.IOTMessage)
For Each channel In message.Channels
Dim rxBoxLines = UCSConfigFile.Graphics_IDList.AsParallel().Where(Function(row) row.RxComm = CommType.IOT AndAlso row.RxRemoteId = message.Device AndAlso row.RxString = channel.Key AndAlso row.RxData = channel.Value)
Dim lastdata As String = $"{message.Device} : {channel.Key} - {channel.Value}"
For Each row In rxBoxLines
'Debug.WriteLine($"ROW: tag:{row.Tag} pos:{row.Position}")
Me.ReceiveObjectEventFired(row, lastdata)