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 #ifdef USE_PROPERTY_WRITE_RESPONSE
890 jfieldID jni_fid_writeProperties = (*env)->GetStaticFieldID(env,
891 jni_cid_bluetoothGattCharacteristic,
892 "PROPERTY_WRITE", "I");
894 jfieldID jni_fid_writeProperties = (*env)->GetStaticFieldID(env,
895 jni_cid_bluetoothGattCharacteristic,
896 "PROPERTY_WRITE_NO_RESPONSE", "I");
899 if (!jni_fid_writeProperties)
901 OIC_LOG(ERROR, TAG, "jni_fid_writeProperties is null");
905 jfieldID jni_fid_readPermissions = (*env)->GetStaticFieldID(env,
906 jni_cid_bluetoothGattCharacteristic,
907 "PERMISSION_READ", "I");
908 if (!jni_fid_readPermissions)
910 OIC_LOG(ERROR, TAG, "jni_fid_readPermissions is null");
914 jfieldID jni_fid_writePermissions = (*env)->GetStaticFieldID(
915 env, jni_cid_bluetoothGattCharacteristic, "PERMISSION_WRITE", "I");
916 if (!jni_fid_writePermissions)
918 OIC_LOG(ERROR, TAG, "jni_fid_writePermissions is null");
922 jmethodID jni_mid_bluetoothGattService = (*env)->GetMethodID(env, jni_cid_bluetoothGattService,
923 "<init>", "(Ljava/util/UUID;I)V");
924 if (!jni_mid_bluetoothGattService)
926 OIC_LOG(ERROR, TAG, "jni_mid_bluetoothGattService is null");
930 jmethodID jni_mid_addCharacteristic = (*env)->GetMethodID(env, jni_cid_bluetoothGattService,
932 "(Landroid/bluetooth/"
933 "BluetoothGattCharacteristic;)Z");
934 if (!jni_mid_addCharacteristic)
936 OIC_LOG(ERROR, TAG, "jni_mid_addCharacteristic is null");
940 jmethodID jni_mid_bluetoothGattCharacteristic = (*env)->GetMethodID(
941 env, jni_cid_bluetoothGattCharacteristic, "<init>", "(Ljava/util/UUID;II)V");
942 if (!jni_mid_bluetoothGattCharacteristic)
944 OIC_LOG(ERROR, TAG, "jni_mid_bluetoothGattCharacteristic is null");
948 jobject jni_obj_serviceUUID = CALEGetUuidFromString(env, OIC_GATT_SERVICE_UUID);
949 if (!jni_obj_serviceUUID)
951 OIC_LOG(ERROR, TAG, "jni_obj_serviceUUID is null");
955 jint jni_int_serviceType = (*env)->GetStaticIntField(env, jni_cid_bluetoothGattService,
956 jni_fid_serviceType);
957 jobject jni_bluetoothGattService = (*env)->NewObject(env, jni_cid_bluetoothGattService,
958 jni_mid_bluetoothGattService,
959 jni_obj_serviceUUID, jni_int_serviceType);
960 if (!jni_bluetoothGattService)
962 OIC_LOG(ERROR, TAG, "jni_bluetoothGattService is null");
966 jobject jni_obj_readUuid = CALEGetUuidFromString(env, OIC_GATT_CHARACTERISTIC_RESPONSE_UUID);
967 if (!jni_obj_readUuid)
969 OIC_LOG(ERROR, TAG, "jni_obj_readUuid is null");
973 jint jni_int_readProperties = (*env)->GetStaticIntField(env,
974 jni_cid_bluetoothGattCharacteristic,
975 jni_fid_readProperties);
977 jint jni_int_readPermissions = (*env)->GetStaticIntField(env,
978 jni_cid_bluetoothGattCharacteristic,
979 jni_fid_readPermissions);
981 jint jni_int_writePermissions = (*env)->GetStaticIntField(env,
982 jni_cid_bluetoothGattCharacteristic,
983 jni_fid_writePermissions);
985 jobject jni_readCharacteristic = (*env)->NewObject(env, jni_cid_bluetoothGattCharacteristic,
986 jni_mid_bluetoothGattCharacteristic,
987 jni_obj_readUuid, jni_int_readProperties,
988 jni_int_readPermissions|
989 jni_int_writePermissions);
990 if (!jni_readCharacteristic)
992 OIC_LOG(ERROR, TAG, "jni_readCharacteristic is null");
996 jboolean jni_boolean_addReadCharacteristic = (*env)->CallBooleanMethod(
997 env, jni_bluetoothGattService, jni_mid_addCharacteristic, jni_readCharacteristic);
998 if (!jni_boolean_addReadCharacteristic)
1000 OIC_LOG(ERROR, TAG, "jni_boolean_addReadCharacteristic is null");
1004 jobject jni_obj_writeUuid = CALEGetUuidFromString(env, OIC_GATT_CHARACTERISTIC_REQUEST_UUID);
1005 if (!jni_obj_writeUuid)
1007 OIC_LOG(ERROR, TAG, "jni_obj_bluetoothGattServer is null");
1011 jint jni_int_writeProperties = (*env)->GetStaticIntField(env,
1012 jni_cid_bluetoothGattCharacteristic,
1013 jni_fid_writeProperties);
1015 jobject jni_writeCharacteristic = (*env)->NewObject(env, jni_cid_bluetoothGattCharacteristic,
1016 jni_mid_bluetoothGattCharacteristic,
1017 jni_obj_writeUuid, jni_int_writeProperties,
1018 jni_int_writePermissions);
1019 if (!jni_writeCharacteristic)
1021 OIC_LOG(ERROR, TAG, "jni_writeCharacteristic is null");
1025 jboolean jni_boolean_addWriteCharacteristic = (*env)->CallBooleanMethod(
1026 env, jni_bluetoothGattService, jni_mid_addCharacteristic, jni_writeCharacteristic);
1027 if (JNI_FALSE == jni_boolean_addWriteCharacteristic)
1029 OIC_LOG(ERROR, TAG, "Fail to add jni_boolean_addReadCharacteristic");
1033 OIC_LOG(DEBUG, TAG, "OUT - CALEServerCreateGattService");
1034 return jni_bluetoothGattService;
1037 CAResult_t CALEServerAddDescriptor(JNIEnv *env, jobject characteristic)
1039 OIC_LOG(DEBUG, TAG, "IN - CALEServerAddDescriptor");
1040 VERIFY_NON_NULL(env, TAG, "env is null");
1041 VERIFY_NON_NULL(characteristic, TAG, "characteristic is null");
1043 jclass jni_cid_bluetoothGattDescriptor = (*env)->FindClass(env, "android/bluetooth/"
1044 "BluetoothGattDescriptor");
1045 if (!jni_cid_bluetoothGattDescriptor)
1047 OIC_LOG(ERROR, TAG, "jni_cid_bluetoothGattDescriptor is null");
1048 return CA_STATUS_FAILED;
1051 jmethodID jni_mid_bluetoothGattDescriptor = (*env)->GetMethodID(env,
1052 jni_cid_bluetoothGattDescriptor,
1054 "(Ljava/util/UUID;I)V");
1055 if (!jni_mid_bluetoothGattDescriptor)
1057 OIC_LOG(ERROR, TAG, "jni_mid_bluetoothGattDescriptor is null");
1058 return CA_STATUS_FAILED;
1061 jfieldID jni_fid_readPermissions = (*env)->GetStaticFieldID(env,
1062 jni_cid_bluetoothGattDescriptor,
1063 "PERMISSION_READ", "I");
1064 if (!jni_fid_readPermissions)
1066 OIC_LOG(ERROR, TAG, "jni_fid_readPermissions is null");
1067 return CA_STATUS_FAILED;
1070 jobject jni_obj_readUuid = CALEGetUuidFromString(env, OIC_GATT_CHARACTERISTIC_CONFIG_UUID);
1071 if (!jni_obj_readUuid)
1073 OIC_LOG(ERROR, TAG, "jni_obj_readUuid is null");
1074 return CA_STATUS_FAILED;
1077 jint jni_int_readPermissions = (*env)->GetStaticIntField(env, jni_cid_bluetoothGattDescriptor,
1078 jni_fid_readPermissions);
1080 OIC_LOG(DEBUG, TAG, "initialize new Descriptor");
1082 jobject jni_readDescriptor = (*env)->NewObject(env, jni_cid_bluetoothGattDescriptor,
1083 jni_mid_bluetoothGattDescriptor,
1084 jni_obj_readUuid, jni_int_readPermissions);
1085 if (!jni_readDescriptor)
1087 OIC_LOG(ERROR, TAG, "jni_readDescriptor is null");
1088 return CA_STATUS_FAILED;
1091 jclass jni_cid_GattCharacteristic = (*env)->FindClass(env, "android/bluetooth/"
1092 "BluetoothGattCharacteristic");
1093 if (!jni_cid_GattCharacteristic)
1095 OIC_LOG(ERROR, TAG, "jni_cid_GattCharacteristic is null");
1096 return CA_STATUS_FAILED;
1099 jmethodID jni_mid_addDescriptor = (*env)->GetMethodID(env, jni_cid_GattCharacteristic,
1101 "(Landroid/bluetooth/"
1102 "BluetoothGattDescriptor;)Z");
1103 if (!jni_mid_addDescriptor)
1105 OIC_LOG(ERROR, TAG, "jni_mid_addDescriptor is null");
1106 return CA_STATUS_FAILED;
1109 jboolean jni_boolean_addDescriptor = (*env)->CallBooleanMethod(env, characteristic,
1110 jni_mid_addDescriptor,
1111 jni_readDescriptor);
1113 if (JNI_FALSE == jni_boolean_addDescriptor)
1115 OIC_LOG(ERROR, TAG, "addDescriptor has failed");
1116 return CA_STATUS_FAILED;
1120 OIC_LOG(DEBUG, TAG, "addDescriptor success");
1123 OIC_LOG(DEBUG, TAG, "OUT - CALEServerAddDescriptor");
1124 return CA_STATUS_OK;
1127 CAResult_t CALEServerAddGattService(JNIEnv *env, jobject bluetoothGattServer,
1128 jobject bluetoothGattService)
1130 OIC_LOG(DEBUG, TAG, "IN - CALEServerAddGattService");
1131 VERIFY_NON_NULL(env, TAG, "env is null");
1132 VERIFY_NON_NULL(bluetoothGattServer, TAG, "bluetoothGattServer is null");
1133 VERIFY_NON_NULL(bluetoothGattService, TAG, "bluetoothGattService is null");
1135 if (!CALEIsEnableBTAdapter(env))
1137 OIC_LOG(ERROR, TAG, "BT adapter is not enabled");
1138 return CA_ADAPTER_NOT_ENABLED;
1141 jclass jni_cid_bluetoothGattServer = (*env)->FindClass(env,
1142 "android/bluetooth/BluetoothGattServer");
1143 if (!jni_cid_bluetoothGattServer)
1145 OIC_LOG(ERROR, TAG, "jni_cid_bluetoothGattServer is null");
1146 return CA_STATUS_FAILED;
1149 jmethodID jni_mid_addService = (*env)->GetMethodID(env, jni_cid_bluetoothGattServer,
1151 "(Landroid/bluetooth/BluetoothGattService;)"
1153 if (!jni_mid_addService)
1155 OIC_LOG(ERROR, TAG, "jni_mid_addService is null");
1156 return CA_STATUS_FAILED;
1159 jboolean jni_boolean_addService = (*env)->CallBooleanMethod(env, bluetoothGattServer,
1161 bluetoothGattService);
1163 if (JNI_FALSE == jni_boolean_addService)
1165 OIC_LOG(ERROR, TAG, "Fail to add GATT service");
1166 return CA_STATUS_FAILED;
1169 OIC_LOG(DEBUG, TAG, "OUT - CALEServerAddGattService");
1170 return CA_STATUS_OK;
1173 CAResult_t CALEServerConnect(JNIEnv *env, jobject bluetoothDevice)
1175 OIC_LOG(DEBUG, TAG, "IN - CALEServerConnect");
1176 VERIFY_NON_NULL(env, TAG, "env is null");
1177 VERIFY_NON_NULL(bluetoothDevice, TAG, "bluetoothDevice is null");
1179 if (!CALEIsEnableBTAdapter(env))
1181 OIC_LOG(ERROR, TAG, "BT adapter is not enabled");
1182 return CA_ADAPTER_NOT_ENABLED;
1185 jclass jni_cid_bluetoothGattServer = (*env)->FindClass(env,
1186 "android/bluetooth/BluetoothGattServer");
1187 if (!jni_cid_bluetoothGattServer)
1189 OIC_LOG(ERROR, TAG, "jni_cid_bluetoothGattServer is null");
1190 return CA_STATUS_FAILED;
1193 jmethodID jni_mid_connect = (*env)->GetMethodID(env, jni_cid_bluetoothGattServer, "connect",
1194 "(Landroid/bluetooth/BluetoothDevice;Z)Z");
1195 if (!jni_mid_connect)
1197 OIC_LOG(ERROR, TAG, "jni_mid_connect is null");
1198 return CA_STATUS_FAILED;
1201 jboolean jni_boolean_connect = (*env)->CallBooleanMethod(env, g_bluetoothGattServer,
1202 jni_mid_connect, bluetoothDevice,
1204 if (JNI_FALSE == jni_boolean_connect)
1206 OIC_LOG(ERROR, TAG, "Fail to connect");
1207 return CA_STATUS_FAILED;
1210 OIC_LOG(DEBUG, TAG, "OUT - CALEServerConnect");
1211 return CA_STATUS_OK;
1214 CAResult_t CALEServerDisconnectAllDevices(JNIEnv *env)
1216 OIC_LOG(DEBUG, TAG, "IN - CALEServerDisconnectAllDevices");
1217 VERIFY_NON_NULL(env, TAG, "env is null");
1219 ca_mutex_lock(g_connectedDeviceListMutex);
1220 if (!g_connectedDeviceList)
1222 OIC_LOG(ERROR, TAG, "g_connectedDeviceList is null");
1223 ca_mutex_unlock(g_connectedDeviceListMutex);
1224 return CA_STATUS_FAILED;
1227 uint32_t length = u_arraylist_length(g_connectedDeviceList);
1228 for (uint32_t index = 0; index < length; index++)
1230 jobject jarrayObj = (jobject) u_arraylist_get(g_connectedDeviceList, index);
1233 OIC_LOG_V(ERROR, TAG, "object[%d] is null", index);
1237 // disconnect for device obj
1238 CAResult_t res = CALEServerDisconnect(env, jarrayObj);
1239 if (CA_STATUS_OK != res)
1241 OIC_LOG_V(ERROR, TAG, "Disconnect for this device[%d] has failed", index);
1246 ca_mutex_unlock(g_connectedDeviceListMutex);
1247 OIC_LOG(DEBUG, TAG, "OUT - CALEServerDisconnectAllDevices");
1248 return CA_STATUS_OK;
1251 CAResult_t CALEServerDisconnect(JNIEnv *env, jobject bluetoothDevice)
1253 OIC_LOG(DEBUG, TAG, "IN - CALEServerDisconnect");
1254 VERIFY_NON_NULL(env, TAG, "env is null");
1255 VERIFY_NON_NULL(bluetoothDevice, TAG, "bluetoothDevice is null");
1257 if (!CALEIsEnableBTAdapter(env))
1259 OIC_LOG(ERROR, TAG, "BT adapter is not enabled");
1260 return CA_ADAPTER_NOT_ENABLED;
1263 jclass jni_cid_bluetoothGattServer = (*env)->FindClass(env,
1264 "android/bluetooth/BluetoothGattServer");
1265 if (!jni_cid_bluetoothGattServer)
1267 OIC_LOG(ERROR, TAG, "jni_cid_bluetoothGattServer is null");
1268 return CA_STATUS_FAILED;
1271 jmethodID jni_mid_cancelConnection = (*env)->GetMethodID(env, jni_cid_bluetoothGattServer,
1273 "(Landroid/bluetooth/BluetoothDevice;)"
1275 if (!jni_mid_cancelConnection)
1277 OIC_LOG(ERROR, TAG, "jni_mid_cancelConnection is null");
1278 return CA_STATUS_FAILED;
1281 (*env)->CallVoidMethod(env, g_bluetoothGattServer, jni_mid_cancelConnection, bluetoothDevice);
1283 if ((*env)->ExceptionCheck(env))
1285 OIC_LOG(ERROR, TAG, "cancelConnection has failed");
1286 (*env)->ExceptionDescribe(env);
1287 (*env)->ExceptionClear(env);
1288 return CA_STATUS_FAILED;
1291 OIC_LOG(DEBUG, TAG, "OUT - CALEServerDisconnect");
1292 return CA_STATUS_OK;
1295 CAResult_t CALEServerGattClose(JNIEnv *env, jobject bluetoothGattServer)
1298 OIC_LOG(DEBUG, TAG, "GattServer Close");
1299 VERIFY_NON_NULL(bluetoothGattServer, TAG, "bluetoothGattServer is null");
1300 VERIFY_NON_NULL(env, TAG, "env is null");
1302 // get BluetoothGatt class
1303 OIC_LOG(DEBUG, TAG, "get BluetoothGatt class");
1304 jclass jni_cid_BluetoothGatt = (*env)->FindClass(env, "android/bluetooth/BluetoothGattServer");
1305 if (!jni_cid_BluetoothGatt)
1307 OIC_LOG(ERROR, TAG, "jni_cid_BluetoothGatt is null");
1308 return CA_STATUS_FAILED;
1311 jmethodID jni_mid_closeGatt = (*env)->GetMethodID(env, jni_cid_BluetoothGatt, "close", "()V");
1312 if (!jni_mid_closeGatt)
1314 OIC_LOG(ERROR, TAG, "jni_mid_closeGatt is null");
1315 return CA_STATUS_OK;
1318 // call disconnect gatt method
1319 OIC_LOG(DEBUG, TAG, "request to close GATT");
1320 (*env)->CallVoidMethod(env, bluetoothGattServer, jni_mid_closeGatt);
1322 if ((*env)->ExceptionCheck(env))
1324 OIC_LOG(ERROR, TAG, "closeGATT has failed");
1325 (*env)->ExceptionDescribe(env);
1326 (*env)->ExceptionClear(env);
1327 return CA_STATUS_FAILED;
1330 return CA_STATUS_OK;
1333 CAResult_t CALEServerSend(JNIEnv *env, jobject bluetoothDevice, jbyteArray responseData)
1335 OIC_LOG(DEBUG, TAG, "IN - CALEServerSend");
1336 VERIFY_NON_NULL(env, TAG, "env is null");
1337 VERIFY_NON_NULL(bluetoothDevice, TAG, "bluetoothDevice is null");
1338 VERIFY_NON_NULL(responseData, TAG, "responseData is null");
1340 if (!CALEIsEnableBTAdapter(env))
1342 OIC_LOG(ERROR, TAG, "BT adapter is not enabled");
1343 return CA_ADAPTER_NOT_ENABLED;
1346 jobject responseChar = CALEServerSetResponseData(env, responseData);
1349 OIC_LOG(ERROR, TAG, "responseChar is null");
1350 return CA_STATUS_FAILED;
1353 CAResult_t result = CALEServerSendResponseData(env, bluetoothDevice, responseChar);
1354 if (CA_STATUS_OK != result)
1356 OIC_LOG(ERROR, TAG, "Fail to send response data");
1360 OIC_LOG(DEBUG, TAG, "OUT - CALEServerSend");
1364 CAResult_t CALEServerInitialize(ca_thread_pool_t handle)
1366 OIC_LOG(DEBUG, TAG, "IN - CALEServerInitialize");
1368 CALeServerJniInit();
1372 OIC_LOG(ERROR, TAG, "g_jvm is null");
1373 return CA_STATUS_FAILED;
1376 bool isAttached = false;
1378 jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
1381 OIC_LOG(INFO, TAG, "Could not get JNIEnv pointer");
1382 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
1386 OIC_LOG(ERROR, TAG, "AttachCurrentThread has failed");
1387 return CA_STATUS_FAILED;
1392 CAResult_t ret = CALECheckPlatformVersion(env, 21);
1393 if (CA_STATUS_OK != ret)
1395 OIC_LOG(ERROR, TAG, "it is not supported");
1399 (*g_jvm)->DetachCurrentThread(g_jvm);
1404 g_threadPoolHandle = handle;
1406 ret = CALEServerInitMutexVaraibles();
1407 if (CA_STATUS_OK != ret)
1409 OIC_LOG(ERROR, TAG, "CALEServerInitMutexVaraibles has failed");
1413 (*g_jvm)->DetachCurrentThread(g_jvm);
1415 return CA_STATUS_FAILED;
1418 CALEServerJNISetContext();
1419 CALEServerCreateCachedDeviceList();
1421 ret = CALEServerCreateJniInterfaceObject();
1422 if (CA_STATUS_OK != ret)
1424 OIC_LOG(ERROR, TAG, "CALEServerCreateJniInterfaceObject has failed");
1428 (*g_jvm)->DetachCurrentThread(g_jvm);
1430 return CA_STATUS_FAILED;
1435 (*g_jvm)->DetachCurrentThread(g_jvm);
1438 g_isInitializedServer = true;
1439 OIC_LOG(DEBUG, TAG, "OUT - CALEServerInitialize");
1440 return CA_STATUS_OK;
1443 void CALEServerTerminate()
1445 OIC_LOG(DEBUG, TAG, "IN - CALEServerTerminate");
1449 OIC_LOG(ERROR, TAG, "g_jvm is null");
1453 bool isAttached = false;
1455 jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
1458 OIC_LOG(ERROR, TAG, "Could not get JNIEnv pointer");
1459 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
1463 OIC_LOG(ERROR, TAG, "AttachCurrentThread has failed");
1469 CAResult_t ret = CALEServerStopMulticastServer(0);
1470 if (CA_STATUS_OK != ret)
1472 OIC_LOG(ERROR, TAG, "CALEServerStopMulticastServer has failed");
1475 ret = CALEServerDisconnectAllDevices(env);
1476 if (CA_STATUS_OK != ret)
1478 OIC_LOG(ERROR, TAG, "CALEServerDisconnectAllDevices has failed");
1481 ret = CALEServerRemoveAllDevices(env);
1482 if (CA_STATUS_OK != ret)
1484 OIC_LOG(ERROR, TAG, "CALEServerRemoveAllDevices has failed");
1487 if (g_leAdvertiseCallback)
1489 (*env)->DeleteGlobalRef(env, g_leAdvertiseCallback);
1492 if (g_bluetoothGattServer)
1494 (*env)->DeleteGlobalRef(env, g_bluetoothGattServer);
1497 if (g_bluetoothGattServerCallback)
1499 (*env)->DeleteGlobalRef(env, g_bluetoothGattServerCallback);
1502 CALEServerTerminateMutexVaraibles();
1503 CALEServerTerminateConditionVaraibles();
1505 g_isStartServer = false;
1506 g_isInitializedServer = false;
1510 (*g_jvm)->DetachCurrentThread(g_jvm);
1513 OIC_LOG(DEBUG, TAG, "OUT - CALEServerTerminate");
1516 CAResult_t CALEServerSendUnicastMessage(const char* address, const char* data, uint32_t dataLen)
1518 OIC_LOG_V(DEBUG, TAG, "IN - CALEServerSendUnicastMessage(%s, %s)", address, data);
1519 VERIFY_NON_NULL(address, TAG, "address is null");
1520 VERIFY_NON_NULL(data, TAG, "data is null");
1524 OIC_LOG(ERROR, TAG, "g_jvm is null");
1525 return CA_STATUS_FAILED;
1528 bool isAttached = false;
1530 jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
1533 OIC_LOG(ERROR, TAG, "Could not get JNIEnv pointer");
1534 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
1538 OIC_LOG(ERROR, TAG, "AttachCurrentThread has failed");
1539 return CA_STATUS_FAILED;
1544 CAResult_t ret = CALEServerSendUnicastMessageImpl(env, address, data, dataLen);
1545 if (CA_STATUS_OK != ret)
1547 OIC_LOG(ERROR, TAG, "CALEServerSendUnicastMessageImpl has failed");
1552 (*g_jvm)->DetachCurrentThread(g_jvm);
1555 OIC_LOG(DEBUG, TAG, "OUT - CALEServerSendUnicastMessage");
1559 CAResult_t CALEServerSendMulticastMessage(const char* data, uint32_t dataLen)
1561 OIC_LOG_V(DEBUG, TAG, "IN - CALEServerSendMulticastMessage(%s)", data);
1562 VERIFY_NON_NULL(data, TAG, "data is null");
1566 OIC_LOG(ERROR, TAG, "g_jvm is null");
1567 return CA_STATUS_FAILED;
1570 bool isAttached = false;
1572 jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
1575 OIC_LOG(ERROR, TAG, "Could not get JNIEnv pointer");
1576 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
1580 OIC_LOG(ERROR, TAG, "AttachCurrentThread has failed");
1581 return CA_STATUS_FAILED;
1586 CAResult_t ret = CALEServerSendMulticastMessageImpl(env, data, dataLen);
1587 if (CA_STATUS_OK != ret)
1589 OIC_LOG(ERROR, TAG, "CALEServerSendMulticastMessageImpl has failed");
1594 (*g_jvm)->DetachCurrentThread(g_jvm);
1597 OIC_LOG(DEBUG, TAG, "OUT - CALEServerSendMulticastMessage");
1601 CAResult_t CALEServerStartMulticastServer()
1603 OIC_LOG(DEBUG, TAG, "IN - CALEServerStartMulticastServer");
1605 if (!g_isInitializedServer)
1607 OIC_LOG(INFO, TAG, "server is not initialized");
1608 return CA_STATUS_FAILED;
1611 if (g_isStartServer)
1613 OIC_LOG(INFO, TAG, "server is already started..it will be skipped");
1614 return CA_STATUS_FAILED;
1619 OIC_LOG(ERROR, TAG, "g_jvm is null");
1620 return CA_STATUS_FAILED;
1623 bool isAttached = false;
1625 jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
1628 OIC_LOG(ERROR, TAG, "Could not get JNIEnv pointer");
1629 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
1633 OIC_LOG(ERROR, TAG, "AttachCurrentThread has failed");
1634 return CA_STATUS_FAILED;
1639 g_isStartServer = true;
1641 // start gatt server
1642 CAResult_t ret = CALEServerStartGattServer(env, g_bluetoothGattServerCallback);
1643 if (CA_STATUS_OK != ret)
1645 OIC_LOG(ERROR, TAG, "Fail to start gatt server");
1650 ret = CALEServerStartAdvertise(env, g_leAdvertiseCallback);
1651 if (CA_STATUS_OK != ret)
1653 OIC_LOG(ERROR, TAG, "CALEServerStartAdvertise has failed");
1658 (*g_jvm)->DetachCurrentThread(g_jvm);
1661 OIC_LOG(DEBUG, TAG, "OUT - CALEServerStartMulticastServer");
1665 CAResult_t CALEServerStopMulticastServer()
1667 OIC_LOG(DEBUG, TAG, "IN - CALEServerStopMulticastServer");
1669 if (false == g_isStartServer)
1671 OIC_LOG(INFO, TAG, "server is already stopped..it will be skipped");
1672 return CA_STATUS_FAILED;
1677 OIC_LOG(ERROR, TAG, "g_jvm is null");
1678 return CA_STATUS_FAILED;
1681 bool isAttached = false;
1683 jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
1686 OIC_LOG(ERROR, TAG, "Could not get JNIEnv pointer");
1687 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
1691 OIC_LOG(ERROR, TAG, "AttachCurrentThread has failed");
1692 return CA_STATUS_FAILED;
1697 CAResult_t ret = CALEServerStopAdvertise(env, g_leAdvertiseCallback);
1698 if (CA_STATUS_OK != ret)
1700 OIC_LOG(ERROR, TAG, "CALEServerStopAdvertise has failed");
1703 g_isStartServer = false;
1707 (*g_jvm)->DetachCurrentThread(g_jvm);
1710 OIC_LOG(DEBUG, TAG, "OUT - CALEServerStopMulticastServer");
1714 void CALEServerSetCallback(CAPacketReceiveCallback callback)
1716 OIC_LOG(DEBUG, TAG, "CALEServerSetCallback");
1717 g_packetReceiveCallback = callback;
1720 CAResult_t CALEServerSendUnicastMessageImpl(JNIEnv *env, const char* address, const char* data,
1723 OIC_LOG_V(DEBUG, TAG, "IN - CALEServerSendUnicastMessageImpl, address: %s, data: %s",
1725 VERIFY_NON_NULL(env, TAG, "env is null");
1726 VERIFY_NON_NULL(address, TAG, "address is null");
1727 VERIFY_NON_NULL(data, TAG, "data is null");
1729 if (!g_connectedDeviceList)
1731 OIC_LOG(ERROR, TAG, "g_connectedDeviceList is null");
1732 return CA_STATUS_FAILED;
1735 jobject jni_obj_bluetoothDevice = NULL;
1736 uint32_t length = u_arraylist_length(g_connectedDeviceList);
1737 for (uint32_t index = 0; index < length; index++)
1739 OIC_LOG(DEBUG, TAG, "check device address");
1740 jobject jarrayObj = (jobject) u_arraylist_get(g_connectedDeviceList, index);
1743 OIC_LOG(ERROR, TAG, "jarrayObj is null");
1744 return CA_STATUS_FAILED;
1747 jstring jni_setAddress = CALEGetAddressFromBTDevice(env, jarrayObj);
1748 if (!jni_setAddress)
1750 OIC_LOG(ERROR, TAG, "jni_setAddress is null");
1751 return CA_STATUS_FAILED;
1753 const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
1756 OIC_LOG(ERROR, TAG, "setAddress is null");
1757 return CA_STATUS_FAILED;
1760 OIC_LOG_V(DEBUG, TAG, "setAddress : %s", setAddress);
1761 OIC_LOG_V(DEBUG, TAG, "address : %s", address);
1763 if (!strcmp(setAddress, address))
1765 OIC_LOG(DEBUG, TAG, "found the device");
1766 jni_obj_bluetoothDevice = jarrayObj;
1767 (*env)->ReleaseStringUTFChars(env, jni_setAddress, setAddress);
1770 (*env)->ReleaseStringUTFChars(env, jni_setAddress, setAddress);
1773 if (jni_obj_bluetoothDevice)
1775 jbyteArray jni_bytearr_data = (*env)->NewByteArray(env, dataLen);
1776 (*env)->SetByteArrayRegion(env, jni_bytearr_data, 0, dataLen, (jbyte*) data);
1778 CAResult_t res = CALEServerSend(env, jni_obj_bluetoothDevice, jni_bytearr_data);
1779 if (CA_STATUS_OK != res)
1781 OIC_LOG(ERROR, TAG, "send has failed");
1782 return CA_SEND_FAILED;
1787 OIC_LOG(ERROR, TAG, "There are no device to send in the list");
1788 return CA_STATUS_FAILED;
1791 OIC_LOG(DEBUG, TAG, "OUT - CALEServerSendUnicastMessageImpl");
1792 return CA_STATUS_OK;
1795 CAResult_t CALEServerSendMulticastMessageImpl(JNIEnv *env, const char *data, uint32_t dataLen)
1797 OIC_LOG_V(DEBUG, TAG, "IN - CALEServerSendMulticastMessageImpl, send to, data: %s", data);
1798 VERIFY_NON_NULL(env, TAG, "env is null");
1799 VERIFY_NON_NULL(data, TAG, "data is null");
1801 if (!g_connectedDeviceList)
1803 OIC_LOG(ERROR, TAG, "g_connectedDeviceList is null");
1804 return CA_STATUS_FAILED;
1807 uint32_t length = u_arraylist_length(g_connectedDeviceList);
1808 for (uint32_t index = 0; index < length; index++)
1810 jobject jarrayObj = (jobject) u_arraylist_get(g_connectedDeviceList, index);
1813 OIC_LOG(ERROR, TAG, "jarrayObj is null");
1814 return CA_STATUS_FAILED;
1817 // send data for all device
1818 jbyteArray jni_bytearr_data = (*env)->NewByteArray(env, dataLen);
1819 (*env)->SetByteArrayRegion(env, jni_bytearr_data, 0, dataLen, (jbyte*) data);
1820 CAResult_t res = CALEServerSend(env, jarrayObj, jni_bytearr_data);
1821 if (CA_STATUS_OK != res)
1823 OIC_LOG(ERROR, TAG, "send has failed");
1824 return CA_SEND_FAILED;
1828 OIC_LOG(DEBUG, TAG, "OUT - CALEServerSendMulticastMessageImpl");
1829 return CA_STATUS_OK;
1832 void CALEServerCreateCachedDeviceList()
1834 OIC_LOG(DEBUG, TAG, "IN - CALEServerCreateCachedDeviceList");
1836 ca_mutex_lock(g_connectedDeviceListMutex);
1837 // create new object array
1838 if (!g_connectedDeviceList)
1840 OIC_LOG(DEBUG, TAG, "Create device list");
1841 g_connectedDeviceList = u_arraylist_create();
1843 ca_mutex_unlock(g_connectedDeviceListMutex);
1845 OIC_LOG(DEBUG, TAG, "OUT - CALEServerCreateCachedDeviceList");
1848 bool CALEServerIsDeviceInList(JNIEnv *env, const char* remoteAddress)
1850 OIC_LOG(DEBUG, TAG, "IN - CALEServerIsDeviceInList");
1851 VERIFY_NON_NULL_RET(env, TAG, "env is null", false);
1852 VERIFY_NON_NULL_RET(remoteAddress, TAG, "remoteAddress is null", false);
1854 if (!g_connectedDeviceList)
1856 OIC_LOG(ERROR, TAG, "list is null");
1860 uint32_t length = u_arraylist_length(g_connectedDeviceList);
1861 for (uint32_t index = 0; index < length; index++)
1863 jobject jarrayObj = (jobject) u_arraylist_get(g_connectedDeviceList, index);
1867 OIC_LOG(ERROR, TAG, "jarrayObj is null");
1871 jstring jni_setAddress = CALEGetAddressFromBTDevice(env, jarrayObj);
1872 if (!jni_setAddress)
1874 OIC_LOG(ERROR, TAG, "jni_setAddress is null");
1878 const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
1881 OIC_LOG(ERROR, TAG, "setAddress is null");
1885 if (!strcmp(remoteAddress, setAddress))
1887 OIC_LOG(ERROR, TAG, "the device is already set");
1888 (*env)->ReleaseStringUTFChars(env, jni_setAddress, setAddress);
1893 (*env)->ReleaseStringUTFChars(env, jni_setAddress, setAddress);
1898 OIC_LOG(DEBUG, TAG, "there are no device in the list");
1899 OIC_LOG(DEBUG, TAG, "OUT - CALEServerCreateCachedDeviceList");
1903 CAResult_t CALEServerAddDeviceToList(JNIEnv *env, jobject device)
1905 OIC_LOG(DEBUG, TAG, "IN - CALEServerAddDeviceToList");
1906 VERIFY_NON_NULL(device, TAG, "device is null");
1907 VERIFY_NON_NULL(env, TAG, "env is null");
1909 ca_mutex_lock(g_connectedDeviceListMutex);
1911 if (!g_connectedDeviceList)
1913 OIC_LOG(ERROR, TAG, "list is null");
1914 ca_mutex_unlock(g_connectedDeviceListMutex);
1915 return CA_STATUS_FAILED;
1918 jstring jni_remoteAddress = CALEGetAddressFromBTDevice(env, device);
1919 if (!jni_remoteAddress)
1921 OIC_LOG(ERROR, TAG, "jni_remoteAddress is null");
1922 ca_mutex_unlock(g_connectedDeviceListMutex);
1923 return CA_STATUS_FAILED;
1926 const char* remoteAddress = (*env)->GetStringUTFChars(env, jni_remoteAddress, NULL);
1929 OIC_LOG(ERROR, TAG, "remoteAddress is null");
1930 ca_mutex_unlock(g_connectedDeviceListMutex);
1931 return CA_STATUS_FAILED;
1934 if (false == CALEServerIsDeviceInList(env, remoteAddress))
1936 jobject jni_obj_device = (*env)->NewGlobalRef(env, device);
1937 u_arraylist_add(g_connectedDeviceList, jni_obj_device);
1938 OIC_LOG_V(DEBUG, TAG, "Set the object to ArrayList as Element : %s", remoteAddress);
1941 (*env)->ReleaseStringUTFChars(env, jni_remoteAddress, remoteAddress);
1942 ca_mutex_unlock(g_connectedDeviceListMutex);
1943 OIC_LOG(DEBUG, TAG, "OUT - CALEServerAddDeviceToList");
1944 return CA_STATUS_OK;
1947 CAResult_t CALEServerRemoveAllDevices(JNIEnv *env)
1949 OIC_LOG(DEBUG, TAG, "IN - CALEServerRemoveAllDevices");
1950 VERIFY_NON_NULL(env, TAG, "env is null");
1952 ca_mutex_lock(g_connectedDeviceListMutex);
1953 if (!g_connectedDeviceList)
1955 OIC_LOG(ERROR, TAG, "g_connectedDeviceList is null");
1956 ca_mutex_unlock(g_connectedDeviceListMutex);
1957 return CA_STATUS_FAILED;
1960 uint32_t length = u_arraylist_length(g_connectedDeviceList);
1961 for (uint32_t index = 0; index < length; index++)
1963 jobject jarrayObj = (jobject) u_arraylist_get(g_connectedDeviceList, index);
1966 (*env)->DeleteGlobalRef(env, jarrayObj);
1970 OICFree(g_connectedDeviceList);
1971 g_connectedDeviceList = NULL;
1972 ca_mutex_unlock(g_connectedDeviceListMutex);
1974 OIC_LOG(DEBUG, TAG, "OUT - CALEServerRemoveAllDevices");
1975 return CA_STATUS_OK;
1978 CAResult_t CALEServerRemoveDevice(JNIEnv *env, jstring address)
1980 OIC_LOG(DEBUG, TAG, "IN CALEServerRemoveDevice");
1981 VERIFY_NON_NULL(env, TAG, "env is null");
1982 VERIFY_NON_NULL(address, TAG, "address is null");
1984 ca_mutex_lock(g_connectedDeviceListMutex);
1985 if (!g_connectedDeviceList)
1987 OIC_LOG(ERROR, TAG, "no deviceList");
1988 ca_mutex_unlock(g_connectedDeviceListMutex);
1989 return CA_STATUS_FAILED;
1992 uint32_t length = u_arraylist_length(g_connectedDeviceList);
1993 for (uint32_t index = 0; index < length; index++)
1995 jobject jarrayObj = (jobject) u_arraylist_get(g_connectedDeviceList, index);
1999 jstring jni_setAddress = CALEGetAddressFromBTDevice(env, jarrayObj);
2000 if (!jni_setAddress)
2002 OIC_LOG(ERROR, TAG, "wrong device address");
2005 const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
2008 OIC_LOG(ERROR, TAG, "setAddress is null");
2012 const char* remoteAddress = (*env)->GetStringUTFChars(env, address, NULL);
2015 OIC_LOG(ERROR, TAG, "remoteAddress is null");
2016 (*env)->ReleaseStringUTFChars(env, jni_setAddress, setAddress);
2020 if (!strcmp(setAddress, remoteAddress))
2022 OIC_LOG_V(DEBUG, TAG, "device address : %s", remoteAddress);
2024 (*env)->ReleaseStringUTFChars(env, jni_setAddress, setAddress);
2025 (*env)->ReleaseStringUTFChars(env, address, remoteAddress);
2026 (*env)->DeleteGlobalRef(env, jarrayObj);
2028 CAResult_t res = CALEServerReorderinglist(index);
2029 if (CA_STATUS_OK != res)
2031 OIC_LOG(ERROR, TAG, "CALEServerReorderinglist has failed");
2032 ca_mutex_unlock(g_connectedDeviceListMutex);
2035 ca_mutex_unlock(g_connectedDeviceListMutex);
2036 return CA_STATUS_OK;
2038 (*env)->ReleaseStringUTFChars(env, jni_setAddress, setAddress);
2039 (*env)->ReleaseStringUTFChars(env, address, remoteAddress);
2043 ca_mutex_unlock(g_connectedDeviceListMutex);
2045 OIC_LOG(DEBUG, TAG, "there are no device in the device list");
2047 OIC_LOG(DEBUG, TAG, "IN CALEServerRemoveDevice");
2048 return CA_STATUS_FAILED;
2051 CAResult_t CALEServerReorderinglist(uint32_t index)
2053 if (!g_connectedDeviceList)
2055 OIC_LOG(ERROR, TAG, "g_connectedDeviceList is null");
2056 return CA_STATUS_FAILED;
2059 if (index >= g_connectedDeviceList->length)
2061 OIC_LOG(ERROR, TAG, "index is not available");
2062 return CA_STATUS_FAILED;
2065 if (index < g_connectedDeviceList->length - 1)
2067 memmove(&g_connectedDeviceList->data[index], &g_connectedDeviceList->data[index + 1],
2068 (g_connectedDeviceList->length - index - 1) * sizeof(void *));
2071 g_connectedDeviceList->size--;
2072 g_connectedDeviceList->length--;
2074 return CA_STATUS_OK;
2077 JNIEXPORT void JNICALL
2078 Java_org_iotivity_ca_CaLeServerInterface_caLeRegisterGattServerCallback(JNIEnv *env, jobject obj,
2081 OIC_LOG(DEBUG, TAG, "CaLeServerInterface - Register Le Gatt Server Callback");
2082 VERIFY_NON_NULL_VOID(env, TAG, "env is null");
2083 VERIFY_NON_NULL_VOID(callback, TAG, "callback is null");
2085 g_bluetoothGattServerCallback = (*env)->NewGlobalRef(env, callback);
2088 JNIEXPORT void JNICALL
2089 Java_org_iotivity_ca_CaLeServerInterface_caLeRegisterBluetoothLeAdvertiseCallback(JNIEnv *env,
2093 OIC_LOG(DEBUG, TAG, "CaLeServerInterface - Register Le Advertise Callback");
2094 VERIFY_NON_NULL_VOID(env, TAG, "env is null");
2095 VERIFY_NON_NULL_VOID(callback, TAG, "callback is null");
2097 g_leAdvertiseCallback = (*env)->NewGlobalRef(env, callback);
2100 JNIEXPORT void JNICALL
2101 Java_org_iotivity_ca_CaLeServerInterface_caLeGattServerConnectionStateChangeCallback(
2102 JNIEnv *env, jobject obj, jobject device, jint status, jint newState)
2104 OIC_LOG(DEBUG, TAG, "CaLeServerInterface - Gatt Server ConnectionStateChange Callback");
2105 OIC_LOG_V(DEBUG, TAG, "New connection State: %d", newState);
2107 VERIFY_NON_NULL_VOID(env, TAG, "env is null");
2108 VERIFY_NON_NULL_VOID(device, TAG, "device is null");
2110 jclass jni_cid_bluetoothProfile = (*env)->FindClass(env, "android/bluetooth/BluetoothProfile");
2111 if (!jni_cid_bluetoothProfile)
2113 OIC_LOG(ERROR, TAG, "jni_cid_bluetoothProfile is null");
2117 jfieldID jni_fid_state_connected = (*env)->GetStaticFieldID(env, jni_cid_bluetoothProfile,
2118 "STATE_CONNECTED", "I");
2119 if(!jni_fid_state_connected)
2121 OIC_LOG(ERROR, TAG, "jni_fid_state_connected is null");
2125 jfieldID jni_fid_state_disconnected = (*env)->GetStaticFieldID(env, jni_cid_bluetoothProfile,
2126 "STATE_DISCONNECTED", "I");
2127 if(!jni_fid_state_disconnected)
2129 OIC_LOG(ERROR, TAG, "jni_fid_state_disconnected is null");
2134 jint jni_int_state_connected = (*env)->GetStaticIntField(env, jni_cid_bluetoothProfile,
2135 jni_fid_state_connected);
2137 // STATE_DISCONNECTED
2138 jint jni_int_state_disconnected = (*env)->GetStaticIntField(env, jni_cid_bluetoothProfile,
2139 jni_fid_state_disconnected);
2141 if (newState == jni_int_state_connected)
2144 OIC_LOG(DEBUG, TAG, "LE CONNECTED");
2146 jstring jni_remoteAddress = CALEGetAddressFromBTDevice(env, device);
2147 if (!jni_remoteAddress)
2149 OIC_LOG(ERROR, TAG, "jni_remoteAddress is null");
2153 const char* remoteAddress = (*env)->GetStringUTFChars(env, jni_remoteAddress, NULL);
2156 OIC_LOG(ERROR, TAG, "remoteAddress is null");
2160 if (false == CALEServerIsDeviceInList(env, remoteAddress))
2162 OIC_LOG(DEBUG, TAG, "add connected device to cache");
2163 CALEServerAddDeviceToList(env, device);
2165 (*env)->ReleaseStringUTFChars(env, jni_remoteAddress, remoteAddress);
2167 else if (newState == jni_int_state_disconnected)
2169 OIC_LOG(DEBUG, TAG, "LE DISCONNECTED");
2170 CAResult_t res = CALEServerGattClose(env, g_bluetoothGattServer);
2171 if (CA_STATUS_OK != res)
2173 OIC_LOG(ERROR, TAG, "CALEServerGattClose has failed");
2178 OIC_LOG_V(DEBUG, TAG, "LE Connection state is [newState : %d, status %d]", newState,
2183 JNIEXPORT void JNICALL
2184 Java_org_iotivity_ca_CaLeServerInterface_caLeGattServerServiceAddedCallback(JNIEnv *env,
2187 jobject gattService)
2189 OIC_LOG_V(DEBUG, TAG, "CaLeServerInterface - Gatt Service Added Callback(%d)", status);
2192 JNIEXPORT void JNICALL
2193 Java_org_iotivity_ca_CaLeServerInterface_caLeGattServerCharacteristicReadRequestCallback(
2194 JNIEnv *env, jobject obj, jobject device, jint requestId, jint offset,
2195 jobject characteristic, jbyteArray data)
2197 OIC_LOG(DEBUG, TAG, "CaLeServerInterface - Gatt Server Characteristic Read Request Callback");
2198 VERIFY_NON_NULL_VOID(env, TAG, "env is null");
2199 VERIFY_NON_NULL_VOID(device, TAG, "device is null");
2201 #ifdef USE_PROPERTY_WRITE_RESPONSE
2202 CALEServerSendResponse(env, device, requestId, 0, offset, NULL);
2207 JNIEXPORT void JNICALL
2208 Java_org_iotivity_ca_CaLeServerInterface_caLeGattServerCharacteristicWriteRequestCallback(
2209 JNIEnv *env, jobject obj, jobject device, jint requestId, jobject characteristic,
2210 jbyteArray data, jboolean preparedWrite, jboolean responseNeeded, jint offset,
2213 OIC_LOG(DEBUG, TAG, "CaLeServerInterface - Gatt Server Characteristic Write Request Callback");
2214 VERIFY_NON_NULL_VOID(env, TAG, "env is null");
2215 VERIFY_NON_NULL_VOID(device, TAG, "device is null");
2216 VERIFY_NON_NULL_VOID(value, TAG, "value is null");
2217 VERIFY_NON_NULL_VOID(data, TAG, "data is null");
2219 #ifdef USE_PROPERTY_WRITE_RESPONSE
2220 CALEServerSendResponse(env, device, requestId, 0, offset, value);
2223 // get Byte Array and covert to char*
2224 jint length = (*env)->GetArrayLength(env, data);
2227 jbyte *jni_byte_requestData = (jbyte *) (*env)->GetByteArrayElements(env, data, &isCopy);
2229 char* requestData = NULL;
2230 requestData = (char*) OICMalloc(sizeof(char) * length + 1);
2233 OIC_LOG(ERROR, TAG, "requestData is null");
2237 memcpy(requestData, (const char*) jni_byte_requestData, length);
2238 requestData[length] = '\0';
2239 (*env)->ReleaseByteArrayElements(env, data, jni_byte_requestData, JNI_ABORT);
2241 jstring jni_address = CALEGetAddressFromBTDevice(env, device);
2244 OIC_LOG(ERROR, TAG, "jni_address is null");
2245 OICFree(requestData);
2249 const char* address = (*env)->GetStringUTFChars(env, jni_address, NULL);
2252 OIC_LOG(ERROR, TAG, "address is null");
2253 OICFree(requestData);
2257 OIC_LOG_V(DEBUG, TAG, "remote device address : %s, %s, %d", address, requestData, length);
2259 ca_mutex_lock(g_bleClientBDAddressMutex);
2260 uint32_t sentLength = 0;
2261 g_CABLEServerDataReceivedCallback(address, requestData, length,
2263 ca_mutex_unlock(g_bleClientBDAddressMutex);
2265 (*env)->ReleaseStringUTFChars(env, jni_address, address);
2268 JNIEXPORT void JNICALL
2269 Java_org_iotivity_ca_CaLeServerInterface_caLeGattServerDescriptorReadRequestCallback(
2270 JNIEnv *env, jobject obj, jobject device, jint requestId, jint offset, jobject descriptor)
2272 OIC_LOG(DEBUG, TAG, "CaLeServerInterface_CALeGattServerDescriptorReadRequestCallback");
2275 JNIEXPORT void JNICALL
2276 Java_org_iotivity_ca_CaLeServerInterface_caLeGattServerDescriptorWriteRequestCallback(
2277 JNIEnv *env, jobject obj, jobject device, jint requestId, jobject descriptor,
2278 jboolean preparedWrite, jboolean responseNeeded, jint offset, jbyteArray value)
2280 OIC_LOG(DEBUG, TAG, "CaLeServerInterface_CALeGattServerDescriptorWriteRequestCallback");
2283 JNIEXPORT void JNICALL
2284 Java_org_iotivity_ca_CaLeServerInterface_caLeGattServerExecuteWriteCallback(JNIEnv *env,
2290 OIC_LOG(DEBUG, TAG, "CaLeServerInterface_CALeGattServerExecuteWriteCallback");
2291 VERIFY_NON_NULL_VOID(env, TAG, "env is null");
2292 VERIFY_NON_NULL_VOID(device, TAG, "device is null");
2294 // CALEServerSendResponse(env, device, requestId, 0, 0, NULL);
2297 JNIEXPORT void JNICALL
2298 Java_org_iotivity_ca_CaLeServerInterface_caLeGattServerNotificationSentCallback(JNIEnv *env,
2303 OIC_LOG(DEBUG, TAG, "CaLeServerInterface - Gatt Server Notification Sent Callback");
2306 JNIEXPORT void JNICALL
2307 Java_org_iotivity_ca_CaLeServerInterface_caLeAdvertiseStartSuccessCallback(
2308 JNIEnv *env, jobject obj, jobject settingsInEffect)
2310 OIC_LOG(DEBUG, TAG, "CaLeServerInterface - LE Advertise Start Success Callback");
2313 JNIEXPORT void JNICALL
2314 Java_org_iotivity_ca_CaLeServerInterface_caLeAdvertiseStartFailureCallback(JNIEnv *env,
2318 OIC_LOG_V(ERROR, TAG, "CaLeServerInterface - LE Advertise Start Failure Callback(%)",
2326 CAResult_t CAStartLEGattServer()
2328 OIC_LOG(DEBUG, TAG, "IN");
2330 CAResult_t ret = CALEServerInitMutexVaraibles();
2331 if (CA_STATUS_OK != ret)
2333 OIC_LOG(ERROR, TAG, "CALEServerInitMutexVaraibles has failed!");
2334 CALEServerTerminateMutexVaraibles();
2335 return CA_SERVER_NOT_STARTED;
2338 ret = CALEServerInitConditionVaraibles();
2339 if (CA_STATUS_OK != ret)
2341 OIC_LOG(ERROR, TAG, "CALEServerInitConditionVaraibles has failed!");
2342 CALEServerTerminateConditionVaraibles();
2343 return CA_SERVER_NOT_STARTED;
2346 // start gatt service
2347 CALEServerStartMulticastServer();
2349 OIC_LOG(DEBUG, TAG, "OUT");
2350 return CA_STATUS_OK;
2353 CAResult_t CAStopLEGattServer()
2355 OIC_LOG(DEBUG, TAG, "IN");
2357 OIC_LOG(DEBUG, TAG, "OUT");
2358 return CA_STATUS_OK;
2361 void CATerminateLEGattServer()
2363 OIC_LOG(DEBUG, TAG, "IN");
2365 OIC_LOG(DEBUG, TAG, "Terminat Gatt Server");
2366 CALEServerTerminate();
2368 OIC_LOG(DEBUG, TAG, "OUT");
2371 void CASetLEReqRespServerCallback(CABLEDataReceivedCallback callback)
2373 OIC_LOG(DEBUG, TAG, "IN");
2375 ca_mutex_lock(g_bleReqRespCbMutex);
2376 g_CABLEServerDataReceivedCallback = callback;
2377 ca_mutex_unlock(g_bleReqRespCbMutex);
2379 OIC_LOG(DEBUG, TAG, "OUT");
2382 void CASetBLEServerErrorHandleCallback(CABLEErrorHandleCallback callback)
2384 g_serverErrorCallback = callback;
2387 CAResult_t CAUpdateCharacteristicsToGattClient(const char *address,
2388 const char *charValue,
2389 uint32_t charValueLen)
2391 CAResult_t result = CA_SEND_FAILED;
2392 OIC_LOG(DEBUG, TAG, "IN");
2393 VERIFY_NON_NULL(address, TAG, "env is null");
2394 VERIFY_NON_NULL(charValue, TAG, "device is null");
2398 OIC_LOG(DEBUG, TAG, "CALEServerSendUnicastData");
2399 result = CALEServerSendUnicastMessage(address, charValue, charValueLen);
2402 OIC_LOG(DEBUG, TAG, "OUT");
2407 CAResult_t CAUpdateCharacteristicsToAllGattClients(const char *charValue,
2408 uint32_t charValueLen)
2410 OIC_LOG(DEBUG, TAG, "IN");
2411 VERIFY_NON_NULL(charValue, TAG, "device is null");
2413 OIC_LOG(DEBUG, TAG, "CALEServerSendMulticastMessage");
2414 CAResult_t result = CALEServerSendMulticastMessage(charValue, charValueLen);
2416 OIC_LOG(DEBUG, TAG, "OUT");
2420 void CASetLEServerThreadPoolHandle(ca_thread_pool_t handle)
2422 OIC_LOG(DEBUG, TAG, "IN");
2424 CALEServerInitialize(handle);
2426 OIC_LOG(DEBUG, TAG, "OUT");
2429 CAResult_t CALEServerInitMutexVaraibles()
2431 OIC_LOG(DEBUG, TAG, "IN");
2432 if (NULL == g_bleReqRespCbMutex)
2434 g_bleReqRespCbMutex = ca_mutex_new();
2435 if (NULL == g_bleReqRespCbMutex)
2437 OIC_LOG(ERROR, TAG, "ca_mutex_new has failed");
2438 return CA_STATUS_FAILED;
2442 if (NULL == g_bleClientBDAddressMutex)
2444 g_bleClientBDAddressMutex = ca_mutex_new();
2445 if (NULL == g_bleClientBDAddressMutex)
2447 OIC_LOG(ERROR, TAG, "ca_mutex_new has failed");
2448 return CA_STATUS_FAILED;
2452 if (NULL == g_connectedDeviceListMutex)
2454 g_connectedDeviceListMutex = ca_mutex_new();
2455 if (NULL == g_connectedDeviceListMutex)
2457 OIC_LOG(ERROR, TAG, "ca_mutex_new has failed");
2458 return CA_STATUS_FAILED;
2462 OIC_LOG(DEBUG, TAG, "OUT");
2463 return CA_STATUS_OK;
2466 CAResult_t CALEServerInitConditionVaraibles()
2468 OIC_LOG(DEBUG, TAG, "this method is not supported");
2469 return CA_STATUS_OK;
2472 void CALEServerTerminateMutexVaraibles()
2474 OIC_LOG(DEBUG, TAG, "IN");
2476 ca_mutex_free(g_bleReqRespCbMutex);
2477 g_bleReqRespCbMutex = NULL;
2479 ca_mutex_free(g_bleClientBDAddressMutex);
2480 g_bleClientBDAddressMutex = NULL;
2482 ca_mutex_free(g_connectedDeviceListMutex);
2483 g_connectedDeviceListMutex = NULL;
2485 OIC_LOG(DEBUG, TAG, "OUT");
2488 void CALEServerTerminateConditionVaraibles()
2490 OIC_LOG(DEBUG, TAG, "this method is not supported");