Toon posts:

[IOT] keuze in online data storage

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik zal me even voorstellen, gezien ik hier nieuw ben. Ik weet daarnaast ook niet of dit het meest geschikte forum onderdeel is, zoniet mijn excuses.
Ik ben een embedded software engineer en houd me voornamelijk bezig met software schrijven voor microcontrollers in allerlei sensoren en besturingen. Al deze devices communiceren met een RF protocol hun actuele waarden.
Nu heb ik in C# een tool gemaakt, die middels een USB Rf ontvanger deze data kan ontvangen.
Deze tool heb ik dynamisch gemaakt zodat ik, kan kiezen wat ik van welke RF devices wil loggen.
Dit punt heb ik inmiddels allemaal werken.
Ik beschik in mijn C# tool over een list met logData en het daarbij behoren type apparaat.

Van elk log item heb ik nu de volgende gegevens beschikbaar:
* Omschrijving van de waarde (bijvoorbeeld CO2 Level, Humidity, Temperature)
* Een eigen omschrijving die ik in de tool eraan kan hangen (bijvoorbeeld "Temperatuur buiten", "CO2 slaapkamer")
* de value van de waarde (momenteel al geconverteerd naar een string, maar dat hoeft niet perse)
* het datatype van de waarde (CO2 level is bijvoorbeeld een UInt16, een temperatuur een decimal)
* een unieke string om een soort van ID voor een log item te hebben (mag ook voor andere doeleinden gebruikt worden)

Afbeeldingslocatie: http://www.stijnmaes.nl/logTool.JPG

Nu wil ik de C# deze data laten opslaan in een database op mijn webdomein.
Nouja anders geformuleerd, ik wil op mijn webdomein grafieken kunnen tonen van deze data.

Ik heb dit princippe al werkend gekregen voor mijn slimme electriciteits meter, door gebruik te maken van Phant van sparkfun. Het nadeel daarvan is dat ik alle waarden altijd in de POST action mee moet geven.

Ik wil nu eigenlijk dat ik alleen één waarde naar de database wil schrijven als die binnen komt en of veranderd.

Nu heb ik erg weinig kennis van databases en ben op zoek naar advies hoe dit slim te doen.

Opties die ik zelf in gedachten had:
* De tool weet wat er gelogd moet worden, ik had het idee dat het het snelst werkt om voor elke regel in mijn (dus elk log item) een tabel in mysql te maken. De tool kan dus een mysql query genereren om een nieuwe database in te richten, op maat voor datgene dat gelogd moet worden.
Ik had in gedachte om dan bijvoorbeeld een post te doen waarin ik mee geef: 1 de tabel naam/unieke ID (in screenshot te zien als phantname) en de value. Het post script kan er dan zelf wel een timestamp aanhangen.
* toch gebruik maken van phant, maar dat lijkt me niet praktisch.
* veel meer niet echt :)

Ik lees veel over big data / noSQL/ of het message queing protocol, omdat mysql niet geschikt zou zijn voor grote hoeveelheden sensor data. Ik vraag me af wat is veel. Dit is voor eigen gebruik en er zullen geen 1000en user met elk 50 logitems komen. Waarschijnlijk enkel hooguit 10 gebruikers met 30 log items.
Als het enkel voor 1 gebruiker werkt ben ik ook tevreden.
Over de update interval zit ik te denken aan 1x per minuut of 1x per 5 minuten per logitem.

Ik heb nog niet nagedacht over hoe die data secure gepost wordt. Het nadeel van werken met een POST action is dat iedereen die POST action aan kan roepen en zo mijn data kan verzieken. Die kans dat iemand daar baat bij heeft acht ik niehiel, maar als er een manier is die automatisch veilig is is dat mooi meegenomen.

Graag jullie adviezen. _/-\o_

C# is geen probleem,
php en mysql is niet mijn sterkste kan, maar kom daar wel aan uit.

Acties:
  • 0 Henk 'm!

  • Afvalzak
  • Registratie: Oktober 2008
  • Laatst online: 31-08 12:02

Afvalzak

Zet jij mij even buiten?

Is het niet handiger om op de databaseserver een kleine webservice/API te hosten waarmee je kan connecten?
Dan roep je die aan (met authenticatie) en die voegt de gegevens toe aan de database.
MySQL kan miljoenen rijen aan, dus die 1000 rijen zullen vast geen probleem opleveren overigens ;)

Last.fm | Code Talks


Acties:
  • 0 Henk 'm!

  • johnkeates
  • Registratie: Februari 2008
  • Laatst online: 04-07 16:30
MySQL maar zelfs SQLite gaat hier geen probleem mee hebben. Ik zou wel aanraden om inderdaad een API of webservice gebruiken en niet direct naar een database te schrijven. Dan heb je in je API een centraal punt om bewerkingen en controle te doen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb nu gewoon een webhosting pakket waar ik dus een mysql server bij heb. Daar kan ik zelf toch geen API op hosten? Of begrijp ik jullie verkeerd.
Ik kan volgens mij ook niet direct vanuit mijn c# tool naar de mysql database schrijven als deze bij een externe hosting partij staat of wel? Dat zou nog makkelijker zijn namelijk

Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 11-10 06:48

Gerco

Professional Newbie

Als je een shared webhost hebt waar je PHP of iets dergelijks op kan draaien schrijf je gewoon een PHP pagina die een POST accepteert met de waarde(s) die je wilt opslaan. Die waardes schrijf je dan met PHP in de database, dan heb je dus al een simpele API gemaakt.

Je kan dan met een andere PHP pagina die data weer uit de database toveren en in een grafiek tonen hoe je het wilt zien. MySQL is prima geschikt voor iets als dit. Met "groot" bedoelt men meestal databases van honderden gigabytes en meer met miljoenen/miljarden rows. Zoveel ruimte krijg je van je webhost niet eens dus daar hoef je je echt geen zorgen over te maken.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Die optie van een PHP script en met post actions de tabel en value meegeven had ik ook in gedachte. Ik vroeg me alleen af of het slimmer is om kleine simpele tabellen te maken die enkel bestaan uit ID, VALUE, TIMESTAMP en een referentie naar de sensor ofzo. Of is het slimmer om de tabel meer velden te geven als VALUE TYPE etc zodat na ik een query op een php pagina doe de waardes nog moet converteren. Dat lijkt mij wat onnodig en traag. (Ja traag is een relatief begrip)
Een andere vraag is kan ik enige vorm cm security maken als ik die POST ACTION gebruik.

Acties:
  • 0 Henk 'm!

  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 01:02

The Eagle

I wear my sunglasses at night

Maar het is wel een typische big data toepassing wat je gebruikt. Al is het dan niet "big" op dit moment ;)
Wat je doet: kijk even naar een Hadoop VM bij een cloud provider. En check dan even flume.apache.org.
Flume kan exact die data doorgeven op die momenten die jij wilt, en accepteert verschillende formaten (json, text, etc). Ook kan flume simpelweg een logfile tailen. Heck, het kan de output van ieder (OS) commando in principe doorsturen :)
Fiets je dat ding op HDFS en van daar uit Hive of Hbase in, of je laat het gewoon staan en gaat er met Pig op los. Kan allemaal.
Protip: kijk even naar een Cloudera sandbox VM. Hoef je niet alles voor te configureren, kun je zo uitrollen :)

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Poehee, dat zijn heel wat nieuwe termen voor me. Ik verwacht iets te hoog gegrepen. PHP en mysql kom ik wel aan uit, maar ik ga de termen eens bekijken.
Wil wel graag bij een gewone cheap ass hosting provider blijven.

Acties:
  • 0 Henk 'm!

  • Compizfox
  • Registratie: Januari 2009
  • Laatst online: 21:24

Compizfox

Bait for wenchmarks

Verwijderd schreef op woensdag 15 juli 2015 @ 17:07:
ik heb nu gewoon een webhosting pakket waar ik dus een mysql server bij heb. Daar kan ik zelf toch geen API op hosten? Of begrijp ik jullie verkeerd.
Je webhoster ondersteunt waarschijnlijk wel PHP. Je zou dan in PHP een API kunnen schrijven: gewoon een script (of een aantal scriptjes) waarnaar je requests kunt doen. Het script zorgt er dan voor dat het in de database komt te staan. Dat is in feite een API ;)
Ik kan volgens mij ook niet direct vanuit mijn c# tool naar de mysql database schrijven als deze bij een externe hosting partij staat of wel? Dat zou nog makkelijker zijn namelijk
Dat hangt een beetje af van de webhoster. Ik kan me zomaar voorstellen dat ze alleen vanaf localhost verbindingen naar MySQL toestaan.

Gewoon een heel grote verzameling snoertjes


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 00:53
The Eagle schreef op woensdag 15 juli 2015 @ 20:35:
Maar het is wel een typische big data toepassing wat je gebruikt. Al is het dan niet "big" op dit moment ;)
Wat je doet: kijk even naar een Hadoop VM bij een cloud provider. En check dan even flume.apache.org.
Flume kan exact die data doorgeven op die momenten die jij wilt, en accepteert verschillende formaten (json, text, etc). Ook kan flume simpelweg een logfile tailen. Heck, het kan de output van ieder (OS) commando in principe doorsturen :)
Fiets je dat ding op HDFS en van daar uit Hive of Hbase in, of je laat het gewoon staan en gaat er met Pig op los. Kan allemaal.
Protip: kijk even naar een Cloudera sandbox VM. Hoef je niet alles voor te configureren, kun je zo uitrollen :)
Bingo!

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 14:34
Aangezien de TS in C# werkt zou ik eigenlijk Entity Framework aanraden voor de DB acties : de TS kan zich dan focussen op de code voor de applicatie terwijl EF het DB deel doet (het scheelt echt enorm veel werk).
Ook heb je met MVC icm EF binnen een uurtje een werkende API om jouw DB uit te lezen / updaten.

Wel zul je naar hosting moeten kijken die daarmee overweg kan

[ Voor 9% gewijzigd door Killah_Priest op 16-07-2015 10:38 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb inmiddels een interfaceje gemaakt met diverse php scripts om in mysql tabellen te creëren, vullen en te wijzigen. Vanuit C# doe ik dan post requests naar deze api. Dat werkt vooralsnog verbazingwekkend goed.

Ik heb echter een mysql opzet vraagje.

Ik heb nu 3 tabellen
1 met devices. Deze omschrijft het serienummer van bijvoorbeeld een thermostaat, de locatie etc.
Dan heb ik een tabel met logItems. Deze beschrijft wat er gelogd wordt.
Deze heeft een relatie met een device uit de eerste tabel. En omschrijft bijvoorbeeld dat de ruimte temperatuur gelogd wordt en de warmte vraag. Van deze 2 items sla ik in de tabel ook het type variabele op.
De temperatuur is namelijk een Signed16F100 (fixed point 16 bit met 2 decimalen) de warmte vraag is een unsignded 8 bit integer.
Dit variabele type kan ook zijn bijvoorbeeld:
string, boolean, diverse fixed point getallen.

Het gaat met nu om de 3e tabel. Dit is een tabel met logEvents.
Daarin wil ik dus elke individuele meetwaarde opslaan. Dus bijvoorbeeld de kamer temperatuur.
Deze krijgt een relatie met een logitem uit de 2e tabel, een timestamp en een waarde.
In de 2e tabel kan ik het type variabele opzoeken.
Het gaat me nu wat het handigst is om als type van de waarde te kiezen in mysql.
Deze is dus namelijk voor elke logEvent verschillend.
Ik dacht er nu aan om er een varchar van te maken en om dan php dit later terug te laten parsen naar het juiste type.
Ik wil van deze waardes later in php grafieken tonen.
Heeft iemand een beter idee? In C zou ik er een void pointer van maken die ik cast naar het juiste type, maar dat gaat in mysql nou eenmaal niet :)

Acties:
  • 0 Henk 'm!

  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 01:02

The Eagle

I wear my sunglasses at night

Je bent met unstructured data bezig. Nu heb je drie dingen, over 5 jaar misschien 30 sensors die allemaal wat anders genereren. Verdiep je eerst eens in het omgaan met unstructured data en bedenk dan waarom het makkelijker is met Pig en Hive aan de slag te gaan en meteen een veelgevraagd nieuw taaltje te leren ;)

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


Verwijderd

Topicstarter
Pig en Hive zijn voor mij echt helemaal nieuwe termen. Ik ben niet gespecialiseerd in database / web achtige applicaties en die ambitie heb ik momenteel ook niet. Tuurlijk zou ik het graag beheersen en snappen, maar mij lijkt me de drempel erg hoog en de kans om dit projectje te laten slagen verkleint daarmee denk ik.
Het is maar voor de hobby, dus die sensoren die ken ik redelijk allemaal. Als ik het professioneel aan zou pakken en het moet 100% schaalbaar zijn dan wordt het een ander verhaal.
Heb je een goede link naar een uitleg van die Pig en Hive voor dummies? ;)

  • BramV
  • Registratie: Augustus 2007
  • Laatst online: 13-10 12:36
stijnos81, uitstekend bezig met mysql/php. Het is een hobbyproject. De Pig/Hive adviezen zijn 'belachelijk'...

Varchar is misschien een goed idee, je kunt in mysql query ook 'casten' of converteren (SELECT CAST(PROD_CODE AS ...) FROM PRODUCT) In tabel 2 zou je kunnen zeggen wat het type data de varchar zou representeren.

Beveiliging? Je zou in de post een random code/getal kunnen meegeven dat alleen jij weet en daar op controleren. Op die manier kunnen 'anderen' geen post proberen te geven.

[ Voor 21% gewijzigd door BramV op 13-08-2015 09:11 ]


Verwijderd

Topicstarter
Voor ik me in die technieken heb verdiept ben ik al met pensioen denk ik, dus hou het lekker begrijpelijk.
Ik probeer het nu eerst even met de VARCHAR optie ja. En zal dan eens kijken of het casten een beetje goed gaat.
De beveiliging heb ik nog even achter weten gelaten, maar kijk later of ik aan de post actions een encrypted key mee kan geven met daarin iets van een timestamp en een unique user cypher ofzo. Heb al wat constructies gezien. Maar dat is leuk voor later, aangezien het voor het loggen van mijn eigen woning is, gok ik zo dat de hack interessantheids factor nihiel is. Puur leuk om uit te vogelen. Ben embedded software engineer die voornamelijk met electronica bezig is, dus al deze technieken zijn al ver genoeg van mijn bed :)

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Een andere database die perfect is voor dit soort zaken is cassandra. Time series is 1 van hun sterkte punten. (Logisch ook gezien de origine vanuit Facebook...)

ASSUME makes an ASS out of U and ME


  • Compizfox
  • Registratie: Januari 2009
  • Laatst online: 21:24

Compizfox

Bait for wenchmarks

BramV schreef op donderdag 13 augustus 2015 @ 09:04:
Beveiliging? Je zou in de post een random code/getal kunnen meegeven dat alleen jij weet en daar op controleren. Op die manier kunnen 'anderen' geen post proberen te geven.
Dat is natuurlijk verre van waterdicht. Doe het dan meteen goed ;)

Het is natuurlijk niet te doen om je eigen cryptografische implementatie in PHP te schrijven, dus mij lijkt het het handigst dat je voor server-side authenticatie gebruikt maakt van doodnormale HTTPS. Voor het authenticeren van de client kun je dan gebruik maken van HTTP basic authentication.

Meer info (+ geavanceerdere methoden): https://stormpath.com/blog/secure-your-rest-api-right-way/, http://www.thebuzzmedia.c...out-oauth-authentication/

Overigens kun je ook een API key in de query-string meesturen. Dat is ook veilig, mits je dat over HTTPS doet.

[ Voor 5% gewijzigd door Compizfox op 13-08-2015 14:26 ]

Gewoon een heel grote verzameling snoertjes


  • BramV
  • Registratie: Augustus 2007
  • Laatst online: 13-10 12:36
Ik zou meteen 2 factor + yubi key + website achter cloudfare en hosting in een bunker kiezen (zie China gisteren..)

pff het is een hobby project

(Wat is het verschil tussen een api key meegeven of een random veld/random data? Er zijn 1001 manieren)

  • Compizfox
  • Registratie: Januari 2009
  • Laatst online: 21:24

Compizfox

Bait for wenchmarks

BramV schreef op donderdag 13 augustus 2015 @ 15:17:
Ik zou meteen 2 factor + yubi key + website achter cloudfare en hosting in een bunker kiezen (zie China gisteren..)

pff het is een hobby project

(Wat is het verschil tussen een api key meegeven of een random veld/random data? Er zijn 1001 manieren)
Sorry, mijn post was misschien niet helemaal duidelijk. Je kunt de API-key ook posten, zolang je dat maar over HTTPS doet :)

Dan is het in principe even veilig als de custom approach met HMACs uit m'n tweede link.

Gewoon een heel grote verzameling snoertjes


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik doe mijn post acties vanuit een in C# geschreven programma. Het lijkt me dan wat lastig denk ik om te posten via HTTPS. Normaal handelt de browser alle security af volgens mij.
Ik zat meer te denken in iets dat elke client een unieke key krijgt (die bij de server bekend is) en deze moet worden meegestuurd in de api maar dan geëncrypt samen met een timestamp en een random getal ofzo.
Het hoeft geen high end security te zijn :)

Acties:
  • 0 Henk 'm!

  • Compizfox
  • Registratie: Januari 2009
  • Laatst online: 21:24

Compizfox

Bait for wenchmarks

Verwijderd schreef op maandag 17 augustus 2015 @ 11:30:
Ik doe mijn post acties vanuit een in C# geschreven programma. Het lijkt me dan wat lastig denk ik om te posten via HTTPS. Normaal handelt de browser alle security af volgens mij.
Dat klopt. Is er een library te vinden die HTTPS voor jou afhandelt?
Ik zat meer te denken in iets dat elke client een unieke key krijgt (die bij de server bekend is) en deze moet worden meegestuurd in de api maar dan geëncrypt samen met een timestamp en een random getal ofzo.
Het hoeft geen high end security te zijn :)
Als je het dan toch zelf gaat schrijven, doe het dan meteen goed ;)

De methode die jij beschrijft kan niet, want als je de API-key encrypt met een random getal, kan de server hem niet meer decrypten omdat dat random getal niet bekend is.

Tip: cryptografie is moeilijk. Ga niet zelf wat in elkaar lopen prutsen maar volg gewoon een algemeen bekend en gebruikt algoritme. Zoals deze met HMACs bijvoorbeeld: http://www.thebuzzmedia.c...out-oauth-authentication/

Gewoon een heel grote verzameling snoertjes


Acties:
  • 0 Henk 'm!

  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 01:02

The Eagle

I wear my sunglasses at night

H!GHGuY schreef op donderdag 13 augustus 2015 @ 12:41:
Een andere database die perfect is voor dit soort zaken is cassandra. Time series is 1 van hun sterkte punten. (Logisch ook gezien de origine vanuit Facebook...)
Cassandra is leuk spul.
Mij is altijd geleerd dat je Cassandra pas gebruikt als meer dan 50% van je acties een write is. Voor de rest: Hbase :)
Oh ja, en vziw heb je voor beiden een stukje RDBMS nodig om hun metadata in op te slaan :)

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

The Eagle schreef op maandag 17 augustus 2015 @ 14:08:
[...]

Cassandra is leuk spul.
Mij is altijd geleerd dat je Cassandra pas gebruikt als meer dan 50% van je acties een write is. Voor de rest: Hbase :)
Oh ja, en vziw heb je voor beiden een stukje RDBMS nodig om hun metadata in op te slaan :)
In dit geval zal het aantal writes best hoog liggen. Als elke sensor om de x tijd een meting opstuurt dan heb je er per dag behoorlijk wat en kan het aantal updates wel eens even hoog liggen als het aantal queries van die data.

Cassandra heeft vziw geen RDBMS nodig achter de schermen. Ik heb het zelf nog niet gebruikt (maar wel veel documentatie gelezen) en dat stukje zegt me toch echt niets.

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Compizfox schreef op maandag 17 augustus 2015 @ 14:00:
[...]

Dat klopt. Is er een library te vinden die HTTPS voor jou afhandelt?

[...]

Als je het dan toch zelf gaat schrijven, doe het dan meteen goed ;)

De methode die jij beschrijft kan niet, want als je de API-key encrypt met een random getal, kan de server hem niet meer decrypten omdat dat random getal niet bekend is.

Tip: cryptografie is moeilijk. Ga niet zelf wat in elkaar lopen prutsen maar volg gewoon een algemeen bekend en gebruikt algoritme. Zoals deze met HMACs bijvoorbeeld: http://www.thebuzzmedia.c...out-oauth-authentication/
Dat ga ik toch maar eens lezen. Ik bedoelde eigenlijk om het random getal erbij te plakken in de data die versleuteld moet worden. Dit om te voorkomen dat elk versleuteld bericht uniek is en er geen constante factor uitgehaald kan worden. Vooralsnog eerst maar eens de rest werkend krijgen :)
Pagina: 1