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有个方法 有个listener能监听数据的回调,不建议使用,因为回调可能很频繁,容易导致应用奔溃。 推荐主动去读。 btw建议大家多看下源码加深理解。java代码还是比较容易懂的,而Object-C就难点。 react-native-gm-bluetooth基于业务上的需要,增加了些功能。
和一些打印辅助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指把有记录(貌似需要在某网站申请注册)的蓝牙设备放出来,其他的隐藏。 其他自动连接。没做,目前是通过人工介入链接,成功之后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,直接使用就好。 打印就像画图,设个坐标,调画图api画。 打印的本质是否pdf,用电脑打印的时候都可以另存为pdf的 打印的本质是图片。 就做android好了,iOS太封闭 外卖软件能做到接入各种厂商,能Android,iOS哦。 基于最后一点,我们坚信也可以做到。 。。。省略艰辛的查资料过程 直到和一位同行交流中了解到 TSC ESC 指令集,才突然豁然开朗。 资源总结github,找到相关的库,一个一个拜读。 必要时发issue联系作者交流。 找打印机供应商客服,他们能提供很专业的意见,有必要还可以和他们的技术对接。 读代码,分析SDK,少不了。要向了解细节,心石放下就得读代码。 Java、Object-C不懂就问呗。 蓝牙模块应该会有官方的使用案例的,Android,iOS。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |