C++ Builder如何使用蓝牙打印机

Android作为一个面向手机和平板的操作系统,主要擅长娱乐和通信方面的应用,由于接口方面的限制,对于其它外部设备的支持不是很强,而且多数外设生产厂商也不支持Android系统。

    所幸的是,几乎所有智能手机都带有蓝牙功能,只要遵循特定的通信协议,我们可以通过蓝牙功能,调用所有支持蓝牙的外部设备。

    打印机是最常见的外部设备,而其中的小票打印机,广泛应用于超市收银、票据、回执打印,是商务应用不可或缺的组成部分。下面就以群索QS5803蓝牙热敏小票打印机为例,说明C++ Builder XE7如何调用它进行打印。

C++ Builder如何使用蓝牙打印机_第1张图片


一、与打印机进行配对

    与任何蓝牙设备进行通讯之前,必须与其进行配对。打开群索QS5803打印机电源,在Android系统中点“设置->蓝牙”,可以搜索到该设备的名称QSPrinter,选择,输入配对密码,默认为“0000”,具体可参看说明书。

二、获取系统中已经配对的蓝牙设备

  1. 打开C++ Builder XE7,新建一个Android工程,添加头文件以支持蓝牙功能
    #include

  2. 通过蓝牙管理器对象,获取本机已配对的蓝牙设备

    放置一个组合框ComboEdit1和一个按钮Button1,用于填充蓝牙设备名称

[cpp]  view plain copy
  1. void __fastcall TMainForm::Button1Click(TObject *Sender)  
  2. {  
  3.     TBluetoothManager *FBluetoothManager = TBluetoothManager::Current; //得到本机蓝牙管理器  
  4.     TBluetoothAdapter *FAdapter = FBluetoothManager->CurrentAdapter; //得到本机蓝牙设备  
  5.   
  6.     if(FBluetoothManager->ConnectionState == TBluetoothConnectionState::Connected) //如果有并且打开了蓝牙设备  
  7.     {  
  8.         Memo1->Lines->Add(L"得到本机蓝牙设备: '" + FBluetoothManager->CurrentAdapter->AdapterName + L"'");  
  9.   
  10.         ComboEdit1->Clear();  
  11.         TBluetoothDeviceList *FPairedDevices = FBluetoothManager->GetPairedDevices(); //得到已配对设备列表  
  12.         if(FPairedDevices->Count > 0)  
  13.         {  
  14.             for(int i = 0; i < FPairedDevices->Count; i++)  
  15.             {  
  16.                 ComboEdit1->Items->Add(FPairedDevices->Items[i]->DeviceName);  
  17.             }  
  18.             if(ComboEdit1->Count > 0)  
  19.                 ComboEdit1->ItemIndex = 0;  
  20.         }  
  21.         else  
  22.         {  
  23.             Memo1->Lines->Add(L"无配对设备");  
  24.         }  
  25.     }  
  26.     else //无蓝牙设备或者未打开  
  27.     {  
  28.         Memo1->Lines->Add(L"本机没有或未打开蓝牙设备");  
  29.     }  
  30. }  

三、获取设备中提供的服务

    每个蓝牙设备都提供有一个或若干个服务,用不同的UUID字符串表示。需要获取该服务,才能与蓝牙设备通讯。

    放置第二个组合框ComboEdit2和一个按钮Button2,用于填充该设备的服务名称

[cpp]  view plain copy
  1. void __fastcall TMainForm::Button2Click(TObject *Sender)  
  2. {  
  3.     ComboEdit2->Clear();  
  4.     if(ComboEdit1->ItemIndex > -1)  
  5.     {  
  6.         TBluetoothDevice * LDevice = FPairedDevices->Items[ComboEdit1->ItemIndex];  
  7.         TBluetoothServiceList * LServices = LDevice->GetServices(); //获取该已配对设备提供的服务  
  8.         for(int i=0; iCount; i++)  
  9.         {  
  10.             ComboEdit2->Items->Add(GUIDToString(LServices->Items[i].UUID));  
  11.         }  
  12.         if(ComboEdit2->Count > 0)  
  13.             ComboEdit2->ItemIndex = 0;  
  14.     }  
  15.     else  
  16.     {  
  17.         ShowMessage(L"请在已配对列表中选择一个设备");  
  18.     }  
  19. }  

四、连接打印机

[cpp]  view plain copy
  1. UnicodeString strServiceGUID = ComboEdit2->Items->Strings[ComboEdit2->ItemIndex]; //服务GUID  
  2.   
  3. TBluetoothDevice * LDevice = FPairedDevices->Items[ComboEdit1->ItemIndex];  
  4. Memo1->Lines->Add(L"准备连接服务:" + strServiceGUID);  
  5. Memo1->GoToTextEnd();  
  6.   
  7. FSocket = LDevice->CreateClientSocket(StringToGUID(strServiceGUID), false); //建立与蓝牙设备的Socket通讯  
  8. if(FSocket != NULL)  
  9. {  
  10.     try  
  11.     {  
  12.         FSocket->Connect();  //连接  
  13.   
  14.         BluetoothReadTH = new TBluetoothReadTH(false, FSocket); //创建读数据线程  
  15.   
  16.         Memo1->Lines->Add(L"连接Socket成功!");  
  17.         Memo1->GoToTextEnd();  
  18.     }  
  19.     catch(...)  
  20.     {  
  21.         delete FSocket;  
  22.         FSocket = NULL;  
  23.   
  24.         Memo1->Lines->Add(L"连接Socket失败!");  
  25.         Memo1->GoToTextEnd();  
  26.     }  
  27.   
  28. }  
  29. else  
  30. {  
  31.     ShowMessage(L"发送超时(15秒)");  
  32. }  

五、发送数据并打印

    根据该打印机的通讯协议,发送要打印的内容和控制命令

[cpp]  view plain copy
  1. //发送打印内容  
  2. TBytes ToSend = TEncoding::ANSI->GetBytes(AnsiString(Edit1->Text));  
  3. FSocket->SendData(ToSend);  
  4. Memo1->Lines->Add(L"发送数据:" + Edit1->Text);  
  5. Memo1->GoToTextEnd();  
  6.   
  7. //打印并走纸一行命令  
  8. TBytes bt;  
  9. bt.set_length(1);  
  10. bt[0]=0x0D;  
  11. FSocket->SendData(bt);  

六、关于打印图像

    需要将图片转换成yuv数组,其中只取y部分组成新的数组,其中数组的内容转换成0,1,大于0的部分全是1,小于零的部分全是0,将数组进行打包,通过左移操作,每八个转换成一个新的byte字节组成新的数组,打印内容每行576个像素(80mm打印机,如果是58mm打印机则为384像素),其中通过左移操作,每八个转成一个字节实际上每行也就成为48个byte,其中在打印每行的时候需要加入头数组,头数组为4个字节,加入头数组
    bytehead[0] = (byte) 0x1f;
    bytehead[1] = (byte) 0x10;
    bytehead[2] = (byte) (mWidth / 8); //其中mWidth为宽度576
    bytehead[3] = (byte) 0x00; //将新生成的数组通过蓝牙传递给打印机。


七、总结

    打印操作是一个比较耗时的过程,上面代码只是简单示例,在实际应用中,应该将读写蓝牙数据放在线程中进行。具体内容详见示例程序:
    http://download.csdn.net/detail/realbay/8689849

    打印机网址:
    http://detail.1688.com/offer/36926154653.html?spm=a2615.2177701.0.0.UcjyXR

    示例程序效果如下:

C++ Builder如何使用蓝牙打印机_第2张图片

转载:http://blog.csdn.net/realbay/article/details/45666701


你可能感兴趣的:(C++,Builder,XE,C++,Builder,XE)