[C#] com-poort van serial device

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een C# applicatie geschreven waarmee ik kan lezen van transceiver die via usb is aangesloten.
De usb connectie wordt gemapped naar COM. Echter de COM poort kan per pc logischerwijs verschillen.

Is er een manier om vanuit (C#) code uit te zoeken welke COM poort een device gebruikt?!
P.S. De naam van het device is bij mij bekend...

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Deze is redelijk eenvoudig te googlen, heb namelijk -exact- hetzelfde gedaan een paar maaden geleden.
Maar vooruit, om je wat uitzoekwerk te besparen:

(p.s. Mijn Com Emulator heet USB to UART, dus vandaar het matchen op UART.)

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
        private String comPort
        {
            get
            {
                ManagementObjectSearcher deviceList =
                            new ManagementObjectSearcher("SELECT Name from Win32_PnPEntity WHERE Name LIKE '%UART%'");

                if (deviceList != null)
                {
                    // Enumerate the devices
                    foreach (ManagementObject device in deviceList.Get())
                    {
                        string name = device.GetPropertyValue("Name").ToString();
                        Regex com = new Regex(".*\\((?<comport>COM[0-9]+)\\)");
                        Match m = com.Match(name);

                        if (m.Success)
                        {
                            return m.Groups["comport"].ToString();
                        }
                        else
                        {
                            throw new Exception("Couldn't extract COM port from UART Device Identifier.");
                        }
                    }
                }
                throw new Exception("No UART Device Found.");
            }
        }


Deze property returnt de string "com7", als het ding op com poort 7 hangt.
Oh, en notably, als je twee compoort emu's tegelijk aansluit is de keuze ongedefinieerd, maar goed, die aanname viel bij mij buiten de scope. ;)

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Is de naam van het Device in de code gelijk de naam van het device in "apparaatbeheer"

[ Voor 101% gewijzigd door Verwijderd op 02-10-2009 13:15 ]


Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 17-09 10:39

Cloud

FP ProMod

Ex-moderatie mobster

Googlen kan soms veel helpen in zo'n situatie:

http://msdn.microsoft.com...gementobjectsearcher.aspx

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Klopt; ik wist al dat het System.Management moest zijn maar daarin vond hij het niet.
Het toevoegen van een Reference naar System.Management bood oplossing

[ Voor 24% gewijzigd door Verwijderd op 03-10-2009 00:27 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Grijze Vos schreef op vrijdag 02 oktober 2009 @ 12:45:
Deze is redelijk eenvoudig te googlen, heb namelijk -exact- hetzelfde gedaan een paar maaden geleden.
Maar vooruit, om je wat uitzoekwerk te besparen:

(p.s. Mijn Com Emulator heet USB to UART, dus vandaar het matchen op UART.)

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
        private String comPort
        {
            get
            {
                ManagementObjectSearcher deviceList =
                            new ManagementObjectSearcher("SELECT Name from Win32_PnPEntity WHERE Name LIKE '%UART%'");

                if (deviceList != null)
                {
                    // Enumerate the devices
                    foreach (ManagementObject device in deviceList.Get())
                    {
                        string name = device.GetPropertyValue("Name").ToString();
                        Regex com = new Regex(".*\\((?<comport>COM[0-9]+)\\)");
                        Match m = com.Match(name);

                        if (m.Success)
                        {
                            return m.Groups["comport"].ToString();
                        }
                        else
                        {
                            throw new Exception("Couldn't extract COM port from UART Device Identifier.");
                        }
                    }
                }
                throw new Exception("No UART Device Found.");
            }
        }


Deze property returnt de string "com7", als het ding op com poort 7 hangt.
Oh, en notably, als je twee compoort emu's tegelijk aansluit is de keuze ongedefinieerd, maar goed, die aanname viel bij mij buiten de scope. ;)
Je code lijkt voor mij niet te werken, het device wordt WEL gevonden maar toch krijg ik een exception
"throw new Exception("Couldn't extract COM port from...."

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 10:01

Creepy

Tactical Espionage Splatterer

En wat heb je nu zelf al geprobeerd om dat op te lossen? Wat lukte daar niet mee? GoT is niet bedoeld als afhaalbalie voor een kant en klare werkbare oplossing. Een beetje zelf wat moeite erin stoppen wordt wel gewaardeerd ;)

[ Voor 47% gewijzigd door Creepy op 02-10-2009 13:49 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Verwijderd schreef op vrijdag 02 oktober 2009 @ 13:35:
[...]


Je code lijkt voor mij niet te werken, het device wordt WEL gevonden maar toch krijg ik een exception
"throw new Exception("Couldn't extract COM port from...."
Hmm, bij onze driver stond de compoort in de naam van de driver:

Silicon Labs CP210x USB To UART Bridge (COM7)

Even kijken hoe jouw driver heet, en of de com poort daar ook in de naam staat.
Anders moet je wat dieper System.Management induiken en de compoort property daar ergens opvissen.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Creepy schreef op vrijdag 02 oktober 2009 @ 13:48:
En wat heb je nu zelf al geprobeerd om dat op te lossen? Wat lukte daar niet mee? GoT is niet bedoeld als afhaalbalie voor een kant en klare werkbare oplossing. Een beetje zelf wat moeite erin stoppen wordt wel gewaardeerd ;)
Ik heb al diverse manieren geprobeerd. Ik heb het deviceID achterhaald, maar zoeken uit Win32_PnPEntity levert niets op omdat hij mijn query niet accepteerd. Ik heb wat lopen pielen in system.management, onder andere zoeken naar een property van de port maar deze schijnt er niet te zijn ?!.
Kortom het device is vindbaar, maar het vinden van de betreffende com port lukt niet.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
maar zoeken uit Win32_SerialPort levert niets op omdat hij mijn query niet accepteerd
Vermeld dat dan ook allemaal in je posts, en als hij je query "niet accepteerd", dan is het dus ook belangrijk welke query je geprobeerd hebt, en wat een eventuele foutmelding is.
Kortom het device is vindbaar, maar het vinden van de betreffende com port lukt niet.
Wat is de naam van het device wat je vindt dan? De port is inderdaad geen property die je op kunt vragen, maar volgens mij kun je altijd uit de naam van het device de comport achterhalen.

[ Voor 34% gewijzigd door Woy op 02-10-2009 16:03 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Woy schreef op vrijdag 02 oktober 2009 @ 16:02:
[...]

Vermeld dat dan ook allemaal in je posts, en als hij je query "niet accepteerd", dan is het dus ook belangrijk welke query je geprobeerd hebt, en wat een eventuele foutmelding is.


[...]

Wat is de naam van het device wat je vindt dan? De port is inderdaad geen property die je op kunt vragen, maar volgens mij kun je altijd uit de naam van het device de comport achterhalen.
Ik probeer de volgende query uit te voeren:
C#:
1
2
System.Management.ObjectQuery query = new 
ObjectQuery("SELECT Name FROM Win32_SerialPort WHERE DeviceID LIKE '%" + devID + "%'");


Waarin devID het deviceID van het te benaderen device is (ter informatie: FTDIBUS\\VID_0403+PID_E197+FTPWC0KTA\\0000")

Iemand enig idee waarom die query invalid is?!

De naam van het gevonden Device is " temPControl Empfanger". Helaas komt hier de poortnaam niet in voor zoals hier eerder genoemd werd :+

[ Voor 7% gewijzigd door Verwijderd op 03-10-2009 00:34 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op vrijdag 02 oktober 2009 @ 16:40:
[...]
Iemand enig idee waarom die query invalid is?!
Het eerste wat in me opkomt is: Escaping
De naam van het gevonden Device is " temPControl Empfanger". Helaas komt hier de poortnaam niet in voor zoals hier eerder genoemd werd :+
Print ( Die moet je dan dus wel selecteren ) dan eens alle properties van het device wat je nodig hebt. Zie je daar iets terug komen van waaruit je de COM poort kunt afleiden?

Zo nee, hoe bepaal je dan nu handmatig welke COM poort je moet hebben?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

string[] ports = SerialPort.GetPortNames();

dit zou de truuk ook moeten doen

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op vrijdag 02 oktober 2009 @ 18:39:
string[] ports = SerialPort.GetPortNames();

dit zou de truuk ook moeten doen
Misschien moet je iets beter lezen. De code die jij toont geeft alle poorten terug, en de TS wil een specifieke poort van een usb device weten.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • flashin
  • Registratie: Augustus 2002
  • Laatst online: 17-12-2023
En via het register?

C#:
1
2
3
4
5
6
7
8
9
10
11
12
            RegistryKey key = Registry.LocalMachine.OpenSubKey("Hardware\\Devicemap\\Serialcomm");

            try
            {
                object value = key.GetValue("\\Device\\DEVICENAAM");

                return value.ToString();
            }
            catch (NullReferenceException)
            {
                return "false";
            } 

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Woy schreef op vrijdag 02 oktober 2009 @ 17:00:
[...]

Het eerste wat in me opkomt is: Escaping


[...]

Print ( Die moet je dan dus wel selecteren ) dan eens alle properties van het device wat je nodig hebt. Zie je daar iets terug komen van waaruit je de COM poort kunt afleiden?

Zo nee, hoe bepaal je dan nu handmatig welke COM poort je moet hebben?
Escaping dacht ik inderdaad ook gelijk aan toen ik de slashes zag in het device id. Maar dit maakt mijn query toch nog niet "invalid". Verder, de properties van het Device (althans de klasse waarmee ik het device opspoor volgens het voorbeeld van Grijze Vos, zijn te vinden op http://msdn.microsoft.com.../aa394353%28VS.85%29.aspx. Helaas zit hier niets bij wat wat lijkt op de poort van het device 8)7 In eerste instantie heb ik het poortnummer gevonden door te kijken in de device manager, maar hier wil ik de gebruikers van mijn programma niet meer opzadelen 8) Mijn programma moet bij het opstarten gelijk het juiste poortnummer op zoeken

[ Voor 12% gewijzigd door Verwijderd op 03-10-2009 00:24 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je zult dubbel moeten escapen, een maal in de context van C# en eenmaal in de string van je query.

Verder kun je alle informatie die je in de device manager ziet gewoon ophelen via System.Managment. Dus het is alleen een kwestie van kijken welke property je nodig hebt.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Genoeg info om maandag het een en ander uit te gaan proberen. Voor nu allen bedankt voor de tips

[ Voor 66% gewijzigd door Verwijderd op 03-10-2009 22:31 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
C#:
1
2
3
4
5
6
7
8
9
10
ManagementObjectSearcher devList = new ManagementObjectSearcher("SELECT * FROM Win32_SerialPort");
                if (devList != null)
                {
                    foreach (ManagementObject oReturn in devList.Get())
                    {
                        port = oReturn["DeviceID"].ToString();
                    }
                    
                }
                return port;


Bovenstaande code levert alleen COM2 op als resultaat, iemand enig idee hoe dit kan?!
In mijn device manager zie ik namelijk wel meerdere COM poorten.
Mijn device is aangesloten op USB die wordt gemapped naar serial en krijgt daarom COM8, waarom vind ik deze niet :|

[ Voor 2% gewijzigd door Verwijderd op 05-10-2009 10:09 . Reden: verduidelijking ]


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 18-09 21:46

Matis

Rubber Rocket

Je returned op deze manier alleen maar de laatste poort die gevonden wordt in je devList.

Misschien moet je er een array van maken.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 10:08

Haan

dotnetter

Verwijderd schreef op maandag 05 oktober 2009 @ 10:08:
C#:
1
2
3
4
5
6
7
8
9
10
ManagementObjectSearcher devList = new ManagementObjectSearcher("SELECT * FROM Win32_SerialPort");
                if (devList != null)
                {
                    foreach (ManagementObject oReturn in devList.Get())
                    {
                        port = oReturn["DeviceID"].ToString();
                    }
                    
                }
                return port;


Bovenstaande code levert alleen COM2 op als resultaat, iemand enig idee hoe dit kan?!
In mijn device manager zie ik namelijk wel meerdere COM poorten.
Mijn device is aangesloten op USB die wordt gemapped naar serial en krijgt daarom COM8, waarom vind ik deze niet :|
Kijk eens goed wat je doet, je overschrijft steeds de waarde van port ;)

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
En bovendien zul je de USB device volgens mij niet terug vinden in Win32_SerialPort.

Maar eerlijk gezegd heb ik het idee dat je niet erg goed weet waar je mee bezig bent. Als je nu gewoon eerst eens kijkt welke objecten je allemaal terug krijgt van je ManagementObjectSearcher, dan in de properties van die objecten kijkt wat er voor informatie staat, en of je daar genoeg informatie in hebt zitten om te doen wat je wilt. ( Tips bij het debuggen! )

Gewoon in het wilde weg wat code proberen, en hier beginnen met roepen als het niet oplevert wat je wilt is niet echt de manier waarop we het hier graag zien.

[ Voor 7% gewijzigd door Woy op 05-10-2009 10:17 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 17-09 10:39

Cloud

FP ProMod

Ex-moderatie mobster

Woy schreef op maandag 05 oktober 2009 @ 10:16:
En bovendien zul je de USB device volgens mij niet terug vinden in Win32_SerialPort.

[...]
Het USB-device zelf niet nee, maar de poort die die device emuleert natuurlijk wel :)

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Matis schreef op maandag 05 oktober 2009 @ 10:11:
Je returned op deze manier alleen maar de laatste poort die gevonden wordt in je devList.

Misschien moet je er een array van maken.
Wat je zegt klopt, alleen het probleem wat ik vind is dat mijn device aangesloten is op een USB poort en daardoor een niet bestaande COM poort (COM8) toegewezen krijgt. Het resultaat van de hierboven genoemde query levert alleen de twee "echte" compoorten op de pc op.

Is de klasse Win32_SerialPort wellicht niet geschikt voor wat ik probeer te doen!?
Weet iemand welke klasse ik wel moet gebruiken hiervoor 8)7

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
C#:
1
2
3
4
5
6
7
8
9
10
11
12
ManagementObjectSearcher devList = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity ");
            if (devList != null)
            {
                foreach (ManagementObject oReturn in devList.Get())
                {
                    string s = oReturn["Name"].ToString();
                    if (s.StartsWith("temPControl") && s.Contains("COM"))
                    {
                        port = s.Substring(s.Length - 5, 4);
                    }
                }
            }


De volgende code heeft mijn problemen opgelost, bleek dat ik een verkeerde tabel aansprak.
in de tabel PnPEntity stond de naam van de compoort gewoon achter de devicenaam.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Cloud schreef op maandag 05 oktober 2009 @ 10:18:
[...]

Het USB-device zelf niet nee, maar de poort die die device emuleert natuurlijk wel :)
Dat zou je wel denken, maar dat is dus niet (altijd :?) het geval. Ik heb hier namenlijk ook een USB device wat een COM port emuleert, maar die staat niet in de SerialPort list, en ook in het register kan ik hem niet bij de serialports vinden.
Verwijderd schreef op maandag 05 oktober 2009 @ 10:50:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
ManagementObjectSearcher devList = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity ");
            if (devList != null)
            {
                foreach (ManagementObject oReturn in devList.Get())
                {
                    string s = oReturn["Name"].ToString();
                    if (s.StartsWith("temPControl") && s.Contains("COM"))
                    {
                        port = s.Substring(s.Length - 5, 4);
                    }
                }
            }


De volgende code heeft mijn problemen opgelost, bleek dat ik een verkeerde tabel aansprak.
in de tabel PnPEntity stond de naam van de compoort gewoon achter de devicenaam.
En dus had je gewoon wat beter moeten debuggen, want de code van Grijze Vos in de eerste reactie in dit topic bied gewoon de oplossing die je nodig hebt! ( Grijze Vos in "\[C#] com-poort van serial device" )

[ Voor 54% gewijzigd door Woy op 05-10-2009 10:56 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 17-09 10:39

Cloud

FP ProMod

Ex-moderatie mobster

Woy schreef op maandag 05 oktober 2009 @ 10:54:
[...]

Dat zou je wel denken, maar dat is dus niet (altijd :?) het geval. Ik heb hier namenlijk ook een USB device wat een COM port emuleert, maar die staat niet in de SerialPort list, en ook in het register kan ik hem niet bij de serialports vinden.
Het lijkt dan inderdaad per device te verschillen. :) Ik heb in het verleden een soortgelijke situatie gehad, waarbij de geëmuleerde poort wel gewoon tussen de seriële poorten terecht kwam.

Toch is het vreemd, want als zo'n emu-poort niet in die lijsten terecht komt, is de poort dan nog wel op alle locaties (waar je de poort normaliter zou verwachten) bruikbaar? Iets als HyperTerminal e.d.

Maar goed dit gaat wat offtopic, ben blij dat de TS zijn poortje heeft gevonden ;)

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Woy schreef op maandag 05 oktober 2009 @ 10:54:
En dus had je gewoon wat beter moeten debuggen, want de code van Grijze Vos in de eerste reactie in dit topic bied gewoon de oplossing die je nodig hebt! ( Grijze Vos in "\[C#] com-poort van serial device" )
Klopt deels, ware het niet dat mijn device in de tabel Win32_SerialPort onvindbaar was. In ieder geval is het opgelost dus toch iedereen bedankt

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Cloud schreef op maandag 05 oktober 2009 @ 11:08:
[...]
Het lijkt dan inderdaad per device te verschillen. :) Ik heb in het verleden een soortgelijke situatie gehad, waarbij de geëmuleerde poort wel gewoon tussen de seriële poorten terecht kwam.

Toch is het vreemd, want als zo'n emu-poort niet in die lijsten terecht komt, is de poort dan nog wel op alle locaties (waar je de poort normaliter zou verwachten) bruikbaar? Iets als HyperTerminal e.d.
Het gekke is inderdaad dat in C# SerialPort.GetPortnames() wel gewoon de poort terug geeft, dus ik weet ook niet precies waar die zijn informatie vandaan haalt.
edit: Ik heb nog eens goed gekeken in HKLM\HARDWARE\DEVICEMAP\SERIALCOMM staat de poort wel gewoon.
Verwijderd schreef op maandag 05 oktober 2009 @ 11:10:
[...]


Klopt deels, ware het niet dat mijn device in de tabel Win32_SerialPort onvindbaar was. In ieder geval is het opgelost dus toch iedereen bedankt
En dan lees je die post nog eens een keer goed door.

[ Voor 24% gewijzigd door Woy op 05-10-2009 11:17 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • flashin
  • Registratie: Augustus 2002
  • Laatst online: 17-12-2023
Daarom zou je het evt. ook via het register uit kunnen lezen zoals ik omschreef!

Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Verwijderd schreef op maandag 05 oktober 2009 @ 11:10:
[...]


Klopt deels, ware het niet dat mijn device in de tabel Win32_SerialPort onvindbaar was. In ieder geval is het opgelost dus toch iedereen bedankt
Zoals Woy al zei: LEZEN!

Grijze Vos heeft je code gegeven die de Win32_PnPEntity al gebruikte! Daar zat er alleen nog een 'where' clausule vast aan de query, die alleen de devices met 'UART' in de naam op zou hengelen. In plaats van dat jij een efficiente query uitvoert, haal je nu gewoon alle plug en play apparaten op en doe je een naïve iteratie om er één te vinden die begint met 'temPControl'.

Wat dacht je van:
code:
1
SELECT Name from Win32_PnPEntity WHERE Name LIKE 'temPControl%'


Zou dat niet een beter idee zijn?
Pagina: 1