蓝牙收据打印机 - 无法更改打印机的代码页

时间:2016-01-27 09:02:32

标签: qt printing bluetooth

我有以下设置:

  1. 使用内核Ubuntu 14.04.3 LTSLinux work002 3.19.0-47-generic #53~14.04.1-Ubuntu SMP Mon Jan 18 16:09:14 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
  2. Qt 5.5.1 Opensource 64bit的工作站
  3. 一些 usb< - >蓝牙加密狗,已经工作得很好
  4. 来自中国的
  5. 基于蓝牙的noname 48毫米收据打印机,在没有任何文档的情况下发送给我(假设 ESC/POS命令集)。
  6. 现在,这个设置似乎(初始连接,配对和一旦配对蓝色 LED二极管打开打印机)工作,因为我可以通过{{3在打印机上打印一些文本方法:

    this->ueBtPrinterSocket()->write(QByteArray("Printer ready. @[\\]^`{|}~ ĐŠŽĆČđšžćč"));
    

    但是,我来自斯洛文尼亚,我需要斯洛文尼亚字母,这就是为什么我把斯洛文尼亚字母放到上write - ĐŠŽĆČđšžćč,我得到一些中文字母。因此,我尝试根据QBluetoothSocket::write更改打印机代码页,但没有成功:

    QByteArray cmdChangeCodePageToSlovene;    // ESC t n
    cmdChangeCodePageToSlovene.resize(3);
    cmdChangeCodePageToSlovene[0]=0x1b;
    cmdChangeCodePageToSlovene[1]=0x74;
    cmdChangeCodePageToSlovene[2]=0x18;
    qint64 result=this->ueBtPrinterSocket()->write(cmdChangeCodePageToSlovene);
    
    qDebug() << Q_FUNC_INFO
             << " bytes written:"
             << result;
    

    qDebug()输出通知我:

      

    void UeBluetoothManager :: ueSlotBtPrinterPairedAndConnected()bytes   书面:3

    没关系。现在,中国制造商最终给我发了一些Android的代码,这些代码很难称为SDK,并且有一个.jar库用于处理打印机。我已将此.jar文件上传到ESC t n function网站,并且我发现了以下反编译方式更改了打印机的代码页:

    public int SetCharacterSet(int Value) {
        if (g_nConnect != 1) {
            return 101;
        }
        if (!(Value > 0 && Value < 10 || Value > 16 && Value < 19 || Value != 255)) {
            return 104;
        }
        byte[] send = new byte[]{27, 116, 1};
        send[2] = (byte)Value;
        try {
            out.write(send);
            return 0;
        }
        catch (IOException e) {
            e.printStackTrace();
            return 402;
        }
    }
    

    这与我更改打印机代码页的Qt代码基本相同(因此我可以假设打印机命令集至少是基本的ESC/POS),所以我可以假设我走在正确的轨道上。现在,我已使用Wireshark检查了蓝牙流量,但是,我找不到0x1b 0x74 18(更改代码页的命令)数据流发送到打印机。这可能是代码页没有改变的原因,或者有人可以给我一些指导方针吗?我还尝试将代码页更改为Windows-1250ISO8859-2: Latin 2,没有效果。

1 个答案:

答案 0 :(得分:1)

问题似乎是您没有将UTF-8字符转换为输出字符集。

QByteArray cmdSetCharSet;
cmdSetCharSet.resize(3);
cmdSetCharSet[0] = 0x1b;
cmdSetCharSet[1] = 0x74;
cmdSetCharSet[2] = 0x2; //OEM850

this->ueBtPrinterSocket()->write(cmdSetCharSet);

QTextCodec *codec = QTextCodec::codecForName("IBM850");
this->ueBtPrinterSocket()->write(codec->fromUnicode(QString("ÄäÖöÜüß$€")) );