Beantwoord

Test met LoRaWAN, kan geen payload lezen met http post

  • 20 December 2019
  • 17 reacties
  • 889 keer bekeken

Hallo, Ik ben aan het onderzoeken of en hoe het LoRaWAN netwerk van KPN gebruikt kan worden bij mijn IoT lessen.
Ik heb een LoRaWAN mote aangemeld bij KPN en er komen packets binnen op mijn webhook entry point.
Alleen kan ik de payload niet terugvinden in de data die binnenkomt.

De payload die verstuurd wordt is “00020149016700EE0A67FF380B68003202F3EE3402DADA350217703602D8F0370223283C66005B037530” en de ontvangen data is:

[
{
"bn": "urn:dev:DEVEUI:0059AC00001B0068:",
"bt": 1576873371
},
{
"n": "payload",
"vs": "32342e3834"
},
{
"n": "port",
"v": 1
}
]

Graag zou ik willen weten waarom ik de payload data niet zie en wat er voor nodig is om de payload data wel te ontvangen.

Alvast bedankt.

icon

Beste antwoord door Rick S. 6 January 2020, 14:33

Bekijk origineel

17 reacties

Reputatie 7
Badge +6

Goedemiddag @wlgrwhan ,

Welkom bij de IoT Community!
Wat goed om te lezen dat u met LoRa aan de slag bent gegaan. Ik help u graag verder. Ik heb op basis van de gegevens uit uw forumprofiel gezocht in de Developer Portal, maar ik kan daar geen account van u vinden. Heeft u zich aangemeld met een ander mailadres? Of heeft u zich wellicht gelijk geregistreerd voor de vervanger van de Developer Portal, KPN Things Portal?

Hallo Rick,

Ja, ik heb mij aangemeld bij het nieuwe developer portal.

Cu, Remko

Reputatie 7
Badge +6

Hi Remko, 

Bedankt voor uw antwoord! 
In dat geval moet ik een hulpvraag uitzetten naar de specialisten, aangezien mijn kennis van de KPN Things Portal nog beperkt is. Dit kan betekenen dat ik na de kerst pas antwoord voor u heb. Ik zet de vraag nu door en laat het gelijk weten als ik een terugkoppeling ontvang. 

Wist u overigens ook dat we een KPN Things pagina hebben ingericht met documentatie ter ondersteuning? Wellicht dat u aan de hand van deze informatie ook verder kan. 

Hallo Rick,

Bedankt voor je reactie. Ik ben al geruime tijd actief op de documentatie pagina’s maar heb nog geen oplossing gevonden.

Ik hoor graag van jullie.

Cu, Remko.

Reputatie 7
Badge +6

Goedemiddag @wlgrwhan ,

Daar ben ik weer! 
Excuses voor mijn late reactie. Door de kerstdagen en daardoor verlof bij verschillende collega's was het wat lastiger om hier wat hulp bij te krijgen. 

Mijn collega heeft in de data logs van dit device gekeken en de payloads die hij daar voorbij ziet komen zijn allemaal in het format zoals de payload uit uw printscreen (32342e3834). Het lijkt er dus op dat er andere payloads verstuurd worden dan u in eerste instantie verwacht had. In de Advanced data history (op de device detail pagina in de portal) kunt u de payload die het netwerk van het device ontvangt controleren. 

Als daar de payload staat die u verwacht had, terwijl u een verkeerde payload op uw endpoint ontvangt, lijkt er toch iets mis te zijn in Things. Maar vooralsnog lijkt het erop dat het in het device misgaat. 

Hallo, Rick,

Ik heb inmiddels een http post endpoint ingericht volgens de eisen die worden gesteld door KPN:

Wanneer ik mijn HTTPS SenML Plug inricht komt er geen data binnen op deze portal.

Wanneer ik vervolgens met een test applicatie een HTTP post request doe komt er wel data binnen op deze portal.

Graag zou ik willen weten

  • of de plug goed is ingesteld,
  • of er ontbrekende eisen zijn waaraan mijn portal moet voldoen?

Alvast bedankt

Reputatie 7
Badge +6

Goedemorgen @wlgrwhan ,

Allereerst de beste wensen voor 2020!
Volgens mijn collega heeft u een handleiding gebruikt die voor de ‘oude’ LoRa Developer Portal bedoelt is. De HTTPS plug van de ‘nieuwe’ Things Portal stuurt de data in een ander formaat naar de Applicatie Server, vandaar dat het niet werkt. 

Op de HTTPS plug pagina ziet u onder het kopje ‘The request’ hoe de HTTP post er nu uitziet. Aan de hand daarvan moet u weer verder komen :wink:

Daarnaast gaat mijn collega aan de slag om de handleiding die u gevolgd heeft te updaten zodat deze ook voor de Things Portal gebruikt kan worden. 

Hallo Rick, bedankt voor deze info.

Alleen zijn we nog niet aangekomen bij het decoderen van de geposte data.
Op dit moment komt er helemaal niets aan op de applicatie. er wordt niets gepost door de portal.

Het certificaat wordt volgens de specificatie van KPN geaccepteerd en ook handmatig posten met postmaster lukt.

 

Qualys result from https://www.ssllabs.com/ssltest/index.html

 

Qualys result from https://www.ssllabs.com/ssltest/index.html
 

Wat is er mis met de instellingen of met de applicatie waar de packets naar gepost moeten worden?

Cu, Remko

@Rick S. 

Ik heb zojuist naar “webhook.site” een tweede plug gemaakt maar ook daar komt niets binnen.

Zouden jullie eens willen kijken naar het project? ik kan geen devices verwijderen omdat hij maar blijft klagen dat die nog steeds lid zijn van een groep. hetzelfde geldt voor het verwijderen van de plugs. daar krijg ik vergelijkbare meldingen.

Update: de problemen stapelen zich maar op: ik kon de data zien binnenkomen van mijn node in de developer portal maar die pagina is nu “verdwenen” in de portal. en er komt nog steeds geen data binnen. Nergens.

 

 

@Rick S. 

Inmiddels heb ik geprobeerd mijn devices te verwijderen maar dat lukt niet. Zie onder:

Alleen wil mijn device niet meer Joinen!

het lijkt er op dat het device wel is verwijderd maar dat het portal niet wordt bijgewerkt.

Willen jullie nagaan wat er stuk is ? Ik zou graag verder komen dan waar ik nu ben.

Reputatie 7
Badge +6

Ik ga gelijk weer mijn hulplijn inschakelen Remko! 

Reputatie 7
Badge +6

Goedemiddag @wlgrwhan ,

Daar zijn we weer! 
Aangezien u nu tegen een aantal verschillende zaken aan loopt en ik het overzicht wil bewaren geef ik hieronder per onderdeel uitleg: 

  • Het lukt niet om devices te verwijderen
    Volgens mijn collega probeert u via de ‘All devices’ pagina devices te verwijderen. Wij zijn er nu achter gekomen dat dit niet goed werkt. De LoRa informatie wordt hiermee van het device verwijderd, maar verder blijft het device bestaan. Dat is een fout in de portal en wordt meegenomen in de volgende release van 14-01. Dit zorgt er overigens ook voor dat het device niet meer kan joinen. 

    Als een device in een device group zit moet het device ook via de device lijst van de device group verwijderd worden. U kan op uw project in de side bar klikken en dan naar ‘groups’ gaan. Vervolgens gaat u naar de betreffende group en kiest u in de tabel (via de puntjes) voor ‘Delete’. Via deze route wordt het device wel correct verwijderd en kunt u het device opnieuw aanmaken. 
     
  • Het lukt niet om plugs te verwijderen:
    Wat betreft het verwijderen van plugs is het eerst zaak om de plugs van een device group te ontkoppelen. Klik hiervoor op het project in de side bar, dan op ‘groups’, gevolgd door via de puntjes van de betreffende group naar ‘Details’ te gaan. Daar wordt een lijst van plugs getoond en hier kunt u via het prullenbak-incoon een plug ontkoppelen. Tot slot kan de plug dan verwijderen worden op de ‘all plugs’ pagina. We hebben dit proces overigens gelijk op de lijst van verbeteringen gezet, aangezien dit toch een vrij omslachtig proces is. 
     
  • Er komt geen data aan op uw endpoint:
    Mijn collega heeft uw omgeving geanalyseerd en er zijn een aantal zaken die hem opvallen. De plug ‘Unused plug’ heeft u waarschijnlijk aangemaakt via de ‘all plugs’ pagina (toch?) en is daardoor niet gekoppeld aan een device group. Dit zorgt ervoor dat de plug geen informatie zal verwerken. Bij de volgende release wordt het mogelijk om een ongekoppelde plug toe te voegen aan een device group. Op dit moment is het dus (nog) niet mogelijk om deze plug te koppelen. Als u nu een webhook wilt koppelen moet er vanuit de device group een plug aangemaakt worden. Hiervoor gaat u weer naar ‘details’ van de betreffende groep. Daar heeft u aan de rechterkant de knop ‘Create and add new plug’ om een nieuwe plug aan te maken en te koppelen. De plug ‘My server’ ziet er goed uit. Daarnaast zag mijn collega dat device ‘Sodaq Explorer’ is aangemaakt als ‘Own LoRa device’ en dat er 2 decoders geactiveerd zijn. Met het activeren van de decoders wordt er bepaald welke informatie doorgegeven wordt naar de plug. Omdat de LoRa-info van dit device verwijderd is kan het device geen verbinding meer maken met het netwerk. Het device ‘Things Uno’ is aangemaakt als ‘Own LoRa device wit preprogrammad keys’, maar voor dit device zijn geen decoders geactiveerd. Als u met dit device data wilt versturen, dan moet u ook voor dit device type decoders activeren bij het opnieuw opvoeren van het device (de 2 velden onder ‘Decoder activation’. 

    Het komt er dus op neer dat het device eerst via de device group verwijderd moet worden en vervolgens binnen ‘My first device group’ opnieuw aangemaakt moet worden. Hierbij moeten dan uiteraard ook decoders geactiveerd worden. Hierdoor zou het device weer moeten kunnen joinen en moet de data ook doorgestuurd worden naar uw eindpunt. 

Hallo, @Rick S.

Punt 1: Dit is duidelijk. Even wachten tot 14 januari voor de update (?)

Punt 2: Dit werkt niet zoals jullie beschrijven:

Nadat ik via de “puntjes” op delete heb geklikt en ingestemd heb omdat ik het zeker wist krijg ik de volgende melding.

Punt 3: Op dit moment zijn alle devices verwijderd. Zodra de device groups zijn verwijderd en de plug kan ik opnieuw beginnen met instellen en aanmaken van de verschillende onderdelen.

Ik hoor graag van jullie en wacht geduldig af.

Cu, Remko.

Reputatie 7
Badge +6

Hi Remko, 

Om de device group te kunnen verwijderen is het eerst zaak om de plug te ontkoppelen van de device group. Dit kunt u doen door weer naar de ‘details’ van de device group te gaan. Daar ziet u de gekoppelde plug staan. Deze kunt u dan ontkoppelen via het prullenbak icoontje. Zie hieronder: 
 


Het ontkoppelen van de plug is ook nodig om de plug zelf uiteindelijk te verwijderen. Als de plug ontkoppelt is kunt u terug naar de device group lijst om de device group te verwijderen :wink:

@Rick S.bedankt voor de aanwijzing. Het is nu gelukt.
Het valt mij op dat de verschillende functies niet consistent en op vergelijkbare plaatsen zijn ondergebracht. Dat maakt werken met de developer omgeving er niet makkelijker op. Wellicht een idee om de GUI nog een keer te evalueren?

We kunnen weer verder.

Cu, Remko

Reputatie 7
Badge +6

Graag gedaan hoor! Wij zijn er om u verder te helpen :grin:

En u heeft helemaal gelijk. En zijn zeker nog een aantal verbeterpunten en ook door uw vragen hebben we weer extra inzicht gekregen in de verbeterpunten. We nemen dit uiteraard en proberen dit in de volgende releases allemaal aan te pakken. Blijf dus ook zeker uw feedback delen. 

Inmiddels zijn we een stuk verder gekomen.

In Node-Red heb ik een http-Post portal gemaakt die data verstuurd van uit de HTTPS SenML plug ontvangt, en door zet naar een MQTT broker. Voor de mensen die willen beginnen met KPN LoRa vind je hierbij de code als voorbeeld. Alleen authenticatie zit er (nog) niet in.

Hieronder de flow en de bijbehorende code.

Node-red flow
[{"id":"c691ad49.65edb8","type":"tab","label":"New KPN dev. Portal","disabled":false,"info":""},{"id":"54514d5e.b09714","type":"http in","z":"c691ad49.65edb8","name":"LoRa Post Catcher","url":"/kpnlorapost","method":"post","upload":false,"swaggerDoc":"","x":130,"y":160,"wires":[["7abfbf95.eed988","c1d2de7b.2135d"]]},{"id":"11ff8dfc.1fb7fa","type":"http response","z":"c691ad49.65edb8","name":"LoRa Post Reply","statusCode":"","headers":{},"x":630,"y":160,"wires":[]},{"id":"7abfbf95.eed988","type":"function","z":"c691ad49.65edb8","name":"Data processor KPN developer portal","func":"// objects counted counted in payload\nvar objectCount = msg.payload.length;\n\n// Create variables to hold JSON \nvar msgc = {};\nvar msgp = {};\nvar result = {};\n\n// Prepare http responce\nvar msg200 = {}; // Variable to hold http responce message\nmsg200.payload = \"200\"; // \"200\" for OK\nmsg200.req = msg.req; // req from original msg for http responce node\nmsg200.res = msg.res; // res from original msg for http responce node\n\n// Test if it dat ais KPN format\n// Verification 1: Test for number of objects in array. Shall be > 3\nif( objectCount > 2){\n // Verification 2: test if \"bn\" object is at position 0 of object array\n if (msg.payload[0].hasOwnProperty(\"bn\")) {\n \n // Save original http post message for presenting later\n var rawPost = {};\n rawPost = msg.payload;\n \n // extract devEUI from http post data\n var devEUI = msg.payload[0].bn.split(\":\")[3];\n \n // save headers for specific usage.\n // result.things_devicespecification_uuid = msg.req.headers[\"things-devicespecification-uuid\"];\n // result.things_client_uuid = msg.req.headers[\"things-client-uuid\"];\n // result.things_plug_uuid = msg.req.headers[\"things-plug-uuid\"];\n result.things_message_token = msg.req.headers[\"things-message-token\"];\n \n // Test for payload formatted data\n if( msg.payload[1].n == \"payload\"){\n \n /*----------- data format -------------*/\n \n // This process is using CayenneLPP format\n \n msgp.payload = msg.payload[1].vs; // Payload data for decoding by CayenneLPP decoder\n msgp.rawPayload = msg.payload[1].vs; // Preserve original payload for presenting later\n msgp.rawPost = rawPost; // complete JSON woth htto POST message form KPN portal\n msgp.devEUI = devEUI;\n \n // prepare data for decoding by CayenneLPP decoder \n result.port = msg.payload[2].v;\n // take time in Unix time format in seconds and convert to readable time (MySQL compatible)\n result.locTime = new Date(msg.payload[0].bt*1000).toISOString().slice(0, 19).replace('T', ' ');\n \n msgp.metadata = result;\n node.send([[msg200],null,[msgp]]);\n \n }else if( msg.payload[1].n == \"locOrigin\"){\n \n /*----------- Geo-location format -------------*/\n \n msgc.devEUI = devEUI;\n \n result.rawPost = rawPost;\n result.locOrigin = msg.payload[1].vs;\n result.latitude = msg.payload[2].v;\n result.longitude = msg.payload[3].v;\n result.radius = msg.payload[4].v;\n // take time in Unix time format and convert to readable time (MySQL compatible)\n result.locTime = new Date(parseInt(msg.payload[7].vs)).toISOString().slice(0, 19).replace('T', ' ');\n \n msgc.payload = result;\n node.send([[msg200],[msgc],[null]]);\n \n }else{\n // Wrong payload: ignore!\n }\n }\n}\n","outputs":3,"noerr":0,"x":330,"y":240,"wires":[["11ff8dfc.1fb7fa"],["73fe7493.6871b4"],["582be4b2.d5040c"]],"info":"--------------------------------------------------------------------\nThis Node is part of the PE1MEW Node-Red KPN developer POST application.\n\nThe PE1MEW Node-Red KPN developer POST application is free software: \nyou can redistribute it and/or modify it under the terms of a Creative \nCommons Attribution-NonCommercial 4.0 International License \n(http://creativecommons.org/licenses/by-nc/4.0/) by \nPE1MEW (http://pe1mew.nl) E-mail: pe1mew@pe1mew.nl\n\nThe PE1MEW KPN developer POST application is distributed in the hope that \nit will be useful, but WITHOUT ANY WARRANTY; without even the \nimplied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR \nPURPOSE.\n--------------------------------------------------------------------\n\n\\brief Receive http POST data from KPN developer portal\n\\date 12-1-2020\n\\author Remko Welling (pe1mew@pe1mew.nl)\n\\version See version history\n\n## Verion history\n\nversion | Date | Athour | Notes\n--------|-----------|--------|-----------------------------------\n1.0 | 12-1-2020 | PE1MEW | First release\n\n## ToDo\n\n1: Add authentication method\n"},{"id":"582be4b2.d5040c","type":"cayennelpp-decoder","z":"c691ad49.65edb8","name":"","x":640,"y":280,"wires":[["3a886b5a.2813cc"]]},{"id":"792fba9d.c8cfb4","type":"mqtt out","z":"c691ad49.65edb8","name":"","topic":"","qos":"","retain":"","broker":"d9afedc9.bf67b8","x":1070,"y":260,"wires":[]},{"id":"3a886b5a.2813cc","type":"function","z":"c691ad49.65edb8","name":"Payload MQTT sender","func":"// Set parameters for MQTT \nmsg2 = {};\nmsg2.qos = 0;\nmsg2.retain = false;\n\n// Send raw payload\nmsg2.topic = \"kpn/\" + msg.devEUI + \"/data/rawPost\";\nmsg2.payload = msg.rawPost;\nnode.send(msg2);\n\n// Send raw payload\nmsg2.topic = \"kpn/\" + msg.devEUI + \"/data/raw\";\nmsg2.payload = msg.rawPayload;\nnode.send(msg2);\n\n// send individual content of JSON struct to MQTT with associated topics.\nfor (var key in msg.payload){\n msg2.topic = \"kpn/\" + msg.devEUI + \"/data/decoded/\" + key;\n msg2.payload = msg.payload[key];\n node.send(msg2);\n}\n\n// Send metadata\nfor (var key2 in msg.metadata){\n msg2.topic = \"kpn/\" + msg.devEUI + \"/data/\" + key2;\n msg2.payload = msg.metadata[key2];\n node.send(msg2);\n}","outputs":1,"noerr":0,"x":860,"y":280,"wires":[["792fba9d.c8cfb4"]],"info":"--------------------------------------------------------------------\nThis Node is part of the PE1MEW Node-Red KPN developer POST application.\n\nThe PE1MEW Node-Red KPN developer POST application is free software: \nyou can redistribute it and/or modify it under the terms of a Creative \nCommons Attribution-NonCommercial 4.0 International License \n(http://creativecommons.org/licenses/by-nc/4.0/) by \nPE1MEW (http://pe1mew.nl) E-mail: pe1mew@pe1mew.nl\n\nThe PE1MEW KPN developer POST application is distributed in the hope that \nit will be useful, but WITHOUT ANY WARRANTY; without even the \nimplied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR \nPURPOSE.\n--------------------------------------------------------------------\n\n\\brief Send payload data to MQTT\n\\date 12-1-2020\n\\author Remko Welling (pe1mew@pe1mew.nl)\n\\version See version history\n\n## Dependancies\n\nThis node is using port 3 from the \"Data processor KPN developer portal\" node\nthat is decoded by the CayenneLPP decoder node.\n\n## Verion history\n\nversion | Date | Athour | Notes\n--------|-----------|--------|-----------------------------------\n1.0 | 12-1-2020 | PE1MEW | First release\n\n## ToDo\n\n\n"},{"id":"73fe7493.6871b4","type":"function","z":"c691ad49.65edb8","name":"Location MQTT sender","func":"// Set parameters for MQTT \nmsg2 = {};\nmsg2.qos = 0;\nmsg2.retain = false;\n\n// Send all individual values from struc to MQTT with corresponding topic\nfor (var key in msg.payload){\n msg2.topic = \"kpn/\" + msg.devEUI + \"/location/\" + key;\n msg2.payload = msg.payload[key];\n node.send(msg2);\n}\n","outputs":1,"noerr":0,"x":870,"y":240,"wires":[["792fba9d.c8cfb4"]],"info":"--------------------------------------------------------------------\nThis Node is part of the PE1MEW Node-Red KPN developer POST application.\n\nThe PE1MEW Node-Red KPN developer POST application is free software: \nyou can redistribute it and/or modify it under the terms of a Creative \nCommons Attribution-NonCommercial 4.0 International License \n(http://creativecommons.org/licenses/by-nc/4.0/) by \nPE1MEW (http://pe1mew.nl) E-mail: pe1mew@pe1mew.nl\n\nThe PE1MEW KPN developer POST application is distributed in the hope that \nit will be useful, but WITHOUT ANY WARRANTY; without even the \nimplied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR \nPURPOSE.\n--------------------------------------------------------------------\n\n\\brief Send Location data to MQTT\n\\date 12-1-2020\n\\author Remko Welling (pe1mew@pe1mew.nl)\n\\version See version history\n\n## Dependancies\n\nThis node is using port 2 from the \"Data processor KPN developer portal\" node\n\n## Verion history\n\nversion | Date | Athour | Notes\n--------|-----------|--------|-----------------------------------\n1.0 | 12-1-2020 | PE1MEW | First release\n\n## ToDo\n\n\n"},{"id":"c1d2de7b.2135d","type":"file","z":"c691ad49.65edb8","name":"Logging raw data","filename":"/home/user/kpn/raw_data.txt","appendNewline":true,"createDir":false,"overwriteFile":"false","encoding":"none","x":270,"y":80,"wires":[[]]},{"id":"ecd7a7ed.e5a82","type":"comment","z":"c691ad49.65edb8","name":"Correct data will receive \"200\"","info":"","x":380,"y":160,"wires":[]},{"id":"d9afedc9.bf67b8","type":"mqtt-broker","z":"","name":"","broker":"yoururl.org","port":"1883","clientid":"","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""}]

 

Reageer