Sorry, das war der falsche Code im Zwischenspeicher :/
Abruf der Seriennummer
function TSwissbitAccess.tseSerialNumber(pi : pWormInfo) : String; var serialNumber: PPByte; serialNumberLength: Pworm_uint; n : Integer; bytes : TBytes; begin GetMem(serialNumberLength, 10); GetMem(serialNumber, 20); worm_info_tseSerialNumber(pi, serialNumber, serialNumberLength); SetLength(bytes, (serialNumberLength^)-1); for n := 0 to (serialNumberLength^)-1 do begin bytes[n] := serialNumber^[n]; end; Result := TNetEncoding.Base64.EncodeBytesToString(bytes); end;
Wir machen das ganze so:
procedure TSwissbitAccess.info_tseSerialNumber(info: Pointer; out serialNumber: String); var tmpSerialNumber: PByteArray; tmpSerialNumberLength: Integer; begin Assert(@worm_info_tseSerialNumber <> nil, 'Function not found: worm_info_tseSerialNumber'); worm_info_tseSerialNumber(info, tmpSerialNumber, tmpSerialNumberLength); serialNumber := ByteArrayToHex(tmpSerialNumber, tmpSerialNumberLength); end;
Die Funktion "ByteArrayToHex" macht dann folgendes:
function TSwissbitAccess.ByteArrayToHex(bArray: PByteArray; Laenge: Integer): String; var dataIn: TBytes; b: Byte; begin SetLength(dataIn, Laenge); Move(bArray[0], dataIn[0], laenge); Result := ''; for b in dataIn do begin Result := Result+IntToHex(b, 2); end; end;
Wir arbeiten mit Delphi XE3, deswegen kann es sein, dass wir das ein oder andere evtl. etwas anders machen, als es mit neueren Versionen möglich ist.
@Dennis
Wie bindest Du die WormAPI.dll in Delphi XE3 ein?
mfg
Frank
Hallo Frank,
wir nutzen die Stdcall-DLL und binden diese dynamisch ein.
Was brauchst du noch an Infos?
Mfg
Dennis
@Dennis:
Das heißt du konvertierst die Bytes die zurückkommen nur in Hexadezimalform und gibst sie aus?
Weil in diesem Beispiel hier: https://gastro-misgmbh.freshdesk.com/support/solutions/articles/36000180682-code-samples
wird ja auch noch mit Base64 gehashed / verschlüsselt...
Das machst du wenn ich das sehe aktuell nicht, bin mir aber nicht ganz sicher ob ich das machen muss :D
MfG
Kevin
@Kevin
Du hast recht. Ich gebe das an der Stelle einfach als Hex zurück. Das Umwandeln in Base64 mache ich an einer anderen Stelle (bzw. hast du mich da gerade drauf gebracht :D)
Bei den anderen Sachen (PublicKey und Signatur) habe ich das aber schon drin gehabt.
MfG
Dennis
@Dennis
Haha, wir schaffen das hier doch gemeinsam :)
Kannst du mir den Gefallen tun und ein Beispiel von deinen PublicKey, Signatur und Seriennummer mal posten, damit ich sehe ob das irgendwie dem nahe kommt, was ich da habe?
VG
Kevin
@Kevin
Na klar:
PublicKey: BIHrJW6EgK8G+T4OWvm9j1gfd/HIR5reu41yTGsNWzyAEgcAXuBweZF/Bp0X/g18O3ROMW9JLnaVD7fNPXQLRqiitiq2DRxAapSvBiew6YOlChm6J4X7ypuPDuKUL2h8ng== Seriennummer: z05RFgap9pRGa0v8VIrqKFCiQULUbfqb79WIUpNlZXI= Signatur: NB5hjDXC1eUvPgd6EvfqW8zCJ7ZjTu1HlxncPZIak7UX2t5Nrdmwp/sD4eqvB7xeUuUgkVdaObnMr5XE9gAo4FLvKX8Lgmxqo1OIdaGusvuga2W+25a/GH9kMlgR9BS/
@alle
Die Seriennummer sollte immer im Oktett-Format übergeben werden (Taxonomie, Rechnung). Das Codebeispiel stammt noch von früher und wurde wahrscheinlich Copy-Paste eingefügt. Sie können die Seriennummer natürlich auch als Base64 speichern, aber übergeben sollten sie diese immer im Oktett-Format. PublicKey und Signatur dagegen als Base64-String :)
Die Seriennummer ist im Endeffekt nur der Hash des PublicKeys.
@Maximilian:
Jetzt stehe ich gerade auf dem Schlauch...
Oktett Format heißt ich soll die Bytes in Hexadezimaldarstellung als String ausgeben?
Genau :) Das ist bei der Seriennummer so vorgegeben.
Vielleicht einmal zum Abgleich mit den Kollegen:
Seriennummer:76E0962B2DB01E75FDC23D8EA01EA61ACDD100A01EA5AD445DFDE307B517859C
Public Key:BAGqED33GyuUrluLNndB0BQhElWUF/XLiTe8hvotpPK44aMtym3E5uitejObf9MDBnaAaPorl7n5
M80RVvcNrU+SnKxpGh/AjT77NvN3d8dEcwpPFxZNFUzpeYNRIft+
@Dennis: Du hattest ja dann doch recht ;)
Ist das so richtig für PublicKey?
public string Myworm_info_tsePublicKey()
{
worm_info_tsePublicKey(info, out var intptr, out var count);
byte[] publicKey = new byte[count];
Marshal.Copy(intptr, publicKey, 0, count);
string bitString = Convert.ToBase64String(publicKey);
return bitString;
}
Ergenbis: BGS3kdfN5fV2LyYcCszUrciaz9kwoUCSIoTWN17j00pGox59vRjgUbXq / USoPD / XbEb6HIIbIyqFtAqHAFXO77xI / zuV6VYjzS6ByKFANEhGRZps5ukLsG5qb07nYSFmfw ==
Kevin Behrens
Hallo zusammen,
wir sind uns inzwischen unsicher geworden, ob die Art und Weise, wie wir die Seriennummer auslesen korrekt ist...
Ich bekomme von der entsprechenden DLL Funktion Bytes zurück, die ich dann nach Dokumentation Gastro-Mis nur mit Base64 encode?
Ist das korrekt? Vielleicht kann ein anderer Delphi-Kollege mir da helfen? :)
Danke und VG
Kevin
1 Person hat diese Frage