Implementation of Filtered Scan for BLE android client 82/213982/1
authorsamanway-dey <samanway.dey@samsung.com>
Wed, 19 Dec 2018 14:30:25 +0000 (20:00 +0530)
committerSudipto <sudipto.bal@samsung.com>
Mon, 16 Sep 2019 11:47:20 +0000 (17:17 +0530)
https://github.sec.samsung.net/RS7-IOTIVITY/IoTivity/pull/550/commits/122fb3ee9a1ad66d5bbeeeeb6410f9f10e1977a6
(cherry-picked from 122fb3ee9a1ad66d5bbeeeeb6410f9f10e1977a6)

Change-Id: I537661ef606540fd36a8c352330ef831b96ed732
Signed-off-by: samanway-dey <samanway-dey@samsung.com>
Signed-off-by: Sudipto <sudipto.bal@samsung.com>
android/android_api/base/src/main/java/org/iotivity/ca/CaLeClientInterface.java
resource/csdk/connectivity/inc/cagattservice.h
resource/csdk/connectivity/src/bt_le_adapter/android/caleclient.c
resource/csdk/connectivity/src/bt_le_adapter/android/caleutils.c
resource/csdk/connectivity/src/bt_le_adapter/android/caleutils.h

index 75dde18..9b7c8ad 100755 (executable)
@@ -74,11 +74,11 @@ public class CaLeClientInterface {
     }
 
     public static void getLeScanCallback() {
-//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-//            caLeRegisterLeScanCallbackForV21(mLeScanCallbackForV21);
-//        } else {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            caLeRegisterLeScanCallbackForV21(mLeScanCallbackForV21);
+        } else {
             caLeRegisterLeScanCallback(mLeScanCallback);
-//        }
+        }
     }
 
     public static void getLeGattCallback() {
@@ -217,6 +217,7 @@ public class CaLeClientInterface {
         try {
             List<UUID> uuids = getUuids(scanRecord);
             for (UUID uuid : uuids) {
+            Log.d(TAG,"UUID is "+ uuid.toString());
                 if(uuid.toString().contains(SERVICE_UUID.toLowerCase())) {
                     caLeScanCallback(device);
                 } else if(uuid.toString().contains(CUSTOM_UUID.toLowerCase()) ||
@@ -351,6 +352,7 @@ public class CaLeClientInterface {
         public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor,
                 int status) {
             super.onDescriptorWrite(gatt, descriptor, status);
+            Log.d(TAG,"Descriptor status is "+ status);
 
             caLeGattDescriptorWriteCallback(gatt, status);
             caLeGattNWDescriptorWriteCallback(gatt, status);
index b587218..349adb4 100644 (file)
 /// OIC Transport Profile GATT service UUID.
 #define CA_GATT_SERVICE_UUID "ADE3D529-C784-4F63-A987-EB69F70EE816"
 
+/// OIC Transport Profile first GATT custom UUID.
+#define CA_GATT_CUSTOM_UUID "75004209"
+
+/// OIC Transport Profile second GATT custom UUID.
+#define CA_GATT_CUSTOM_UUID2 "75004204"
+
+/// OIC Transport Profile third GATT custom UUID.
+#define CA_GATT_CUSTOM_UUID3 "7500420C"
+
 /// OIC Transport Profile GATT request characteristic UUID.
 #define CA_GATT_REQUEST_CHRC_UUID "AD7B334F-4637-4B86-90B6-9D787F03D218"
 
index 9977465..83ed0ae 100644 (file)
 #define GATT_WRITE_NOT_PERMITTED            3
 
 // samsung
-#define BLE_SCAN_API_LEVEL (100) //(21)
+#define BLE_SCAN_API_LEVEL (21) //(21)
 #define BLE_MIN_API_LEVEL  (18)
 #define HIDDEN_API
+#define MANUFACTURE_ID 117
 
 static ca_thread_pool_t g_threadPoolHandle = NULL;
 
@@ -118,7 +119,7 @@ static CABLEDataReceivedCallback g_CABLEClientDataReceivedCallback = NULL;
 static int32_t g_jniIntSdk = -1;
 
 static bool g_setHighQoS = true;
-static bool g_setFullScanFlag = true;
+static bool g_setFullScanFlag = false;
 jclass g_LEInterface = NULL;
 /**
  * check if retry logic for connection routine has to be stopped or not.
@@ -1431,6 +1432,10 @@ CAResult_t CALEClientStartScan()
         return CA_STATUS_FAILED;
     }
 
+    if(g_jniIntSdk < BLE_SCAN_API_LEVEL)
+    {
+        g_setFullScanFlag = true;
+    }
     bool isAttached = false;
     JNIEnv* env = NULL;
     jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
@@ -1456,11 +1461,13 @@ CAResult_t CALEClientStartScan()
             if (!g_setFullScanFlag)
             {
                 //new uuid scan with callback
+                OIC_LOG(DEBUG, TAG, "CALEClientStartScanWithUUIDImplForV21 will be called");
                 ret = CALEClientStartScanWithUUIDImplForV21(env, g_uuidList, g_leScanCallback);
             }
             else
             {
                 //new full scan with callback
+                OIC_LOG(DEBUG, TAG, "CALEClientStartScanImplForV21 will be called");
                 ret = CALEClientStartScanImplForV21(env, g_leScanCallback);
             }
         }
@@ -1468,10 +1475,12 @@ CAResult_t CALEClientStartScan()
         {
             if (!g_setFullScanFlag)
             {
+                OIC_LOG(DEBUG, TAG, "CALEClientStartScanWithUUIDImpl will be called");
                 ret = CALEClientStartScanWithUUIDImpl(env, g_uuidList, g_leScanCallback);
             }
             else
             {
+                OIC_LOG(DEBUG, TAG, "CALEClientStartScanImpl will be called");
                 ret = CALEClientStartScanImpl(env, g_leScanCallback);
             }
         }
@@ -1822,6 +1831,45 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
         return CA_STATUS_FAILED;
     }
 
+    // call scanfilter.Builder()
+    jobject jni_obj_scanfilterBuilder2 = (*env)->NewObject(env, jni_cid_scanfilterBuilder,
+                                                          jni_mid_scanfilterBuilderCtor);
+    if (!jni_obj_scanfilterBuilder2)
+    {
+        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_scanfilterBuilder2 is null");
+        CACheckJNIException(env);
+        (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
+        return CA_STATUS_FAILED;
+    }
+
+    // call scanfilter.Builder()
+    jobject jni_obj_scanfilterBuilder3 = (*env)->NewObject(env, jni_cid_scanfilterBuilder,
+                                                          jni_mid_scanfilterBuilderCtor);
+    if (!jni_obj_scanfilterBuilder3)
+    {
+        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_scanfilterBuilder3 is null");
+        CACheckJNIException(env);
+        (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
+        return CA_STATUS_FAILED;
+    }
+
+    // call scanfilter.Builder()
+    jobject jni_obj_scanfilterBuilder4 = (*env)->NewObject(env, jni_cid_scanfilterBuilder,
+                                                          jni_mid_scanfilterBuilderCtor);
+    if (!jni_obj_scanfilterBuilder4)
+    {
+        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_scanfilterBuilder4 is null");
+        CACheckJNIException(env);
+        (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
+        return CA_STATUS_FAILED;
+    }
+
     // get scanfilter.Builder.setServiceUuid method id
     jmethodID jni_mid_setServiceUuid = (*env)->GetMethodID(env, jni_cid_scanfilterBuilder,
                                                            "setServiceUuid",
@@ -1833,9 +1881,28 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
         CACheckJNIException(env);
         (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
         (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
         return CA_STATUS_FAILED;
     }
 
+    // get scanfilter.Builder.setManufacturerData method id
+    jmethodID jni_mid_setManufacturerData = (*env)->GetMethodID(env, jni_cid_scanfilterBuilder,
+                                                           "setManufacturerData",
+                                                           "(I[B)Landroid/"
+                                                           "bluetooth/le/ScanFilter$Builder;");
+    if (!jni_mid_setManufacturerData)
+    {
+        OIC_LOG(ERROR, TAG, "scanfilter: jni_mid_setManufacturerData is null");
+        CACheckJNIException(env);
+        (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
+        return CA_STATUS_FAILED;
+    }
     // get scanfilter.Builder.build method id
     jmethodID jni_mid_build_scanfilterBuilder = (*env)->GetMethodID(env,
                                                                     jni_cid_scanfilterBuilder,
@@ -1848,6 +1915,9 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
         CACheckJNIException(env);
         (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
         (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
         return CA_STATUS_FAILED;
     }
     (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
@@ -1859,6 +1929,9 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
         OIC_LOG(ERROR, TAG, "scanSettings: jni_obj_parcelUuid is null");
         CACheckJNIException(env);
         (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
         return CA_STATUS_FAILED;
     }
 
@@ -1872,6 +1945,9 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
         OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_setServiceUuid is null");
         CACheckJNIException(env);
         (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
         (*env)->DeleteLocalRef(env, jni_obj_parcelUuid);
         return CA_STATUS_FAILED;
     }
@@ -1887,10 +1963,152 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
         OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_scanfilter is null");
         CACheckJNIException(env);
         (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
         return CA_STATUS_FAILED;
     }
     (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
 
+    OIC_LOG(DEBUG, TAG, "Service UUID scanfilter set");
+
+    jint jni_int_manId;
+    jbyteArray jni_byte_manData;
+    // set manufactererId
+    jni_int_manId = MANUFACTURE_ID;
+
+    // call utility function to set manufacturerData
+    jni_byte_manData = CALEGetManufacturerData(env, OIC_GATT_CUSTOM_UUID);
+    if(!jni_byte_manData)
+    {
+        OIC_LOG(ERROR, TAG, "scanSettings: jni_byte_manData is null");
+        CACheckJNIException(env);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
+        return CA_STATUS_FAILED;
+    }
+
+    // call set(uuid)
+    jobject jni_obj_setManufacturerData = (*env)->CallObjectMethod(env,
+                                                              jni_obj_scanfilterBuilder2,
+                                                              jni_mid_setManufacturerData,
+                                                              jni_int_manId,
+                                                              jni_byte_manData);
+    if (!jni_obj_setManufacturerData)
+    {
+        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_setManufacturerData is null");
+        CACheckJNIException(env);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
+        return CA_STATUS_FAILED;
+    }
+    (*env)->DeleteLocalRef(env, jni_byte_manData);
+    (*env)->DeleteLocalRef(env, jni_obj_setManufacturerData);
+
+    // call build()
+    jobject jni_obj_scanfilter2 = (*env)->CallObjectMethod(env,
+                                                          jni_obj_scanfilterBuilder2,
+                                                          jni_mid_build_scanfilterBuilder);
+    if (!jni_obj_scanfilter2)
+    {
+        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_scanfilter2 is null");
+        CACheckJNIException(env);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
+        return CA_STATUS_FAILED;
+    }
+    (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
+
+    OIC_LOG(DEBUG, TAG, "First custom UUID scanfilter set");
+
+    // call utility function to set manufacturerData
+    jni_byte_manData = CALEGetManufacturerData(env, OIC_GATT_CUSTOM_UUID2);
+    if(!jni_byte_manData)
+    {
+        OIC_LOG(ERROR, TAG, "scanSettings: jni_byte_manData is null");
+        CACheckJNIException(env);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
+        return CA_STATUS_FAILED;
+    }
+
+    // call set(uuid)
+    jni_obj_setManufacturerData = (*env)->CallObjectMethod(env,
+                                                              jni_obj_scanfilterBuilder3,
+                                                              jni_mid_setManufacturerData,
+                                                              jni_int_manId,
+                                                              jni_byte_manData);
+
+    if (!jni_obj_setManufacturerData)
+    {
+        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_setManufacturerData is null");
+        CACheckJNIException(env);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
+        return CA_STATUS_FAILED;
+    }
+    (*env)->DeleteLocalRef(env, jni_byte_manData);
+    (*env)->DeleteLocalRef(env, jni_obj_setManufacturerData);
+
+    // call build()
+    jobject jni_obj_scanfilter3 = (*env)->CallObjectMethod(env,
+                                                          jni_obj_scanfilterBuilder3,
+                                                          jni_mid_build_scanfilterBuilder);
+    if (!jni_obj_scanfilter3)
+    {
+        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_scanfilter3 is null");
+        CACheckJNIException(env);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
+        return CA_STATUS_FAILED;
+    }
+    (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
+    OIC_LOG(DEBUG, TAG, "Second custom UUID scanfilter set");
+
+    // call utility function to set manufacturerData
+    jni_byte_manData = CALEGetManufacturerData(env, OIC_GATT_CUSTOM_UUID3);
+    if(!jni_byte_manData)
+    {
+        OIC_LOG(ERROR, TAG, "scanSettings: jni_byte_manData is null");
+        CACheckJNIException(env);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
+        return CA_STATUS_FAILED;
+    }
+
+    // call set(uuid)
+    jni_obj_setManufacturerData = (*env)->CallObjectMethod(env,
+                                                               jni_obj_scanfilterBuilder4,
+                                                               jni_mid_setManufacturerData,
+                                                               jni_int_manId,
+                                                               jni_byte_manData);
+
+    if (!jni_obj_setManufacturerData)
+    {
+        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_setManufacturerData is null");
+        CACheckJNIException(env);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
+        return CA_STATUS_FAILED;
+    }
+    (*env)->DeleteLocalRef(env, jni_byte_manData);
+    (*env)->DeleteLocalRef(env, jni_obj_setManufacturerData);
+
+    // call build()
+    jobject jni_obj_scanfilter4 = (*env)->CallObjectMethod(env,
+                                                           jni_obj_scanfilterBuilder4,
+                                                           jni_mid_build_scanfilterBuilder);
+    if (!jni_obj_scanfilter4)
+    {
+        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_scanfilter4 is null");
+        CACheckJNIException(env);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
+        return CA_STATUS_FAILED;
+    }
+    (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
+    OIC_LOG(DEBUG, TAG, "Third custom UUID scanfilter set");
+
     // get scanSettings.Builder class id
     jclass jni_cid_scanSettingsBuilder = (*env)->FindClass(env,
                                                           "android/bluetooth/le/"
@@ -2014,6 +2232,46 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
     }
     (*env)->DeleteLocalRef(env, jni_obj_scanfilter);
 
+    jni_bool_arrayListIsAdded = (*env)->CallBooleanMethod(env, jni_obj_filterList,
+                                                                   jni_mid_arrayListAdd,
+                                                                   jni_obj_scanfilter2);
+    if (!jni_bool_arrayListIsAdded)
+    {
+        OIC_LOG(ERROR, TAG, "ArrayList: jni_bool_arrayListIsAdded is null");
+        (*env)->DeleteLocalRef(env, jni_obj_filterList);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilter2);
+        (*env)->DeleteLocalRef(env, jni_obj_scanSettingBuilder);
+        return CA_STATUS_FAILED;
+    }
+    (*env)->DeleteLocalRef(env, jni_obj_scanfilter2);
+
+    jni_bool_arrayListIsAdded = (*env)->CallBooleanMethod(env, jni_obj_filterList,
+                                                                   jni_mid_arrayListAdd,
+                                                                   jni_obj_scanfilter3);
+    if (!jni_bool_arrayListIsAdded)
+    {
+        OIC_LOG(ERROR, TAG, "ArrayList: jni_bool_arrayListIsAdded is null");
+        (*env)->DeleteLocalRef(env, jni_obj_filterList);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilter3);
+        (*env)->DeleteLocalRef(env, jni_obj_scanSettingBuilder);
+        return CA_STATUS_FAILED;
+    }
+    (*env)->DeleteLocalRef(env, jni_obj_scanfilter3);
+
+    jni_bool_arrayListIsAdded = (*env)->CallBooleanMethod(env, jni_obj_filterList,
+                                                                   jni_mid_arrayListAdd,
+                                                                   jni_obj_scanfilter4);
+    if (!jni_bool_arrayListIsAdded)
+    {
+        OIC_LOG(ERROR, TAG, "ArrayList: jni_bool_arrayListIsAdded is null");
+        (*env)->DeleteLocalRef(env, jni_obj_filterList);
+        (*env)->DeleteLocalRef(env, jni_obj_scanfilter4);
+        (*env)->DeleteLocalRef(env, jni_obj_scanSettingBuilder);
+        return CA_STATUS_FAILED;
+    }
+    (*env)->DeleteLocalRef(env, jni_obj_scanfilter4);
+
+    OIC_LOG(INFO, TAG, "ScanFilters Added");
     // get ScanSettings.SCAN_MODE_BALANCED jint value
     jint jni_int_scanBalancedMode = CALEGetConstantsValue(env, CLASSPATH_LE_SCANSETTINGS,
                                                           "SCAN_MODE_BALANCED");
@@ -2045,6 +2303,7 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
     (*env)->DeleteLocalRef(env, jni_obj_scanSettingBuilder);
 
     CAResult_t res = CA_STATUS_FAILED;
+
     // get default bt adapter class
     jclass jni_cid_BTAdapter = (*env)->FindClass(env, CLASSPATH_BT_ADAPTER);
     if (!jni_cid_BTAdapter)
index 04c5f8b..ca3091b 100644 (file)
@@ -150,6 +150,33 @@ error_exit:
     return NULL;
 }
 
+jbyteArray CALEGetManufacturerData(JNIEnv *env, const char* uuid)
+{
+    VERIFY_NON_NULL_RET(env, TAG, "env is null", NULL);
+    VERIFY_NON_NULL_RET(uuid, TAG, "uuid is null", NULL);
+
+    jbyteArray jni_byte_Data = (*env)->NewByteArray(env, 2);
+    uint8_t data_array[2];
+    if(uuid[7] == '9')
+    {
+        // OIC_GATT_CUSTOM_UUID
+        data_array[0] = 66, data_array[1] = 9;
+    }
+    else if(uuid[7] == '4')
+    {
+        // OIC_GATT_CUSTOM_UUID2
+        data_array[0] = 66, data_array[1] = 4;
+    }
+    else
+    {
+        // OIC_GATT_CUSTOM_UUID3
+        data_array[0] = 66, data_array[1] = 12;
+    }
+    (*env)->SetByteArrayRegion(env, jni_byte_Data, 0, 2, data_array);
+    return jni_byte_Data;
+
+}
+
 bool CALEIsBondedDevice(JNIEnv *env, jobject bluetoothDevice)
 {
     VERIFY_NON_NULL_RET(env, TAG, "env is null", false);
index fef040f..1a5013a 100644 (file)
@@ -43,6 +43,9 @@ extern "C"
 
 /* Service UUID */
 static const char OIC_GATT_SERVICE_UUID[] = CA_GATT_SERVICE_UUID;
+static const char OIC_GATT_CUSTOM_UUID[] = CA_GATT_CUSTOM_UUID;
+static const char OIC_GATT_CUSTOM_UUID2[] = CA_GATT_CUSTOM_UUID2;
+static const char OIC_GATT_CUSTOM_UUID3[] = CA_GATT_CUSTOM_UUID3;
 static const char OIC_GATT_CHARACTERISTIC_REQUEST_UUID[] = CA_GATT_REQUEST_CHRC_UUID;
 static const char OIC_GATT_CHARACTERISTIC_RESPONSE_UUID[] = CA_GATT_RESPONSE_CHRC_UUID;
 static const char OIC_GATT_CHARACTERISTIC_CONFIG_UUID[] = "00002902-0000-1000-8000-00805f9b34fb";
@@ -104,6 +107,14 @@ jobject CALEGetParcelUuid(JNIEnv *env, jobject uuid);
 jobject CALEGetParcelUuidFromString(JNIEnv *env, const char* uuid);
 
 /**
+ * get manufactererData jbyteArray from uuid string value.
+ * @param[in]   env              JNI interface pointer.
+ * @param[in]   uuid             uuid (const char*).
+ * @return  manufactererData jbyteArray.
+ */
+jbyteArray CALEGetManufacturerData(JNIEnv *env, const char* uuid);
+
+/**
  * get address from a local device.
  * @param[in]   env              JNI interface pointer.
  * @return  local address.