Nucu Car: Devlog 0x02

  • 2 minute de citit
  • 1 imagine

Disponibil și în English

Pe această pagină

Salut,

Încă lucrez din când în când la proiectul meu NucuCar. Acum sunt la părinții mei și am lăsat Raspberry Pi-ul la apartament, așa că testez doar build-urile pe calculatorul meu. Din fericire pot testa telemetria folosind senzorul de temperatură al procesorului implementat de dotnet IoT.

Pentru pasul următor, mi-am dorit o modalitate eficientă de a stoca datele de telemetrie în cloud, de preferat gratuit, pentru că urmează să fie un proiect de hobby până la urmă.

După ce am testat mai multe soluții, m-am oprit la Firebase. Am încercat să scriu pentru el un publisher de telemetrie folosind SDK-ul său, care folosește intern gRPC, iar totul a mers bine până l-am pus pe placă. Se pare că gRPC pentru dotnet nu funcționează pe Raspberry Pi. Am reușit să fac serverul de bază să funcționeze folosind un hack, dar atât. Așa că am trecut la REST API și am implementat un traducător simplu, care transformă dicționarele C# brute într-un payload JSON compatibil cu cererile POST RESTful ale Firebase.

Proiectul a crescut puțin, iar în starea actuală era destul de încurcat, așa că era nevoie de o restructurare, și asta am făcut:

NucuCar.Domain

Inițial am proiectat proiectul NucuCar.Domain să conțină fișiere .proto și clase de date fără prea multă implementare. Totuși, mai mulți Telemetry Publisher, precum Azure și Disk, erau în acest pachet, ceea ce nu era corect, pentru că aveau prea multă implementare, depindeau de pachete externe grele și ar fi adus prea multă povară.

Clasa abstractă TelemetryPublisher și interfața ITelemeter, care nu conțin implementare, au rămas în NucuCar.Domain, iar publisher-ele concrete împreună cu worker-ul au fost mutate în NucuCar.Telemetry.

Am extras și traducătorul pentru Firebase într-un pachet propriu, aici, și l-am publicat pe NuGet, devenind acesta primul meu pachet publicat. 😀

NucuCar.Common

În NucuCar.Common am mutat câteva clase care erau clase utilitare și încă se aflau în NucuCar.Domain: clasa ConnectionParser și o clasă care oferă protecție simplă a argumentelor.

Un alt lucru de care aveam nevoie și pe care l-am implementat în NucuCar.Common este un wrapper pentru clasa HttpClient. Am considerat că este foarte greoi să serializez JSON de fiecare dată și să-l deserializez când trimit date către Firebase.

Așa că am făcut un wrapper simplu care simplifică procesul, introducând în același timp un mecanism de reîncercare, precum și suport pentru anulare și timeout.

Concluzie

În linii mari, sunt destul de mulțumit de rezultatul final și aștept cu interes să văd ce lucruri interesante pot implementa în viitor.

Nu mai sunt sigur dacă vreau ca acesta să fie un proiect de mașinuță cu telecomandă. Sună bine, dar cred că ar fi mai practic dacă aș putea conecta mai mulți senzori, să creez o interfață simplă și să îmi monitorizez apartamentul cu ajutorul lui. Poate adaug și suport pentru a-mi uda automat plantele, ar fi frumos.

Proiectul este open source și poate fi găsit pe Github-ul meu.

Mulțumesc că ai citit!