Gå til innhold
  • Bli medlem
borg1n

vb-script, http-post request og linux

Anbefalte innlegg

Jeg sliter med å få vb-script som gjør HTTP POST call til å fungere og lurer på om det er et linux problem (kjører Ubuntu 18.04). 

 

Jeg har prøvd flere varianter og prøvd flere eksempler rett fra nettet, men alle henger og timer ut på HttpWebRequest.GetRequestStream()

(linje Dim myStream As Stream = myWebReq.GetRequestStream() i eksemplet nedenfor). 

 

Er det noen som har vært borte i dette tidligere, eller vet om dette er noe som ikke virker for Ubuntu? 

Imports System.IO
Imports System.Net

Sub Main(ByVal Parms As Object)
	Dim logName As String = "WDTV Live"			'set log name for HS log
	Dim debug As Boolean = True
 
	Dim ParmArray() as String
	ParmArray = Parms.tostring.split(",")			'split parameter into an array
	Dim playerDev As Integer = CInt(ParmArray(0))	'device reference ID for the player's device
	Dim player = ParmArray(1)					'player dns name or ip address
	Dim cmd, cmdType As String

	Select Case hs.deviceValueEx(playerDev)
		Case 33 To 127
			cmdType = "remote"
			cmd = Chr(CInt(hs.deviceValueEx(playerDev)))
		Case 200 To 300
			cmdType = "service"
			cmd = CStr(hs.deviceValueEx(playerDev) - 200)
	End Select

	Dim json As String = "{""" & cmdType & """:""" & cmd & """}"
	If Debug Then hs.writelog(logName, "Command: " & json)
	Dim strURL As String = "http://" & player & "/cgi-bin/toServerValue.cgi"
	Dim myWebReq As HttpWebRequest
	Dim myWebResp As HttpWebResponse
	Dim encoding As New System.Text.UTF8Encoding
	Dim sr As StreamReader
	
	Try
		Dim data As Byte() = encoding.GetBytes(json)
		myWebReq = DirectCast(WebRequest.Create(strURL), HttpWebRequest)
		myWebReq.ContentType = "application/json; charset=utf-8"
		myWebReq.ContentLength = data.Length
		myWebReq.Method = "POST"
		Dim myStream As Stream = myWebReq.GetRequestStream()
        
		If data.Length > 0 Then
			myStream.Write(data, 0, data.Length)
			myStream.Close()
		End If
		
		myWebResp = DirectCast(myWebReq.GetResponse(), HttpWebResponse)
		sr = New StreamReader(myWebResp.GetResponseStream())
		Dim responseText As String = sr.ReadToEnd()
		If Debug Then hs.WriteLog(logName, "Response: " & responseText)

	Catch ex As Exception : hs.writelog(logName, "Error:  " & ex.Message.ToString)
	End Try
End Sub

 

Endret av borg1n

Del dette innlegget


Lenke til innlegg
Del på andre sider

Jeg har kjørt et python script mot maskinen (med json payload) for å sjekke at alt virker, og det gjør det. Jeg prøver sende samme payload via vs-script som virker ok fra python. 

 

Update: ser ut til å være et kjent, gammelt issue med Mono

 

Update-2: Har kommet frem til at det trolig er enklere å lage et shell eller python script som gjør mye av nettverks kallene og parsingen av json (sed + awk er litt attraktive for det formålet) og så lese inn resultatene i et vb-script.

 

aside: Jeg valgte å installere Uponor Smatrix for et år siden for styring av vannbåren varme og tenkte jeg skulle starte å få integrert lesing av temp, humidity, set-point etc i HS3. Jeg ser at det er blitt gjort for Home Assistant, inkl. støtte for å sette temperatur etc. Om noen allerede har gjort noe for HomeSeer integrasjon hadde det vært fint med en sync/ erfarings-utveksling. 

 

Endret av borg1n

Del dette innlegget


Lenke til innlegg
Del på andre sider

Flyttes til riktig forum. ;)

 

Dette burde jo ikke være vanskelig i det hele tatt. Men HTTPrequest og HTTPresponse er den vanskelige (og gamle) måten å gjøre det på. Webclient gjør sånt imidlertid mye enklere. Kan du gjøre noe jeg gjør i NewsReader.vb-scriptet:

 

        Dim source As String = ""
        Try
            Using client As New System.Net.WebClient
                Net.ServicePointManager.SecurityProtocol = Net.SecurityProtocolType.Tls12
                client.Encoding = System.Text.Encoding.UTF8
                source = client.DownloadString(url)
            End Using
        Catch ex As Exception
            hs.WriteLog("Feil", "Net Feil: " & ex.Message)
        End Try

 

Webclient har mange supre metoder, og lar deg gjøre stort sett det du vil.

Del dette innlegget


Lenke til innlegg
Del på andre sider

Jeg får samme type feil når jeg prøver med WebClient, den henger (og timer ut) når jeg prøver initialisere connection. Får vel sove på det, kanskje det dukker opp en ny ide etterhvert

Del dette innlegget


Lenke til innlegg
Del på andre sider

Er du sikker på at URLen er riktig?

Jeg hadde lagt inn en hs.WriteLog som gir hele URLen før før denne linja.

Dim strURL As String = "http://" & player & "/cgi-bin/toServerValue.cgi"

 

 

Med Webblient skal du bruke UploadString.

 

Hele scriptet burde da se slik ut:

Sub Main(ByVal Parms As Object)
	Dim logName As String = "WDTV Live"		'set log name for HS log
	Dim debug As Boolean = True
 
	Dim ParmArray() as String
	ParmArray = Parms.tostring.split(",")		'split parameter into an array
	Dim playerDev As Integer = CInt(ParmArray(0))	'device reference ID for the player's device
	Dim player = ParmArray(1)			'player dns name or ip address
	Dim cmd as String = ""
	Dim cmdType As String = ""

	Select Case hs.deviceValueEx(playerDev)
		Case 33 To 127
			cmdType = "remote"
			cmd = Chr(CInt(hs.deviceValueEx(playerDev)))
		Case 200 To 300
			cmdType = "service"
			cmd = CStr(hs.deviceValueEx(playerDev) - 200)
	End Select

	Dim json As String = "{""" & cmdType & """:""" & cmd & """}"
	If Debug Then hs.writelog(logName, "Command: " & json)

        Dim ouptput As String = ""
	Dim url As String = "http://" & player & "/cgi-bin/toServerValue.cgi"

        Using client = New System.Net.WebClient
            client.Headers.Add("Content-Type", "application/json")
            ouptput = client.UploadString(url, "POST", query)
        End Using
        If Debug Then hs.WriteLog(logName, "Response: " & output)
End Sub

 

 

Hvordan ser eventet som kaller dette ut?

Del dette innlegget


Lenke til innlegg
Del på andre sider

Takk for råd og tips, men er nok redd for at det ikke er der (med mindre jeg ser meg helt blind på dette). Jeg prøver å kjøre følgende: 

 

     
     Dim url As String = "http://192.168.1.33/api"
     Dim response As String
     hs.WriteLog(logName, "Step-1" & url)

 

     Using client As New System.Net.WebClient
         client.Headers.Add("Content-Type", "application/json")
         client.BaseAddress = url
         hs.WriteLog(logName, "Step-2" & url)

         response = client.UploadString(url, "POST", jsonQuery)
         hs.WriteLog(logName, "Step-3" & url)
     End Using
 

Og det henger mellom Step-2 og Step-3. jsonQuery er validert, kopiert fra HS3 log og kjørt fra python ok så det skal ikke være noe feil der heller. 

 

Eventet er manuellt trigget og kjørt.

Endret av borg1n

Del dette innlegget


Lenke til innlegg
Del på andre sider
1 time siden, borg1n skrev:

Eventet er manuellt trigget og kjørt.

Ja, men hva er parametrene?

 

Hvordan ser da en slik URL ut? Og en ferdig tygget JSON string? Hvis det fungerer fint annet sted så er det sikkert kun en liten formateringsgreie...

Del dette innlegget


Lenke til innlegg
Del på andre sider

Ingen parametre. Jeg har tatt et annet fungerende script, kopiert det og testet med det helt enkle test-settet som listet over, uten parametre. Jeg vurderer om jeg skal sette opp en demo HS3 på en windows maskin bare for å sikre at det er et linux/ mono issue, det bør bare ta en time eller så.

 

Har prøvd med forskjellige json stringer, men den riktige som skal brukes er: 

{"jsonrpc":"2.0", "id":8, "method":"read", "params":{"objects":[{"id":"91","properties":{"85":{}}},{"id":"105","properties":{"85":{}}},{"id":"107","properties":{"85":{}}},{"id":"109","properties":{"85":{}}}]}}

 

Som nevnt tidligere er det flere som har rapportert tilsvarende problemer med mono siste 2 årene

Endret av borg1n

Del dette innlegget


Lenke til innlegg
Del på andre sider

Kjører siste mono, versjon 6.4.0.198. Prøvde også med en versjon langt oppe på 5 tallet først. Ser på nettet en person som ikke har fått det til å virker siden versjon 4.8.x

 

Satte opp en kjapp test-installasjon på windows-10 og den virket umiddelbart. Så da mener jeg det er rimelig avklart at problemet er relatert til linux/ mono. Kunne forsåvidt vært brannveggen på min HS3 linux boks, men ettersom python og wget kallene virker fra boksen kan jeg ikke se at det kan være tilfelle.

Endret av borg1n

Del dette innlegget


Lenke til innlegg
Del på andre sider
10 timer siden, borg1n skrev:

{"jsonrpc":"2.0", "id":8, "method":"read", "params":{"objects":[{"id":"91","properties":{"85":{}}},{"id":"105","properties":{"85":{}}},{"id":"107","properties":{"85":{}}},{"id":"109","properties":{"85":{}}}]}}

Når jeg ser denne stusser jeg på om det er riktig. En av fordelen med JSON er jo at alt ikke behøver være definert som strenger, dvs. stå i hermetegn. Hvordan ser det ut i Python?

 

Dette ville jeg tro kunne være riktig:

{jsonrpc:2.0, id:8, method:"read", params:{objects:[{id:91,properties:{85:{}}},{id:105,properties:{85:{}}},{id:107,properties:{85:{}}},{id:109,properties:{85:{}}}]}}

.... og det er ikke sikkert at "read" engang skal stå i hermetegn. Men dette er det jo egentlig mottaker som bestemmer...

 

Mulig at MONO er litt vanskeligere å ha med å gjøre på nøstede hermetegn enn i Windows, så verdt et forsøk.

Del dette innlegget


Lenke til innlegg
Del på andre sider

Gjør ingen forskjell, og strengt tatt ville jeg ansett det som en bug om mono (eller http protokollen for den saks skyld) skulle være sensitiv for utforming av en application level payload. 

Del dette innlegget


Lenke til innlegg
Del på andre sider
2 timer siden, borg1n skrev:

strengt tatt ville jeg ansett det som en bug om mono

Ja, det var poenget mitt: Det er ikke sikkert det er mono som er problemet. Men vanskelig å argumentere for det når det fungerer på Windows...

Del dette innlegget


Lenke til innlegg
Del på andre sider

Fikk omsider testet litt mer, endte opp å lage et C# program for å testkjøre det i mono og det virker ok. Dvs. programmet virker når det er kompilert og kjørt direkte i console/ mono, men ikke når det er invokert som script fra HomeSeer. Kan det være relatert til memory allocation kanskje?

Del dette innlegget


Lenke til innlegg
Del på andre sider

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Fjern formatering

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.


×
×
  • Opprett ny...