From 820e74c3fa63a8139f9d3f68ddc3315a63d7b3b4 Mon Sep 17 00:00:00 2001 From: Segwon Date: Tue, 26 Sep 2017 17:50:55 +0900 Subject: [PATCH] Remove the d2d-conv-manager native apis. PS2: Reviewed PS6: d2d.datasharing privilege removed PS11: Fixed table Signed-off-by: Segwon Change-Id: I0d09cde050a71127b14153cc0dcdd58c23df77f0 --- .../html/images/d2d_access_control.png | Bin 105974 -> 0 bytes .../html/images/d2d_app_communication.png | Bin 8393 -> 0 bytes .../html/images/d2d_remote_app_control.png | Bin 5368 -> 0 bytes org.tizen.guides/html/images/d2d_tizen_connect.png | Bin 52626 -> 0 bytes org.tizen.guides/html/images/d2d_workflow.png | Bin 6323 -> 0 bytes org.tizen.guides/html/index.htm | 1 - .../native/connectivity/connectivity_cover_n.htm | 3 - .../native/connectivity/d2d_connectivity_n.htm | 704 --------------------- org.tizen.guides/html/native/device/system_n.htm | 38 +- org.tizen.guides/index.xml | 1 - .../html/native/details/app_filtering_n.htm | 10 - .../html/native/details/sec_privileges_n.htm | 14 - .../html/native/details/tizen_apis_n.htm | 18 - .../html/web/details/sec_privileges_w.htm | 14 - 14 files changed, 11 insertions(+), 792 deletions(-) delete mode 100644 org.tizen.guides/html/images/d2d_access_control.png delete mode 100644 org.tizen.guides/html/images/d2d_app_communication.png delete mode 100644 org.tizen.guides/html/images/d2d_remote_app_control.png delete mode 100644 org.tizen.guides/html/images/d2d_tizen_connect.png delete mode 100644 org.tizen.guides/html/images/d2d_workflow.png delete mode 100644 org.tizen.guides/html/native/connectivity/d2d_connectivity_n.htm diff --git a/org.tizen.guides/html/images/d2d_access_control.png b/org.tizen.guides/html/images/d2d_access_control.png deleted file mode 100644 index f6d65962700d756c14fe13cb01731e8778d67f6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105974 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Ð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
  • Messaging diff --git a/org.tizen.guides/html/native/connectivity/connectivity_cover_n.htm b/org.tizen.guides/html/native/connectivity/connectivity_cover_n.htm index ad18a32..6344d67 100644 --- a/org.tizen.guides/html/native/connectivity/connectivity_cover_n.htm +++ b/org.tizen.guides/html/native/connectivity/connectivity_cover_n.htm @@ -90,9 +90,6 @@

    You can perform network service discoveries to announce local services and search for remote services.

  • -
  • Convergence - -

    You can open logical channels for exchanging messages across devices, and start and control applications on a remote device. Convergence services allow applications and devices in the network to discover, connect, and communicate to each other.

  • diff --git a/org.tizen.guides/html/native/connectivity/d2d_connectivity_n.htm b/org.tizen.guides/html/native/connectivity/d2d_connectivity_n.htm deleted file mode 100644 index 632aac6..0000000 --- a/org.tizen.guides/html/native/connectivity/d2d_connectivity_n.htm +++ /dev/null @@ -1,704 +0,0 @@ - - - - - - - - - - - - - Convergence - - - -
    -
    -

    Mobile native Wearable native

    -
    - - -
    - -
    -

    Convergence

    - -

    As the number of Tizen devices is increasing, platform features that allow connections between different devices as well as sharing data and commands among them is required. Tizen device-to-device (D2D) connectivity framework provides this feature through a collection of D2D convergence services and the Convergence API. Being a part of the platform, the D2D connectivity framework is available on all Tizen TV, mobile, and wearable devices. The D2D connectivity features are aimed at streamlining the application development process and guaranteeing the compatibility and extensibility in the future.

    - -

    The D2D connectivity framework allows applications and devices in the network to discover, connect, and communicate to each other through convergence services. The app communication service opens logical channels for exchanging messages across devices, while the remote app control service starts and controls an application on a remote device.

    - -
    - Note - The D2D connectivity framework supports only Wi-Fi networks. More connectivity types, such as Bluetooth, Bluetooth Low Energy, and Wi-Fi Direct™, are going to be added in future versions. -

    Only 2 services, app communication and remote app control, are currently supported. More services are going to be introduced in the future versions of Tizen. All convergence services are predefined in the platform, which means that you cannot add new ones on your own.

    -
    - -

    The main features of the Convergence API include:

    - - - -

    The Convergence API includes features to implement a typical convergence application workflow: discovering nearby devices and browsing available services, connecting to a specific service, and using the service. The payload functions defined for packaging data and transferring messages between end-points accept plain strings, byte arrays, and application control data. The payload also contains several predefined fields for your use.

    -

    The following figure illustrates the workflow of the D2D connectivity features.

    - -

    Figure: D2D connectivity workflow

    -

    D2D connectivity workflow

    - - - -

    App Communication Service

    - -

    The convergence architecture allows the app communication service to launch an application on a device equipped with the remote server, and communicate with the server application by sending a payload. The remote server application can also use the app communication service to send responses to the local (client-side) application. In this way, a sophisticated data exchange protocol can be established. Before using the app communication service, set up the listener callbacks and initialize the application.

    - -

    The following figure illustrates the architecture.

    - -

    Figure: App communication service

    -

    App communication service

    - -
    - Note - Currently, the remote server can only be implemented on a TV device based on Tizen 3.0, which means that you can remotely launch applications on TV devices only. You can develop a mobile or wearable client for the app communication service, if a server exists. -
    - -

    A typical app communication service work flow starts with the discovery step, in which the mobile or wearable device discovers the service provided by the TV. When the service is found, the mobile or wearable device launches an application in the TV remotely and communicates with it. The app-to-app communication is bidirectional, so both local and remote applications usually play the roles of sender and listener.

    - -

    The app communication service has a client-server architecture:

    - -
      -
    • The app communication service relies on the remote server. This means that the server application (the application on the remote server, such as TV) initialization and execution differs slightly from the client application (the application on the mobile or wearable device).
    • -
    • The client application can remotely launch the application on the server side or connect to the already running server application, but not the other way round. Both client and server side applications can send payloads and listen to each other.
    • -
    • More than 1 client can be connected to a server application. For example, multiple players on mobile devices can connect to a game application on the TV, which takes a role of a server.
    • -
    - -

    The app communication service channel specifies the server application the client wants to connect with. The channel data is composed of a URI and channel ID, which are assigned to the channel handle:

    -
    -conv_channel_set_string(channel_handle, "uri", "org.example.d2d_test");
    -conv_channel_set_string(channel_handle, "channel_id", "test");
    -
    -

    The channel URI is the URI of the server side application, while the channel ID is a developer-defined value. Note that both URI and ID fields are mandatory for using the app communication service. If not provided, the CONV_ERROR_INVALID_PARAMETER error occurs. You must know the server side application URI: you either develop both the client and server application yourself, or acquire the server application URI from other sources.

    - -

    Remote App Control Service

    - -

    In contrast to the app communication service, the remote app control service does not need a server. The service is based on a peer-to-peer scheme, which means that the communication between 2 remote devices is symmetric. In addition, the remote app control service does not provide channels.

    - -

    The connection between applications is based on IoTivity, as illustrated in the following figure.

    - -

    Figure: Remote app control service

    -

    Remote app control service

    - -

    In Tizen 3.0, the remote app control service is supported in mobile and wearable profiles. With this service, you can use the Tizen App Control feature across remote devices.

    -

    The typical remote app control service workflow starts with the discovery of the remote app control service on the nearby devices. When the service is found, the application control feature can be used to launch an application on the remote device and receive results of operations performed by the launched application.

    - -

    Access Control

    - -

    The remote app control service can attempt to launch an application on a remote device without user permission. To prevent this, an access control module is implemented within the D2D connectivity framework.

    -

    The access control setup is similar to the pairing of Bluetooth devices. When a device tries to access a remote device with the conv_service_start() function, a passcode pops up on the remote device screen and the user must enter that passcode on the original device. Once the passcode is entered correctly, the remote device is managed as an allowed device and a passcode is not asked for again.

    - -

    The following figure shows the device on the left trying to access the device on the right.

    - -

    Figure: Access control

    -

    Access control

    - -

    You can manage allowed devices in the Tizen Connect tab of the Tizen settings application. When the Tizen Connect feature is enabled, all discovered nearby devices are presented to the user in 3 lists: allowed, denied, and available. The user can allow or deny each device by selecting the device name in the list.

    -

    All remote devices in the Allowed devices list can access the original device without the passcode, while all devices in Denied devices list cannot access the original device at all. The user can refresh the list of available nearby devices by clicking Scan.

    - -

    Figure: Tizen Connect

    -

    Tizen Connect

    - -

    Prerequisites

    - -

    To enable your application to use the D2D connectivity functionality:

    -
      -
    1. To use the Convergence API (in mobile and wearable applications), the application has to request permission by adding the following privileges to the tizen-manifest.xml file: -
      -<privileges>
      -   <privilege>http://tizen.org/privilege/internet</privilege>
      -   <privilege>http://tizen.org/privilege/bluetooth</privilege>
      -   <privilege>http://tizen.org/privilege/d2d.datasharing</privilege>
      -</privileges>
      -
      -
    2. -
    3. To use the functions and data types of the Convergence API, include the <d2d_conv_manager.h> header file in your application: -
      -#include <d2d_conv_manager.h>
      -
      -
    4. -
    - -

    Discovering Devices

    - -

    Discovery is a procedure for searching for convergence services provided by nearby devices in the same device-to-device network.

    -

    To discover devices:

    -
      -
    1. Create the device handle. -

      During the discovery process, the framework returns handles of found devices (JSON objects with basic device information and lists of available services). The following example shows the conceptual structure of device handle:

      -
      -{
      -    "device_id": "DEVICE_ID", /* Unique device ID */
      -    "device_name": "DEVICE_NAME", /* Unique device name */
      -    "device_type": "DEVICE_TYPE", /* Device profile, such as mobile or wearable */
      -    [
      -        /* Handle for service A */
      -        {
      -            service_type: TYPE_A,
      -            jservice: JSON auxiliary data of service A
      -        },
      -        /* Handle for service B */
      -        {
      -            service_type: TYPE_B,
      -            jservice: JSON auxiliary of service B
      -        },
      -    ]
      -}
      -
      - -
        -
      • The device ID is a unique identifier string, generated with the following rule: if a remote server is installed on the device (such as TV), the device ID is assigned by the app communication service. Usually, it has a format of service name and version. Otherwise (such as on mobile or wearable devices), the device ID is the device MAC address.
      • -
      • Device name is the one that is set in the device settings (Settings > About Devices > Device Name).
      • -
      • The service list includes all services supported by the device. -

        Each service has either the CONV_SERVICE_APP_TO_APP_COMMUNICATION or CONV_SERVICE_REMOTE_APP_CONTROL type and auxiliary data. The service type constants are defined in the conv_service_e enumeration (in mobile and wearable applications).

        -
      - -
      - Note - The device ID and device type are defined in the platform, and cannot be changed. -

      The jservice data is used by the framework internally for the connection and execution of the service. You as a developer do not need to know these details.

      -
      -
    2. -
    3. Start the discovery by calling the conv_discovery_start() function. The discovered device handles are retrieved in the conv_discovery_cb() callback. -

      In the following example, the conv_discovery_start() function runs a 30 seconds long discovery procedure. Each time a nearby device is discovered, the framework invokes the discovery_cb() callback with the device handle and the CONV_DISCOVERY_RESULT_SUCCESS result code. At the end of discovery procedure, the callback is invoked with the CONV_DISCOVERY_RESULT_FINISHED result code and an empty device handle.

      -

      The result codes are defined in the conv_discovery_result_e enumeration (in mobile and wearable applications).

      -

      The device ID, name, and type can be read from the device handle by passing the CONV_DEVICE_ID, CONV_DEVICE_NAME, and CONV_DEVICE_TYPE keys to the conv_device_get_property_string() function. To use the discovered device handle outside the callback, it must be cloned with the conv_device_clone() function.

      -
      -static void
      -discovery_cb(conv_device_h device, int result, void *user_data)
      -{
      -    if (result == CONV_DISCOVERY_RESULT_SUCCESS) {
      -        /* Discovered device */
      -        char* device_id = NULL;
      -        char* device_name = NULL;
      -        char* device_type = NULL;
      -
      -        conv_device_get_property_string(device, CONV_DEVICE_ID, &device_id);
      -        printf("device id = %s\n", device_id);
      -        free(device_id);
      -
      -        conv_device_get_property_string(device, CONV_DEVICE_NAME, &device_name);
      -        printf("device name = %s\n", device_name);
      -        free(device_name);
      -
      -        conv_device_get_property_string(device, CONV_DEVICE_TYPE, &device_type);
      -        printf("device TYPE = %s\n", device_type);
      -        free(device_type);
      -
      -        /* Clone the device handle for use outside this callback */
      -        conv_device_h clone_device;
      -        conv_device_clone(device, &clone_device);
      -    } else if (result == CONV_DISCOVERY_RESULT_FINISHED) {
      -        /* Discovery has finished */
      -        /* Do something */
      -    } else if (result == CONV_DISCOVERY_RESULT_ERROR) {
      -        /* Discovery has triggered an error */
      -        /* Error handling */
      -    }
      -}
      -
      -static void
      -start_discovery_example()
      -{
      -    /* Create a convergence manager */
      -    int error = conv_create(&conv_h);
      -    if (error != CONV_ERROR_NONE)
      -        /* Error handling */
      -
      -    /* Start discovery */
      -    error = conv_discovery_start(conv_h, 30, discovery_cb, NULL);
      -    if (error != CONV_ERROR_NONE)
      -        /* Error handling */
      -}
      -
      -

      To stop the ongoing discovery process, call the conv_discovery_stop() function.

      -
    4. -
    5. Get the list of services. -

      The remaining part of the device handle is a list of services. Pull this information by using the conv_device_foreach_service() function:

      -
      -static void
      -service_foreach_cb(conv_service_h service_handle, void *user_data)
      -{
      -    conv_service_e e = CONV_SERVICE_NONE;
      -
      -    conv_service_get_type(service_handle, &e);
      -    printf("service_get_type = %d\n", (int)e);
      -
      -    conv_service_h clone_service_handle;
      -    conv_service_clone(service_handle, &clone_service_handle);
      -}
      -
      -static void
      -foreach_service_example()
      -{
      -    conv_device_h device = data;
      -    conv_device_foreach_service(device, service_foreach_cb, NULL);
      -}
      -
      -

      While iterating through the available services, the framework generates a new handle for each service and passes it to the conv_service_foreach_cb() type callback. To use the service handle outside the callback, clone it with the conv_service_clone() function.

      -
    6. -
    - -

    Connecting to the App Communication Service

    - -

    To connect to the app communication service provided by a remote device, call the conv_service_connect() function.

    -

    The first parameter is the service handle extracted from the list in the device handle received during the discovery process. The second parameter is the conv_service_connected_cb type callback function, by which the Connecting, Connected, and Disconnected states of the remote service are delivered.

    - -
    -conv_service_connection_state_e state = CONV_SERVICE_CONNECTION_STATE_NONE;
    -conv_service_get_connection_state(service_handle, &state);
    -if (state == CONV_SERVICE_CONNECTION_STATE_NOT_CONNECTED)
    -    conv_service_connect(service_handle, callback, NULL);
    -
    -

    You can check the connection state with the conv_service_get_connection() function, which returns one of values defined in the conv_service_connection_state_e enumeration (in mobile and wearable applications). If the service is not connected yet, the connection state is CONV_SERVICE_CONNECTION_STATE_NOT_CONNECTED and the service must be connected using the conv_service_connect() function.

    - -
    - Note - Repeated attempts to connect to an already connected service result in the invalid state error. Attempts to start, publish, read, or stop a disconnected service also result in the invalid state error. -
    - -

    Technically, in case of the Wi-Fi network, when the framework runs the discovery procedure, all devices are already connected to the Access Point (AP), which means that the conv_service_get_connection_state() function always returns the Connected state and the conv_service_connect() function can be omitted. It is especially applied for the Tizen 3.0 convergence framework, which supports only Wi-Fi networks. In future versions with support for Bluetooth, Bluetooth Low Energy, or Wi-Fi Direct™, the connection procedure is mandatory. For the sake of future extensibility and compatibility, use the conv_service_connect() function even in Tizen 3.0.

    - - -

    Initializing the App Communication Service

    -

    To initialize the app communication service:

    -
      -
    1. Register the listener callback with the conv_service_set_listener_cb() function. This function must be called only once, regardless of the number of used service channels. In the runtime, all payloads from all channels are delivered there. - -
      - Note - The listener callback must be registered before the service starts, because the conv_service_start() function result can only be received in the listener callback. -
      -
        -
      • In the callback, the first parameter is the service handle, and it corresponds to the service, used in the conv_set_listener_cb() callback. The second parameter is the channel handle that indicates the particular channel through which the payload is delivered. The third parameter is the error parameter that indicates if the request is processed successfully on the remote device. -

        The main role of the listener callback is to parse the payload:

        -
        -/* Client side callback */
        -void
        -listener_example(conv_service_h handle, conv_channel_h channel, int error,
        -                 conv_payload_h result, void *user_data)
        -{
        -    char *result_type = NULL;
        -    char *payload_type = NULL; /* User-defined payload key */
        -
        -    conv_payload_get_string(result, "result_type", &result_type);
        -
        -    if (!strcmp(result_type, "onConnect"))
        -        /* Do something for onConnect */
        -    else if (!strcmp(result_type, "onStart"))
        -        /* Do something for onStart */
        -    else if (!strcmp(result_type, "onPublish"))
        -        /* Do something for onPublish */
        -    else if (!strcmp(result_type, "onStop"))
        -        /* Do something for onStop */
        -    else if (!strcmp(result_type, "onDisconnect"))
        -        /* Do something for onDisconnect */
        -    else if (!strcmp(result_type, "onClientDisconnect"))
        -        /* Do something for onClientDisconnect */
        -    else if (!strcmp(result_type, "onRead"))
        -        /* Do something for onRead */
        -    else
        -        /* Parsing user-defined portion of the payload */
        -}
        -
        -

        The structure of the listener is the same for both server and client sides.

        -
      • -
      • If the application sends a payload using the conv_service_publish() function, the listener callback on the receiver side gets the following packet: -
        -"result_type": "onMessage"
        -"from": unique ID of a client which sends the message
        -"user_defined_key": custom user-defined key in the payload
        -
        -

        The following example demonstrates how to process a custom payload:

        -
        -void
        -custom_listener_example(conv_service_h handle, conv_channel_h channel,
        -                        int error, conv_payload_h result, void *user_data)
        -{
        -    char *result_type = NULL;
        -    char *payload_type = NULL; /* User-defined payload key */
        -
        -    conv_payload_get_string(result, "result_type", &result_type);
        -
        -    if (!strcmp(result_type, "onMessage")) {
        -        /* Parsing user-defined portion of the payload */
        -        conv_payload_get_string(result, "payload_type", &payload_type);
        -        if (!strcmp(payload_type, "Good_News"))
        -            /* Do something for the payload of the "Good News" type */
        -        else if (!strcmp(payload_type, "Bad_News"))
        -            /* Do something for the payload of the "Bad News" type */
        -    }
        -}
        -
        -

        The example assumes that the message has a custom payload_type key and a string value that takes 1 of 2 variants: "Good_News" and "Bad_News".

        -

        In addition to strings, you can use a raw byte array payload. The conv_payload_set_string(), conv_payload_get_string(), conv_payload_set_byte(), and conv_payload_get_byte() functions are useful for working with payload types.

        -
      • -
      -
    2. -
    3. -

      On the server side, an instance of the app communication service must be created and started by the application.

      -

      At first, a service handle is created and assigned with the CONV_SERVICE_APP_TO_APP_COMMUNICATION type. Then, a channel is constructed with a pair of parameters: URI of the application, or the value specified in the application manifest, and a developer-defined channel ID. Finally, the listener is registered and the service is started.

      -

      The following example demonstrates the server application creation and start:

      -
      -static void
      -server_application_initialization_example()
      -{
      -    /* Creating an instance of the app communication service */
      -    conv_service_create(&service_handle);
      -    conv_service_set_type(service_handle, CONV_SERVICE_APP_TO_APP_COMMUNICATION);
      -
      -    /* Specifying service channel */
      -    /* Note, the URI value corresponds to URI of your server-side app */
      -    conv_channel_create(&channel_handle);
      -    conv_channel_set_string(channel_handle, "uri", "org.example.d2d_test");
      -    conv_channel_set_string(channel_handle, "channel_id", "test");
      -
      -    /* Starting the service */
      -    /* Note that the listener must be set before starting the service */
      -    conv_service_set_listener_cb(service_handle, server_message_listener, NULL);
      -    conv_service_start(service_handle, channel_handle, NULL);
      -}
      -
      -
    4. -
    5. On the client side, the app communication service handle must not be created, but obtained during the discovery. This means that no separate initialization is required on the client side. -

      The client application can start the service and remotely launch the application on the server side using the obtained service handle.

      - -

      A client application registers a listener callback and starts the service:

      -
      -int
      -app_communication_start_client_example()
      -{
      -    conv_service_connect(service_handle, connect_cb, NULL);
      -
      -    conv_channel_h channel_handle = NULL;
      -    conv_channel_create(&channel_handle);
      -    conv_channel_set_string(channel_handle, "uri", "org.example.d2d_test");
      -    conv_channel_set_string(channel_handle, "channel_id", "test");
      -
      -    conv_service_set_listener_cb(service_handle, message_listener, NULL);
      -    conv_service_start(service_handle, channel_handle, NULL);
      -
      -    conv_channel_destroy(channel_handle);
      -}
      -
      -

      The service must be connected to the remote device using the conv_service_connect() function. The service_handle in this example is the one that the client application discovered earlier. The connection callback is omitted in this example for simplicity. However, it is meaningful to carefully implement it and observe that the connection result is CONV_ERROR_NONE. The payload retrieved to the callback is typically empty.

      -

      A channel is set using the conv_channel_set_string() function. The start command goes to the server side, where the app communication service launches the application by the URI specified in the channel. The command result is asynchronously retrieved in the listener callback.

      -
    6. -
    7. -

      When you finish using the service channel, stop it using the conv_service_stop() function. When all clients have stopped using the service channel, the server side automatically terminates the application.

      -

      The server listener is automatically deregistered by the framework in the conv_service_stop() function, so you do not need to do it explicitly. The use of the conv_service_stop() function is almost the same as the service start:

      -
      -int
      -app_communication_stop_client_example()
      -{
      -    conv_channel_h channel_handle = NULL;
      -    conv_channel_create(&channel_handle);
      -    conv_channel_set_string(channel_handle, "uri", "org.example.d2d_test");
      -    conv_channel_set_string(channel_handle, "channel_id", "test");
      -
      -    conv_service_stop(service_handle, channel_handle, NULL);
      -
      -    conv_channel_destroy(channel_handle);
      -}
      -
      -
    8. -
    - -

    Sending Messages to the Server Application

    - -

    After starting a service channel, you can send a message or data to the remote server application. A payload to send to the other side must be packaged as shown in the following example. The app communication service accepts both string and byte types of payload, using the conv_payload_set_string() and conv_payload_set_byte() functions.

    - -

    You can design a set of application-specific key-value pairs for maintaining the communication protocol between remote applications. It requires implementing a publishing routine for sending messages and a listener routine for receiving and recognizing the messages on both client and server sides.

    - -
    -int
    -publish_example()
    -{
    -    conv_service_h service_handle = (conv_service_h)data;
    -    conv_channel_h channel_handle;
    -    conv_payload_h payload_handle;
    -
    -    conv_channel_create(&channel_handle);
    -    conv_channel_set_string(channel_handle, "uri", "org.example.d2d_test");
    -    conv_channel_set_string(channel_handle, "channel_id", "test");
    -
    -    conv_payload_create(&payload_handle);
    -    conv_payload_set_string(payload_handle, "user_defined_key", "user_defined_value");
    -
    -    conv_service_publish(service_handle, channel_handle, payload_handle);
    -    /* or conv_service_read(service_handle, channel_handle, NULL); */
    -}
    -
    -

    The channel used in this example is the same as described before. The conv_service_publish() function delivers the payload, composed of the "user_defined_key" and "user_defined_value" pairs, through the network to the remote server application where it is passed in the listener callback.

    - -

    In the app communication service, the conv_service_read() function is only a command to get the information about the clients connected to the same channel. The conv_service_read() is called with NULL payload and it does not require additional parameters. You can receive various information in the conv_service_read() function.

    - - -

    Using the Remote App Control Service

    - -

    The basic flow for the remote app control service is to build a payload with an application control handle, send it to a remote device and, optionally, receive a remote application control result.

    -

    To start the remote app control service, publish a message, and stop the service:

    -
      -
    1. Register a listener callback. -

      In the remote app control service, the application control, delivered to a remote device, is directly processed just like a local application control. It means that there is no need for a receiver to implement a special receiving routine on the remote device, and no need to register a listener callback on the receiver side. Instead, the listener callback is useful on the sender side to check whether the function is delivered to the remote device and processed correctly.

      - -

      The following example shows a listener callback, which handled the result of the access control process related to the remote app control service. After the user of the remote device has decided to allow or deny access with the passcode, the user choice is delivered to the remote device with the "onStart" result type and predefined error types:

      -
      • If the passcode is entered correctly, the "onStart" returns with the CONV_ERROR_NONE value.
      • -
      • Otherwise, the "onStart" comes with the CONV_ERROR_INVALID_OPERATION value.
      -
      -static void
      -service_result_callback(conv_service_h service_handle, conv_channel_h channel_handle,
      -                        conv_error_e error, conv_payload_h result, void* user_data)
      -{
      -    char *reply_result = NULL;
      -    conv_payload_get_string(result, "result_type", &reply_result);
      -    if (!strcmp(reply_result, "onStart")) {
      -        if (error == CONV_ERROR_NONE) {
      -            /* Allowed */
      -            conv_service_publish(service_handle, NULL, payload_handle);
      -            conv_service_stop(service_handle, NULL, payload_handle);
      -            conv_payload_destroy(payload_handle);
      -            payload_handle = NULL;
      -        } else if (error == CONV_ERROR_INVALID_OPERATION) {
      -            /* Denied */
      -            conv_service_stop(service_handle, NULL, payload_handle);
      -            conv_payload_destroy(payload_handle);
      -            payload_handle = NULL;
      -        }
      -    }
      -    free(reply_result);
      -}
      -
      -
    2. -
    3. Start the remote app control service. -

      After registering the listener callback, start the service with the service handle, obtained from the near-by device discovery previously. Build an application control handle in a payload to launch an application on a remote device.

      -

      The following example launches the "org.example.d2d_test" application:

      -
      -int
      -app_control_service()
      -{
      -    conv_service_set_listener_cb(service_handle, message_listener, NULL);
      -    conv_service_start(service_handle, NULL, NULL);
      -
      -    conv_payload_h payload_handle;
      -    conv_payload_create(&payload_handle);
      -
      -    app_control_h app_control = NULL;
      -    app_control_create(&app_control);
      -    app_control_set_app_id(app_control, "org.example.d2d_test");
      -    app_control_set_operation(app_control, APP_CONTROL_OPERATION_MAIN);
      -
      -    conv_payload_set_app_control(payload_handle, "app_control", app_control);
      -    conv_payload_set_string(payload_handle, "reply", "1");
      -
      -    conv_service_publish(service_handle, NULL, payload_handle);
      -}
      -
      -

      The application control handle can be built using the App Control functions. In the payload, there is a special "reply" string field, which indicates if an application control reply is returned after the sent application control is processed remotely. In other words, if "reply" is "1", the remote device processes the application control and sends the resulting application control to the original device. In this case, the listener callback on the original device waits for an application control reply. This can be useful in designing interactive applications, such as chatting applications, in which bi-directional interplay service is required. If "reply" is "0" or this field is omitted, no response is received in the listener.

      -
    4. -
    - -

    Predefined Payload Fields

    - -

    To send payloads, you can use various functions: use the conv_service_start() function to start a service, the conv_service_read() function to read information from the remote device, the conv_service publish() function to send data or messages, and the conv_service_stop() function to stop the service. The app communication service recognizes several predefined payload fields, including the result_type, which are used to specify the payload type or the quick response of some functions. The service implicitly adds these fields to the payload.

    - -
    - Note - The conv_service_read() function is not used in the remote app control service. -
    - -

    When the conv_service_start(), conv_service_publish(), or conv_service_stop() function is called, a quick notice for success or failure with a specific result_type and extra information returns back to the function caller. For example, in case of the conv_service_read() function, the response includes the result_type of onRead and a list of connected clients. For the general payload sent from the other device with the conv_service_publish() and received in the client device listener, the result_type is onMessage and the message or data is stored in the payload argument. The detailed information for the predefined fields and payload formats is summarized in the following tables.

    - -

    The success or failure result (including the correctness of the passcode input in the access control popup in the remote app control service) is delivered by the conv_error_e error parameter (in mobile and wearable applications) of the listener callback.

    - -

    Table: Predefined fields for the app communication service payloads

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionPredefined payload field
    conv_service_start()Sent to the device that calls the function when connected to the remote server: -
      -
    • "result_type": "onConnect"
    • -
    • "client_is_host": Whether the device is a server application (remote server). The possible values are 0 and 1.
    • -
    • "client_connect_time": Connection time
    • -
    • "client_id": Unique client ID
    • -
    -
    Sent to the device that calls the function when the application launch succeeds or fails: -
      -
    • "result_type": "onStart"
    • -
    -
    Sent to other clients connected to the remote server: -
      -
    • "result_type": "onClientConnect"
    • -
    • "client_is_host": Whether the device is a server application (remote server). The possible values are 0 and 1.
    • -
    • "client_connect_time": Connection time
    • -
    • "client_id": Unique client ID
    • -
    -
    conv_service_publish()"result_type": "onPublish"
    conv_service_stop()Sent to the device which calls the function when the server application stops: -
      -
    • "result_type": "onStop"
    • -
    -
    Sent to the device which calls the function when disconnected from the remote server: -
      -
    • "result_type": "onDisconnect"
    • -
    • "client_is_host": Whether the device is a server application (remote server). The possible values are 0 and 1.
    • -
    • "client_connect_time": Connection time
    • -
    • "client_id": Unique client ID
    • -
    -
    Sent to other clients connected to the remote server: -
      -
    • "result_type": "onClientDisconnect"
    • -
    • "client_is_host": Whether the device is a server application (remote server). The possible values are 0 and 1.
    • -
    • "client_connect_time": Connection time
    • -
    • "client_id": Unique client ID
    • -
    -
    conv_service_read() -
      -
    • "result_type": "onRead"
    • -
    • "read_type": "getClients"
    • -
    • "client_list": json-array type client lists -

      [ {"client_is_host": Whether the device is a server application (remote server). The possible values are 0 and 1.

      -

      "client_connect_time": Connection time

      -

      "client_id": Unique client ID

      -

      }, ... ]

      -
    • -
    -
    conv_service_listener_cb() -

    (When a message is received)

    -
    Sent to other clients and server applications, registered listener callback: -
      -
    • "result_type": "onMessage"
    • -
    • "from": Unique client ID which sends the message
    • -
    -
    - -

    Table: Predefined fields for receiving the remote app control service payloads

    - - - - - - - - - - - - - - - - - - - -
    FunctionPredefined fields
    conv_service_start()"result_type": "onStart"
    conv_service_publish() -
      -
    • "result_type": "onPublish"
    • -
    • "app_control_reply": Application control data, only valid if the receiver replied with an app_control, which means that the sender sent a payload with a "reply" of "1".
    • -
    • "app_control_request": Requested application control data, only valid if the receiver replied with an app_control value, which means that the sender sent a payload with a "reply" of "1".
    • -
    • "app_control_result": The app_control_result_e value for the request, only valid if the receiver replied with a value, which means that the sender sent a payload with a "reply" of "1".
    • -
    -
    conv_service_stop()"result_type": "onStop"
    - - - -
    - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.guides/html/native/device/system_n.htm b/org.tizen.guides/html/native/device/system_n.htm index 45f32a5..04e20be 100644 --- a/org.tizen.guides/html/native/device/system_n.htm +++ b/org.tizen.guides/html/native/device/system_n.htm @@ -85,42 +85,36 @@ Account - FIDO - Media - Screen - - - Application history FM radio Microphone Sensor - Battery + Application history Graphics Multimedia Shell - Camera + Battery Human activity monitor Multi-point touch Sip - Consumer IR + Camera Input Network Speech - Contextual trigger + Consumer IR IOT OAuth 2.0 System setting - Convergence D2D + Contextual trigger LED OpenGL® ES USB @@ -137,6 +131,12 @@ Profile Web + + FIDO + Media + Screen + - + System keys @@ -347,22 +347,6 @@ func(void) -

    The following table lists the convergence D2D feature keys.

    -

    Table: Convergence D2D feature keys

    - - - - - - - - - - - - - -
    KeyTypeDescription
    http://tizen.org/feature/convergence.d2dboolThe platform returns true for this key, if the device supports a service for the discovery of near-by devices and the communication with the remote devices. The device must support 1 or more network features.

    The following table lists the database feature keys.

    Table: Database feature keys

    diff --git a/org.tizen.guides/index.xml b/org.tizen.guides/index.xml index f8d600c..8e2a77a 100644 --- a/org.tizen.guides/index.xml +++ b/org.tizen.guides/index.xml @@ -308,7 +308,6 @@ - diff --git a/org.tizen.training/html/native/details/app_filtering_n.htm b/org.tizen.training/html/native/details/app_filtering_n.htm index 6ca7bce..1e9e622 100644 --- a/org.tizen.training/html/native/details/app_filtering_n.htm +++ b/org.tizen.training/html/native/details/app_filtering_n.htm @@ -226,11 +226,6 @@ - - - - - @@ -956,11 +951,6 @@ - - - - - diff --git a/org.tizen.training/html/native/details/sec_privileges_n.htm b/org.tizen.training/html/native/details/sec_privileges_n.htm index 6728dde..76fdd38 100644 --- a/org.tizen.training/html/native/details/sec_privileges_n.htm +++ b/org.tizen.training/html/native/details/sec_privileges_n.htm @@ -223,13 +223,6 @@ tr.partner-level, tr.platform-level { background-color: #cff } - - - - - - - @@ -883,13 +876,6 @@ tr.partner-level, tr.platform-level { background-color: #cff } - - - - - - - diff --git a/org.tizen.training/html/native/details/tizen_apis_n.htm b/org.tizen.training/html/native/details/tizen_apis_n.htm index 7634973..95d711e 100644 --- a/org.tizen.training/html/native/details/tizen_apis_n.htm +++ b/org.tizen.training/html/native/details/tizen_apis_n.htm @@ -227,15 +227,6 @@ - - - - - - @@ -845,15 +836,6 @@ - - - - - - diff --git a/org.tizen.training/html/web/details/sec_privileges_w.htm b/org.tizen.training/html/web/details/sec_privileges_w.htm index 5eb7cfc..65be371 100644 --- a/org.tizen.training/html/web/details/sec_privileges_w.htm +++ b/org.tizen.training/html/web/details/sec_privileges_w.htm @@ -201,13 +201,6 @@ tr.partner-level, tr.platform-level { background-color: #cff } - - - - - - - @@ -588,13 +581,6 @@ tr.partner-level, tr.platform-level { background-color: #cff } - - - - - - - -- 2.7.4
    4.0
    http://tizen.org/feature/convergence.d2dSpecify this key, if the application requires the Device-to-Device (D2D) Convergence feature, which provides the service to discover near-by devices and to communicate information and data to the remote devices.3.0
    http://tizen.org/feature/database.encryption Specify this key, if the application requires the database encryption feature. 2.2.14.0
    http://tizen.org/feature/convergence.d2dSpecify this key, if the application requires the Device-to-Device (D2D) Convergence feature, which provides the service to discover near-by devices and to communicate information and data to the remote devices.3.0
    http://tizen.org/feature/database.encryption Specify this key, if the application requires the database encryption feature. 2.2.1The application can change media information. This information can be used by other applications.
    http://tizen.org/privilege/d2d.datasharingpublic-3.0The application can share data with other devices.
    http://tizen.org/privilege/datasharing public -The application can change media information. This information can be used by other applications.
    http://tizen.org/privilege/d2d.datasharingpublic-3.0The application can share data with other devices.
    http://tizen.org/privilege/datasharing public -Detects user gestures on devices, such as tilt, snap, and double-tap.
    ConvergenceConvergence Manager

    (since 4.0)

    Allows you to manage device-to-device convergence services.The Convergence API module contains submodule APIs to discover, connect to, and execute services on remote devices. -

    Guides:

    -
    Location Geofence Manager

    (since 2.4)

    Provides a service related to geofence (geo-fence).Detects user gestures on devices, such as tilt, snap, and double-tap.
    ConvergenceConvergence Manager

    (since 4.0)

    Allows you to manage device-to-device convergence services.The Convergence API module contains submodule APIs to discover, connect to, and execute services on remote devices. -

    Guides:

    -
    Location Location Manager Acquires information about the geographical location of the device. It also allows the receiving of notifications about position changes, velocity changes, and when a given geographical area is left.The application can create, update, and delete media content information.
    http://tizen.org/privilege/d2d.datasharingpublic-3.0The application can share data with other devices.
    http://tizen.org/privilege/datacontrol.consumer public -The application can create, update, and delete media content information.
    http://tizen.org/privilege/d2d.datasharingpublic-3.0The application can share data with other devices.
    http://tizen.org/privilege/datacontrol.consumer public -