Freitag, 25. Mai 2018

Windows 10 Update 1803 - Sie können kein Verbindung mit der Dateifreigabe herstellen

Liebe Freunde,

Microsoft hat mit dem Windows 10 Update 1803 das Protokoll SMB in der Version 1 standardmäßig deaktiviert. Das Aufrufen einer Netzwerkfreigabe kann kann zu folgender Fehlermeldung führen:

"Fehler bei der erneuten Verbindungsherstellung - Microsoft Windows Network: Sie können keine Verbindung mit der Dateifreigabe herstellen, weil sie unsicher ist. Diese Freigabe erfordert das veraltete SMB-1 Protokoll, das unsicher ist und Ihr System angreifbar machen könnte.
Ihr System erfordert mindestens SMB2. Weitere informationen dazu, wie Sie das Problem beheben, finden Sie unter https://go.microsoft.com/fwlink/?linkid=852747.

Die Verbindung wurde nicht wiederhergestellt."

Falls Ihr also weiterhin auf eine Netzwerkfreigabe zugreifen wollt, die nur SMB1 unterstützt gibt es zum Beispiel zwei Lösungen:


  • Ihr aktualisiert das Betriebssystem, welches die Netzwerkfreigabe zur Verfügung stellt auf eine Version, die mindestens SMB Version 2 unterstütz (Windows Vista / Windows Server 2008 / Für Linux ab Samba Version 3.5)
  • Ihr reaktiviert das SMB1 Protokoll unter Windows 10
    1. Methode 1
      - Öffnet das Programm "Windows feature aktivieren oder deaktivieren"
      - Setzt einen Haken vor den Eintrag 'SMB1.0/CIFS File Sharing Support'
      - OK drücken und den PC neustarten
    2. Methode 2
      - Die Power shell mit Administrator Zugriff öffnen
      - Befehl eingeben: Enable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol
      - mit Y bestätigen. Der PC wird neugestartet.


Es kann aber nun immer noch der Fall sein, dass Ihr Programme von der Netzwerkfreigabe startet, die eine Verbindung zum Internet aufbauen wollen. Leider wird das seit dem Update unterbunden. Ein schönes Beispiel ist Profi Cash.

Ihr werdet in diesen Fällen nicht drumherum kommen, das Programm von einer Netzwerkfreigabe zu starten, die SMB2 oder höher unterstützt.

Viele Grüße

Mittwoch, 23. August 2017

Java Snipped Checksumme für Barcode NVE / SSCC

Wer gerne seine Paletten bzw. Versandeinheiten international einmalig kennzeichnen möchte und über eine GLN Nummer verfügt, benötigt spätestens dann eine Palettenlabel mit entsprechendem Barcode.

Der Barcode für die NVE (Nummer der Versandeinheit) besteht aus einem UCC-128 bzw EAN-128 Barcode, der neuerdings auch unter GS1-128 geführt wird. Bei diesem Barcode handelt es sich grundsätzlich um einen Code128 der durch ein unsichtbares Sonderzeichen  (FNC1) an der ersten Stelle im Code als GS1-128 von Lesegeräten interpretiert wird. Die GS1-128 Spezifikation kann auch in anderen zweidimensionalen Codes z.B. in Datamatrix- oder QR-Codes abgebildet werden.

GS1-128 Barcodes werden von der Industrie genutzt, um verschiedene Informationen innerhalb eines Barcodes zu kodieren und mittels so genannten Datenbezeichnern von einander zu trennen. Diese Bezeichner können zwei- bis vierstellig sein und werden im lesbaren Text von runten Klammern umrahmt. Diese Steuerzeichen geben Aufschluss darüber, wie die folgenden Daten zu interpretieren sind. Es sei noch erwähnt, dass es Datenfelder mit festen Längen sowie Felder mit variabelen Längen gibt. Wird z.b eine Mengenzahl kodiert mittels des Bezeichners (37) kann die anschließende Feldlänge ein bis 6 stellig sein. Damit die Trennung zum nächsten Bezeichner klar ist, kann mit führenden Nullen auf die maximale Länge aufgefüllt werden. Es empfiehlt sich aber mittels Sonderzeichen FNC1 einfach nach der eigentlichen Mengenzahl das Ende zu definieren.

Damit man sich keine all zu großen Gedanken, vor allem über Sonder FNC1-Codes, machen muss, kann man sich der der Java- und C-Bibliothek "iText 5" oder "iText 7" bedienen. Die kann ohne großen Aufwand einen UCC-128 bzw. EAN-128 Barcode direkt über einen String mit inkl. Klammern und Datenbezeichner erzeugen.

    
Mini Snipped für Java mit iText 5:

Document document = new Document(PageSize.A6, 10,10,10,10);
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();

Barcode128 barcode = new Barcode128();
barcode.setCodeType(Barcode.CODE128_UCC);
barcode.setCode("(02)" + label.gtin + "(37)" + label.anz_ve + "(15)" + label.mhd_code + "(10)" + label.lot);
barcode.setBarHeight(mmToPoints(27));

Image code = barcode.createImageWithBarcode(writer.getDirectContent(), BaseColor.BLACK, BaseColor.BLACK);

code.setAbsolutePosition(mmToPoints(5), mmToPoints(50));
code.scalePercent(125);
document.add(code);

Hier wird im Code die EAN bzw GTIN mittels Bezeichner (02), die Anzahl der EAN mittels Zeichen (37), das Mindesthaltbarkeitsdatum (15) sowie der Chargencode mittels (10) kodiert. Die FNC1 Sonderzeichen werden automatisch gesetzt.

Möchte man nun die NVE / SSCC Nummer als Barcode darstellen, wird einfach mittels Bezeichner (00) + Reservenr + GLN-Nummer + Laufendenummer (frei wählbar) + Prüfziffer (Checksum) mit iText kodiert. Reservenr kann zw. 0-9 liegen. Die maximale Länge der laufenden Nummer ergibt sich aus der GLN Nummer. Ist diese z.B. 9-stellig bleiben 7 Stellen für die laufende Nummer. Insgesamt kommt man dann auf 17 Stellen (ohne (00)), mit Prüfziffer (Checksum) auf 18 Stellen.

Die Prüfziffer berechnet sich wie folgt:

Die einzelnen Zahlen der GLN+laufenden Nummer werden rückwärts abwechselnd mit 3 und 1 multipliziert. Begonnen wird immer mit 3. Die Summe der einzelnen Ergebnisse wird aufgerundet auf die nächste 10er Stelle (48 => 50). Die Prüfziffer ergibt sich aus der Differenz von Ergebnis und Gesamtsumme.

Beispiel:
Res.Nr. = 3
GLN = 123456789
Lfnd.Nr = 12345678
NVE ohne Prüfziffer = 31234567891234567
Gesamtsumme =  7*1 + 6*3 + 5*1 + 4*3 + 3*1 + 2*3 + 1*1 + 9*3 + 8*1 + 7*3 + 6*1 + 5*3 + 4*1 + 3*3 + 2*1 + 1*3 + 3*1 = 154
Aufgerundet = 160
Prüfziffer (Checksum) = 154 - 160 = 6
NVE = 31234567891234567 6

Hier ein kleines Java Snippet dafür:


private String generateChecksum(String palnr) {
int checksum = 0;
char[] c = palnr.toCharArray();
int summe = 0;
int multiplikator = 3; //Startwert ist immer 3

for(int i = c.length - 1; i >= 0; i-- ){

summe += c[i] * multiplikator;

//Multiplikator wird ständig gewechselt
if(multiplikator == 1) {
multiplikator = 3;
} else {
multiplikator = 1;
}
}
    checksum = (10 - summe % 10) % 10; // 10 wird zu 0
    return checksum + ""; //Rückgabewert in String umwandeln
}