From d0d6668a01ed86c42337e1b6a69a6cc2135583d7 Mon Sep 17 00:00:00 2001 From: Giovanni Mittone Date: Tue, 26 Mar 2019 10:34:46 +0100 Subject: [PATCH 1/2] Add support to personalization of UUIDs used for establish or listent to a new connection --- .../com/megster/cordova/BluetoothSerial.java | 23 ++++++- .../cordova/BluetoothSerialService.java | 62 +++++++++++++++++-- src/browser/bluetoothSerial.js | 9 +++ src/wp/BluetoothSerial.cs | 15 +++++ www/bluetoothSerial.js | 11 ++++ 5 files changed, 115 insertions(+), 5 deletions(-) diff --git a/src/android/com/megster/cordova/BluetoothSerial.java b/src/android/com/megster/cordova/BluetoothSerial.java index 8be5575f..abedb531 100644 --- a/src/android/com/megster/cordova/BluetoothSerial.java +++ b/src/android/com/megster/cordova/BluetoothSerial.java @@ -53,6 +53,9 @@ public class BluetoothSerial extends CordovaPlugin { private static final String CLEAR_DEVICE_DISCOVERED_LISTENER = "clearDeviceDiscoveredListener"; private static final String SET_NAME = "setName"; private static final String SET_DISCOVERABLE = "setDiscoverable"; + private static final String SET_REMOTE_UUID = "setRemoteUUID"; + private static final String SET_LOCAL_SECURE_UUID = "setLocalSecureUUID"; + private static final String SET_LOCAL_INSECURE_UUID = "setLocalInsecureUUID"; // callbacks private CallbackContext connectCallback; @@ -241,7 +244,25 @@ public boolean execute(String action, CordovaArgs args, CallbackContext callback discoverIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, discoverableDuration); cordova.getActivity().startActivity(discoverIntent); - } else { + } else if (action.equals(SET_REMOTE_UUID)) { + + String uuid = args.getString(0); + this.bluetoothSerialService.setRemoteUUID(uuid); + callbackContext.success(); + + } else if (action.equals(SET_LOCAL_SECURE_UUID)) { + + String uuid = args.getString(0); + this.bluetoothSerialService.setLocalSecureUUID(uuid); + callbackContext.success(); + + } else if (action.equals(SET_LOCAL_INSECURE_UUID)) { + + String uuid = args.getString(0); + this.bluetoothSerialService.setLocalInsecureUUID(uuid); + callbackContext.success(); + + } else validAction = false; } diff --git a/src/android/com/megster/cordova/BluetoothSerialService.java b/src/android/com/megster/cordova/BluetoothSerialService.java index 63ce6c53..794bcece 100644 --- a/src/android/com/megster/cordova/BluetoothSerialService.java +++ b/src/android/com/megster/cordova/BluetoothSerialService.java @@ -49,6 +49,9 @@ public class BluetoothSerialService { private ConnectThread mConnectThread; private ConnectedThread mConnectedThread; private int mState; + private UUID mRemoteUUID = null; + private UUID mLocalSecureUUID = null; + private UUID mLocaInsecureUUID = null; // Constants that indicate the current connection state public static final int STATE_NONE = 0; // we're doing nothing @@ -65,6 +68,57 @@ public BluetoothSerialService(Handler handler) { mState = STATE_NONE; mHandler = handler; } + + /** + * Set the remote device UUID used to establish a new connection. + * If null, empty or invalid, the default 00001101-0000-1000-8000-00805F9B34FB is used. + * @param uuid A String representing the UUID + */ + public synchronized void setRemoteUUID(String uuid) { + if((uuid == null) || uuid.isEmpty()) { + this.mRemoteUUID = null; + } + + try { + this.mRemoteUUID = UUID.fromString(uuid); + } catch(IllegalArgumentException ex) { + this.mRemoteUUID = null; + } + } + + /** + * Set the local secure device UUID used to establish a new connection. + * If null, empty or invalid, the default 7A9C3B55-78D0-44A7-A94E-A93E3FE118CE is used. + * @param uuid A String representing the UUID + */ + public synchronized void setLocalSecureUUID(String uuid) { + if((uuid == null) || uuid.isEmpty()) { + this.mLocalSecureUUID = null; + } + + try { + this.mLocalSecureUUID = UUID.fromString(uuid); + } catch(IllegalArgumentException ex) { + this.mLocalSecureUUID = null; + } + } + + /** + * Set the local insecure device UUID used to establish a new connection. + * If null, empty or invalid, the default 23F18142-B389-4772-93BD-52BDBB2C03E9 is used. + * @param uuid A String representing the UUID + */ + public synchronized void setLocalInsecureUUID(String uuid) { + if((uuid == null) || uuid.isEmpty()) { + this.mLocalInsecureUUID = null; + } + + try { + this.mLocalInsecureUUID = UUID.fromString(uuid); + } catch(IllegalArgumentException ex) { + this.mLocalInsecureUUID = null; + } + } /** * Set the current state of the chat connection @@ -264,9 +318,9 @@ public AcceptThread(boolean secure) { // Create a new listening server socket try { if (secure) { - tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME_SECURE, MY_UUID_SECURE); + tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME_SECURE, (this.mLocalSecureUUID != null) ? this.mLocalSecureUUID : MY_UUID_SECURE); } else { - tmp = mAdapter.listenUsingInsecureRfcommWithServiceRecord(NAME_INSECURE, MY_UUID_INSECURE); + tmp = mAdapter.listenUsingInsecureRfcommWithServiceRecord(NAME_INSECURE, (this.mLocalInsecureUUID != null) ? this.mLocalInsecureUUID : MY_UUID_INSECURE); } } catch (IOException e) { Log.e(TAG, "Socket Type: " + mSocketType + "listen() failed", e); @@ -348,10 +402,10 @@ public ConnectThread(BluetoothDevice device, boolean secure) { try { if (secure) { // tmp = device.createRfcommSocketToServiceRecord(MY_UUID_SECURE); - tmp = device.createRfcommSocketToServiceRecord(UUID_SPP); + tmp = device.createRfcommSocketToServiceRecord((this.mRemoteUUID != null) ? this.mRemoteUUID : UUID_SPP); } else { //tmp = device.createInsecureRfcommSocketToServiceRecord(MY_UUID_INSECURE); - tmp = device.createInsecureRfcommSocketToServiceRecord(UUID_SPP); + tmp = device.createInsecureRfcommSocketToServiceRecord((this.mRemoteUUID != null) ? this.mRemoteUUID : UUID_SPP); } } catch (IOException e) { Log.e(TAG, "Socket Type: " + mSocketType + "create() failed", e); diff --git a/src/browser/bluetoothSerial.js b/src/browser/bluetoothSerial.js index 2a511b68..c3b5727b 100644 --- a/src/browser/bluetoothSerial.js +++ b/src/browser/bluetoothSerial.js @@ -165,5 +165,14 @@ module.exports = (function() { discoverUnpaired : function(success_cb, fail_cb) { alert("bluetoothSerial.discoverUnpaired is not implemented"); }, + setRemoteUUID : function(uuid) { + alert("bluetoothSerial.setRemoteUUID is not implemented"); + }, + setLocalSecureUUID : function(uuid) { + alert("bluetoothSerial.setLocalSecureUUID is not implemented"); + }, + setLocalInsecureUUID : function(uuid) { + alert("bluetoothSerial.setLocalInsecureUUID is not implemented"); + }, } })(); diff --git a/src/wp/BluetoothSerial.cs b/src/wp/BluetoothSerial.cs index 6ef092cc..1639f16d 100644 --- a/src/wp/BluetoothSerial.cs +++ b/src/wp/BluetoothSerial.cs @@ -30,6 +30,21 @@ public class BluetoothSerial : BaseCommand private int RAW_DATA_FLUSH_TIMER_MILLIS = 200; private Boolean connected = false; + + public void setRemoteUUID(string uuid) + { + // Do nothing + } + + public void setLocalSecureUUID(string uuid) + { + // Do nothing + } + + public void setLocalInsecureUUID(string uuid) + { + // Do nothing + } public async void list(string args) { diff --git a/www/bluetoothSerial.js b/www/bluetoothSerial.js index 250b8aab..d2db6152 100644 --- a/www/bluetoothSerial.js +++ b/www/bluetoothSerial.js @@ -131,6 +131,17 @@ module.exports = { cordova.exec(null, null, "BluetoothSerial", "setDiscoverable", [discoverableDuration]); } + setRemoteUUID: function (uuid) { + cordova.exec(null, null, "BluetoothSerial", "setLocalUUID", [uuid]); + } + + setLocalSecureUUID: function (uuid) { + cordova.exec(null, null, "BluetoothSerial", "setLocalSecureUUID", [uuid]); + } + + setLocalInsecureUUID: function (uuid) { + cordova.exec(null, null, "BluetoothSerial", "setLocalInsecureUUID", [uuid]); + } }; From 958c1428a35dcfbbd8bb812c273d61672cae149a Mon Sep 17 00:00:00 2001 From: Giovanni Mittone Date: Tue, 26 Mar 2019 14:35:07 +0100 Subject: [PATCH 2/2] Move personalization of UUID in the connect method. --- .../com/megster/cordova/BluetoothSerial.java | 33 +++----- .../cordova/BluetoothSerialService.java | 77 ++++--------------- src/browser/bluetoothSerial.js | 9 --- src/wp/BluetoothSerial.cs | 15 ---- www/bluetoothSerial.js | 14 +--- 5 files changed, 26 insertions(+), 122 deletions(-) diff --git a/src/android/com/megster/cordova/BluetoothSerial.java b/src/android/com/megster/cordova/BluetoothSerial.java index abedb531..16fee5cf 100644 --- a/src/android/com/megster/cordova/BluetoothSerial.java +++ b/src/android/com/megster/cordova/BluetoothSerial.java @@ -53,9 +53,6 @@ public class BluetoothSerial extends CordovaPlugin { private static final String CLEAR_DEVICE_DISCOVERED_LISTENER = "clearDeviceDiscoveredListener"; private static final String SET_NAME = "setName"; private static final String SET_DISCOVERABLE = "setDiscoverable"; - private static final String SET_REMOTE_UUID = "setRemoteUUID"; - private static final String SET_LOCAL_SECURE_UUID = "setLocalSecureUUID"; - private static final String SET_LOCAL_INSECURE_UUID = "setLocalInsecureUUID"; // callbacks private CallbackContext connectCallback; @@ -244,25 +241,7 @@ public boolean execute(String action, CordovaArgs args, CallbackContext callback discoverIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, discoverableDuration); cordova.getActivity().startActivity(discoverIntent); - } else if (action.equals(SET_REMOTE_UUID)) { - - String uuid = args.getString(0); - this.bluetoothSerialService.setRemoteUUID(uuid); - callbackContext.success(); - - } else if (action.equals(SET_LOCAL_SECURE_UUID)) { - - String uuid = args.getString(0); - this.bluetoothSerialService.setLocalSecureUUID(uuid); - callbackContext.success(); - - } else if (action.equals(SET_LOCAL_INSECURE_UUID)) { - - String uuid = args.getString(0); - this.bluetoothSerialService.setLocalInsecureUUID(uuid); - callbackContext.success(); - - } else + } else { validAction = false; } @@ -358,12 +337,18 @@ private JSONObject deviceToJSON(BluetoothDevice device) throws JSONException { } private void connect(CordovaArgs args, boolean secure, CallbackContext callbackContext) throws JSONException { - String macAddress = args.getString(0); + String connectTo = args.getString(0); + String[] parts = connectTo.split("\\|"); + String macAddress = parts[0]; + String uuid = null; + if(parts.length > 1) { + uuid = parts[1]; + } BluetoothDevice device = bluetoothAdapter.getRemoteDevice(macAddress); if (device != null) { connectCallback = callbackContext; - bluetoothSerialService.connect(device, secure); + bluetoothSerialService.connect(device, secure, uuid); buffer.setLength(0); PluginResult result = new PluginResult(PluginResult.Status.NO_RESULT); diff --git a/src/android/com/megster/cordova/BluetoothSerialService.java b/src/android/com/megster/cordova/BluetoothSerialService.java index 794bcece..d0524e05 100644 --- a/src/android/com/megster/cordova/BluetoothSerialService.java +++ b/src/android/com/megster/cordova/BluetoothSerialService.java @@ -49,9 +49,6 @@ public class BluetoothSerialService { private ConnectThread mConnectThread; private ConnectedThread mConnectedThread; private int mState; - private UUID mRemoteUUID = null; - private UUID mLocalSecureUUID = null; - private UUID mLocaInsecureUUID = null; // Constants that indicate the current connection state public static final int STATE_NONE = 0; // we're doing nothing @@ -68,57 +65,6 @@ public BluetoothSerialService(Handler handler) { mState = STATE_NONE; mHandler = handler; } - - /** - * Set the remote device UUID used to establish a new connection. - * If null, empty or invalid, the default 00001101-0000-1000-8000-00805F9B34FB is used. - * @param uuid A String representing the UUID - */ - public synchronized void setRemoteUUID(String uuid) { - if((uuid == null) || uuid.isEmpty()) { - this.mRemoteUUID = null; - } - - try { - this.mRemoteUUID = UUID.fromString(uuid); - } catch(IllegalArgumentException ex) { - this.mRemoteUUID = null; - } - } - - /** - * Set the local secure device UUID used to establish a new connection. - * If null, empty or invalid, the default 7A9C3B55-78D0-44A7-A94E-A93E3FE118CE is used. - * @param uuid A String representing the UUID - */ - public synchronized void setLocalSecureUUID(String uuid) { - if((uuid == null) || uuid.isEmpty()) { - this.mLocalSecureUUID = null; - } - - try { - this.mLocalSecureUUID = UUID.fromString(uuid); - } catch(IllegalArgumentException ex) { - this.mLocalSecureUUID = null; - } - } - - /** - * Set the local insecure device UUID used to establish a new connection. - * If null, empty or invalid, the default 23F18142-B389-4772-93BD-52BDBB2C03E9 is used. - * @param uuid A String representing the UUID - */ - public synchronized void setLocalInsecureUUID(String uuid) { - if((uuid == null) || uuid.isEmpty()) { - this.mLocalInsecureUUID = null; - } - - try { - this.mLocalInsecureUUID = UUID.fromString(uuid); - } catch(IllegalArgumentException ex) { - this.mLocalInsecureUUID = null; - } - } /** * Set the current state of the chat connection @@ -170,8 +116,9 @@ public synchronized void start() { * Start the ConnectThread to initiate a connection to a remote device. * @param device The BluetoothDevice to connect * @param secure Socket Security type - Secure (true) , Insecure (false) + * @param uuid A string representing the UUID to connect to. If null, the default is used. */ - public synchronized void connect(BluetoothDevice device, boolean secure) { + public synchronized void connect(BluetoothDevice device, boolean secure, String uuid) { if (D) Log.d(TAG, "connect to: " + device); // Cancel any thread attempting to make a connection @@ -183,7 +130,7 @@ public synchronized void connect(BluetoothDevice device, boolean secure) { if (mConnectedThread != null) {mConnectedThread.cancel(); mConnectedThread = null;} // Start the thread to connect with the given device - mConnectThread = new ConnectThread(device, secure); + mConnectThread = new ConnectThread(device, secure, uuid); mConnectThread.start(); setState(STATE_CONNECTING); } @@ -318,9 +265,9 @@ public AcceptThread(boolean secure) { // Create a new listening server socket try { if (secure) { - tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME_SECURE, (this.mLocalSecureUUID != null) ? this.mLocalSecureUUID : MY_UUID_SECURE); + tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME_SECURE, MY_UUID_SECURE); } else { - tmp = mAdapter.listenUsingInsecureRfcommWithServiceRecord(NAME_INSECURE, (this.mLocalInsecureUUID != null) ? this.mLocalInsecureUUID : MY_UUID_INSECURE); + tmp = mAdapter.listenUsingInsecureRfcommWithServiceRecord(NAME_INSECURE, MY_UUID_INSECURE); } } catch (IOException e) { Log.e(TAG, "Socket Type: " + mSocketType + "listen() failed", e); @@ -393,19 +340,27 @@ private class ConnectThread extends Thread { private final BluetoothDevice mmDevice; private String mSocketType; - public ConnectThread(BluetoothDevice device, boolean secure) { + public ConnectThread(BluetoothDevice device, boolean secure, String uuid) { mmDevice = device; BluetoothSocket tmp = null; mSocketType = secure ? "Secure" : "Insecure"; + + UUID remoteUUID = null; + try { + remoteUUID = UUID.fromString(uuid); + Log.v(TAG, "Connect using user-defined UUID " + uuid); + } catch(Exception e) { + Log.e(TAG, "Invalid UUID provided for connection: " + uuid + ". Fallback to default.", e); + } // Get a BluetoothSocket for a connection with the given BluetoothDevice try { if (secure) { // tmp = device.createRfcommSocketToServiceRecord(MY_UUID_SECURE); - tmp = device.createRfcommSocketToServiceRecord((this.mRemoteUUID != null) ? this.mRemoteUUID : UUID_SPP); + tmp = device.createRfcommSocketToServiceRecord((remoteUUID != null) ? remoteUUID : UUID_SPP); } else { //tmp = device.createInsecureRfcommSocketToServiceRecord(MY_UUID_INSECURE); - tmp = device.createInsecureRfcommSocketToServiceRecord((this.mRemoteUUID != null) ? this.mRemoteUUID : UUID_SPP); + tmp = device.createInsecureRfcommSocketToServiceRecord((remoteUUID != null) ? remoteUUID : UUID_SPP); } } catch (IOException e) { Log.e(TAG, "Socket Type: " + mSocketType + "create() failed", e); diff --git a/src/browser/bluetoothSerial.js b/src/browser/bluetoothSerial.js index c3b5727b..2a511b68 100644 --- a/src/browser/bluetoothSerial.js +++ b/src/browser/bluetoothSerial.js @@ -165,14 +165,5 @@ module.exports = (function() { discoverUnpaired : function(success_cb, fail_cb) { alert("bluetoothSerial.discoverUnpaired is not implemented"); }, - setRemoteUUID : function(uuid) { - alert("bluetoothSerial.setRemoteUUID is not implemented"); - }, - setLocalSecureUUID : function(uuid) { - alert("bluetoothSerial.setLocalSecureUUID is not implemented"); - }, - setLocalInsecureUUID : function(uuid) { - alert("bluetoothSerial.setLocalInsecureUUID is not implemented"); - }, } })(); diff --git a/src/wp/BluetoothSerial.cs b/src/wp/BluetoothSerial.cs index 1639f16d..6ef092cc 100644 --- a/src/wp/BluetoothSerial.cs +++ b/src/wp/BluetoothSerial.cs @@ -30,21 +30,6 @@ public class BluetoothSerial : BaseCommand private int RAW_DATA_FLUSH_TIMER_MILLIS = 200; private Boolean connected = false; - - public void setRemoteUUID(string uuid) - { - // Do nothing - } - - public void setLocalSecureUUID(string uuid) - { - // Do nothing - } - - public void setLocalInsecureUUID(string uuid) - { - // Do nothing - } public async void list(string args) { diff --git a/www/bluetoothSerial.js b/www/bluetoothSerial.js index d2db6152..1d261841 100644 --- a/www/bluetoothSerial.js +++ b/www/bluetoothSerial.js @@ -129,19 +129,7 @@ module.exports = { setDiscoverable: function (discoverableDuration) { cordova.exec(null, null, "BluetoothSerial", "setDiscoverable", [discoverableDuration]); - } - - setRemoteUUID: function (uuid) { - cordova.exec(null, null, "BluetoothSerial", "setLocalUUID", [uuid]); - } - - setLocalSecureUUID: function (uuid) { - cordova.exec(null, null, "BluetoothSerial", "setLocalSecureUUID", [uuid]); - } - - setLocalInsecureUUID: function (uuid) { - cordova.exec(null, null, "BluetoothSerial", "setLocalInsecureUUID", [uuid]); - } + }, };