bstocker
Neuer User
- Mitglied seit
- 27 Aug 2007
- Beiträge
- 19
- Punkte für Reaktionen
- 0
- Punkte
- 1
zur Dokumentation gebe ich dir Recht. Aber das ist eben "Technical Report", kein "Application Notes". Die Ingeneure und Programmer sind eben so, dass es mit der Doku meistens nicht deren Ding ist. Sonst wären sie Deutschlehrer oder Schriftsteller geworden.
Ich kann dem nicht ganz beipflichten. Es gibt eine simple Regel, die zwar nicht immer, aber oft zutrifft: Schlechte Doku == Schlechte Software. Ok, da wird es Einspruch geben; aber so sind meine Erfahrungen. Gute Softwaredokumentation sollte heute eine Selbstverständlichkeit sein.
Hast du es bereits alles gemacht, oder sind es nur Ideen?
Ja, ich habe einen ACS Server für ATM Devices in Perl programmiert. Respektive, ich arbeite daran.
zum 1. Heißt es, dass dein Apache nur http anbietet und CPE nimmt es an, weil https nicht zwingend notwendig ist? Das heißt die Übertragung läuft dann im Klartext? Dann kann man es natürlich loggen...
Laut Spez. kann es https sein, muss aber nicht. Du kannst das jeweils im Protokoll bei der ACS Adresse angeben. Gib dort einfach http://sein.server.net ein, voilà; schon kannst Du nachsehen, das die beiden miteinander besprechen. Dann schreibst Du einen Pel Script, der jeden Request verarbeitet:
my $b; while (my $line .= <STDIN>) {
$b .= $line;
}
open(HF, ">>/tmp/tr69.log"); print HF $b; close(HF);
Jetzt kannst Du alle Requests vom CPE im Klartext im file /tmp/tr69.log sehen.
zum 2. ist das, was ich im Posting #9 gezeigt hatte ein InformRequest von 1und1 ACS?
Das scheint etwas anderes zu sein, ein Inform-Request sieht immer gleich aus, etwa so:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:cwmp="urn:dslforum-org:cwmp-1-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Header>
<cwmp:ID soap:mustUnderstand="1">100</cwmp:ID></soap:Header>
<soap:Body>
<cwmp:Inform>
<DeviceId>
<Manufacturer>AVM</Manufacturer>
<OUI>00040E</OUI>
<ProductClass>FRITZ!Box</ProductClass>
<SerialNumber>001A4FBB8FC4</SerialNumber></DeviceId>
<Event soap-enc:arrayType="cwmp:EventStruct[3]">
<EventStruct>
<EventCode>4 VALUE CHANGE</EventCode>
<CommandKey></CommandKey></EventStruct>
<EventStruct>
<EventCode>1 BOOT</EventCode>
<CommandKey></CommandKey></EventStruct>
<EventStruct>
<EventCode>0 BOOTSTRAP</EventCode>
<CommandKey></CommandKey></EventStruct></Event>
<MaxEnvelopes>1</MaxEnvelopes>
<CurrentTime>0001-01-01T00:00:59</CurrentTime>
<RetryCount>1</RetryCount>
<ParameterList soap-enc:arrayType="cwmparameterValueStruct[8]">
<ParameterValueStruct>
<Name>InternetGatewayDevice.DeviceSummary</Name>
<Value xsi:type="xsd:string">InternetGatewayDevice:1.1[](Baseline:1, EthernetLAN:1, ADSLWAN:1, IPPing:1, WiFiLAN:1), VoiceService:1.0[2](SIPEndpoint:1, Endpoint:1)</Value></ParameterValueStruct>
...
</soap:Body>
</soap:Envelope>
Das heißt ich kann dann auf dem Apache als z.B. index.html zunächst mal den Inhalt dieser Ausgabe hinlegen? Wie sendet man dann die Antwort an CPE? Ich meine, wie lässt sich das überhaupt realisieren? Hast du es schon gemacht? Poste bitte ein Beispiel dazu. Mit dem Header für AVM habe ich ebenfalls nicht ganz kapiert.
Zurücksenden musst Du lediglich einen InformResponse. Wichtig dabei ist, dass Du dieselbe Sequenz wie im Request zurückgibst. Hier etwas Pesudo-Code
1. InformRequest parsen, zum Beispiel mit Perl's tollem XML::Simple;
2. ID aus Header ermitteln (im Beispiel 100):
<cwmp:ID soap:mustUnderstand="1">100</cwmp:ID></soap:Header>
Jetzt einen Response String generieren, der sieht etwa so aus:
$b = "<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cwmp="urn:dslforum-org:cwmp-1-0"
xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<soap:Header>
<cwmp:ID soap:mustUnderstand="1">100</cwmp:ID>
</soap:Header>
<soap:Body>
<InformResponse><cwmp:MaxEnvelopes>1</cwmp:MaxEnvelopes>
</InformResponse>
</soap:Body>
</soap:Envelope>"
print "Set-Cookie: SESSION_ID=<EINDEUTIGEID>\nContent-type: text/xml\n\n";
print $b;
Wichtig: Es muss eine HTTP Session geführt werden. Sende beim ersten Response eine eindeutige SESSION_ID mit. Beim nächsten Request des CPE erh$ltst Du wieder, so kannst Du jedes CPE eindeutig identifizieren.
zum 3. Nochmals, wie machst du dass denn? Bitte Beispiele posten. Quittiert denn CPE dem ACS irgendwie, dass die Session gültig ist bevor ACS mit der Abfragerei loslegen kann? Wie sieht es dann aus?
Also, zuerst sendet das CPE einen Inform Request. Im HTTP-Response lieferst Du als Antwort einen InformResponse zurück. Damit steht die Session. Als nächstes bekommst Du vom CPE einen leeren Request. Jetzt liegt es an Dir, was Du damit tust. Bleibt dieser leere Request ohne Response, ist die Session beendet. Sendest Du im Response eine SOAP Anfrage, bekommst, Du eine entsprechende Antwort. Dann wiederholt sich das Spiel mit dem leeren Request vom CPE.
MfG
Ich kann dem nicht ganz beipflichten. Es gibt eine simple Regel, die zwar nicht immer, aber oft zutrifft: Schlechte Doku == Schlechte Software. Ok, da wird es Einspruch geben; aber so sind meine Erfahrungen. Gute Softwaredokumentation sollte heute eine Selbstverständlichkeit sein.
Hast du es bereits alles gemacht, oder sind es nur Ideen?
Ja, ich habe einen ACS Server für ATM Devices in Perl programmiert. Respektive, ich arbeite daran.
zum 1. Heißt es, dass dein Apache nur http anbietet und CPE nimmt es an, weil https nicht zwingend notwendig ist? Das heißt die Übertragung läuft dann im Klartext? Dann kann man es natürlich loggen...
Laut Spez. kann es https sein, muss aber nicht. Du kannst das jeweils im Protokoll bei der ACS Adresse angeben. Gib dort einfach http://sein.server.net ein, voilà; schon kannst Du nachsehen, das die beiden miteinander besprechen. Dann schreibst Du einen Pel Script, der jeden Request verarbeitet:
my $b; while (my $line .= <STDIN>) {
$b .= $line;
}
open(HF, ">>/tmp/tr69.log"); print HF $b; close(HF);
Jetzt kannst Du alle Requests vom CPE im Klartext im file /tmp/tr69.log sehen.
zum 2. ist das, was ich im Posting #9 gezeigt hatte ein InformRequest von 1und1 ACS?
Das scheint etwas anderes zu sein, ein Inform-Request sieht immer gleich aus, etwa so:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:cwmp="urn:dslforum-org:cwmp-1-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Header>
<cwmp:ID soap:mustUnderstand="1">100</cwmp:ID></soap:Header>
<soap:Body>
<cwmp:Inform>
<DeviceId>
<Manufacturer>AVM</Manufacturer>
<OUI>00040E</OUI>
<ProductClass>FRITZ!Box</ProductClass>
<SerialNumber>001A4FBB8FC4</SerialNumber></DeviceId>
<Event soap-enc:arrayType="cwmp:EventStruct[3]">
<EventStruct>
<EventCode>4 VALUE CHANGE</EventCode>
<CommandKey></CommandKey></EventStruct>
<EventStruct>
<EventCode>1 BOOT</EventCode>
<CommandKey></CommandKey></EventStruct>
<EventStruct>
<EventCode>0 BOOTSTRAP</EventCode>
<CommandKey></CommandKey></EventStruct></Event>
<MaxEnvelopes>1</MaxEnvelopes>
<CurrentTime>0001-01-01T00:00:59</CurrentTime>
<RetryCount>1</RetryCount>
<ParameterList soap-enc:arrayType="cwmparameterValueStruct[8]">
<ParameterValueStruct>
<Name>InternetGatewayDevice.DeviceSummary</Name>
<Value xsi:type="xsd:string">InternetGatewayDevice:1.1[](Baseline:1, EthernetLAN:1, ADSLWAN:1, IPPing:1, WiFiLAN:1), VoiceService:1.0[2](SIPEndpoint:1, Endpoint:1)</Value></ParameterValueStruct>
...
</soap:Body>
</soap:Envelope>
Das heißt ich kann dann auf dem Apache als z.B. index.html zunächst mal den Inhalt dieser Ausgabe hinlegen? Wie sendet man dann die Antwort an CPE? Ich meine, wie lässt sich das überhaupt realisieren? Hast du es schon gemacht? Poste bitte ein Beispiel dazu. Mit dem Header für AVM habe ich ebenfalls nicht ganz kapiert.
Zurücksenden musst Du lediglich einen InformResponse. Wichtig dabei ist, dass Du dieselbe Sequenz wie im Request zurückgibst. Hier etwas Pesudo-Code
1. InformRequest parsen, zum Beispiel mit Perl's tollem XML::Simple;
2. ID aus Header ermitteln (im Beispiel 100):
<cwmp:ID soap:mustUnderstand="1">100</cwmp:ID></soap:Header>
Jetzt einen Response String generieren, der sieht etwa so aus:
$b = "<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cwmp="urn:dslforum-org:cwmp-1-0"
xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<soap:Header>
<cwmp:ID soap:mustUnderstand="1">100</cwmp:ID>
</soap:Header>
<soap:Body>
<InformResponse><cwmp:MaxEnvelopes>1</cwmp:MaxEnvelopes>
</InformResponse>
</soap:Body>
</soap:Envelope>"
print "Set-Cookie: SESSION_ID=<EINDEUTIGEID>\nContent-type: text/xml\n\n";
print $b;
Wichtig: Es muss eine HTTP Session geführt werden. Sende beim ersten Response eine eindeutige SESSION_ID mit. Beim nächsten Request des CPE erh$ltst Du wieder, so kannst Du jedes CPE eindeutig identifizieren.
zum 3. Nochmals, wie machst du dass denn? Bitte Beispiele posten. Quittiert denn CPE dem ACS irgendwie, dass die Session gültig ist bevor ACS mit der Abfragerei loslegen kann? Wie sieht es dann aus?
Also, zuerst sendet das CPE einen Inform Request. Im HTTP-Response lieferst Du als Antwort einen InformResponse zurück. Damit steht die Session. Als nächstes bekommst Du vom CPE einen leeren Request. Jetzt liegt es an Dir, was Du damit tust. Bleibt dieser leere Request ohne Response, ist die Session beendet. Sendest Du im Response eine SOAP Anfrage, bekommst, Du eine entsprechende Antwort. Dann wiederholt sich das Spiel mit dem leeren Request vom CPE.
MfG