void CAEDRNativeSocketClose(JNIEnv *env, const char *address) { VERIFY_NON_NULL_VOID(address, TAG, "address is null"); jclass jni_cid_BTSocket = (*env)->FindClass(env, "android/bluetooth/BluetoothSocket"); if (!jni_cid_BTSocket) { OIC_LOG(ERROR, TAG, "jni_cid_BTSocket is null"); return; } jmethodID jni_mid_close = (*env)->GetMethodID(env, jni_cid_BTSocket, "close", "()V"); if (!jni_mid_close) { OIC_LOG(ERROR, TAG, "jni_mid_close is null"); return; } jobject jni_obj_socket = CAEDRNativeGetDeviceSocketBaseAddr(env, address); if (!jni_obj_socket) { OIC_LOG(ERROR, TAG, "jni_obj_socket is not available"); return; } (*env)->CallVoidMethod(env, jni_obj_socket, jni_mid_close); if ((*env)->ExceptionCheck(env)) { OIC_LOG(ERROR, TAG, "close is Failed!!!"); (*env)->ExceptionDescribe(env); (*env)->ExceptionClear(env); return; } // remove socket to list CAEDRNativeRemoveDeviceSocket(env, jni_obj_socket); // update state ca_mutex_lock(g_mutexStateList); CAEDRUpdateDeviceState(STATE_DISCONNECTED, address); ca_mutex_unlock(g_mutexStateList); OIC_LOG_V(DEBUG, TAG, "disconnected with [%s]", address); }
void CAEDRNativeSocketClose(JNIEnv *env, const char *address, uint32_t id) { jclass jni_cid_BTSocket = (*env)->FindClass(env, "android/bluetooth/BluetoothSocket"); if(!jni_cid_BTSocket) { OIC_LOG(ERROR, TAG, "[EDR][Native] close: jni_cid_BTSocket is null"); return; } jmethodID jni_mid_close = (*env)->GetMethodID(env, jni_cid_BTSocket, "close", "()V"); if(!jni_mid_close) { OIC_LOG(ERROR, TAG, "[EDR][Native] close: jni_mid_close is null"); return; } jobject jni_obj_socket = CAEDRNativeGetDeviceSocket(id); if(!jni_obj_socket) { OIC_LOG(ERROR, TAG, "[EDR][Native] close: jni_obj_socket is not available"); return; } (*env)->CallVoidMethod(env, jni_obj_socket, jni_mid_close); if((*env)->ExceptionCheck(env)) { OIC_LOG(DEBUG, TAG, "[EDR][Native] close: close is Failed!!!"); (*env)->ExceptionDescribe(env); (*env)->ExceptionClear(env); return; } // remove socket to list CAEDRNativeRemoveDeviceSocket(env, jni_obj_socket); // update state CAEDRUpdateDeviceState(STATE_DISCONNECTED, address); OIC_LOG(DEBUG, TAG, "[EDR][Native] close: disconnected"); }
CAResult_t CAEDRNativeConnect(JNIEnv *env, const char *address) { VERIFY_NON_NULL(address, TAG, "address is null"); if (!CAEDRNativeIsEnableBTAdapter(env)) { OIC_LOG(INFO, TAG, "BT adapter is not enabled"); return CA_ADAPTER_NOT_ENABLED; } jclass jni_cid_BTAdapter = (*env)->FindClass(env, CLASSPATH_BT_ADPATER); if (!jni_cid_BTAdapter) { OIC_LOG(ERROR, TAG, "jni_cid_BTAdapter is null"); return CA_STATUS_FAILED; } // get BTadpater jmethodID jni_mid_getDefaultAdapter = (*env)->GetStaticMethodID(env, jni_cid_BTAdapter, "getDefaultAdapter", METHODID_OBJECTNONPARAM); if (!jni_mid_getDefaultAdapter) { OIC_LOG(ERROR, TAG, "jni_mid_getDefaultAdapter is null"); (*env)->DeleteLocalRef(env, jni_cid_BTAdapter); return CA_STATUS_FAILED; } jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter, jni_mid_getDefaultAdapter); if (!jni_obj_BTAdapter) { OIC_LOG(ERROR, TAG, "jni_obj_BTAdapter is null"); (*env)->DeleteLocalRef(env, jni_cid_BTAdapter); return CA_STATUS_FAILED; } // get remote bluetooth device jmethodID jni_mid_getRemoteDevice = (*env)->GetMethodID(env, jni_cid_BTAdapter, "getRemoteDevice", METHODID_BT_DEVICEPARAM); (*env)->DeleteLocalRef(env, jni_cid_BTAdapter); if (!jni_mid_getRemoteDevice) { OIC_LOG(ERROR, TAG, "jni_mid_getRemoteDevice is null"); (*env)->DeleteLocalRef(env, jni_obj_BTAdapter); return CA_STATUS_FAILED; } jstring jni_address = (*env)->NewStringUTF(env, address); jobject jni_obj_remoteBTDevice = (*env)->CallObjectMethod(env, jni_obj_BTAdapter, jni_mid_getRemoteDevice, jni_address); (*env)->DeleteLocalRef(env, jni_address); (*env)->DeleteLocalRef(env, jni_obj_BTAdapter); if (!jni_obj_remoteBTDevice) { OIC_LOG(ERROR, TAG, "jni_obj_remoteBTDevice is null"); return CA_STATUS_FAILED; } // get create Rfcomm Socket method ID jclass jni_cid_BluetoothDevice = (*env)->FindClass(env, CLASSPATH_BT_DEVICE); if (!jni_cid_BluetoothDevice) { OIC_LOG(ERROR, TAG, "jni_cid_BluetoothDevice is null"); (*env)->DeleteLocalRef(env, jni_obj_remoteBTDevice); return CA_STATUS_FAILED; } jmethodID jni_mid_createSocket = (*env)->GetMethodID( env, jni_cid_BluetoothDevice, "createInsecureRfcommSocketToServiceRecord", "(Ljava/util/UUID;)Landroid/bluetooth/BluetoothSocket;"); (*env)->DeleteLocalRef(env, jni_cid_BluetoothDevice); if (!jni_mid_createSocket) { OIC_LOG(ERROR, TAG, "jni_mid_createSocket is null"); (*env)->DeleteLocalRef(env, jni_obj_remoteBTDevice); return CA_STATUS_FAILED; } // setting UUID jclass jni_cid_uuid = (*env)->FindClass(env, CLASSPATH_BT_UUID); if (!jni_cid_uuid) { OIC_LOG(ERROR, TAG, "jni_cid_uuid is null"); (*env)->DeleteLocalRef(env, jni_obj_remoteBTDevice); return CA_STATUS_FAILED; } jmethodID jni_mid_fromString = (*env)->GetStaticMethodID( env, jni_cid_uuid, "fromString", "(Ljava/lang/String;)Ljava/util/UUID;"); if (!jni_mid_fromString) { OIC_LOG(ERROR, TAG, "jni_mid_fromString is null"); (*env)->DeleteLocalRef(env, jni_cid_uuid); (*env)->DeleteLocalRef(env, jni_obj_remoteBTDevice); return CA_STATUS_FAILED; } jstring jni_uuid = (*env)->NewStringUTF(env, OIC_EDR_SERVICE_ID); if (!jni_uuid) { OIC_LOG(ERROR, TAG, "jni_uuid is null"); (*env)->DeleteLocalRef(env, jni_cid_uuid); (*env)->DeleteLocalRef(env, jni_obj_remoteBTDevice); return CA_STATUS_FAILED; } jobject jni_obj_uuid = (*env)->CallStaticObjectMethod(env, jni_cid_uuid, jni_mid_fromString, jni_uuid); (*env)->DeleteLocalRef(env, jni_cid_uuid); (*env)->DeleteLocalRef(env, jni_uuid); if (!jni_obj_uuid) { OIC_LOG(ERROR, TAG, "jni_obj_uuid is null"); (*env)->DeleteLocalRef(env, jni_obj_remoteBTDevice); return CA_STATUS_FAILED; } // create socket jobject jni_obj_BTSocket = (*env)->CallObjectMethod(env, jni_obj_remoteBTDevice, jni_mid_createSocket, jni_obj_uuid); (*env)->DeleteLocalRef(env, jni_obj_uuid); (*env)->DeleteLocalRef(env, jni_obj_remoteBTDevice); if (!jni_obj_BTSocket) { OIC_LOG(ERROR, TAG, "jni_obj_BTSocket is null"); return CA_STATUS_FAILED; } // connect jclass jni_cid_BTSocket = (*env)->FindClass(env, CLASSPATH_BT_SOCKET); if (!jni_cid_BTSocket) { OIC_LOG(ERROR, TAG, "jni_cid_BTSocket is null"); (*env)->DeleteLocalRef(env, jni_obj_BTSocket); return CA_STATUS_FAILED; } jmethodID jni_mid_connect = (*env)->GetMethodID(env, jni_cid_BTSocket, "connect", "()V"); (*env)->DeleteLocalRef(env, jni_cid_BTSocket); if (!jni_mid_connect) { OIC_LOG(ERROR, TAG, "jni_mid_connect is null"); (*env)->DeleteLocalRef(env, jni_obj_BTSocket); return CA_STATUS_FAILED; } OIC_LOG(DEBUG, TAG, "initiating connection..."); (*env)->CallVoidMethod(env, jni_obj_BTSocket, jni_mid_connect); if ((*env)->ExceptionCheck(env)) { OIC_LOG(ERROR, TAG, "Connect is Failed!!!"); (*env)->ExceptionDescribe(env); (*env)->ExceptionClear(env); return CA_STATUS_FAILED; } // set socket to list jobject jni_socket = (*env)->NewGlobalRef(env, jni_obj_BTSocket); if (!jni_socket) { OIC_LOG(ERROR, TAG, "jni_socket is null"); (*env)->DeleteLocalRef(env, jni_obj_BTSocket); return CA_STATUS_FAILED; } ca_mutex_lock(g_mutexObjectList); CAEDRNativeAddDeviceSocketToList(env, jni_socket); (*env)->DeleteGlobalRef(env, jni_socket); (*env)->DeleteLocalRef(env, jni_obj_BTSocket); ca_mutex_unlock(g_mutexObjectList); // update state ca_mutex_lock(g_mutexStateList); CAEDRUpdateDeviceState(STATE_CONNECTED, address); ca_mutex_unlock(g_mutexStateList); OIC_LOG(DEBUG, TAG, "successfully connected"); return CA_STATUS_OK; }
void CAEDRNativeConnect(JNIEnv *env, const char *address, uint32_t id) { OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect.."); jclass jni_cid_BTAdapter = (*env)->FindClass(env, CLASSPATH_BT_ADPATER); if(!jni_cid_BTAdapter) { OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_cid_BTAdapter is null"); return; } // get BTadpater jmethodID jni_mid_getDefaultAdapter = (*env)->GetStaticMethodID(env, jni_cid_BTAdapter, "getDefaultAdapter", METHODID_OBJECTNONPARAM); if(!jni_mid_getDefaultAdapter) { OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_mid_getDefaultAdapter is null"); return; } jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter, jni_mid_getDefaultAdapter); if(!jni_obj_BTAdapter) { OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_obj_BTAdapter is null"); return; } // get remote bluetooth device jmethodID jni_mid_getRemoteDevice = (*env)->GetMethodID(env, jni_cid_BTAdapter, "getRemoteDevice", "(Ljava/lang/String;)Landroid/bluetooth/BluetoothDevice;"); if(!jni_mid_getRemoteDevice) { OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_mid_getRemoteDevice is null"); return; } //jstring jni_address = (*env)->NewStringUTF(env, "B8:5E:7B:54:52:1C"); jstring jni_address = (*env)->NewStringUTF(env, address); jobject jni_obj_remoteBTDevice = (*env)->CallObjectMethod(env, jni_obj_BTAdapter, jni_mid_getRemoteDevice, jni_address); if(!jni_obj_remoteBTDevice) { OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_obj_remoteBTDevice is null"); return; } // get create Rfcomm Socket method ID jclass jni_cid_BluetoothDevice = (*env)->FindClass(env, "android/bluetooth/BluetoothDevice"); if(!jni_cid_BluetoothDevice) { OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_cid_BluetoothDevice is null"); return; } jmethodID jni_mid_createSocket = (*env)->GetMethodID(env, jni_cid_BluetoothDevice, "createInsecureRfcommSocketToServiceRecord", "(Ljava/util/UUID;)Landroid/bluetooth/BluetoothSocket;"); if(!jni_mid_createSocket) { OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_mid_createSocket is null"); return; } // createInsecureRfcommSocketToServiceRecord / createRfcommSocketToServiceRecord // setting UUID jclass jni_cid_uuid = (*env)->FindClass(env, CLASSPATH_BT_UUID); if(!jni_cid_uuid) { OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_cid_uuid is null"); return; } jmethodID jni_mid_fromString = (*env)->GetStaticMethodID(env, jni_cid_uuid, "fromString", "(Ljava/lang/String;)Ljava/util/UUID;"); if(!jni_mid_fromString) { OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_mid_fromString is null"); return; } jobject jni_obj_uuid = (*env)->CallStaticObjectMethod(env, jni_cid_uuid, jni_mid_fromString, OIC_EDR_SERVICE_ID); if(!jni_obj_uuid) { OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_obj_uuid is null"); return; } // create socket jobject jni_obj_BTSocket = (*env)->CallObjectMethod(env, jni_obj_remoteBTDevice, jni_mid_createSocket, jni_obj_uuid); if(!jni_obj_BTSocket) { OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_obj_BTSocket is null"); return; } // connect jclass jni_cid_BTSocket = (*env)->FindClass(env, "android/bluetooth/BluetoothSocket"); if(!jni_cid_BTSocket) { OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_cid_BTSocket is null"); return; } jmethodID jni_mid_connect = (*env)->GetMethodID(env, jni_cid_BTSocket, "connect", "()V"); if(!jni_mid_connect) { OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: jni_mid_connect is null"); return; } OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: initiating connection..."); (*env)->CallVoidMethod(env, jni_obj_BTSocket, jni_mid_connect); if((*env)->ExceptionCheck(env)) { OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: Connect is Failed!!!"); (*env)->ExceptionDescribe(env); (*env)->ExceptionClear(env); return; } // set socket to list jobject jni_socket = (*env)->NewGlobalRef(env, jni_obj_BTSocket); CAEDRNativeAddDeviceSocketToList(env, jni_socket); // update state CAEDRUpdateDeviceState(STATE_CONNECTED, address); OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect: connected"); }
/** * EDR Method */ void CAEDRNativeSendData(JNIEnv *env, const char *address, const char *data, uint32_t id) { OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData logic start"); if(STATE_DISCONNECTED == CAEDRIsConnectedDevice(address)) { // connect before send data OIC_LOG(DEBUG, TAG, "[EDR][Native] connect before send data"); if(NULL == address) { OIC_LOG(ERROR, TAG, "[EDR][Native] remote address is empty"); return; } else { CAEDRNativeConnect(env, address, id); } } if(STATE_CONNECTED == CAEDRIsConnectedDevice(address)) { if(!((*env)->ExceptionCheck(env))) { jclass jni_cid_BTsocket = (*env)->FindClass(env, "android/bluetooth/BluetoothSocket"); if(!jni_cid_BTsocket) { OIC_LOG(ERROR, TAG, "[EDR][Native] btSendData: jni_cid_BTsocket is null"); return; } jmethodID jni_mid_getOutputStream = (*env)->GetMethodID(env, jni_cid_BTsocket, "getOutputStream", "()Ljava/io/OutputStream;"); if(!jni_mid_getOutputStream) { OIC_LOG(ERROR, TAG, "[EDR][Native] btSendData: jni_mid_getOutputStream is null"); return; } OIC_LOG_V(DEBUG, TAG, "[EDR][Native] btSendData: Get MethodID for i/o stream..%d", id); jobject jni_obj_socket = CAEDRNativeGetDeviceSocket(id); if(!jni_obj_socket) { OIC_LOG(ERROR, TAG, "[EDR][Native] btSendData: jni_socket is not available"); return; } jobject jni_obj_outputStream = (*env)->CallObjectMethod(env, jni_obj_socket, jni_mid_getOutputStream); if(!jni_obj_outputStream) { OIC_LOG(ERROR, TAG, "[EDR][Native] btSendData: jni_obj_outputStream is null"); return; } OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: ready outputStream.."); jclass jni_cid_OutputStream = (*env)->FindClass(env, "java/io/OutputStream"); if(!jni_cid_OutputStream) { OIC_LOG(ERROR, TAG, "[EDR][Native] btSendData: jni_cid_OutputStream is null"); return; } jmethodID jni_mid_write = (*env)->GetMethodID(env, jni_cid_OutputStream, "write", "([BII)V"); if(!jni_mid_write) { OIC_LOG(ERROR, TAG, "[EDR][Native] btSendData: jni_mid_write is null"); return; } jbyteArray jbuf; int length = strlen(data); jbuf = (*env)->NewByteArray(env, length); (*env)->SetByteArrayRegion(env, jbuf, 0, length, (jbyte*)data); (*env)->CallVoidMethod(env, jni_obj_outputStream, jni_mid_write, jbuf, (jint) 0, (jint) length); if((*env)->ExceptionCheck(env)) { OIC_LOG(ERROR, TAG, "[EDR][Native] btSendData: Write Error!!!"); (*env)->ExceptionDescribe(env); (*env)->ExceptionClear(env); return; } OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: Write Success"); // remove socket to list CAEDRNativeRemoveDeviceSocket(env, jni_obj_socket); // update state CAEDRUpdateDeviceState(STATE_DISCONNECTED, address); } else { (*env)->ExceptionDescribe(env); (*env)->ExceptionClear(env); OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: error!!"); return; } } else { OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: BT connection is not completed!!"); } }