ionic---關於android和ios藍牙的使用--以小票打印爲例

關於手機藍牙

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設備全兼容
  1. 使用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 ONLY
var writeCharacteristic = "49535343-8841-43F4-A8D4-ECBE34729BB3"; //IOS ONLY
var readCharacteristic = "49535343-1E4D-4BD9-BA61-23C647249616"; //IOS ONLY

connect = 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);
發佈了64 篇原創文章 · 獲贊 71 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章