ich hatte mal einen anderen Thread aufgemacht wegen der TCP-Anbindung. Die Antworten da waren schon sehr hilfreich. Aber ich bin noch nicht durch damit. Alaska kann mir nicht weiter helfen weil ich eine Subscription ohne Support bei denen habe.
Also: Ich benutze diesen Code, um die Daten abzufragen:
Code: Alles auswählen
// TCP-Verbindung aufbauen
MEMVAR->gnSocket := SocketNew(AF_INET, SOCK_STREAM, 0, @nError)
SocketConnect(MEMVAR->gnSocket, , "192.168.32.2", 7003, @nError)
IF nError <> 0
RETURN "ERROR:" + LTrim(Str(nError))
ENDIF
// Authentifizieren
aInstruct := ConvToOemCP(Chr(0))
SocketSend(MEMVAR->gnSocket, aInstruct)
cEmpfangen := Space(50)
SocketRecv(MEMVAR->gnSocket, @cEmpfangen, 50, , @nError)
DO WHILE .NOT. knx->(EoF())
IF knx->aktiv == .T.
aInstruct := ConvToOemCP("2|" + giraAdresse(&("{" + AllTrim(knx->knoten) + "}")) + "|" + Chr(0))
SocketSend(MEMVAR->gnSocket, aInstruct)
Inkey(1)
SocketRecv(MEMVAR->gnSocket, 50, @cEmpfangen, @nError)
cEmpfangen := StrTran(cEmpfangen, Chr(0), "")
cEmpfangen := AllTrim(SubStr(cEmpfangen, RAt("|", cEmpfangen) + 1))
IF knx->(DbRLock())
knx->letztwert := cEmpfangen
knx->datum := Date()
knx->zeit := Time()
knx->(DbRUnLock())
knx->(DbCommitAll())
knx->(DbSkip(0))
oStatus:setCaption(knx->bezeichnun)
ENDIF
cEmpfangen := Space(50)
ENDIF
knx->(DbSkip())
IF knx->(EoF())
knx->(DbGoTop())
ENDIF
ENDDO
- Das dauert viel zu lange. Ich habe schon rausbekommen durch die Diskussion im TCP-Thread und durch die Kommunikation mit Alaska, daß das Problem darin bestehen dürfte, das ich fix 50 Zeichen abfrage. Die Antwort ist normalerweise aber wesentlich kürzer, oft um die 10-15 Zeichen. Mir ist aber schleierhaft wie ich abfrage, ob das Chr(0) gekommen ist als Abschluß der Antwort.
- Ich habe festgestellt, das teilweise die angekommenen Antworten den Inhalt der vorigen Antwort vorangestellt haben. Wie bekomme ich das hin das sowas nicht mehr passiert?
- Alle abzufragenden Knoten stehen in der knx.dbf drin. Die bestehen aus bis zu 3 numerischen Werten, die ich vorher noch umrechnen muß. Das passiert in der Funktion giraAdresse() gleich ganz
oben in der Schleife. - Die Telegramme sehen immer so aus: "n|knotenadresse|0x00", wobei n 1 oder 2 sein kann (Ausnahme siehe unten der Ping). Die Antworten sehen genau so aus, außer das die mir noch eine Information zurück geben: "n|knotenadresse|Rückgabewert0x00"
- Ich kann den Server auch per Ping auf Erreichbarkeit prüfen, dazu sende ich ihm ein "99||0x00", und der Server liefert mir genau das wieder zurück.
- Den Inkey(1) habe ich nur da drin stehen um abzuwarten, das wirklich das gesamte zurückgelieferte Telegramm empfangen wurde. Ansonsten gehen teilweise Informationen verloren. Wenn ich das Chr(0) abfragen kann wäre das natürlich hinfällig.
Jan