• Stars
    star
    394
  • Rank 109,295 (Top 3 %)
  • Language
    Objective-C
  • Created over 8 years ago
  • Updated over 7 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

蓝牙操作库,小票打印库

HLBluetoothDemo

提醒

有部分开发人员,加群之后,直接问设备扫描不到,服务扫描出错,特性扫描报错,怎么办? 对于这类问题,要严厉批评,都是因为懒,没有用心去看官方文档或者关于CoreBluetooth的教程。
所以对于蓝牙的连接处理流程不清晰的,严重建议先看iOS CoreBluetooth 的使用讲解
自己动手写Demo,把系统的CoreBluetooth的使用,以及蓝牙的流程搞懂了,再开始做蓝牙打印的功能。

引言

该项目中包含两个部分的工具类HLBluetoothHLPrinter,蓝牙操作和打印小票功能。

如果只是做蓝牙打印机打印小票的功能,可以看我的另一个工程SEBLEPrinter

因为系统的蓝牙操作库是用delegate实现的,步骤比较繁多,操作很零散,需要写一堆的代理方法,特别麻烦
所以我用block方式重写了,蓝牙管理的所有代码在HLBluetooth目录中。

又因为项目中要用蓝牙控制打印机打印小票,我又把蓝牙打印机的操作封装了一下,所有代码在HLPrinter目录下。

HLBluetooth介绍

用block改写后,使用大致分为三步:

  • 获取蓝牙模块的状态
  • 扫描蓝牙外设
  • 连接、扫描服务、扫描特性、扫描描述。 因为连接、扫描服务、扫描特性、扫描描述也是属于不同的阶段,所以在block返回时,也有阶段值返回。

---------------------------------------------------------------------------------------------------------
除了上面这些代理方法改写的block API之外,还有一些操作性方法, 比如:

  • 读取特性值
  • 读取描述值
  • 往特性中写入数据
  • 往描述中写入数据
  • 读取信号数据
  • 取消蓝牙连接 ...

以上这些方法也提供block方式和一般的调用方式。

HLPrinter介绍

蓝牙打印机模板可以打印的格式有

  • 单行文字格式
[printer appendText:title alignment:HLTextAlignmentCenter fontSize:HLFontSizeTitleBig];
[printer appendText:str1 alignment:HLTextAlignmentCenter];
  • 左标题右参数格式
[printer appendTitle:@"时间:" value:@"2016-04-27 10:01:50" valueOffset:150];
[printer appendTitle:@"订单:" value:@"4000020160427100150" valueOffset:150];
[printer appendTitle:@"总计:" value:totalStr];
[printer appendTitle:@"实收:" value:@"100.00"];
  • 三列数据格式
[printer appendLeftText:@"商品" middleText:@"数量" rightText:@"单价" isTitle:YES];
[printer appendLeftText:dict[@"name"] middleText:dict[@"amount"] rightText:dict[@"price"] isTitle:NO];
  • 分隔线
[printer appendSeperatorLine];
  • 图片
[printer appendImage:[UIImage imageNamed:@"ico180"] alignment:HLTextAlignmentCenter maxWidth:300];
  • 二维码
[printer appendQRCodeWithInfo:@"www.baidu.com" size:10];
[printer appendQRCodeWithInfo:@"www.baidu.com"];
  • 条形码
[printer appendBarCodeWithInfo:@"123456789012"];

效果图

1.png 2.png 03.png printer.png

使用方式

关于详细的BLE使用方式和打印小票的功能,在这里有篇文章详细说明 打印机的指令有ASCII、10进制和16进制三种,我使用的是16进制。

    Byte QRSize [] = {0x1D,0x28,0x6B,0x03,0x00,0x31,0x43,size}; // 这是16进制,其中最后一个size是10进制数,转换为NSData后,会被转换为16进制。
    Byte QRSize [] = {29,40,107,3,0,49,67,size}; // 这是10进制。

补充一些参数:

据佳博的一技术人员提供的一些参数:
汉字是24 x 24点阵,字符是12 x 24。
58mm 型打印机横向宽度384个点。(可是我用文字设置相对位置测试确实368,囧)
80mm 型打印机横向宽度576个点。
1mm 大概是8个点。

更新

修复部分型号打印乱码,乱码后再次打印没反应的Bug。(2016-06-13)

demo中也有一个使用的例子

如有使用错误或者更好的建议,请issues我。

 打印没反应?

首先,确定你使用的是标签打印机还是一般的小票打印机。 我写的Demo不支持标签打印机,你可以仿照我的例子,自己封装一下指令(我们并没有采购标签打印机,也没办法测试,抱歉了)。 如果你连接成功,但是发出打印指令后,打印机没反应,很有可能是因为你的打印机一次发送的数据长度小于146,你把146改的更小一点试试看。 我测试的两台佳博打印机,一台没有长度限制,一台最多每次只能发送146个字节,否则会出现打印没反应的情况,需要重启打印机。 不同的打印机,可能对长度的限制不太一样,据群友反应有的打印机只能支持一次发送20个字节,所以你需要将宏里面的146改的更小一点。

测试过的蓝牙打印机型号

目前验证测试的功能有打印文字、图片、条形码、二维码。
以上四个功能全支持的品牌和型号有:
佳博(GP58130IVC、GP58130IC、GP58MBIII、GP-58MBIII)
芯烨(XPrinter 某型号)
(待补充)

支持部分功能的有: (待补充)

为了能便于大家做适配和排查问题,希望你能反馈一下你使用的打印机品牌和型号,先表示感谢了。