Rewrite off IOT module
added nodered handeling
This commit is contained in:
@@ -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"));
|
||||
}
|
||||
}
|
||||
}
|
||||
82
UCS.IOTServer.UnitTest/NoderedMessageTest.cs
Normal file
82
UCS.IOTServer.UnitTest/NoderedMessageTest.cs
Normal 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"]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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" />
|
||||
|
||||
@@ -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>
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
32
UCS.IOTServer/IOTMessage.cs
Normal file
32
UCS.IOTServer/IOTMessage.cs
Normal 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");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
42
UCS.IOTServer/NoderedMessage.cs
Normal file
42
UCS.IOTServer/NoderedMessage.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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>
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
31
UCS/IOT/IOTServerConfiguration.Designer.vb
generated
31
UCS/IOT/IOTServerConfiguration.Designer.vb
generated
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user