Just nu i M3-nätverket
Gå till innehåll

Problem att läsa XML data från http post


csone

Rekommendera Poster

Jag vill ha alla värden instoppade i en databas post.
Det där måste du nog utveckla :)

Skall varje mätning generera en ny rad i databasen?

Skall verkligen alla värden in i denna rad?

Just nu så hanteras dessa nycklar:

PollCount
DevicesConnected
LoopTime
DataErrors
DeviceName
HostName
MACAddress
Name
Family
ROMId
Health
RawData
PrimaryValue
Temperature
UserByte1
UserByte2

Skall alla dessa värden vara fält/kolumner i respektive rad i tabellen, eller hur har du tänkt dig?

 

Vad är det för typ av databas (mySQL, MSSQL, MSAccess) förresten?

Cluster for president!
Det kan du hajja, men en sak i taget wink.gif

Tack för poäng förresten thumbsup.gif

 

 

 

Länk till kommentar
Dela på andra webbplatser

Det där måste du nog utveckla :)

Skall varje mätning generera en ny rad i databasen?

Skall verkligen alla värden in i denna rad?

Just nu så hanteras dessa nycklar:

PollCount
DevicesConnected
LoopTime
DataErrors
DeviceName
HostName
MACAddress
Name
Family
ROMId
Health
RawData
PrimaryValue
Temperature
UserByte1
UserByte2

Skall alla dessa värden vara fält/kolumner i respektive rad i tabellen, eller hur har du tänkt dig?

 

Vad är det för typ av databas (mySQL, MSSQL, MSAccess) förresten?

Det kan du hajja, men en sak i taget wink.gif

Tack för poäng förresten thumbsup.gif

 

Vet inte riktigt vilka poster som är nödvändiga så det känns bäst att plocka in alla i dB och därifrån slussa vidare till andra tabeller...

 

I denna labbmiljö skickas data från en nod - en temperatur. så småningom kommer det upp till 8 noder så jag antar(!) att det som finns under <owd_DS18S20 Description="Parasite power thermometer"> kommer att loopas upp till 8ggr.

 

Så här hade jag tänkt rent dB mässigt i första ledet. Sen kommer data att triggas vidare till andra tabeller och databaser.

 

"INSERT INTO Boombridge

(id, PollCount, DevicesConnected, LoopTime, DataErrors, DeviceName, HostName, MACAddress, Name, Family, ROMId, Health, RawData, PrimaryValue, Temperature,

UserByte1, UserByte2, TS)

VALUES (, N'61887', N'1', N'1.019', N'0', N'Falun_test', N'BOOMBRIDGE', N'00:50:C2:91:B4:EB', N'DS18S20', N'10', N'96000801F6DAF310', N'7',

N'2B000000000000000000000',

N'21.5000 Deg C', N'21.5000', N'75', N'70', GETDATE())"

 

 

Det är en MS SQL dB som jag använder

Länk till kommentar
Dela på andra webbplatser

Fastnade i hockeyn...

 

Ok, det visar sig att klassisk asp är illa lämpad för detta så man måste jobba sig runt det en hel del.

Men nu har jag iaf fått det att fungera se http://code.eforum.kicks-ass.net/335480/

 

Vilka nyckel/värde-par är det som du vill ha ut och vad vill du göra med dem?

 

Hur lyckades du med att läsa av http posten, Cluster? Behövde du något tillägg utanför Classic ASP

?

Länk till kommentar
Dela på andra webbplatser

jag antar(!) att det som finns under <owd_DS18S20 Description="Parasite power thermometer"> kommer att loopas upp till 8ggr.
Ja, det beror väl lite på hur det postas. Om det postas som en XML med flera noder för respektive mätare eller om det postas en XML för varje mätare.
Vet inte riktigt vilka poster som är nödvändiga så det känns bäst att plocka in alla i dB [...]
Ok, har lagt till så att en Insert-sträng skapas i min xmlReciever.asp

 

 

Hur lyckades du med att läsa av http posten, Cluster? Behövde du något tillägg utanför Classic ASP?
Problemet var att det postas mer än bara en ren XML. Posten inleds med:
3cbec9ce8f05

Content-Disposition: form-data; name="owServerData"; filename="details.xml"Content-Type: text/plain

och avslutas med

------------------------------3cbec9ce8f05--

Det är alltså "en fil" som postas. Det finns fler sätt att ta hand om detta men jag valde i detta fall att konvertera från "binärt" till en sträng för att ta bort allt innan XML-deklarationen samt det avslutande.

Därefter laddar jag in strängen i ett "MSXML2.DOMDocument"-objekt mha loadXML.

 

Hur som helst så ser min xmlReciever.asp efter lite labbande nu ut såhär:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%
Function addLeadingZero(str)
  str=Trim(str&" ")
  If len(str)=1 Then str = "0" & str End If
  addLeadingZero = str
End Function

Function BinaryToString(Binary)
 Dim cl1, cl2, cl3, pl1, pl2, pl3
 Dim L
 cl1 = 1
 cl2 = 1
 cl3 = 1
 L = LenB(Binary)
 Do While cl1<=L
   pl3 = pl3 & Chr(AscB(MidB(Binary,cl1,1)))
   cl1 = cl1 + 1
   cl3 = cl3 + 1
   If cl3>300 Then
     pl2 = pl2 & pl3
     pl3 = ""
     cl3 = 1
     cl2 = cl2 + 1
     If cl2>200 Then
       pl1 = pl1 & pl2
       pl2 = ""
       cl2 = 1
     End If
   End If
 Loop
 BinaryToString = pl1 & pl2 & pl3
End Function

' Get posted data into string
strTmpPost = Request.BinaryRead(Request.TotalBytes)
strTmpPost = Trim(BinaryToString(strTmpPost))

' Clean up posted data to mimic valid XML
arrTmpPost = Split(strTmpPost,"<?xml")
If isArray(arrTmpPost) Then
  If uBound(arrTmpPost)>0 Then
     strTmpPost = "<?xml" & arrTmpPost(uBound(arrTmpPost))
     arrTmpPost = Split(strTmpPost,"</Devices-Detail-Response>")
     strTmpPost = arrTmpPost(lBound(arrTmpPost)) & "</Devices-Detail-Response>"
     validXML = True
  Else
     validXML = False
  End If
End If

' Get Key-Value pairs from XML
Set xmlDoc = Server.CreateObject("MSXML2.DOMDocument")
If Not xmlDoc.loadXML(strTmpPost) Then
  strPostData = "ERROR: " & xmlDoc.parseerror.reason &_
  vbCrLf & vbCrLf &_
  "DATA: " & vbCrLf & strTmpPost
Else
  ' Header data
  Set objItems = xmlDoc.getElementsByTagName("Devices-Detail-Response")
     For x = 0 to objItems.length - 1
        Set objItem = objItems.item(x)
        For Each objChild in objItem.childNodes
           sKey = objChild.nodeName
           sValue = objChild.text
           If sKey<>"owd_DS18S20" Then
              strPostData = strPostData & sKey & " = " & sValue & vbCrLf
              strSQLCols = strSQLCols & sKey & ","
              strSQLVals = strSQLVals & "'"&sValue&"',"               
           End If
        Next

     Next
  Set objItems = Nothing

  ' Detail data
  Set objItems = xmlDoc.getElementsByTagName("owd_DS18S20")
     For x = 0 to objItems.length - 1
        Set objItem = objItems.item(x)
        For Each objChild in objItem.childNodes
           sKey = objChild.nodeName
           sValue = objChild.text
           strPostData = strPostData & sKey & " = " & sValue & vbCrLf
           strSQLCols = strSQLCols & sKey & ","
           strSQLVals = strSQLVals & "'"&sValue&"',"
        Next
     Next
  Set objItems = Nothing

  ' Clean up strings
  If Right(strSQLCols,1)="," Then strSQLCols = Left(strSQLCols, Len(strSQLCols)-1) End If
  If Right(strSQLVals,1)="," Then strSQLVals = Left(strSQLVals, Len(strSQLVals)-1) End If

  ' Create SQL-string for insertion into database
  strSQL = "INSERT INTO Boombridge ("&strSQLCols&") VALUES("&strSQLVals&")"

End If
Set xmlDoc = Nothing

' Create textfile
If validXML AND strPostData<>"" Then
  strNow = now()
  strTodaysDate = Year(strNow) &"-"& addLeadingZero(Month(strNow)) &"-"& addLeadingZero(Day(strNow))
  strTime = addLeadingZero(Hour(strNow)) & addLeadingZero(Minute(strNow))

  REMOTE_ADDR = Request.ServerVariables("REMOTE_ADDR")
  HTTP_USER_AGENT = Request.ServerVariables("HTTP_USER_AGENT")

  strPostData = ""&_
  "TIME: " & strNow & vbCrLf &_
  "FROM: " & REMOTE_ADDR & vbCrLf &_
  "USER: " & HTTP_USER_AGENT & vbCrLf & vbCrLf &_
  "POST: " & vbCrLf &_
  "-----------------------------------------" & vbCrLf &_
  strPostData & vbCrLf &_
  "-----------------------------------------" & vbCrLf &_
  "SQL: " & vbCrLf &_
  strSQL

  strFileName = strTodaysDate & "_" &  strTime&".txt"
  strPathToFile = Server.MapPath(".") & "\files\" & strFileName

  SET objFSO=Server.CreateObject("Scripting.FileSystemObject")
  If Not objFSO.FileExists(strPathToFile) Then
     objFSO.CreateTextFile strPathToFile,true
  End If
  Set objFile = objFSO.OpenTextFile(strPathToFile, 2, True)
  objFile.WriteLine(strPostData)
  objFile.Close
  Set objFile = Nothing
  Set objFSO=nothing
Else
  Response.Redirect("/335480/")
End If
%>

 

 

 

 

Länk till kommentar
Dela på andra webbplatser

Ja, det beror väl lite på hur det postas. Om det postas som en XML med flera noder för respektive mätare eller om det postas en XML för varje mätare.

Ok, har lagt till så att en Insert-sträng skapas i min xmlReciever.asp

 

 

Problemet var att det postas mer än bara en ren XML. Posten inleds med:

3cbec9ce8f05

Content-Disposition: form-data; name="owServerData"; filename="details.xml"Content-Type: text/plain

och avslutas med

------------------------------3cbec9ce8f05--

Det är alltså "en fil" som postas. Det finns fler sätt att ta hand om detta men jag valde i detta fall att konvertera från "binärt" till en sträng för att ta bort allt innan XML-deklarationen samt det avslutande.

Därefter laddar jag in strängen i ett "MSXML2.DOMDocument"-objekt mha loadXML.

 

Hur som helst så ser min xmlReciever.asp efter lite labbande nu ut såhär:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%
Function addLeadingZero(str)
  str=Trim(str&" ")
  If len(str)=1 Then str = "0" & str End If
  addLeadingZero = str
End Function

Function BinaryToString(Binary)
 Dim cl1, cl2, cl3, pl1, pl2, pl3
 Dim L
 cl1 = 1
 cl2 = 1
 cl3 = 1
 L = LenB(Binary)
 Do While cl1<=L
   pl3 = pl3 & Chr(AscB(MidB(Binary,cl1,1)))
   cl1 = cl1 + 1
   cl3 = cl3 + 1
   If cl3>300 Then
     pl2 = pl2 & pl3
     pl3 = ""
     cl3 = 1
     cl2 = cl2 + 1
     If cl2>200 Then
       pl1 = pl1 & pl2
       pl2 = ""
       cl2 = 1
     End If
   End If
 Loop
 BinaryToString = pl1 & pl2 & pl3
End Function

' Get posted data into string
strTmpPost = Request.BinaryRead(Request.TotalBytes)
strTmpPost = Trim(BinaryToString(strTmpPost))

' Clean up posted data to mimic valid XML
arrTmpPost = Split(strTmpPost,"<?xml")
If isArray(arrTmpPost) Then
  If uBound(arrTmpPost)>0 Then
     strTmpPost = "<?xml" & arrTmpPost(uBound(arrTmpPost))
     arrTmpPost = Split(strTmpPost,"</Devices-Detail-Response>")
     strTmpPost = arrTmpPost(lBound(arrTmpPost)) & "</Devices-Detail-Response>"
     validXML = True
  Else
     validXML = False
  End If
End If

' Get Key-Value pairs from XML
Set xmlDoc = Server.CreateObject("MSXML2.DOMDocument")
If Not xmlDoc.loadXML(strTmpPost) Then
  strPostData = "ERROR: " & xmlDoc.parseerror.reason &_
  vbCrLf & vbCrLf &_
  "DATA: " & vbCrLf & strTmpPost
Else
  ' Header data
  Set objItems = xmlDoc.getElementsByTagName("Devices-Detail-Response")
     For x = 0 to objItems.length - 1
        Set objItem = objItems.item(x)
        For Each objChild in objItem.childNodes
           sKey = objChild.nodeName
           sValue = objChild.text
           If sKey<>"owd_DS18S20" Then
              strPostData = strPostData & sKey & " = " & sValue & vbCrLf
              strSQLCols = strSQLCols & sKey & ","
              strSQLVals = strSQLVals & "'"&sValue&"',"               
           End If
        Next

     Next
  Set objItems = Nothing

  ' Detail data
  Set objItems = xmlDoc.getElementsByTagName("owd_DS18S20")
     For x = 0 to objItems.length - 1
        Set objItem = objItems.item(x)
        For Each objChild in objItem.childNodes
           sKey = objChild.nodeName
           sValue = objChild.text
           strPostData = strPostData & sKey & " = " & sValue & vbCrLf
           strSQLCols = strSQLCols & sKey & ","
           strSQLVals = strSQLVals & "'"&sValue&"',"
        Next
     Next
  Set objItems = Nothing

  ' Clean up strings
  If Right(strSQLCols,1)="," Then strSQLCols = Left(strSQLCols, Len(strSQLCols)-1) End If
  If Right(strSQLVals,1)="," Then strSQLVals = Left(strSQLVals, Len(strSQLVals)-1) End If

  ' Create SQL-string for insertion into database
  strSQL = "INSERT INTO Boombridge ("&strSQLCols&") VALUES("&strSQLVals&")"

End If
Set xmlDoc = Nothing

' Create textfile
If validXML AND strPostData<>"" Then
  strNow = now()
  strTodaysDate = Year(strNow) &"-"& addLeadingZero(Month(strNow)) &"-"& addLeadingZero(Day(strNow))
  strTime = addLeadingZero(Hour(strNow)) & addLeadingZero(Minute(strNow))

  REMOTE_ADDR = Request.ServerVariables("REMOTE_ADDR")
  HTTP_USER_AGENT = Request.ServerVariables("HTTP_USER_AGENT")

  strPostData = ""&_
  "TIME: " & strNow & vbCrLf &_
  "FROM: " & REMOTE_ADDR & vbCrLf &_
  "USER: " & HTTP_USER_AGENT & vbCrLf & vbCrLf &_
  "POST: " & vbCrLf &_
  "-----------------------------------------" & vbCrLf &_
  strPostData & vbCrLf &_
  "-----------------------------------------" & vbCrLf &_
  "SQL: " & vbCrLf &_
  strSQL

  strFileName = strTodaysDate & "_" &  strTime&".txt"
  strPathToFile = Server.MapPath(".") & "\files\" & strFileName

  SET objFSO=Server.CreateObject("Scripting.FileSystemObject")
  If Not objFSO.FileExists(strPathToFile) Then
     objFSO.CreateTextFile strPathToFile,true
  End If
  Set objFile = objFSO.OpenTextFile(strPathToFile, 2, True)
  objFile.WriteLine(strPostData)
  objFile.Close
  Set objFile = Nothing
  Set objFSO=nothing
Else
  Response.Redirect("/335480/")
End If
%>

 

Igen... Helt outstanding. Funka klockrent.

 

- Allt makt åt Cluster! - Vår befriare! -

 

:D:thumbsup:

Länk till kommentar
Dela på andra webbplatser

Kul att det lirar thumbsup.gif

 

Testa gärna att lägga till ytterligare mätare för att se hur det funkar.

Jag misstänker att du då behöver ändra hur SQL-strängen byggs upp.

 

Hör av dig om du kör fast.

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...