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 "uarraylist.h"
14 #include "caadapterutils.h"
15 #include "com_iotivity_jar_CALeInterface.h"
18 #define TAG PCF("CA_EDR_CLIENT")
20 static const char *METHODID_OBJECTNONPARAM = "()Landroid/bluetooth/BluetoothAdapter;";
21 static const char *METHODID_STRINGNONPARAM = "()Ljava/lang/String;";
22 static const char *CLASSPATH_BT_ADPATER = "android/bluetooth/BluetoothAdapter";
23 static const char *CLASSPATH_BT_UUID = "java/util/UUID";
25 static const uint32_t STATE_CONNECTED = 1;
26 static const uint32_t STATE_DISCONNECTED = 0;
28 static const uint32_t MAX_PDU_BUFFER = 1024;
30 static u_arraylist_t *gdeviceStateList = NULL;
31 static u_arraylist_t *gdeviceObjectList = NULL;
33 static u_thread_pool_t gThreadPoolHandle = NULL;
36 static jobject gContext;
38 static jbyteArray gSendBuffer;
41 * @var gMutexSocketListManager
42 * @brief Mutex to synchronize socket list update
44 static u_mutex gMutexSocketListManager;
46 // server socket instance
47 static jobject gServerSocketObject = NULL;
50 * @var gMutexUnicastServer
51 * @brief Mutex to synchronize unicast server
53 static u_mutex gMutexUnicastServer = NULL;
57 * @brief Flag to control the Receive Unicast Data Thread
59 static bool gStopUnicast = FALSE;
62 * @var gMutexMulticastServer
63 * @brief Mutex to synchronize secure multicast server
65 static u_mutex gMutexMulticastServer = NULL;
69 * @brief Flag to control the Receive Multicast Data Thread
71 static bool gStopMulticast = FALSE;
75 * @brief Flag to control the Accept Thread
77 static bool gStopAccept = FALSE;
79 typedef struct send_data {
86 @brief Thread context information for unicast, multicast and secured unicast server
91 CAAdapterServerType_t type;
92 } CAAdapterReceiveThreadContext_t;
97 } CAAdapterAcceptThreadContext_t;
101 CAResult_t CAEDRGetInterfaceInformation(CALocalConnectivity_t **info)
103 OIC_LOG_V(DEBUG, TAG, "IN");
105 OIC_LOG_V(DEBUG, TAG, "OUT");
109 void CAEDRTerminateClient()
111 OIC_LOG(DEBUG, TAG, "IN");
113 OIC_LOG(DEBUG, TAG, "OUT");
116 CAResult_t CAEDRManagerReadData(void)
118 OIC_LOG_V(DEBUG, TAG, "IN");
119 OIC_LOG_V(DEBUG, TAG, "OUT");
120 return CA_NOT_SUPPORTED;
123 CAResult_t CAEDRClientSendUnicastData(const char *remoteAddress, const char *serviceUUID,
124 void *data, uint32_t dataLength, uint32_t *sentLength)
126 OIC_LOG_V(DEBUG, TAG, "IN");
127 CAEDRSendUnicastMessage(remoteAddress, (const char*) data, dataLength);
128 OIC_LOG_V(DEBUG, TAG, "OUT");
133 CAResult_t CAEDRClientSendMulticastData(const char *serviceUUID, void *data,
134 uint32_t dataLength, uint32_t *sentLength)
136 OIC_LOG_V(DEBUG, TAG, "IN");
137 CAEDRSendMulticastMessage((const char*) data, dataLength);
138 OIC_LOG_V(DEBUG, TAG, "OUT");
142 void CAEDRClientUnsetCallbacks(void)
144 OIC_LOG_V(DEBUG, TAG, "IN");
146 OIC_LOG_V(DEBUG, TAG, "OUT");
149 void CAEDRClientDisconnectAll(void)
151 OIC_LOG_V(DEBUG, TAG, "IN");
153 OIC_LOG_V(DEBUG, TAG, "OUT");
156 CAResult_t CAEDRGetAdapterEnableState(CABool_t *state)
158 OIC_LOG_V(DEBUG, TAG, "IN");
160 jboolean isAttached = FALSE;
162 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
165 OIC_LOG_V(DEBUG, TAG, "CAEDRGetAdapterEnableState - Could not get JNIEnv pointer");
166 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
170 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
175 jboolean ret = CAEDRNativeIsEnableBTAdapter(env);
186 (*g_jvm)->DetachCurrentThread(g_jvm);
188 OIC_LOG_V(DEBUG, TAG, "OUT");
192 ////////////////////////////////////////////////////////////////////////////////////////////////////
193 //FIXME getting context
195 void CAEDRJniSetContext(jobject context)
197 OIC_LOG_V(DEBUG, TAG, "caedrSetObject");
199 jboolean isAttached = FALSE;
201 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
204 OIC_LOG_V(DEBUG, TAG, "CAEDRInitialize - Could not get JNIEnv pointer");
205 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
209 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
215 gContext = (*env)->NewGlobalRef(env, context);
218 (*g_jvm)->DetachCurrentThread(g_jvm);
221 void CAEDRCreateJNIInterfaceObject(jobject context)
224 OIC_LOG_V(DEBUG, TAG, "[EDRCore] CAEDRCreateJNIInterfaceObject");
226 if ((*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6) != JNI_OK)
228 OIC_LOG_V(DEBUG, TAG, "[EDRCore] Could not get JNIEnv pointer");
232 //getApplicationContext
233 jclass contextClass = (*env)->FindClass(env, "android/content/Context");
234 if (contextClass == 0)
236 OIC_LOG_V(DEBUG, TAG, "[EDRCore] Could not get context object class");
240 jmethodID getApplicationContextMethod = (*env)->GetMethodID(env, contextClass,
241 "getApplicationContext", "()Landroid/content/Context;");
242 if (getApplicationContextMethod == 0)
244 OIC_LOG_V(DEBUG, TAG, "[EDRCore] Could not get getApplicationContext method");
248 jobject gApplicationContext = (*env)->CallObjectMethod(env, context, getApplicationContextMethod);
249 OIC_LOG_V(DEBUG, TAG, "[WIFICore] Saving Android application context object %p", gApplicationContext);
251 //Create WiFiInterface instance
252 jclass WiFiJniInterface = (*env)->FindClass(env, "com/iotivity/jar/CAEDRInterface");
253 if (!WiFiJniInterface)
255 OIC_LOG_V(DEBUG, TAG, "[EDRCore] Could not get CAWiFiInterface class");
259 jmethodID WiFiInterfaceConstructorMethod = (*env)->GetMethodID(env,
260 WiFiJniInterface, "<init>", "(Landroid/content/Context;)V");
261 if (!WiFiInterfaceConstructorMethod)
263 OIC_LOG_V(DEBUG, TAG, "[EDRCore] Could not get CAWiFiInterface constructor method");
267 (*env)->NewObject(env, WiFiJniInterface, WiFiInterfaceConstructorMethod, gApplicationContext);
268 OIC_LOG_V(DEBUG, TAG, "[EDRCore] Create CAWiFiInterface instance");
269 OIC_LOG_V(DEBUG, TAG, "[EDRCore] NewObject Success");
273 static void CAEDRDestroyMutex()
275 OIC_LOG(DEBUG, TAG, "IN");
277 if (gMutexUnicastServer)
279 u_mutex_free(gMutexUnicastServer);
280 gMutexUnicastServer = NULL;
287 if (gMutexMulticastServer)
289 u_mutex_free(gMutexMulticastServer);
290 gMutexMulticastServer = NULL;
293 if(gMutexSocketListManager)
295 u_mutex_free(gMutexSocketListManager);
296 gMutexSocketListManager = NULL;
299 OIC_LOG(DEBUG, TAG, "OUT");
302 static CAResult_t CAEDRCreateMutex()
304 OIC_LOG(DEBUG, TAG, "IN");
306 gMutexUnicastServer = u_mutex_new();
307 if (!gMutexUnicastServer)
309 OIC_LOG(ERROR, TAG, "Failed to created mutex!");
310 return CA_STATUS_FAILED;
317 gMutexMulticastServer = u_mutex_new();
318 if (!gMutexMulticastServer)
320 OIC_LOG(ERROR, TAG, "Failed to created mutex!");
323 return CA_STATUS_FAILED;
326 gMutexSocketListManager = u_mutex_new();
327 if (!gMutexSocketListManager)
329 OIC_LOG(ERROR, TAG, "Failed to created mutex!");
332 return CA_STATUS_FAILED;
335 OIC_LOG(DEBUG, TAG, "OUT");
339 void CAEDRInitialize(u_thread_pool_t handle)
341 OIC_LOG(DEBUG, TAG, "CAEDRInitialize");
343 gThreadPoolHandle = handle;
348 jboolean isAttached = FALSE;
350 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
353 OIC_LOG_V(DEBUG, TAG, "CAEDRInitialize - Could not get JNIEnv pointer");
354 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
358 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
364 jstring jni_address = CAEDRNativeGetLocalDeviceAddress(env);
367 const char* localAddress = (*env)->GetStringUTFChars(env, jni_address, NULL);
368 OIC_LOG_V(DEBUG, TAG, "My BT Address is %s", localAddress);
371 CAEDRNativeCreateDeviceStateList();
372 CAEDRNativeCreateDeviceSocketList();
375 (*g_jvm)->DetachCurrentThread(g_jvm);
377 // 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;
407 (*g_jvm)->DetachCurrentThread(g_jvm);
412 CAEDRNativeRemoveAllDeviceState();
413 CAEDRNativeRemoveAllDeviceSocket(env);
416 void CAEDRCoreJniInit(JNIEnv *env, JavaVM* jvm)
418 OIC_LOG_V(DEBUG, TAG, "CAEdrClientJniInit");
421 CAEDRServerJniInit(env, jvm);
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");
528 (*env)->DeleteGlobalRef(env, gSendBuffer);
530 jbyteArray jni_arr = (*env)->NewByteArray(env, dataLen);
531 (*env)->SetByteArrayRegion(env, jni_arr, 0, dataLen, (jbyte*)data);
532 gSendBuffer = (jbyteArray)(*env)->NewGlobalRef(env, jni_arr);
534 // get bonded device list
535 jobjectArray jni_arrayPairedDevices = CAEDRNativeGetBondedDevices(env);
536 if(!jni_arrayPairedDevices)
538 OIC_LOG_V(DEBUG, TAG, "[EDR][Native] jni_arrayPairedDevices is empty");
541 // Get information from array of devices
542 jsize length = (*env)->GetArrayLength(env, jni_arrayPairedDevices);
544 for( i = 0 ; i < length ; i++ )
546 OIC_LOG_V(DEBUG, TAG, "[EDR][Native] start to check device");
547 // get name, address from BT device
548 jobject j_obj_device = (*env)->GetObjectArrayElement(env, jni_arrayPairedDevices, i);
550 jclass jni_cid_BTDevice = (*env)->FindClass(env, "android/bluetooth/BluetoothDevice");
551 jmethodID j_mid_getName = (*env)->GetMethodID(env, jni_cid_BTDevice, "getName", "()Ljava/lang/String;");
552 jmethodID j_mid_getAddress = (*env)->GetMethodID(env, jni_cid_BTDevice, "getAddress", "()Ljava/lang/String;");
554 jstring j_str_name = (*env)->CallObjectMethod(env, j_obj_device, j_mid_getName);
558 const char * name = (*env)->GetStringUTFChars(env, j_str_name, NULL);
559 OIC_LOG_V(DEBUG, TAG, "[EDR][Native] getBondedDevices: ~~device name is %s", name);
560 (*env)->ReleaseStringUTFChars(env, j_str_name, name);
563 jstring j_str_address = (*env)->CallObjectMethod(env, j_obj_device, j_mid_getAddress);
564 const char * remoteAddress = (*env)->GetStringUTFChars(env, j_str_address, NULL);
565 OIC_LOG_V(DEBUG, TAG, "[EDR][Native] getBondedDevices: ~~device address is %s", remoteAddress);
568 if(!strcmp(remoteAddress, address))
570 CAEDRNativeSendData(env, remoteAddress, data, i);
575 (*g_jvm)->DetachCurrentThread(g_jvm);
580 int32_t CAEDRSendMulticastMessageImpl(JNIEnv *env, const char* data, uint32_t dataLen)
582 OIC_LOG_V(DEBUG, TAG, "CASendMulticastMessageImpl, send to, data: %s, %d", data, dataLen);
584 // get bonded device list
585 jobjectArray jni_arrayPairedDevices = CAEDRNativeGetBondedDevices(env);
586 if(!jni_arrayPairedDevices)
588 OIC_LOG_V(DEBUG, TAG, "[EDR][Native] jni_arrayPairedDevices is empty");
591 // Get information from array of devices
592 jsize length = (*env)->GetArrayLength(env, jni_arrayPairedDevices);
594 for( i = 0 ; i < length ; i++ )
596 // get name, address from BT device
597 jobject j_obj_device = (*env)->GetObjectArrayElement(env, jni_arrayPairedDevices, i);
599 jclass jni_cid_BTDevice = (*env)->FindClass(env, "android/bluetooth/BluetoothDevice");
600 jmethodID j_mid_getName = (*env)->GetMethodID(env, jni_cid_BTDevice, "getName", "()Ljava/lang/String;");
601 jmethodID j_mid_getAddress = (*env)->GetMethodID(env, jni_cid_BTDevice, "getAddress", "()Ljava/lang/String;");
603 jstring j_str_name = (*env)->CallObjectMethod(env, j_obj_device, j_mid_getName);
607 const char * name = (*env)->GetStringUTFChars(env, j_str_name, NULL);
608 OIC_LOG_V(DEBUG, TAG, "[EDR][Native] getBondedDevices: ~~device name is %s", name);
609 (*env)->ReleaseStringUTFChars(env, j_str_name, name);
612 jstring j_str_address = (*env)->CallObjectMethod(env, j_obj_device, j_mid_getAddress);
613 const char * remoteAddress = (*env)->GetStringUTFChars(env, j_str_address, NULL);
614 OIC_LOG_V(DEBUG, TAG, "[EDR][Native] getBondedDevices: ~~device address is %s", remoteAddress);
617 CAEDRNativeSendData(env, remoteAddress, data, i);
626 void CAEDRNativeSendData(JNIEnv *env, const char* address, const char* data, uint32_t id)
628 OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData logic start");
630 if(STATE_DISCONNECTED == CAEDRIsConnectedDevice(address))
632 // connect before send data
633 OIC_LOG(DEBUG, TAG, "[EDR][Native] connect before send data");
637 OIC_LOG(DEBUG, TAG, "[EDR][Native] remote address is empty");
642 CAEDRNativeConnect(env, address, id);
646 if(STATE_CONNECTED == CAEDRIsConnectedDevice(address))
648 if(!((*env)->ExceptionCheck(env)))
650 jclass jni_cid_BTsocket = (*env)->FindClass(env, "android/bluetooth/BluetoothSocket");
651 if(!jni_cid_BTsocket)
653 OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: jni_cid_BTsocket is null");
657 jmethodID jni_mid_getOutputStream = (*env)->GetMethodID(env, jni_cid_BTsocket, "getOutputStream", "()Ljava/io/OutputStream;");
658 if(!jni_mid_getOutputStream)
660 OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: jni_mid_getOutputStream is null");
663 OIC_LOG_V(DEBUG, TAG, "[EDR][Native] btSendData: Get MethodID for i/o stream..%d", id);
665 jobject jni_obj_socket = CAEDRNativeGetDeviceSocket(id);
668 OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: jni_socket is not available");
672 jobject jni_obj_outputStream = (*env)->CallObjectMethod(env, jni_obj_socket, jni_mid_getOutputStream);
673 if(!jni_obj_outputStream)
675 OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: jni_obj_outputStream is null");
679 OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: ready outputStream..");
681 jclass jni_cid_OutputStream = (*env)->FindClass(env, "java/io/OutputStream");
682 if(!jni_cid_OutputStream)
684 OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: jni_cid_OutputStream is null");
688 jmethodID jni_mid_write = (*env)->GetMethodID(env, jni_cid_OutputStream, "write", "([BII)V");
691 OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: jni_mid_write is null");
695 // const char* tmpData = "HelloWorldHelloWorld..";
696 // size_t nread = 20;
697 // jbyteArray jni_arr = (*env)->NewByteArray(env, nread);
698 // (*env)->SetByteArrayRegion(env, jni_arr, 0, nread, (jbyte*)tmpData);
701 int length = strlen(data);
702 jbuf = (*env)->NewByteArray(env, length);
703 (*env)->SetByteArrayRegion(env, jbuf, 0, length, (jbyte*)data);
705 (*env)->CallVoidMethod(env, jni_obj_outputStream, jni_mid_write, jbuf, (jint)0, (jint)length);
707 if((*env)->ExceptionCheck(env))
709 OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: Write Error!!!");
710 (*env)->ExceptionDescribe(env);
711 (*env)->ExceptionClear(env);
715 OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: Write Success");
717 // remove socket to list
718 CAEDRNativeRemoveDeviceSocket(env, jni_obj_socket);
721 CAEDRUpdateDeviceState(STATE_DISCONNECTED, address);
725 (*env)->ExceptionDescribe(env);
726 (*env)->ExceptionClear(env);
727 OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: error!!");
733 OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: BT connection is not completed!!");
737 void CAEDRNativeConnect(JNIEnv *env, const char* address, uint32_t id)
739 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect..");
741 jclass jni_cid_BTAdapter = (*env)->FindClass(env, CLASSPATH_BT_ADPATER);
742 if(!jni_cid_BTAdapter)
744 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_cid_BTAdapter is null");
749 jmethodID jni_mid_getDefaultAdapter = (*env)->GetStaticMethodID(env, jni_cid_BTAdapter, "getDefaultAdapter", METHODID_OBJECTNONPARAM);
750 if(!jni_mid_getDefaultAdapter)
752 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_mid_getDefaultAdapter is null");
756 jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter, jni_mid_getDefaultAdapter);
757 if(!jni_obj_BTAdapter)
759 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_obj_BTAdapter is null");
763 // get remote bluetooth device
764 jmethodID jni_mid_getRemoteDevice = (*env)->GetMethodID(env, jni_cid_BTAdapter, "getRemoteDevice",
765 "(Ljava/lang/String;)Landroid/bluetooth/BluetoothDevice;");
766 if(!jni_mid_getRemoteDevice)
768 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_mid_getRemoteDevice is null");
772 //jstring jni_address = (*env)->NewStringUTF(env, "B8:5E:7B:54:52:1C");
773 jstring jni_address = (*env)->NewStringUTF(env, address);
774 jobject jni_obj_remoteBTDevice = (*env)->CallObjectMethod(env, jni_obj_BTAdapter, jni_mid_getRemoteDevice, jni_address);
775 if(!jni_obj_remoteBTDevice)
777 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_obj_remoteBTDevice is null");
781 // get create Rfcomm Socket method ID
782 jclass jni_cid_BluetoothDevice = (*env)->FindClass(env, "android/bluetooth/BluetoothDevice");
783 if(!jni_cid_BluetoothDevice)
785 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_cid_BluetoothDevice is null");
789 jmethodID jni_mid_createSocket = (*env)->GetMethodID(env, jni_cid_BluetoothDevice,
790 "createInsecureRfcommSocketToServiceRecord","(Ljava/util/UUID;)Landroid/bluetooth/BluetoothSocket;");
791 if(!jni_mid_createSocket) {
792 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_mid_createSocket is null");
796 // createInsecureRfcommSocketToServiceRecord / createRfcommSocketToServiceRecord
798 jclass jni_cid_uuid = (*env)->FindClass(env, CLASSPATH_BT_UUID);
801 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_cid_uuid is null");
805 jmethodID jni_mid_fromString = (*env)->GetStaticMethodID(env, jni_cid_uuid, "fromString",
806 "(Ljava/lang/String;)Ljava/util/UUID;");
807 if(!jni_mid_fromString)
809 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_mid_fromString is null");
813 jstring jni_uuid = (*env)->NewStringUTF(env, "00000000-0000-0000-0000-0000cdab0000");
814 jobject jni_obj_uuid = (*env)->CallStaticObjectMethod(env, jni_cid_uuid, jni_mid_fromString, jni_uuid);
817 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_obj_uuid is null");
821 jobject jni_obj_BTSocket = (*env)->CallObjectMethod(env, jni_obj_remoteBTDevice, jni_mid_createSocket, jni_obj_uuid);
822 if(!jni_obj_BTSocket)
824 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_obj_BTSocket is null");
829 jclass jni_cid_BTSocket = (*env)->FindClass(env, "android/bluetooth/BluetoothSocket");
830 if(!jni_cid_BTSocket)
832 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_cid_BTSocket is null");
836 jmethodID jni_mid_connect = (*env)->GetMethodID(env, jni_cid_BTSocket, "connect", "()V");
839 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_mid_connect is null");
843 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: initiating connection...");
844 (*env)->CallVoidMethod(env, jni_obj_BTSocket, jni_mid_connect);
846 if((*env)->ExceptionCheck(env))
848 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: Connect is Failed!!!");
849 (*env)->ExceptionDescribe(env);
850 (*env)->ExceptionClear(env);
854 // set socket to list
855 jobject jni_socket = (*env)->NewGlobalRef(env, jni_obj_BTSocket);
856 CAEDRNativeAddDeviceSocketToList(env, jni_socket);
859 CAEDRUpdateDeviceState(STATE_CONNECTED, address);
861 OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: connected");
864 void CAEDRNativeSocketClose(JNIEnv *env, const char* address, uint32_t id)
867 jclass jni_cid_BTSocket = (*env)->FindClass(env, "android/bluetooth/BluetoothSocket");
868 if(!jni_cid_BTSocket)
870 OIC_LOG(DEBUG, TAG, "[EDR][Native] close: jni_cid_BTSocket is null");
874 jmethodID jni_mid_close = (*env)->GetMethodID(env, jni_cid_BTSocket, "close", "()V");
877 OIC_LOG(DEBUG, TAG, "[EDR][Native] close: jni_mid_close is null");
881 jobject jni_obj_socket = CAEDRNativeGetDeviceSocket(id);
884 OIC_LOG(DEBUG, TAG, "[EDR][Native] close: jni_obj_socket is not available");
888 (*env)->CallVoidMethod(env, jni_obj_socket, jni_mid_close);
890 if((*env)->ExceptionCheck(env))
892 OIC_LOG(DEBUG, TAG, "[EDR][Native] close: close is Failed!!!");
893 (*env)->ExceptionDescribe(env);
894 (*env)->ExceptionClear(env);
898 // remove socket to list
899 CAEDRNativeRemoveDeviceSocket(env, jni_obj_socket);
902 CAEDRUpdateDeviceState(STATE_DISCONNECTED, address);
904 OIC_LOG(DEBUG, TAG, "[EDR][Native] close: disconnected");
911 void CAEDRNativeCreateDeviceStateList()
913 OIC_LOG(DEBUG, TAG, "[EDR][Native] CAEDRNativeCreateDeviceStateList");
915 // create new object array
916 if (gdeviceStateList == NULL)
918 OIC_LOG_V(DEBUG, TAG, "Create device list");
920 gdeviceStateList = u_arraylist_create();
924 void CAEDRUpdateDeviceState(uint32_t state, const char* address)
926 state_t *newstate = (state_t*) OICMalloc( sizeof(state_t) );
927 memset(newstate->address, 0, strlen(newstate->address));
928 strcpy(newstate->address, address);
929 newstate->state = state;
931 CAEDRNativeAddDeviceStateToList(newstate);
934 void CAEDRNativeAddDeviceStateToList(state_t* state)
938 OIC_LOG(DEBUG, TAG, "[EDR][Native] device is null");
942 if(!gdeviceStateList)
944 OIC_LOG(DEBUG, TAG, "[EDR][Native] gdevice_list is null");
948 if(CAEDRNativeIsDeviceInList(state->address)) {
949 CAEDRNativeRemoveDevice(state->address); // delete previous state for update new state
951 u_arraylist_add(gdeviceStateList, state); // update new state
952 OIC_LOG_V(DEBUG, TAG, "Set State Info to List : %d", state->state);
955 jboolean CAEDRNativeIsDeviceInList(const char* remoteAddress){
958 for (index = 0; index < u_arraylist_length(gdeviceStateList); index++)
960 state_t* state = (state_t*) u_arraylist_get(gdeviceStateList, index);
963 OIC_LOG(DEBUG, TAG, "[EDR][Native] state_t object is null");
967 if(!strcmp(remoteAddress, state->address))
969 OIC_LOG_V(DEBUG, TAG, "the device is already set");
978 OIC_LOG_V(DEBUG, TAG, "there are no the device in list.");
982 void CAEDRNativeRemoveAllDeviceState()
984 OIC_LOG_V(DEBUG, TAG, "CAEDRNativeRemoveAllDevices");
986 if(!gdeviceStateList)
988 OIC_LOG(DEBUG, TAG, "[EDR][Native] gdeviceStateList is null");
993 for (index = 0; index < u_arraylist_length(gdeviceStateList); index++)
995 state_t* state = (state_t*) u_arraylist_get(gdeviceStateList, index);
998 OIC_LOG(DEBUG, TAG, "[EDR][Native] jarrayObj is null");
1004 OICFree(gdeviceStateList);
1005 gdeviceStateList = NULL;
1009 void CAEDRNativeRemoveDevice(const char* remoteAddress)
1011 OIC_LOG_V(DEBUG, TAG, "CAEDRNativeRemoveDeviceforStateList");
1013 if(!gdeviceStateList)
1015 OIC_LOG(DEBUG, TAG, "[EDR][Native] gdeviceStateList is null");
1020 for (index = 0; index < u_arraylist_length(gdeviceStateList); index++)
1022 state_t* state = (state_t*) u_arraylist_get(gdeviceStateList, index);
1025 OIC_LOG(DEBUG, TAG, "[EDR][Native] state_t object is null");
1029 if(!strcmp(state->address, remoteAddress))
1031 OIC_LOG_V(DEBUG, TAG, "[EDR][Native] remove state : %s", remoteAddress);
1034 CAEDRReorderingDeviceList(index);
1041 jboolean CAEDRIsConnectedDevice(const char* remoteAddress)
1043 OIC_LOG_V(DEBUG, TAG, "CAEDRIsConnectedDevice");
1045 if(!gdeviceStateList)
1047 OIC_LOG(DEBUG, TAG, "[EDR][Native] gdeviceStateList is null");
1052 for (index = 0; index < u_arraylist_length(gdeviceStateList); index++)
1054 state_t* state = (state_t*) u_arraylist_get(gdeviceStateList, index);
1057 OIC_LOG(DEBUG, TAG, "[EDR][Native] state_t object is null");
1061 if(!strcmp(state->address, remoteAddress))
1063 OIC_LOG_V(DEBUG, TAG, "[EDR][Native] check whether it is connected or not");
1065 return state->state;
1071 void CAEDRReorderingDeviceList(uint32_t index)
1073 if (index >= gdeviceStateList->length)
1078 if (index < gdeviceStateList->length - 1)
1080 memmove(&gdeviceStateList->data[index], &gdeviceStateList->data[index + 1],
1081 (gdeviceStateList->length - index - 1) * sizeof(void *));
1084 gdeviceStateList->size--;
1085 gdeviceStateList->length--;
1089 * Device Socket Object List
1091 void CAEDRNativeCreateDeviceSocketList()
1093 OIC_LOG(DEBUG, TAG, "[BLE][Native] CAEDRNativeCreateDeviceSocketList");
1095 // create new object array
1096 if (gdeviceObjectList == NULL)
1098 OIC_LOG_V(DEBUG, TAG, "Create Device object list");
1100 gdeviceObjectList = u_arraylist_create();
1104 void CAEDRNativeAddDeviceSocketToList(JNIEnv *env, jobject deviceSocket)
1106 OIC_LOG(DEBUG, TAG, "[BLE][Native] CANativeAddDeviceobjToList");
1110 OIC_LOG(DEBUG, TAG, "[BLE][Native] Device is null");
1114 if(!gdeviceObjectList)
1116 OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
1120 jstring jni_remoteAddress = CAEDRNativeGetAddressFromDeviceSocket(env, deviceSocket);
1121 if(!jni_remoteAddress)
1123 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_remoteAddress is null");
1127 u_mutex_lock(gMutexSocketListManager);
1129 const char* remoteAddress = (*env)->GetStringUTFChars(env, jni_remoteAddress, NULL);
1131 if(!CAEDRNativeIsDeviceSocketInList(env, remoteAddress))
1133 jobject gDeviceSocker = (*env)->NewGlobalRef(env, deviceSocket);
1134 u_arraylist_add(gdeviceObjectList, gDeviceSocker);
1135 OIC_LOG_V(DEBUG, TAG, "Set Socket Object to Array");
1138 u_mutex_unlock(gMutexSocketListManager);
1141 jboolean CAEDRNativeIsDeviceSocketInList(JNIEnv *env, const char* remoteAddress)
1143 OIC_LOG(DEBUG, TAG, "[BLE][Native] CANativeIsDeviceObjInList");
1146 for (index = 0; index < u_arraylist_length(gdeviceObjectList); index++)
1149 jobject jarrayObj = (jobject) u_arraylist_get(gdeviceObjectList, index);
1152 OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is null");
1156 jstring jni_setAddress = CAEDRNativeGetAddressFromDeviceSocket(env, jarrayObj);
1159 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_setAddress is null");
1163 const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
1165 if(!strcmp(remoteAddress, setAddress))
1167 OIC_LOG_V(DEBUG, TAG, "the device is already set");
1176 OIC_LOG_V(DEBUG, TAG, "there are no the Device obejct in list. we can add");
1180 void CAEDRNativeRemoveAllDeviceSocket(JNIEnv *env)
1182 OIC_LOG_V(DEBUG, TAG, "CANativeRemoveAllDeviceObjsList");
1184 if(!gdeviceObjectList)
1186 OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
1191 for (index = 0; index < u_arraylist_length(gdeviceObjectList); index++)
1193 jobject jarrayObj = (jobject) u_arraylist_get(gdeviceObjectList, index);
1196 OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is null");
1199 (*env)->DeleteGlobalRef(env, jarrayObj);
1202 OICFree(gdeviceObjectList);
1203 gdeviceObjectList = NULL;
1207 void CAEDRNativeRemoveDeviceSocket(JNIEnv *env, jobject deviceSocket)
1209 OIC_LOG_V(DEBUG, TAG, "CAEDRNativeRemoveDeviceSocket");
1211 if(!gdeviceObjectList)
1213 OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
1217 u_mutex_lock(gMutexSocketListManager);
1220 for (index = 0; index < u_arraylist_length(gdeviceObjectList); index++)
1222 jobject jarrayObj = (jobject) u_arraylist_get(gdeviceObjectList, index);
1225 OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is null");
1229 jstring jni_setAddress = CAEDRNativeGetAddressFromDeviceSocket(env, jarrayObj);
1232 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_setAddress is null");
1235 const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
1237 jstring jni_remoteAddress = CAEDRNativeGetAddressFromDeviceSocket(env, deviceSocket);
1238 if(!jni_remoteAddress)
1240 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_remoteAddress is null");
1243 const char* remoteAddress = (*env)->GetStringUTFChars(env, jni_remoteAddress, NULL);
1245 if(!strcmp(setAddress, remoteAddress))
1247 OIC_LOG_V(DEBUG, TAG, "[BLE][Native] remove object : %s", remoteAddress);
1248 (*env)->DeleteGlobalRef(env, jarrayObj);
1250 CAEDRReorderingDeviceSocketList(index);
1254 u_mutex_unlock(gMutexSocketListManager);
1256 OIC_LOG(DEBUG, TAG, "[BLE][Native] there are no target object");
1260 jobject CAEDRNativeGetDeviceSocket(uint32_t idx)
1262 OIC_LOG_V(DEBUG, TAG, "CAEDRNativeGetDeviceSocket");
1266 OIC_LOG(DEBUG, TAG, "[BLE][Native] index is not available");
1270 if(!gdeviceObjectList)
1272 OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
1276 jobject jarrayObj = (jobject) u_arraylist_get(gdeviceObjectList, idx);
1279 OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is not available");
1285 uint32_t CAEDRGetSocketListLength()
1287 if(!gdeviceObjectList)
1289 OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
1293 uint32_t length = u_arraylist_length(gdeviceObjectList);
1298 void CAEDRReorderingDeviceSocketList(uint32_t index)
1300 if (index >= gdeviceObjectList->length)
1305 if (index < gdeviceObjectList->length - 1)
1307 memmove(&gdeviceObjectList->data[index], &gdeviceObjectList->data[index + 1],
1308 (gdeviceObjectList->length - index - 1) * sizeof(void *));
1311 gdeviceObjectList->size--;
1312 gdeviceObjectList->length--;
1315 void CAEDRInitializeClient(u_thread_pool_t handle)
1317 OIC_LOG(DEBUG, TAG, "IN");
1318 CAEDRInitialize(handle);
1319 OIC_LOG(DEBUG, TAG, "OUT");