RN用蓝牙接入热敏打印机和智能电子秤(转载)
最近要为app用蓝牙接入便携热敏打印机和读蓝牙电子秤。作为一名前端,能涉及到硬件的开发让我觉得兴奋不已,所以我立刻着手开始相应的预研。并把遇到的知识点和问题记录下来。
btw,大部分知识点未深入可能有错,欢迎指正。
需求简单来说是:app内通过蓝牙来打印和读蓝牙电子秤。
拆解
从需求中可以分为三块,蓝牙通信层 和 打印机协议 和 电子秤协议。
蓝牙
通信
类似http,传输层而已,传输二进制内容,有读有写。 读写都会有buffer。
RN库
看了两个库 react-native-ble-manager react-native-bluetooth-serial,前者的api感觉太繁琐,看不懂,哭。 我用的是后者,but不要用其npm上的版本,用其最新的github代码库,因为接口比较多且稳定。
react-native-bluetooth-serial是单例的,我需要连蓝牙打印和蓝牙电子秤,所以我需要两个这样的库,fork下来改改就ok,不会太难。这是我改的react-native-gm-bluetooth
react-native-bluetooth-serial有个方法list
获取设备列表,在Android上是获取已经配对的设备(预先在系统界面上匹配好),在iOS上是以扫描的形式把列表返回。
有个listener能监听数据的回调,不建议使用,因为回调可能很频繁,容易导致应用奔溃。 推荐主动去读。
btw建议大家多看下源码加深理解。java代码还是比较容易懂的,而Object-C就难点。
react-native-gm-bluetooth
基于业务上的需要,增加了些功能。
writeHexToDevice 把16进制转成bytes写进蓝牙设备
writeTextToDevice 把文本转成bytes写进蓝牙设备
和一些打印辅助Util
蓝牙3.x、蓝牙4.x、BLE?
了解不多,未深入。
蓝牙4.x是3.x的升级版,并增加了低功耗(BLE)。BLE支持的安全级别中有些是不需要匹配的。
Android/iOS
了解不多,未深入。
Android是需要用mac id去连接设备。而iOS需要用uuids(多个,可能是server uuid, read uuid, write uuid)
你会发现在系统界面,iOS搜不到蓝牙设备,而Android可以,还搜出来很多。个人感觉是iOS指把有记录(貌似需要在某网站申请注册)的蓝牙设备放出来,其他的隐藏。
然而通过api搜索还是能找出来的。
其他
自动连接。没做,目前是通过人工介入链接,成功之后id保存起来,下次启动尝试连接。但没有做设备离开了之后又回来等情况的自动连接。
耗电。接入了两个蓝牙设备,都是高频的工作,貌似耗电还是挺大的,得一直充电。
热敏打印机
热敏打印机分两种,小票和标签。小票即商场购物买单的小票,标签即包装盒上的标签。
小票用的是TSC指令集,标签用的ESC指令集。文档在这里ESC TSC文档
打印demo可参考这里gmrnbt
TSC
一般流程:初始化(纸张宽度)-》初始化(还原)-》设置(对齐、字体大小等)-》 打印内容 -》打印 -》蜂鸣(提示打印完成)。
其中 1 初始化可能多次调用,2 字体大小有几种尺寸:倍高、倍宽、倍高宽 3 调打印命令后才打印出来 4 文本可自动换行 5 能识别符号(\t \n 等)6 比较特别的打印样式如表格则需要自己根据打印内容计算了
ESC
一般流程:初始化(标签宽度、标签间隔、起始位置、出纸方向等等) -》 初始化 -》 打印坐标和内容 -》 打印 -》 蜂鸣。
其中 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。
转载自:https://segmentfault.com/a/1190000008981416
RN用蓝牙接入热敏打印机和智能电子秤(转载)的更多相关文章
- EasyNVR智能云终端接入AI视频智能分析功能,用户可自定义接入自己的分析算法
视频分析的需求 人工智能的发展和在行业中的作用就不用多说了,已经到了势在必行的一个程度了,尤其是对于流媒体音视频行业来说,这基本上是人工智能重中之重的领域,视频人工智能,也就是视频视觉分析的应用方式大 ...
- 2、利用蓝牙定位及姿态识别实现一个智能篮球场套件(二)——CC2540/CC2541基于广播的RSSI获得
CC2541一拖多例程中RSSI获得是通过一个事件回调函数实现的,前提是需要连接上蓝牙设备. 这个对于多点定位来说是不可行的,由于主机搜索蓝牙设备过程中也能获得当前蓝牙设备的RSSI等信息,因此可基于 ...
- 智能家居系统 Home Assistant 系列 --介绍篇
一. HomeAssistant 是什么? HomeAssistant是构建智慧空间的神器.是一个成熟完整的基于 Python 的智能家居系统,设备支持度高,支持自动化(Automation).群组化 ...
- 物联网安全拔“牙”实战——低功耗蓝牙(BLE)初探
物联网安全拔“牙”实战——低功耗蓝牙(BLE)初探 唐朝实验室 · 2015/10/30 10:22 Author: FengGou 0x00 目录 0x00 目录 0x01 前言 0x02 BLE概 ...
- 以蓝牙开发的视觉解读微信Airsync协议
微信硬件平台使用蓝牙作为近场控制的连接件,并拟定了<微信蓝牙外设协议>.这份协议更像一个标准,用于规范微信和蓝牙外设之间的数据交互场景和接口.但从开发者来看,要完全读懂这份协议,恐怕需要熟 ...
- iOS-BLE蓝牙开发持续更新
文/煜寒了(简书作者)原文链接:http://www.jianshu.com/p/84b5b834b942著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 在写这个博客之前,空余时间抽看 ...
- 基于蓝牙4.0(Bluetooth Low Energy)胎压监测方案设计
基于一种新的蓝牙技术——蓝牙4.0(Bluetooth Low Energy)新型的胎压监测系统(TPMS)的设计方案.鉴于蓝牙4.0(Bluetooth Low Energy)的低成本.低功耗.高稳 ...
- [蓝牙前沿应用] 照明即平台 —— 通过蓝牙增强服务提高照明投资回报率(蓝牙MESH、定位AoA、AoD)
1.照明即平台(LAAP) 随着照明设施向LED转型,他们也在利用类似于蓝牙MESH的技术,创建一个可连接的照明平台,作为他们建筑的中枢神经系统.这些系统除了提供先进的照明控制,还建立了一个增强版 ...
- zigbee_蓝牙_wifi的比较与区别分析
现在无线通读热了起来.三个最大的Wifi.ZigBee.蓝牙它们三个始终困惑着我.那么它们三个有什么区别呢? Zigbee 和蓝牙都是一项无线通信技术.ZigBee的传输距离视发射功率而定,有几百到几 ...
随机推荐
- SolrJ的入门
什么是SolrJ? solrj是访问solr服务的java客户端,提供索引和搜索的请求方法, SolrJ和图形界面操作的区别就类似于数据库中使用jdbc和mysql客户端的区别一样. 我在测试Solr ...
- Java 基础 - 集合
Set 集合 Set 集合通常不能记住元素的添加顺序.Set 集合不允许包含相同的元素. HashSet 是 Set 接口的实现类,按照 Hash 算法存储集合中的元素.HashSet 不是同步的,如 ...
- CPU高速缓存
目录 Code: 物理结构: 缓存行Cache Line 伪共享: 概念: 解决办法: 内存屏障: 理解: 参考: Code: public class Main { static long[][] ...
- react开发初始配置和一些问题
1.npm run build之后,打开网页显示为空白的解决方案 初始使用的开发者应该都会使用create-react-app,初次尝试,启动没有问题,然后就测试一下build,结果发现本地文件ind ...
- 【转载】Xpath定位方法深入探讨及元素定位失败常见情况
一.Xpath定位方法深入探讨 (1)常用的Xpath定位方法及其特点 使用绝对路径定位元素. 例如: driver.findElement(By.xpath("/html/body/div ...
- 《Visual C# 从入门到精通》第一章使用变量、操作符和表达式——读书笔记
前言: 这个笔记是我个人总结,主要是熟练自己查看<Visual C# 从入门到精通>(第8版)这本书时,懵然起总结的想法,只是总结一些知识点,在工作项目会用得上,但是对毫无C#语言基础的, ...
- angular面试记忆的内容
1.ng-class的用法:ng-class="{red:true}"; 2.ng-repeat怎么可以添加重复数据.ng-repeat="item in arr tra ...
- [Android - Recovery] 如何刷入第三方recovery
https://www.xda-developers.com/how-to-install-twrp/ 方便复制 adb reboot bootloader fastboot flash recove ...
- 活动代码页437--修改windows的系统编码
1.首先查看系统编码 win+R打开运行,输入cmd回车,打开命令提示符窗口,输入chcp回车,会查询当前系统的活动代码页,它指明了当前系统使用的编码: 或者,打开cmd后,点击cmd窗口左上角图标, ...
- js 数组的pop(),push(),shift(),unshift()方法小结
关于数组的一些操作方法小结: pop(),push(),shift(),unshift()四个方法都可改变数组的内容以及长度: 1.pop() :删除数组的最后一个元素,并返回被删除的这个元素的值: ...