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 ******************************************************************/
23 * This file contains the APIs for BT LE communications.
25 #ifndef CA_LECLIENT_H_
26 #define CA_LECLIENT_H_
29 #include "cathreadpool.h"
30 #include "uarraylist.h"
38 static const uint16_t GATT_ERROR = 133;
40 static const uint16_t STATE_CHARACTER_SET = 2;
41 static const uint16_t STATE_CHARACTER_UNSET = 1;
42 static const uint16_t STATE_CHARACTER_NO_CHANGE = 0;
44 static const uint16_t STATE_SEND_NONE = 0;
45 static const uint16_t STATE_SEND_SUCCESS = 1;
46 static const uint16_t STATE_SEND_FAILED = 2;
48 static const jint STATE_CONNECTED = 2;
49 static const jint STATE_DISCONNECTED = 0;
51 typedef struct le_state_info
53 char address[CA_MACADDR_SIZE];
55 uint16_t notificationState;
60 * Callback to be notified on reception of any data from remote devices.
61 * @param[in] address MAC address of remote device.
62 * @param[in] data Data received from remote device.
63 * @pre Callback must be registered using CALESetCallback(CAPacketReceiveCallback callback)
65 typedef void (*CAPacketReceiveCallback)(const char *address, const uint8_t *data);
68 * initialize JNI object.
70 void CALEClientJniInit();
73 * set context of application.
75 void CALEClientJNISetContext();
78 * create interface object and initialize the object.
79 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
81 CAResult_t CALEClientCreateJniInterfaceObject();
84 * initialize client for BLE.
85 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
87 CAResult_t CALEClientInitialize();
90 * terminate client for BLE.
92 void CALEClientTerminate();
95 * destroy interface object and terminate the interface.
96 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
98 CAResult_t CALEClientDestroyJniInterface();
101 * for destroy sending routine.
102 * @param[in] env JNI interface pointer.
103 * @param[in] gatt Gatt profile object.
105 void CALEClientSendFinish(JNIEnv *env, jobject gatt);
108 * send data for unicast (interface).
109 * @param[in] address remote address.
110 * @param[in] data data for transmission.
111 * @param[in] dataLen data length.
112 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
114 CAResult_t CALEClientSendUnicastMessage(const char *address, const uint8_t *data,
115 const uint32_t dataLen);
118 * send data for multicast (interface).
119 * @param[in] data data for transmission.
120 * @param[in] dataLen data length.
121 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
123 CAResult_t CALEClientSendMulticastMessage(const uint8_t *data, const uint32_t dataLen);
126 * start unicast server.
127 * @param[in] address remote address.
128 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
130 CAResult_t CALEClientStartUnicastServer(const char *address);
133 * start multicast server (start discovery).
134 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
136 CAResult_t CALEClientStartMulticastServer();
139 * stop unicast server.
141 void CALEClientStopUnicastServer();
144 * stop multicast server (stop discovery).
146 void CALEClientStopMulticastServer();
149 * set this callback for receiving data packets from peer devices.
150 * @param[in] callback callback to be notified on reception of
151 * unicast/multicast data packets.
153 void CALEClientSetCallback(CAPacketReceiveCallback callback);
156 * waiting to get scanned device from BT Platform.
157 * if there is no scanned device in the list.
158 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
160 CAResult_t CALEClientIsThereScannedDevices();
163 * send data for unicast (implement).
164 * @param[in] address remote address.
165 * @param[in] data data for transmission.
166 * @param[in] dataLen data length.
167 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
169 CAResult_t CALEClientSendUnicastMessageImpl(const char *address, const uint8_t *data,
170 const uint32_t dataLen);
173 * send data for multicast (implement).
174 * @param[in] env JNI interface pointer.
175 * @param[in] data data for transmission.
176 * @param[in] dataLen data length.
177 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
179 CAResult_t CALEClientSendMulticastMessageImpl(JNIEnv *env, const uint8_t *data,
180 const uint32_t dataLen);
183 * check whether it is connected or not with remote address.
184 * @param[in] address remote address.
185 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
187 CAResult_t CALECheckSendState(const char* address);
190 * send data to remote device.
191 * if it isn't connected yet. connect LE before try to send data.
192 * @param[in] env JNI interface pointer.
193 * @param[in] device bluetooth device object.
194 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
196 CAResult_t CALEClientSendData(JNIEnv *env, jobject device);
199 * get address from bluetooth gatt object.
200 * @param[in] env JNI interface pointer.
201 * @param[in] gatt Gatt profile object.
202 * @return bluetooth address.
204 jstring CALEClientGetAddressFromGattObj(JNIEnv *env, jobject gatt);
207 * get remote address from bluetooth socket object.
208 * @param[in] env JNI interface pointer.
209 * @param[in] bluetoothSocketObj bluetooth socket.
210 * @return bluetooth address.
212 jstring CALEClientGetRemoteAddress(JNIEnv *env, jobject bluetoothSocketObj);
216 * @param[in] env JNI interface pointer.
217 * @param[in] bluetoothGatt gatt profile object.
218 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
220 CAResult_t CALEClientGattClose(JNIEnv *env, jobject bluetoothGatt);
223 * start to scan whole bluetooth devices (interface).
224 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
226 CAResult_t CALEClientStartScan();
229 * start to scan whole bluetooth devices (implement).
230 * @param[in] env JNI interface pointer.
231 * @param[in] callback callback to receive device object by scanning.
232 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
234 CAResult_t CALEClientStartScanImpl(JNIEnv *env, jobject callback);
237 * start to scan target bluetooth devices for service uuid (implement).
238 * @param[in] env JNI interface pointer.
239 * @param[in] uuids target UUID.
240 * @param[in] callback callback to receive device object by scanning.
241 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
243 CAResult_t CALEClientStartScanWithUUIDImpl(JNIEnv *env, jobjectArray uuids,
248 * @param[in] env JNI interface pointer.
249 * @param[in] uuid uuid.
250 * @return uuid object.
252 jobject CALEClientGetUUIDObject(JNIEnv *env, const char *uuid);
255 * stop scan (interface).
256 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
258 CAResult_t CALEClientStopScan();
261 * set ble scanning flag.
262 * @param[in] flag scan flag.
264 void CALEClientSetScanFlag(bool flag);
267 * stop scan (implement).
268 * @param[in] env JNI interface pointer.
269 * @param[in] callback callback to receive device object by scanning.
270 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
272 CAResult_t CALEClientStopScanImpl(JNIEnv *env, jobject callback);
275 * connect to gatt server hosted.
276 * @param[in] env JNI interface pointer.
277 * @param[in] bluetoothDevice bluetooth Device object.
278 * @param[in] autoconnect whether to directly connect to the remote device(false) or
279 * to automatically connect as soon as the remote device
281 * @return gatt object
283 jobject CALEClientConnect(JNIEnv *env, jobject bluetoothDevice, jboolean autoconnect);
286 * disconnect to gatt server by a target device.
287 * @param[in] env JNI interface pointer.
288 * @param[in] bluetoothGatt Gatt profile object.
289 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
291 CAResult_t CALEClientDisconnect(JNIEnv *env, jobject bluetoothGatt);
294 * disconnect to gatt server by whole devices.
295 * @param[in] env JNI interface pointer.
296 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
298 CAResult_t CALEClientDisconnectAll(JNIEnv *env);
301 * disconnect to gatt server by selected address.
302 * @param[in] env JNI interface pointer.
303 * @param[in] remoteAddress remote address.
304 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
306 CAResult_t CALEClientDisconnectforAddress(JNIEnv *env, jstring remoteAddress);
309 * start discovery server.
310 * @param[in] env JNI interface pointer.
311 * @param[in] bluetoothGatt Gatt profile object.
312 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
314 CAResult_t CALEClientDiscoverServices(JNIEnv *env, jobject bluetoothGatt);
317 * call CALESetValueAndWriteCharacteristic when connection is successful.
318 * @param[in] env JNI interface pointer.
319 * @param[in] gatt Gatt profile object.
320 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
322 CAResult_t CALEClientWriteCharacteristic(JNIEnv *env, jobject gatt);
325 * create GattCharacteristic and call CALEClientWriteCharacteristicImpl
326 * for request to write gatt characteristic.
327 * @param[in] env JNI interface pointer.
328 * @param[in] gatt Gatt profile object.
329 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
331 CAResult_t CALESetValueAndWriteCharacteristic(JNIEnv *env, jobject gatt);
334 * request to write gatt characteristic.
335 * @param[in] env JNI interface pointer.
336 * @param[in] bluetoothGatt Gatt profile object.
337 * @param[in] gattCharacteristic characteristic object that contain data to send.
338 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
340 CAResult_t CALEClientWriteCharacteristicImpl(JNIEnv *env, jobject bluetoothGatt,
341 jobject gattCharacteristic);
344 * request to read gatt characteristic.
345 * @param[in] env JNI interface pointer.
346 * @param[in] bluetoothGatt Gatt profile object.
347 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
349 CAResult_t CALEClientReadCharacteristic(JNIEnv *env, jobject bluetoothGatt);
352 * enable notification for a target device.
353 * @param[in] env JNI interface pointer.
354 * @param[in] bluetoothGatt Gatt profile object.
355 * @param[in] characteristic Characteristic object.
356 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
358 CAResult_t CALEClientSetCharacteristicNotification(JNIEnv *env, jobject bluetoothGatt,
359 jobject characteristic);
362 * create gatt characteristic object.
363 * @param[in] env JNI interface pointer.
364 * @param[in] bluetoothGatt Gatt profile object.
365 * @param[in] data for make Characteristic with data.
366 * @return Gatt Characteristic object.
368 jobject CALEClientCreateGattCharacteristic(JNIEnv *env, jobject bluetoothGatt, jbyteArray data);
372 * @param[in] env JNI interface pointer.
373 * @param[in] bluetoothGatt Gatt profile object.
374 * @param[in] characterUUID for make BluetoothGattCharacteristic object.
375 * @return Gatt Service.
377 jobject CALEClientGetGattService(JNIEnv *env, jobject bluetoothGatt, jstring characterUUID);
380 * get value from characteristic.
381 * @param[in] env JNI interface pointer.
382 * @param[in] characteristic Characteristic object.
383 * @return value in characteristic.
385 jbyteArray CALEClientGetValueFromCharacteristic(JNIEnv *env, jobject characteristic);
389 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
391 CAResult_t CALEClientCreateUUIDList();
394 * set UUID to descriptor.
395 * @param[in] env JNI interface pointer.
396 * @param[in] bluetoothGatt Gatt profile object.
397 * @param[in] characteristic Characteristic object.
398 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
400 CAResult_t CALEClientSetUUIDToDescriptor(JNIEnv *env, jobject bluetoothGatt,
401 jobject characteristic);
404 * add device object to scan device list.
405 * @param[in] env JNI interface pointer.
406 * @param[in] device bluetooth device object.
407 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
409 CAResult_t CALEClientAddScanDeviceToList(JNIEnv *env, jobject device);
412 * check whether the device exist in list or not.
413 * @param[in] env JNI interface pointer.
414 * @param[in] remoteAddress remote address.
415 * @return true or false.
417 bool CALEClientIsDeviceInScanDeviceList(JNIEnv *env, const char *remoteAddress);
420 * remove all devices in scan device list.
421 * @param[in] env JNI interface pointer.
422 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
424 CAResult_t CALEClientRemoveAllScanDevices(JNIEnv *env);
427 * remove target device in scan device list.
428 * @param[in] env JNI interface pointer.
429 * @param[in] remoteAddress remote address.
430 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
432 CAResult_t CALEClientRemoveDeviceInScanDeviceList(JNIEnv *env, jstring remoteAddress);
435 * add gatt object to gatt object list.
436 * @param[in] env JNI interface pointer.
437 * @param[in] gatt Gatt profile object.
438 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
440 CAResult_t CALEClientAddGattobjToList(JNIEnv *env, jobject gatt);
443 * check whether the gatt object exist in list or not.
444 * @param[in] env JNI interface pointer.
445 * @param[in] remoteAddress remote address.
446 * @return true or false.
448 bool CALEClientIsGattObjInList(JNIEnv *env, const char *remoteAddress);
451 * get the gatt object.
452 * @param[in] env JNI interface pointer.
453 * @param[in] remoteAddress remote address.
454 * @return gatt object.
456 jobject CALEClientGetGattObjInList(JNIEnv *env, const char* remoteAddress);
459 * remove all gatt objects in gatt object list.
460 * @param[in] env JNI interface pointer.
461 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
463 CAResult_t CALEClientRemoveAllGattObjs(JNIEnv *env);
466 * remove target device in gatt object list.
467 * @param[in] env JNI interface pointer.
468 * @param[in] gatt Gatt profile object.
469 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
471 CAResult_t CALEClientRemoveGattObj(JNIEnv *env, jobject gatt);
474 * remove gatt object of target device for address in gatt object list.
475 * @param[in] env JNI interface pointer.
476 * @param[in] gatt Gatt profile object.
477 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
479 CAResult_t CALEClientRemoveGattObjForAddr(JNIEnv *env, jstring addr);
482 * get ble address from Bluetooth device.
483 * @param[in] env JNI interface pointer.
484 * @param[in] bluetoothDevice Bluetooth device.
485 * @return ble address.
487 jstring CALEClientGetLEAddressFromBTDevice(JNIEnv *env, jobject bluetoothDevice);
490 * update new state information.
491 * @param[in] address remote address.
492 * @param[in] connectedState connection state.
493 * @param[in] notificationState whether characteristic notification already set or not.
494 * @param[in] sendState whether sending was success or not.
495 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
497 CAResult_t CALEClientUpdateDeviceState(const char* address, uint32_t connectedState,
498 uint16_t notificationState, uint16_t sendState);
501 * add new state to state list.
502 * @param[in] state new state.
503 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
505 CAResult_t CALEClientAddDeviceStateToList(CALEState_t* state);
508 * check whether the remote address is existed or not.
509 * @param[in] address remote address.
510 * @return true or false.
512 bool CALEClientIsDeviceInList(const char *remoteAddress);
515 * remove all device states.
516 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
518 CAResult_t CALEClientRemoveAllDeviceState();
521 * remove the device state for a remote device.
522 * @param[in] remoteAddress remote address.
523 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
525 CAResult_t CALEClientRemoveDeviceState(const char* remoteAddress);
528 * get state information for a remote device.
529 * @param[in] remoteAddress remote address.
530 * @return CALEState_t.
532 CALEState_t* CALEClientGetStateInfo(const char* remoteAddress);
535 * check whether the remote address is connected or not.
536 * @param[in] remoteAddress remote address.
537 * @return true or false.
539 bool CALEClientIsConnectedDevice(const char* remoteAddress);
542 * check whether the remote address set CharacteristicNotification or not.
543 * @param[in] remoteAddress remote address.
544 * @return true or false.
546 bool CALEClientIsSetCharacteristic(const char* remoteAddress);
549 * create scan device list.
551 void CALEClientCreateDeviceList();
554 * update the counter which data is sent to remote device.
555 * @param[in] env JNI interface pointer.
557 void CALEClientUpdateSendCnt(JNIEnv *env);
561 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
563 CAResult_t CALEClientInitGattMutexVaraibles();
568 void CALEClientTerminateGattMutexVariables();
571 * set send finish flag.
572 * @param[in] flag finish flag.
574 void CALEClientSetSendFinishFlag(bool flag);
577 * close the connection of the profile proxy to the Service.
578 * @param[in] env JNI interface pointer.
579 * @param[in] gatt gatt profile object.
580 * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
582 CAResult_t CALEClientCloseProfileProxy(JNIEnv *env, jobject gatt);
585 * connect to GATT Server hosted by this device.
586 * @param[in] env JNI interface pointer.
587 * @param[in] bluetoothDevice bluetooth device object.
588 * @param[in] autoconnect connect as soon as the device becomes avaiable(true).
589 * @return gatt profile object
591 jobject CALEClientGattConnect(JNIEnv *env, jobject bluetoothDevice, jboolean autoconnect);
597 #endif /* CA_LECLIENT_H_ */