ionic---关于android和ios蓝牙的使用--以小票打印为例
来源:互联网 发布:魔力宝贝满档水龙数据 编辑:程序博客网 时间:2024/05/07 07:01
关于手机蓝牙
ionic APP蓝牙要区分Android和IOS。Android对于蓝牙开发从2.0版本的sdk才开始支持,开放程度很高。但是ios对蓝牙做出严格限制,所以为了ionic中的Android和IOS使用同一份代码(这是使用ionic目的之一),必须对蓝牙模块进行特殊处理。
关于IOS蓝牙的一些了解
IOS设备本身不是用来传输文件的,主要用来连蓝牙耳机,音响(苹果认证MFI的设备)等。直到iOS 6.0两台iPhone才可以通过蓝牙通信传数据,在蓝牙4.0(低功耗蓝牙ble)出来以后(硬件在iphone4、系统ios6以上),非苹果认证的蓝牙设备才可以连接IOS设备。小票打印的场景是属于IOS设备与非IOS设备交互,现总结出以下二种方案:
1. 使用ios蓝牙2.0,使用MFI认证的蓝牙模块
特点:IOS设备全兼容
使用ios蓝牙4.0(ble),不使用MFI认证的蓝牙模块(现在选用的)
特点:IOS设备不完全兼容,硬件在iphone4、系统在ios6以上
关于BLE蓝牙的一些了解
蓝牙协议本身经历了从1.0到4.0的升级演变, 最新的4.0以其低功耗著称,所以一般也叫BLE(Bluetoothlow energy)。每个蓝牙4.0的设备都是通过服务和特征来展示自己的,一个设备必然包含一个或多个服务,每个服务下面又包含若干个特征。特征是与外界交互的最小单位,服务和特征都是用UUID来唯一标识的。
cordova蓝牙插件
1.蓝牙4.0(ble)插件,主要用于iOS
插件地址:
Bluetooth low energy(cordova plugin) - https://github.com/don/cordova-plugin-ble-central
使用原因:iOS 只有通过ble才能IOS设备与非IOS认证设备交互
2.蓝牙2.0(Serial)插件,主要用于Android
插件地址:
Bluetooth(cordova plugin) - https://github.com/don/BluetoothSerial
使用原因:Android蓝牙4.0完全兼容2.0,但是2.0不一定兼容4.0,所有使用蓝牙2.0基本可以覆盖所有Android手机
3.cordova蓝牙插件
插件地址:
Bluetooth low energy(cordova plugin) - https://github.com/randdusing/cordova-plugin-bluetoothle
使用原因:上面两个插件的依赖插件
以蓝牙打印为例Android和iOS的具体操作
1.扫描蓝牙
startScan = function () { var d = $q.defer(); if (ionic.Platform.isIOS()) { $window.ble.startScan([], function (device) { d.notify(device); }, function (error) { d.reject(error); }); } else if (ionic.Platform.isAndroid()) { $window.bluetoothSerial.setDeviceDiscoveredListener(function (device) { d.notify(device); }); $window.bluetoothSerial.discoverUnpaired(function (devices) { d.resolve(devices); }, function (error) { d.reject(error); }); } return d.promise; };
2.连接蓝牙
==说明:Android和iOS连接有明显不同,Android连接只需要一个MAC地址或者设备id,这些在搜索时候会返回。但是iOS用的ble连接需要设备id(iOS不会返回MAC地址)、serviceUUID、readCharacteristic。==
//小票打印的服务和特征var serviceUUID = "49535343-FE7D-4AE5-8FA9-9FAFD205E455";// IOS ONLYvar writeCharacteristic = "49535343-8841-43F4-A8D4-ECBE34729BB3"; //IOS ONLYvar readCharacteristic = "49535343-1E4D-4BD9-BA61-23C647249616"; //IOS ONLYconnect = function (deviceId) { var d = $q.defer(); function successCallback(success) { d.notify({ status: "connected" }); } function errorCallback(error) { d.notify({ status: "disconnected" }); } if (ionic.Platform.isIOS()) { $window.ble.stopScan(null, null); $window.ble.connect(deviceId, function (deviceInfo) { for (var index = 0; index < deviceInfo.services.length; index++) { var service = deviceInfo.services[index]; if (service == serviceUUID) { d.notify({ status: "connected" }); $window.ble.startNotification(deviceId, serviceUUID, readCharacteristic, null, null); return; } } }, errorCallback); } else { // without bond $window.bluetoothSerial.connectInsecure(deviceId, successCallback, errorCallback); } return d.promise; };
3.数据传输
==说明:IOS的BLE写入数据的时候需要deviceId,serviceUUID,writeCharacteristic。而Android连接之后就可以直接发数据。发数据之前需要将字节数组转化为16进制字符串==
write = function (buffer, deviceId) { var d = $q.defer(); function successCallback(success) { d.resolve(success); } function errorCallback(error) { d.reject(error); } if (ionic.Platform.isIOS()) { $window.ble.write(deviceId, serviceUUID, writeCharacteristic, buffer, successCallback, errorCallback); } else if (ionic.Platform.isAndroid()) { $window.bluetoothSerial.write(buffer, successCallback, errorCallback); } return d.promise; };
4.数据转换
说明:js转二进制库https://encoding.spec.whatwg.org/
function print(content,deviceId) { var uint8array = new TextEncoder('gb18030', { NONSTANDARD_allowLegacyEncoding: true }).encode(content); bluetooth.write(uint8array.buffer, deviceId);}
5.打印机常用命令
function _EscCommand() { this.ESC = "\u001B"; this.GS = "\u001D"; this.InitializePrinter = this.ESC + "@"; this.BoldOn = this.ESC + "E" + "\u0001"; this.BoldOff = this.ESC + "E" + "\0"; this.DoubleHeight = this.GS + "!" + "\u0001"; this.DoubleWidth = this.GS + "!" + "\u0010"; this.DoubleOn = this.GS + "!" + "\u0011"; // 2x sized text (double-high + double-wide) this.DoubleOff = this.GS + "!" + "\0"; this.PrintAndFeedMaxLine = this.ESC + "J" + "\u00FF"; // 打印并走纸 最大255 this.TextAlignLeft = this.ESC + "a" + "0"; this.TextAlignCenter = this.ESC + "a" + "1"; this.TextAlignRight = this.ESC + "a" + "2";}var escCommand = Esc.InitializePrinter + Esc.TextAlignCenter + "--------------------------------\n" + Esc.TextAlignRight + Esc.DoubleOn + "总计" + data.money/100 + "元\n" + Esc.DoubleOff + Esc.PrintAndFeedMaxLine + Esc.CutAndFeedLine();print(escCommand,deviceId);
- ionic---关于android和ios蓝牙的使用--以小票打印为例
- IOS蓝牙小票打印
- Android 蓝牙打印小票与WiFi打印小票两种打印方式的实现(带有图片和二维码)
- 蓝牙打印小票
- ionic 中切换平台以实现android中使用的是ios的样式
- Ionic新建项目(以Android为例)
- Ionic使用ngCordova插件,以Geolocation地理定位为例
- [Widget]Android小票打印,蓝牙打印、固定IP打印、黑白图片打印
- iOS开发中通过蓝牙连接蓝牙打印机设备进行小票打印
- 关于IOS的蓝牙
- 【IOS】cocoapods的使用---以AFNetworking为例
- android 蓝牙打印和网络打印
- 关于Android数据库升级的实践(以ormlite为例)
- android上位机连接hc-06蓝牙模块(以蓝牙智能小车为例)
- 关于Android蓝牙设备的连接使用
- 使用log4j打印日志信息的操作----以在MyBatis中使用为例
- android蓝牙打印的若干问题
- 关于Angular.js和ionic配合使用ios和安卓的tab等不统一的解决方案
- TI CC2540单片机裸机低功耗 测试
- angularjs的介绍及特点
- Java本地的项目,怎么可以让别人通过外网访问-内网穿透
- Python:pandas.read_sql('latin-1' codec can't encode characters in position 12-15: ordinal no
- Three_sum
- ionic---关于android和ios蓝牙的使用--以小票打印为例
- c
- uva 10806 从一个点到另外1个点的2条不重复边的路径
- DCB 结构体
- JAVA通信(2)--实现简单的RPC框架
- Mac电脑对Mac电脑如何屏幕共享
- leetcode 33 Search in Rotated Sorted Array
- Servlet之请求转发和重定向
- 注解