From 6725230c6e0c2e2e333f7faae8c7bdef76052b26 Mon Sep 17 00:00:00 2001 From: Editor Lionbridge Date: Tue, 24 Oct 2017 14:04:13 +0300 Subject: [PATCH] Add IoT Preview content This is a new section containing all the documentation related to the IoT Preview #1. Change-Id: Ia3cb7ccc5aab60f723a32374675ef6aaf2136dfa --- iot/api/iot_api.htm | 77 + iot/api/peripheral_io_api.htm | 154 ++ iot/api/peripheral_io_api_gpio.htm | 282 ++++ iot/api/peripheral_io_api_i2c.htm | 167 ++ iot/api/peripheral_io_api_pwm.htm | 157 ++ iot/api/peripheral_io_api_spi.htm | 270 +++ iot/api/peripheral_io_api_uart.htm | 227 +++ iot/api/things_api.htm | 102 ++ iot/api/things_api_device.htm | 458 +++++ iot/api/things_api_guide.htm | 470 ++++++ iot/cover_page.htm | 88 + iot/css/snippet.css | 52 + iot/css/styles.css | 300 ++++ iot/getting_started/cloud_app_test.htm | 71 + iot/getting_started/getting_started_cover.htm | 60 + iot/getting_started/things_app_development.htm | 103 ++ iot/getting_started/things_cloud_setup.htm | 232 +++ iot/getting_started/tizen_image_download_flash.htm | 679 ++++++++ iot/getting_started/tizen_studio_install.htm | 61 + iot/images/Thumbs.db | Bin 0 -> 188928 bytes iot/images/artik_dip_switch.png | Bin 0 -> 301839 bytes iot/images/artik_power_sd.png | Bin 0 -> 283537 bytes iot/images/artik_power_switch.png | Bin 0 -> 291797 bytes iot/images/artik_usb_otg.png | Bin 0 -> 537804 bytes iot/images/btn_top.gif | Bin 0 -> 2558 bytes iot/images/iot_setup_wizard.png | Bin 0 -> 29346 bytes iot/images/iot_setup_wizard_flashcustom.png | Bin 0 -> 138459 bytes iot/images/iot_setup_wizard_installed.png | Bin 0 -> 44694 bytes iot/images/iot_setup_wizard_installing.png | Bin 0 -> 48444 bytes iot/images/iot_setup_wizard_menu.png | Bin 0 -> 47834 bytes iot/images/iot_setup_wizard_showview.png | Bin 0 -> 27049 bytes iot/images/package-manager-install-iotheadless.png | Bin 0 -> 59121 bytes iot/images/package-manager-install-mobile.png | Bin 0 -> 56535 bytes iot/images/peri_api_artik.png | Bin 0 -> 333866 bytes iot/images/peri_api_cert_author.png | Bin 0 -> 46043 bytes iot/images/peri_api_cert_author_details.png | Bin 0 -> 75575 bytes iot/images/peri_api_cert_manager.png | Bin 0 -> 37332 bytes iot/images/peri_api_cert_new.png | Bin 0 -> 114140 bytes iot/images/peri_api_cert_profile.png | Bin 0 -> 43045 bytes iot/images/peri_api_devices.png | Bin 0 -> 362252 bytes iot/images/peri_api_duty_cycle.png | Bin 0 -> 15667 bytes iot/images/peri_api_duty_cycle_voltage.png | Bin 0 -> 30294 bytes iot/images/peri_api_gpio.png | Bin 0 -> 10737 bytes iot/images/peri_api_i2c_diagram.png | Bin 0 -> 19915 bytes iot/images/peri_api_raspberry.png | Bin 0 -> 345831 bytes iot/images/peri_api_spi_diagram.png | Bin 0 -> 20140 bytes iot/images/peri_api_spi_mode.png | Bin 0 -> 14413 bytes iot/images/peri_api_uart_data.png | Bin 0 -> 12180 bytes iot/images/peri_api_uart_diagram.png | Bin 0 -> 10587 bytes iot/images/raspi_gpio_pinout.png | Bin 0 -> 113848 bytes iot/images/sample_test.png | Bin 0 -> 88729 bytes iot/images/thing_api_lifecycle.png | Bin 0 -> 22208 bytes iot/images/thing_api_new_device.png | Bin 0 -> 44804 bytes iot/images/thingsapp_native.png | Bin 0 -> 35827 bytes iot/images/thingsapp_profile_select.png | Bin 0 -> 42650 bytes iot/images/thingsapp_runas.png | Bin 0 -> 192793 bytes iot/images/thingsapp_template.png | Bin 0 -> 32208 bytes iot/images/thingsapp_template_select.png | Bin 0 -> 37684 bytes iot/index.htm | 94 ++ iot/sample/iot_sample.htm | 575 +++++++ iot/scripts/common.js | 1752 ++++++++++++++++++++ iot/scripts/core.js | 899 ++++++++++ iot/scripts/jquery.util.js | 1441 ++++++++++++++++ iot/scripts/jquery.zclip.min.js | 12 + iot/scripts/navi.js | 192 +++ iot/scripts/search.js | 168 ++ iot/scripts/showhide.js | 204 +++ iot/scripts/snippet.js | 1478 +++++++++++++++++ 68 files changed, 10825 insertions(+) create mode 100644 iot/api/iot_api.htm create mode 100644 iot/api/peripheral_io_api.htm create mode 100644 iot/api/peripheral_io_api_gpio.htm create mode 100644 iot/api/peripheral_io_api_i2c.htm create mode 100644 iot/api/peripheral_io_api_pwm.htm create mode 100644 iot/api/peripheral_io_api_spi.htm create mode 100644 iot/api/peripheral_io_api_uart.htm create mode 100644 iot/api/things_api.htm create mode 100644 iot/api/things_api_device.htm create mode 100644 iot/api/things_api_guide.htm create mode 100644 iot/cover_page.htm create mode 100644 iot/css/snippet.css create mode 100644 iot/css/styles.css create mode 100644 iot/getting_started/cloud_app_test.htm create mode 100644 iot/getting_started/getting_started_cover.htm create mode 100644 iot/getting_started/things_app_development.htm create mode 100644 iot/getting_started/things_cloud_setup.htm create mode 100644 iot/getting_started/tizen_image_download_flash.htm create mode 100644 iot/getting_started/tizen_studio_install.htm create mode 100644 iot/images/Thumbs.db create mode 100644 iot/images/artik_dip_switch.png create mode 100644 iot/images/artik_power_sd.png create mode 100644 iot/images/artik_power_switch.png create mode 100644 iot/images/artik_usb_otg.png create mode 100644 iot/images/btn_top.gif create mode 100644 iot/images/iot_setup_wizard.png create mode 100644 iot/images/iot_setup_wizard_flashcustom.png create mode 100644 iot/images/iot_setup_wizard_installed.png create mode 100644 iot/images/iot_setup_wizard_installing.png create mode 100644 iot/images/iot_setup_wizard_menu.png create mode 100644 iot/images/iot_setup_wizard_showview.png create mode 100644 iot/images/package-manager-install-iotheadless.png create mode 100644 iot/images/package-manager-install-mobile.png create mode 100644 iot/images/peri_api_artik.png create mode 100644 iot/images/peri_api_cert_author.png create mode 100644 iot/images/peri_api_cert_author_details.png create mode 100644 iot/images/peri_api_cert_manager.png create mode 100644 iot/images/peri_api_cert_new.png create mode 100644 iot/images/peri_api_cert_profile.png create mode 100644 iot/images/peri_api_devices.png create mode 100644 iot/images/peri_api_duty_cycle.png create mode 100644 iot/images/peri_api_duty_cycle_voltage.png create mode 100644 iot/images/peri_api_gpio.png create mode 100644 iot/images/peri_api_i2c_diagram.png create mode 100644 iot/images/peri_api_raspberry.png create mode 100644 iot/images/peri_api_spi_diagram.png create mode 100644 iot/images/peri_api_spi_mode.png create mode 100644 iot/images/peri_api_uart_data.png create mode 100644 iot/images/peri_api_uart_diagram.png create mode 100644 iot/images/raspi_gpio_pinout.png create mode 100644 iot/images/sample_test.png create mode 100644 iot/images/thing_api_lifecycle.png create mode 100644 iot/images/thing_api_new_device.png create mode 100644 iot/images/thingsapp_native.png create mode 100644 iot/images/thingsapp_profile_select.png create mode 100644 iot/images/thingsapp_runas.png create mode 100644 iot/images/thingsapp_template.png create mode 100644 iot/images/thingsapp_template_select.png create mode 100644 iot/index.htm create mode 100644 iot/sample/iot_sample.htm create mode 100644 iot/scripts/common.js create mode 100644 iot/scripts/core.js create mode 100644 iot/scripts/jquery.util.js create mode 100644 iot/scripts/jquery.zclip.min.js create mode 100644 iot/scripts/navi.js create mode 100644 iot/scripts/search.js create mode 100644 iot/scripts/showhide.js create mode 100644 iot/scripts/snippet.js diff --git a/iot/api/iot_api.htm b/iot/api/iot_api.htm new file mode 100644 index 0000000..1fdede2 --- /dev/null +++ b/iot/api/iot_api.htm @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + IoT APIs + + + + + +
+
+ +
+ +

IoT APIs

+ +

The Tizen IoT API provides a common set of interfaces allowing you to build compelling IoT device applications which achieve native performance. The characteristics include:

+ +
    +
  • Common set API, which means that the Tizen IoT API is based on the Tizen 4.0 common profile. The API supports the common set of mobile, wearable, and TV profiles and allows you to make IoT applications, such as network audio applications.
  • +
  • Available platform binaries, which allow you to efficiently create an IoT application. Tizen Common Headed binaries for Raspberry Pi 3 and ARTIK 530 have passed the API test verification, which means that you can create IoT applications with a productive quality.
  • +
+ +

In Preview 1, the Tizen IoT API releases only the native "C" API. Other convenient language types for the API are to be considered in the future.

+ +

The following table lists the IoT-specific Tizen platform API group.

+ +

Table: Tizen IoT API group

+ + + + + + + + + + + + + + +
IoT-specific APIDescription
Things SDK APIThe SmartThings™ Things SDK APIs help you to create new Things applications on IOT devices. For the full specification, see the Things SDK API Reference.
Peripheral I/O APIThe Peripheral I/O native APIs are designed specifically for making IoT devices control peripheral devices, such as actuators and sensors. For the full specification, see the Tizen Common Headed API Reference.
+ + + +
+ + +Go to top + + + + + + diff --git a/iot/api/peripheral_io_api.htm b/iot/api/peripheral_io_api.htm new file mode 100644 index 0000000..47e48af --- /dev/null +++ b/iot/api/peripheral_io_api.htm @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + Tizen Peripheral I/O Native API + + + + + + +
+ +
+

Content

+ +
+
+ +
+ +

Tizen Peripheral I/O Native API

+ +

Tizen IoT provides the Peripheral I/O APIs for IoT devices to control peripherals, such as sensors and actuators, using industry-standard protocols and interfaces:

+ +
    +
  • GPIO (general-purpose input/output)
  • +
  • PWM (pulse-width modulation)
  • +
  • SPI (Serial Peripheral Interface)
  • +
  • I2C (Inter-Integrated Circuit)
  • +
  • UART (universal asynchronous receiver-transmitter)
  • +
+ +

Since each peripheral supports different interfaces and protocol, you must check the protocol supported by your peripheral through the specification. Peripheral I/O APIs are categorized according to protocols.

+ +

Figure: Peripherals connected to devices

+

Peripherals connected to devices

+ +

Supported Protocols

+ +

You must check the available protocols for hardware targets of the Tizen IoT. As shown in the following table, the ARTIK 530 supports all protocols, while the Raspberry Pi 3 excludes PWM.

+ + +

Table: Protocols supported by hardware target of the Tizen IoT

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProtocolARTIK 530Raspberry Pi 3
GPIOYesYes
PWMYesNo
SPIYesYes
I2CYesYes
UARTYesYes
+ +

The following figures illustrate how you can obtain the pinout information supported by hardware targets of the Tizen IoT.

+ +

Figure: ARTIK 530 pinout

+

ARTIK 530 pinout

+ +

Figure: Raspberry Pi 3 pinout

+

Raspberry Pi 3 pinout

+ +

Prerequisites

+ +
    +
  1. To use the Peripheral I/O API, the application has to request permission by adding following platform privilege to the tizen-manifest.xml file: +
    +<privileges>
    +   <privilege>http://tizen.org/privilege/peripheralio</privilege>
    +</privileges>
    +
    + +

    To obtain authorization by a platform privilege, the application must be signed with a platform-level distributor certificate. Create a certificate profile for signing the application:

    + +
      +
    1. To open the Certificate Manager, in the Tizen Studio menu, go to Tizen Studio > Tools > Certificate Manager. +

      Certificate Manager

    2. +
    3. To add new certificate profile for signing your application, click + in the Certificate manager and enter a profile name. +

      Add a new profile

    4. +
    5. Select Create a new author certificate and click Next. +

      Create an author certificate

    6. +
    7. Enter the key file name, author name, password, and password again. If you want to provide more information for the certificate, enter the details after unfolding the More details section. +

      Add author certificate details

    8. +
    9. Select Use the default Tizen distributor certificate and the Platform privilege level, and click Finish. +

      The new platform level certificate is created and shown in the Certificate Manager.

      +

      View new certificate

    10. +
    +
  2. +
  3. To use the functions and data types of the Peripheral I/O API, include the <peripheral_io.h> header file in your application: +
    +#include <peripheral_io.h>
    +
    +
  4. +
+ + + +
+ + +Go to top + + + + + + diff --git a/iot/api/peripheral_io_api_gpio.htm b/iot/api/peripheral_io_api_gpio.htm new file mode 100644 index 0000000..281d68b --- /dev/null +++ b/iot/api/peripheral_io_api_gpio.htm @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + GPIO + + + + + + +
+ + +
+ +
+ +

GPIO

+ +

GPIO (general-purpose input/output) provides a programmable interface for reading the state of the binary input device, such as a switch, and controlling the state of the binary output device, such as a LED.

+ +

GPIO sets a direction for the data transfer. It can also detect an interrupt signaled by a level transition, either a falling edge (high to low) or a rising edge (low to high). To detect the interrupt signal you want, set the edge mode.

+ +

GPIO offers 3 edge modes:

+
    +
  • Rising mode detects data changes from low to high.
  • +
  • Falling mode detects data changes from high to low.
  • +
  • Both mode detects all data changes.
  • +
+ +

Figure: GPIO edge mode

+

GPIO edge mode

+ +

Opening and Closing a Handle

+ +

To open and close a handle:

+ +
    +
  1. To open a GPIO handle, use the peripheral_gpio_open() function: +
    +int pin = ...;
    +peripheral_gpio_h gpio_h;
    +peripheral_gpio_open(pin, &gpio_h);
    +
    + +

    The pin parameter required for this function must be set according to the following tables.

    + +

    Table: ARTIK 530

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Pin namePin (parameter 1)Pin namePin (parameter 2)
    GPIO0128GPIO1129
    GPIO2130GPIO346
    GPIO414GPIO541
    GPIO625GPIO70
    GPIO826GPIO927
    + +

    Table: Raspberry Pi 3

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Pin namePin (parameter 1)Pin namePin (parameter 2)
    GPIO44GPIO55
    GPIO66GPI1212
    GPIO1313GPIO1616
    GPIO1717GPIO1818
    GPIO1919GPIO20920
    GPIO2121GPIO2222
    GPIO2323GPIO2424
    GPIO2525GPIO2626
    GPIO2727--
    + +
    + Note + The Pin name refers to the name written on the side of the pin as shown in the figures in Supported Protocols. +
    +
  2. +
  3. To close the GPIO handle that is no longer used, use the peripheral_gpio_close() function: +
    +peripheral_gpio_close(gpio_h);
    +
    +
+ +

Setting the Direction

+ +

To set the direction, use the peripheral_gpio_set_direction() function with 1 of the following direction types:

+ +
    +
  • PERIPHERAL_GPIO_DIRECTION_IN: Input mode to receive data from a binary output device.
  • +
  • PERIPHERAL_GPIO_DIRECTION_OUT_INITIALLY_HIGH: Output mode to send data to a binary output device. This value initializes the state of the output device to high.
  • +
  • PERIPHERAL_GPIO_DIRECTION_OUT_INITIALLY_LOW: Output mode to send data to a binary output device. This value initializes the state of the output device to low.
  • +
+ +
+peripheral_gpio_direction_e direction = PERIPHERAL_GPIO_DIRECTION_OUT_INITIALLY_LOW;
+peripheral_gpio_set_direction(gpio_h, direction);
+
+ +

Setting the Edge Mode

+ +

To set the edge mode, use the peripheral_gpio_set_edge_mode() function with 1 of the following edge mode types:

+ +
    +
  • PERIPHERAL_GPIO_EDGE_NONE: No edge mode.
  • +
  • PERIPHERAL_GPIO_EDGE_RISING: Interrupted at a rising edge (low to high).
  • +
  • PERIPHERAL_GPIO_EDGE_FALLING: Interrupted at a falling edge (high to low).
  • +
  • PERIPHERAL_GPIO_EDGE_BOTH: Interrupted at both rising and falling edges.
  • +
+ +
+int edge_mode = PERIPHERAL_GPIO_EDGE_RISING;
+peripheral_gpio_set_edge_mode(gpio_h, edge_mode);
+
+ +

Setting the Interrupted Callback

+ +

The interrupted callback is called when the GPIO state changes according to the edge mode.

+ +

To implement the interrupted callback:

+
    +
  1. Define the interrupted callback content. +
    +static void
    +interrupted_cb(peripheral_gpio_h gpio_h, peripheral_error_e error, void *user_data)
    +{
    +    /* Fill the code that you want to run when the interrupt occurs */
    +}
    +
  2. +
  3. Set the callback with the peripheral_gpio_set_interrupted_cb() function: +
    +peripheral_gpio_set_interrupted_cb(gpio_h, interrupted_cb, NULL);
    +
    +
  4. +
  5. When no longer needed, unset the interrupt callback with the peripheral_gpio_unsetinterrupted_cb() function: +
    +peripheral_gpio_unset_interrupted_cb(gpio_h);
    +
    +
  6. +
+ +

Reading and Writing Binary Data

+ +

To read and write binary data:

+ +
    +
  • To read binary data from the GPIO device, use the peripheral_gpio_read() function: +
    +uint32_t value;
    +peripheral_gpio_read(gpio_h, &value);
    +
    +
  • +
  • To write binary data to the GPIO device, use the peripheral_gpio_write() function: +
    +uint32_t value = 1;
    +peripheral_gpio_write(gpio_h, value);
    +
    +
  • +
+ + + +
+ + +Go to top + + + + + + diff --git a/iot/api/peripheral_io_api_i2c.htm b/iot/api/peripheral_io_api_i2c.htm new file mode 100644 index 0000000..96b44d2 --- /dev/null +++ b/iot/api/peripheral_io_api_i2c.htm @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + I2C + + + + + + +
+ + +
+ +
+ +

I2C

+

I2C (Inter-Integrated Circuit) provides a programmable interface to communicate with I2C peripheral devices.

+ +

I2C is a synchronous serial interface that uses a clock signal to synchronize data transfers between devices. The device that controls the clock signal is master, and other peripheral devices connected to the I2C are slaves.

+ +

Figure: I2C interface diagram

+

I2C interface diagram

+ +

To allow the I2C master to connect to 128 I2C slave devices, an I2C slave device provides a 7-bit address. Since most slave addresses are determined by the manufacturer, refer to the specification to find the device address.

+ +

Using the I2C bus, the master controls signal lines called SCL (Shared CLock) and SDA (Shared DAta) to read or write data to or from the device. SCL is a clock line for communication synchronization, and SDA is a data line. The master outputs the clock for synchronization with the SCL, and the slave outputs or receives data through the SDA according to the clock output to the SCL.

+ +

If the SDA line is used alone, only half duplex communication is possible because data is sent only to 1 line.

+ +

Opening and Closing a Handle

+ +

To open and close a handle:

+ +
    +
  1. To open an I2C handle, use the peripheral_i2c_open() function: +
    +int bus = ...;
    +int address = ...;   /* See the specification */
    +peripheral_i2c_h i2c_h;
    +peripheral_i2c_open(bus, address, &i2c_h);
    +
    +

    The bus parameter required for this function must be set according to the following table.

    + +
    + Note + The address parameter must refer to the specification of the peripheral device. +
    + +

    Table: ARTIK 530 / Raspberry Pi 3

    + + + + + + + + + + + +
    Pin nameBus number (parameter 1)
    I2C1_SDAI2C1_SCL1
    +
  2. +
  3. To close an I2C handle that is no longer used, use the peripheral_i2c_close() function: +
    +peripheral_i2c_close(i2c_h);
    +
    +
+ +

Reading and Writing Data

+ +

To read and write data:

+ +
    +
  • To write bytes to a slave device, use the peripheral_i2c_write() function: +
    +uint8_t data[2] = {0x06, 0x01};
    +uint32_t length = 2;
    +peripheral_i2c_write(i2c_h, data, length);
    +
    +
  • + +
  • To read bytes from a slave device, use the peripheral_i2c_read() function: +
    +uint8_t data[2];
    +uint32_t length = 2;
    +peripheral_i2c_read(i2c_h, data, length);
    +
    +
  • +
+ +

Reading and Writing Register Data

+ +

To read and write register data:

+ +
    +
  • To write single byte data to a slave device register, use the peripheral_i2c_write_register_byte() function: +
    +uint8_t data = 0x06;
    +uint8_t register_address = ...;  /* See the specification */
    +peripheral_i2c_write_register_byte(i2c_h, register_address, data);
    +
    +
  • +
  • To read single byte data from a slave device register, use the peripheral_i2c_read_register_byte() function: +
    +uint8_t data ;
    +uint8_t register_address = ...;  /* See the specification */
    +peripheral_i2c_read_register_byte(i2c_h, register_address, &data);
    +
    +
  • +
  • To write word data to a slave device register, use the peripheral_i2c_write_register_word() function: +
    +uint16_t data = 0xffff;
    +uint8_t register_address = ...;  /* See the specification */
    +peripheral_i2c_write_register_byte(i2c_h, register_address, data);
    +
    +
  • +
  • To read word data from a slave device register, use the peripheral_i2c_read_register_word() function: +
    +uint16_t data ;
    +uint8_t register_address = ...;  /* See the specification */
    +peripheral_i2c_read_register_byte(i2c_h, register_address, &data);
    +
    +
  • +
+ + + +
+ + +Go to top + + + + + + diff --git a/iot/api/peripheral_io_api_pwm.htm b/iot/api/peripheral_io_api_pwm.htm new file mode 100644 index 0000000..e08e999 --- /dev/null +++ b/iot/api/peripheral_io_api_pwm.htm @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + PWM + + + + + + +
+ + +
+ +
+ +

PWM

+ +

PWM (pulse-width modulation) provides a programmable work interface for, for example, controlling the motor speed or changing the light brightness.

+ +

Peripheral devices that support PWM are controlled by the current strength. To modulate the current, the voltage needs to be modulated. Since the voltage is proportional to the intensity of the current, the higher the voltage, the higher the current intensity.

+ +

To modulate the voltage, you must set the duty cycle and polarity:

+
    +
  • The period is a constant interval at which the pulse repeats.
  • +
  • The duty cycle is the constant time within 1 period in which a signal is active.
  • +
  • The "polarity high" characterizes a signal that starts high for the duration of the duty cycle and goes low for the remainder of the period. Conversely, a signal with "polarity low" starts low for the duration of the duty cycle and goes high for the remainder of the period.
  • +
  • The pulse is repeated when the Enable setting is set.
  • +
+ +

Figure: Duty cycle

+

Duty cycle

+ +

For example, if the period is 10,000,000 nanoseconds and the duty cycle of the polarity high is 7,000,000 nanoseconds, an average voltage is a 70%.

+ +

Figure: Average voltage by duty cycle

+

Average voltage by duty cycle

+ +

Opening and Closing a Handle

+ +

To open and close a handle:

+ +
    +
  1. To open a PWM handle, use the peripheral_pwm_open() function: +
    +int chip = ...;
    +int pin = ...;
    +peripheral_pwm_h pwm_h;
    +peripheral_pwm_open(chip, pin, &pwm_h);
    +
    +

    The chip and pin parameters required for this function must be set according to the following table.

    + +

    Table: ARTIK 530

    + + + + + + + + + + + + +
    Pin nameChip (parameter 1)Pin (parameter 2)
    PWM002
    +
  2. +
  3. To close a PWM handle that is no longer used, use the peripheral_pwm_close() function: +
    +peripheral_pwm_close(pwm_h);
    +
    +
  4. +
+ +

Setting the Period

+ +

To set the period, use the peripheral_pwm_set_period() function.

+

The following example sets the period to 20 milliseconds. The unit is nanoseconds.

+
+Uint32_t period = 20000000;
+peripheral_pwm_set_period(pwm_h, period);
+
+ +

Setting the Duty Cycle

+ +

To set the duty cycle, use the peripheral_pwm_set_duty_cycle() function.

+

The following example sets the duty cycle to 2 milliseconds. The unit is nanoseconds.

+
+uint32_t duty_cycle = 2000000;
+peripheral_pwm_set_duty_cycle(pwm_h, duty_cycle);
+
+ +

Setting the Polarity

+ +

To set the polarity, use the peripheral_gpio_set_polarity() function with 1 of the following polarity types:

+ +
    +
  • PERIPHERAL_PWM_POLARITY_ACTIVE_HIGH: Polarity is high.
  • +
  • PERIPHERAL_PWM_POLARITY_ACTIVE_LOW: Polarity is low.
  • +
+ +
+peripheral_pwm_polarity_e polarity = PERIPHERAL_PWM_POLARITY_ACTIVE_HIGH;
+peripheral_pwm_set_polarity(pwm_h, polarity);
+
+ +

Enabling Repetition

+ +

To set the enable setting, use the peripheral_pwm_set_enable() function:

+
+bool enable = true;
+peripheral_pwm_set_enable(pwm_h, enable);
+
+ + + +
+ + +Go to top + + + + + + diff --git a/iot/api/peripheral_io_api_spi.htm b/iot/api/peripheral_io_api_spi.htm new file mode 100644 index 0000000..5896335 --- /dev/null +++ b/iot/api/peripheral_io_api_spi.htm @@ -0,0 +1,270 @@ + + + + + + + + + + + + + + SPI + + + + + + +
+ + +
+ +
+ +

SPI

+ +

SPI (Serial Peripheral Interface) provides a programmable interface for transferring data quickly to devices that require high performance.

+ +

The SPI protocol is a serial communication method that controls the clock signal as master and other peripheral devices connected to SPI as slaves. This protocol is used by peripherals, such as heart-beat pulse sensors and graphic displays, that require fast data transfer.

+ +

Figure: SPI interface diagram

+

SPI interface diagram

+ +

The SPI is a communication method between 1 master and multiple slave devices. In the above figure:

+
    +
  • CLK (SCLK or SCK) is a simple synchronization signal and a communication clock.
  • +
  • The data flows from the master to the slave in the MOSI (Master Out Slave In) line, and from the slave to the master in the MISO (Master In Slave Out) line. Full duplex data communication is possible with 2 lines (MOSI and MISO).
  • +
  • CS (Chip Select) is a signal for selecting a slave device.
  • +
+ +

SPI supports half duplex read/write and full duplex transfer.

+ +

To use SPI, you must set the following:

+ +
    +
  • SPI mode + +

    Figure: SPI modes

    +

    SPI modes

    +

    Each of the 4 available SPI modes defines a specific combination of clock polarity (CPOL) and clock phase (CPHA). A clock polarity of 0 means that the clock is first rising and then falling and a clock polarity of 1 means that the clock is first falling and then rising. A clock phase of 0 means that the data is sampled at the first edge and a clock phase of 1 means that the data is sampled at the trailing edge.

    + +

    Table: SPI modes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    SPI modePolarityPhaseDescription
    SPI MODE 000CLK is active high and sampled at the rising edge.
    SPI MODE 101CLK is active high and sampled at the falling edge.
    SPI MODE 210CLK is active low and sampled at the rising edge.
    SPI MODE 311CLK is active low and sampled at the falling edge.
    +
  • +
  • Bit order +

    The bit order refers to the sequential order in which bytes are arranged into larger numerical values. MSB indicates that the most significant bit is transmitted first. LSB indicates that the least significant bit is transmitted first.

    +
  • +
  • Bit per word +

    The bit per word refers to the number of bits to be transmitted at a time when data is exchanged with a connected slave. Normally, it is set to 8 bits per word.

    +
  • +
  • Frequency +

    The frequency refers to the clock signal in Hz. Since the frequencies are different for each slave device, the applicable value must be checked from the peripheral's specification.

    +
+ +

Opening and Closing a Handle

+ +

To open and close a handle:

+ +
    +
  1. To open a SPI handle, use the peripheral_spi_open() function: +
    +int bus = ...;
    +int chip_select = ...;
    +peripheral_spi_h spi_h;
    +peripheral_spi_open(bus, chip_select, &spi_h);
    +
    +

    The bus and chip_select parameters required for this function must be set according to the following tables.

    + +

    Table: ARTIK 530

    + + + + + + + + + + + + + + + +
    Pin nameBus (parameter 1)Chip Select (parameter 2)
    SPI0_MOSISPI0_MISOSPI0_CLKSPI0_CS20
    + +

    Table: Raspberry Pi 3

    + + + + + + + + + + + + + + + + + + + + + + + +
    Pin nameBus (parameter 1)Chip Select (parameter 2)
    SPI0_MOSISPI0_MISOSPI0_CLKSPI0_CS000
    SPI0_MOSISPI0_MISOSPI0_CLKSPI0_CS101
    +
  2. +
  3. To close a SPI handle that is no longer used, use the peripheral_spi_close() function: +
    +peripheral_spi_close(spi_h);
    +
    +
+ +

Setting the SPI Mode

+ +

To set the SPI mode, use the peripheral_spi_set_mode() function with 1 of the following mode types:

+ +
    +
  • PERIPHERAL_SPI_MODE_0: CLK is active high and sampled at the rising edge.
  • +
  • PERIPHERAL_SPI_MODE_1: CLK is active high and sampled at the falling edge.
  • +
  • PERIPHERAL_SPI_MODE_2: CLK is active low and sampled at the rising edge.
  • +
  • PERIPHERAL_SPI_MODE_3: CLK is active low and sampled at the falling edge.
  • +
+
+peripheral_spi_mode_e spi_mode = PERIPHERAL_SPI_MODE_1;
+peripheral_spi_set_mode(spi_h, spi_mode);
+
+ +

Setting the Bit Order

+ +

To set the bit order, use the peripheral_spi_set_bit_order() function with 1 of the following bit order types:

+ +
    +
  • PERIPHERAL_SPI_BIT_ORDER_MSB: Use the most significant bit first.
  • +
  • PERIPHERAL_SPI_BIT_ORDER_LSB: Use the least significant bit first. +
+
+peripheral_spi_bit_order_e bit_order = PERIPHERAL_SPI_BIT_ORDER_MSB;
+peripheral_spi_set_bit_order(spi_h, bit_order);
+
+ +

Setting the Bits per Word

+ +

To set the bits per word, use the peripheral_spi_set_bits_per_word() function:

+
+uint8_t bits_per_word = 8;
+peripheral_spi_set_bits_per_word(spi_h, bits_per_word);
+
+ +

Setting the Frequency

+ +

To set the frequency, use the peripheral_spi_set_frequency() function.

+

The frequency unit is Hz.

+
+uint32_t frequency = 1024;
+peripheral_spi_set_frequency(spi_h, frequency);
+
+ +

Reading, Writing, and Transferring Data

+ +

To read, write, and transfer data:

+ +
    +
  • To read data from a slave device, use the peripheral_spi_read() function: +
    +uint8_t data;
    +uint32_t length = 1;
    +peripheral_spi_read(spi_h, &data, length);
    +
    +
  • +
  • To write data to a slave device, use the peripheral_spi_write() function: +
    +uint8_t data = 0x80;
    +uint32_t length = 1;
    +peripheral_spi_read(spi_h, &data, length);
    +
    +
  • +
  • To exchange bytes data with a slave device, use the peripheral_spi_transfer() function: +
    +uint8_t tx_data[2] = {0x80, 0x01};
    +uint8_t rx_data[2];
    +uint32_t length = 2;
    +peripheral_spi_transfer(spi_h, tx_data, rx_data, length);
    +
    +
  • +
+ + + +
+ + +Go to top + + + + + + diff --git a/iot/api/peripheral_io_api_uart.htm b/iot/api/peripheral_io_api_uart.htm new file mode 100644 index 0000000..f774dd4 --- /dev/null +++ b/iot/api/peripheral_io_api_uart.htm @@ -0,0 +1,227 @@ + + + + + + + + + + + + + + UART + + + + + + +
+ + +
+ +
+ +

UART

+ +

UART (universal asynchronous receiver-transmitter) provides a programmable interface to communicate 1:1 with a UART peripheral device.

+ +

Figure: UART interface diagram

+

UART interface diagram

+ +

UART is an interface for exchanging data with peripherals. It is an asynchronous method that transmits data without a clock line, and consists of only 2 data lines, transmit (Tx) and receive (Rx). UART performs 1:1 communication.

+ +

Figure: UART data frame

+

UART data frame

+ +

The UART data frame consists of start (1 bit), data (5~8 bit), parity (1 bit) and stop (1 bit):

+ +
    +
  • Start bit +

    Indicates the start of the communication before sending data and holds it for a bit time length.

  • +
  • Data +

    Transmits 5 to 8 bits of data.

  • +
  • Parity bit +

    Generates and transmits a parity value for error verification, and determines a receiving side error. The following options are available: None, Even, and Odd parity. Selecting None removes this bit.

  • +
  • Stop bit +

    Indicates the termination of the communication and holds 1 or 2 bits.

  • +
  • Baud rate +

    Asynchronous transmission/receiving speeds must be matched to the peripheral device. For this purpose, the number of signals transmitted per second can be synchronized with a peripheral device. It is called the Baud.

  • +
+ +

If a device supports a 5-wire UART port, hardware flow control can be used to increase the reliability of the data transmission. Software flow control can also be used to increase reliability.

+ +

Opening and Closing a Handle

+ +

To open and close a handle:

+ +
    +
  1. To open a UART handle, use the peripheral_uart_open() function: +
    +int port = ...;
    +peripheral_uart_h uart_h;
    +peripheral_uart_open(port, &uart_h);
    +
    +

    The port parameter required for this function must be set according to the following tables.

    + +

    Table: ARTIK 530

    + + + + + + + + + + + +
    Pin namePort (parameter 1)
    UART0_RXUART0_TX4
    + +

    Table: Raspberry Pi 3

    + + + + + + + + + + + +
    Pin namePort (parameter 1)
    UART0_RXUART0_TX0
    +
  2. +
  3. To close a UART handle that is no longer used, use the peripheral_uart_close() function: +
    +peripheral_uart_close(uart_h);
    +
    +
+ +

Setting the Baud Rate

+ +

To set the baud rate, use the peripheral_uart_set_baud_rate() function with a baud rate value:

+ +
  • PERIPHERAL_UART_BAUD_RATE_0 ~ PERIPHERAL_UART_BAUD_RATE_230400
+ +
+peripheral_uart_baud_rate_e baud_rate = PERIPHERAL_UART_BAUD_RATE_9600;
+peripheral_uart_set_baud_rate(uart_h, baud_rate);
+
+ +

Setting the Byte Size

+ +

To set the byte size, use the peripheral_uart_set_byte_size() function with 1 of the following byte size types:

+ +
    +
  • PERIPHERAL_UART_BYTE_SIZE_5BIT: Byte size is 5 bits.
  • +
  • PERIPHERAL_UART_BYTE_SIZE_6BIT: Byte size is 6 bits.
  • +
  • PERIPHERAL_UART_BYTE_SIZE_7BIT: Byte size is 7 bits.
  • +
  • PERIPHERAL_UART_BYTE_SIZE_8BIT: Byte size is 8 bits.
  • +
+
+peripheral_uart_byte_size_e byte_size = PERIPHERAL_UART_BYTE_SIZE_7;
+peripheral_uart_set_byte_size(uart_h, byte_size);
+
+ +

Setting the Parity Bit

+ +

To set the parity bit, use the peripheral_uart_set_parity() function with 1 of the following parity types:

+ +
    +
  • PERIPHERAL_UART_PARITY_NONE: No parity bit.
  • +
  • PERIPHERAL_UART_PARITY_EVEN: Parity bit is even.
  • +
  • PERIPHERAL_UART_PARITY_ODD: Parity bit is odd.
  • +
+
+peripheral_uart_parity_e parity = PERIPHERAL_UART_PARITY_EVEN;
+peripheral_uart_set_parity(uart_h, parity);
+
+ +

Setting the Stop Bits

+ +

To set the stop bits, use the peripheral_uart_set_stop_bits() function with 1 of the following stop bit types:

+ +
    +
  • PERIPHERAL_UART_STOP_BITS_1BIT: 1 bit is used for stop bits.
  • +
  • PERIPHERAL_UART_STOP_BITS_2BIT: 2 bit is used for stop bits.
  • +
+
+peripheral_uart_stop_bits_e stop_bit = PERIPHERAL_UART_STOP_BITS_2BIT;
+peripheral_uart_set_stop_bits(uart_h, stop_bit);
+
+ +

Setting the Flow Control

+ +

To set the hardware and software flow control, use the peripheral_uart_set_flow_control() function with 1 of the following flow control types:

+ +
    +
  • PERIPHERAL_UART_HARDWARE_FLOW_CONTROL_NONE: No hardware flow control.
  • +
  • PERIPHERAL_UART_HARDWARE_FLOW_CONTROL_AUTO_RTSCTS: Hardware flow control uses RTSCTS.
  • +
  • PERIPHERAL_UART_SOFTWARE_FLOW_CONTROL_NONE: No software flow control.
  • +
  • PERIPHERAL_UART_SOFTWARE_FLOW_CONTROL_XONXOFF: Software flow control uses XONXOFF.
  • +
+
+peripheral_uart_hardware_flow_control_e hw_flow_control = PERIPHERAL_UART_HARDWARE_FLOW_CONTROL_AUTO_RTSCTS;
+peripheral_uart_software_flow_control_e sw_flow_control = PERIPHERAL_UART_SOFTWARE_FLOW_CONTROL_XONXOFF;
+peripheral_uart_set_flow_control(uart_h, sw_flow_control, hw_flow_control);
+
+ +

Reading and Writing Data

+ +

To read and write data:

+ +
    +
  • To write data to a slave device, use the peripheral_uart_write() function: +
    +uint8_t data[2] = {0x06, 0x01};
    +uint32_t length = 2;
    +peripheral_uart_write(uart_h, data, length);
    +
    +
  • +
  • To read data from a slave device, use the peripheral_uart_read() function: +
    +uint8_t data[2];
    +uint32_t length = 2;
    +peripheral_uart_read(uart_h, data, length);
    +
    +
  • +
+ + + +
+ + +Go to top + + + + + + diff --git a/iot/api/things_api.htm b/iot/api/things_api.htm new file mode 100644 index 0000000..f5fa9d9 --- /dev/null +++ b/iot/api/things_api.htm @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + Things SDK API + + + + + +
+
+ +
+ +

Things SDK API

+ +

Developing "Things" which are market-ready (with cloud support) has been a challenge for most of the companies and individual developers. The SmartThings™ Things SDK API helps you to create new IOT devices easily.

+ +

The 2 core components for creating a new device are:

+ +
    +
  • SmartThings™ Things JSON Configuration file (device_definition.json) +

    For more information on the configuration file details, see Device Definition.

  • +
  • Application logic and user interaction +

    For more information on using the SmartThings™ Things SDK API, see API Usage.

  • +
+ +

Figure: Creating a new device

+

Creating a new device

+ +

The SmartThings™ (ST) Things SDK provides you an easy and configurable option to build and deploy your own devices quickly:

+ +
    +
  • The ST Things SDK provides JSON-based things definition, which: +
      +
    • Defines device and platform information.
    • +
    • Defines resources that the thing is supporting.
    • +
    • Defines an easy-setup configuration.
    +
  • +
  • The ST Things SDK provides spec-agnostic APIs, which: +
      +
    • Hide the interface and resource type details in a request data.
    • +
    • Divide a collection resource request into single resource requests.
    • +
    • Provide the "property_key" in case of the GET request.
    +
+ +

The SmartThings™ Things SDK API provides the following benefits for you:

+ +
    +
  • Supporting pin-based and UserConfirm(Certificate)-based OTM in EasySetup.
  • +
  • Providing a JSON-based device/resource definition method in a single file: +
    • Includes Single resource and Collection resource support.
    +
  • +
  • Resources that are defined in a JSON file/string are made internally.
  • +
  • Easy APIs to handle requests and responses: +
    • Supports request methods: GET and POST.
    • +
    • You only need to make a representation (bundle of property values) for a response.
    • +
    • You do not need to handle interfaces, as they are handled internally.
    • +
    • The request to a collection resource is divided into individual requests to single resources.
    +
  • +
  • Cloud setup (Sign-up/Sign-in/Sign-out/Resource publish to cloud) is handled internally.
  • +
  • Following operations are handled internally: +
    • To respond to an Access Point List (APList) request from a client.
    • +
    • To start and stop softAP.
    • +
    • To connect to a target WiFi AP (Enroller).
    • +
    • To make the whole response data according to the interfaces (such as oic.if.baseline, oic.if.b, and oic.if.ll).
    +
+ + + + +
+ + +Go to top + + + + + + diff --git a/iot/api/things_api_device.htm b/iot/api/things_api_device.htm new file mode 100644 index 0000000..a0a8588 --- /dev/null +++ b/iot/api/things_api_device.htm @@ -0,0 +1,458 @@ + + + + + + + + + + + + + + Device Definition + + + + + + +
+ + +
+ +
+ +

Device Definition

+ +

The device definition is stored in a JSON configuration file that you need to provide. The following table describes the key components of a JSON file skeleton.

+ +

Table: JSON file key components

+ + + + + + + + + + +
JSON configuration file skeletonKey component
+
+{
+   "device": [
+      {
+         "specification": {
+            ...
+            ...
+         },
+         "resources": {
+            ...
+            ...
+         }
+      }
+   ],
+   "resourceTypes": [
+    ...
+    ...
+   ],
+   "configuration": {
+      "easySetup": {
+         ...
+         ...
+      },
+      "wifi": {
+         ...
+         ...
+      },
+      "filePath": {
+         ...
+         ...
+      }
+   }
+}
+
+
  • "device" = Array of devices (each device specification and resources), only a device is supported currently.
  • +
  • "specification": Contains device and platform information.
  • +
  • "resources": Contains single and collection resources.
  • +
  • "resourceTypes": Resource type database for all resources present in "devices" > "resources".
  • +
  • "configuration": Configuration info.
  • +
  • "easySetup": Configuration info for Easy Setup.
  • +
  • "wifi": Supported Wi-Fi related info.
  • +
  • "filePath": File location where additional security and certificate files are stored.
+ +

Device Specification Component

+ +

The "device" > "specification" component has 2 subsections:

+ +
    +
  • "device" contains device information. It has the following fields: +
      +
    • deviceType: Device type based on the OCF specification
    • +
    • deviceName: Name of the device that you want to create
    • +
    • specVersion: OCF specification followed for the device
    • +
    • dataModelVersion: OCF resource type followed for the device
    • +
    +
  • +
  • "platform" contains the platform information. It has the following fields: +
      +
    • manufacturerName: Name of the manufacturer
    • +
    • manufacturerUrl: Manufacturer Web site
    • +
    • manufacturingDate: Date of manufacturing
    • +
    • modelNumber: Device model number
    • +
    • platformVersion: Platform version
    • +
    • osVersion: Operating system version
    • +
    • hardwareVersion: Hardware revision information
    • +
    • firmwareVersion: Firmware version
    • +
    • vendorId: Vendor identification
    • +
    +
+ +

The following example shows a sample entry for the "devices" > "specification" component:

+ +
+"specification": {
+   "device": {
+      "deviceType": "oic.d.networkaudio",
+      "deviceName": "[av] Samsung",
+      "specVersion": "core.1.1.0",
+      "dataModelVersion": "res.1.1.0"
+   },
+   "platform": {
+      "manufacturerName": "samsung",
+      "manufacturerUrl": "http://www.samsung.com/sec/",
+      "manufacturingDate": "2017-08-31",
+      "modelNumber": "NWSP-01",
+      "platformVersion": "1.0",
+      "osVersion": "1.0",
+      "hardwareVersion": "1.0",
+      "firmwareVersion": "1.0",
+      "vendorId": "VD-NetworkAudio-2017"
+   }
+}
+
+ +

Device Resources Component

+ +

The device acts as an IoTivity server and can host a number of resources. These resources can be published to the cloud and can be controlled through the Samsung Connect (or IoTivity Client) Application using the resource URI. Each resource has a unique resource URI on the device.

+ +

The "devices" > "resources" component can be of 2 types:

+ +
    +
  • Single: Resources are standalone resources. These types of resources are mostly used by simple devices, such as temperature sensor and electric bulb. +

    All single resources can be represented using array values with "single" as a key under "resources":

    +
    +"resources": {
    +   "single": [
    +      {
    +         Resource Information #1
    +      },
    +      {
    +         Resource Information #2
    +      },
    +      ...
    +      {
    +         Resource Information #N
    +      }
    +   ]
    +}
    +
    + +

    A single resource has the following fields:

    +
      +
    • uri: Uniform Resource Identifier to identify the resource
    • +
    • types: OCF defined resource type applicable for the resource
    • +
    • interfaces: OCF-defined interfaces where resources are registered
    • +
    • policy: Possible policy values are: b0001 (discoverable), b0010 (observable), b0100 (secure)
    • +
    + +

    The following example shows a sample entry for the "devices" > "resources" > "single" component:

    +
    +{
    +   "uri": "/switch",
    +   "types": [
    +      "oic.r.switch.binary"
    +   ],
    +   "interfaces": [
    +      "oic.if.a",
    +      "oic.if.baseline"
    +   ],
    +   "policy": 3
    +}
    +
  • +
  • Collection: Multiple resources can be controlled using a collection resource. Collection resource can have 1 or more resources as links. For example, robot cleaner and refrigerator. + +

    All collection resources can be represented using array values with "collection" as a key under "resources". A collection resource has a very similar structure as a single resource, as it has all the same fields. In addition, the collection resource has links, which are the array of resource information that are part of that collection.

    + +

    The collection resource "types" field is set to "oic.wk.col" to distinguish the single and collection resources.

    + +

    The following example shows a sample entry for the "devices" > "resources" > "collection" component:

    +
    +"resources": {
    +   "collection": [
    +      {
    +         "uri": "/led",
    +         "types": [
    +            "oic.wk.col"
    +         ],
    +         "interfaces": [
    +            "oic.if.baseline",
    +            "oic.if.ll",
    +            "oic.if.b"
    +         ],
    +         "links": [
    +            {
    +               Resource Information #1
    +            },
    +            {
    +               Resource Information #2
    +            },
    +            ...
    +            {
    +               Resource Information #N
    +            }
    +         ],
    +         "policy": 3
    +      }
    +   ]
    +}
    +
    +
  • +
+ +
+ Note + Make sure that the resources are not duplicated in the "single" and "collection" components. +
+ +

Resource Type Component

+ +

The "resourceTypes" component is a database of all the resources types present in the current configuration.

+ +

The following fields are present for each resource type entry:

+ +
    +
  • type: Resource type that is present in the current configuration
  • +
  • properties: Array of property information of a specified resource type
  • +
+ +

The following example shows a sample entry for the "resourceTypes" component:

+
+"resourceTypes": [
+   {
+      "type": "oic.r.switch.binary",
+      "properties": [
+         {
+            Property Information #1
+         },
+         {
+            Property Information #2
+         },
+         ...
+         {
+            Property Information #N
+         }
+      ]
+   },
+   {
+      "type": "oic.r.audio",
+      "properties": [
+         {
+            Property Information #1
+         },
+         {
+            Property Information #2
+         },
+         ...
+         {
+            Property Information #N
+         }
+      ]
+   }
+]
+
+ +

Each property has the following fields:

+ +
    +
  • key[string]: Key of a property
  • +
  • type[int]: Data type of the property value: +
    • 0: boolean
    • +
    • 1: integer
    • +
    • 2: double
    • +
    • 3: string
    • +
    • 4: object
    • +
    • 5: bytes
    • +
    • 6: integer array
    • +
    • 7: double array
    • +
    • 8: string array
    • +
    • 9: object array
  • +
  • rw[int]: Access authority of the property: +
    • read(b0001)
    • +
    • write(b0010)
    • +
    • both(b0011)
  • +
  • mandatory[bool]: Whether the property is mandatory according to the property access authority (rw)
  • +
+ +

The following example shows a sample entry for the "resources" and "resourceTypes" component. The resource types used in the resources must be defined in the resource types.

+ +

Example: Defining resource types

+ + + + + + +
+
+"resources": {
+   "single": [
+      {
+         "uri": "/switch",
+         "types": [
+            "oic.r.switch.binary"
+         ],
+         "interfaces": [
+            "oic.if.a",
+            "oic.if.baseline"
+         ],
+         "policy": 3
+      },
+      {
+         "uri": "/audio",
+         "types": [
+            "oic.r.audio"
+         ],
+         "interfaces": [
+            "oic.if.a",
+            "oic.if.baseline"
+         ],
+         "policy": 3
+      }
+   ]
+}
+
+
+"resourceTypes": [
+   {
+      "type": "oic.r.switch.binary",
+      "properties": [
+         {
+            "key": "value",
+            "type": 0,
+            "mandatory": true,
+            "rw": 3
+         }
+      ]
+   },
+   {
+      "type": "oic.r.audio",
+      "properties": [
+         {
+            "key": "volume",
+            "type": 1,
+            "mandatory": true,
+            "rw": 3
+         },
+         {
+            "key": "mute",
+            "type": 0,
+            "mandatory": true,
+            "rw": 3
+         }
+      ]
+   }
+]
+
+ +

Configuration Component

+ +

The "configuration" component has the following fields:

+ +
    +
  • easySetup[object]: Defines easy-setup information. +
    • connectivity[object]: Defines connectivity information. +
      • type[int]: Connectivity type for easy-setup: 1 (SoftAP) or 2 (BLE)
      • +
      • softAP[object]: Defines softap information that is supported in the thing. +
        • manufacturerId[string]: Manufacturer identifier issued by DevWorkSpace
        • +
        • setupId[string]: Setup identifier
        • +
        • artik[bool]: Whether the ARTIK board is used
        +
      +
    • +
    • ownershipTransferMethod[int]: Authentication method during easy-setup: b0001(Random PIN-based) or b0010(UserConfirm-based)
    +
  • +
  • wifi[object]: Defines the supported Wi-Fi specification. +
    • interfaces[int]: Supported Wi-Fi interfaces: b000001(a), b000010(b), b000100(g), b001000(n), or b010000(ac)
    • +
    • frequency[int]: Supported Wi-Fi frequency: b0001(2.4G) or b0010(5G)
    +
  • +
  • filePath[object]: Defines the full file path of some read and write files. +
    • svrdb[string]: Full path for the security database file
    • +
    • provisioning[string]: Full path for the provisioning data file
    • +
    • certificate[string]: Full path for the certificate file
    • +
    • privateKey[string]: Full path for the privateKey file
    +
+ +

For more information on Easy Setup, see https://wiki.iotivity.org/easy_setup.

+ +

The following example shows a sample entry for the "configuration" component. To configure a device for easy setup, the following details must be included in the configuration file.

+ +
+"configuration": {
+   "easySetup": {
+      "connectivity": {
+         "type": 1,
+         "softAP": {
+            "manufacturerId": "mid",
+            "setupId": "sid",
+            "artik": true
+         }
+      },
+      "ownershipTransferMethod": 2
+   },
+   "wifi": {
+      "interfaces": 31,
+      "frequency": 3
+   },
+   "filePath": {
+      "svrdb": "/things/my/svrdb.dat",
+      "provisioning": "/things/my/provisioning.json",
+      "certificate": "/things/my/certificate.pem",
+      "privateKey": "/things/my/privatekey.der"
+   }
+}
+
+ + + +
+ + +Go to top + + + + + + diff --git a/iot/api/things_api_guide.htm b/iot/api/things_api_guide.htm new file mode 100644 index 0000000..472d41c --- /dev/null +++ b/iot/api/things_api_guide.htm @@ -0,0 +1,470 @@ + + + + + + + + + + + + + + API Usage + + + + + + +
+ + +
+ +
+ +

API Usage

+ +

The following figure illustrates the SmartThings™ Things API life-cycle.

+ +

Figure: SmartThings™ Things API life-cycle

+

SmartThings Things API life-cycle

+ +

Initializing Stack and Callbacks

+ +

Once the device configuration JSON file is ready, you can specify the file in the st_things_initialize() function:

+ +
+bool easysetup_complete = false;
+st_things_initialize("sample_device.json", &easysetup_complete);
+
+/* User input can be handled graphically or using CLI */
+/* You need to decide that */
+if (!easysetup_complete) {
+    int cmd = 0;
+    printf("[%s]Start Easysetup ? (1:yes, other:no): ", TAG);
+    scanf("%d", &cmd);
+    if (1 != cmd) {
+        st_things_deinitialize();
+
+        return 0;
+    }
+}
+
+/* Register Callbacks */
+st_things_register_request_cb(handle_get_request, handle_set_request);
+st_things_register_reset_cb(handle_reset_request, handle_reset_result);
+st_things_register_user_confirm_cb(handle_ownership_transfer_request);
+st_things_register_things_status_change_cb(handle_things_status_change);
+
+st_things_start();
+printf("ST Things Stack started\n");
+
+handle_main_loop();
+
+st_things_stop();
+printf("ST Things Stack Stopped\n");
+st_things_deinitialize();
+printf("ST Things Stack deinitialized\n");
+
+ +

You must define the highlighted code in the above example. The st_XXX() functions come from the ST Things SDK API. For more information, see the API Documentation.

+ +

Getting and Setting Request Handling Callbacks

+ +

Assume that the following resources and resource types are defined in the sample_device.json file:

+ +

Example: Resources and resource types

+ + + + + + +
+
+"resources": {
+   "single": [
+      {
+         "uri": "/switch",
+         "types": [
+            "oic.r.switch.binary"
+         ],
+         "interfaces": [
+            "oic.if.a",
+            "oic.if.baseline"
+         ],
+         "policy": 3
+      },
+      {
+         "uri": "/audio",
+         "types": [
+            "oic.r.audio"
+         ],
+         "interfaces": [
+            "oic.if.a",
+            "oic.if.baseline"
+         ],
+         "policy": 3
+      }
+   ]
+}
+
+
+"resourceTypes": [
+   {
+      "type": "oic.r.switch.binary",
+      "properties": [
+         {
+            "key": "value",
+         "type": 0,
+            "mandatory": true,
+            "rw": 3
+         }
+      ]
+   },
+   {
+      "type": "oic.r.audio",
+      "properties": [
+         {
+            "key": "volume",
+            "type": 1,
+            "mandatory": true,
+            "rw": 3
+         },
+         {
+            "key": "mute",
+            "type": 0,
+            "mandatory": true,
+            "rw": 3
+         }
+      ]
+   }
+]
+
+ +

The 2 defined resources are:

+
  • Switch (URI = "/switch")
  • +
  • Audio (URI = "/audio")
  • +
+ +

The following example illustrates the get and set request handlers:

+ +
+static const char* RES_SWITCH = "/switch";
+static const char* RES_AUDIO = "/audio";
+
+bool
+handle_get_request(st_things_get_request_message_s* req_msg, st_things_representation_s* resp_rep)
+{
+    printf("[%s]Received a GET request on %s\n", TAG, req_msg->resource_uri);
+    bool ret = false;
+    if (0 == strcmp(req_msg->resource_uri, RES_SWITCH)) {
+        ret = handle_get_request_on_switch(req_msg, resp_rep);
+    } else if (0 == strcmp(req_msg->resource_uri, RES_AUDIO)) {
+        ret = handle_get_request_on_audio(req_msg, resp_rep);
+    } else {
+        printf("[%s]Not supported uri.\n", TAG);
+    }
+
+    return ret;
+}
+
+bool
+handle_set_request(st_things_set_request_message_s* req_msg, st_things_representation_s* resp_rep)
+{
+    printf("[%s]Received a SET request on %s\n", TAG, req_msg->resource_uri);
+    bool ret = false;
+
+    if (0 == strcmp(req_msg->resource_uri, RES_SWITCH)) {
+        ret = handle_set_request_on_switch(req_msg, resp_rep);
+    } else if (0 == strcmp(req_msg->resource_uri, RES_AUDIO)) {
+        ret = handle_set_request_on_audio(req_msg, resp_rep);
+    } else {
+        printf("[%s]Not supported uri.\n", TAG);
+    }
+
+    return ret;
+}
+
+ +

The key difference is the req_msg->resource_uri value passed in the callbacks to distinguish the 2 resources. Since the resource URI is unique in the device definition, each resource can be handled separately.

+ +

The following examples illustrate the get and set request handling callbacks for a single and multiple properties:

+ +
    +
  • For a single property, you must extract the desired property from the request message and update the device property database locally. Once you have updated the device property, you must update the response representation about the updated property which is sent to the client: + +
    +#define TAG "DEVELOPER_DEVICE"
    +
    +static const char* PROPERTY_VALUE = "value";
    +bool g_switch_value = false;
    +
    +bool
    +handle_get_request_on_switch(st_things_get_request_message_s* req_msg, st_things_representation_s* resp_rep)
    +{
    +    printf("[%s]IN-handle_get_request_on_switch() called..\n", TAG);
    +    printf("[%s]current switch value: %d\n", TAG, g_switch_value);
    +
    +    resp_rep->set_bool_value(resp_rep, PROPERTY_VALUE, g_switch_value);
    +
    +    printf("[%s]OUT-handle_get_request_on_switch() called..\n", TAG);
    +
    +    return true;
    +}
    +
    +bool
    +handle_set_request_on_switch(st_things_set_request_message_s* req_msg, st_things_representation_s* resp_rep)
    +{
    +    printf("[%s]IN-handle_set_request_on_switch() called..\n", TAG);
    +    printf("[%s]current switch value: %d\n", TAG, g_switch_value);
    +
    +    bool desired_value = false;
    +    req_msg->rep->get_bool_value(req_msg->rep, PROPERTY_VALUE, &desired_value);
    +
    +    printf("[%s]desired switch value: %d\n", TAG, desired_value);
    +    g_switch_value = desired_value;
    +    printf("[%s]changed switch value: %d\n", TAG, g_switch_value);
    +
    +    resp_rep->set_bool_value(resp_rep, PROPERTY_VALUE, g_switch_value);
    +
    +    printf("[%s]OUT-handle_set_request_on_switch() called..\n", TAG);
    +
    +    return true;
    +}
    +
    +
  • +
  • For multiple properties, the process is the same, except that you need to handle multiple properties at the same time: + +
    +#define TAG "DEVELOPER_DEVICE"
    +static const char* PROPERTY_VOLUME = "volume";
    +static const char* PROPERTY_MUTE = "mute";
    +int64_t g_audio_volume = 0;
    +bool g_audio_mute = false;
    +
    +bool
    +handle_get_request_on_audio(st_things_get_request_message_s* req_msg, st_things_representation_s* resp_rep)
    +{
    +    printf("[%s]IN-handle_get_request_on_audio() called..\n", TAG);
    +    printf("[%s]current audio volume: %"PRId64".\n", TAG, g_audio_volume);
    +    printf("[%s]current audio mute: %d.\n", TAG, g_audio_mute);
    +
    +    resp_rep->set_int_value(resp_rep, PROPERTY_VOLUME, g_audio_volume);
    +    resp_rep->set_bool_value(resp_rep, PROPERTY_MUTE, g_audio_mute);
    +    printf("[%s]OUT-handle_get_request_on_audio() called..\n", TAG);
    +
    +    return true;
    +}
    +
    +bool
    +handle_set_request_on_audio(st_things_set_request_message_s* req_msg, st_things_representation_s* resp_rep)
    +{
    +    printf("[%s]IN-handle_set_request_on_audio() called..\n", TAG);
    +    printf("[%s]current audio volume: %"PRId64".\n", TAG, g_audio_volume);
    +    printf("[%s]current audio mute: %d\n", TAG, g_audio_mute);
    +
    +    int64_t desired_volume = 0;
    +    bool desired_mute = false;
    +    req_msg->rep->get_int_value(req_msg->rep, PROPERTY_VOLUME, &desired_volume);
    +    req_msg->rep->get_bool_value(req_msg->rep, PROPERTY_MUTE, &desired_mute);
    +
    +    printf("[%s]desired audio volume: %"PRId64".\n", TAG, desired_volume);
    +    printf("[%s]desired audio mute: %d.\n", TAG, desired_mute);
    +
    +    g_audio_volume = desired_volume;
    +    g_audio_mute = desired_mute;
    +
    +    printf("[%s]changed audio volume: %"PRId64".\n", TAG, g_audio_volume);
    +    printf("[%s]changed audio mute: %d.\n", TAG, g_audio_mute);
    +
    +    resp_rep->set_int_value(resp_rep, PROPERTY_VOLUME, g_audio_volume);
    +    resp_rep->set_bool_value(resp_rep, PROPERTY_MUTE, g_audio_mute);
    +
    +    printf("[%s]OUT-handle_set_request_on_audio() called..\n", TAG);
    +
    +    return true;
    +}
    +
    +
  • +
+ +

Notifying Observers

+ +

The following example illustrates how you can notify observers:

+ +
+#define TAG "DEVELOPER_DEVICE"
+static const char* RES_SWITCH = "/switch";
+static const char* RES_AUDIO = "/audio";
+static const char* PROPERTY_VALUE = "value";
+bool g_switch_value = false;
+
+bool
+notify_observers(const char *resource_uri)
+{
+    printf("[%s] Notify all observers for resource = %s\n", TAG, resource_uri);
+    bool ret = false;
+    if (0 == strcmp(resource_uri, RES_SWITCH)) {
+        ret = st_things_notify_observers(resource_uri);
+    } else if (0 == strcmp(resource_uri, RES_AUDIO)) {
+        ret = st_things_notify_observers(resource_uri);
+    } else {
+        printf("[%s]Not supported uri.\n", TAG);
+    }
+
+    return ret;
+}
+
+bool
+handle_set_request_on_switch(st_things_set_request_message_s* req_msg, st_things_representation_s* resp_rep)
+{
+    printf("[%s]IN-handle_set_request_on_switch() called.\n", TAG);
+    printf("[%s]current switch value: %d\n", TAG, g_switch_value);
+    bool is_value_changed = false;
+    bool desired_value = false;
+    req_msg->rep->get_bool_value(req_msg->rep, PROPERTY_VALUE, &desired_value);
+
+    printf("[%s]desired switch value: %d\n", TAG, desired_value);
+    if (g_switch_value = desired_value) {
+        g_switch_value = desired_value;
+        is_value_changed = true;
+    }
+    resp_rep->set_bool_value(resp_rep, PROPERTY_VALUE, g_switch_value);
+
+    if (is_value_changed) {
+        notify_observers(req_msg->resource_uri);
+    }
+    printf("[%s]OUT-handle_set_request_on_switch() called..\n", TAG);
+
+    return true;
+}
+
+ + +

IoTivity Information

+ +

The following table lists the resource types supported by IoTivity.

+ +

Table: IoTivity resource types

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Resource type nameResource type value
Deviceoic.wk.d
Platformoic.wk.p
Discoveryoic.wk.res
Presenceoic.wk.ad
Collectionoic.wk.col
+ +

The following table shows the IoTivity interfaces that specify how the device returns its response. These interfaces can be used by the IoTivity client (such as Samsung Connect) to retrieve information from the server (device).

+ +

Table: IoTivity interfaces for responses

+ + + + + + + + + + + + + + + + + + + + + + +
NameInterfaceDescription
Baselineoic.if.baselineIncludes all information about the resource, including metadata and collection information. This is the default interface type.
Linked Listoic.if.llIncludes only the collection information about the resource. This is the default interface type for /oic/res.
Batchoic.if.bAllows for the aggregation of interaction with all resources. Each resource is interacted with separately, but their responses are aggregated.
+ +

The following table lists other interface types that are related to permissions. These interfaces are relevant for retrieve and update requests.

+ +

Table: IoTivity interfaces for permissions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameInterfaceDescription
Readoic.if.rAllows values to be read.
Read Writeoic.if.rwAllows values to be read and written.
Actuatoroic.if.aAllows creating, updating, and retrieving actuator values.
Sensoroic.if.sAllows sensor values to be read.
+ + + +
+ + +Go to top + + + + + + diff --git a/iot/cover_page.htm b/iot/cover_page.htm new file mode 100644 index 0000000..3bde4ab --- /dev/null +++ b/iot/cover_page.htm @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + Tizen IoT + + + + + +
+
+ +
+ +

Tizen IoT

+ +

Tizen has been commercialized for smart TV, smart phone, smart watch, and smart home appliances with 3 profiles: TV, mobile, and wearable. Now, Tizen IoT has been released for any type of special-purpose IoT devices based on the Linux kernel.

+ +

Tizen IoT Preview 1 is the first preview release of Tizen for the development of IoT devices, which are connected easily and securely with legacy IoT ecosystems, such as SmartThings™. Tizen IoT Preview 1 consists of a platform image, a development environment, and a sample for getting started.

+ +
    +
  • Hardware targets +

    Raspberry Pi 3 and ARTIK 530 are supported as reference hardware.

  • +
  • Platform image +
      +
    • Headless +

      Platform image for headless-type IoT devices without a display. In Preview 1, Raspberry Pi 3 and ARTIK 530 can be used with the headless platform image.

    • +
    • Headed +

      Platform image for headed-type IoT devices with a display. In Preview 1, only ARTIK 530 can be used with the headed platform image.

    • +
    +
  • +
  • Development environment +
      +
    • IoT Setup Wizard +

      The IoT Setup Wizard is a computer application for easily setting up Tizen IoT on hardware targets. In Preview 1, flashing a platform image into an SD card for Raspberry Pi 3 and ARTIK 530 is only supported with the IoT Setup Wizard in a Linux computer environment.

    • +
    • Tizen Studio 2.0 for application development +

      Tizen Studio 2.0 is used as an IDE for developing IoT applications with the Tizen IoT Platform on Raspberry Pi 3 and ARTIK 530.

    • +
    • API +
        +
      • Things SDK for SmartThings™ +

        Using the Things SDK API for SmartThings™, you can create your IoT devices with the SmartThings Cloud. The Things SDK API enables you to integrate, control and monitor your IoT devices through the SmartThings Cloud with the Samsung Connect application.

      • +
      • Peripheral I/O +

        Using the Tizen Peripheral I/O Native API for IoT devices, you can control peripherals, such as sensors and actuators, using industry-standard protocols and interfaces.

      • +
      +
    • +
    • Craftroom +

      Craftroom is a new Web site (for staging and public release) for creating your own development community using a Tizen platform image. Craftroom can generate a new platform image by adding IoT applications made in the Tizen Studio. It provides a new functionality by combining Tizen packages, and allows you to create a new customized Tizen platform image for IoT devices in the next platform release.

    • +
    +
  • +
  • Samples +

    In Tizen IoT Preview 1, only the network audio sample application is supported. The number of online samples is set to extend in the future.

  • +
+ +

To get started with IoT application development, see Getting Started.

+ + + +
+ + +Go to top + + + + + + diff --git a/iot/css/snippet.css b/iot/css/snippet.css new file mode 100644 index 0000000..f880409 --- /dev/null +++ b/iot/css/snippet.css @@ -0,0 +1,52 @@ +/* Pretty printing styles. Used with prettify.js. */ + +/* SPAN elements with the classes below are added by prettyprint. */ +.pln { color: #000 } /* plain text */ + +@media screen { + .str { color: #793AFF } /* string content */ + .kwd { color: #7F0055 } /* a keyword */ + .com { color: green} /* a comment */ + .typ { color: #1C1C1C } /* a type name */ + .lit { color: black } /* a literal value */ + /* punctuation, lisp open bracket, lisp close bracket */ + .pun, .opn, .clo { color: #1C1C1C} + .tag { color: #008 } /* a markup tag name */ + .atn { color: #606 } /* a markup attribute name */ + .atv { color: #080 } /* a markup attribute value */ + .dec, .var { color: #606 } /* a declaration; a variable name */ + .fun { color: red } /* a function name */ +} + +/* Use higher contrast and text-weight for printable form. */ +@media print, projection { + .str { color: #060 } + .kwd { color: #006; font-weight: bold } + .com { color: #600; font-style: italic } + .typ { color: #404; font-weight: bold } + .lit { color: #044 } + .pun, .opn, .clo { color: #440 } + .tag { color: #006; font-weight: bold } + .atn { color: #404 } + .atv { color: #060 } +} + +/* Put a border around prettyprinted code snippets. */ +pre.prettyprint { overflow: auto; padding: 2px; border: 1px solid #888 } + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { margin-top: 0; margin-bottom: 0 } /* IE indents via margin-left */ +li.L0, +li.L1, +li.L2, +li.L3, +li.L5, +li.L6, +li.L7, +li.L8 { list-style-type: none } +/* Alternate shading for lines */ +li.L1, +li.L3, +li.L5, +li.L7, +li.L9 { background: #eee } diff --git a/iot/css/styles.css b/iot/css/styles.css new file mode 100644 index 0000000..9ed4f63 --- /dev/null +++ b/iot/css/styles.css @@ -0,0 +1,300 @@ +@charset "utf-8"; + +body { + background: white; + color: #1C1C1C; + margin-right: 20px; + margin-left: 20px; + font-size: 9pt; + font-weight: normal; + font-family: Arial, Helvetica, sans-serif; +} + +h1, h2, h3, h4, h5, h6, p, table, td, caption, th, ol, dl, dd, footer { + font-family: Arial, Verdana, Helvetica, sans-serif + } + +/* Set default font to 9 pt */ +table, div, p, dl, td, caption, th, ul, ol, li, dd, pre, code { + font-size: 9pt; +} + +pre, code { + font-family: "Courier New", Courier, monospace; + margin: 6px 1.5px; + padding: 1px 1px 1px 1px; + font-weight: normal; + font-style: normal; +} + +h1 {font-size: 24pt; color: #0E437D;} +h2 {font-size: 18pt; color: #0E437D;} +h3 {font-size: 14pt; color: #1C1C1C;} +h4 {font-size: 12pt; color: #1C1C1C;} +h5 {font-size: 10pt; color: #1C1C1C;} + +h1, h2, h3, h4, h5 { + font-weight: bold; + font-style: normal; + line-height: normal; + margin-top: 16pt; +} + +caption { + font-size: 9pt; + color: #1C1C1C; + font-weight: bold; + text-align: left; + margin-top: 20px; + margin-bottom: 0px; +} + +ol { + margin-bottom: 20px; +} + +ul ul , ol ul, ul ol, ol ol{ + margin-top: 10px; +} + +ul li, ol li { + margin-bottom: 10px; +} + +ol li p, ul li p { + font-size: 9pt; + font-weight: normal; + margin-bottom: 2px; + margin-top: 2px; +} + +ol ol { + font-size: 9pt; + font-weight: normal; + list-style-type: lower-alpha; + color: #1C1C1C; + border-style: none; + margin-top: 10px; +} + +ol ol li, ol ul li { + border-style: none; + margin-top: 5px; + font-size: 9pt; +} + +ul { + font-size: 9pt; + font-weight: normal; + color: #1C1C1C; +} + + +/* End of font face declarations */ + +/* Set table borders and heading row background */ +table { + border: 0px; + border-collapse: collapse; + width: 100%; + margin-top: 20px; + margin-bottom: 20px; + background: white; +} + +th { + border-top: 2px solid #719cc7; + border-right: 1px solid #c6d9f1; + border-left: 1px solid #c6d9f1; + background-color: #f3f7fb; + padding: 4px; + color: #719cc7; + font-size: 9pt; + font-weight: bold; +} + +td { + border: 1px solid #c6d9f1; + vertical-align:top; + padding: 3px 20px 5px 20px; + } + +/* Notes stand out using a light top & bottom borders with yellow background */ + +div.note { + background-color: #eeece1; + border: medium none; + color: #1c1c1c; + margin-bottom: 12px; + margin-top: 12px; + padding: 5px; +} + +div.note > strong:first-child { + background-color: #ddd9c3; + border-bottom: 1px solid #719cc7; + border-right: medium none; + border-top: 2px solid #719cc7; + text-align: left; + color: #719cc7; + font-size: 9pt; + font-weight: bold; + margin: -4px -4px 4px -4px; + padding: 4px 0px 4px 4px; + display: block; + width: auto; +} + +div.note * strong:after { + content: "\a "; + white-space: pre-line; +} + + +#toc-navigation {width: 20%; position: fixed; right: 17px; top: 0; bottom: 51px; /* overflow: auto; *//* min-width: 200px; *//* background: white; */z-index: 100;padding-top: 10px;/* padding-bottom: 88px; */margin-bottom: 89px;} +#toc {padding: 0px 20px 5px 20px; /* border: 2px solid #567a9c; */ border-radius: 15px;position: absolute;top: 78px;bottom: 9px;overflow: auto;/* margin-bottom: 5px; */padding-bottom: 5px;border-bottom: 3px transparent solid;margin-left: 5px;} +#main {width: 75%; height: 90%;} +#container {width:100%;} +#container #contents {padding:0px 0 20px; overflow: auto;position: fixed;top: 0;bottom: 0;margin-bottom: 64px;right: 200px;left: 20px;} +body.no-toc #container #contents {right: 0;padding-right:30px;} +body.no-toc #toc-navigation {width: auto;} +body.no-toc .top {right: 19px; /* float:none; */ width: 28px;} +body.no-toc #profile {float: right;right: -32px;} +body.no-toc #profile p {padding: 0; margin: 0;} +#container #contents:after {content: "."; display: block; height: 20px; clear: both; visibility: hidden;} + #container #contents>.content {/* width:75%; */min-width: 600px;/* right: 300px; *//* position: fixed; */padding-right: 5px;} + #container #contents>.content>.cont { margin-bottom:80px; padding-bottom:80px; } + +.devicespecs-util {float:right; margin-top:25px;} + .devicespecs-util ul.dutil {margin:0; padding-bottom:0; height: 11px; list-style-type:none;} + .devicespecs-util ul.dutil:after {content: "."; display: block; height: 0px; clear: both; visibility: hidden;} + .devicespecs-util ul.dutil li {float:left; margin-right:8px; padding-right:8px; background:url('../images/bg_util_bar.gif') no-repeat right center; color:#666;} + .devicespecs-util ul.dutil li.none {margin-right:0; padding-right:0; background-image:none;} + .devicespecs-util ul.dutil li a { font-size:11px; color:#666; line-height: 11px;} + .devicespecs-util ul.dutil li a:hover { color:#222; } + .devicespecs-util ul.dutil li a:active { color:#222; } + +ul.devicespecifications {clear:both; width:100%; margin:0; padding: 0;} +ul.devicespecifications > li { width:100%; margin-top:0; padding-left:0; list-style-type:none; border:1px solid #799cd3; padding: 5px 0px 5px 0px;} +ul.devicespecifications li div.devicespec-con {width:90%; margin:10px 0 20px 0; padding:0 14px; font-size: 13px;} +ul.devicespecifications li div.devicespec-tit {/*height:22px;*/ padding-right: 71px; background-color:#ffffff; position: relative;} + ul.devicespecifications li div.devicespec-tit .items-tit { /*float:left;*/ margin:0 0 0 14px; padding:0; color:#567a9c; line-height: 22px; font-size: 14px; font-style:normal; font-weight: bold;} + + ul.devicespecifications li div.devicespec-tit .items-tit-h2 { /*float:left;*/ margin: 0px 0px 0px 14px; padding:0; line-height: 22px; font-size: 18pt; color: #0E437D; font-style:normal; font-weight: bold;} + ul.devicespecifications li div.devicespec-tit .items-tit-h3 { /*float:left;*/ margin:0 0 0 14px; padding:0; line-height: 22px; font-size: 14pt; color: #1C1C1C; font-style:normal; font-weight: bold;} + ul.devicespecifications li div.devicespec-tit .items-tit-h4 { /*float:left;*/ margin:0 0 0 14px; padding:0; line-height: 22px; font-size: 12pt; color: #1C1C1C; font-style:normal; font-weight: bold;} + + ul.devicespecifications li div.devicespec-tit > span {position: absolute; top: 0; right:0;background:#416cbb; display:block; height:22px; margin-right:0; border-left: solid 1px #7a9bd4; } + ul.devicespecifications li div.devicespec-tit > span a.bt-arr {display:block; width: 55px; height:15px; margin-left:0; padding-top:5px; padding-left: 14px; text-align:left; background: url('../images/ico_arr_hidden.gif') 46px 9px no-repeat;} + ul.devicespecifications li div.devicespec-tit > span a.bt-arr em {display:inline-block; height: 14px; line-height:11px; font-size:11px; color:#fff; font-style:normal; margin-right: 8px;} + ul.devicespecifications li div.devicespec-tit > span * {vertical-align:middle;} + + ul.devicespecifications li div.devicespec-con ul.con-list { width:100%; } + ul.devicespecifications li div.devicespec-con ul.con-list li {line-height: 18px; margin:0; padding:0 0 0 7px; background: url("../images/ico_bullet_2_7.gif") 0 8px no-repeat; } + + +.top {text-align: right;} +.toc, ul.toc{ + margin: 10px 0px 0px 0px; + padding-left: 13px; + list-style: disc; + font-size: 9pt; + line-height: 115%; + } + +.toc-title { + font-size: 12pt; + color: #0E437D; + font-weight: bold; + font-style: normal; + line-height: normal; + margin-top: 16pt; +} + +a.top { + display:block; + float: right; + position:fixed; + width: 28px; + height:89px; + bottom:50px; + z-index: 101; + right: 19%; + } + +a img {border: 0;} + +/* Footer includes space and a gray line above */ +#footer { + position: fixed; + /* width: 100%; */ + bottom: 0px; + text-align: center; + border-top: 1px solid #CCCCCC; + background-color: #FFFFFF; + left: 21px; right: 21px; +} + +.footer {font-size: 8pt;} + +p.Table { + text-align: center; + margin-top: 40px; + margin-bottom: -19px; + padding: 0; +} + +p.Table strong { + font-family: Arial, Verdana, Helvetica, sans-serif; + font-size: 9pt; + color: #1C1C1C; + font-weight: bold; +} + +caption { + font-size: 9pt; + color: #1C1C1C; + font-weight: bold; + text-align: center; + margin-top: 20px; + margin-bottom: 0px; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memitem { + padding: 0; +} + +/* @end */ + +.highlight { + background-color:#E2E2FF; +} + +/* //Layout fixing */ + +div#profile { + position: relative; +} +#profile p { + text-align: right; +} + +div#toc_border { + border: 2px solid rgb(86, 122, 156); border-top-left-radius: 15px; border-top-right-radius: 15px; border-bottom-right-radius: 15px; border-bottom-left-radius: 15px; height: 565px; +} + +#contents li { + padding-top: 3px; + margin-top: 5px; + /* overflow: auto; */ +} + +p { + /* overflow: auto; */ +} diff --git a/iot/getting_started/cloud_app_test.htm b/iot/getting_started/cloud_app_test.htm new file mode 100644 index 0000000..5450035 --- /dev/null +++ b/iot/getting_started/cloud_app_test.htm @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + Testing with Samsung Connect + + + + + +
+
+ +
+ + +

Testing with Samsung Connect

+ +

To test your application with a Samsung Galaxy S8 phone using the Samsung Connect application:

+ +
    +
  1. Copy the following files into the phone: + +
  2. +
  3. Long-press the Samsung Connect icon and select App Info > Settings (3 dots at the top right) > Uninstall updates.
  4. +
  5. Go to My Files and install QuickConnect-appstore_miniApi_23-debug.apk.
  6. +
  7. Launch the Samsung Connect application.
  8. +
  9. In the Dashboard, select Settings (3 dots at the top right) > Settings and long-press About Samsung Connect.
  10. +
  11. In the Server Control section, change STG for the IoT server, Metadata server, and Plugin server.
  12. +
  13. Go to Debug more and enable Plugin developer mode.
  14. +
  15. Return to the main view, and save and restart the application.
  16. +
+ + + + + +
+ +Go to top + + + + + + \ No newline at end of file diff --git a/iot/getting_started/getting_started_cover.htm b/iot/getting_started/getting_started_cover.htm new file mode 100644 index 0000000..927587c --- /dev/null +++ b/iot/getting_started/getting_started_cover.htm @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + Getting Started + + + + + +
+
+ +
+ + +

Getting Started

+ +

To get started with developing your own Tizen IoT applications:

+ +
    +
  1. Install the Tizen Studio.
  2. +
  3. Flash a Tizen image.
  4. +
  5. Develop an application.
  6. +
  7. Set up the SmartThings Cloud.
  8. +
  9. Test the application with the Samsung Connect application.
  10. +
+ + + + +
+ +Go to top + + + + + + diff --git a/iot/getting_started/things_app_development.htm b/iot/getting_started/things_app_development.htm new file mode 100644 index 0000000..4d3fe47 --- /dev/null +++ b/iot/getting_started/things_app_development.htm @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + Developing Applications with the Things SDK API + + + + + +
+
+ +
+ +

Developing Applications with the Things SDK API

+ +

To create a new application project using the Things SDK API:

+ +
    +
  1. In the Tizen Studio, select File > New > Tizen Project.
  2. +
  3. Select Template, click Next, select Custom > Iot-headless v4.0, and click Next. +

    New Tizen Project New Tizen Project

    +
  4. +
  5. Select Native Application, click Next, select the IoT template, and click Finish. +

    Select native project Select a project template

    +
  6. +
  7. Add the source code files: +
      +
    1. Download the source code from https://github.sec.samsung.net/RS7-TizenIoTService/org.tizen.st-things.
    2. +
    3. Delete the src/headlessthingsapp.c and inc/headlessthingsapp.h files from the Tizen Studio application template.
    4. +
    5. Copy all .c files in the src directory of the GitHub source (org.tizen.st-things/src) into the src directory of the Tizen Studio application template (workspace/Headlessthingsapp/src).
    6. +
    7. Copy all .h files in the src directory of the GitHub source (org.tizen.st-things/src) into the inc directory of the Tizen Studio application template (workspace/Headlessthingsapp/inc).
    8. +
    +

    The following .c files end up in the src directory:

    +
    • main.c
    • +
    • thing.c
    • +
    • user.c
    • +
    +

    The following .h files end up in the inc directory:

    +
      +
    • log.h
    • +
    • st_things_types.h
    • +
    • st_things.h
    • +
    • thing.h
    • +
    • user.h
    • +
  8. +
  9. Connect the ARTIK 530 or Raspberry Pi 3 board to the Linux computer with USB and switch on sdb. +

    For more information, see http://suprem.sec.samsung.net/confluence/display/SPT/%5B1%5D+Tizen+Image+Download+and+Flash.

  10. +
  11. Right-click the project in the Tizen Studio and select Run As > Tizen Native Project. +

    New Tizen Project

  12. +
+ +
+Note +For the ARTIK 530 board, you must enter the correct system time with the date MMDDHHNNYYYY command. The timestamp syntax is as follows: +
    +
  • MM: Month
  • +
  • DD: Day
  • +
  • HH: Hour (24h)
  • +
  • NN: Minutes
  • +
  • YYYY: Year
  • +
+ +

For example:

+ +
+# date 092719582017
+Wed Sep 27 19:58:00 UTC 2017
+
+
+ + + +
+ +Go to top + + + + + + diff --git a/iot/getting_started/things_cloud_setup.htm b/iot/getting_started/things_cloud_setup.htm new file mode 100644 index 0000000..fc5dde0 --- /dev/null +++ b/iot/getting_started/things_cloud_setup.htm @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + Setting up the SmartThings Cloud + + + + + + +
+ + +
+ +
+ +

Setting up the SmartThings Cloud

+ +

To develop applications that integrate with the SmartThings Cloud, you must retrieve your MN_ID and generate cloud certificates.

+ + +

Retrieving the MN_ID

+

To retrieve your MN_ID:

+
    +
  1. Go to http://s-smartthings.developer.samsung.com/.
  2. +
  3. Log in with your Samsung Account.
  4. +
  5. Locate the MN_ID in the My Page section.
  6. +
+ + +

Generating Cloud Certificates

+ +

SmartThings™ uses OpenSSL for security. To begin development, you need to get certificates for both plugins (PPK) and devices. For instructions on installing OpenSSL, see the OpenSSL documentation.

+ +

To generate SmartThings Cloud certificates:

+
    +
  1. Go to http://s-devworkspace.developer.samsung.com.
  2. +
  3. Log in with your Samsung Account.
  4. +
  5. Go to http://s-devworkspace.developer.samsung.com/smartthingsconsole/iotweb/site/index.html#/commontools/signingrequest/device and fill out the form.
  6. +
  7. Generate SSL certificates: +
      +
    1. Set up your server and update your WHOIS record to show your correct details, such as company name and address.
    2. +
    3. Generate the Certificate Signing Request (CSR) on your server (for plugins and devices).
    4. +
    5. Submit the CSR and other info to a Certificate Authority.
    6. +
    7. Have your domain and company validated.
    8. +
    9. Receive and install the issued certificate.
    10. +
  8. +
+ +

PPK CSR Example

+ +

To request an author key:

+
    +
  1. Generate a private key: +
    +openssl genrsa -out {key_name.key} 2048
    +
    +
  2. +
  3. Make the Certificate Signing Request: +
    +openssl req -new -out {csr_name.csr} -key {key_name.key} -sha256
    +
    +
  4. +
  5. Enter the requested information: +
    +Country Name <2 letter code> [AU] :
    +State or Province Name <full name> :
    +Locality Name <e.g. city> [] :
    +Organization Name <e.g. company> [Internet Widgits Pty Ltd] :
    +Organizational Unit Name <e.g. section> [] :
    +Common Name <e.g. Your name> [] :
    +Email Address [] :
    +Enter the following extra attributes with your certificate request:
    +A challenge password [] :
    +An optional company name [] :
    +
    +
  6. +
  7. Open the created csr_name.csr file, which contains the certificated request in an encoded format: +
    +-----BEGIN CERTIFICATE REQUEST-----
    +MIIBTjC...
    +-----END CERTIFICATE REQUEST-----
    +
    +

    Enter the corresponding value in the IoT console to request an author key.

    +
  8. +
+ +

To request a distributor key:

+
    +
  1. Generate a private key: +
    +openssl genrsa -out {key_name.key} 2048
    +
    +
  2. +
  3. Copy and modify the openssl.cnf file: +
      +
    1. Copy the existing openssl.cnf file to a new file named config_name.cnf.
    2. +
    3. Locate and uncomment the req_extensions = v3_req line (by removing the # from the beginning of the line).
    4. +
    5. Find v3_req and enter a new line with subjectAltName = URI: URN: ppk: mnid = {mnid} below the keyUsage line.
    6. +
    +
  4. +
  5. Make the Certificate Signing Request: +
    +openssl req -new -out {csr_name.csr} -key {key_name.key} -config {config_name.cnf} -sha256
    +
    +
  6. +
  7. Enter the requested information: +
    +Country Name <2 letter code> [AU] :
    +State or Province Name <full name> :
    +Locality Name <e.g. city> [] :
    +Organization Name <e.g. company> [Internet Widgets Pty Ltd] :
    +Organizational Unit Name <e.g. section> [] :
    +Common Name <e.g. Your name> [] :
    +Email Address [] :
    +Enter the following extra attributes with your certificate request:
    +A challenge password [] :
    +An optional company name [] :
    +
    +
  8. +
  9. Open the created csr_name.csr file, which contains the certificated request in an encoded format: +
    +-----BEGIN CERTIFICATE REQUEST-----
    +MIIBTjC...
    +-----END CERTIFICATE REQUEST-----
    +
    +

    Enter the corresponding value in the IoT console to request a distributor key.

    +
  10. +
+ +

Device CSR Example

+ +

To request an authentication key:

+ +
    +
  1. Generate a private key: +
    +openssl ecparam -genkey -name prime256v1 -out {keyFileName.pem}
    +
    +
  2. +
  3. Encrypt the private key: +
    +openssl ec -aes256 -passout pass:{Your Password} -in {keyFileName.pem} -out {securedKeyFileName.pem}
    +
    +
  4. +
  5. Make the Certificate Signing Request: +
    +openssl req -new -sha256 -key {securedKeyFileName.pem} -out {testDevice.csr}
    +
    +
  6. +
  7. Enter the requested information: +
    +Enter Pass Phrase for new_key.pem : {Password}
    +Country Name <2 letter code> [AU] :
    +State or Province Name <full name> :
    +Locality Name <e.g. city> [] :
    +Organization Name <e.g. company> [Internet Widgets Pty Ltd] :
    +Common Name <e.g. server FQDN or Your name> [] :
    +Email Address [] :
    +Enter the following extra attributes with your certificate request:
    +A challenge password [] :
    +An optional company name [] :
    +
    +
  8. +
  9. Open the created testDevice.csr file, which contains the certificated request in an encoded format: +
    +-----BEGIN CERTIFICATE REQUEST-----
    +MIIBTjC...
    +-----END CERTIFICATE REQUEST-----
    +
    +

    Enter the corresponding value in the IoT console to request an authentication key.

    +
  10. +
  11. The result of your request is the certificate in an encoded format: +
    +-----BEGIN CERTIFICATE-----
    +MIIC ...  KzmZzKg==
    +-----END CERTIFICATE-----
    +
    +

    Save the encoded certificate into a new file in a text editor and inject the file to the device. For more information on device injection, see http://suprem.sec.samsung.net/#_msocom_2[IK2].

    +
  12. +
+ +
+Note +
    +
  • Do not input the private key in the CSR Request form in the IoT console.
  • +
  • The password for your encrypted private key must be managed by an individual.
  • +
+
+ + + + +
+ +Go to top + + + + + + \ No newline at end of file diff --git a/iot/getting_started/tizen_image_download_flash.htm b/iot/getting_started/tizen_image_download_flash.htm new file mode 100644 index 0000000..ab28f93 --- /dev/null +++ b/iot/getting_started/tizen_image_download_flash.htm @@ -0,0 +1,679 @@ + + + + + + + + + + + + + + Flashing Tizen Images + + + + + + +
+ + +
+ +
+ +

Flashing Tizen Images

+ +

The IoT Setup Wizard is a Tizen Studio plugin that can be used to easily set up your IoT device for IoT application development. It offers a simple user interface, with which you can prepare an SD card with the latest image of the Tizen IoT operating system (or any older or customized Tizen image) with the click of a single button. When you insert the prepared SD card into the corresponding IoT device, the device boots up automatically.

+ +

Installing the IoT Setup Wizard

+ +

To use the IoT Setup Wizard, you must have the Tizen Studio installed.

+ +

To install the IoT Setup Wizard:

+ +
    +
  1. Download the plugin. +

    Currently, the IoT Setup Wizard binary is offered as a JAR file at https://github.sec.samsung.net/RS7-DeviceManagement/iot-setup-wizard/releases.

    +
  2. +
  3. Add the plugin to the Tizen Studio: +
      +
    1. Open the Tizen Studio installation directory. On Linux, it is usually /home/<user>/tizen-studio, where <user> is your username on your computer.
    2. +
    3. Check whether the ide/dropins/ directory exists in the above installation directory. If not, create it.
    4. +
    5. Copy the downloaded JAR file into the ide/dropins/ directory.
    6. +
    + +
    + Note + When updating an existing version of the IoT Setup Wizard, remove the older version and replace it with the newer version. In addition, to avoid issues with the Eclipse plugin cache, remove the .metadata/ hidden directory from your Tizen Studio workspace directory and the ide/iotswiz/ directory in the Tizen Studio installation directory. +
    +
  4. +
  5. Access the IoT Setup Wizard in the Tizen Studio menu by going to Windows > Show View > Other. +

    IoT Setup Wizard menu path

    +
  6. +
  7. In the Show View window, select IoT > IoT Setup Wizard. +

    Show View window

    +
  8. +
+ + +

IoT Setup Wizard User Interface

+ +

The following figure illustrates the IoT Setup Wizard user interface.

+ +

Figure: IoT Setup Wizard

+

IoT Setup Wizard

+ +

The main UI components are:

+ +
    +
  • Select Device +

    In the drop-down menu, you can select the IoT device for which you want to prepare the SD card. The IoT Setup Wizard uses this information to select the appropriate version of the Tizen IoT operating system and to properly partition the SD card (in the case of a fresh install). The options are:

    +
      +
    • Samsung Artik 530 (Headless)
    • +
    • Samsung Artik 530 (Headed)
    • +
    • Raspberry Pi 3 (Headless)
    • +
    + +

    Selecting a headless option installs a version of the operating system which does not support an external display. With a headed version, you can connect a screen to the device using, for example, HDMI.

    +
  • +
  • Select Flash Type +

    In the drop-down menu, you can select how you want to prepare the SD card. The options are:

    +
      +
    • Fresh Install +

      This option prepares your SD card from scratch. It formats and partitions the SD card, and installs both the bootloader image and the Tizen platform Image. This option is to be used when you have a new SD card and want to install Tizen IoT on it.

    • +
    • Flash Kernel and Bootloader +

      This option can used only when the SD card is already partitioned and contains an existing Tizen IoT installation. This option only updates the partitions containing the kernel and bootloader.

    • +
    • Flash Platform Image +

      This option can used only when the SD card is already partitioned and contains an existing Tizen IoT installation. This option only updates the partitions containing the Tizen platform files.

    • +
    +
  • +
  • Select SD Card Location +

    In the drop-down menu, you can select the location of your SD card. Any removable drives present in your system are automatically detected by the IoT Setup Wizard and displayed. SD cards are also dynamically detected and updated as you insert and remove them.

    + +
    + Note + If an SD card is not displayed even after inserting it into the system, close the IoT Setup Wizard and open it again. +
    +
  • +
  • Flash custom images from local storage +

    If this check box is selected, the IoT Setup Wizard flashes user-provided image files from local storage instead of the default images provided with the tool. When the check box is selected, the text fields below it are enabled, allowing you to enter the file paths for your custom platform and kernel images.

    + +
    + Note + Make sure to select an image that corresponds to the device type. When selecting custom images, if the flash type is set to Fresh Install, you must to enter both the platform and kernel image paths. Otherwise you only need to enter the value corresponding to the flash type selected, a kernel image for the Flash Kernel and Bootloader option and a platform image for the Flash Platform Image option. +
    + +

    Flash custom images checkbox

    +
  • +
  • Flash +

    Click this button to flash the SD card. The button is inactive if complete information for flashing is not provided, for example:

    +
      +
    • An SD card is not inserted.
    • +
    • The Flash custom images from local storage checkbox is selected along with the Fresh Install flash type, and at least 1 of the image paths is empty.
    • +
    • The Flash custom images from local storage checkbox is selected along with the Flash Kernel and Bootloader flash type, and the kernel image path is empty.
    • +
    • The Flash custom images from local storage checkbox is selected along with the Flash Platform Image flash type, and the platform image path is empty.
    • +
    +
  • +
  • Progress and status bars +

    The progress bar displays the current progress of the flashing operation. The status bar displays information about the current operation.

    +
  • +
+ + +

Flashing an SD Card with the Wizard

+ +

To flash your SD card with the IoT Setup Wizard:

+ +
    +
  1. Insert your SD card into the computer.
  2. +
  3. In Tizen IoT Setup Wizard, select the device, flash type (the Flesh Install type is selected by default), and the SD card location.
  4. +
  5. If you want to use your own image files instead of the default images, check the Flash custom images from local storage check box and enter the file paths to the custom image files.
  6. +
  7. Click Flash.
  8. +
  9. Enter the password for your user account when prompted (sudo permissions are required to format and partition SD cards).
  10. +
+ +

The IoT Setup Wizard takes about a minute to prepare your SD card, and once finished, displays the "Done" message in the status bar.

+ +

Figure: Flashing an SD card

+

Flashing an SD card SD card flashing complete

+ + +

Setting up the Board and Driver

+ +

Once you have flashed your SD card, you can set up the development board.

+ +

ARTIK 530

+ +

To set up an ARTIK 530 Smart IoT Module:

+ +
    +
  1. Connect the board and boot it up: +
      +
    1. Insert the micro SD card into the card slot (marked with a blue arrow) and connect the 5V DC power supply to the board (the red arrow). +

      ARTIK 530 power and micro SD slots

    2. +
    3. Connect a USB serial cable (marked with a yellow box) and a separate USB OTG cable (the red box) to your Linux computer. +

      ARTIK 530 USB serial and OTG connectors

    4. +
    5. To be able to boot from the SD card, set the DIP switch on the board as shown in the following figure. +

      ARTIK 530 DIP switch

    6. +
    7. Boot the board by switching on the power switch (marked with a red box) on and pressing the power button (the yellow box). +
      + Note + Make sure that the OM pins are set in the proper configuration to enable booting from the SD card. +
      +

      ARTIK 530 power switch

    8. +
    9. Launch 2 shells in your Linux computer: 1 for serial communication ("serial shell") and 1 for flashing the binaries ("Linux shell"). In the first shell, run a serial communication application to communicate with the board: +
      +$ sudo minicom -c on
      +
      +
    10. +
    +
  2. +
  3. Open the SDB connection in the "serial shell": +
      +
    1. Reboot the board and log in with root/tizen: +
      +localhost login: root
      +Password: tizen
      +Welcome to Tizen
      +
      +
    2. +
    3. Enter the following commands: +
      +root@localhost:~# mount -o remount rw /
      +root@localhost:~# sdb-mode.sh --on
      +
      +
    4. +
    +
    + Note + Repeat this step whenever you power-cycle the device, in order to reconnect the sdb tool. +
    +
  4. +
  5. Install connectivity drivers: +
      +
    1. Download the artik530-driver_v3.tar.gz package and unzip it.
    2. +
    3. Run install.sh in the "Linux shell": +
      +$ tar -zxvf artik530-driver_v1.tar.gz
      +install.sh
      +connectivity/
      +connectivity/bluetooth-firmware-marvell-artik530-0.1.0-1.armv7l.rpm
      +connectivity/wlandrv-plugin-marvell89xx-1.0.0-8.armv7l.rpm
      +$ ./install.sh
      +
      +
    4. +
    +
  6. +
+ + +

Raspberry Pi 3

+ +

To set up a Raspberry Pi 3 board:

+ +
    +
  1. Install the firmware for Wi-Fi and Bluetooth: +
      +
    1. Insert an SD card into your computer and check its device node (for example, sdX where X is a letter). +
      + Note + To check the device node: +
        +
      1. Before inserting the SD card into the Linux computer, give the following command: +
        +$ ls -al /dev/sd*
        +
        +

        For example:

        +
        +$ ls -al /dev/sd*
        +brw-rw---- 1 root disk 8, 0  9 18 09:08 /dev/sda
        +brw-rw---- 1 root disk 8, 1  9 18 09:08 /dev/sda1
        +brw-rw---- 1 root disk 8, 2  9 18 09:08 /dev/sda2
        +brw-rw---- 1 root disk 8, 5  9 18 09:08 /dev/sda5
        +
        +
      2. +
      3. Insert the SD card, and enter the same command again: +
        +$ ls -al /dev/sd*
        +
        +

        For example:

        +
        +$ ls -al /dev/sd*
        +brw-rw---- 1 root disk 8,  0  9 18 09:08 /dev/sda
        +brw-rw---- 1 root disk 8,  1  9 18 09:08 /dev/sda1
        +brw-rw---- 1 root disk 8,  2  9 18 09:08 /dev/sda2
        +brw-rw---- 1 root disk 8,  5  9 18 09:08 /dev/sda5
        +brw-rw---- 1 root disk 8, 16  9 22 14:59 /dev/sdb
        +brw-rw---- 1 root disk 8, 17  9 22 14:59 /dev/sdb1
        +brw-rw---- 1 root disk 8, 18  9 22 14:59 /dev/sdb2
        +brw-rw---- 1 root disk 8, 19  9 22 14:59 /dev/sdb3
        +brw-rw---- 1 root disk 8, 20  9 22 14:59 /dev/sdb4
        +brw-rw---- 1 root disk 8, 21  9 22 14:59 /dev/sdb5
        +brw-rw---- 1 root disk 8, 22  9 22 14:59 /dev/sdb6
        +brw-rw---- 1 root disk 8, 23  9 22 14:59 /dev/sdb7
        +
        +

        The new sdX node is the device node for the SD card.

        +

        In this example, the device node for the SD card is sdb.

        +
      4. +
      +
      +
    2. +
    3. Download the firmware for Wi-Fi and Bluetooth: +
      +$ wget https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm80211/brcm/brcmfmac43430-sdio.bin
      +$ wget https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm80211/brcm/brcmfmac43430-sdio.txt
      +$ wget https://github.com/OpenELEC/misc-firmware/raw/master/firmware/brcm/BCM43430A1.hcd
      +
      +
    4. +
    5. Copy the firmware to the SD card: +
      +$ mkdir rootfs
      +$ sudo mount /dev/sdb2 rootfs
      +$ sudo mkdir -p rootfs/usr/etc/bluetooth
      +$ sudo cp BCM43430A1.hcd rootfs/usr/etc/bluetooth
      +$ sudo mkdir -p rootfs/usr/lib/firmware/brcm
      +$ sudo cp brcmfmac43430-sdio.* rootfs/usr/lib/firmware/brcm
      +$ sync
      +$ sudo umount rootfs
      +
      +
    6. +
    +
  2. +
  3. Set up the board connection with a UART-to-USB dongle, such as the PL2303 or FT232 USB UART Board. +

    For the PL2303, connect the Raspberry Pi TXD0 pin (pin 8) to RXD on the UART board, RXD0 (pin 10) to TXD on the UART board, and the ground (pin 6) to GND on the UART board, and set the jumper switch to 3.3V.

    +

    Raspberry Pi GPIO pins

    +
  4. +
+ + +

Flashing an SD Card With the Command Line

+ +

You can flash the SD card through the command line.

+ +

ARTIK 530

+ +

To flash the SD card for ARTIK 530:

+ +
    +
  1. Fill the following prerequisites: + +
  2. +
  3. Set up the board connections: +
      +
    1. Connect the 5V DC power supply to the board (marked with a red arrow): +

      ARTIK 530 power and micro SD slots

    2. +
    3. Connect a USB serial cable (marked with a yellow box) and a separate USB OTG cable (the red box) to your Linux computer: +

      ARTIK 530 USB serial and OTG connectors

    4. +
    5. Switch on the power switch (marked with a red box) and press the power button (the yellow box). +

      ARTIK 530 power switch

    6. +
    7. Launch 2 shells in your Linux computer: 1 for serial communication ("Minicom shell") and 1 for flashing the binaries ("Linux shell"). In the first shell, run a serial communication application to communicate with the board: +
      +$ sudo minicom -c on
      +
      +
    8. +
    +
  4. +
  5. Enter the bootloader mode by resetting the board and pressing Enter in the "Minicom shell" to stop the boot process: +
    +Board: ARTIK530 Raptor
    +DRAM:  512 MiB
    +HW Revision:    4
    +MMC:   NEXELL DWMMC: 0, NEXELL DWMMC: 1
    +In:    serial
    +Out:   serial
    +Err:   serial
    +LCD#1:0x4, LCD#2:0x4, CAM#1:0x4, CAM#2:0x4
    +ADD-ON-BOARD : 0xFFFF
    +Net:
    +Warning: ethernet@c0060000 (eth0) using random MAC address - xx:xx:xx:xx:xx
    +eth0: ethernet@c0060000
    +Hit any key to stop autoboot:  0 <Enter key>
    +artik530#
    +
    +
  6. +
  7. Flash the boot image: +
      +
    1. Download the following tar.gz file: flash_boot_v1.tar.gz
    2. +
    3. Unzip the flash_boot_v1.tar.gz file to find the flash_boot.sh file and the bootimage directory.
    4. +
    5. In the "Minicom shell", enter fastboot 0: +
      +artik530# fastboot 0
      +
      +
    6. +
    7. In the "Linux shell", run flash_boot.sh: +
      +$ ./flash_boot.sh
      +
      +
    8. +
    9. Reboot the board and enter the bootloader mode again.
    10. +
    11. In the "Minicom shell", enter thotdown 0 mmc 0: +
      +artik530# thordown 0 mmc 0
      +
      +
    12. +
    13. In the "Linux shell", run lthor to flash the boot image (which you downloaded in step 1): +
      +$ lthor tizen-4.0-unified_YYYYMMDD.V_iot-boot-armv7l-artik520.tar.gz
      +
      +
    14. +
    +
  8. +
  9. Flash the platform image: +
      +
    1. Reboot the board and enter the bootloader mode again.
    2. +
    3. In the "Minicom shell", enter thotdown 0 mmc 0: +
      +artik530# thordown 0 mmc 0
      +
      +
    4. +
    5. In the "Linux shell", run lthor to flash the platform image (which you downloaded in step 1): +
      +$ lthor tizen-4.0-unified_YYYYMMDD.V_iot-iot-headless-2parts-armv7l-artik520.tar.gz
      +
      +
    6. +
    +
  10. +
  11. Open the SDB connection in the "Minicom shell": +
      +
    1. Reboot the board and login with root/tizen: +
      +localhost login: root
      +Password: tizen
      +Welcome to Tizen
      +
      +
    2. +
    3. Enter the following commands: +
      +root@localhost:~# mount -o remount rw /
      +root@localhost:~# sdb-mode.sh --on
      +
      +
    4. +
    +
    + Note + Repeat this step whenever you power-cycle the device, in order to reconnect the sdb tool. +
    +
  12. +
  13. Install connectivity drivers: +
      +
    1. Download the artik530-driver_v3.tar.gz file as mentioned in step 1 and unzip it.
    2. +
    3. Run install.sh in the "Linux shell": +
      +$ tar -zxvf artik530-driver_v1.tar.gz
      +install.sh
      +connectivity/
      +connectivity/bluetooth-firmware-marvell-artik530-0.1.0-1.armv7l.rpm
      +connectivity/wlandrv-plugin-marvell89xx-1.0.0-8.armv7l.rpm
      +$ ./install.sh
      +
      +
    4. +
    +
  14. +
+ +

For more detailed information, see https://wiki.tizen.org/Booting_Tizen_From_eMMC_On_ARTIK530.

+ + +

Raspberry Pi 3

+ +

To flash the SD card for Raspberry Pi 3:

+ +
    +
  1. Fill the following prerequisites: +
      +
    1. Install the pv package in the Linux computer: +
      +$ sudo apt-get install pv
      +
      +
    2. +
    3. Make sure you have an SD card of 4 GB or more.
    4. +
    5. Download the following images, script, and firmware: + +
    6. +
    +
  2. +
  3. Flash the SD card to make it "Tizen ready": +
      +
    1. Insert an SD card to the Linux computer and check its device node. +
      + Note + To check the device node: +
        +
      1. Before inserting the SD card into the Linux computer, type the following command: +
        +$ ls -al /dev/sd*
        +
        +

        For example:

        +
        +$ ls -al /dev/sd*
        +brw-rw---- 1 root disk 8, 0  9 18 09:08 /dev/sda
        +brw-rw---- 1 root disk 8, 1  9 18 09:08 /dev/sda1
        +brw-rw---- 1 root disk 8, 2  9 18 09:08 /dev/sda2
        +brw-rw---- 1 root disk 8, 5  9 18 09:08 /dev/sda5
        +
        +
      2. +
      3. Insert the SD card, and type the same command again: +
        +$ ls -al /dev/sd*
        +
        +

        For example:

        +
        +$ ls -al /dev/sd*
        +brw-rw---- 1 root disk 8,  0  9 18 09:08 /dev/sda
        +brw-rw---- 1 root disk 8,  1  9 18 09:08 /dev/sda1
        +brw-rw---- 1 root disk 8,  2  9 18 09:08 /dev/sda2
        +brw-rw---- 1 root disk 8,  5  9 18 09:08 /dev/sda5
        +brw-rw---- 1 root disk 8, 16  9 22 14:59 /dev/sdb
        +brw-rw---- 1 root disk 8, 17  9 22 14:59 /dev/sdb1
        +brw-rw---- 1 root disk 8, 18  9 22 14:59 /dev/sdb2
        +brw-rw---- 1 root disk 8, 19  9 22 14:59 /dev/sdb3
        +brw-rw---- 1 root disk 8, 20  9 22 14:59 /dev/sdb4
        +brw-rw---- 1 root disk 8, 21  9 22 14:59 /dev/sdb5
        +brw-rw---- 1 root disk 8, 22  9 22 14:59 /dev/sdb6
        +brw-rw---- 1 root disk 8, 23  9 22 14:59 /dev/sdb7
        +
        +

        The new sdX node (where X is a letter) is the device node for the SD card.

        +

        In this example, the device node for the SD card is sdb.

        +
      4. +
      +
      +
    2. +
    3. Check the version of the image binaries, which appear as follows: +
      +$ ls *.tar.gz
      +tizen-4.0-unified_20170921.4_iot-boot-arm64-rpi3.tar.gz  tizen-4.0-unified_20170921.4_iot-headless-2parts-armv7l-rpi3.tar.gz
      +
      +

      The date and version information in the middle of the image name is the binary version.

      +
      +tizen-4.0-unified_20170921.4_iot-boot-arm64-rpi3.tar.gztizen-4.0-unified_20170921.4_iot-headless-2parts-armv7l-rpi3.tar.gz
      +
      +

      In this example, the binary version is 20170921.4

      +
    4. +
    5. Download and unzip the flash-sdcard-v3.tar.gz script file. This script and all other downloaded files must be in the same directory.
    6. +
    7. Run the flash-sdcard.sh script with the device node and binary version: +
      +$ sudo ./flash-sdcard.sh <SD card device node> %lt;binary version>
      +
      +

      For example:

      +
      +$ sudo ./flash-sdcard.sh sdb 20171018.1
      +
      +
    8. +
    +
  4. +
  5. Set up the Raspberry Pi 3 board: +
      +
    1. Insert the SD card to the Raspberry Pi.
    2. +
    3. Connect the host computer to the Pi with a UART-to-USB dongle, such as PL2303 or FT232 USB UART Board. +

      For the PL2303, connect the Raspberry Pi TXD0 pin (pin 8) to RXD on the UART board, RXD0 (pin 10) to TXD on the UART board, and the ground (pin 6) to GND on the UART board, and set the jumper switch to 3.3V.

      +

      Raspberry Pi GPIO pins

      +
    4. +
    5. Execute a terminal program, such as Minicom.
    6. +
    7. Connect power to the Pi.
    8. +
    9. Log in with root/tizen: +
      +...
      +
      +localhost login: root
      +Password: tizen
      +Welcome to Tizen
      +root@localhost:~#
      +
      +
    10. +
    +
  6. +
+ + +

Setting up Wi-Fi

+ +

You can set up a WiFi connection by running wifi_manager_test and entering the 1 > 3 > 9 > b > c options. If you set up the connection once, it reconnects automatically the next time you power-cycle the device.

+ +
+# wifi_manager_test
+Test Thread created...<Enter>
+Event received from stdin
+Network Connection API Test App
+Options..
+1   - Wi-Fi init and set callbacks
+2   - Wi-Fi deinit(unset callbacks automatically)
+3   - Activate Wi-Fi device
+4   - Deactivate Wi-Fi device
+5   - Is Wi-Fi activated?
+6   - Get connection state
+7   - Get MAC address
+8   - Get Wi-Fi interface name
+9   - Scan request
+a   - Get Connected AP
+b   - Get AP list
+c   - Connect
+d   - Disconnect
+e   - Connect by wps pbc
+f   - Forget an AP
+g   - Set & connect EAP
+h   - Set IP method type
+i   - Set Proxy method type
+j   - Get Ap info
+k   - Connect Specific AP
+l   - Load configuration
+m   - Save configuration
+n   - Remove configuration
+o   - TDLS Discover
+p   - TDLS Connect
+q   - TDLS Connected peer
+r   - TDLS Disconnect
+s   - Connect Hidden AP
+t   - Connect WPS PBC without SSID
+u   - Connect WPS PIN without SSID
+v   - Cancel WPS Request
+w   - Set Auto Scan Enable-Disable
+x   - Set Auto Scan Mode
+y   - Get wifi scanning state
+z   - Get Auto Scan Enable-Disable
+A   - Get Auto Scan Mode
+B   - Enable TDLS Channel Switch Request
+C   - Disable TDLS Channel Switch Request
+D   - Get Wi-Fi Module State
+E   - BSSID Scan
+F   - Add VSIE
+G   - Get VSIE
+H   - Remove VSIE
+I   - Start Multi Scan
+J   - Flush BSS
+K   - Set auto connect mode
+L   - Get auto connect mode
+0   - Exit
+ENTER  - Show options menu.......
+Operation succeeded!
+1
+Event received from stdin
+Wifi init succeeded
+Operation succeeded!
+3
+Event received from stdin
+Wi-Fi Activation Succeeded
+Operation succeeded!
+9
+Event received from stdin
+Interface name : wlan0
+Operation succeeded!
+b
+Event received from stdin
+AP name : crash_messaging, state : Disconnected
+AP name : dnet1, state : Disconnected
+... < list of APs> ...
+Get AP list finished
+Operation succeeded!
+Background Scan Completed, error code : NONE
+c
+Event received from stdin
+Input a part of AP name to connect : <AP name>
+Passphrase required : TRUE
+Input passphrase for dnet1 : <Password>
+
+ + + + +
+ + +Go to top + + + + + + diff --git a/iot/getting_started/tizen_studio_install.htm b/iot/getting_started/tizen_studio_install.htm new file mode 100644 index 0000000..71d2ba3 --- /dev/null +++ b/iot/getting_started/tizen_studio_install.htm @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + Installing Tizen Studio + + + + + +
+
+ +
+ +

Installing Tizen Studio

+ +

To install the Tizen Studio and the required profiles for IoT development:

+ +
    +
  1. Download the correct version of Tizen Studio 2.0 for your operating system from https://developer.tizen.org/ and install it.
  2. +
  3. Open the Tizen Studio Package Manager, select the Main SDK tab, and install the 4.0 Mobile profile: +

    Install the mobile profile

    +
  4. +
  5. Select the Extension SDK tab and install the IOT-Headless-4.0 profile: +

    Install the headless profile

    +
  6. +
+ + + +
+ + +Go to top + + + + + + diff --git a/iot/images/Thumbs.db b/iot/images/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..5725b567183290f56abd68f1bc623752e65146bb GIT binary patch literal 188928 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%0A14H;4yv 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

{6PV6x$#3uBru}|e{2{SPDmCBCNAlRx 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

JRZCfT(VyA(!w`MmGG< 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

Vvzv;*aK2}HheRvb^-Wo2c42w2l5x_Qp-Vu8 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