2016-07-06 17 views
1

Ich arbeite an einer Lösung, um Befehle an einen POS-Belegdrucker zu senden und einige Probleme, das Befehlsformat richtig zu bekommen. Ich habe einen Sockel für das Gerät geöffnet und das funktioniert, weil falsche Befehle gedruckt werden. Was die SPEC in diesem Befehl fordert, ist Folgendes zu senden:Swift senden Hex-Daten über TCP-Socket

1B 07 oder in Dezimal 27 7. Was in ASCII ist ESC_KEY BEL. Das einzige Beispiel zeigt die Spezifikation ist für .NET:

MSComm1.Output = Chr $ (& H1B) & Chr $ (& H07)

Was ich versucht worden:

// Sockel ist zuvor mit CFStreamCreatePairWithSocketToHost geöffnet.

var cmd = "27 07" 
if let dataString = "\(cmd)\r".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false), let oStream = self.outputStream { 
     self.outputData.append(dataString) 

     if oStream.hasSpaceAvailable { 
      oStream.write(UnsafePointer((self.outputData.first! as NSData).bytes), maxLength: self.outputData.first!length) 
     } 
    } 

Die Daten sind da, aber ich denke, das Format der Nachricht ist falsch. Jede Hilfe wäre willkommen.

+0

Was Sie an den Drucker senden, ist die Bytefolge 0x50, 0x55, 0x32, 0x48, 0x55, 0x13. Ihr Drucker wartet auf die Bytesequenz 0x1b, 0x07 – user3441734

Antwort

2

Erstellen Sie einfach ein Byte (aka UInt8) Array mit den Daten, die Sie , senden möchten, und dass direkt an die write() Methode der NSOutputStream passieren:

let cmd: [UInt8] = [0x1B, 0x07] 
oStream.write(cmd, maxLength: cmd.count) 

Beachten Sie, dass Bytes an die schicken Ausgabestrom, nicht hex Daten. Es macht durchaus nicht Unterschied, wenn Sie das Array mit hexadezimalen Ganzzahlliterale wie oben, oder als

let cmd: [UInt8] = [27, 7] 

die Daten genau gleich erstellen.

+0

Nicht genug rep zu upvote, aber das hat perfekt funktioniert. Vielen Dank! – user2417738