mirror of
https://bitbucket.org/myhomie/mycorerepository.git
synced 2025-12-06 09:41:19 +00:00
ArloService - Login, Get Devices, Get Library + SSE WIP (Connection working but no event recorded)
This commit is contained in:
parent
9a1fc65a13
commit
98041c07a3
65
MyCore/Models/Arlo/ArloDevice.cs
Normal file
65
MyCore/Models/Arlo/ArloDevice.cs
Normal file
@ -0,0 +1,65 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MyCore.Models.Arlo
|
||||
{
|
||||
public class ArloDevice
|
||||
{
|
||||
public string userId { get; set; }
|
||||
public string deviceId { get; set; }
|
||||
public string parentId { get; set; }
|
||||
public string uniqueId { get; set; }
|
||||
public string deviceType { get; set; }
|
||||
public string deviceName { get; set; }
|
||||
public string xCloudId { get; set; }
|
||||
public string userRole { get; set; }
|
||||
public int displayOrder { get; set; }
|
||||
public string state { get; set; }
|
||||
public string modelId { get; set; }
|
||||
public bool cvrEnabled { get; set; }
|
||||
public long dateCreated { get; set; }
|
||||
public string skillNumber { get; set; }
|
||||
public Owner owner { get; set; }
|
||||
|
||||
//Camera Specific
|
||||
public string lastImageUploaded { get; set; }
|
||||
public string presignedLastImageUrl { get; set; }
|
||||
public string presignedSnapshotUrl { get; set; }
|
||||
public string presignedFullFrameSnapshotUrl { get; set; }
|
||||
public int mediaObjectCount { get; set; }
|
||||
public bool arloMobilePlan { get; set; }
|
||||
public string interfaceVersion { get; set; }
|
||||
public string interfaceSchemaVer { get; set; }
|
||||
public Properties properties { get; set; }
|
||||
|
||||
//Base Station Specific
|
||||
public Connectivity connectivity { get; set; }
|
||||
public string certAvailable { get; set; }
|
||||
public int automationRevision { get; set; }
|
||||
public bool migrateActivityZone { get; set; }
|
||||
|
||||
}
|
||||
|
||||
public class Owner
|
||||
{
|
||||
public string firstName { get; set; }
|
||||
public string lastName { get; set; }
|
||||
public string ownerId { get; set; }
|
||||
}
|
||||
|
||||
public class Properties
|
||||
{
|
||||
public string modelId { get; set; }
|
||||
public string olsonTimeZone { get; set; }
|
||||
public string hwVersion { get; set; }
|
||||
}
|
||||
|
||||
public class Connectivity
|
||||
{
|
||||
public string type { get; set; }
|
||||
public bool connected { get; set; }
|
||||
public string mepStatus { get; set; }
|
||||
}
|
||||
}
|
||||
12
MyCore/Models/Arlo/UserLocation.cs
Normal file
12
MyCore/Models/Arlo/UserLocation.cs
Normal file
@ -0,0 +1,12 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MyCore.Models.Arlo
|
||||
{
|
||||
public class UserLocation
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
}
|
||||
38
MyCore/Models/Arlo/UserMedia.cs
Normal file
38
MyCore/Models/Arlo/UserMedia.cs
Normal file
@ -0,0 +1,38 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MyCore.Models.Arlo
|
||||
{
|
||||
public class UserMedia
|
||||
{
|
||||
public string ownerId { get; set; }
|
||||
public string uniqueId { get; set; }
|
||||
public string deviceId { get; set; }
|
||||
public string createdDate { get; set; }
|
||||
public string currentState { get; set; }
|
||||
public string name { get; set; }
|
||||
public string contentType { get; set; }
|
||||
public string reason { get; set; }
|
||||
public string createdBy { get; set; }
|
||||
public long lastModified { get; set; }
|
||||
public long localCreatedDate { get; set; }
|
||||
public string presignedContentUrl { get; set; }
|
||||
public string presignedThumbnailUrl { get; set; }
|
||||
public long utcCreatedDate { get; set; }
|
||||
public string timeZone { get; set; }
|
||||
public string mediaDuration { get; set; }
|
||||
public Meta meta { get; set; }
|
||||
public int mediaDurationSecond { get; set; }
|
||||
public bool donated { get; set; }
|
||||
}
|
||||
|
||||
public class Meta
|
||||
{
|
||||
public string bit_rate { get; set; }
|
||||
public string width { get; set; }
|
||||
public string codec_tag_string { get; set; }
|
||||
public string height { get; set; }
|
||||
}
|
||||
}
|
||||
@ -16,6 +16,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="3v.EvtSource" Version="2.0.0" />
|
||||
<PackageReference Include="AspNetCore.Security.Jwt" Version="1.6.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.App" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="2.1.2" />
|
||||
@ -24,6 +25,7 @@
|
||||
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.1.1" />
|
||||
<PackageReference Include="MongoDB.Driver" Version="2.8.0" />
|
||||
<PackageReference Include="MQTTnet" Version="3.0.8" />
|
||||
<PackageReference Include="ServiceStack.Client" Version="5.8.0" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="4.0.1" />
|
||||
<PackageReference Include="YeelightAPI" Version="1.7.0" />
|
||||
</ItemGroup>
|
||||
|
||||
@ -1,11 +1,208 @@
|
||||
using System;
|
||||
using EvtSource;
|
||||
using MyCore.Models.Arlo;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using ServiceStack;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net.Http;
|
||||
using System.Net.Http.Headers;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MyCore.Services
|
||||
{
|
||||
public class ArloService
|
||||
{
|
||||
// API HTTP
|
||||
private const string _arloUrl = "https://arlo.netgear.com/hmsweb";
|
||||
|
||||
private string _loginUrl = $"{_arloUrl}/login/v2";
|
||||
private string _userProfileUrl = $"{_arloUrl}/users/profile";
|
||||
private string _userSessionUrl = $"{_arloUrl}/users/session";
|
||||
private string _userFriendsUrl = $"{_arloUrl}/users/friends";
|
||||
private string _userLocationUrl = $"{_arloUrl}/users/locations";
|
||||
private string _userServiceLevelUrl = $"{_arloUrl}/users/serviceLevel/v2";
|
||||
private string _userDevicesUrl = $"{_arloUrl}/users/devices";
|
||||
private string _userLibraryUrl = $"{_arloUrl}/users/library";
|
||||
private string _userLibraryMetadataUrl = $"{_arloUrl}/users/library/metadata/v2";
|
||||
private string _userPaymentOffersUrl = $"{_arloUrl}/users/payment/offers";
|
||||
|
||||
private string _userDevicesNotifyUrl = $"{_arloUrl}/users/devices/notify";
|
||||
private string _clientSubscribeUrl = $"{_arloUrl}/client/subscribe";
|
||||
|
||||
|
||||
private static string _email = "fransolet.thomas@gmail.com";
|
||||
private static string _password = "Coconuts09";
|
||||
|
||||
private static LoginResult resultToken;
|
||||
|
||||
private List<ArloDevice> allArloDevices;
|
||||
private List<UserMedia> allUserMedias;
|
||||
|
||||
public class Credential
|
||||
{
|
||||
public string email;
|
||||
public string password;
|
||||
}
|
||||
|
||||
public class DateInterval
|
||||
{
|
||||
public string dateFrom;
|
||||
public string dateTo;
|
||||
}
|
||||
|
||||
public class LoginResult
|
||||
{
|
||||
public string userId;
|
||||
public string email;
|
||||
public string token;
|
||||
public string paymentId;
|
||||
public int authenticated;
|
||||
public string accountStatus;
|
||||
public string serialNumber;
|
||||
public string countryCode;
|
||||
public bool tocUpdate;
|
||||
public bool policyUpdate;
|
||||
public bool validEmail;
|
||||
public bool arlo;
|
||||
public long dateCreated;
|
||||
}
|
||||
|
||||
public enum RequestType
|
||||
{
|
||||
Get,
|
||||
Post
|
||||
}
|
||||
|
||||
public enum Request
|
||||
{
|
||||
LOGIN,
|
||||
DEVICES,
|
||||
LIBRARY
|
||||
}
|
||||
|
||||
public ArloService()
|
||||
{
|
||||
|
||||
try
|
||||
{
|
||||
// LOGIN
|
||||
var loginTask = Task.Run(() => RequestURI(new Uri(_loginUrl), RequestType.Post, Request.LOGIN));
|
||||
loginTask.Wait();
|
||||
|
||||
if (loginTask.Result != "")
|
||||
{
|
||||
//RESULT TOKEN
|
||||
var data = ((JObject)JsonConvert.DeserializeObject(loginTask.Result))["data"];
|
||||
resultToken = JsonConvert.DeserializeObject<LoginResult>(data.ToString());
|
||||
|
||||
// GET DEVICE LIST
|
||||
var deviceTask = Task.Run(() => RequestURI(new Uri(_userDevicesUrl), RequestType.Get, Request.DEVICES));
|
||||
deviceTask.Wait();
|
||||
|
||||
if (deviceTask.Result != "")
|
||||
{
|
||||
data = ((JObject)JsonConvert.DeserializeObject(deviceTask.Result))["data"];
|
||||
// RETRIEVE ALL ARLO DEVICES
|
||||
allArloDevices = JsonConvert.DeserializeObject<List<ArloDevice>>(data.ToString());
|
||||
}
|
||||
|
||||
// GET USER LIBRARY
|
||||
var libraryTask = Task.Run(() => RequestURI(new Uri(_userLibraryUrl), RequestType.Post, Request.LIBRARY));
|
||||
libraryTask.Wait();
|
||||
|
||||
if (libraryTask.Result != "")
|
||||
{
|
||||
data = ((JObject)JsonConvert.DeserializeObject(libraryTask.Result))["data"];
|
||||
// RETRIEVE ALL DATA IN USER LIBRARY
|
||||
allUserMedias = JsonConvert.DeserializeObject<List<UserMedia>>(data.ToString());
|
||||
}
|
||||
|
||||
//SSE CONNEXION
|
||||
ConnexionToSSE();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
resultToken = null;
|
||||
}
|
||||
}
|
||||
|
||||
static async Task<string> RequestURI(Uri u, RequestType requesType, Request request)
|
||||
{
|
||||
try
|
||||
{
|
||||
var response = string.Empty;
|
||||
var body = "";
|
||||
HttpContent c = null;
|
||||
using (var client = new HttpClient())
|
||||
{
|
||||
switch (request)
|
||||
{
|
||||
case Request.LOGIN:
|
||||
body = JsonConvert.SerializeObject(new Credential { email = _email, password = _password }).ToString();
|
||||
c = new StringContent(body, Encoding.UTF8, "application/json");
|
||||
break;
|
||||
case Request.LIBRARY:
|
||||
DateTime last7Days = new DateTime(DateTime.Now.Year, 1, 1).AddDays(DateTime.Now.DayOfYear - 7 - 1);
|
||||
body = JsonConvert.SerializeObject(new DateInterval { dateFrom = last7Days.ToString("yyyyMMdd"), dateTo = DateTime.Now.ToString("yyyyMMdd")}).ToString();
|
||||
c = new StringContent(body, Encoding.UTF8, "application/json");
|
||||
break;
|
||||
case Request.DEVICES:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
client.DefaultRequestHeaders.Add("User-Agent", "okhttp/3.6.0");
|
||||
|
||||
if (resultToken != null)
|
||||
client.DefaultRequestHeaders.Add("Authorization", resultToken.token);
|
||||
|
||||
if (requesType == RequestType.Get)
|
||||
{
|
||||
HttpResponseMessage result = await client.GetAsync(u);
|
||||
response = await result.Content.ReadAsStringAsync();
|
||||
}
|
||||
|
||||
if (requesType == RequestType.Post)
|
||||
{
|
||||
|
||||
HttpResponseMessage result = await client.PostAsync(u, c);
|
||||
if (result.IsSuccessStatusCode)
|
||||
response = await result.Content.ReadAsStringAsync();
|
||||
}
|
||||
}
|
||||
return response;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine("ArloService - An error occured in RequestURI");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public void ConnexionToSSE()
|
||||
{
|
||||
/*var sseClient = new ServerEventsClient($"{_clientSubscribeUrl}?token={resultToken.token}", new string[] { "EventStream" })
|
||||
{
|
||||
OnConnect = e => {
|
||||
Console.WriteLine($"{e.IsAuthenticated}, {e.UserId}, {e.DisplayName}");
|
||||
}
|
||||
}.Start();*/
|
||||
|
||||
var evt = new EventSourceReader(new Uri($"{_clientSubscribeUrl}?token={resultToken.token}")).Start();
|
||||
evt.MessageReceived +=
|
||||
(object sender, EventSourceMessageEventArgs e)
|
||||
=>
|
||||
Console.WriteLine($"{e.Event} : {e.Message}");
|
||||
evt.Disconnected += async (object sender, DisconnectEventArgs e) => {
|
||||
Console.WriteLine($"Retry: {e.ReconnectDelay} - Error: {e.Exception}");
|
||||
await Task.Delay(e.ReconnectDelay);
|
||||
evt.Start(); // Reconnect to the same URL
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@ -197,6 +197,9 @@ namespace MyCore.Services
|
||||
return nonceString.ToString();
|
||||
}
|
||||
|
||||
|
||||
#region MQTT
|
||||
|
||||
public class RequestMQTT
|
||||
{
|
||||
public HeaderMqtt header;
|
||||
@ -500,5 +503,6 @@ namespace MyCore.Services
|
||||
if (_client.IsConnected)
|
||||
_client.PublishAsync(mqttMessage);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
@ -28,7 +28,9 @@ namespace MyCore
|
||||
|
||||
//MQTTService mQTTService = new MQTTService();
|
||||
|
||||
MerossService merossService = new MerossService();
|
||||
//MerossService merossService = new MerossService();
|
||||
|
||||
ArloService arloService = new ArloService();
|
||||
}
|
||||
|
||||
public IConfiguration Configuration { get; }
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user