1 /******************************************************************
3 * Copyright 2014 Samsung Electronics All Rights Reserved.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 ******************************************************************/
24 #include <android/log.h>
26 #include "caleserver.h"
27 #include "caleutils.h"
28 #include "caleinterface.h"
29 #include "caadapterutils.h"
32 #include "oic_malloc.h"
33 #include "cathreadpool.h"
35 #include "uarraylist.h"
36 #include "org_iotivity_ca_CaLeServerInterface.h"
38 #define TAG PCF("CA_LE_SERVER")
40 static JavaVM *g_jvm = NULL;
41 static jobject g_context = NULL;
42 static jobject g_bluetoothGattServer = NULL;
43 static jobject g_bluetoothGattServerCallback = NULL;
44 static jobject g_leAdvertiseCallback = NULL;
46 static CAPacketReceiveCallback g_packetReceiveCallback = NULL;
47 static CABLEErrorHandleCallback g_serverErrorCallback;
49 static u_arraylist_t *g_connectedDeviceList = NULL;
50 static ca_thread_pool_t g_threadPoolHandle = NULL;
52 static bool g_isStartServer = false;
53 static bool g_isInitializedServer = false;
55 static CABLEDataReceivedCallback g_CABLEServerDataReceivedCallback = NULL;
56 static ca_mutex g_bleReqRespCbMutex = NULL;
57 static ca_mutex g_bleClientBDAddressMutex = NULL;
58 static ca_mutex g_connectedDeviceListMutex = NULL;
60 void CALEServerJNISetContext()
62 OIC_LOG(DEBUG, TAG, "CALEServerJNISetContext");
63 g_context = (jobject) CANativeJNIGetContext();
66 void CALeServerJniInit()
68 OIC_LOG(DEBUG, TAG, "CALeServerJniInit");
69 g_jvm = (JavaVM*) CANativeJNIGetJavaVM();
72 CAResult_t CALEServerCreateJniInterfaceObject()
74 OIC_LOG(DEBUG, TAG, "CALEServerCreateJniInterfaceObject");
78 OIC_LOG(ERROR, TAG, "g_context is null");
79 return CA_STATUS_FAILED;
84 OIC_LOG(ERROR, TAG, "g_jvm is null");
85 return CA_STATUS_FAILED;
88 bool isAttached = false;
90 jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
93 OIC_LOG(INFO, TAG, "Could not get JNIEnv pointer");
94 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
98 OIC_LOG(ERROR, TAG, "AttachCurrentThread has failed");
99 return CA_STATUS_FAILED;
104 jclass jni_LEInterface = (*env)->FindClass(env, "org/iotivity/ca/CaLeServerInterface");
105 if (!jni_LEInterface)
107 OIC_LOG(ERROR, TAG, "Could not get CaLeServerInterface class");
111 jmethodID LeInterfaceConstructorMethod = (*env)->GetMethodID(env, jni_LEInterface, "<init>",
113 if (!LeInterfaceConstructorMethod)
115 OIC_LOG(ERROR, TAG, "Could not get CaLeServerInterface constructor method");
119 (*env)->NewObject(env, jni_LEInterface, LeInterfaceConstructorMethod, g_context);
120 OIC_LOG(DEBUG, TAG, "Create instance for CaLeServerInterface");
124 (*g_jvm)->DetachCurrentThread(g_jvm);
133 (*g_jvm)->DetachCurrentThread(g_jvm);
136 return CA_STATUS_FAILED;
139 jobject CALEServerSetResponseData(JNIEnv *env, jbyteArray responseData)
141 OIC_LOG(DEBUG, TAG, "IN - CALEServerSetResponseData");
142 VERIFY_NON_NULL_RET(env, TAG, "env is null", NULL);
143 VERIFY_NON_NULL_RET(responseData, TAG, "responseData is null", NULL);
145 if (!g_bluetoothGattServer)
147 OIC_LOG(ERROR, TAG, "Check BluetoothGattServer status");
151 if (!CALEIsEnableBTAdapter(env))
153 OIC_LOG(ERROR, TAG, "BT adapter is not enabled");
157 OIC_LOG(DEBUG, TAG, "CALEServerSetResponseData");
159 jclass jni_cid_bluetoothGattServer = (*env)->FindClass(env,
160 "android/bluetooth/BluetoothGattServer");
161 if (!jni_cid_bluetoothGattServer)
163 OIC_LOG(ERROR, TAG, "jni_cid_bluetoothGattServer is null");
167 jclass jni_cid_bluetoothGattService = (*env)->FindClass(env, "android/bluetooth/"
168 "BluetoothGattService");
169 if (!jni_cid_bluetoothGattService)
171 OIC_LOG(ERROR, TAG, "jni_cid_bluetoothGattService is null");
175 jclass jni_cid_bluetoothGattCharacteristic = (*env)->FindClass(env, "android/bluetooth/"
176 "BluetoothGattCharacteristic");
177 if (!jni_cid_bluetoothGattService)
179 OIC_LOG(ERROR, TAG, "jni_cid_bluetoothGattCharacteristic is null");
183 jmethodID jni_mid_getService = (*env)->GetMethodID(env, jni_cid_bluetoothGattServer,
185 "(Ljava/util/UUID;)Landroid/bluetooth/"
186 "BluetoothGattService;");
187 if (!jni_cid_bluetoothGattService)
189 OIC_LOG(ERROR, TAG, "jni_mid_getService is null");
193 jobject jni_obj_serviceUUID = CALEGetUuidFromString(env, OIC_GATT_SERVICE_UUID);
194 if (!jni_obj_serviceUUID)
196 OIC_LOG(ERROR, TAG, "jni_obj_serviceUUID is null");
200 jobject jni_obj_bluetoothGattService = (*env)->CallObjectMethod(env, g_bluetoothGattServer,
202 jni_obj_serviceUUID);
203 if (!jni_obj_bluetoothGattService)
205 OIC_LOG(ERROR, TAG, "jni_obj_bluetoothGattService is null");
209 jmethodID jni_mid_getCharacteristic = (*env)->GetMethodID(env, jni_cid_bluetoothGattService,
212 "Landroid/bluetooth/"
213 "BluetoothGattCharacteristic;");
214 if (!jni_mid_getCharacteristic)
216 OIC_LOG(ERROR, TAG, "jni_mid_getCharacteristic is null");
220 jobject jni_obj_responseUUID = CALEGetUuidFromString(env,
221 OIC_GATT_CHARACTERISTIC_RESPONSE_UUID);
222 if (!jni_obj_responseUUID)
224 OIC_LOG(ERROR, TAG, "jni_obj_responseUUID is null");
228 jobject jni_obj_bluetoothGattCharacteristic = (*env)->CallObjectMethod(
229 env, jni_obj_bluetoothGattService, jni_mid_getCharacteristic, jni_obj_responseUUID);
230 if (!jni_obj_bluetoothGattCharacteristic)
232 OIC_LOG(ERROR, TAG, "jni_obj_bluetoothGattCharacteristic is null");
236 jmethodID jni_mid_setValue = (*env)->GetMethodID(env, jni_cid_bluetoothGattCharacteristic,
237 "setValue", "([B)Z");
238 if (!jni_mid_setValue)
240 OIC_LOG(ERROR, TAG, "jni_mid_setValue is null");
244 jboolean jni_boolean_setValue = (*env)->CallBooleanMethod(env,
245 jni_obj_bluetoothGattCharacteristic,
246 jni_mid_setValue, responseData);
247 if (JNI_FALSE == jni_boolean_setValue)
249 OIC_LOG(ERROR, TAG, "Fail to set response data");
252 OIC_LOG(DEBUG, TAG, "OUT - CALEServerSetResponseData");
253 return jni_obj_bluetoothGattCharacteristic;
256 CAResult_t CALEServerSendResponseData(JNIEnv *env, jobject device, jobject responseData)
258 OIC_LOG(DEBUG, TAG, "IN - CALEServerSendResponseData");
259 VERIFY_NON_NULL(responseData, TAG, "responseData is null");
260 VERIFY_NON_NULL(device, TAG, "device is null");
261 VERIFY_NON_NULL(env, TAG, "env is null");
263 if (!CALEIsEnableBTAdapter(env))
265 OIC_LOG(ERROR, TAG, "BT adapter is not enabled");
266 return CA_ADAPTER_NOT_ENABLED;
269 jclass jni_cid_bluetoothGattServer = (*env)->FindClass(env,
270 "android/bluetooth/BluetoothGattServer");
271 if (!jni_cid_bluetoothGattServer)
273 OIC_LOG(ERROR, TAG, "jni_cid_bluetoothGattServer is null");
274 return CA_STATUS_FAILED;
277 jmethodID jni_mid_notifyCharacteristicChanged = (*env)->GetMethodID(
278 env, jni_cid_bluetoothGattServer, "notifyCharacteristicChanged",
279 "(Landroid/bluetooth/BluetoothDevice;"
280 "Landroid/bluetooth/BluetoothGattCharacteristic;Z)Z");
281 if (!jni_mid_notifyCharacteristicChanged)
283 OIC_LOG(ERROR, TAG, "jni_mid_notifyCharacteristicChanged is null");
284 return CA_STATUS_FAILED;
287 jboolean jni_boolean_notifyCharacteristicChanged = (*env)->CallBooleanMethod(
288 env, g_bluetoothGattServer, jni_mid_notifyCharacteristicChanged, device, responseData,
290 if (JNI_FALSE == jni_boolean_notifyCharacteristicChanged)
292 OIC_LOG(ERROR, TAG, "Fail to notify characteristic");
293 return CA_SEND_FAILED;
296 OIC_LOG(DEBUG, TAG, "OUT - CALEServerSendResponseData");
300 CAResult_t CALEServerSendResponse(JNIEnv *env, jobject device, jint requestId, jint status,
301 jint offset, jbyteArray value)
303 OIC_LOG(DEBUG, TAG, "IN - CALEServerSendResponse");
304 VERIFY_NON_NULL(env, TAG, "env is null");
305 VERIFY_NON_NULL(device, TAG, "device is null");
306 VERIFY_NON_NULL(value, TAG, "value is null");
308 OIC_LOG(DEBUG, TAG, "CALEServerSendResponse");
310 if (!CALEIsEnableBTAdapter(env))
312 OIC_LOG(ERROR, TAG, "BT adapter is not enabled");
313 return CA_ADAPTER_NOT_ENABLED;
316 jclass jni_cid_bluetoothGattServer = (*env)->FindClass(env,
317 "android/bluetooth/BluetoothGattServer");
318 if (!jni_cid_bluetoothGattServer)
320 OIC_LOG(ERROR, TAG, "jni_cid_bluetoothGattServer is null");
321 return CA_STATUS_FAILED;
324 jmethodID jni_mid_sendResponse = (*env)->GetMethodID(env, jni_cid_bluetoothGattServer,
326 "(Landroid/bluetooth/BluetoothDevice;"
328 if (!jni_mid_sendResponse)
330 OIC_LOG(ERROR, TAG, "jni_mid_sendResponse is null");
331 return CA_STATUS_FAILED;
334 jboolean jni_boolean_sendResponse = (*env)->CallBooleanMethod(env, g_bluetoothGattServer,
335 jni_mid_sendResponse, device,
336 requestId, status, offset,
338 if (JNI_FALSE == jni_boolean_sendResponse)
340 OIC_LOG(ERROR, TAG, "Fail to send response for gatt characteristic write request");
341 return CA_SEND_FAILED;
344 OIC_LOG(DEBUG, TAG, "OUT - CALEServerSendResponse");
348 CAResult_t CALEServerStartAdvertise(JNIEnv *env, jobject advertiseCallback)
350 OIC_LOG(DEBUG, TAG, "IN - CALEServerStartAdvertise");
351 VERIFY_NON_NULL(env, TAG, "env is null");
352 VERIFY_NON_NULL(advertiseCallback, TAG, "advertiseCallback is null");
354 if (!CALEIsEnableBTAdapter(env))
356 OIC_LOG(ERROR, TAG, "BT adapter is not enabled");
357 return CA_ADAPTER_NOT_ENABLED;
360 jclass jni_cid_AdvertiseSettings = (*env)->FindClass(env,
361 "android/bluetooth/le/"
362 "AdvertiseSettings$Builder");
363 if (!jni_cid_AdvertiseSettings)
365 OIC_LOG(ERROR, TAG, "jni_cid_AdvertiseSettings is null");
366 return CA_STATUS_FAILED;
369 jmethodID jni_mid_AdvertiseSettings = (*env)->GetMethodID(env, jni_cid_AdvertiseSettings,
371 if (!jni_mid_AdvertiseSettings)
373 OIC_LOG(ERROR, TAG, "jni_mid_AdvertiseSettings is null");
374 return CA_STATUS_FAILED;
377 jobject jni_AdvertiseSettings = (*env)->NewObject(env, jni_cid_AdvertiseSettings,
378 jni_mid_AdvertiseSettings);
379 if (!jni_AdvertiseSettings)
381 OIC_LOG(ERROR, TAG, "jni_AdvertiseSettings is null");
382 return CA_STATUS_FAILED;
385 jmethodID jni_mid_setAdvertiseMode = (*env)->GetMethodID(env, jni_cid_AdvertiseSettings,
387 "(I)Landroid/bluetooth/le/"
388 "AdvertiseSettings$Builder;");
389 if (!jni_mid_setAdvertiseMode)
391 OIC_LOG(ERROR, TAG, "jni_mid_setAdvertiseMode is null");
392 return CA_STATUS_FAILED;
395 // 0: Low power, 1: Balanced
396 jobject jni_obj_setAdvertiseMode = (*env)->CallObjectMethod(env, jni_AdvertiseSettings,
397 jni_mid_setAdvertiseMode, 0);
398 if (!jni_obj_setAdvertiseMode)
400 OIC_LOG(ERROR, TAG, "jni_obj_setAdvertiseMode is null");
401 return CA_STATUS_FAILED;
404 jmethodID jni_mid_setConnectable = (*env)->GetMethodID(env, jni_cid_AdvertiseSettings,
406 "(Z)Landroid/bluetooth/le/"
407 "AdvertiseSettings$Builder;");
408 if (!jni_mid_setConnectable)
410 OIC_LOG(ERROR, TAG, "jni_mid_setConnectable is null");
411 return CA_STATUS_FAILED;
414 jobject jni_obj_setConnectable = (*env)->CallObjectMethod(env, jni_AdvertiseSettings,
415 jni_mid_setConnectable, JNI_TRUE);
416 if (!jni_obj_setConnectable)
418 OIC_LOG(ERROR, TAG, "jni_obj_setConnectable is null");
419 return CA_STATUS_FAILED;
422 jmethodID jni_mid_setTimeout = (*env)->GetMethodID(env, jni_cid_AdvertiseSettings, "setTimeout",
423 "(I)Landroid/bluetooth/le/"
424 "AdvertiseSettings$Builder;");
425 if (!jni_mid_setTimeout)
427 OIC_LOG(ERROR, TAG, "jni_mid_setTimeout is null");
428 return CA_STATUS_FAILED;
431 //A value of 0 will disable the time limit
432 jobject jni_obj_setTimeout = (*env)->CallObjectMethod(env, jni_AdvertiseSettings,
433 jni_mid_setTimeout, 0);
434 if (!jni_obj_setTimeout)
436 OIC_LOG(ERROR, TAG, "jni_obj_setTimeout is null");
437 return CA_STATUS_FAILED;
440 jclass jni_cid_AdvertiseDataBuilder = (*env)->FindClass(env,
441 "android/bluetooth/le/"
442 "AdvertiseData$Builder");
443 if (!jni_cid_AdvertiseDataBuilder)
445 OIC_LOG(ERROR, TAG, "jni_cid_AdvertiseDataBuilder is null");
446 return CA_STATUS_FAILED;
449 jmethodID jni_mid_AdvertiseDataBuilder = (*env)->GetMethodID(env, jni_cid_AdvertiseDataBuilder,
451 if (!jni_mid_AdvertiseDataBuilder)
453 OIC_LOG(ERROR, TAG, "jni_mid_AdvertiseDataBuilder is null");
454 return CA_STATUS_FAILED;
457 jobject jni_AdvertiseDataBuilder = (*env)->NewObject(env, jni_cid_AdvertiseDataBuilder,
458 jni_mid_AdvertiseDataBuilder);
459 if (!jni_AdvertiseDataBuilder)
461 OIC_LOG(ERROR, TAG, "jni_AdvertiseDataBuilder is null");
462 return CA_STATUS_FAILED;
465 jobject jni_obj_serviceUUID = CALEGetUuidFromString(env, OIC_GATT_SERVICE_UUID);
466 if (!jni_obj_serviceUUID)
468 OIC_LOG(ERROR, TAG, "jni_obj_serviceUUID is null");
469 return CA_STATUS_FAILED;
472 jobject jni_ParcelUuid = CALEGetParcelUuid(env, jni_obj_serviceUUID);
475 OIC_LOG(ERROR, TAG, "jni_ParcelUuid is null");
476 return CA_STATUS_FAILED;
479 jmethodID jni_mid_addServiceUuid = (*env)->GetMethodID(env, jni_cid_AdvertiseDataBuilder,
481 "(Landroid/os/ParcelUuid;)Landroid/"
482 "bluetooth/le/AdvertiseData$Builder;");
483 if (!jni_mid_addServiceUuid)
485 OIC_LOG(ERROR, TAG, "jni_mid_addServiceUuid is null");
486 return CA_STATUS_FAILED;
489 jobject jni_obj_addServiceUuid = (*env)->CallObjectMethod(env, jni_AdvertiseDataBuilder,
490 jni_mid_addServiceUuid,
492 if (!jni_obj_addServiceUuid)
494 OIC_LOG(ERROR, TAG, "jni_obj_addServiceUuid is null");
495 return CA_STATUS_FAILED;
498 jclass jni_cid_BTAdapter = (*env)->FindClass(env, "android/bluetooth/BluetoothAdapter");
499 if (!jni_cid_BTAdapter)
501 OIC_LOG(ERROR, TAG, "jni_cid_BTAdapter is null");
502 return CA_STATUS_FAILED;
505 jmethodID jni_mid_getDefaultAdapter = (*env)->GetStaticMethodID(env, jni_cid_BTAdapter,
507 "()Landroid/bluetooth/"
508 "BluetoothAdapter;");
509 if (!jni_mid_getDefaultAdapter)
511 OIC_LOG(ERROR, TAG, "jni_mid_getDefaultAdapter is null");
512 return CA_STATUS_FAILED;
515 jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter,
516 jni_mid_getDefaultAdapter);
517 if (!jni_obj_BTAdapter)
519 OIC_LOG(ERROR, TAG, "jni_obj_BTAdapter is null");
520 return CA_STATUS_FAILED;
523 jmethodID jni_mid_getBluetoothLeAdvertiser = (*env)->GetMethodID(env, jni_cid_BTAdapter,
524 "getBluetoothLeAdvertiser",
525 "()Landroid/bluetooth/le/"
526 "BluetoothLeAdvertiser;");
527 if (!jni_mid_getBluetoothLeAdvertiser)
529 OIC_LOG(ERROR, TAG, "jni_mid_getBluetoothLeAdvertiser is null");
530 return CA_STATUS_FAILED;
533 jobject jni_obj_getBluetoothLeAdvertiser = (*env)->CallObjectMethod(
534 env, jni_obj_BTAdapter, jni_mid_getBluetoothLeAdvertiser);
535 if (!jni_obj_getBluetoothLeAdvertiser)
537 OIC_LOG(ERROR, TAG, "jni_obj_getBluetoothLeAdvertiser is null");
538 return CA_STATUS_FAILED;
541 jmethodID jni_mid_build_LeAdvertiseSettings = (*env)->GetMethodID(env,
542 jni_cid_AdvertiseSettings,
544 "()Landroid/bluetooth/le/"
545 "AdvertiseSettings;");
546 if (!jni_mid_build_LeAdvertiseSettings)
548 OIC_LOG(ERROR, TAG, "jni_mid_build_LeAdvertiseSettings is null");
549 return CA_STATUS_FAILED;
552 jobject jni_obj_build_LeAdvertiseSettings = (*env)->CallObjectMethod(
553 env, jni_AdvertiseSettings, jni_mid_build_LeAdvertiseSettings);
554 if (!jni_obj_build_LeAdvertiseSettings)
556 OIC_LOG(ERROR, TAG, "jni_obj_build_LeAdvertiseSettings is null");
557 return CA_STATUS_FAILED;
560 jmethodID jni_mid_build_LeAdvertiseData = (*env)->GetMethodID(env, jni_cid_AdvertiseDataBuilder,
562 "()Landroid/bluetooth/le/"
564 if (!jni_mid_build_LeAdvertiseData)
566 OIC_LOG(ERROR, TAG, "jni_mid_build_LeAdvertiseData is null");
567 return CA_STATUS_FAILED;
570 jobject jni_obj_build_LeAdvertiseData = (*env)->CallObjectMethod(env, jni_AdvertiseDataBuilder,
571 jni_mid_build_LeAdvertiseData);
572 if (!jni_obj_build_LeAdvertiseData)
574 OIC_LOG(ERROR, TAG, "jni_obj_build_LeAdvertiseData is null");
575 return CA_STATUS_FAILED;
578 jclass jni_cid_leAdvertiser = (*env)->FindClass(env,
579 "android/bluetooth/le/BluetoothLeAdvertiser");
580 if (!jni_cid_leAdvertiser)
582 OIC_LOG(ERROR, TAG, "jni_cid_leAdvertiser is null");
583 return CA_STATUS_FAILED;
586 jmethodID jni_mid_startAdvertising = (*env)->GetMethodID(env, jni_cid_leAdvertiser,
588 "(Landroid/bluetooth/le/"
589 "AdvertiseSettings;Landroid/bluetooth/"
590 "le/AdvertiseData;Landroid/bluetooth/"
591 "le/AdvertiseCallback;)V");
592 if (!jni_mid_startAdvertising)
594 OIC_LOG(ERROR, TAG, "jni_mid_startAdvertising is null");
595 return CA_STATUS_FAILED;
598 (*env)->CallVoidMethod(env, jni_obj_getBluetoothLeAdvertiser, jni_mid_startAdvertising,
599 jni_obj_build_LeAdvertiseSettings, jni_obj_build_LeAdvertiseData,
602 if ((*env)->ExceptionCheck(env))
604 OIC_LOG(ERROR, TAG, "StartAdvertising has failed");
605 (*env)->ExceptionDescribe(env);
606 (*env)->ExceptionClear(env);
607 return CA_STATUS_FAILED;
610 OIC_LOG(DEBUG, TAG, "Advertising started!!");
612 OIC_LOG(DEBUG, TAG, "OUT - CALEServerStartAdvertise");
616 CAResult_t CALEServerStopAdvertise(JNIEnv *env, jobject advertiseCallback)
618 OIC_LOG(DEBUG, TAG, "IN - LEServerStopAdvertise");
619 VERIFY_NON_NULL(env, TAG, "env is null");
620 VERIFY_NON_NULL(advertiseCallback, TAG, "advertiseCallback is null");
622 if (!CALEIsEnableBTAdapter(env))
624 OIC_LOG(ERROR, TAG, "BT adapter is not enabled");
625 return CA_ADAPTER_NOT_ENABLED;
628 jclass jni_cid_BTAdapter = (*env)->FindClass(env, "android/bluetooth/BluetoothAdapter");
629 if (!jni_cid_BTAdapter)
631 OIC_LOG(ERROR, TAG, "jni_cid_BTAdapter is null");
632 return CA_STATUS_FAILED;
635 jclass jni_cid_leAdvertiser = (*env)->FindClass(env,
636 "android/bluetooth/le/BluetoothLeAdvertiser");
637 if (!jni_cid_leAdvertiser)
639 OIC_LOG(ERROR, TAG, "jni_cid_leAdvertiser is null");
640 return CA_STATUS_FAILED;
643 jmethodID jni_mid_getDefaultAdapter = (*env)->GetStaticMethodID(env, jni_cid_BTAdapter,
645 "()Landroid/bluetooth/"
646 "BluetoothAdapter;");
647 if (!jni_cid_leAdvertiser)
649 OIC_LOG(ERROR, TAG, "jni_cid_leAdvertiser is null");
650 return CA_STATUS_FAILED;
653 jmethodID jni_mid_getBTLeAdvertiser = (*env)->GetMethodID(env, jni_cid_BTAdapter,
654 "getBluetoothLeAdvertiser",
655 "()Landroid/bluetooth/le/"
656 "BluetoothLeAdvertiser;");
657 if (!jni_mid_getBTLeAdvertiser)
659 OIC_LOG(ERROR, TAG, "jni_mid_getBTLeAdvertiser is null");
660 return CA_STATUS_FAILED;
663 jmethodID jni_mid_stopAdvertising = (*env)->GetMethodID(env, jni_cid_leAdvertiser,
665 "(Landroid/bluetooth/le/"
666 "AdvertiseCallback;)V");
667 if (!jni_mid_stopAdvertising)
669 OIC_LOG(ERROR, TAG, "jni_mid_stopAdvertising is null");
670 return CA_STATUS_FAILED;
673 jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter,
674 jni_mid_getDefaultAdapter);
675 if (!jni_obj_BTAdapter)
677 OIC_LOG(ERROR, TAG, "jni_obj_BTAdapter is null");
678 return CA_STATUS_FAILED;
681 jobject jni_obj_getBluetoothLeAdvertiser = (*env)->CallObjectMethod(env, jni_obj_BTAdapter,
682 jni_mid_getBTLeAdvertiser);
683 if (!jni_obj_getBluetoothLeAdvertiser)
685 OIC_LOG(ERROR, TAG, "jni_obj_getBluetoothLeAdvertiser is null");
686 return CA_STATUS_FAILED;
689 (*env)->CallVoidMethod(env, jni_obj_getBluetoothLeAdvertiser, jni_mid_stopAdvertising,
691 if ((*env)->ExceptionCheck(env))
693 OIC_LOG(ERROR, TAG, "getBluetoothLeAdvertiser has failed");
694 (*env)->ExceptionDescribe(env);
695 (*env)->ExceptionClear(env);
696 return CA_STATUS_FAILED;
699 OIC_LOG(DEBUG, TAG, "Advertising stopped!!");
701 OIC_LOG(DEBUG, TAG, "OUT - LEServerStopAdvertise");
705 CAResult_t CALEServerStartGattServer(JNIEnv *env, jobject gattServerCallback)
707 OIC_LOG(DEBUG, TAG, "IN - CALEServerStartGattServer");
708 VERIFY_NON_NULL(env, TAG, "env is null");
709 VERIFY_NON_NULL(gattServerCallback, TAG, "gattServerCallback is null");
711 if (!CALEIsEnableBTAdapter(env))
713 OIC_LOG(ERROR, TAG, "BT adapter is not enabled");
714 return CA_ADAPTER_NOT_ENABLED;
719 OIC_LOG(DEBUG, TAG, "Gatt server already started");
722 g_bluetoothGattServerCallback = (*env)->NewGlobalRef(env, gattServerCallback);
725 jobject bluetoothGattServer = CALEServerOpenGattServer(env);
726 if (!bluetoothGattServer)
728 OIC_LOG(ERROR, TAG, "bluetoothGattServer is null");
729 return CA_STATUS_FAILED;
732 g_bluetoothGattServer = (*env)->NewGlobalRef(env, bluetoothGattServer);
733 if (!g_bluetoothGattServer)
735 OIC_LOG(ERROR, TAG, "g_bluetoothGattServer is null");
736 return CA_STATUS_FAILED;
739 // create gatt service
740 jobject bluetoothGattService = CALEServerCreateGattService(env);
741 if (!bluetoothGattService)
743 OIC_LOG(ERROR, TAG, "bluetoothGattService is null");
744 return CA_STATUS_FAILED;
748 CAResult_t res = CALEServerAddGattService(env, g_bluetoothGattServer,
749 bluetoothGattService);
750 if (CA_STATUS_OK != res)
752 OIC_LOG(ERROR, TAG, "CALEServerAddGattService has failed");
757 jobject CALEServerOpenGattServer(JNIEnv *env)
759 OIC_LOG(DEBUG, TAG, "IN - CALEServerOpenGattServer");
760 VERIFY_NON_NULL_RET(env, TAG, "env is null", NULL);
762 if (!CALEIsEnableBTAdapter(env))
764 OIC_LOG(ERROR, TAG, "BT adapter is not enabled");
768 jclass jni_cid_context = (*env)->FindClass(env, "android/content/Context");
769 if (!jni_cid_context)
771 OIC_LOG(ERROR, TAG, "jni_cid_context is null");
775 jclass jni_cid_bluetoothManager = (*env)->FindClass(env, "android/bluetooth/BluetoothManager");
776 if (!jni_cid_bluetoothManager)
778 OIC_LOG(ERROR, TAG, "jni_cid_bluetoothManager is null");
782 jfieldID jni_fid_bluetoothService = (*env)->GetStaticFieldID(env, jni_cid_context,
784 "Ljava/lang/String;");
785 if (!jni_fid_bluetoothService)
787 OIC_LOG(ERROR, TAG, "jni_fid_bluetoothService is null");
791 jmethodID jni_mid_getSystemService = (*env)->GetMethodID(env, jni_cid_context,
793 "(Ljava/lang/String;)"
794 "Ljava/lang/Object;");
795 if (!jni_mid_getSystemService)
797 OIC_LOG(ERROR, TAG, "jni_mid_getSystemService is null");
801 jmethodID jni_mid_openGattServer = (*env)->GetMethodID(env, jni_cid_bluetoothManager,
803 "(Landroid/content/Context;"
804 "Landroid/bluetooth/"
805 "BluetoothGattServerCallback;)"
806 "Landroid/bluetooth/"
807 "BluetoothGattServer;");
808 if (!jni_mid_openGattServer)
810 OIC_LOG(ERROR, TAG, "jni_mid_openGattServer is null");
814 jobject jni_obj_bluetoothService = (*env)->GetStaticObjectField(env, jni_cid_context,
815 jni_fid_bluetoothService);
816 if (!jni_obj_bluetoothService)
818 OIC_LOG(ERROR, TAG, "jni_obj_bluetoothService is null");
822 jobject jni_obj_bluetoothManager = (*env)->CallObjectMethod(env, g_context,
823 jni_mid_getSystemService,
824 jni_obj_bluetoothService);
825 if (!jni_obj_bluetoothManager)
827 OIC_LOG(ERROR, TAG, "jni_obj_bluetoothManager is null");
831 jobject jni_obj_bluetoothGattServer = (*env)->CallObjectMethod(env, jni_obj_bluetoothManager,
832 jni_mid_openGattServer,
834 g_bluetoothGattServerCallback);
835 if (!jni_obj_bluetoothGattServer)
837 OIC_LOG(ERROR, TAG, "jni_obj_bluetoothGattServer is null");
841 OIC_LOG(DEBUG, TAG, "OUT - CALEServerOpenGattServer");
842 return jni_obj_bluetoothGattServer;
845 jobject CALEServerCreateGattService(JNIEnv *env)
847 OIC_LOG(DEBUG, TAG, "IN - CALEServerCreateGattService");
848 VERIFY_NON_NULL_RET(env, TAG, "env is null", NULL);
850 if (!CALEIsEnableBTAdapter(env))
852 OIC_LOG(ERROR, TAG, "BT adapter is not enabled");
856 jclass jni_cid_bluetoothGattService = (*env)->FindClass(env, "android/bluetooth/"
857 "BluetoothGattService");
858 if (!jni_cid_bluetoothGattService)
860 OIC_LOG(ERROR, TAG, "jni_cid_bluetoothGattService is null");
864 jclass jni_cid_bluetoothGattCharacteristic = (*env)->FindClass(env, "android/bluetooth/"
865 "BluetoothGattCharacteristic");
866 if (!jni_cid_bluetoothGattCharacteristic)
868 OIC_LOG(ERROR, TAG, "jni_cid_bluetoothGattCharacteristic is null");
872 jfieldID jni_fid_serviceType = (*env)->GetStaticFieldID(env, jni_cid_bluetoothGattService,
873 "SERVICE_TYPE_PRIMARY", "I");
874 if (!jni_fid_serviceType)
876 OIC_LOG(ERROR, TAG, "jni_fid_serviceType is null");
880 jfieldID jni_fid_readProperties = (*env)->GetStaticFieldID(env,
881 jni_cid_bluetoothGattCharacteristic,
882 "PROPERTY_NOTIFY", "I");
883 if (!jni_fid_readProperties)
885 OIC_LOG(ERROR, TAG, "jni_fid_readProperties is null");
889 jfieldID jni_fid_writeProperties = (*env)->GetStaticFieldID(env,
890 jni_cid_bluetoothGattCharacteristic,
891 "PROPERTY_WRITE_NO_RESPONSE", "I");
892 if (!jni_fid_writeProperties)
894 OIC_LOG(ERROR, TAG, "jni_fid_writeProperties is null");
898 jfieldID jni_fid_readPermissions = (*env)->GetStaticFieldID(env,
899 jni_cid_bluetoothGattCharacteristic,
900 "PERMISSION_READ", "I");
901 if (!jni_fid_readPermissions)
903 OIC_LOG(ERROR, TAG, "jni_fid_readPermissions is null");
907 jfieldID jni_fid_writePermissions = (*env)->GetStaticFieldID(
908 env, jni_cid_bluetoothGattCharacteristic, "PERMISSION_WRITE", "I");
909 if (!jni_fid_writePermissions)
911 OIC_LOG(ERROR, TAG, "jni_fid_writePermissions is null");
915 jmethodID jni_mid_bluetoothGattService = (*env)->GetMethodID(env, jni_cid_bluetoothGattService,
916 "<init>", "(Ljava/util/UUID;I)V");
917 if (!jni_mid_bluetoothGattService)
919 OIC_LOG(ERROR, TAG, "jni_mid_bluetoothGattService is null");
923 jmethodID jni_mid_addCharacteristic = (*env)->GetMethodID(env, jni_cid_bluetoothGattService,
925 "(Landroid/bluetooth/"
926 "BluetoothGattCharacteristic;)Z");
927 if (!jni_mid_addCharacteristic)
929 OIC_LOG(ERROR, TAG, "jni_mid_addCharacteristic is null");
933 jmethodID jni_mid_bluetoothGattCharacteristic = (*env)->GetMethodID(
934 env, jni_cid_bluetoothGattCharacteristic, "<init>", "(Ljava/util/UUID;II)V");
935 if (!jni_mid_bluetoothGattCharacteristic)
937 OIC_LOG(ERROR, TAG, "jni_mid_bluetoothGattCharacteristic is null");
941 jobject jni_obj_serviceUUID = CALEGetUuidFromString(env, OIC_GATT_SERVICE_UUID);
942 if (!jni_obj_serviceUUID)
944 OIC_LOG(ERROR, TAG, "jni_obj_serviceUUID is null");
948 jint jni_int_serviceType = (*env)->GetStaticIntField(env, jni_cid_bluetoothGattService,
949 jni_fid_serviceType);
950 jobject jni_bluetoothGattService = (*env)->NewObject(env, jni_cid_bluetoothGattService,
951 jni_mid_bluetoothGattService,
952 jni_obj_serviceUUID, jni_int_serviceType);
953 if (!jni_bluetoothGattService)
955 OIC_LOG(ERROR, TAG, "jni_bluetoothGattService is null");
959 jobject jni_obj_readUuid = CALEGetUuidFromString(env, OIC_GATT_CHARACTERISTIC_RESPONSE_UUID);
960 if (!jni_obj_readUuid)
962 OIC_LOG(ERROR, TAG, "jni_obj_readUuid is null");
966 jint jni_int_readProperties = (*env)->GetStaticIntField(env,
967 jni_cid_bluetoothGattCharacteristic,
968 jni_fid_readProperties);
970 jint jni_int_readPermissions = (*env)->GetStaticIntField(env,
971 jni_cid_bluetoothGattCharacteristic,
972 jni_fid_readPermissions);
974 jint jni_int_writePermissions = (*env)->GetStaticIntField(env,
975 jni_cid_bluetoothGattCharacteristic,
976 jni_fid_writePermissions);
978 jobject jni_readCharacteristic = (*env)->NewObject(env, jni_cid_bluetoothGattCharacteristic,
979 jni_mid_bluetoothGattCharacteristic,
980 jni_obj_readUuid, jni_int_readProperties,
981 jni_int_readPermissions|
982 jni_int_writePermissions);
983 if (!jni_readCharacteristic)
985 OIC_LOG(ERROR, TAG, "jni_readCharacteristic is null");
989 jboolean jni_boolean_addReadCharacteristic = (*env)->CallBooleanMethod(
990 env, jni_bluetoothGattService, jni_mid_addCharacteristic, jni_readCharacteristic);
991 if (!jni_boolean_addReadCharacteristic)
993 OIC_LOG(ERROR, TAG, "jni_boolean_addReadCharacteristic is null");
997 jobject jni_obj_writeUuid = CALEGetUuidFromString(env, OIC_GATT_CHARACTERISTIC_REQUEST_UUID);
998 if (!jni_obj_writeUuid)
1000 OIC_LOG(ERROR, TAG, "jni_obj_bluetoothGattServer is null");
1004 jint jni_int_writeProperties = (*env)->GetStaticIntField(env,
1005 jni_cid_bluetoothGattCharacteristic,
1006 jni_fid_writeProperties);
1008 jobject jni_writeCharacteristic = (*env)->NewObject(env, jni_cid_bluetoothGattCharacteristic,
1009 jni_mid_bluetoothGattCharacteristic,
1010 jni_obj_writeUuid, jni_int_writeProperties,
1011 jni_int_writePermissions);
1012 if (!jni_writeCharacteristic)
1014 OIC_LOG(ERROR, TAG, "jni_writeCharacteristic is null");
1018 jboolean jni_boolean_addWriteCharacteristic = (*env)->CallBooleanMethod(
1019 env, jni_bluetoothGattService, jni_mid_addCharacteristic, jni_writeCharacteristic);
1020 if (JNI_FALSE == jni_boolean_addWriteCharacteristic)
1022 OIC_LOG(ERROR, TAG, "Fail to add jni_boolean_addReadCharacteristic");
1026 OIC_LOG(DEBUG, TAG, "OUT - CALEServerCreateGattService");
1027 return jni_bluetoothGattService;
1030 CAResult_t CALEServerAddDescriptor(JNIEnv *env, jobject characteristic)
1032 OIC_LOG(DEBUG, TAG, "IN - CALEServerAddDescriptor");
1033 VERIFY_NON_NULL(env, TAG, "env is null");
1034 VERIFY_NON_NULL(characteristic, TAG, "characteristic is null");
1036 jclass jni_cid_bluetoothGattDescriptor = (*env)->FindClass(env, "android/bluetooth/"
1037 "BluetoothGattDescriptor");
1038 if (!jni_cid_bluetoothGattDescriptor)
1040 OIC_LOG(ERROR, TAG, "jni_cid_bluetoothGattDescriptor is null");
1041 return CA_STATUS_FAILED;
1044 jmethodID jni_mid_bluetoothGattDescriptor = (*env)->GetMethodID(env,
1045 jni_cid_bluetoothGattDescriptor,
1047 "(Ljava/util/UUID;I)V");
1048 if (!jni_mid_bluetoothGattDescriptor)
1050 OIC_LOG(ERROR, TAG, "jni_mid_bluetoothGattDescriptor is null");
1051 return CA_STATUS_FAILED;
1054 jfieldID jni_fid_readPermissions = (*env)->GetStaticFieldID(env,
1055 jni_cid_bluetoothGattDescriptor,
1056 "PERMISSION_READ", "I");
1057 if (!jni_fid_readPermissions)
1059 OIC_LOG(ERROR, TAG, "jni_fid_readPermissions is null");
1060 return CA_STATUS_FAILED;
1063 jobject jni_obj_readUuid = CALEGetUuidFromString(env, OIC_GATT_CHARACTERISTIC_CONFIG_UUID);
1064 if (!jni_obj_readUuid)
1066 OIC_LOG(ERROR, TAG, "jni_obj_readUuid is null");
1067 return CA_STATUS_FAILED;
1070 jint jni_int_readPermissions = (*env)->GetStaticIntField(env, jni_cid_bluetoothGattDescriptor,
1071 jni_fid_readPermissions);
1073 OIC_LOG(DEBUG, TAG, "initialize new Descriptor");
1075 jobject jni_readDescriptor = (*env)->NewObject(env, jni_cid_bluetoothGattDescriptor,
1076 jni_mid_bluetoothGattDescriptor,
1077 jni_obj_readUuid, jni_int_readPermissions);
1078 if (!jni_readDescriptor)
1080 OIC_LOG(ERROR, TAG, "jni_readDescriptor is null");
1081 return CA_STATUS_FAILED;
1084 jclass jni_cid_GattCharacteristic = (*env)->FindClass(env, "android/bluetooth/"
1085 "BluetoothGattCharacteristic");
1086 if (!jni_cid_GattCharacteristic)
1088 OIC_LOG(ERROR, TAG, "jni_cid_GattCharacteristic is null");
1089 return CA_STATUS_FAILED;
1092 jmethodID jni_mid_addDescriptor = (*env)->GetMethodID(env, jni_cid_GattCharacteristic,
1094 "(Landroid/bluetooth/"
1095 "BluetoothGattDescriptor;)Z");
1096 if (!jni_mid_addDescriptor)
1098 OIC_LOG(ERROR, TAG, "jni_mid_addDescriptor is null");
1099 return CA_STATUS_FAILED;
1102 jboolean jni_boolean_addDescriptor = (*env)->CallBooleanMethod(env, characteristic,
1103 jni_mid_addDescriptor,
1104 jni_readDescriptor);
1106 if (JNI_FALSE == jni_boolean_addDescriptor)
1108 OIC_LOG(ERROR, TAG, "addDescriptor has failed");
1109 return CA_STATUS_FAILED;
1113 OIC_LOG(DEBUG, TAG, "addDescriptor success");
1116 OIC_LOG(DEBUG, TAG, "OUT - CALEServerAddDescriptor");
1117 return CA_STATUS_OK;
1120 CAResult_t CALEServerAddGattService(JNIEnv *env, jobject bluetoothGattServer,
1121 jobject bluetoothGattService)
1123 OIC_LOG(DEBUG, TAG, "IN - CALEServerAddGattService");
1124 VERIFY_NON_NULL(env, TAG, "env is null");
1125 VERIFY_NON_NULL(bluetoothGattServer, TAG, "bluetoothGattServer is null");
1126 VERIFY_NON_NULL(bluetoothGattService, TAG, "bluetoothGattService is null");
1128 if (!CALEIsEnableBTAdapter(env))
1130 OIC_LOG(ERROR, TAG, "BT adapter is not enabled");
1131 return CA_ADAPTER_NOT_ENABLED;
1134 jclass jni_cid_bluetoothGattServer = (*env)->FindClass(env,
1135 "android/bluetooth/BluetoothGattServer");
1136 if (!jni_cid_bluetoothGattServer)
1138 OIC_LOG(ERROR, TAG, "jni_cid_bluetoothGattServer is null");
1139 return CA_STATUS_FAILED;
1142 jmethodID jni_mid_addService = (*env)->GetMethodID(env, jni_cid_bluetoothGattServer,
1144 "(Landroid/bluetooth/BluetoothGattService;)"
1146 if (!jni_mid_addService)
1148 OIC_LOG(ERROR, TAG, "jni_mid_addService is null");
1149 return CA_STATUS_FAILED;
1152 jboolean jni_boolean_addService = (*env)->CallBooleanMethod(env, bluetoothGattServer,
1154 bluetoothGattService);
1156 if (JNI_FALSE == jni_boolean_addService)
1158 OIC_LOG(ERROR, TAG, "Fail to add GATT service");
1159 return CA_STATUS_FAILED;
1162 OIC_LOG(DEBUG, TAG, "OUT - CALEServerAddGattService");
1163 return CA_STATUS_OK;
1166 CAResult_t CALEServerConnect(JNIEnv *env, jobject bluetoothDevice)
1168 OIC_LOG(DEBUG, TAG, "IN - CALEServerConnect");
1169 VERIFY_NON_NULL(env, TAG, "env is null");
1170 VERIFY_NON_NULL(bluetoothDevice, TAG, "bluetoothDevice is null");
1172 if (!CALEIsEnableBTAdapter(env))
1174 OIC_LOG(ERROR, TAG, "BT adapter is not enabled");
1175 return CA_ADAPTER_NOT_ENABLED;
1178 jclass jni_cid_bluetoothGattServer = (*env)->FindClass(env,
1179 "android/bluetooth/BluetoothGattServer");
1180 if (!jni_cid_bluetoothGattServer)
1182 OIC_LOG(ERROR, TAG, "jni_cid_bluetoothGattServer is null");
1183 return CA_STATUS_FAILED;
1186 jmethodID jni_mid_connect = (*env)->GetMethodID(env, jni_cid_bluetoothGattServer, "connect",
1187 "(Landroid/bluetooth/BluetoothDevice;Z)Z");
1188 if (!jni_mid_connect)
1190 OIC_LOG(ERROR, TAG, "jni_mid_connect is null");
1191 return CA_STATUS_FAILED;
1194 jboolean jni_boolean_connect = (*env)->CallBooleanMethod(env, g_bluetoothGattServer,
1195 jni_mid_connect, bluetoothDevice,
1197 if (JNI_FALSE == jni_boolean_connect)
1199 OIC_LOG(ERROR, TAG, "Fail to connect");
1200 return CA_STATUS_FAILED;
1203 OIC_LOG(DEBUG, TAG, "OUT - CALEServerConnect");
1204 return CA_STATUS_OK;
1207 CAResult_t CALEServerDisconnectAllDevices(JNIEnv *env)
1209 OIC_LOG(DEBUG, TAG, "IN - CALEServerDisconnectAllDevices");
1210 VERIFY_NON_NULL(env, TAG, "env is null");
1212 ca_mutex_lock(g_connectedDeviceListMutex);
1213 if (!g_connectedDeviceList)
1215 OIC_LOG(ERROR, TAG, "g_connectedDeviceList is null");
1216 ca_mutex_unlock(g_connectedDeviceListMutex);
1217 return CA_STATUS_FAILED;
1220 uint32_t length = u_arraylist_length(g_connectedDeviceList);
1221 for (uint32_t index = 0; index < length; index++)
1223 jobject jarrayObj = (jobject) u_arraylist_get(g_connectedDeviceList, index);
1226 OIC_LOG_V(ERROR, TAG, "object[%d] is null", index);
1230 // disconnect for device obj
1231 CAResult_t res = CALEServerDisconnect(env, jarrayObj);
1232 if (CA_STATUS_OK != res)
1234 OIC_LOG_V(ERROR, TAG, "Disconnect for this device[%d] has failed", index);
1239 ca_mutex_unlock(g_connectedDeviceListMutex);
1240 OIC_LOG(DEBUG, TAG, "OUT - CALEServerDisconnectAllDevices");
1241 return CA_STATUS_OK;
1244 CAResult_t CALEServerDisconnect(JNIEnv *env, jobject bluetoothDevice)
1246 OIC_LOG(DEBUG, TAG, "IN - CALEServerDisconnect");
1247 VERIFY_NON_NULL(env, TAG, "env is null");
1248 VERIFY_NON_NULL(bluetoothDevice, TAG, "bluetoothDevice is null");
1250 if (!CALEIsEnableBTAdapter(env))
1252 OIC_LOG(ERROR, TAG, "BT adapter is not enabled");
1253 return CA_ADAPTER_NOT_ENABLED;
1256 jclass jni_cid_bluetoothGattServer = (*env)->FindClass(env,
1257 "android/bluetooth/BluetoothGattServer");
1258 if (!jni_cid_bluetoothGattServer)
1260 OIC_LOG(ERROR, TAG, "jni_cid_bluetoothGattServer is null");
1261 return CA_STATUS_FAILED;
1264 jmethodID jni_mid_cancelConnection = (*env)->GetMethodID(env, jni_cid_bluetoothGattServer,
1266 "(Landroid/bluetooth/BluetoothDevice;)"
1268 if (!jni_mid_cancelConnection)
1270 OIC_LOG(ERROR, TAG, "jni_mid_cancelConnection is null");
1271 return CA_STATUS_FAILED;
1274 (*env)->CallVoidMethod(env, g_bluetoothGattServer, jni_mid_cancelConnection, bluetoothDevice);
1276 if ((*env)->ExceptionCheck(env))
1278 OIC_LOG(ERROR, TAG, "cancelConnection has failed");
1279 (*env)->ExceptionDescribe(env);
1280 (*env)->ExceptionClear(env);
1281 return CA_STATUS_FAILED;
1284 OIC_LOG(DEBUG, TAG, "OUT - CALEServerDisconnect");
1285 return CA_STATUS_OK;
1288 CAResult_t CALEServerGattClose(JNIEnv *env, jobject bluetoothGattServer)
1291 OIC_LOG(DEBUG, TAG, "GattServer Close");
1292 VERIFY_NON_NULL(bluetoothGattServer, TAG, "bluetoothGattServer is null");
1293 VERIFY_NON_NULL(env, TAG, "env is null");
1295 // get BluetoothGatt class
1296 OIC_LOG(DEBUG, TAG, "get BluetoothGatt class");
1297 jclass jni_cid_BluetoothGatt = (*env)->FindClass(env, "android/bluetooth/BluetoothGattServer");
1298 if (!jni_cid_BluetoothGatt)
1300 OIC_LOG(ERROR, TAG, "jni_cid_BluetoothGatt is null");
1301 return CA_STATUS_FAILED;
1304 jmethodID jni_mid_closeGatt = (*env)->GetMethodID(env, jni_cid_BluetoothGatt, "close", "()V");
1305 if (!jni_mid_closeGatt)
1307 OIC_LOG(ERROR, TAG, "jni_mid_closeGatt is null");
1308 return CA_STATUS_OK;
1311 // call disconnect gatt method
1312 OIC_LOG(DEBUG, TAG, "request to close GATT");
1313 (*env)->CallVoidMethod(env, bluetoothGattServer, jni_mid_closeGatt);
1315 if ((*env)->ExceptionCheck(env))
1317 OIC_LOG(ERROR, TAG, "closeGATT has failed");
1318 (*env)->ExceptionDescribe(env);
1319 (*env)->ExceptionClear(env);
1320 return CA_STATUS_FAILED;
1323 return CA_STATUS_OK;
1326 CAResult_t CALEServerSend(JNIEnv *env, jobject bluetoothDevice, jbyteArray responseData)
1328 OIC_LOG(DEBUG, TAG, "IN - CALEServerSend");
1329 VERIFY_NON_NULL(env, TAG, "env is null");
1330 VERIFY_NON_NULL(bluetoothDevice, TAG, "bluetoothDevice is null");
1331 VERIFY_NON_NULL(responseData, TAG, "responseData is null");
1333 if (!CALEIsEnableBTAdapter(env))
1335 OIC_LOG(ERROR, TAG, "BT adapter is not enabled");
1336 return CA_ADAPTER_NOT_ENABLED;
1339 jobject responseChar = CALEServerSetResponseData(env, responseData);
1342 OIC_LOG(ERROR, TAG, "responseChar is null");
1343 return CA_STATUS_FAILED;
1346 CAResult_t result = CALEServerSendResponseData(env, bluetoothDevice, responseChar);
1347 if (CA_STATUS_OK != result)
1349 OIC_LOG(ERROR, TAG, "Fail to send response data");
1353 OIC_LOG(DEBUG, TAG, "OUT - CALEServerSend");
1357 CAResult_t CALEServerInitialize(ca_thread_pool_t handle)
1359 OIC_LOG(DEBUG, TAG, "IN - CALEServerInitialize");
1361 CALeServerJniInit();
1365 OIC_LOG(ERROR, TAG, "g_jvm is null");
1366 return CA_STATUS_FAILED;
1369 bool isAttached = false;
1371 jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
1374 OIC_LOG(INFO, TAG, "Could not get JNIEnv pointer");
1375 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
1379 OIC_LOG(ERROR, TAG, "AttachCurrentThread has failed");
1380 return CA_STATUS_FAILED;
1385 CAResult_t ret = CALECheckPlatformVersion(env, 21);
1386 if (CA_STATUS_OK != ret)
1388 OIC_LOG(ERROR, TAG, "it is not supported");
1392 (*g_jvm)->DetachCurrentThread(g_jvm);
1397 g_threadPoolHandle = handle;
1399 ret = CALEServerInitMutexVaraibles();
1400 if (CA_STATUS_OK != ret)
1402 OIC_LOG(ERROR, TAG, "CALEServerInitMutexVaraibles has failed");
1406 (*g_jvm)->DetachCurrentThread(g_jvm);
1408 return CA_STATUS_FAILED;
1411 CALEServerJNISetContext();
1412 CALEServerCreateCachedDeviceList();
1414 ret = CALEServerCreateJniInterfaceObject();
1415 if (CA_STATUS_OK != ret)
1417 OIC_LOG(ERROR, TAG, "CALEServerCreateJniInterfaceObject has failed");
1421 (*g_jvm)->DetachCurrentThread(g_jvm);
1423 return CA_STATUS_FAILED;
1428 (*g_jvm)->DetachCurrentThread(g_jvm);
1431 g_isInitializedServer = true;
1432 OIC_LOG(DEBUG, TAG, "OUT - CALEServerInitialize");
1433 return CA_STATUS_OK;
1436 void CALEServerTerminate()
1438 OIC_LOG(DEBUG, TAG, "IN - CALEServerTerminate");
1442 OIC_LOG(ERROR, TAG, "g_jvm is null");
1446 bool isAttached = false;
1448 jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
1451 OIC_LOG(ERROR, TAG, "Could not get JNIEnv pointer");
1452 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
1456 OIC_LOG(ERROR, TAG, "AttachCurrentThread has failed");
1462 CAResult_t ret = CALEServerStopMulticastServer(0);
1463 if (CA_STATUS_OK != ret)
1465 OIC_LOG(ERROR, TAG, "CALEServerStopMulticastServer has failed");
1468 ret = CALEServerDisconnectAllDevices(env);
1469 if (CA_STATUS_OK != ret)
1471 OIC_LOG(ERROR, TAG, "CALEServerDisconnectAllDevices has failed");
1474 ret = CALEServerRemoveAllDevices(env);
1475 if (CA_STATUS_OK != ret)
1477 OIC_LOG(ERROR, TAG, "CALEServerRemoveAllDevices has failed");
1480 if (g_leAdvertiseCallback)
1482 (*env)->DeleteGlobalRef(env, g_leAdvertiseCallback);
1485 if (g_bluetoothGattServer)
1487 (*env)->DeleteGlobalRef(env, g_bluetoothGattServer);
1490 if (g_bluetoothGattServerCallback)
1492 (*env)->DeleteGlobalRef(env, g_bluetoothGattServerCallback);
1495 CALEServerTerminateMutexVaraibles();
1496 CALEServerTerminateConditionVaraibles();
1498 g_isStartServer = false;
1499 g_isInitializedServer = false;
1503 (*g_jvm)->DetachCurrentThread(g_jvm);
1506 OIC_LOG(DEBUG, TAG, "OUT - CALEServerTerminate");
1509 CAResult_t CALEServerSendUnicastMessage(const char* address, const uint8_t* data, uint32_t dataLen)
1511 OIC_LOG_V(DEBUG, TAG, "IN - CALEServerSendUnicastMessage(%s, %p)", address, data);
1512 VERIFY_NON_NULL(address, TAG, "address is null");
1513 VERIFY_NON_NULL(data, TAG, "data is null");
1517 OIC_LOG(ERROR, TAG, "g_jvm is null");
1518 return CA_STATUS_FAILED;
1521 bool isAttached = false;
1523 jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
1526 OIC_LOG(ERROR, TAG, "Could not get JNIEnv pointer");
1527 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
1531 OIC_LOG(ERROR, TAG, "AttachCurrentThread has failed");
1532 return CA_STATUS_FAILED;
1537 CAResult_t ret = CALEServerSendUnicastMessageImpl(env, address, data, dataLen);
1538 if (CA_STATUS_OK != ret)
1540 OIC_LOG(ERROR, TAG, "CALEServerSendUnicastMessageImpl has failed");
1545 (*g_jvm)->DetachCurrentThread(g_jvm);
1548 OIC_LOG(DEBUG, TAG, "OUT - CALEServerSendUnicastMessage");
1552 CAResult_t CALEServerSendMulticastMessage(const uint8_t* data, uint32_t dataLen)
1554 OIC_LOG_V(DEBUG, TAG, "IN - CALEServerSendMulticastMessage(%p)", data);
1555 VERIFY_NON_NULL(data, TAG, "data is null");
1559 OIC_LOG(ERROR, TAG, "g_jvm is null");
1560 return CA_STATUS_FAILED;
1563 bool isAttached = false;
1565 jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
1568 OIC_LOG(ERROR, TAG, "Could not get JNIEnv pointer");
1569 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
1573 OIC_LOG(ERROR, TAG, "AttachCurrentThread has failed");
1574 return CA_STATUS_FAILED;
1579 CAResult_t ret = CALEServerSendMulticastMessageImpl(env, data, dataLen);
1580 if (CA_STATUS_OK != ret)
1582 OIC_LOG(ERROR, TAG, "CALEServerSendMulticastMessageImpl has failed");
1587 (*g_jvm)->DetachCurrentThread(g_jvm);
1590 OIC_LOG(DEBUG, TAG, "OUT - CALEServerSendMulticastMessage");
1594 CAResult_t CALEServerStartMulticastServer()
1596 OIC_LOG(DEBUG, TAG, "IN - CALEServerStartMulticastServer");
1598 if (!g_isInitializedServer)
1600 OIC_LOG(INFO, TAG, "server is not initialized");
1601 return CA_STATUS_FAILED;
1604 if (g_isStartServer)
1606 OIC_LOG(INFO, TAG, "server is already started..it will be skipped");
1607 return CA_STATUS_FAILED;
1612 OIC_LOG(ERROR, TAG, "g_jvm is null");
1613 return CA_STATUS_FAILED;
1616 bool isAttached = false;
1618 jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
1621 OIC_LOG(ERROR, TAG, "Could not get JNIEnv pointer");
1622 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
1626 OIC_LOG(ERROR, TAG, "AttachCurrentThread has failed");
1627 return CA_STATUS_FAILED;
1632 g_isStartServer = true;
1634 // start gatt server
1635 CAResult_t ret = CALEServerStartGattServer(env, g_bluetoothGattServerCallback);
1636 if (CA_STATUS_OK != ret)
1638 OIC_LOG(ERROR, TAG, "Fail to start gatt server");
1643 ret = CALEServerStartAdvertise(env, g_leAdvertiseCallback);
1644 if (CA_STATUS_OK != ret)
1646 OIC_LOG(ERROR, TAG, "CALEServerStartAdvertise has failed");
1651 (*g_jvm)->DetachCurrentThread(g_jvm);
1654 OIC_LOG(DEBUG, TAG, "OUT - CALEServerStartMulticastServer");
1658 CAResult_t CALEServerStopMulticastServer()
1660 OIC_LOG(DEBUG, TAG, "IN - CALEServerStopMulticastServer");
1662 if (false == g_isStartServer)
1664 OIC_LOG(INFO, TAG, "server is already stopped..it will be skipped");
1665 return CA_STATUS_FAILED;
1670 OIC_LOG(ERROR, TAG, "g_jvm is null");
1671 return CA_STATUS_FAILED;
1674 bool isAttached = false;
1676 jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
1679 OIC_LOG(ERROR, TAG, "Could not get JNIEnv pointer");
1680 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
1684 OIC_LOG(ERROR, TAG, "AttachCurrentThread has failed");
1685 return CA_STATUS_FAILED;
1690 CAResult_t ret = CALEServerStopAdvertise(env, g_leAdvertiseCallback);
1691 if (CA_STATUS_OK != ret)
1693 OIC_LOG(ERROR, TAG, "CALEServerStopAdvertise has failed");
1696 g_isStartServer = false;
1700 (*g_jvm)->DetachCurrentThread(g_jvm);
1703 OIC_LOG(DEBUG, TAG, "OUT - CALEServerStopMulticastServer");
1707 void CALEServerSetCallback(CAPacketReceiveCallback callback)
1709 OIC_LOG(DEBUG, TAG, "CALEServerSetCallback");
1710 g_packetReceiveCallback = callback;
1713 CAResult_t CALEServerSendUnicastMessageImpl(JNIEnv *env, const char* address, const uint8_t* data,
1716 OIC_LOG_V(DEBUG, TAG, "IN - CALEServerSendUnicastMessageImpl, address: %s, data: %p",
1718 VERIFY_NON_NULL(env, TAG, "env is null");
1719 VERIFY_NON_NULL(address, TAG, "address is null");
1720 VERIFY_NON_NULL(data, TAG, "data is null");
1722 if (!g_connectedDeviceList)
1724 OIC_LOG(ERROR, TAG, "g_connectedDeviceList is null");
1725 return CA_STATUS_FAILED;
1728 jobject jni_obj_bluetoothDevice = NULL;
1729 uint32_t length = u_arraylist_length(g_connectedDeviceList);
1730 for (uint32_t index = 0; index < length; index++)
1732 OIC_LOG(DEBUG, TAG, "check device address");
1733 jobject jarrayObj = (jobject) u_arraylist_get(g_connectedDeviceList, index);
1736 OIC_LOG(ERROR, TAG, "jarrayObj is null");
1737 return CA_STATUS_FAILED;
1740 jstring jni_setAddress = CALEGetAddressFromBTDevice(env, jarrayObj);
1741 if (!jni_setAddress)
1743 OIC_LOG(ERROR, TAG, "jni_setAddress is null");
1744 return CA_STATUS_FAILED;
1746 const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
1749 OIC_LOG(ERROR, TAG, "setAddress is null");
1750 return CA_STATUS_FAILED;
1753 OIC_LOG_V(DEBUG, TAG, "setAddress : %s", setAddress);
1754 OIC_LOG_V(DEBUG, TAG, "address : %s", address);
1756 if (!strcmp(setAddress, address))
1758 OIC_LOG(DEBUG, TAG, "found the device");
1759 jni_obj_bluetoothDevice = jarrayObj;
1760 (*env)->ReleaseStringUTFChars(env, jni_setAddress, setAddress);
1763 (*env)->ReleaseStringUTFChars(env, jni_setAddress, setAddress);
1766 if (jni_obj_bluetoothDevice)
1768 jbyteArray jni_bytearr_data = (*env)->NewByteArray(env, dataLen);
1769 (*env)->SetByteArrayRegion(env, jni_bytearr_data, 0, dataLen, (jbyte*) data);
1771 CAResult_t res = CALEServerSend(env, jni_obj_bluetoothDevice, jni_bytearr_data);
1772 if (CA_STATUS_OK != res)
1774 OIC_LOG(ERROR, TAG, "send has failed");
1775 return CA_SEND_FAILED;
1780 OIC_LOG(ERROR, TAG, "There are no device to send in the list");
1781 return CA_STATUS_FAILED;
1784 OIC_LOG(DEBUG, TAG, "OUT - CALEServerSendUnicastMessageImpl");
1785 return CA_STATUS_OK;
1788 CAResult_t CALEServerSendMulticastMessageImpl(JNIEnv *env, const uint8_t *data, uint32_t dataLen)
1790 OIC_LOG_V(DEBUG, TAG, "IN - CALEServerSendMulticastMessageImpl, send to, data: %s", data);
1791 VERIFY_NON_NULL(env, TAG, "env is null");
1792 VERIFY_NON_NULL(data, TAG, "data is null");
1794 if (!g_connectedDeviceList)
1796 OIC_LOG(ERROR, TAG, "g_connectedDeviceList is null");
1797 return CA_STATUS_FAILED;
1800 uint32_t length = u_arraylist_length(g_connectedDeviceList);
1801 for (uint32_t index = 0; index < length; index++)
1803 jobject jarrayObj = (jobject) u_arraylist_get(g_connectedDeviceList, index);
1806 OIC_LOG(ERROR, TAG, "jarrayObj is null");
1807 return CA_STATUS_FAILED;
1810 // send data for all device
1811 jbyteArray jni_bytearr_data = (*env)->NewByteArray(env, dataLen);
1812 (*env)->SetByteArrayRegion(env, jni_bytearr_data, 0, dataLen, (jbyte*) data);
1813 CAResult_t res = CALEServerSend(env, jarrayObj, jni_bytearr_data);
1814 if (CA_STATUS_OK != res)
1816 OIC_LOG(ERROR, TAG, "send has failed");
1817 return CA_SEND_FAILED;
1821 OIC_LOG(DEBUG, TAG, "OUT - CALEServerSendMulticastMessageImpl");
1822 return CA_STATUS_OK;
1825 void CALEServerCreateCachedDeviceList()
1827 OIC_LOG(DEBUG, TAG, "IN - CALEServerCreateCachedDeviceList");
1829 ca_mutex_lock(g_connectedDeviceListMutex);
1830 // create new object array
1831 if (!g_connectedDeviceList)
1833 OIC_LOG(DEBUG, TAG, "Create device list");
1834 g_connectedDeviceList = u_arraylist_create();
1836 ca_mutex_unlock(g_connectedDeviceListMutex);
1838 OIC_LOG(DEBUG, TAG, "OUT - CALEServerCreateCachedDeviceList");
1841 bool CALEServerIsDeviceInList(JNIEnv *env, const char* remoteAddress)
1843 OIC_LOG(DEBUG, TAG, "IN - CALEServerIsDeviceInList");
1844 VERIFY_NON_NULL_RET(env, TAG, "env is null", false);
1845 VERIFY_NON_NULL_RET(remoteAddress, TAG, "remoteAddress is null", false);
1847 if (!g_connectedDeviceList)
1849 OIC_LOG(ERROR, TAG, "list is null");
1853 uint32_t length = u_arraylist_length(g_connectedDeviceList);
1854 for (uint32_t index = 0; index < length; index++)
1856 jobject jarrayObj = (jobject) u_arraylist_get(g_connectedDeviceList, index);
1860 OIC_LOG(ERROR, TAG, "jarrayObj is null");
1864 jstring jni_setAddress = CALEGetAddressFromBTDevice(env, jarrayObj);
1865 if (!jni_setAddress)
1867 OIC_LOG(ERROR, TAG, "jni_setAddress is null");
1871 const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
1874 OIC_LOG(ERROR, TAG, "setAddress is null");
1878 if (!strcmp(remoteAddress, setAddress))
1880 OIC_LOG(ERROR, TAG, "the device is already set");
1881 (*env)->ReleaseStringUTFChars(env, jni_setAddress, setAddress);
1886 (*env)->ReleaseStringUTFChars(env, jni_setAddress, setAddress);
1891 OIC_LOG(DEBUG, TAG, "there are no device in the list");
1892 OIC_LOG(DEBUG, TAG, "OUT - CALEServerCreateCachedDeviceList");
1896 CAResult_t CALEServerAddDeviceToList(JNIEnv *env, jobject device)
1898 OIC_LOG(DEBUG, TAG, "IN - CALEServerAddDeviceToList");
1899 VERIFY_NON_NULL(device, TAG, "device is null");
1900 VERIFY_NON_NULL(env, TAG, "env is null");
1902 ca_mutex_lock(g_connectedDeviceListMutex);
1904 if (!g_connectedDeviceList)
1906 OIC_LOG(ERROR, TAG, "list is null");
1907 ca_mutex_unlock(g_connectedDeviceListMutex);
1908 return CA_STATUS_FAILED;
1911 jstring jni_remoteAddress = CALEGetAddressFromBTDevice(env, device);
1912 if (!jni_remoteAddress)
1914 OIC_LOG(ERROR, TAG, "jni_remoteAddress is null");
1915 ca_mutex_unlock(g_connectedDeviceListMutex);
1916 return CA_STATUS_FAILED;
1919 const char* remoteAddress = (*env)->GetStringUTFChars(env, jni_remoteAddress, NULL);
1922 OIC_LOG(ERROR, TAG, "remoteAddress is null");
1923 ca_mutex_unlock(g_connectedDeviceListMutex);
1924 return CA_STATUS_FAILED;
1927 if (false == CALEServerIsDeviceInList(env, remoteAddress))
1929 jobject jni_obj_device = (*env)->NewGlobalRef(env, device);
1930 u_arraylist_add(g_connectedDeviceList, jni_obj_device);
1931 OIC_LOG_V(DEBUG, TAG, "Set the object to ArrayList as Element : %s", remoteAddress);
1934 (*env)->ReleaseStringUTFChars(env, jni_remoteAddress, remoteAddress);
1935 ca_mutex_unlock(g_connectedDeviceListMutex);
1936 OIC_LOG(DEBUG, TAG, "OUT - CALEServerAddDeviceToList");
1937 return CA_STATUS_OK;
1940 CAResult_t CALEServerRemoveAllDevices(JNIEnv *env)
1942 OIC_LOG(DEBUG, TAG, "IN - CALEServerRemoveAllDevices");
1943 VERIFY_NON_NULL(env, TAG, "env is null");
1945 ca_mutex_lock(g_connectedDeviceListMutex);
1946 if (!g_connectedDeviceList)
1948 OIC_LOG(ERROR, TAG, "g_connectedDeviceList is null");
1949 ca_mutex_unlock(g_connectedDeviceListMutex);
1950 return CA_STATUS_FAILED;
1953 uint32_t length = u_arraylist_length(g_connectedDeviceList);
1954 for (uint32_t index = 0; index < length; index++)
1956 jobject jarrayObj = (jobject) u_arraylist_get(g_connectedDeviceList, index);
1959 (*env)->DeleteGlobalRef(env, jarrayObj);
1963 OICFree(g_connectedDeviceList);
1964 g_connectedDeviceList = NULL;
1965 ca_mutex_unlock(g_connectedDeviceListMutex);
1967 OIC_LOG(DEBUG, TAG, "OUT - CALEServerRemoveAllDevices");
1968 return CA_STATUS_OK;
1971 CAResult_t CALEServerRemoveDevice(JNIEnv *env, jstring address)
1973 OIC_LOG(DEBUG, TAG, "IN CALEServerRemoveDevice");
1974 VERIFY_NON_NULL(env, TAG, "env is null");
1975 VERIFY_NON_NULL(address, TAG, "address is null");
1977 ca_mutex_lock(g_connectedDeviceListMutex);
1978 if (!g_connectedDeviceList)
1980 OIC_LOG(ERROR, TAG, "no deviceList");
1981 ca_mutex_unlock(g_connectedDeviceListMutex);
1982 return CA_STATUS_FAILED;
1985 uint32_t length = u_arraylist_length(g_connectedDeviceList);
1986 for (uint32_t index = 0; index < length; index++)
1988 jobject jarrayObj = (jobject) u_arraylist_get(g_connectedDeviceList, index);
1992 jstring jni_setAddress = CALEGetAddressFromBTDevice(env, jarrayObj);
1993 if (!jni_setAddress)
1995 OIC_LOG(ERROR, TAG, "wrong device address");
1998 const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
2001 OIC_LOG(ERROR, TAG, "setAddress is null");
2005 const char* remoteAddress = (*env)->GetStringUTFChars(env, address, NULL);
2008 OIC_LOG(ERROR, TAG, "remoteAddress is null");
2009 (*env)->ReleaseStringUTFChars(env, jni_setAddress, setAddress);
2013 if (!strcmp(setAddress, remoteAddress))
2015 OIC_LOG_V(DEBUG, TAG, "device address : %s", remoteAddress);
2017 (*env)->ReleaseStringUTFChars(env, jni_setAddress, setAddress);
2018 (*env)->ReleaseStringUTFChars(env, address, remoteAddress);
2019 (*env)->DeleteGlobalRef(env, jarrayObj);
2021 if (NULL == u_arraylist_remove(g_connectedDeviceList, index))
2023 OIC_LOG(ERROR, TAG, "List removal failed.");
2024 ca_mutex_unlock(g_connectedDeviceListMutex);
2025 return CA_STATUS_FAILED;
2027 ca_mutex_unlock(g_connectedDeviceListMutex);
2028 return CA_STATUS_OK;
2030 (*env)->ReleaseStringUTFChars(env, jni_setAddress, setAddress);
2031 (*env)->ReleaseStringUTFChars(env, address, remoteAddress);
2035 ca_mutex_unlock(g_connectedDeviceListMutex);
2037 OIC_LOG(DEBUG, TAG, "there are no device in the device list");
2039 OIC_LOG(DEBUG, TAG, "IN CALEServerRemoveDevice");
2040 return CA_STATUS_FAILED;
2043 JNIEXPORT void JNICALL
2044 Java_org_iotivity_ca_CaLeServerInterface_caLeRegisterGattServerCallback(JNIEnv *env, jobject obj,
2047 OIC_LOG(DEBUG, TAG, "Register Le Gatt Server Callback");
2048 VERIFY_NON_NULL_VOID(env, TAG, "env");
2049 VERIFY_NON_NULL_VOID(obj, TAG, "obj");
2050 VERIFY_NON_NULL_VOID(callback, TAG, "callback");
2052 g_bluetoothGattServerCallback = (*env)->NewGlobalRef(env, callback);
2055 JNIEXPORT void JNICALL
2056 Java_org_iotivity_ca_CaLeServerInterface_caLeRegisterBluetoothLeAdvertiseCallback(JNIEnv *env,
2060 OIC_LOG(DEBUG, TAG, "Register Le Advertise Callback");
2061 VERIFY_NON_NULL_VOID(env, TAG, "env");
2062 VERIFY_NON_NULL_VOID(obj, TAG, "obj");
2063 VERIFY_NON_NULL_VOID(callback, TAG, "callback");
2065 g_leAdvertiseCallback = (*env)->NewGlobalRef(env, callback);
2068 JNIEXPORT void JNICALL
2069 Java_org_iotivity_ca_CaLeServerInterface_caLeGattServerConnectionStateChangeCallback(
2070 JNIEnv *env, jobject obj, jobject device, jint status, jint newState)
2072 OIC_LOG(DEBUG, TAG, " Gatt Server ConnectionStateChange Callback");
2073 OIC_LOG_V(DEBUG, TAG, "New connection State: %d", newState);
2075 VERIFY_NON_NULL_VOID(env, TAG, "env");
2076 VERIFY_NON_NULL_VOID(obj, TAG, "obj");
2077 VERIFY_NON_NULL_VOID(device, TAG, "device");
2079 jclass jni_cid_bluetoothProfile = (*env)->FindClass(env, "android/bluetooth/BluetoothProfile");
2080 if (!jni_cid_bluetoothProfile)
2082 OIC_LOG(ERROR, TAG, "jni_cid_bluetoothProfile is null");
2086 jfieldID jni_fid_state_connected = (*env)->GetStaticFieldID(env, jni_cid_bluetoothProfile,
2087 "STATE_CONNECTED", "I");
2088 if(!jni_fid_state_connected)
2090 OIC_LOG(ERROR, TAG, "jni_fid_state_connected is null");
2094 jfieldID jni_fid_state_disconnected = (*env)->GetStaticFieldID(env, jni_cid_bluetoothProfile,
2095 "STATE_DISCONNECTED", "I");
2096 if(!jni_fid_state_disconnected)
2098 OIC_LOG(ERROR, TAG, "jni_fid_state_disconnected is null");
2103 jint jni_int_state_connected = (*env)->GetStaticIntField(env, jni_cid_bluetoothProfile,
2104 jni_fid_state_connected);
2106 // STATE_DISCONNECTED
2107 jint jni_int_state_disconnected = (*env)->GetStaticIntField(env, jni_cid_bluetoothProfile,
2108 jni_fid_state_disconnected);
2110 if (newState == jni_int_state_connected)
2113 OIC_LOG(DEBUG, TAG, "LE CONNECTED");
2115 jstring jni_remoteAddress = CALEGetAddressFromBTDevice(env, device);
2116 if (!jni_remoteAddress)
2118 OIC_LOG(ERROR, TAG, "jni_remoteAddress is null");
2122 const char* remoteAddress = (*env)->GetStringUTFChars(env, jni_remoteAddress, NULL);
2125 OIC_LOG(ERROR, TAG, "remoteAddress is null");
2129 if (false == CALEServerIsDeviceInList(env, remoteAddress))
2131 OIC_LOG(DEBUG, TAG, "add connected device to cache");
2132 CALEServerAddDeviceToList(env, device);
2134 (*env)->ReleaseStringUTFChars(env, jni_remoteAddress, remoteAddress);
2136 else if (newState == jni_int_state_disconnected)
2138 OIC_LOG(DEBUG, TAG, "LE DISCONNECTED");
2139 CAResult_t res = CALEServerGattClose(env, g_bluetoothGattServer);
2140 if (CA_STATUS_OK != res)
2142 OIC_LOG(ERROR, TAG, "CALEServerGattClose has failed");
2147 OIC_LOG_V(DEBUG, TAG, "LE Connection state is [newState : %d, status %d]", newState,
2152 JNIEXPORT void JNICALL
2153 Java_org_iotivity_ca_CaLeServerInterface_caLeGattServerServiceAddedCallback(JNIEnv *env,
2156 jobject gattService)
2158 VERIFY_NON_NULL_VOID(env, TAG, "env");
2159 VERIFY_NON_NULL_VOID(obj, TAG, "obj");
2160 VERIFY_NON_NULL_VOID(gattService, TAG, "gattService");
2162 OIC_LOG_V(DEBUG, TAG, "Gatt Service Added Callback(%d)", status);
2165 JNIEXPORT void JNICALL
2166 Java_org_iotivity_ca_CaLeServerInterface_caLeGattServerCharacteristicReadRequestCallback(
2167 JNIEnv *env, jobject obj, jobject device, jbyteArray data)
2169 OIC_LOG(DEBUG, TAG, " Gatt Server Characteristic Read Request Callback");
2170 VERIFY_NON_NULL_VOID(env, TAG, "env");
2171 VERIFY_NON_NULL_VOID(obj, TAG, "obj");
2172 VERIFY_NON_NULL_VOID(device, TAG, "device");
2173 VERIFY_NON_NULL_VOID(data, TAG, "data");
2176 JNIEXPORT void JNICALL
2177 Java_org_iotivity_ca_CaLeServerInterface_caLeGattServerCharacteristicWriteRequestCallback(
2178 JNIEnv *env, jobject obj, jobject device, jbyteArray data)
2180 OIC_LOG_V(DEBUG, TAG, "Gatt Server Characteristic Write Request Callback");
2181 VERIFY_NON_NULL_VOID(env, TAG, "env");
2182 VERIFY_NON_NULL_VOID(obj, TAG, "obj");
2183 VERIFY_NON_NULL_VOID(device, TAG, "device");
2184 VERIFY_NON_NULL_VOID(data, TAG, "data");
2186 // get Byte Array and covert to uint8_t*
2187 jint length = (*env)->GetArrayLength(env, data);
2190 jbyte *jni_byte_requestData = (jbyte *) (*env)->GetByteArrayElements(env, data, &isCopy);
2192 uint8_t* requestData = NULL;
2193 requestData = OICMalloc(length);
2196 OIC_LOG(ERROR, TAG, "requestData is null");
2200 memcpy(requestData, jni_byte_requestData, length);
2201 (*env)->ReleaseByteArrayElements(env, data, jni_byte_requestData, JNI_ABORT);
2203 jstring jni_address = CALEGetAddressFromBTDevice(env, device);
2206 OIC_LOG(ERROR, TAG, "jni_address is null");
2207 OICFree(requestData);
2211 const char* address = (*env)->GetStringUTFChars(env, jni_address, NULL);
2214 OIC_LOG(ERROR, TAG, "address is null");
2215 OICFree(requestData);
2219 OIC_LOG_V(DEBUG, TAG, "remote device address : %s, %p, %d", address, requestData, length);
2221 ca_mutex_lock(g_bleClientBDAddressMutex);
2222 uint32_t sentLength = 0;
2223 g_CABLEServerDataReceivedCallback(address, requestData, length,
2225 ca_mutex_unlock(g_bleClientBDAddressMutex);
2227 (*env)->ReleaseStringUTFChars(env, jni_address, address);
2230 JNIEXPORT void JNICALL
2231 Java_org_iotivity_ca_CaLeServerInterface_caLeGattServerNotificationSentCallback(JNIEnv *env,
2236 VERIFY_NON_NULL_VOID(env, TAG, "env");
2237 VERIFY_NON_NULL_VOID(obj, TAG, "obj");
2238 VERIFY_NON_NULL_VOID(device, TAG, "device");
2240 OIC_LOG_V(DEBUG, TAG, "Gatt Server Notification Sent Callback(%d)",
2244 JNIEXPORT void JNICALL
2245 Java_org_iotivity_ca_CaLeServerInterface_caLeAdvertiseStartSuccessCallback(JNIEnv *env,
2247 jobject settingsInEffect)
2249 VERIFY_NON_NULL_VOID(env, TAG, "env");
2250 VERIFY_NON_NULL_VOID(obj, TAG, "obj");
2251 VERIFY_NON_NULL_VOID(settingsInEffect, TAG, "settingsInEffect");
2253 OIC_LOG(DEBUG, TAG, "LE Advertise Start Success Callback");
2256 JNIEXPORT void JNICALL
2257 Java_org_iotivity_ca_CaLeServerInterface_caLeAdvertiseStartFailureCallback(JNIEnv *env,
2261 VERIFY_NON_NULL_VOID(env, TAG, "env");
2262 VERIFY_NON_NULL_VOID(obj, TAG, "obj");
2264 OIC_LOG_V(ERROR, TAG, "LE Advertise Start Failure Callback(%d)",
2272 CAResult_t CAStartLEGattServer()
2274 OIC_LOG(DEBUG, TAG, "IN");
2276 CAResult_t ret = CALEServerInitMutexVaraibles();
2277 if (CA_STATUS_OK != ret)
2279 OIC_LOG(ERROR, TAG, "CALEServerInitMutexVaraibles has failed!");
2280 CALEServerTerminateMutexVaraibles();
2281 return CA_SERVER_NOT_STARTED;
2284 ret = CALEServerInitConditionVaraibles();
2285 if (CA_STATUS_OK != ret)
2287 OIC_LOG(ERROR, TAG, "CALEServerInitConditionVaraibles has failed!");
2288 CALEServerTerminateConditionVaraibles();
2289 return CA_SERVER_NOT_STARTED;
2292 // start gatt service
2293 CALEServerStartMulticastServer();
2295 OIC_LOG(DEBUG, TAG, "OUT");
2296 return CA_STATUS_OK;
2299 CAResult_t CAStopLEGattServer()
2301 OIC_LOG(DEBUG, TAG, "IN");
2303 OIC_LOG(DEBUG, TAG, "OUT");
2304 return CA_STATUS_OK;
2307 void CATerminateLEGattServer()
2309 OIC_LOG(DEBUG, TAG, "IN");
2311 OIC_LOG(DEBUG, TAG, "Terminat Gatt Server");
2312 CALEServerTerminate();
2314 OIC_LOG(DEBUG, TAG, "OUT");
2317 void CASetLEReqRespServerCallback(CABLEDataReceivedCallback callback)
2319 OIC_LOG(DEBUG, TAG, "IN");
2321 ca_mutex_lock(g_bleReqRespCbMutex);
2322 g_CABLEServerDataReceivedCallback = callback;
2323 ca_mutex_unlock(g_bleReqRespCbMutex);
2325 OIC_LOG(DEBUG, TAG, "OUT");
2328 void CASetBLEServerErrorHandleCallback(CABLEErrorHandleCallback callback)
2330 g_serverErrorCallback = callback;
2333 CAResult_t CAUpdateCharacteristicsToGattClient(const char *address,
2334 const uint8_t *charValue,
2335 uint32_t charValueLen)
2337 CAResult_t result = CA_SEND_FAILED;
2338 OIC_LOG(DEBUG, TAG, "IN");
2339 VERIFY_NON_NULL(address, TAG, "env is null");
2340 VERIFY_NON_NULL(charValue, TAG, "device is null");
2344 OIC_LOG(DEBUG, TAG, "CALEServerSendUnicastData");
2345 result = CALEServerSendUnicastMessage(address, charValue, charValueLen);
2348 OIC_LOG(DEBUG, TAG, "OUT");
2353 CAResult_t CAUpdateCharacteristicsToAllGattClients(const uint8_t *charValue,
2354 uint32_t charValueLen)
2356 OIC_LOG(DEBUG, TAG, "IN");
2357 VERIFY_NON_NULL(charValue, TAG, "device is null");
2359 OIC_LOG(DEBUG, TAG, "CALEServerSendMulticastMessage");
2360 CAResult_t result = CALEServerSendMulticastMessage(charValue, charValueLen);
2362 OIC_LOG(DEBUG, TAG, "OUT");
2366 void CASetLEServerThreadPoolHandle(ca_thread_pool_t handle)
2368 OIC_LOG(DEBUG, TAG, "IN");
2370 CALEServerInitialize(handle);
2372 OIC_LOG(DEBUG, TAG, "OUT");
2375 CAResult_t CALEServerInitMutexVaraibles()
2377 OIC_LOG(DEBUG, TAG, "IN");
2378 if (NULL == g_bleReqRespCbMutex)
2380 g_bleReqRespCbMutex = ca_mutex_new();
2381 if (NULL == g_bleReqRespCbMutex)
2383 OIC_LOG(ERROR, TAG, "ca_mutex_new has failed");
2384 return CA_STATUS_FAILED;
2388 if (NULL == g_bleClientBDAddressMutex)
2390 g_bleClientBDAddressMutex = ca_mutex_new();
2391 if (NULL == g_bleClientBDAddressMutex)
2393 OIC_LOG(ERROR, TAG, "ca_mutex_new has failed");
2394 return CA_STATUS_FAILED;
2398 if (NULL == g_connectedDeviceListMutex)
2400 g_connectedDeviceListMutex = ca_mutex_new();
2401 if (NULL == g_connectedDeviceListMutex)
2403 OIC_LOG(ERROR, TAG, "ca_mutex_new has failed");
2404 return CA_STATUS_FAILED;
2408 OIC_LOG(DEBUG, TAG, "OUT");
2409 return CA_STATUS_OK;
2412 CAResult_t CALEServerInitConditionVaraibles()
2414 OIC_LOG(DEBUG, TAG, "this method is not supported");
2415 return CA_STATUS_OK;
2418 void CALEServerTerminateMutexVaraibles()
2420 OIC_LOG(DEBUG, TAG, "IN");
2422 ca_mutex_free(g_bleReqRespCbMutex);
2423 g_bleReqRespCbMutex = NULL;
2425 ca_mutex_free(g_bleClientBDAddressMutex);
2426 g_bleClientBDAddressMutex = NULL;
2428 ca_mutex_free(g_connectedDeviceListMutex);
2429 g_connectedDeviceListMutex = NULL;
2431 OIC_LOG(DEBUG, TAG, "OUT");
2434 void CALEServerTerminateConditionVaraibles()
2436 OIC_LOG(DEBUG, TAG, "this method is not supported");