最近要为app用蓝牙接入便携热敏打印机和读蓝牙电子秤。做为一名前端,能涉及到硬件的开发让我以为兴奋不已,因此我马上着手开始相应的预研。并把遇到的知识点和问题记录下来。html
btw,大部分知识点未深刻可能有错,欢迎指正。前端
需求简单来讲是:app内经过蓝牙来打印和读蓝牙电子秤。java
从需求中能够分为三块,蓝牙通讯层 和 打印机协议 和 电子秤协议。react
相似http,传输层而已,传输二进制内容,有读有写。 读写都会有buffer。android
看了两个库 react-native-ble-manager react-native-bluetooth-serial,前者的api感受太繁琐,看不懂,哭。 我用的是后者,but不要用其npm上的版本,用其最新的github代码库,由于接口比较多且稳定。git
react-native-bluetooth-serial是单例的,我须要连蓝牙打印和蓝牙电子秤,因此我须要两个这样的库,fork下来改改就ok,不会太难。这是我改的react-native-gm-bluetoothgithub
react-native-bluetooth-serial有个方法list
获取设备列表,在Android上是获取已经配对的设备(预先在系统界面上匹配好),在iOS上是以扫描的形式把列表返回。npm
有个listener能监听数据的回调,不建议使用,由于回调可能很频繁,容易致使应用奔溃。 推荐主动去读。c#
btw建议你们多看下源码加深理解。java代码仍是比较容易懂的,而Object-C就难点。react-native
基于业务上的须要,增长了些功能。
writeHexToDevice 把16进制转成bytes写进蓝牙设备
writeTextToDevice 把文本转成bytes写进蓝牙设备
和一些打印辅助Util
了解很少,未深刻。
蓝牙4.x是3.x的升级版,并增长了低功耗(BLE)。BLE支持的安全级别中有些是不须要匹配的。
了解很少,未深刻。
Android是须要用mac id去链接设备。而iOS须要用uuids(多个,多是server uuid, read uuid, write uuid)
你会发如今系统界面,iOS搜不到蓝牙设备,而Android能够,还搜出来不少。我的感受是iOS指把有记录(貌似须要在某网站申请注册)的蓝牙设备放出来,其余的隐藏。
然而经过api搜索仍是能找出来的。
自动链接。没作,目前是经过人工介入连接,成功以后id保存起来,下次启动尝试链接。但没有作设备离开了以后又回来等状况的自动链接。
耗电。接入了两个蓝牙设备,都是高频的工做,貌似耗电仍是挺大的,得一直充电。
热敏打印机分两种,小票和标签。小票即商场购物买单的小票,标签即包装盒上的标签。
小票用的是TSC指令集,标签用的ESC指令集。文档在这里ESC TSC文档
打印demo可参考这里gmrnbt
通常流程:初始化(纸张宽度)-》初始化(还原)-》设置(对齐、字体大小等)-》 打印内容 -》打印 -》蜂鸣(提示打印完成)。
其中 1 初始化可能屡次调用,2 字体大小有几种尺寸:倍高、倍宽、倍高宽 3 调打印命令后才打印出来 4 文本可自动换行 5 能识别符号(\t \n 等)6 比较特别的打印样式如表格则须要本身根据打印内容计算了
通常流程:初始化(标签宽度、标签间隔、起始位置、出纸方向等等) -》 初始化 -》 打印坐标和内容 -》 打印 -》 蜂鸣。
其中 1 和TSC不同,ESC是按坐标打印的,超出纸张部分不会打印 2 字体大小有 1 2 3规格,可分别设置高宽 3 一次打印命令一张标签 4 可打二维码一维码等等 5 注重对打印内容的计算,以便打印在正确的位置
注意:因为每一个设备不同,其实位置可能并不是是0,0。 好比我测试用的坐标是30,32。 坑。
电子秤就简单多了,读电子秤发过来的数据便可。 麻烦的地方是每一个称的数据格式不同,须要写逻辑去解。
整个过程当中组内进行了不少讨论和实践:
打印机供应商有提供SDK,直接使用就好。
以前作Android的同事开发过一版Android的小票打印,用的佳博软件提供的打印机,也是费了不少心思才找到他们提供SDK,但提供的api很奇怪,打印须要指定坐标。(固然和咱们的认知窄有关)
and 既然用了佳博的SDK,猜想会绑定了了佳博供应的打印设备,尚未iOS的,因而就放弃了SDK的方案。
打印就像画图,设个坐标,调画图api画。
另外一位同事开发过win(c#)的票据打印,是经过类画图形式调用。
打印的本质是否pdf,用电脑打印的时候均可以另存为pdf的
从上面来方案来看都感受略不靠谱,是否麻烦了点!
继续体验了不少打印的功能,发如今打印的时候均可以把打印的内容存为pdf,好比网页打印,好比excel、doc、ppt均可以存为pdf。
翻了下PDF的定义“便携式文档格式(英语:Portable Document Format,简称PDF)”。
同时也在github上找了个库 react-native-print,它把html -> pdf。
此时略兴奋,感受要接近真相了。
因而疯狂的往pdf靠,然而并无更多的资料支撑pdf这个想法。
打印的本质是图片。
同上,没有进展。可能不使用在热敏打印机上
就作android好了,iOS太封闭
应该没啥好解释的,确实不少厂商有可能不会对iOS作适配。 就拿iOS蓝牙来讲,就有不少人在抱怨搜不到设备。
外卖软件能作到接入各类厂商,能Android,iOS哦。
是的,在jd搜索下热敏打印机,发现能接入各类供应商和手机系统。
基于最后一点,咱们坚信也能够作到。
。。。省略艰辛的查资料过程
直到和一位同行交流中了解到 TSC ESC 指令集,才忽然豁然开朗。
github,找到相关的库,一个一个拜读。 必要时发issue联系做者交流。
找打印机供应商客服,他们能提供很专业的意见,有必要还能够和他们的技术对接。
读代码,分析SDK,少不了。要向了解细节,心石放下就得读代码。 Java、Object-C不懂就问呗。
蓝牙模块应该会有官方的使用案例的,Android,iOS。