Git Product home page Git Product logo

bluecon's Introduction

BlueCon

Download

BlueCon is SPP Server & Client Library for Android.

this Service is support Android 4.4 and grater environment.

Installation

if you use jcenter repository, just add dependency your app.

dependencies {
    ...
    compile 'me.kudryavka:bluecon:0.2.1'
    ...
}

Usage

just simple.

Add permission in your manifest file for using BLUETOOTH like this.

<uses-permission android:name="android.permission.BLUETOOTH" />

Client

as a Service

for using client service, Using SPPClientService. Define Binder and Service connect condition.

private SPPClientService.SPPBinder svBinder;
private boolean isSVConned;

Bind service to Application's context.

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    bindService(new Intent(this, SPPClientService.class), serviceConnection, BIND_AUTO_CREATE);
    ...
}

Unbind service when app is dead

@Override
protected void onDestroy() {
    ... 
    unbindService(serviceConnection);
    ...
}

Make ServiceConnection and add SPPLietner to the Service.

public ServiceConnection serviceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        Log.e("SERVICE", "CONNNECTED");
        svBinder = (SPPClientService.SPPBinder)service;
        isSVConned = true;
        svBinder.addSPPListener(new SPPListener() {
            @Override
            public void onPacketReceived(String address, byte[] packet) {
                // Received packets
            }

            @Override
            public void onPacketSended(String address, byte[] packet) {
                // Sended packets
            }

            @Override
            public void onBluetoothDeviceConnected(String name, String address) {
                // on bluetooth device connected
            }

            @Override
            public void onBluetoothDeviceConnecting(@Nullable String name) {
                // on connecting to device
            }

            @Override
            public void onBluetoothDeviceDisconnected(@Nullable String name) {
                // on disconnected from device
            }

            @Override
            public void onBluetoothDisabled() {
                // if bluetooth is off
            }

            @Override
            public void onBluetoothNotSupported() {
                // Android device has not bluetooth module
            }
        });
    }
    
    @Override
    public void onServiceDisconnected(ComponentName name) {
        Log.e("SERVICE", "DISCONNNECTED");
        isSVConned = false;
    }
};

You can get Paird device list.

ArrayList<BluetoothDevice> devices = svBinder.getPairedDevices();

You can connect to device using BluetoothDevice or Device's MAC address

svBinder.connect(BluetoothDevice device);
svBinder.connect(String address);

Sending a packet

svBinder.sendPacket(byte[] data)

As a instance

Get Controller's Instance

SPPClientController sppClientController = SPPClientController.getInstance(getApplicationContext());

Add SPPListener to Instance

sppClientController.addSPPListener(new SPPListener() {
    @Override
    public void onPacketReceived(String address, byte[] packet) {
        // Received packets
    }

    @Override
    public void onPacketSended(String address, byte[] packet) {
        // Sended packets
    }

    @Override
    public void onBluetoothDeviceConnected(String name, String address) {
        // on bluetooth device connected
    }

    @Override
    public void onBluetoothDeviceConnecting(@Nullable String name) {
        // on connecting to device
    }

    @Override
    public void onBluetoothDeviceDisconnected(@Nullable String name) {
        // on disconnected from device
    }

    @Override
    public void onBluetoothDisabled() {
        // if bluetooth is off
    }

    @Override
    public void onBluetoothNotSupported() {
        // Android device has not bluetooth module
    }
});

You can get Paird device list.

ArrayList<BluetoothDevice> devices = sppClientController.getPairedDevices();

You can connect to device using BluetoothDevice or Device's MAC address

sppClientController.connect(BluetoothDevice device);
sppClientController.connect(String address);

Sending a packet

sppClientController.sendPacket(byte[] data)

Server

as a Service

for using server service, Using SPPServerService. Define Binder and Service connect condition.

private SPPServerService.SPPBinder svBinder;
private boolean isSVConned;

Bind service to Application's context.

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    bindService(new Intent(this, SPPServerService.class), serviceConnection, BIND_AUTO_CREATE);
    ...
}

Unbind service when app is dead

@Override
protected void onDestroy() {
    ... 
    unbindService(serviceConnection);
    ...
}

Make ServiceConnection and add SPPLietner to the Service.

public ServiceConnection serviceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        Log.e("SERVICE", "CONNNECTED");
        svBinder = (SPPServerController.SPPBinder)service;
        isSVConned = true;
        svBinder.addSPPListener(new SPPListener() {
            @Override
            public void onPacketReceived(String address, byte[] packet) {
                // Received packets
            }

            @Override
            public void onPacketSended(String address, byte[] packet) {
                // Sended packets
            }

            @Override
            public void onBluetoothDeviceConnected(String name, String address) {
                // on bluetooth device connected
            }

            @Override
            public void onBluetoothDeviceConnecting(@Nullable String name) {
                // on connecting to device
            }

            @Override
            public void onBluetoothDeviceDisconnected(@Nullable String name) {
                // on disconnected from device
            }

            @Override
            public void onBluetoothDisabled() {
                // if bluetooth is off
            }

            @Override
            public void onBluetoothNotSupported() {
                // Android device has not bluetooth module
            }
        });
    }
    
    @Override
    public void onServiceDisconnected(ComponentName name) {
        Log.e("SERVICE", "DISCONNNECTED");
        isSVConned = false;
    }
};

You can get Connecte device list.

ArrayList<BluetoothDevice> devices = svBinder.getConnectedDevice()

You can start server with server's name, inputStream buffersize, server mode.

SERVER_MODE{SINGLE_CONNECTION, MULTIPLE_CONNECTION}
svBinder.startServer(String serverName, int bufferSize, ENUMS.SERVER_MODE serverMode);

Sending a packet

svBinder.sendPacket(String addressbyte[] data);

or broadcast

svBinder.broadcastPacket(byte[] data);

As a instance

Get Controller's Instance

SPPServerController sppServerController = SPPServerController.getInstance(getApplicationContext());

Add SPPListener to Instance

sppServerController.addSPPListener(new SPPListener() {
    @Override
    public void onPacketReceived(String address, byte[] packet) {
        // Received packets
    }

    @Override
    public void onPacketSended(String address, byte[] packet) {
        // Sended packets
    }

    @Override
    public void onBluetoothDeviceConnected(String name, String address) {
        // on bluetooth device connected
    }

    @Override
    public void onBluetoothDeviceConnecting(@Nullable String name) {
        // on connecting to device
    }

    @Override
    public void onBluetoothDeviceDisconnected(@Nullable String name) {
        // on disconnected from device
    }

    @Override
    public void onBluetoothDisabled() {
        // if bluetooth is off
    }

    @Override
    public void onBluetoothNotSupported() {
        // Android device has not bluetooth module
    }
});

You can get Connecte device list.

ArrayList<BluetoothDevice> devices = sppServerController.getConnectedDevice()

You can start server with server's name, inputStream buffersize, server mode.

SERVER_MODE{SINGLE_CONNECTION, MULTIPLE_CONNECTION}
sppServerController.startServer(String serverName, int bufferSize, ENUMS.SERVER_MODE serverMode);

Sending a packet

sppServerController.sendPacket(String addressbyte[] data);

or broadcast

sppServerController.broadcastPacket(byte[] data);

bluecon's People

Contributors

fregmented avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

bluecon's Issues

Client Instance crashes app

Server instance works great, but If I use a client instance the app tries to connect a couple of times to the client, but then it crashes the app. (even if the device is not reachable)

This are the errors, and I also have no idea on why it's saying it's connected when this cannot be (device was off, but it's basically doing the same when device is on):

12-09 16:01:57.272 9504-9561/com.metalit.ondaweb E/SPPClientController: Failed to connect to SOCKET. retrying...
12-09 16:01:57.276 9504-9561/com.metalit.ondaweb D/SPPClientController: CONNECTED : 00:1D:A5:68:98:8C
12-09 16:01:57.277 9504-9678/com.metalit.ondaweb W/BluetoothAdapter: getBluetoothService() called with no BluetoothManagerCallback
12-09 16:01:57.284 9504-9679/com.metalit.ondaweb E/SPPClientController: FAILED TO READ PACKET
                                                                        java.io.IOException: socket closed
                                                                            at android.net.LocalSocketImpl$SocketInputStream.read(LocalSocketImpl.java:104)
                                                                            at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:571)
                                                                            at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:96)
                                                                            at java.io.InputStream.read(InputStream.java:101)
                                                                            at me.kudryavka.bluecon.SPPClient.SPPClientController$CommunicationThread.run(SPPClientController.java:336)
12-09 16:01:57.284 9504-9679/com.metalit.ondaweb D/SPPClientController: RECONNECT TO : 00:1D:A5:68:98:8C
12-09 16:01:57.284 9504-9679/com.metalit.ondaweb D/OndaWEB: BT device disconnected: 00:1D:A5:68:98:8C
12-09 16:01:57.284 9504-9679/com.metalit.ondaweb D/SPPClientController: CONNECT TO : 00:1D:A5:68:98:8C
12-09 16:01:57.292 9504-9561/com.metalit.ondaweb D/OndaWEB: BT Connected: 00:1D:A5:68:98:8C : OBDII
12-09 16:01:57.295 9504-9679/com.metalit.ondaweb D/OndaWEB: BT device connecting: 00:1D:A5:68:98:8C
12-09 16:01:57.296 9504-9680/com.metalit.ondaweb W/BluetoothAdapter: getBluetoothService() called with no BluetoothManagerCallback
12-09 16:02:02.539 9504-9678/com.metalit.ondaweb E/SPPClientController: Failed to connect to SOCKET. retrying...
12-09 16:02:02.539 9504-9680/com.metalit.ondaweb E/SPPClientController: Failed to connect to SOCKET. retrying...
12-09 16:02:02.541 9504-9678/com.metalit.ondaweb D/SPPClientController: CONNECTED : 00:1D:A5:68:98:8C
12-09 16:02:02.546 9504-9678/com.metalit.ondaweb D/OndaWEB: BT Connected: 00:1D:A5:68:98:8C : OBDII
12-09 16:02:02.546 9504-9759/com.metalit.ondaweb W/BluetoothAdapter: getBluetoothService() called with no BluetoothManagerCallback
12-09 16:02:02.548 9504-9760/com.metalit.ondaweb E/SPPClientController: FAILED TO READ PACKET
                                                                        java.io.IOException: socket closed
                                                                            at android.net.LocalSocketImpl$SocketInputStream.read(LocalSocketImpl.java:104)
                                                                            at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:571)
                                                                            at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:96)
                                                                            at java.io.InputStream.read(InputStream.java:101)
                                                                            at me.kudryavka.bluecon.SPPClient.SPPClientController$CommunicationThread.run(SPPClientController.java:336)
12-09 16:02:02.548 9504-9760/com.metalit.ondaweb D/SPPClientController: RECONNECT TO : 00:1D:A5:68:98:8C
12-09 16:02:02.549 9504-9760/com.metalit.ondaweb D/OndaWEB: BT device disconnected: 00:1D:A5:68:98:8C
12-09 16:02:02.549 9504-9760/com.metalit.ondaweb D/SPPClientController: CONNECT TO : 00:1D:A5:68:98:8C
12-09 16:02:02.549 9504-9680/com.metalit.ondaweb D/SPPClientController: CONNECTED : 00:1D:A5:68:98:8C
12-09 16:02:02.552 9504-9759/com.metalit.ondaweb E/SPPClientController: Failed to connect to SOCKET. retrying...
12-09 16:02:02.552 9504-9761/com.metalit.ondaweb W/BluetoothAdapter: getBluetoothService() called with no BluetoothManagerCallback
12-09 16:02:02.554 9504-9762/com.metalit.ondaweb E/SPPClientController: FAILED TO READ PACKET
                                                                        java.io.IOException: socket closed
                                                                            at android.net.LocalSocketImpl$SocketInputStream.read(LocalSocketImpl.java:104)
                                                                            at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:571)
                                                                            at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:96)
                                                                            at java.io.InputStream.read(InputStream.java:101)
                                                                            at me.kudryavka.bluecon.SPPClient.SPPClientController$CommunicationThread.run(SPPClientController.java:336)
12-09 16:02:02.554 9504-9762/com.metalit.ondaweb D/SPPClientController: RECONNECT TO : 00:1D:A5:68:98:8C
12-09 16:02:02.555 9504-9762/com.metalit.ondaweb D/OndaWEB: BT device disconnected: 00:1D:A5:68:98:8C
12-09 16:02:02.555 9504-9762/com.metalit.ondaweb D/SPPClientController: CONNECT TO : 00:1D:A5:68:98:8C
12-09 16:02:02.558 9504-9761/com.metalit.ondaweb E/SPPClientController: Failed to connect to SOCKET. retrying...
12-09 16:02:02.561 9504-9680/com.metalit.ondaweb D/OndaWEB: BT Connected: 00:1D:A5:68:98:8C : OBDII
12-09 16:02:02.564 9504-9759/com.metalit.ondaweb D/SPPClientController: CONNECTED : 00:1D:A5:68:98:8C
12-09 16:02:02.569 9504-9759/com.metalit.ondaweb D/OndaWEB: BT Connected: 00:1D:A5:68:98:8C : OBDII
12-09 16:02:02.569 9504-9763/com.metalit.ondaweb E/SPPClientController: Failed to connect to SOCKET. retrying...
12-09 16:02:02.572 9504-9762/com.metalit.ondaweb D/OndaWEB: BT device connecting: 00:1D:A5:68:98:8C
12-09 16:02:02.573 9504-9760/com.metalit.ondaweb D/OndaWEB: BT device connecting: 00:1D:A5:68:98:8C
12-09 16:02:02.574 9504-9764/com.metalit.ondaweb E/SPPClientController: FAILED TO READ PACKET
                                                                        java.io.IOException: socket closed
                                                                            at android.net.LocalSocketImpl$SocketInputStream.read(LocalSocketImpl.java:104)
                                                                            at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:571)
                                                                            at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:96)
                                                                            at java.io.InputStream.read(InputStream.java:101)
                                                                            at me.kudryavka.bluecon.SPPClient.SPPClientController$CommunicationThread.run(SPPClientController.java:336)
12-09 16:02:02.575 9504-9764/com.metalit.ondaweb D/SPPClientController: RECONNECT TO : 00:1D:A5:68:98:8C
12-09 16:02:02.575 9504-9764/com.metalit.ondaweb D/OndaWEB: BT device disconnected: 00:1D:A5:68:98:8C
12-09 16:02:02.575 9504-9764/com.metalit.ondaweb D/SPPClientController: CONNECT TO : 00:1D:A5:68:98:8C
12-09 16:02:02.577 9504-9765/com.metalit.ondaweb W/BluetoothAdapter: getBluetoothService() called with no BluetoothManagerCallback
12-09 16:02:02.580 9504-9766/com.metalit.ondaweb E/SPPClientController: Failed to connect to SOCKET. retrying...
12-09 16:02:02.581 9504-9767/com.metalit.ondaweb E/SPPClientController: Failed to connect to SOCKET. retrying...
12-09 16:02:02.581 9504-9763/com.metalit.ondaweb D/SPPClientController: CONNECTED : 00:1D:A5:68:98:8C
12-09 16:02:02.584 9504-9765/com.metalit.ondaweb E/SPPClientController: Failed to connect to SOCKET. retrying...
12-09 16:02:02.589 9504-9763/com.metalit.ondaweb D/OndaWEB: BT Connected: 00:1D:A5:68:98:8C : OBDII
12-09 16:02:02.589 9504-9761/com.metalit.ondaweb D/SPPClientController: CONNECTED : 00:1D:A5:68:98:8C
12-09 16:02:02.589 9504-9768/com.metalit.ondaweb W/BluetoothAdapter: getBluetoothService() called with no BluetoothManagerCallback
12-09 16:02:02.594 9504-9761/com.metalit.ondaweb D/OndaWEB: BT Connected: 00:1D:A5:68:98:8C : OBDII
12-09 16:02:02.598 9504-9767/com.metalit.ondaweb D/SPPClientController: CONNECTED : 00:1D:A5:68:98:8C
12-09 16:02:02.598 9504-9768/com.metalit.ondaweb E/SPPClientController: Failed to connect to SOCKET. retrying...
12-09 16:02:02.600 9504-9770/com.metalit.ondaweb E/SPPClientController: FAILED TO READ PACKET
                                                                        java.io.IOException: socket closed
                                                                            at android.net.LocalSocketImpl$SocketInputStream.read(LocalSocketImpl.java:104)
                                                                            at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:571)
                                                                            at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:96)
                                                                            at java.io.InputStream.read(InputStream.java:101)
                                                                            at me.kudryavka.bluecon.SPPClient.SPPClientController$CommunicationThread.run(SPPClientController.java:336)
12-09 16:02:02.600 9504-9769/com.metalit.ondaweb E/AndroidRuntime: FATAL EXCEPTION: Thread-20
                                                                   Process: com.metalit.ondaweb, PID: 9504
                                                                   java.lang.NullPointerException: Attempt to invoke virtual method 'int java.io.InputStream.read(byte[], int, int)' on a null object reference
                                                                       at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:571)
                                                                       at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:96)
                                                                       at java.io.InputStream.read(InputStream.java:101)
                                                                       at me.kudryavka.bluecon.SPPClient.SPPClientController$CommunicationThread.run(SPPClientController.java:336)
12-09 16:02:02.600 9504-9770/com.metalit.ondaweb D/SPPClientController: RECONNECT TO : 00:1D:A5:68:98:8C
12-09 16:02:02.600 9504-9770/com.metalit.ondaweb D/OndaWEB: BT device disconnected: 00:1D:A5:68:98:8C
12-09 16:02:02.600 9504-9770/com.metalit.ondaweb D/SPPClientController: CONNECT TO : 00:1D:A5:68:98:8C
12-09 16:02:02.603 9504-9767/com.metalit.ondaweb D/OndaWEB: BT Connected: 00:1D:A5:68:98:8C : OBDII
12-09 16:02:02.605 9504-9772/com.metalit.ondaweb I/Process: Sending signal. PID: 9504 SIG: 9

onBluetoothDeviceDisconnected Callback don't work

Hi.
I try the SPPServerActivity for a SPP Server Mode.
This works fine... The PC open the SPP port, and I can send and receive messages in App.
The problem is when el Client close the connection.
A Exception occurs on SPPServerController, and I don't receive "onBluetoothDeviceDisconnected" Callback, to bind a new connection.

 java.io.IOException: bt socket closed, read return: -1
        at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:558)
        at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:88)
        at java.io.InputStream.read(InputStream.java:101)
        at me.kudryavka.bluecon.SPPServer.SPPServerController$CommunicationThread$ReadThread.run(SPPServerController.java:423)

The Exception is generate here. In SPPServerController.java, when try to read a closed socket.

  @Override
            public void run() {
                byte[] data = new byte[buffSize];
                int len;

                while (true) {
                    try {
                        len = inputStream.read(data);
                        byte[] read = new byte[len];
                        System.arraycopy(data, 0, read, 0, len);
                        for (SPPListener sppListener : sppListeners) {
                            sppListener.onPacketReceived(socket.getRemoteDevice().getAddress(), read);
                        }
                    } catch (IOException e) {
                        Log.e(TAG, "CONNECTION CLOSED BY PEER", e);
                        disconnected(socket, this);
                        break;
                    }
                }
            }

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.