Webutveckling i .NET C# mot Tellstick

Moderator: Telldus

pe_andel
Posts: 10
Joined: Thu Jan 18, 2018 11:08 am

Webutveckling i .NET C# mot Tellstick

Post by pe_andel » Thu Jan 18, 2018 11:08 am

Hej,

Jag har en nybörjarfråga gällande kommunikation med drivrutiner/DLL'er från webapplikationer. Jag har gjort ett par testskott och tex. lyckats skapa en Windows Forms App i C# som styr mina enheter, dels med en .NET-wrapper som jag hittade här i forumet och dels genom att själv direkt anropa metoder i TelldusCore.dll.

Nu till frågan... Måste man arbeta med en Windows applikation eller Windows Service för att kunna kommunicera med Tellsticken/TelldusCore? Kan jag inte direkt från min web-app gå via .Net-wrappern eller TellduseCore.dll'en? När jag försöker gå direkt mot DLL'en får jag följande fel "An attempt was made to load a program with an incorrect format" och när jag refererar in .Net-Wrappern får jag det liknande felet "Could not load file or assembly 'TellStick' or one of its dependencies. An attempt was made to load a program with an incorrect format".

Jag hade även problem att hitta någon "officiell" version av .Net-wrappern även om jag såg den omnämnas i forumet. Vad är det som gäller på den punkten? Var hittar jag den wrapper som jag bör använda?

Tack för att ni hjälper en integrationsnybörjare.
Mvh,
Pelle

MartinV
Posts: 277
Joined: Thu Jan 18, 2018 11:08 am
Contact:

Re: Webutveckling i .NET C# mot Tellstick

Post by MartinV » Thu Jan 18, 2018 11:08 am

Låter som om problemet är att du kör i 64-bitarsmiljö. Prova att slå över till 32-bitarsläge på webbapplikationens applikationspool.
Martin | http://www.switchking.se
Testa Switch King Pro i din Android/iPhone/iPod: http://www.switchking.se/sv/demo

pe_andel
Posts: 10
Joined: Thu Jan 18, 2018 11:08 am

Re: Webutveckling i .NET C# mot Tellstick

Post by pe_andel » Thu Jan 18, 2018 11:08 am

Tusen tack! Det verkar ha tagit mig framåt. Nu smäller ingenting utan alla anrop går igenom men returnerar inte korrekt data från web-appen. Ifrån Windows-Forms funkar allt som sagt var.

Ett exempel är om jag från Webben anroper Core.DLL'ens tdGetNumberOfDevices-funktion då jag får -1 tillbaka. Ifrån Forms-appen får jag tillbaka det korrekta svaret 2. Om jag istället går via .NET-wrappern får jag 0 enheter tillbaka från Web men korrekta 2 från Forms.

Några ytterligare idéer?

Mvh,
Pelle

MartinV
Posts: 277
Joined: Thu Jan 18, 2018 11:08 am
Contact:

Re: Webutveckling i .NET C# mot Tellstick

Post by MartinV » Thu Jan 18, 2018 11:08 am

Om du bara har satt upp din webb som en standardsajt så måste du skruva ytterligare. Du måste antingen sätta upp att applikationspoolen körs med ditt eget konto hela tiden, alternativt att du slår på Windows-inloggning på din webbplats och sedan sätter att applikationspoolen ska köra med samma identitet som den användare som är inloggad på webbplatsen.

Som det är nu så körs webben med ett systemkonto och det kontot vet inte vilka enheter du har lagt upp i Telldus Center. Alternativt så kan du tvinga om Telldus Center att använda "Shared Devices", vilket gör att enheterna blir tillgängliga oavsett användare och läggs i ett gemensamt lagringsutrymme istället för ett privat (per användare). Det är exempelvis så Switch King jobbar...
Martin | http://www.switchking.se
Testa Switch King Pro i din Android/iPhone/iPod: http://www.switchking.se/sv/demo

micke.prag
Site Admin
Posts: 2216
Joined: Thu Jan 18, 2018 11:08 am
Location: Lund
Contact:

Re: Webutveckling i .NET C# mot Tellstick

Post by micke.prag » Thu Jan 18, 2018 11:08 am

Om det är en webb-applikation du utvecklar kan du även ta en koll på Telldus Live! som är tänkt för just detta.

http://live.telldus.com

Dokumentation:
http://api.telldus.com/documentation/index

Testa APIt direkt:
http://api.telldus.com/explore/index
Micke Prag
Software
Telldus Technologies

pe_andel
Posts: 10
Joined: Thu Jan 18, 2018 11:08 am

Re: Webutveckling i .NET C# mot Tellstick

Post by pe_andel » Thu Jan 18, 2018 11:08 am

Det skumma är att när jag flyttar hela lösningen till min 32-bits LapTop och kör den via Visual Studio 2008 så fungerar allt. Där har jag inte skruvat något med speciella konton eller Shared Devices eller liknande. Men på 64-bitars-datorn som kör Visual Studio 2010 får jag som sagt var inga devices... Jag testade även att lägga upp en Virtuell-maskin som körde 32-bitars Win7 och installerade Studio och allt på den, men även där får jag 0 devices. Kanske är lite speciellt i och för sig då Sticken sitter i 64-bitars-maskinen och virtualiseras in i 32-bitars-miljön, hehe.

Däremot tycker jag att det för mitt behov låter precis som att Shared Devices är något jag vill köra med i Telldus Center. Sökte fram lite i forumet så nu blir det in i registret och "hacka" lite som jag förstod det :) Tack ännu en gång för hjälpen. I värsta fall får jag sköta all utveckling från min 32-bits LapTop då, där funkar det ju klockrent.

pe_andel
Posts: 10
Joined: Thu Jan 18, 2018 11:08 am

Re: Webutveckling i .NET C# mot Tellstick

Post by pe_andel » Thu Jan 18, 2018 11:08 am

Slog mig just att även om jag flyttar devices till Local Machine i Registret så kommer jag ju alltid få problemet med nyupplagda devices i Telldus Center som ju alltid hamnar i Current User. Kan man inte tvinga/ställa in Telldus Center att alltid direkt lägga enheterna så att de blir Shared så att säga?

MartinV
Posts: 277
Joined: Thu Jan 18, 2018 11:08 am
Contact:

Re: Webutveckling i .NET C# mot Tellstick

Post by MartinV » Thu Jan 18, 2018 11:08 am

Om du sätter SharedDevices=1 så kommer inte TC att använda CurrentUser alls...
Martin | http://www.switchking.se
Testa Switch King Pro i din Android/iPhone/iPod: http://www.switchking.se/sv/demo

pe_andel
Posts: 10
Joined: Thu Jan 18, 2018 11:08 am

Re: Webutveckling i .NET C# mot Tellstick

Post by pe_andel » Thu Jan 18, 2018 11:08 am

Japp, det gjorde susen! Kom även på varför det fungerade på min LapTop, där körde jag ju med Studios inbyggda web-server, så där gissar jag att allt kördes under mitt egna systemkonto som ju körde Visual Studio. Så fort jag på LapToppen switchar över till IIS'en så får jag samma problem även där.

Då kan man summera tråden såhär... På 64-bitars-datorer är det viktigt att man ställer om ApplicationPoolen som web-systemet körs under att tillåta 32-bit applikationer. Generellt gäller även att man har koll på vilken användare som kör web-appen och att den har tillgång till alla devices som ligger i Telldus Center. Lättast löses detta genom att lägga till en inställning (REG_DWORD) i registret "SharedDevices" under "HKEY_LOCAL_MACHINE\SOFTWARE\Telldus\Devices" som man sätter till 1. Då får alla användare på datorn tillgång till alla devices man lägger upp i Telldus Center.

Jätte tack för all hjälp att komma igång! Du blir det till att leka vidare :)

pe_andel
Posts: 10
Joined: Thu Jan 18, 2018 11:08 am

Re: Webutveckling i .NET C# mot Tellstick

Post by pe_andel » Thu Jan 18, 2018 11:08 am

Jag har fortfarande problem med att köra på IIS'en vs. inbyggda webservern i Visual Studio där allt fungerar. Nog för att jag får tillbaka rätt mängd Devices men när jag försöker accessa ett device så kraschar allt med ett ohanterat fel som måste debuggas i en separat Visual Studio. Där är allt man får ledtråden "Unhandled Exception... a Heap was destroyed" eller liknande. Detta gäller oavsett miljö/dator.

Då det fungerar i den inbyggda web servern i Studio antar jag att det fortfarande har med konton/rättigheter/åtkomst att göra associerat med att web-processen körs med ett systemkonto medans Studio körs som "mig".

Ideér?

micke.prag
Site Admin
Posts: 2216
Joined: Thu Jan 18, 2018 11:08 am
Location: Lund
Contact:

Re: Webutveckling i .NET C# mot Tellstick

Post by micke.prag » Thu Jan 18, 2018 11:08 am

Om du vågar testa möjligen ostabil kod får du gärna testa betan som ska bli 2.1 så småningom.
Alla enheter sparas i HKEY_LOCAL_MACHINE, en hel del minnesfixar samt ett 64-bit bibliotek medföljer.

Vill dock bara påpeka att det är en beta så mycket annat kanske inte fungerar istället.

Ladda ner:
http://download.telldus.se/TellStick/So ... .0.103.exe
Micke Prag
Software
Telldus Technologies

pe_andel
Posts: 10
Joined: Thu Jan 18, 2018 11:08 am

Re: Webutveckling i .NET C# mot Tellstick

Post by pe_andel » Thu Jan 18, 2018 11:08 am

Hej,

Jag skall snarast testa senaste beta-versionen och återkommer med en rapport. Men generellt då jag har ovanstående problem på både 64-bitarsdatorn och 32-bitarsdatorn tror jag snarare att det handlar om något vanligt misstag jag gjort när jag konfigurerat IIS'en. Allt fungerar ju som sagt var i Visual Studios inbyggda webserver...

Så förmodligen räcker det inte med att Telldus Center lägger alla Devices i LOCAL_MACHINE, jag måste kanske även ändra kontot i IIS'en som min ApplicationPool använder sig utav, eller vad tror du?

pe_andel
Posts: 10
Joined: Thu Jan 18, 2018 11:08 am

Re: Webutveckling i .NET C# mot Tellstick

Post by pe_andel » Thu Jan 18, 2018 11:08 am

Hej igen, har ännu inte testat beta-versionen men ville först bara posta felet i ett så litet testexempel som möjligt. När jag kör nedanstående metod så kraschar allt på andra raden där devicets namn försöker hämtas ut. Det är inte mitt program som kraschar utan själva w3wp-processen. Felet som fås från w3wp är: "Unhandled exception at 0x77d42913 in w3wp.exe: 0xC0000374: A heap has been corrupted."

public static void Test()
{
int i = External.tdGetNumberOfDevices();
string name = External.tdGetName(i - 1);
}

Denna metod fungerar som sagt var att köra/debugga från Visual Studios Development Server men inte från IIS'en. Vad som däremot fungerar klockrent (även via IIS'en) är att sätta på och stänga av devices med avseeende på deras ID. Det är just bara när jag skall hämta ut information om ett device (tex. namn eller modell) som w3wp kraschar ifrån IIS'en.

Nästa steg blir att testa beta-versionen för att se om det löser sig då. Annars vet jag inte vad jag skall gå vidare med? Kanske med att försöka sätta mitt lokala admin-konto på AppPoolen så att den kör som en lokal administrator istället för systemkontot.

MartinV
Posts: 277
Joined: Thu Jan 18, 2018 11:08 am
Contact:

Re: Webutveckling i .NET C# mot Tellstick

Post by MartinV » Thu Jan 18, 2018 11:08 am

Du måste få tag i enhetens ID innan du kör tdGetName.
tdGetName tar ett ID som parameter - inte enhetens index...

Sen kanske det inte är det som är själva problemet men ändå..
Martin | http://www.switchking.se
Testa Switch King Pro i din Android/iPhone/iPod: http://www.switchking.se/sv/demo

MartinV
Posts: 277
Joined: Thu Jan 18, 2018 11:08 am
Contact:

Re: Webutveckling i .NET C# mot Tellstick

Post by MartinV » Thu Jan 18, 2018 11:08 am

Jag såg också en annan sak som kan ställa till det (iaf i längden). Du har glömt att släppa strängarnas pekare...

Mina anrop till exempelvis tdGetName ser ut så här:

Code: Select all

[DllImport("TelldusCore.dll")]
private static extern IntPtr tdGetName(int intDeviceId);

[DllImport("TelldusCore.dll")]
public static extern void tdReleaseString(IntPtr str);

public static string tdGetNameSafe(int intDeviceId)
{
     IntPtr p = tdGetName(intDeviceId);
     string s = Marshal.PtrToStringAnsi(p);
     tdReleaseString(p);
     return s;
}
...där jag ropar på tdGetNameSafe istf tdGetName... Det tog ett tag att komma på detta, faktiskt, eftersom man inte är så hemma i pekarnas värld... ;)
Martin | http://www.switchking.se
Testa Switch King Pro i din Android/iPhone/iPod: http://www.switchking.se/sv/demo

Post Reply