Welkom op het

Zakelijk KPN Forum

Recent online
Zakelijk KPN Forum - Indexpagina
Beantwoord

Lora Developer Applicationserver Response-message en Hash verficatie


Via het Lora-Developer portal test ik een uplink naar mijn applicationserver. Dit werkt op zich goed, ik krijg het bericht goed binnen (url params en body).

Ik loop tegen 2 problemen aan:

- Ik krijg het bericht goed binnen, echter krijg ik wel een foutmelding in de portal wanneer ik een test-bericht verstuur (http result = 0). Ik stuur een http 200 (ok) terug vanuit mijn API. Moet ik nog iets ander terugsturen zodat de portal de request als succesvol ziet?
- Het lukt mij niet om de HASH256 te verifieeren. Ik heb de stappen in de documentatie van de portal gevolgd. Heeft iemand mischien een tip? Ik gebruik in ieder geval UTF-8 encoding.

Ik gebruik C# met ASP.NET WebApi 2.

mvg
Cengiz
icon

Beste antwoord door Cengiz 4 oktober 2018, 14:57

Ik heb de token verificatie werkend, deze werkt alleen wanneer je een verificatie doet met een bericht vanuit een lora-node. De verificatie dmv test-functie in de portal werkt niet, dit lijkt door de Time-url-parameter te komen.

Hieronder een ASP.NET Web API controller. Ik heb alleen de uplink hash getest.

// Things Web API Application Server C# Example
// Cengiz Eyertas 2018
using System;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using Newtonsoft.Json.Linq;
using System.Security.Cryptography;
using System.Text;

namespace KPN.THINGS.API.Controllers
{
public class HookController : ApiController
{
public HookController()
{
DebugClass.Init("KPN.THINGS.Service", 62114);
}

// POST: api/Hook
public IHttpActionResult Post(string LrnDevEui, string LrnFPort, string LrnInfos, string AS_ID, string Time, string Token, [FromBody]JObject json)
{
DebugClass.WriteTraceMessage(string.Format("URI: {0}", Request.RequestUri.OriginalString));
DebugClass.WriteTraceMessage(string.Format("LrnDevEui: {0}", LrnDevEui));
DebugClass.WriteTraceMessage(string.Format("LrnFPort: {0}", LrnFPort));
DebugClass.WriteTraceMessage(string.Format("LrnInfos: {0}", LrnInfos));
DebugClass.WriteTraceMessage(string.Format("AS_ID: {0}", AS_ID));
DebugClass.WriteTraceMessage(string.Format("Time: {0}", Time));
DebugClass.WriteTraceMessage(string.Format("Token: {0}", Token));
DebugClass.WriteTraceMessage(string.Format("Body: {0}", json.ToString()));

string sQueryParamsWithoutToken = string.Format("LrnDevEui={0}&LrnFPort={1}&LrnInfos={2}&AS_ID={3}&Time={4}",
LrnDevEui, LrnFPort, LrnInfos, AS_ID, Time);

string sBodyElementsConcat = string.Empty;

dynamic dynJson = json;

if (dynJson.DevEUI_uplink != null)
{
sBodyElementsConcat = string.Format("{0}{1}{2}{3}{4}", dynJson.DevEUI_uplink.CustomerID,
dynJson.DevEUI_uplink.DevEUI, dynJson.DevEUI_uplink.FPort, dynJson.DevEUI_uplink.FCntUp, dynJson.DevEUI_uplink.payload_hex);
}
else if (dynJson.DevEUI_location != null)
{
// Case SOURCE_DEVELOPER_PORTAL
sBodyElementsConcat = string.Format("{0}{1}", dynJson.DevEUI_location.CustomerID, dynJson.DevEUI_location.DevEUI);

// Case SOURCE_THINGPARK
sBodyElementsConcat = string.Format("{0}{1}", dynJson.DevEUI_location.CustomerID, dynJson.DevEUI_location.DevEUI.ToLower());
}
else if (dynJson.DevEUI_downlink_Sent != null)
{
sBodyElementsConcat = string.Format("{0}{1}{2}{3}{4}",
dynJson.DevEUI_downlink_Sent.CustomerID, dynJson.DevEUI_downlink_Sent.DevEUI, dynJson.DevEUI_downlink_Sent.FPort, dynJson.DevEUI_downlink_Sent.FCntUp);
}
else
{
// Unknow object
DebugClass.WriteTraceMessage("Unknown JSON Object");
throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound, "Unknown JSON Object"));
}

DebugClass.WriteTraceMessage(string.Format("BodyElementsConcat: {0}", sBodyElementsConcat));

string AsKey = "YOUR-SECRET_KEY";

string ComputedHash = ComputeSha256Hash(string.Format("{0}{1}{2}", sBodyElementsConcat, sQueryParamsWithoutToken, AsKey));

DebugClass.WriteTraceMessage(string.Format("ComputedHash: {0}", ComputedHash));

if (Token != ComputedHash)
{
DebugClass.WriteTraceMessage("Token validation error");
throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Forbidden, "Token validation error"));
}

DebugClass.WriteTraceMessage("Token validation success! YEAH!");

return Ok();

}

private static string ComputeSha256Hash(string input)
{
// Create a SHA256
using (SHA256 sha256Hash = SHA256.Create())
{
// ComputeHash - returns byte array
byte[] hash = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(input));

return BitConverter.ToString(hash).ToLower().Replace("-", string.Empty);
}
}
}
}

Bekijk origineel

3 Reacties

Klein update op mijn vorige bericht:

Wanneer ik een bericht via mijn Lora-Node verstuur dan komt het bericht goed binnen op mijn applicationserver. In de Debugger van de developer-portal zie ik een UplinkFrameReport van het bericht. Op de devices-pagina zie ik dat het bericht ook succesvol is ontvangen van het device (groene check-icoontje).

Mischien een bug in de Uplink Test Page?
Ik heb de token verificatie werkend, deze werkt alleen wanneer je een verificatie doet met een bericht vanuit een lora-node. De verificatie dmv test-functie in de portal werkt niet, dit lijkt door de Time-url-parameter te komen.

Hieronder een ASP.NET Web API controller. Ik heb alleen de uplink hash getest.

// Things Web API Application Server C# Example
// Cengiz Eyertas 2018
using System;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using Newtonsoft.Json.Linq;
using System.Security.Cryptography;
using System.Text;

namespace KPN.THINGS.API.Controllers
{
public class HookController : ApiController
{
public HookController()
{
DebugClass.Init("KPN.THINGS.Service", 62114);
}

// POST: api/Hook
public IHttpActionResult Post(string LrnDevEui, string LrnFPort, string LrnInfos, string AS_ID, string Time, string Token, [FromBody]JObject json)
{
DebugClass.WriteTraceMessage(string.Format("URI: {0}", Request.RequestUri.OriginalString));
DebugClass.WriteTraceMessage(string.Format("LrnDevEui: {0}", LrnDevEui));
DebugClass.WriteTraceMessage(string.Format("LrnFPort: {0}", LrnFPort));
DebugClass.WriteTraceMessage(string.Format("LrnInfos: {0}", LrnInfos));
DebugClass.WriteTraceMessage(string.Format("AS_ID: {0}", AS_ID));
DebugClass.WriteTraceMessage(string.Format("Time: {0}", Time));
DebugClass.WriteTraceMessage(string.Format("Token: {0}", Token));
DebugClass.WriteTraceMessage(string.Format("Body: {0}", json.ToString()));

string sQueryParamsWithoutToken = string.Format("LrnDevEui={0}&LrnFPort={1}&LrnInfos={2}&AS_ID={3}&Time={4}",
LrnDevEui, LrnFPort, LrnInfos, AS_ID, Time);

string sBodyElementsConcat = string.Empty;

dynamic dynJson = json;

if (dynJson.DevEUI_uplink != null)
{
sBodyElementsConcat = string.Format("{0}{1}{2}{3}{4}", dynJson.DevEUI_uplink.CustomerID,
dynJson.DevEUI_uplink.DevEUI, dynJson.DevEUI_uplink.FPort, dynJson.DevEUI_uplink.FCntUp, dynJson.DevEUI_uplink.payload_hex);
}
else if (dynJson.DevEUI_location != null)
{
// Case SOURCE_DEVELOPER_PORTAL
sBodyElementsConcat = string.Format("{0}{1}", dynJson.DevEUI_location.CustomerID, dynJson.DevEUI_location.DevEUI);

// Case SOURCE_THINGPARK
sBodyElementsConcat = string.Format("{0}{1}", dynJson.DevEUI_location.CustomerID, dynJson.DevEUI_location.DevEUI.ToLower());
}
else if (dynJson.DevEUI_downlink_Sent != null)
{
sBodyElementsConcat = string.Format("{0}{1}{2}{3}{4}",
dynJson.DevEUI_downlink_Sent.CustomerID, dynJson.DevEUI_downlink_Sent.DevEUI, dynJson.DevEUI_downlink_Sent.FPort, dynJson.DevEUI_downlink_Sent.FCntUp);
}
else
{
// Unknow object
DebugClass.WriteTraceMessage("Unknown JSON Object");
throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound, "Unknown JSON Object"));
}

DebugClass.WriteTraceMessage(string.Format("BodyElementsConcat: {0}", sBodyElementsConcat));

string AsKey = "YOUR-SECRET_KEY";

string ComputedHash = ComputeSha256Hash(string.Format("{0}{1}{2}", sBodyElementsConcat, sQueryParamsWithoutToken, AsKey));

DebugClass.WriteTraceMessage(string.Format("ComputedHash: {0}", ComputedHash));

if (Token != ComputedHash)
{
DebugClass.WriteTraceMessage("Token validation error");
throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Forbidden, "Token validation error"));
}

DebugClass.WriteTraceMessage("Token validation success! YEAH!");

return Ok();

}

private static string ComputeSha256Hash(string input)
{
// Create a SHA256
using (SHA256 sha256Hash = SHA256.Create())
{
// ComputeHash - returns byte array
byte[] hash = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(input));

return BitConverter.ToString(hash).ToLower().Replace("-", string.Empty);
}
}
}
}
Reputatie 5
Badge +5
Goedemiddag @Cengiz,

Ik had uw topic gezien en alvast een hulpvraag bij onze specialisten uitgezet om u vervolgens in één keer het antwoord had kunnen geven. Het doet me echter goed om te lezen dat u eruit bent gekomen.

Het klopt overigens dat u http result = 0 terugkrijgt als het test-bericht goed overgekomen is. Tevens klopt het dat de verificatie functie niet werkt de portal.

Mocht u nog andere vragen hebben, dan kunt u ons natuurlijk altijd benaderen! Fijn weekend alvast 😁

Reageer