Exchange-guru sökes - Komma åt kalender från Raspberry Pi

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Maj 2005

Exchange-guru sökes - Komma åt kalender från Raspberry Pi

Hej,

Sysslar med ett litet projekt där tanken är att en Raspberry Pi med en liten skärm ska hängas upp utanför ett bokningsbart mötesrum. På skärmen ska det visas om rummet är ledigt eller bokat samt resterande bokningar för dagen. På något sätt behöver jag alltså komma åt kalenderinformationen för det rummet som finns någonstans på Exchange-servern. Raspberryn kommer att vara uppkopplad på samma nätverk som servern. Tanken är att köra Windows 10 IoT på Raspberryn eftersom att det troligtvis rimmar bra med Exchange. Har hittat följande information:

https://msdn.microsoft.com/en-us/office/office365/api/calenda...

Det verkar alltså som att det hyfsat enkelt ska gå att programmera en app i C# som kan hämta kalenderinformation. Jag är dock helt grön på att utveckla i Microsoft-miljö och hade gärna tagit emot lite vägledning. Det verkar till exempel som att jag behöver något 'access token' för att komma åt servern, antar att det är något som serveradministratören måste sätta upp?

All hjälp uppskattas!

Vänliga hälsningar

Rigg: Fractal Design R4 | Corsair 550VX | Asus Z97-A | Intel i7 4790K | Kingston HyperX Fury, 16 GB | nVidia Geforce GTX660Ti | Intel X25-M G2 | SB X-Fi Xtreme Music | IBM Model M Laptop: MacBook Air 13 Mid 2013

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Aug 2009

Titta på https://code.msdn.microsoft.com/exchange/Exchange-2013-Access... kanske kan vara en bra början? Inget jag sysslat med dock så kan inte hjälpa dig mer specifikt.

7900x @ 4,7ghz - 1080ti @ 2100

Trädvy Permalänk
Medlem
Registrerad
Apr 2014

Jag har visserligen enbart använt mig av Exchange Web Services Managed API på en Windows-plattform, men gissningsvis kan samma API användas av Mono på en Linux-plattform.

Du bör inte behöva något annat än följande för att kunna hämta ut kalenderposter från Exchange-servern: Användarnamn, Lösenord och en E-postadress.

Lite beroende på hur miljön du ska koppla upp dig mot är konfigurerad så kan du komma att behöva ange länken till Exchange-servern själv (om autodiscovery inte är korrekt konfigurerat). Man kan även använda sig av impersonifiering om man känner för det (d.v.s. öppna en helt annan användares brevlåda), dock kräver detta att användaren man loggar in som har den rollen på Exchange-servern.

API:et använder en webbservice på Exchange servern för att kommunicera med Exchange, så i praktiken kan man säkerligen skriva om koden till valfritt språk om man har lust eller ork. Potentiellt finns det redan sådana projekt, det är dock inget jag känner till.

Om du vill använda API:et så finns det att ladda ner här.

Nedanstående kodsnutt borde hämta ut kalenderposter för den aktuella dagen (från 00:00 till 00:00 nästkommande dag) och maximalt 10 poster. Mer information om API:et som finns här.

using Microsoft.Exchange.WebServices.Data; using System; using System.Net; namespace MyApplication { class Program { static void Main(string[] args) { var service = new ExchangeService(); service.Credentials = new NetworkCredential("username@contoso.com", "MyPassword"); service.AutodiscoverUrl("user@contoso.com"); CalendarFolder calendar = CalendarFolder.Bind(service, WellKnownFolderName.Calendar, new PropertySet()); CalendarView view = new CalendarView(DateTime.Today, DateTime.Today.AddDays(1.0), 10); FindItemsResults<Appointment> appointments = calendar.FindAppointments(view); foreach (Appointment a in appointments) { Console.Write("Subject: " + a.Subject.ToString() + " "); Console.Write("Start: " + a.Start.ToString() + " "); Console.Write("End: " + a.End.ToString()); Console.WriteLine(); } } } }

-- Citera mig om ni vill få återkoppling --

Trädvy Permalänk
Medlem
Registrerad
Apr 2014

En access token är inget som din administratör måste hjälpa dig med, utan det är något som inloggningsservern utfärdar åt dig när du loggat in.

Jag har själv ganska lite erfarenhet av just dessa, men jag vet att de är grunden till i princip all autensiering i Office 365.

Det finns utöver en access token även en refresh token (den har längre giltighetstid) och kan användas för att få en ny access token när den du hade har gått ut.

Jag har som sagt själv inte labbat särskilt mycket med detta, men jag har för mig att NuGet-paketet ADAL ska hantera hämtandet av access token, hämtande av ny access token baserat på en refresh token.

Det borde finns några exempel på hur man använder biblioteket för det du vill göra.

-- Citera mig om ni vill få återkoppling --

Trädvy Permalänk
Medlem
Plats
Sala
Registrerad
Dec 2005

Använder ni lokal exchange isåfall 2007, 2010, 2013? eller är det office365?

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Maj 2005

Tack alla för hjälpen! Har laborerat lite mer och läst lite här och där och kommit fram till detta:

using System; using Microsoft.Exchange.WebServices.Data; class Program { static void Main(string[] args) { ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2); service.UseDefaultCredentials = true; //service.Credentials = new WebCredentials("****@*****.com", "password"); service.AutodiscoverUrl("******@*****.com", RedirectionCallback); FolderId CalendarId = new FolderId(WellKnownFolderName.Calendar, "******@*******.com"); CalendarFolder calendar = CalendarFolder.Bind(service, CalendarId); CalendarView view = new CalendarView(DateTime.Today, DateTime.Today.AddDays(10.0), 10); FindItemsResults<Appointment> appointments = calendar.FindAppointments(view); foreach (Appointment a in appointments) { Console.Write("Subject: " + a.Subject.ToString() + " "); Console.Write("Start: " + a.Start.ToString() + " "); Console.Write("End: " + a.End.ToString()); Console.WriteLine(); } } static bool RedirectionCallback(string url) { // Return true if the URL is an HTTPS URL. return url.ToLower().StartsWith("https://"); } }

Jag hämtar ID't för rummets kalender och sedan var bara att lista alla bokade möten. Nu blir det till att köpa en Raspberry Pi och implementera detta

Rigg: Fractal Design R4 | Corsair 550VX | Asus Z97-A | Intel i7 4790K | Kingston HyperX Fury, 16 GB | nVidia Geforce GTX660Ti | Intel X25-M G2 | SB X-Fi Xtreme Music | IBM Model M Laptop: MacBook Air 13 Mid 2013