4 #include <android/log.h>
5 #include "caleserver.h"
8 #include "oic_malloc.h"
9 #include "uthreadpool.h"
10 #include "uarraylist.h"
11 #include "com_iotivity_jar_CALeInterface.h"
13 #define TAG PCF("CA_LE_SERVER")
15 #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
16 #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
19 //static const char *OIC_GATT_SERVICE_UUID = "000018f3-0000-1000-8000-00805f9b34fb";
20 //static const char *OIC_GATT_CHARACTERISTIC_RESPONSE_UUID = "00002af5-0000-1000-8000-00805f9b34fb"; //read
21 //static const char *OIC_GATT_CHARACTERISTIC_REQUEST_UUID = "00002af6-0000-1000-8000-00805f9b34fb"; //write
23 static const char *OIC_GATT_SERVICE_UUID = "713d0000-503e-4c75-ba94-3148f18d941e";
24 static const char *OIC_GATT_CHARACTERISTIC_RESPONSE_UUID = "713d0002-503e-4c75-ba94-3148f18d941e"; //read
25 static const char *OIC_GATT_CHARACTERISTIC_REQUEST_UUID = "713d0003-503e-4c75-ba94-3148f18d941e"; //write
28 static jobject gContext;
29 static jobject gBluetoothGattServer;
30 static jobject gBluetoothGattServerCallback;
31 static jobject gLeAdvertiseCallback;
33 static CAPacketReceiveCallback gPacketReceiveCallback = NULL;
34 static u_arraylist_t *gConnectedDeviceList = NULL;
35 static u_thread_pool_t gThreadPoolHandle = NULL;
37 static jboolean gIsStartServer;
40 void CALEServerJNISetContext(JNIEnv *env, jobject context)
42 OIC_LOG_V(DEBUG, TAG, "CALEServerJNISetContext");
45 OIC_LOG_V(DEBUG, TAG, "context is null");
47 gContext = (*env)->NewGlobalRef(env, context);
51 void CALeServerJniInit(JNIEnv *env, JavaVM *jvm)
53 OIC_LOG_V(DEBUG, TAG, "CALeServerJniInit");
57 jobject CALEServerSetResponseData(JNIEnv *env, jbyteArray responseData)
60 OIC_LOG_V(DEBUG, TAG, "CALEServerSetResponseData");
62 jclass jni_cid_bluetoothGattServer = (*env)->FindClass(env,
63 "android/bluetooth/BluetoothGattServer");
65 jclass jni_cid_bluetoothGattService = (*env)->FindClass(env,
66 "android/bluetooth/BluetoothGattService");
68 jclass jni_cid_bluetoothGattCharacteristic = (*env)->FindClass(env,
69 "android/bluetooth/BluetoothGattCharacteristic");
71 jmethodID jni_mid_getService = (*env)->GetMethodID(env,
72 jni_cid_bluetoothGattServer, "getService",
73 "(Ljava/util/UUID;)Landroid/bluetooth/BluetoothGattService;");
75 jobject jni_obj_serviceUUID = CALEGetUuidFromString(env, OIC_GATT_SERVICE_UUID);
77 if (!gBluetoothGattServer)
79 OIC_LOG_V(DEBUG, TAG, "Check BluetoothGattServer status");
82 jobject jni_obj_bluetoothGattService = (*env)->CallObjectMethod(env,
83 gBluetoothGattServer, jni_mid_getService, jni_obj_serviceUUID);
85 jmethodID jni_mid_getCharacteristic =
86 (*env)->GetMethodID(env, jni_cid_bluetoothGattService,
88 "(Ljava/util/UUID;)Landroid/bluetooth/BluetoothGattCharacteristic;");
90 jobject jni_obj_responseUUID = CALEGetUuidFromString(env,
91 OIC_GATT_CHARACTERISTIC_RESPONSE_UUID);
93 jobject jni_obj_bluetoothGattCharacteristic = (*env)->CallObjectMethod(env,
94 jni_obj_bluetoothGattService, jni_mid_getCharacteristic,
95 jni_obj_responseUUID);
97 jmethodID jni_mid_setValue = (*env)->GetMethodID(env,
98 jni_cid_bluetoothGattCharacteristic, "setValue",
101 jboolean jni_boolean_setValue = (*env)->CallBooleanMethod(env,
102 jni_obj_bluetoothGattCharacteristic, jni_mid_setValue,
105 if (jni_boolean_setValue == JNI_FALSE) {
106 OIC_LOG_V(DEBUG, TAG, "Fail to set response data");
109 return jni_obj_bluetoothGattCharacteristic;
112 jboolean CALEServerSendResponseData(JNIEnv *env, jobject device, jobject responseData)
115 OIC_LOG_V(DEBUG, TAG, "CALEServerSendResponseData");
117 jclass jni_cid_bluetoothGattServer = (*env)->FindClass(env,
118 "android/bluetooth/BluetoothGattServer");
120 jmethodID jni_mid_notifyCharacteristicChanged =
121 (*env)->GetMethodID(env, jni_cid_bluetoothGattServer,
122 "notifyCharacteristicChanged",
123 "(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothGattCharacteristic;Z)Z");
125 jboolean jni_boolean_notifyCharacteristicChanged =
126 (*env)->CallBooleanMethod(env, gBluetoothGattServer,
127 jni_mid_notifyCharacteristicChanged, device, responseData,
130 if (jni_boolean_notifyCharacteristicChanged == JNI_FALSE) {
131 OIC_LOG_V(DEBUG, TAG, "Fail to notify characteristic");
134 return jni_boolean_notifyCharacteristicChanged;
137 jboolean CALEServerSendResponse(JNIEnv *env, jobject device, jint requestId, jint status,
138 jint offset, jbyteArray value)
141 OIC_LOG_V(DEBUG, TAG, "CALEServerSendResponse");
143 jclass jni_cid_bluetoothGattServer = (*env)->FindClass(env,
144 "android/bluetooth/BluetoothGattServer");
146 jmethodID jni_mid_sendResponse = (*env)->GetMethodID(env,
147 jni_cid_bluetoothGattServer, "sendResponse",
148 "(Landroid/bluetooth/BluetoothDevice;III[B)Z");
150 jboolean jni_boolean_sendResponse = (*env)->CallBooleanMethod(env, gBluetoothGattServer,
151 jni_mid_sendResponse, device, requestId, status, offset, value);
153 if (jni_boolean_sendResponse == JNI_FALSE) {
154 OIC_LOG_V(DEBUG, TAG, "Fail to send response for gatt characteristic write request");
157 return jni_boolean_sendResponse;
160 void LEServerStartAdvertise(JNIEnv *env, jobject advertiseCallback)
163 OIC_LOG_V(DEBUG, TAG, "LEServerStartAdvertise");
165 jclass jni_cid_AdvertiseSettings = (*env)->FindClass(env,
166 "android/bluetooth/le/AdvertiseSettings$Builder");
168 jclass jni_cid_AdvertiseDataBuilder = (*env)->FindClass(env,
169 "android/bluetooth/le/AdvertiseData$Builder");
171 jclass jni_cid_BTAdapter = (*env)->FindClass(env,
172 "android/bluetooth/BluetoothAdapter");
174 jclass jni_cid_leAdvertiser = (*env)->FindClass(env,
175 "android/bluetooth/le/BluetoothLeAdvertiser");
177 jmethodID jni_mid_AdvertiseSettings = (*env)->GetMethodID(env,
178 jni_cid_AdvertiseSettings, "<init>", "()V");
180 jmethodID jni_mid_setAdvertiseMode = (*env)->GetMethodID(env,
181 jni_cid_AdvertiseSettings, "setAdvertiseMode",
182 "(I)Landroid/bluetooth/le/AdvertiseSettings$Builder;");
184 jmethodID jni_mid_setConnectable = (*env)->GetMethodID(env,
185 jni_cid_AdvertiseSettings, "setConnectable",
186 "(Z)Landroid/bluetooth/le/AdvertiseSettings$Builder;");
188 jmethodID jni_mid_setTimeout = (*env)->GetMethodID(env,
189 jni_cid_AdvertiseSettings, "setTimeout",
190 "(I)Landroid/bluetooth/le/AdvertiseSettings$Builder;");
192 jmethodID jni_mid_AdvertiseDataBuilder = (*env)->GetMethodID(env,
193 jni_cid_AdvertiseDataBuilder, "<init>", "()V");
195 jmethodID jni_mid_addServiceUuid =
196 (*env)->GetMethodID(env, jni_cid_AdvertiseDataBuilder,
198 "(Landroid/os/ParcelUuid;)Landroid/bluetooth/le/AdvertiseData$Builder;");
200 jmethodID jni_mid_getDefaultAdapter = (*env)->GetStaticMethodID(env,
201 jni_cid_BTAdapter, "getDefaultAdapter",
202 "()Landroid/bluetooth/BluetoothAdapter;");
204 jmethodID jni_mid_getBluetoothLeAdvertiser = (*env)->GetMethodID(env,
205 jni_cid_BTAdapter, "getBluetoothLeAdvertiser",
206 "()Landroid/bluetooth/le/BluetoothLeAdvertiser;");
208 jmethodID jni_mid_build_LeAdvertiseSettings = (*env)->GetMethodID(env,
209 jni_cid_AdvertiseSettings, "build",
210 "()Landroid/bluetooth/le/AdvertiseSettings;");
212 jmethodID jni_mid_build_LeAdvertiseData = (*env)->GetMethodID(env,
213 jni_cid_AdvertiseDataBuilder, "build",
214 "()Landroid/bluetooth/le/AdvertiseData;");
216 jmethodID jni_mid_startAdvertising =
217 (*env)->GetMethodID(env, jni_cid_leAdvertiser, "startAdvertising",
218 "(Landroid/bluetooth/le/AdvertiseSettings;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseCallback;)V");
220 jobject jni_AdvertiseSettings = (*env)->NewObject(env,
221 jni_cid_AdvertiseSettings, jni_mid_AdvertiseSettings);
223 jobject jni_obj_setAdvertiseMode = (*env)->CallObjectMethod(env,
224 jni_AdvertiseSettings, jni_mid_setAdvertiseMode, 0); // 0: Low power, 1: Balanced
226 jobject jni_obj_setConnectable = (*env)->CallObjectMethod(env,
227 jni_AdvertiseSettings, jni_mid_setConnectable, JNI_TRUE);
229 jobject jni_obj_setTimeout = (*env)->CallObjectMethod(env,
230 jni_AdvertiseSettings, jni_mid_setTimeout, 0); //A value of 0 will disable the time limit
232 jobject jni_AdvertiseDataBuilder = (*env)->NewObject(env,
233 jni_cid_AdvertiseDataBuilder, jni_mid_AdvertiseDataBuilder);
235 jobject jni_obj_serviceUUID = CALEGetUuidFromString(env, OIC_GATT_SERVICE_UUID);
237 jobject jni_ParcelUuid = CALEGetParcelUuid(env, jni_obj_serviceUUID);
239 jobject jni_obj_addServiceUuid = (*env)->CallObjectMethod(env,
240 jni_AdvertiseDataBuilder, jni_mid_addServiceUuid, jni_ParcelUuid);
242 jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env,
243 jni_cid_BTAdapter, jni_mid_getDefaultAdapter);
245 jobject jni_obj_getBluetoothLeAdvertiser = (*env)->CallObjectMethod(env,
246 jni_obj_BTAdapter, jni_mid_getBluetoothLeAdvertiser);
248 jobject jni_obj_build_LeAdvertiseSettings = (*env)->CallObjectMethod(env,
249 jni_AdvertiseSettings, jni_mid_build_LeAdvertiseSettings);
251 jobject jni_obj_build_LeAdvertiseData = (*env)->CallObjectMethod(env,
252 jni_AdvertiseDataBuilder, jni_mid_build_LeAdvertiseData);
254 (*env)->CallVoidMethod(env, jni_obj_getBluetoothLeAdvertiser,
255 jni_mid_startAdvertising, jni_obj_build_LeAdvertiseSettings,
256 jni_obj_build_LeAdvertiseData, advertiseCallback);
258 OIC_LOG_V(DEBUG, TAG, "Advertising started!!");
261 void LEServerStopAdvertise(JNIEnv *env, jobject advertiseCallback)
264 OIC_LOG_V(DEBUG, TAG, "LEServerStopAdvertise");
266 jclass jni_cid_BTAdapter = (*env)->FindClass(env,
267 "android/bluetooth/BluetoothAdapter");
269 jclass jni_cid_leAdvertiser = (*env)->FindClass(env,
270 "android/bluetooth/le/BluetoothLeAdvertiser");
272 jmethodID jni_mid_getDefaultAdapter = (*env)->GetStaticMethodID(env,
273 jni_cid_BTAdapter, "getDefaultAdapter",
274 "()Landroid/bluetooth/BluetoothAdapter;");
276 jmethodID jni_mid_getBluetoothLeAdvertiser = (*env)->GetMethodID(env,
277 jni_cid_BTAdapter, "getBluetoothLeAdvertiser",
278 "()Landroid/bluetooth/le/BluetoothLeAdvertiser;");
280 jmethodID jni_mid_stopAdvertising =
281 (*env)->GetMethodID(env, jni_cid_leAdvertiser, "stopAdvertising",
282 "(Landroid/bluetooth/le/AdvertiseCallback;)V");
284 jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env,
285 jni_cid_BTAdapter, jni_mid_getDefaultAdapter);
287 jobject jni_obj_getBluetoothLeAdvertiser = (*env)->CallObjectMethod(env,
288 jni_obj_BTAdapter, jni_mid_getBluetoothLeAdvertiser);
290 (*env)->CallVoidMethod(env, jni_obj_getBluetoothLeAdvertiser,
291 jni_mid_stopAdvertising, advertiseCallback);
293 OIC_LOG_V(DEBUG, TAG, "Advertising stopped!!");
296 jboolean CALEStartGattServer(JNIEnv *env, jobject gattServerCallback)
299 OIC_LOG_V(DEBUG, TAG, "CALEStartGattServer");
302 OIC_LOG_V(DEBUG, TAG, "Gatt server already started");
304 gBluetoothGattServerCallback = (*env)->NewGlobalRef(env, gattServerCallback);
307 jobject bluetoothGattServer = CALEServerOpenGattServer(env);
308 gBluetoothGattServer = (*env)->NewGlobalRef(env, bluetoothGattServer);
310 // create gatt service
311 jobject bluetoothGattService = CALEServerCreateGattService(env);
314 return CALEServerAddGattService(env, bluetoothGattServer, bluetoothGattService);
317 jobject CALEServerOpenGattServer(JNIEnv *env)
320 OIC_LOG_V(DEBUG, TAG, "CALEServerOpenGattServer");
322 jclass jni_cid_context = (*env)->FindClass(env, "android/content/Context");
324 jclass jni_cid_bluetoothManager = (*env)->FindClass(env,
325 "android/bluetooth/BluetoothManager");
327 jfieldID jni_fid_bluetoothService = (*env)->GetStaticFieldID(env,
328 jni_cid_context, "BLUETOOTH_SERVICE", "Ljava/lang/String;");
330 jmethodID jni_mid_getSystemService = (*env)->GetMethodID(env,
331 jni_cid_context, "getSystemService",
332 "(Ljava/lang/String;)Ljava/lang/Object;");
334 jmethodID jni_mid_openGattServer =
335 (*env)->GetMethodID(env, jni_cid_bluetoothManager, "openGattServer",
336 "(Landroid/content/Context;Landroid/bluetooth/BluetoothGattServerCallback;)Landroid/bluetooth/BluetoothGattServer;");
338 jobject jni_obj_bluetoothService = (*env)->GetStaticObjectField(env,
339 jni_cid_context, jni_fid_bluetoothService);
341 jobject jni_obj_bluetoothManager = (*env)->CallObjectMethod(env, gContext,
342 jni_mid_getSystemService, jni_obj_bluetoothService);
344 jobject jni_obj_bluetoothGattServer = (*env)->CallObjectMethod(env,
345 jni_obj_bluetoothManager, jni_mid_openGattServer, gContext,
346 gBluetoothGattServerCallback);
348 return jni_obj_bluetoothGattServer;
351 jobject CALEServerCreateGattService(JNIEnv *env)
354 OIC_LOG_V(DEBUG, TAG, "CALEServerCreateGattService");
356 jclass jni_cid_bluetoothGattService = (*env)->FindClass(env,
357 "android/bluetooth/BluetoothGattService");
359 jclass jni_cid_bluetoothGattCharacteristic = (*env)->FindClass(env,
360 "android/bluetooth/BluetoothGattCharacteristic");
362 jfieldID jni_fid_serviceType = (*env)->GetStaticFieldID(env,
363 jni_cid_bluetoothGattService, "SERVICE_TYPE_PRIMARY", "I");
365 jfieldID jni_fid_readProperties = (*env)->GetStaticFieldID(env,
366 jni_cid_bluetoothGattCharacteristic, "PROPERTY_READ", "I");
368 jfieldID jni_fid_writeProperties = (*env)->GetStaticFieldID(env,
369 jni_cid_bluetoothGattCharacteristic, "PROPERTY_WRITE", "I");
371 jfieldID jni_fid_readPermissions = (*env)->GetStaticFieldID(env,
372 jni_cid_bluetoothGattCharacteristic, "PERMISSION_READ", "I");
374 jfieldID jni_fid_writePermissions = (*env)->GetStaticFieldID(env,
375 jni_cid_bluetoothGattCharacteristic, "PERMISSION_WRITE", "I");
377 jmethodID jni_mid_bluetoothGattService = (*env)->GetMethodID(env,
378 jni_cid_bluetoothGattService, "<init>", "(Ljava/util/UUID;I)V");
380 jmethodID jni_mid_addCharacteristic = (*env)->GetMethodID(env,
381 jni_cid_bluetoothGattService, "addCharacteristic",
382 "(Landroid/bluetooth/BluetoothGattCharacteristic;)Z");
384 jmethodID jni_mid_bluetoothGattCharacteristic = (*env)->GetMethodID(env,
385 jni_cid_bluetoothGattCharacteristic, "<init>",
386 "(Ljava/util/UUID;II)V");
388 jobject jni_obj_serviceUUID = CALEGetUuidFromString(env, OIC_GATT_SERVICE_UUID);
390 jobject jni_obj_serviceType = (*env)->GetStaticObjectField(env,
391 jni_cid_bluetoothGattService, jni_fid_serviceType);
393 jobject jni_bluetoothGattService = (*env)->NewObject(env,
394 jni_cid_bluetoothGattService, jni_mid_bluetoothGattService,
395 jni_obj_serviceUUID, jni_obj_serviceType);
397 jobject jni_obj_readUuid = CALEGetUuidFromString(env,
398 OIC_GATT_CHARACTERISTIC_RESPONSE_UUID);
400 jint jni_int_readProperties = (*env)->GetStaticIntField(env,
401 jni_cid_bluetoothGattCharacteristic, jni_fid_readProperties);
403 jint jni_int_readPermissions = (*env)->GetStaticIntField(env,
404 jni_cid_bluetoothGattCharacteristic, jni_fid_readPermissions);
406 jobject jni_readCharacteristic = (*env)->NewObject(env,
407 jni_cid_bluetoothGattCharacteristic,
408 jni_mid_bluetoothGattCharacteristic, jni_obj_readUuid,
409 jni_int_readProperties, jni_int_readPermissions);
411 jboolean jni_boolean_addReadCharacteristic = (*env)->CallBooleanMethod(env,
412 jni_bluetoothGattService, jni_mid_addCharacteristic,
413 jni_readCharacteristic);
415 jobject jni_obj_writeUuid = CALEGetUuidFromString(env,
416 OIC_GATT_CHARACTERISTIC_REQUEST_UUID);
418 jint jni_int_writeProperties = (*env)->GetStaticIntField(env,
419 jni_cid_bluetoothGattCharacteristic, jni_fid_writeProperties);
421 jint jni_int_writePermissions = (*env)->GetStaticIntField(env,
422 jni_cid_bluetoothGattCharacteristic, jni_fid_writePermissions);
424 jobject jni_writeCharacteristic = (*env)->NewObject(env,
425 jni_cid_bluetoothGattCharacteristic,
426 jni_mid_bluetoothGattCharacteristic, jni_obj_writeUuid,
427 jni_int_writeProperties, jni_int_writePermissions);
429 jboolean jni_boolean_addWriteCharacteristic = (*env)->CallBooleanMethod(env,
430 jni_bluetoothGattService, jni_mid_addCharacteristic,
431 jni_writeCharacteristic);
433 if (jni_boolean_addWriteCharacteristic == JNI_FALSE)
435 OIC_LOG_V(DEBUG, TAG, "Fail to add jni_boolean_addReadCharacteristic");
439 return jni_bluetoothGattService;
442 jboolean CALEServerAddGattService(JNIEnv *env, jobject bluetoothGattServer,
443 jobject bluetoothGattService)
446 OIC_LOG_V(DEBUG, TAG, "CALEServerAddGattService");
448 jclass jni_cid_bluetoothGattServer = (*env)->FindClass(env,
449 "android/bluetooth/BluetoothGattServer");
451 jmethodID jni_mid_addService = (*env)->GetMethodID(env,
452 jni_cid_bluetoothGattServer, "addService",
453 "(Landroid/bluetooth/BluetoothGattService;)Z");
455 jboolean jni_boolean_addService = (*env)->CallBooleanMethod(env, bluetoothGattServer,
456 jni_mid_addService, bluetoothGattService);
458 if (jni_boolean_addService == JNI_FALSE)
460 OIC_LOG_V(DEBUG, TAG, "Fail to add gatt service");
463 return jni_boolean_addService;
466 jboolean CALEServerConnect(JNIEnv *env, jobject bluetoothDevice)
469 OIC_LOG_V(DEBUG, TAG, "CALEConnect");
471 jclass jni_cid_bluetoothGattServer = (*env)->FindClass(env,
472 "android/bluetooth/BluetoothGattServer");
474 jmethodID jni_mid_connect = (*env)->GetMethodID(env,
475 jni_cid_bluetoothGattServer, "connect",
476 "(Landroid/bluetooth/BluetoothDevice;Z)Z");
478 jboolean jni_boolean_connect = (*env)->CallBooleanMethod(env,
479 gBluetoothGattServer, jni_mid_connect, bluetoothDevice, JNI_TRUE);
481 if(jni_boolean_connect == JNI_FALSE) {
482 OIC_LOG_V(DEBUG, TAG, "Fail to connect");
485 return jni_boolean_connect;
488 void CALEServerDisconnect(JNIEnv *env, jobject bluetoothDevice)
491 OIC_LOG_V(DEBUG, TAG, "CALEDisconnect");
493 jclass jni_cid_bluetoothGattServer = (*env)->FindClass(env,
494 "android/bluetooth/BluetoothGattServer");
496 jmethodID jni_mid_cancelConnection = (*env)->GetMethodID(env,
497 jni_cid_bluetoothGattServer, "cancelConnection",
498 "(Landroid/bluetooth/BluetoothDevice;)V");
500 (*env)->CallVoidMethod(env, gBluetoothGattServer, jni_mid_cancelConnection,
504 jboolean CALEServerSend(JNIEnv *env, jobject bluetoothDevice, jbyteArray responseData)
507 OIC_LOG_V(DEBUG, TAG, "CALESend");
509 jobject responseChar = CALEServerSetResponseData(env, responseData);
511 jboolean result = CALEServerSendResponseData(env, bluetoothDevice, responseChar);
513 if(result == JNI_FALSE)
515 OIC_LOG_V(DEBUG, TAG, "Fail to send response data");
521 void CALeServerCreateJniInterfaceObject()
523 OIC_LOG_V(DEBUG, TAG, "CALeServerCreateJniInterfaceObject");
525 jboolean isAttached = FALSE;
527 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
530 OIC_LOG_V(DEBUG, TAG, "Could not get JNIEnv pointer");
531 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
535 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
541 // initialize le server
544 (*g_jvm)->DetachCurrentThread(g_jvm);
547 void CALEServerInitialize(u_thread_pool_t handle)
549 OIC_LOG(DEBUG, TAG, "CALEServerInitialize");
551 gThreadPoolHandle = handle;
553 CALEServerCreateCachedDeviceList();
556 void CALEServerTerminate()
558 OIC_LOG(DEBUG, TAG, "CALEServerTerminate");
560 jboolean isAttached = FALSE;
562 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
565 OIC_LOG_V(DEBUG, TAG, "Could not get JNIEnv pointer");
566 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
570 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
576 CALEServerStopMulticastServer(0);
578 CALEServerRemoveAllDevices(env);
580 if(gLeAdvertiseCallback)
582 (*env)->DeleteGlobalRef(env, gLeAdvertiseCallback);
585 if(gBluetoothGattServer)
587 (*env)->DeleteGlobalRef(env, gBluetoothGattServer);
590 if(gBluetoothGattServerCallback)
592 (*env)->DeleteGlobalRef(env, gBluetoothGattServerCallback);
597 (*env)->DeleteGlobalRef(env, gContext);
600 gIsStartServer = FALSE;
603 (*g_jvm)->DetachCurrentThread(g_jvm);
606 int32_t CALEServerSendUnicastMessage(const char* address, const char* data, uint32_t dataLen)
608 OIC_LOG_V(DEBUG, TAG, "CALEServerSendUnicastMessage(%s, %s)", address, data);
610 jboolean isAttached = FALSE;
612 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
615 OIC_LOG_V(DEBUG, TAG, "Could not get JNIEnv pointer");
616 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
620 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
626 CALEServerSendUnicastMessageImpl(env, address, data, dataLen);
629 (*g_jvm)->DetachCurrentThread(g_jvm);
634 int32_t CALEServerSendMulticastMessage(const char* data, uint32_t dataLen)
636 OIC_LOG_V(DEBUG, TAG, "CALEServerSendMulticastMessage(%s)", data);
638 jboolean isAttached = FALSE;
640 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
643 OIC_LOG_V(DEBUG, TAG, "Could not get JNIEnv pointer");
644 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
648 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
654 CALEServerSendMulticastMessageImpl(env, data, dataLen);
657 (*g_jvm)->DetachCurrentThread(g_jvm);
662 int32_t CALEServerStartUnicastServer(const char* address)
664 OIC_LOG_V(DEBUG, TAG, "CALEServerStartUnicastServer(%s)", address);
669 int32_t CALEServerStartMulticastServer()
671 OIC_LOG_V(DEBUG, TAG, "CALEServerStartMulticastServer");
675 OIC_LOG_V(DEBUG, TAG, "server is already started..it will be skipped");
679 jboolean isAttached = FALSE;
681 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
684 OIC_LOG_V(DEBUG, TAG, "Could not get JNIEnv pointer");
685 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
689 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
695 gIsStartServer = TRUE;
698 if( CALEStartGattServer(env, gBluetoothGattServerCallback) == JNI_FALSE) {
699 OIC_LOG_V(DEBUG, TAG, "Fail to start gatt server");
704 LEServerStartAdvertise(env, gLeAdvertiseCallback);
707 (*g_jvm)->DetachCurrentThread(g_jvm);
712 int32_t CALEServerStopUnicastServer(int32_t serverID)
714 OIC_LOG(DEBUG, TAG, "CALEServerStopUnicastServer");
719 int32_t CALEServerStopMulticastServer(int32_t serverID)
721 OIC_LOG(DEBUG, TAG, "CALEServerStopMulticastServer");
723 if(gIsStartServer == FALSE)
725 OIC_LOG_V(DEBUG, TAG, "server is already stopped..it will be skipped");
729 jboolean isAttached = FALSE;
731 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
734 OIC_LOG_V(DEBUG, TAG, "Could not get JNIEnv pointer");
735 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
739 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
745 LEServerStopAdvertise(env, gLeAdvertiseCallback);
747 gIsStartServer = FALSE;
750 (*g_jvm)->DetachCurrentThread(g_jvm);
755 void CALEServerSetCallback(CAPacketReceiveCallback callback)
757 OIC_LOG(DEBUG, TAG, "CALEServerSetCallback");
758 gPacketReceiveCallback = callback;
761 void CALEServerGetInterfaceInfo(CALocalConnectivity_t **info, uint32_t* size)
763 OIC_LOG(DEBUG, TAG, "CALEServerGetInterfaceInfo");
767 void CALEServerGetLocalAddress(char* address)
769 OIC_LOG(DEBUG, TAG, "CALEServerGetLocalAddress");
771 jboolean isAttached = FALSE;
773 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
776 OIC_LOG_V(DEBUG, TAG, "Could not get JNIEnv pointer");
777 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
780 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
786 jstring jni_address = CALEGetLocalDeviceAddress(env);
787 const char* localAddress = (*env)->GetStringUTFChars(env, jni_address, NULL);
788 memcpy(address, localAddress, strlen(localAddress));
790 OIC_LOG_V(DEBUG, TAG, "Local Address : %s", address);
792 (*g_jvm)->DetachCurrentThread(g_jvm);
795 int32_t CALEServerSendUnicastMessageImpl(JNIEnv *env, const char* address, const char* data,
798 OIC_LOG_V(DEBUG, TAG, "CALEServerSendUnicastMessageImpl, address: %s, data: %s", address, data);
800 // 1. get device object with address from cache
801 // 2. connect to the gatt client device
802 // 3. write a characteristic for response
806 jobject jni_obj_bluetoothDevice = NULL;
808 if(gConnectedDeviceList == NULL)
810 OIC_LOG(DEBUG, TAG, "gConnectedDeviceList is null");
813 if(gConnectedDeviceList)
816 for (index = 0; index < u_arraylist_length(gConnectedDeviceList); index++)
818 OIC_LOG(DEBUG, TAG, "check device address");
819 jobject jarrayObj = (jobject) u_arraylist_get(gConnectedDeviceList, index);
822 OIC_LOG(DEBUG, TAG, "jarrayObj is null");
826 jstring jni_setAddress = CALEGetAddressFromBTDevice(env, jarrayObj);
829 OIC_LOG(DEBUG, TAG, "jni_setAddress is null");
832 const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
834 if(jarrayObj == NULL) {
835 OIC_LOG(DEBUG, TAG, "jarrayObj is null");
838 if(!strcmp(setAddress, address))
840 OIC_LOG(DEBUG, TAG, "device address matched");
841 jni_obj_bluetoothDevice = jarrayObj;
844 jni_obj_bluetoothDevice = jarrayObj;
847 if(jni_obj_bluetoothDevice)
849 jbyteArray jni_bytearr_data = (*env)->NewByteArray(env, dataLen);
850 (*env)->SetByteArrayRegion(env, jni_bytearr_data, 0, dataLen, (jbyte*)data);
852 CALEServerSend(env, jni_obj_bluetoothDevice, jni_bytearr_data);
855 OIC_LOG(DEBUG, TAG, "jni_obj_bluetoothDevice is null");
861 int32_t CALEServerSendMulticastMessageImpl(JNIEnv *env, const char* data, uint32_t dataLen)
863 OIC_LOG_V(DEBUG, TAG, "CALEServerSendMulticastMessageImpl, send to, data: %s", data);
865 if(!gConnectedDeviceList)
867 OIC_LOG(DEBUG, TAG, "gConnectedDeviceList is null");
871 // 1. get all the device objects from cache
872 // 2. connect to the gatt client devices
873 // 3. write a characteristic for response
874 // 4. notify it to every devices
878 for (index = 0; index < u_arraylist_length(gConnectedDeviceList); index++)
880 jobject jarrayObj = (jobject) u_arraylist_get(gConnectedDeviceList, index);
883 OIC_LOG(DEBUG, TAG, "jarrayObj is null");
887 CALEServerConnect(env, jarrayObj);
895 JNIEXPORT void JNICALL Java_com_iotivity_jar_CALeInterface_CARegisterLeGattServerCallback
896 (JNIEnv *env, jobject obj, jobject callback)
898 OIC_LOG_V(DEBUG, TAG, "CALeInterface - Register Le Gatt Server Callback");
900 gBluetoothGattServerCallback = (*env)->NewGlobalRef(env, callback);
903 JNIEXPORT void JNICALL Java_com_iotivity_jar_CALeInterface_CARegisterBluetoothLeAdvertiseCallback
904 (JNIEnv *env, jobject obj, jobject callback)
906 OIC_LOG_V(DEBUG, TAG, "CALeInterface - Register Le Advertise Callback");
908 gLeAdvertiseCallback = (*env)->NewGlobalRef(env, callback);
911 JNIEXPORT void JNICALL Java_com_iotivity_jar_CALeInterface_CALeGattServerConnectionStateChangeCallback
912 (JNIEnv *env, jobject obj, jobject device, jint status, jint newState)
914 OIC_LOG_V(DEBUG, TAG, "CALeInterface - Gatt Server ConnectionStateChange Callback");
916 OIC_LOG_V(DEBUG, TAG, "New connection State: %d", newState);
920 OIC_LOG(DEBUG, TAG, "device is null");
924 jclass jni_cid_bluetoothProfile = (*env)->FindClass(env,
925 "android/bluetooth/BluetoothProfile");
927 jfieldID jni_fid_state_connected = (*env)->GetStaticFieldID(env,
928 jni_cid_bluetoothProfile, "STATE_CONNECTED", "I");
930 jfieldID jni_fid_state_disconnected = (*env)->GetStaticFieldID(env,
931 jni_cid_bluetoothProfile, "STATE_DISCONNECTED", "I");
934 jint jni_int_state_connected = (*env)->GetStaticIntField(env,
935 jni_cid_bluetoothProfile, jni_fid_state_connected);
937 // STATE_DISCONNECTED
938 jint jni_int_state_disconnected = (*env)->GetStaticIntField(env,
939 jni_cid_bluetoothProfile, jni_fid_state_disconnected);
941 if(newState == jni_int_state_connected)
944 OIC_LOG_V(DEBUG, TAG, "LE CONNECTED");
946 jstring jni_remoteAddress = CALEGetAddressFromBTDevice(env, device);
947 if (!jni_remoteAddress)
949 OIC_LOG(DEBUG, TAG, "jni_remoteAddress is null");
953 const char* remoteAddress = (*env)->GetStringUTFChars(env, jni_remoteAddress, NULL);
955 if (gConnectedDeviceList == NULL)
957 OIC_LOG_V(DEBUG, TAG, "gConnectedDeviceList is null");
960 if(CALEServerIsDeviceInList(env, remoteAddress) == JNI_FALSE)
962 OIC_LOG_V(DEBUG, TAG, "add connected device to cache");
963 CALEServerAddDeviceToList(env, device);
967 else if(newState == jni_int_state_disconnected)
969 OIC_LOG_V(DEBUG, TAG, "LE DISCONNECTED");
973 void CALEServerCreateCachedDeviceList()
975 OIC_LOG(DEBUG, TAG, "CALEServerCreateCachedDeviceList");
977 // create new object array
978 if (gConnectedDeviceList == NULL)
980 OIC_LOG_V(DEBUG, TAG, "Create device list");
982 gConnectedDeviceList = u_arraylist_create();
986 jboolean CALEServerIsDeviceInList(JNIEnv *env, const char* remoteAddress)
988 OIC_LOG(DEBUG, TAG, "CALEServerIsDeviceInList");
990 if(gConnectedDeviceList == NULL)
991 OIC_LOG(DEBUG, TAG, "list is null");
993 uint32_t len = u_arraylist_length(gConnectedDeviceList);
996 for (index = 0; index < u_arraylist_length(gConnectedDeviceList); index++)
998 jobject jarrayObj = (jobject) u_arraylist_get(gConnectedDeviceList, index);
1002 OIC_LOG(DEBUG, TAG, "jarrayObj is null");
1006 jstring jni_setAddress = CALEGetAddressFromBTDevice(env, jarrayObj);
1007 if (!jni_setAddress)
1009 OIC_LOG(DEBUG, TAG, "jni_setAddress is null");
1013 const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress,
1016 if (!strcmp(remoteAddress, setAddress))
1018 OIC_LOG_V(DEBUG, TAG, "the device is already set");
1027 OIC_LOG_V(DEBUG, TAG, "no device in list");
1031 void CALEServerAddDeviceToList(JNIEnv *env, jobject device)
1035 OIC_LOG(DEBUG, TAG, "device is null");
1039 if (gConnectedDeviceList == NULL)
1041 OIC_LOG(DEBUG, TAG, "list is null");
1045 jstring jni_remoteAddress = CALEGetAddressFromBTDevice(env, device);
1046 if (!jni_remoteAddress)
1048 OIC_LOG(DEBUG, TAG, "jni_remoteAddress is null");
1052 const char* remoteAddress = (*env)->GetStringUTFChars(env,
1053 jni_remoteAddress, NULL);
1055 if (CALEServerIsDeviceInList(env, remoteAddress) == JNI_FALSE)
1057 jobject gdevice = (*env)->NewGlobalRef(env, device);
1058 u_arraylist_add(gConnectedDeviceList, gdevice);
1059 OIC_LOG_V(DEBUG, TAG, "Set Object to Array as Element");
1063 void CALEServerRemoveAllDevices(JNIEnv *env)
1065 OIC_LOG_V(DEBUG, TAG, "CALEServerRemoveAllDevices");
1067 if (!gConnectedDeviceList)
1069 OIC_LOG(DEBUG, TAG, "no deviceList");
1074 for (index = 0; index < u_arraylist_length(gConnectedDeviceList); index++)
1076 jobject jarrayObj = (jobject) u_arraylist_get(gConnectedDeviceList, index);
1080 (*env)->DeleteGlobalRef(env, jarrayObj);
1084 OICFree(gConnectedDeviceList);
1085 gConnectedDeviceList = NULL;
1089 void CALEServerRemoveDevice(JNIEnv *env, jstring address)
1091 OIC_LOG_V(DEBUG, TAG, "CALEServerRemoveDevice");
1093 if (!gConnectedDeviceList)
1095 OIC_LOG(DEBUG, TAG, "no deviceList");
1100 for (index = 0; index < u_arraylist_length(gConnectedDeviceList); index++)
1102 jobject jarrayObj = (jobject) u_arraylist_get(gConnectedDeviceList, index);
1106 jstring jni_setAddress = CALEGetAddressFromBTDevice(env, jarrayObj);
1107 if (!jni_setAddress)
1109 OIC_LOG(DEBUG, TAG, "wrong device address");
1112 const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress,
1114 const char* remoteAddress = (*env)->GetStringUTFChars(env, address,
1117 if (!strcmp(setAddress, remoteAddress))
1119 OIC_LOG_V(DEBUG, TAG, "device address : %s", remoteAddress);
1120 (*env)->DeleteGlobalRef(env, jarrayObj);
1122 CALEServerReorderinglist(index);
1127 OIC_LOG(DEBUG, TAG, "no target object");
1131 void CALEServerReorderinglist(uint32_t index)
1133 if (index >= gConnectedDeviceList->length)
1136 if (index < gConnectedDeviceList->length - 1)
1138 memmove(&gConnectedDeviceList->data[index], &gConnectedDeviceList->data[index + 1],
1139 (gConnectedDeviceList->length - index - 1) * sizeof(void *));
1142 gConnectedDeviceList->size--;
1143 gConnectedDeviceList->length--;
1146 JNIEXPORT void JNICALL
1147 Java_com_iotivity_jar_CALeInterface_CALeGattServerServiceAddedCallback
1148 (JNIEnv *env, jobject obj, jint status, jobject gattService)
1150 OIC_LOG_V(DEBUG, TAG, "CALeInterface - Gatt Service Added Callback(%d)", status);
1153 JNIEXPORT void JNICALL
1154 Java_com_iotivity_jar_CALeInterface_CALeGattServerCharacteristicReadRequestCallback
1155 (JNIEnv *env, jobject obj, jobject device, jint requestId, jint offset, jobject characteristic, jbyteArray data)
1157 OIC_LOG_V(DEBUG, TAG, "CALeInterface - Gatt Server Characteristic Read Request Callback");
1159 CALEServerSendResponse(env, device, requestId, 0, offset, NULL);
1162 JNIEXPORT void JNICALL
1163 Java_com_iotivity_jar_CALeInterface_CALeGattServerCharacteristicWriteRequestCallback
1164 (JNIEnv *env, jobject obj, jobject device, jint requestId, jobject characteristic, jbyteArray data,
1165 jboolean preparedWrite, jboolean responseNeeded, jint offset, jbyteArray value)
1167 OIC_LOG_V(DEBUG, TAG, "CALeInterface - Gatt Server Characteristic Write Request Callback");
1169 CALEServerSendResponse(env, device, requestId, 0, offset, value);
1173 OIC_LOG_V(DEBUG, TAG, "Reqeust data is null");
1178 char* requestData = (char*)(*env)->GetByteArrayElements(env, data, &isCopy);
1180 jstring jni_address = CALEGetAddressFromBTDevice(env, device);
1181 const char* address = (*env)->GetStringUTFChars(env, jni_address, NULL);
1182 OIC_LOG_V(DEBUG, TAG, "remote device address : %s", address);
1184 gPacketReceiveCallback(address, requestData);
1187 JNIEXPORT void JNICALL
1188 Java_com_iotivity_jar_CALeInterface_CALeGattServerDescriptorReadRequestCallback
1189 (JNIEnv *env, jobject obj, jobject device, jint requestId, jint offset, jobject descriptor)
1191 OIC_LOG_V(DEBUG, TAG, "CALeInterface_CALeGattServerDescriptorReadRequestCallback");
1194 JNIEXPORT void JNICALL
1195 Java_com_iotivity_jar_CALeInterface_CALeGattServerDescriptorWriteRequestCallback
1196 (JNIEnv *env, jobject obj, jobject device, jint requestId, jobject descriptor,
1197 jboolean preparedWrite, jboolean responseNeeded, jint offset, jbyteArray value)
1199 OIC_LOG_V(DEBUG, TAG, "CALeInterface_CALeGattServerDescriptorWriteRequestCallback");
1202 JNIEXPORT void JNICALL
1203 Java_com_iotivity_jar_CALeInterface_CALeGattServerExecuteWriteCallback
1204 (JNIEnv *env, jobject obj, jobject device, jint requestId, jboolean execute)
1206 OIC_LOG_V(DEBUG, TAG, "CALeInterface_CALeGattServerExecuteWriteCallback");
1208 CALEServerSendResponse(env, device, requestId, 0, 0, NULL);
1211 JNIEXPORT void JNICALL
1212 Java_com_iotivity_jar_CALeInterface_CALeGattServerNotificationSentCallback
1213 (JNIEnv *env, jobject obj, jobject device, jint status)
1215 OIC_LOG_V(DEBUG, TAG, "CALeInterface - Gatt Server Notification Sent Callback");
1218 JNIEXPORT void JNICALL
1219 Java_com_iotivity_jar_CALeInterface_CALeAdvertiseStartSuccessCallback
1220 (JNIEnv *env, jobject obj, jobject settingsInEffect)
1222 OIC_LOG_V(DEBUG, TAG, "CALeInterface - LE Advertise Start Success Callback");
1225 JNIEXPORT void JNICALL
1226 Java_com_iotivity_jar_CALeInterface_CALeAdvertiseStartFailureCallback
1227 (JNIEnv *env, jobject obj, jint errorCode)
1229 OIC_LOG_V(DEBUG, TAG, "CALeInterface - LE Advertise Start Failure Callback(%)", errorCode);