Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[VB.NET] system.io stream naar string omzetten

Pagina: 1
Acties:

  • The-Source
  • Registratie: Augustus 2001
  • Laatst online: 09:00
Ik zit met het volgende ik heb een apparaat in het huis met een aantal relais nou kan ik die gewoon netjes via html schakelen maar voor mijn domotica systeem wil ik de status uitlezen. Nou kan ik er prima RSS mee uitlezen maar het probleem is dat er geen guid kenmerk in de xml output zit.
De output is als volgt
XML:
1
2
3
4
5
6
7
8
9
10
11
<response>
<relay0>0</relay0>
<relay1>1</relay1>
<relay2>1</relay2>
<relay3>0</relay3>
<relay4>1</relay4>
<relay5>0</relay5>
<relay6>0</relay6>
<relay7>0</relay7>
<volts>12</volts>
</response>

Domotica leest dus 1malig de file en ook al veranderen de relay waardes veranderd de weergegeven status niet, wat dus door die guid zou moeten komen.
Om van dat probleem af te komen wou ik dus de data ophalen met een vb.net script om deze daarna via een php get naar een database te laden. Via die zelfde pagina eigenlijk weer de output naar buiten sturen maar dan met een guid in de xml output.
Dat gedeelte van de database en php is al gereed alleen ik loop vast op het .net script :( (heb er ook vrij weinig/ geen ervaring mee
Als .net script had ik het volgende:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Imports System.IO
Imports System.Net
Imports System.Text

sub Main(parm as object)

Dim myClient As WebClient = New WebClient()
Dim ETH008data As Stream = myClient.OpenRead("http://192.168.1.45/status.xml")
Dim ETH008data2 AS String = ETH008data.Replace(vbCr, "").Replace(vbLf, "")
 hs.WriteLog("ETH008 xml gelezen:",ETH008data)
DIM response As Stream = myClient.OpenRead("http://www.ikke.nl/status.php?status="  + ETH008data2)
response.Close()
   hs.WriteLog("ETH008 xml weggeschreven:",ETH008data2)
End Sub

Regel 10 en 13 zijn puur voor logboek vermelding en niet belangrijk (werken nu ook niet goed omdat het geen string is ;) )
Regel 9 geeft hier zover ik kan beoordelen het probleem en wat ik via google terug vind is dat wel op te lossen door het volgende stukje code
Visual Basic:
1
2
3
4
5
using (var reader = new StreamReader(ETH008data, Encoding.UTF8))
{
    string value = reader.ReadToEnd();
    // Do something with the value
}

Maar waar en hoe zet ik dat ertussen :?

Taal fouten inbegrepen ;)
Mijn AI Art YouTube kanaal


  • Acid_Burn
  • Registratie: Augustus 2001
  • Laatst online: 02:58

Acid_Burn

uhuh

Je zou kunnen kijken naar StreamReader. Die geef je je ETH008data op en dan readtoend.
Uit mijn hoofd....
Visual Basic:
1
2
3
4
Dim sr as new StreamReader(ETH008Data)
ETH008Data.Position=0
Dim result as string = sr.ReadToEnd
sr.close()

Glass Eye Photography | Zelfbouw wireless fightstick | Mijn puzzel site


  • The-Source
  • Registratie: Augustus 2001
  • Laatst online: 09:00
Beide opties van hierboven geprobeerd maar kwam er toch niet uit.
Uit eindelijk heeft het wel wat geholpen en ben ik tot het volgende gekomen.
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Dim myClient As WebClient = New WebClient()
Dim ETH008data As Stream = myClient.OpenRead("http://192.168.1.45/status.xml")
Dim sr as new StreamReader(ETH008Data) 
Dim ETH008data2 as String

Dim line As String
Do
            line = sr.ReadLine()
            If line Is Nothing Then
                Exit Do
            End If
            ETH008data2 = ETH008data2 + line
 Loop
sr.close()
 ETH008data2 = ETH008data2.Replace(vbCr, "").Replace(vbLf, "")

Dit geeft in ieder geval de juiste output en als ik nu de website versie open :)

Taal fouten inbegrepen ;)
Mijn AI Art YouTube kanaal


  • Mavamaarten
  • Registratie: September 2009
  • Laatst online: 21-11 22:10

Mavamaarten

Omdat het kan!

Is er een reden waarom je geen WebClient gebruikt? Tenzij je per sé een stream wil, is het veel makkelijker om de DownloadString methode van een WebClient te gebruiken, zoals Sig69 al zei.

Android developer & dürüm-liefhebber


  • MrMonkE
  • Registratie: December 2009
  • Laatst online: 04-11 15:26

MrMonkE

★ EXTRA ★

Dim client As WebClient = New WebClient()
Dim reply As String = client.DownloadString("http://192.168.1.45/status.xml")


en using System.Net of hoe je dat in VB doet. include geloof ik.

[ Voor 22% gewijzigd door MrMonkE op 07-07-2014 21:45 ]

★ What does that mean? ★


  • Styxxy
  • Registratie: Augustus 2009
  • Laatst online: 10:21
MrMonkE schreef op maandag 07 juli 2014 @ 21:45:
[...]
en using System.Net of hoe je dat in VB doet. include geloof ik.
Visual Basic .NET:
1
Imports System.Net

;)

  • Siebsel
  • Registratie: November 2004
  • Laatst online: 21-11 15:53
Oef wat doe je moeilijk!

Zoiets heb ik onlangs op ongeveer deze manier opgelost:

Visual Basic:
1
2
3
4
5
6
7
8
9
Dim xml = XDocument.Load("http://192.168.1.45/status.xml")

For iRegel As Integer = 0 To xml.<response>.<aantal>.Value
    Dim waarde as string = xml.<response>.Elements("relay" & iRegel).Value
    ' Doe hier met "waarde" wat je wil, bijvoorbeeld naar je PHP script
    Debug.writeline(waarde)
Next

xml.<response>.<volts>.Value


Hierbij moet je wel even zorgen dat je ook een <aantal></aantal> in je feed moet hebben met het aantal regels voor relay, zodat er gelust kan worden. Ik ben ook absoluut geen ervaren VBer, dus wellicht dat je ook elementen kunt tellen ofzo...

XML:
1
2
3
4
5
6
7
8
9
10
11
12
<response> 
<relay0>0</relay0> 
<relay1>1</relay1> 
<relay2>1</relay2> 
<relay3>0</relay3> 
<relay4>1</relay4> 
<relay5>0</relay5> 
<relay6>0</relay6> 
<relay7>0</relay7> 
<volts>12</volts> 
<aantal>8</aantal>
</response>

[ Voor 7% gewijzigd door Siebsel op 08-07-2014 11:05 ]


  • Viper®
  • Registratie: Februari 2001
  • Niet online
Siebsel schreef op dinsdag 08 juli 2014 @ 11:03:
Oef wat doe je moeilijk!

Zoiets heb ik onlangs op ongeveer deze manier opgelost:

Visual Basic:
1
2
3
4
5
6
7
Dim xml = XDocument.Load("http://192.168.1.45/status.xml")

For iRegel As Integer = 1 To xml.<response>.<aantal>.Value
    Debug.writeline(xml.<response>.Elements("relay" & iRegel).Value)
Next

xml.<response>.<volts>.Value


Hierbij moet je wel even zorgen dat je ook een <aantal></aantal> in je feed moet hebben met het aantal regels voor relay, zodat er gelust kan worden. Ik ben ook absoluut geen ervaren VBer, dus wellicht dat je ook elementen kunt tellen ofzo...

XML:
1
2
3
4
5
6
7
8
9
10
11
12
<response> 
<relay0>0</relay0> 
<relay1>1</relay1> 
<relay2>1</relay2> 
<relay3>0</relay3> 
<relay4>1</relay4> 
<relay5>0</relay5> 
<relay6>0</relay6> 
<relay7>0</relay7> 
<volts>12</volts> 
<aantal>8</aantal>
</response>
Persoonlijk zou ik een foreach gebruiken i.c.m. XmlDocument.SelectNodes

zoiets
code:
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
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(@"D:\temp\contacts.xml");  // use the .Load() method - not .LoadXml() !!

// get a list of all <Contact> nodes
XmlNodeList listOfContacts = xmldoc.SelectNodes("/Contacts/Contact");

// iterate over the <Contact> nodes
foreach (XmlNode singleContact in listOfContacts)
{
   // get the Profiles/Personal subnode
   XmlNode personalNode = singleContact.SelectSingleNode("Profiles/Personal");

   // get the values from the <Personal> node
   if (personalNode != null)
   {
      string firstName = personalNode.SelectSingleNode("FirstName").InnerText;
      string lastName = personalNode.SelectSingleNode("LastName").InnerText;
   }

   // get the <Email> nodes
   XmlNodeList emailNodes = singleContact.SelectNodes("Emails/Email");

   foreach (XmlNode emailNode in emailNodes)
   {
      string emailTyp = emailNode.SelectSingleNode("EmailType").InnerText;
      string emailAddress = emailNode.SelectSingleNode("Address").InnerText;
   }
}
Pagina: 1