com.xtremeprog.sdk.ble.SamsungBle.java Source code

Java tutorial

Introduction

Here is the source code for com.xtremeprog.sdk.ble.SamsungBle.java

Source

/**
 * This XPG software is supplied to you by Xtreme Programming Group, Inc.
 * ("XPG") in consideration of your agreement to the following terms, and your
 * use, installation, modification or redistribution of this XPG software
 * constitutes acceptance of these terms. If you do not agree with these terms,
 * please do not use, install, modify or redistribute this XPG software.
 * 
 * In consideration of your agreement to abide by the following terms, and
 * subject to these terms, XPG grants you a non-exclusive license, under XPG's
 * copyrights in this original XPG software (the "XPG Software"), to use and
 * redistribute the XPG Software, in source and/or binary forms; provided that
 * if you redistribute the XPG Software, with or without modifications, you must
 * retain this notice and the following text and disclaimers in all such
 * redistributions of the XPG Software. Neither the name, trademarks, service
 * marks or logos of XPG Inc. may be used to endorse or promote products derived
 * from the XPG Software without specific prior written permission from XPG.
 * Except as expressly stated in this notice, no other rights or licenses,
 * express or implied, are granted by XPG herein, including but not limited to
 * any patent rights that may be infringed by your derivative works or by other
 * works in which the XPG Software may be incorporated.
 * 
 * The XPG Software is provided by XPG on an "AS IS" basis. XPG MAKES NO
 * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
 * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE, REGARDING THE XPG SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
 * COMBINATION WITH YOUR PRODUCTS.
 * 
 * IN NO EVENT SHALL XPG BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION
 * AND/OR DISTRIBUTION OF THE XPG SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER
 * THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR
 * OTHERWISE, EVEN IF XPG HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * 
 * ABOUT XPG: Established since June 2005, Xtreme Programming Group, Inc. (XPG)
 * is a digital solutions company based in the United States and China. XPG
 * integrates cutting-edge hardware designs, mobile applications, and cloud
 * computing technologies to bring innovative products to the marketplace. XPG's
 * partners and customers include global leading corporations in semiconductor,
 * home appliances, health/wellness electronics, toys and games, and automotive
 * industries. Visit www.xtremeprog.com for more information.
 * 
 * Copyright (C) 2013 Xtreme Programming Group, Inc. All Rights Reserved.
 */

package com.xtremeprog.sdk.ble;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
import android.util.Log;
import com.samsung.android.sdk.bt.gatt.*;
import com.xtremeprog.sdk.ble.BleRequest.RequestType;
import org.apache.commons.codec.binary.Hex;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * ble 2015/5/18 20:38
 */
public class SamsungBle implements IBle, IBleRequestHandler {

    protected static final String TAG = "blelib";

    private BluetoothAdapter mBtAdapter;
    private BleService mService;
    private BluetoothGatt mBluetoothGatt;
    private boolean mScanning;

    /**
     * ??? 2015/5/18 20:38
     */
    private final BluetoothGattCallback mGattCallbacks = new BluetoothGattCallback() {
        @Override
        public void onAppRegistered(int status) {
        }

        @Override
        public void onScanResult(BluetoothDevice device, int rssi, byte[] scanRecord) {
            mService.bleDeviceFound(device, rssi, scanRecord, BleService.DEVICE_SOURCE_SCAN);
        }

        @Override
        public void onConnectionStateChange(BluetoothDevice device, int status, int newState) {
            if (mBluetoothGatt == null) {
                return;
            }

            if (status != BluetoothGatt.GATT_SUCCESS) {
                disconnect(device.getAddress());
                mService.bleGattDisConnected(device.getAddress());
                return;
            }

            if (newState == BluetoothProfile.STATE_CONNECTED) {
                mService.bleGattConnected(device);
                mService.addBleRequest(new BleRequest(RequestType.DISCOVER_SERVICE, device.getAddress()));
            } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
                mService.bleGattDisConnected(device.getAddress());
                disconnect(device.getAddress());
            }
        }

        @Override
        public void onServicesDiscovered(BluetoothDevice device, int status) {
            String address = device.getAddress();
            if (status != BluetoothGatt.GATT_SUCCESS) {
                disconnect(address);
                mService.bleGattDisConnected(address);
                mService.requestProcessed(address, RequestType.DISCOVER_SERVICE, false);
                return;
            }
            mService.bleServiceDiscovered(device.getAddress());
        }

        @Override
        public void onCharacteristicRead(BluetoothGattCharacteristic characteristic, int status) {
            BleRequest request = mService.getCurrentRequest();
            String address = request.address;
            if (status != BluetoothGatt.GATT_SUCCESS) {
                mService.requestProcessed(address, RequestType.READ_CHARACTERISTIC, false);
                return;
            }
            mService.bleCharacteristicRead(address, characteristic.getUuid().toString(), status,
                    characteristic.getValue());
        }

        @Override
        public void onCharacteristicChanged(BluetoothGattCharacteristic characteristic) {
            Log.d(TAG, "onCharacteristicChanged");
            String address = mService.getNotificationAddress();
            byte[] data = characteristic.getValue();
            if (data != null && data.length > 0) {
                System.out.println("======================== 222   " + address + "   characteristic.getValue():   "
                        + "0x" + new String(Hex.encodeHex(data)));
            }

            mService.bleCharacteristicChanged(address, characteristic.getUuid().toString(),
                    characteristic.getValue());
        }

        @Override
        public void onCharacteristicWrite(BluetoothGattCharacteristic characteristic, int status) {
            BleRequest request = mService.getCurrentRequest();
            String address = request.address;
            if (status != BluetoothGatt.GATT_SUCCESS) {
                mService.requestProcessed(address, RequestType.WRITE_CHARACTERISTIC, false);
                return;
            }
            mService.bleCharacteristicWrite(address, characteristic.getUuid().toString(), status);
        };

        @Override
        public void onDescriptorRead(BluetoothGattDescriptor descriptor, int status) {
            BleRequest request = mService.getCurrentRequest();
            String address = request.address;
            byte[] value = descriptor.getValue();
            byte[] val_set = null;
            if (request.type == RequestType.CHARACTERISTIC_NOTIFICATION) {
                val_set = BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE;
            } else if (request.type == RequestType.CHARACTERISTIC_INDICATION) {
                val_set = BluetoothGattDescriptor.ENABLE_INDICATION_VALUE;
            } else {
                val_set = BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE;
            }

            //         if (Arrays.equals(value, val_set)) {
            //            if (request.type == RequestType.CHARACTERISTIC_NOTIFICATION) {
            //               mService.bleCharacteristicNotification(address, descriptor
            //                     .getCharacteristic().getUuid().toString(), true,
            //                     status);
            //            } else if (request.type == RequestType.CHARACTERISTIC_INDICATION) {
            //               mService.bleCharacteristicIndication(address, descriptor
            //                     .getCharacteristic().getUuid().toString(), status);
            //            } else {
            //               mService.bleCharacteristicNotification(address, descriptor
            //                     .getCharacteristic().getUuid().toString(), false,
            //                     status);
            //            }
            //            return;
            //         }

            if (!descriptor.setValue(val_set)) {
                mService.requestProcessed(address, request.type, false);
            }

            mBluetoothGatt.writeDescriptor(descriptor);
        };

        @Override
        public void onDescriptorWrite(BluetoothGattDescriptor descriptor, int status) {
            BleRequest request = mService.getCurrentRequest();
            String address = request.address;
            if (request.type == RequestType.CHARACTERISTIC_NOTIFICATION
                    || request.type == RequestType.CHARACTERISTIC_INDICATION
                    || request.type == RequestType.CHARACTERISTIC_STOP_NOTIFICATION) {
                if (status != BluetoothGatt.GATT_SUCCESS) {
                    mService.requestProcessed(address, request.type, false);
                    return;
                }

                if (request.type == RequestType.CHARACTERISTIC_NOTIFICATION) {
                    mService.bleCharacteristicNotification(address,
                            descriptor.getCharacteristic().getUuid().toString(), true, status);
                } else if (request.type == RequestType.CHARACTERISTIC_INDICATION) {
                    mService.bleCharacteristicIndication(address,
                            descriptor.getCharacteristic().getUuid().toString(), status);
                } else {
                    mService.bleCharacteristicNotification(address,
                            descriptor.getCharacteristic().getUuid().toString(), false, status);
                }
                return;
            }

        };
    };

    private final BluetoothProfile.ServiceListener mProfileServiceListener = new BluetoothProfile.ServiceListener() {
        @Override
        public void onServiceConnected(int profile, BluetoothProfile proxy) {
            mBluetoothGatt = (BluetoothGatt) proxy;
            mBluetoothGatt.registerApp(mGattCallbacks);
        }

        @Override
        public void onServiceDisconnected(int profile) {
            mBluetoothGatt = null;
        }
    };

    public SamsungBle(BleService service) {
        mService = service;
        mBtAdapter = BluetoothAdapter.getDefaultAdapter(); // ??? 2015/5/19 10:44
        if (mBtAdapter == null) {
            mService.bleNoBtAdapter();
            return;
        }
        BluetoothGattAdapter.getProfileProxy(mService, mProfileServiceListener, BluetoothGattAdapter.GATT);
    }

    /**
     * ?? 2015/5/19 10:44
     */
    @Override
    public void startScan() {
        if (mScanning) {
            return;
        }

        if (mBluetoothGatt == null) {
            mScanning = false;
            return;
        }

        mScanning = true;
        mBluetoothGatt.startScan();
    }

    /**
     * ??? 2015/5/19 10:44
     */
    @Override
    public void stopScan() {
        if (!mScanning || mBluetoothGatt == null) {
            return;
        }

        mScanning = false;
        mBluetoothGatt.stopScan();
    }

    /**
     * ????
     * @return ??
     */
    @Override
    public boolean adapterEnabled() {
        if (mBtAdapter != null) {
            return mBtAdapter.isEnabled();
        }
        return false;
    }

    /**
     *  2015/5/19 10:33
     * @param address mac?
     * @return ??
     */
    @Override
    public boolean connect(String address) {
        BluetoothDevice device = mBtAdapter.getRemoteDevice(address);
        return mBluetoothGatt.connect(device, false);
    }

    /**
     *  2015/5/19 10:33
     * @param address mac?
     */
    @Override
    public void disconnect(String address) {
        BluetoothDevice device = mBtAdapter.getRemoteDevice(address);
        mBluetoothGatt.cancelConnection(device);
    }

    @Override
    public ArrayList<BleGattService> getServices(String address) {
        ArrayList<BleGattService> list = new ArrayList<BleGattService>();
        BluetoothDevice device = mBtAdapter.getRemoteDevice(address);
        List<BluetoothGattService> services = mBluetoothGatt.getServices(device);
        for (BluetoothGattService s : services) {
            list.add(new BleGattService(s));
        }
        return list;
    }

    @Override
    public boolean requestReadCharacteristic(String address, BleGattCharacteristic characteristic) {
        mService.addBleRequest(new BleRequest(RequestType.READ_CHARACTERISTIC, address, characteristic));
        return true;
    }

    @Override
    public boolean discoverServices(String address) {
        return mBluetoothGatt.discoverServices(mBtAdapter.getRemoteDevice(address));
    }

    @Override
    public boolean readCharacteristic(String address, BleGattCharacteristic characteristic) {
        return mBluetoothGatt.readCharacteristic(characteristic.getGattCharacteristicS());
    }

    @Override
    public BleGattService getService(String address, UUID uuid) {
        BluetoothGattService service = mBluetoothGatt.getService(mBtAdapter.getRemoteDevice(address), uuid);
        if (service == null) {
            return null;
        } else {
            return new BleGattService(service);
        }
    }

    @Override
    public boolean requestCharacteristicNotification(String address, BleGattCharacteristic characteristic) {

        System.out.println("=================  requestCharacteristicNotification  222   " + address);
        mService.addBleRequest(new BleRequest(RequestType.CHARACTERISTIC_NOTIFICATION, address, characteristic));
        return true;
    }

    @Override
    public boolean characteristicNotification(String address, BleGattCharacteristic characteristic) {
        BluetoothGattCharacteristic c = characteristic.getGattCharacteristicS();
        if (!mBluetoothGatt.setCharacteristicNotification(c, true)) {
            return false;
        }

        BluetoothGattDescriptor descriptor = c.getDescriptor(BleService.DESC_CCC);
        if (descriptor == null) {
            return false;
        }

        return mBluetoothGatt.readDescriptor(descriptor);
    }

    @Override
    public boolean requestWriteCharacteristic(String address, BleGattCharacteristic characteristic, String remark) {
        mService.addBleRequest(new BleRequest(RequestType.WRITE_CHARACTERISTIC, address, characteristic));
        return true;
    }

    @Override
    public boolean writeCharacteristic(String address, BleGattCharacteristic characteristic) {
        return mBluetoothGatt.writeCharacteristic(characteristic.getGattCharacteristicS());
    }

    @Override
    public boolean requestConnect(String address) {
        mService.addBleRequest(new BleRequest(RequestType.CONNECT_GATT, address));
        return true;
    }

    @Override
    public String getBTAdapterMacAddr() {
        if (mBtAdapter != null) {
            return mBtAdapter.getAddress();
        }
        return null;
    }

    @Override
    public boolean requestIndication(String address, BleGattCharacteristic characteristic) {
        mService.addBleRequest(new BleRequest(RequestType.CHARACTERISTIC_INDICATION, address, characteristic));
        return true;
    }

    @Override
    public boolean requestStopNotification(String address, BleGattCharacteristic characteristic) {
        mService.addBleRequest(
                new BleRequest(RequestType.CHARACTERISTIC_STOP_NOTIFICATION, address, characteristic));
        return true;
    }
}