5 #include "caedrinterface.h"
6 #include "caedrutils.h"
7 #include "caedrclient.h"
8 #include "caleserver.h"
10 #include "oic_malloc.h"
11 #include "uthreadpool.h" /* for thread pool */
13 #include "caadapterutils.h"
14 #include "com_iotivity_jar_CAEDRInterface.h"
17 #define TAG PCF("CA_EDR_CLIENT")
19 static const char *METHODID_OBJECTNONPARAM = "()Landroid/bluetooth/BluetoothAdapter;";
20 static const char *METHODID_STRINGNONPARAM = "()Ljava/lang/String;";
21 static const char *CLASSPATH_BT_ADPATER = "android/bluetooth/BluetoothAdapter";
22 static const char *CLASSPATH_BT_UUID = "java/util/UUID";
24 static const uint32_t STATE_CONNECTED = 1;
25 static const uint32_t STATE_DISCONNECTED = 0;
27 static u_thread_pool_t gThreadPoolHandle = NULL;
30 static jobject gContext;
32 // server socket instance
33 static jobject gServerSocketObject = NULL;
36 * @var gMutexUnicastServer
37 * @brief Mutex to synchronize unicast server
39 static u_mutex gMutexUnicastServer = NULL;
43 * @brief Flag to control the Receive Unicast Data Thread
45 static bool gStopUnicast = FALSE;
48 * @var gMutexMulticastServer
49 * @brief Mutex to synchronize secure multicast server
51 static u_mutex gMutexMulticastServer = NULL;
55 * @brief Flag to control the Receive Multicast Data Thread
57 static bool gStopMulticast = FALSE;
61 * @brief Flag to control the Accept Thread
63 static bool gStopAccept = FALSE;
65 typedef struct send_data {
72 @brief Thread context information for unicast, multicast and secured unicast server
77 CAAdapterServerType_t type;
78 } CAAdapterReceiveThreadContext_t;
83 } CAAdapterAcceptThreadContext_t;
86 * implement for BT-EDR adapter common method
88 CAResult_t CAEDRGetInterfaceInformation(CALocalConnectivity_t **info)
90 OIC_LOG_V(DEBUG, TAG, "IN - CAEDRGetInterfaceInformation");
92 CALocalConnectivity_t *netInfo = NULL;
94 int32_t netInfoSize = 1;
96 netInfo = (CALocalConnectivity_t *) OICMalloc(sizeof(CALocalConnectivity_t) * netInfoSize);
99 OIC_LOG_V(ERROR, TAG, "Invalid input..");
100 return CA_MEMORY_ALLOC_FAILED;
102 memset(netInfo, 0, sizeof(CALocalConnectivity_t) * netInfoSize);
104 char *macAddress = NULL;
105 CAResult_t ret = CAEDRGetInterfaceInfo(&macAddress);
106 OIC_LOG_V(ERROR, TAG, "address : %s", macAddress);
107 if (CA_STATUS_OK != ret || NULL == macAddress)
109 OIC_LOG_V(ERROR, TAG, "Failed to get interface info [%d]", ret);
116 // Create local endpoint using util function
117 CALocalConnectivity_t *endpoint = CAAdapterCreateLocalEndpoint(CA_EDR, macAddress);
118 if (NULL == endpoint)
120 OIC_LOG_V(ERROR, TAG, "Failed to create Local Endpoint!",
121 CA_MEMORY_ALLOC_FAILED);
124 return CA_MEMORY_ALLOC_FAILED;
127 // copy unicast server information
128 endpoint->isSecured = CA_FALSE;
129 memcpy(&netInfo[0], endpoint, sizeof(CALocalConnectivity_t));
133 CAAdapterFreeLocalEndpoint(endpoint);
135 OIC_LOG_V(DEBUG, TAG, "OUT - CAEDRGetInterfaceInformation");
139 void CAEDRTerminateClient()
141 OIC_LOG(DEBUG, TAG, "IN");
143 OIC_LOG(DEBUG, TAG, "OUT");
146 CAResult_t CAEDRManagerReadData(void)
148 OIC_LOG_V(DEBUG, TAG, "IN");
149 OIC_LOG_V(DEBUG, TAG, "OUT");
150 return CA_NOT_SUPPORTED;
153 CAResult_t CAEDRClientSendUnicastData(const char *remoteAddress, const char *serviceUUID,
154 void *data, uint32_t dataLength, uint32_t *sentLength)
156 OIC_LOG_V(DEBUG, TAG, "IN");
157 CAEDRSendUnicastMessage(remoteAddress, (const char*) data, dataLength);
158 OIC_LOG_V(DEBUG, TAG, "OUT");
163 CAResult_t CAEDRClientSendMulticastData(const char *serviceUUID, void *data,
164 uint32_t dataLength, uint32_t *sentLength)
166 OIC_LOG_V(DEBUG, TAG, "IN");
167 CAEDRSendMulticastMessage((const char*) data, dataLength);
168 OIC_LOG_V(DEBUG, TAG, "OUT");
172 void CAEDRClientUnsetCallbacks(void)
174 OIC_LOG_V(DEBUG, TAG, "IN");
176 OIC_LOG_V(DEBUG, TAG, "OUT");
179 void CAEDRClientDisconnectAll(void)
181 OIC_LOG_V(DEBUG, TAG, "IN");
183 OIC_LOG_V(DEBUG, TAG, "OUT");
186 CAResult_t CAEDRGetAdapterEnableState(CABool_t *state)
188 OIC_LOG_V(DEBUG, TAG, "IN");
190 jboolean isAttached = FALSE;
192 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
195 OIC_LOG_V(DEBUG, TAG, "CAEDRGetAdapterEnableState - Could not get JNIEnv pointer");
196 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
200 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
201 return CA_STATUS_FAILED;
205 jboolean ret = CAEDRNativeIsEnableBTAdapter(env);
216 (*g_jvm)->DetachCurrentThread(g_jvm);
218 OIC_LOG_V(DEBUG, TAG, "OUT");
222 ////////////////////////////////////////////////////////////////////////////////////////////////////
223 //FIXME getting context
225 void CAEDRJniSetContext()
227 OIC_LOG_V(DEBUG, TAG, "CAEDRJniSetContext");
229 gContext = CANativeJNIGetContext();
232 void CAEDRCreateJNIInterfaceObject(jobject context)
235 OIC_LOG_V(DEBUG, TAG, "[EDRCore] CAEDRCreateJNIInterfaceObject");
237 if ((*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6) != JNI_OK)
239 OIC_LOG_V(DEBUG, TAG, "[EDRCore] Could not get JNIEnv pointer");
243 //getApplicationContext
244 jclass contextClass = (*env)->FindClass(env, "android/content/Context");
245 if (contextClass == 0)
247 OIC_LOG_V(DEBUG, TAG, "[EDRCore] Could not get context object class");
251 jmethodID getApplicationContextMethod = (*env)->GetMethodID(env, contextClass,
252 "getApplicationContext", "()Landroid/content/Context;");
253 if (getApplicationContextMethod == 0)
255 OIC_LOG_V(DEBUG, TAG, "[EDRCore] Could not get getApplicationContext method");
259 //Create EDRJniInterface instance
260 jclass EDRJniInterface = (*env)->FindClass(env, "com/iotivity/jar/CAEDRInterface");
261 if (!EDRJniInterface)
263 OIC_LOG_V(DEBUG, TAG, "[EDRCore] Could not get CAEDRInterface class");
267 jmethodID EDRInterfaceConstructorMethod = (*env)->GetMethodID(env,
268 EDRJniInterface, "<init>", "(Landroid/content/Context;)V");
269 if (!EDRInterfaceConstructorMethod)
271 OIC_LOG_V(DEBUG, TAG, "[EDRCore] Could not get CAEDRInterface constructor method");
275 (*env)->NewObject(env, EDRJniInterface, EDRInterfaceConstructorMethod, context);
276 OIC_LOG_V(DEBUG, TAG, "[EDRCore] NewObject Success");
280 static void CAEDRDestroyMutex()
282 OIC_LOG(DEBUG, TAG, "IN");
284 if (gMutexUnicastServer)
286 u_mutex_free(gMutexUnicastServer);
287 gMutexUnicastServer = NULL;
294 if (gMutexMulticastServer)
296 u_mutex_free(gMutexMulticastServer);
297 gMutexMulticastServer = NULL;
300 OIC_LOG(DEBUG, TAG, "OUT");
303 static CAResult_t CAEDRCreateMutex()
305 OIC_LOG(DEBUG, TAG, "IN");
307 gMutexUnicastServer = u_mutex_new();
308 if (!gMutexUnicastServer)
310 OIC_LOG(ERROR, TAG, "Failed to created mutex!");
311 return CA_STATUS_FAILED;
318 gMutexMulticastServer = u_mutex_new();
319 if (!gMutexMulticastServer)
321 OIC_LOG(ERROR, TAG, "Failed to created mutex!");
324 return CA_STATUS_FAILED;
327 OIC_LOG(DEBUG, TAG, "OUT");
331 void CAEDRInitialize(u_thread_pool_t handle)
333 OIC_LOG(DEBUG, TAG, "CAEDRInitialize");
335 gThreadPoolHandle = handle;
339 CAEDRJniSetContext();
344 jboolean isAttached = FALSE;
346 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
349 OIC_LOG_V(DEBUG, TAG, "CAEDRInitialize - Could not get JNIEnv pointer");
350 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
354 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
360 jstring jni_address = CAEDRNativeGetLocalDeviceAddress(env);
363 const char* localAddress = (*env)->GetStringUTFChars(env, jni_address, NULL);
364 OIC_LOG_V(DEBUG, TAG, "My BT Address is %s ", localAddress);
367 CAEDRNativeCreateDeviceStateList();
368 CAEDRNativeCreateDeviceSocketList();
371 (*g_jvm)->DetachCurrentThread(g_jvm);
376 CAEDRCreateJNIInterfaceObject(gContext); /* create java CAEDRInterface instance*/
379 OIC_LOG(DEBUG, TAG, "OUT");
382 void CAEDRTerminate()
384 OIC_LOG(DEBUG, TAG, "CAEDRTerminate");
386 jboolean isAttached = FALSE;
388 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
391 OIC_LOG_V(DEBUG, TAG, "CAEDRTerminate - Could not get JNIEnv pointer");
392 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
396 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
403 gStopMulticast = TRUE;
406 CAEDRNativeSocketCloseToAll(env);
411 CAEDRNativeRemoveAllDeviceState();
412 CAEDRNativeRemoveAllDeviceSocket(env);
415 (*g_jvm)->DetachCurrentThread(g_jvm);
418 void CAEDRCoreJniInit()
420 OIC_LOG_V(DEBUG, TAG, "CAEdrClientJniInit");
421 g_jvm = CANativeJNIGetJavaVM();
424 int32_t CAEDRSendUnicastMessage(const char* address, const char* data, uint32_t dataLen)
426 OIC_LOG_V(DEBUG, TAG, "CAEDRSendUnicastMessage(%s, %s)", address, data);
428 CAEDRSendUnicastMessageImpl(address, data, dataLen);
432 int32_t CAEDRSendMulticastMessage(const char* data, uint32_t dataLen)
434 OIC_LOG_V(DEBUG, TAG, "CAEDRSendMulticastMessage(%s)", data);
436 jboolean isAttached = FALSE;
438 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
441 OIC_LOG_V(DEBUG, TAG, "CAEDRSendMulticastMessage - Could not get JNIEnv pointer");
442 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
446 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
452 CAEDRSendMulticastMessageImpl(env, data, dataLen);
454 OIC_LOG_V(DEBUG, TAG, "sent data");
458 OIC_LOG_V(DEBUG, TAG, "DetachCurrentThread");
459 // (*g_jvm)->DetachCurrentThread(g_jvm);
462 OIC_LOG_V(DEBUG, TAG, "OUT - CAEDRSendMulticastMessage");
466 CAResult_t CAEDRGetInterfaceInfo(char **address)
468 CAEDRGetLocalAddress(address);
472 void CAEDRGetLocalAddress(char** address)
474 jboolean isAttached = FALSE;
476 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
479 OIC_LOG_V(DEBUG, TAG, "CAEDRGetLocalAddress - Could not get JNIEnv pointer");
480 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
483 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
489 jstring jni_address = CAEDRNativeGetLocalDeviceAddress(env);
492 const char* localAddress = (*env)->GetStringUTFChars(env, jni_address, NULL);
493 *address = (char*)OICMalloc(strlen(localAddress) + 1);
494 if (*address == NULL)
498 memcpy(*address, localAddress, strlen(localAddress));
501 OIC_LOG_V(DEBUG, TAG, "Local Address : %s", *address);
503 (*g_jvm)->DetachCurrentThread(g_jvm);
506 int32_t CAEDRSendUnicastMessageImpl(const char* address, const char* data, uint32_t dataLen)
508 OIC_LOG_V(DEBUG, TAG, "CAEDRSendUnicastMessageImpl, address: %s, data: %s", address, data);
510 jboolean isAttached = FALSE;
512 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
515 OIC_LOG_V(DEBUG, TAG, "CAEDRSendUnicastMessageImpl - Could not get JNIEnv pointer");
516 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
519 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
525 OIC_LOG(DEBUG, TAG, "[EDR][Native] set byteArray for data");
527 // get bonded device list
528 jobjectArray jni_arrayPairedDevices = CAEDRNativeGetBondedDevices(env);
529 if(!jni_arrayPairedDevices)
531 OIC_LOG_V(DEBUG, TAG, "[EDR][Native] jni_arrayPairedDevices is empty");
534 // Get information from array of devices
535 jsize length = (*env)->GetArrayLength(env, jni_arrayPairedDevices);
537 for( i = 0 ; i < length ; i++ )
539 OIC_LOG_V(DEBUG, TAG, "[EDR][Native] start to check device");
540 // get name, address from BT device
541 jobject j_obj_device = (*env)->GetObjectArrayElement(env, jni_arrayPairedDevices, i);
543 jclass jni_cid_BTDevice = (*env)->FindClass(env, "android/bluetooth/BluetoothDevice");
544 jmethodID j_mid_getName = (*env)->GetMethodID(env, jni_cid_BTDevice, "getName", "()Ljava/lang/String;");
545 jmethodID j_mid_getAddress = (*env)->GetMethodID(env, jni_cid_BTDevice, "getAddress", "()Ljava/lang/String;");
547 jstring j_str_name = (*env)->CallObjectMethod(env, j_obj_device, j_mid_getName);
551 const char * name = (*env)->GetStringUTFChars(env, j_str_name, NULL);
552 OIC_LOG_V(DEBUG, TAG, "[EDR][Native] getBondedDevices: ~~device name is %s", name);
553 (*env)->ReleaseStringUTFChars(env, j_str_name, name);
556 jstring j_str_address = (*env)->CallObjectMethod(env, j_obj_device, j_mid_getAddress);
557 const char * remoteAddress = (*env)->GetStringUTFChars(env, j_str_address, NULL);
558 OIC_LOG_V(DEBUG, TAG, "[EDR][Native] getBondedDevices: ~~device address is %s", remoteAddress);
561 if(!strcmp(remoteAddress, address))
563 CAEDRNativeSendData(env, remoteAddress, data, dataLen, i);
568 (*g_jvm)->DetachCurrentThread(g_jvm);
573 int32_t CAEDRSendMulticastMessageImpl(JNIEnv *env, const char* data, uint32_t dataLen)
575 OIC_LOG_V(DEBUG, TAG, "CASendMulticastMessageImpl, send to, data: %s, %d", data, dataLen);
577 // get bonded device list
578 jobjectArray jni_arrayPairedDevices = CAEDRNativeGetBondedDevices(env);
579 if(!jni_arrayPairedDevices)
581 OIC_LOG_V(DEBUG, TAG, "[EDR][Native] jni_arrayPairedDevices is empty");
584 // Get information from array of devices
585 jsize length = (*env)->GetArrayLength(env, jni_arrayPairedDevices);
587 for( i = 0 ; i < length ; i++ )
589 // get name, address from BT device
590 jobject j_obj_device = (*env)->GetObjectArrayElement(env, jni_arrayPairedDevices, i);
592 jclass jni_cid_BTDevice = (*env)->FindClass(env, "android/bluetooth/BluetoothDevice");
593 jmethodID j_mid_getName = (*env)->GetMethodID(env, jni_cid_BTDevice, "getName", "()Ljava/lang/String;");
594 jmethodID j_mid_getAddress = (*env)->GetMethodID(env, jni_cid_BTDevice, "getAddress", "()Ljava/lang/String;");
596 jstring j_str_name = (*env)->CallObjectMethod(env, j_obj_device, j_mid_getName);
600 const char * name = (*env)->GetStringUTFChars(env, j_str_name, NULL);
601 OIC_LOG_V(DEBUG, TAG, "[EDR][Native] getBondedDevices: ~~device name is %s", name);
602 (*env)->ReleaseStringUTFChars(env, j_str_name, name);
605 jstring j_str_address = (*env)->CallObjectMethod(env, j_obj_device, j_mid_getAddress);
606 const char * remoteAddress = (*env)->GetStringUTFChars(env, j_str_address, NULL);
607 OIC_LOG_V(DEBUG, TAG, "[EDR][Native] getBondedDevices: ~~device address is %s", remoteAddress);
610 CAEDRNativeSendData(env, remoteAddress, data, dataLen, i);
619 void CAEDRNativeSendData(JNIEnv *env, const char* address, const char* data, uint32_t dataLength, uint32_t id)
621 OIC_LOG_V(DEBUG, TAG, "[EDR][Native] btSendData logic start : %s, %d", data, dataLength);
623 if(!CAEDRNativeIsEnableBTAdapter(env))
625 OIC_LOG(DEBUG, TAG, "BT adpater is not enable");
629 if(STATE_DISCONNECTED == CAEDRIsConnectedDevice(address))
631 // connect before send data
632 OIC_LOG(DEBUG, TAG, "[EDR][Native] connect before send data");
636 OIC_LOG(DEBUG, TAG, "[EDR][Native] remote address is empty");
641 CAEDRNativeConnect(env, address, id);
645 if(STATE_CONNECTED == CAEDRIsConnectedDevice(address))
647 if(!((*env)->ExceptionCheck(env)))
649 jclass jni_cid_BTsocket = (*env)->FindClass(env, "android/bluetooth/BluetoothSocket");
650 if(!jni_cid_BTsocket)
652 OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: jni_cid_BTsocket is null");
656 jmethodID jni_mid_getOutputStream = (*env)->GetMethodID(env, jni_cid_BTsocket, "getOutputStream", "()Ljava/io/OutputStream;");
657 if(!jni_mid_getOutputStream)
659 OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: jni_mid_getOutputStream is null");
662 OIC_LOG_V(DEBUG, TAG, "[EDR][Native] btSendData: Get MethodID for i/o stream..%d", id);
664 jobject jni_obj_socket = CAEDRNativeGetDeviceSocket(id);
667 OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: jni_socket is not available");
671 jobject jni_obj_outputStream = (*env)->CallObjectMethod(env, jni_obj_socket, jni_mid_getOutputStream);
672 if(!jni_obj_outputStream)
674 OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: jni_obj_outputStream is null");
678 OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: ready outputStream..");
680 jclass jni_cid_OutputStream = (*env)->FindClass(env, "java/io/OutputStream");
681 if(!jni_cid_OutputStream)
683 OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: jni_cid_OutputStream is null");
687 jmethodID jni_mid_write = (*env)->GetMethodID(env, jni_cid_OutputStream, "write", "([BII)V");
690 OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: jni_mid_write is null");
695 jbuf = (*env)->NewByteArray(env, dataLength);
696 (*env)->SetByteArrayRegion(env, jbuf, 0, dataLength, (jbyte*)data);
698 (*env)->CallVoidMethod(env, jni_obj_outputStream, jni_mid_write, jbuf, (jint)0, (jint)dataLength);
700 if((*env)->ExceptionCheck(env))
702 OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: Write Error!!!");
703 (*env)->ExceptionDescribe(env);
704 (*env)->ExceptionClear(env);
708 OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: Write Success");
712 (*env)->ExceptionDescribe(env);
713 (*env)->ExceptionClear(env);
714 OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: error!!");
720 OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: BT connection is not completed!!");
724 void CAEDRNativeConnect(JNIEnv *env, const char* address, uint32_t id)
726 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect..");
728 if(!CAEDRNativeIsEnableBTAdapter(env))
730 OIC_LOG(DEBUG, TAG, "BT adpater is not enable");
734 jclass jni_cid_BTAdapter = (*env)->FindClass(env, CLASSPATH_BT_ADPATER);
735 if(!jni_cid_BTAdapter)
737 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_cid_BTAdapter is null");
742 jmethodID jni_mid_getDefaultAdapter = (*env)->GetStaticMethodID(env, jni_cid_BTAdapter, "getDefaultAdapter", METHODID_OBJECTNONPARAM);
743 if(!jni_mid_getDefaultAdapter)
745 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_mid_getDefaultAdapter is null");
749 jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter, jni_mid_getDefaultAdapter);
750 if(!jni_obj_BTAdapter)
752 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_obj_BTAdapter is null");
756 // get remote bluetooth device
757 jmethodID jni_mid_getRemoteDevice = (*env)->GetMethodID(env, jni_cid_BTAdapter, "getRemoteDevice",
758 "(Ljava/lang/String;)Landroid/bluetooth/BluetoothDevice;");
759 if(!jni_mid_getRemoteDevice)
761 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_mid_getRemoteDevice is null");
765 //jstring jni_address = (*env)->NewStringUTF(env, "B8:5E:7B:54:52:1C");
766 jstring jni_address = (*env)->NewStringUTF(env, address);
767 jobject jni_obj_remoteBTDevice = (*env)->CallObjectMethod(env, jni_obj_BTAdapter, jni_mid_getRemoteDevice, jni_address);
768 if(!jni_obj_remoteBTDevice)
770 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_obj_remoteBTDevice is null");
774 // get create Rfcomm Socket method ID
775 jclass jni_cid_BluetoothDevice = (*env)->FindClass(env, "android/bluetooth/BluetoothDevice");
776 if(!jni_cid_BluetoothDevice)
778 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_cid_BluetoothDevice is null");
782 jmethodID jni_mid_createSocket = (*env)->GetMethodID(env, jni_cid_BluetoothDevice,
783 "createInsecureRfcommSocketToServiceRecord","(Ljava/util/UUID;)Landroid/bluetooth/BluetoothSocket;");
784 if(!jni_mid_createSocket) {
785 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_mid_createSocket is null");
789 // createInsecureRfcommSocketToServiceRecord / createRfcommSocketToServiceRecord
791 jclass jni_cid_uuid = (*env)->FindClass(env, CLASSPATH_BT_UUID);
794 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_cid_uuid is null");
798 jmethodID jni_mid_fromString = (*env)->GetStaticMethodID(env, jni_cid_uuid, "fromString",
799 "(Ljava/lang/String;)Ljava/util/UUID;");
800 if(!jni_mid_fromString)
802 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_mid_fromString is null");
806 jstring jni_uuid = (*env)->NewStringUTF(env, "00000000-0000-0000-0000-0000cdab0000");
807 jobject jni_obj_uuid = (*env)->CallStaticObjectMethod(env, jni_cid_uuid, jni_mid_fromString, jni_uuid);
810 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_obj_uuid is null");
814 jobject jni_obj_BTSocket = (*env)->CallObjectMethod(env, jni_obj_remoteBTDevice, jni_mid_createSocket, jni_obj_uuid);
815 if(!jni_obj_BTSocket)
817 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_obj_BTSocket is null");
822 jclass jni_cid_BTSocket = (*env)->FindClass(env, "android/bluetooth/BluetoothSocket");
823 if(!jni_cid_BTSocket)
825 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_cid_BTSocket is null");
829 jmethodID jni_mid_connect = (*env)->GetMethodID(env, jni_cid_BTSocket, "connect", "()V");
832 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_mid_connect is null");
836 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: initiating connection...");
837 (*env)->CallVoidMethod(env, jni_obj_BTSocket, jni_mid_connect);
839 if((*env)->ExceptionCheck(env))
841 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: Connect is Failed!!!");
842 (*env)->ExceptionDescribe(env);
843 (*env)->ExceptionClear(env);
847 // set socket to list
848 jobject jni_socket = (*env)->NewGlobalRef(env, jni_obj_BTSocket);
849 CAEDRNativeAddDeviceSocketToList(env, jni_socket);
852 CAEDRUpdateDeviceState(STATE_CONNECTED, address);
854 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: connected");
857 void CAEDRNativeSocketClose(JNIEnv *env, const char* address, uint32_t id)
860 jclass jni_cid_BTSocket = (*env)->FindClass(env, "android/bluetooth/BluetoothSocket");
861 if(!jni_cid_BTSocket)
863 OIC_LOG(DEBUG, TAG, "[EDR][Native] close: jni_cid_BTSocket is null");
867 jmethodID jni_mid_close = (*env)->GetMethodID(env, jni_cid_BTSocket, "close", "()V");
870 OIC_LOG(DEBUG, TAG, "[EDR][Native] close: jni_mid_close is null");
874 jobject jni_obj_socket = CAEDRNativeGetDeviceSocket(id);
877 OIC_LOG(DEBUG, TAG, "[EDR][Native] close: jni_obj_socket is not available");
881 (*env)->CallVoidMethod(env, jni_obj_socket, jni_mid_close);
883 if((*env)->ExceptionCheck(env))
885 OIC_LOG(DEBUG, TAG, "[EDR][Native] close: close is Failed!!!");
886 (*env)->ExceptionDescribe(env);
887 (*env)->ExceptionClear(env);
891 // remove socket to list
892 CAEDRNativeRemoveDeviceSocket(env, jni_obj_socket);
895 CAEDRUpdateDeviceState(STATE_DISCONNECTED, address);
897 OIC_LOG(DEBUG, TAG, "[EDR][Native] close: disconnected");
900 void CAEDRInitializeClient(u_thread_pool_t handle)
902 OIC_LOG(DEBUG, TAG, "IN");
903 CAEDRInitialize(handle);
904 OIC_LOG(DEBUG, TAG, "OUT");