AWS IoT Device SDK for Ruby
Contents
Dependencies
Ruby gems:
- ruby >= 2.2
- mqtt >= 0.0.2
- json >= 2.0
- facets >= 3.1
- timers >= 4.1
- paho-mqtt >= 0.0.2
Overview
aws_iot_device
is a gem that enables a remote client to communicate with the AWS IoT platform. The AWS IoT platform allows to register a device as a thing
. The status of each thing
is stored in a json format, referred as the shadow
of a thing
. The SDK uses the MQTT protocol to control the thing
registered on the AWS IoT platform. The MQTT protocol is a lightweight protocol used to exchange short messages between a client and a message broker. The message broker is located on the AWS IoT platform, and the client is included in the aws_iot_device
gem, the default client is the paho-mqtt
. The paho-mqtt
client has a MQTT API and a callback system to handle the events trigger by the mqtt packages.
Installation
The gem is currentely in its first version, key features are available but any improvements is welcomed.
There are two ways to install the gem, from rubygems or directly from sources.
From RubyGems:
The gem may be find on RubyGems and installed with the following command:gem install aws_iot_device
From sources:
The gem could be download and installed manually:
git clone https://github.com/RubyDevInc/aws-iot-device-sdk-ruby.git
cd aws-iot-device-sdk-ruby
bundle install
Usage
Getting started
The following example is a strait-forward way for using shadows. Check at the samples files for more detailed usage.
require "aws_iot_device"
host = "AWS IoT endpoint"
port = 8883
thing = "Thing Name"
root_ca_path = "Path to your CA certificate"
private_key_path = "Path to your private key"
certificate_path = "Path to your certificate"
shadow_client = AwsIotDevice::MqttShadowClient::ShadowClient.new
shadow_client.configure_endpoint(host, port)
shadow_client.configure_credentials(root_ca_path, private_key_path, certificate_path)
shadow_client.create_shadow_handler_with_name(thing, true)
shadow_client.connect
shadow_client.get_shadow do ||
# Do what you want with the get_shadow's answer
# ...
p ":)"
end
sleep 2 #Timer to ensure that the answer is received
shadow_client.disconnect
Sample files
Once you have cloned the current repository the several samples files provide test on the API a multiple levels. The shadow examples could be run with the following command :
ruby samples/shadow_client_samples/samples_shadow_client_xxx.rb -c "CERTIFICATE PATH" -k "PRIVATE KEY PATH" -a "CA CERTIFICATE PATH" -H "AWS IOT ENDPOINT" -t "THING NAME"
API Description
Thank you very much for your interst in the aws_iot_device
gem. The following part details all the features available with the SDK.
Shadow Client
The shadow client API provide the key functions to control a thing/shadow on the Aws IoT platform. The methods contain in the API could be seperate in three differents roles, the configuration roles, the communication roles, and the treatements roles.
Configuration role
The Shadow client initializer would create the mqtt client used by the shadow client to communicate with the remote host. The parameters available on the initialization depend on the type of the chosen mqtt client. The default mqtt client type is the paho_client, the availables parameters are detailed in paho-mqtt
gem page.
The remote host(endpoint) and port could be configured with the following method:
shaadow_client.configure_endpoint(host, port)
The encryption configuration could be done with the following method:
shadow_client.configure_credentials(root_ca_path, private_key_path, certificate_path)
The thing where the client would connect is done by the following method. The persitent_subscribe attribute is a boolean that would prevent the client to unsubscribe to the mqtt topic after every action. As the susbcription require a short time, for performace issues it might usefull to keep subscribed (default is false
).
shadow_client.create_shadow_handler_with_name(thing, persistent_subscribe)
Finally, the connect method enable to send a connect request and (re)define some attributes threw a Hash
. The available parameter are :host
, :port
, :keep_alive
, :persitent
and :blocking
. :persistent
and :blocking
are detailed in the connection mode section
shadow_client.connect
Communication role
In the API there are three methods that directely act on the remote shadow. A timeout
define the time until which the request should be considered as a failure. The default timeout is five second. The get
and delete
do not accept a payload where a json format payload is mandatory for the update
action.
timeout = 2
shadow_client.get_shadow(timeout)
payload = "{\"state: \": \"desired\": ..... }"
shadow_client.update_shadow(payload)
shadow_client.delete_shadow
Callbacks
Callbacks are small piece of code that would be executed when the answer of one action is received by the client. The Shadow client API enables to register two kind of callbacks, a generic callback and single usage callback.
For generic action (get, update, delete), the callback would be executed on every answer of the dedicated generic action. Futhermore, another callback may be executed for a single answer of a dedicated action. The generic callback could be seen as re-usable callback functions when the single usage could be seen as disposable treatment.
Both kind of callbacks must be registered as a block
, a proc
or a lambda
. The followings lines provide an examples of the different callbacks usage.
# Register a callback for the get action as a block
shadow_client.register_get_callback do
puts "generic callback for get action"
end
# Register a callback for the delete action as a proc
shadow_client.register_delete_callback(proc { puts "generic callback for delete action"})
# Register a callback for the update action as a lambda
shadow_client.register_update_callback(lambda {|| puts "genereic callback for update action"})
# Register a callback for the delta events
shadow_client.register_delta_callback do
puts "delta have been catch in a callback"
end
# Send a get request with an associated callback in a block
shadow_client.get_shadow do
puts "get thing"
end
# Send a delete request with an associated callback in a proc
shadow_client.delete_shadow(timeout, proc {puts "delete thing"})
# Send a udpate request with an associated callback in a lambda
shadow_client.update_shadow("{\"state\":{\"desired\":{\"message\":\"Hello\"}}}", timeout, lambda {|| puts "update thing"})
# Clear out the previously registered callback for each action
shadow_client.remove_get_callback
shadow_client.remove_update_callback
shadow_client.remove_delete_callback
shadow_client.remove_delta_callback
Client persitences
For performance issues, sometimes subscriptions and (re)connection time would better to saved. This could be done with two different persistences, the subscription persistence and the connection persistence. The subscription persistence keeps the shadow_client subscribed to action topics (get/accepted, get/rejected, update/accepted, update/rejected, delete/accepted and delete/rejected). The subscription process require a short time, the persistent subscription avoid to susbscribe before each and so saved the subscription time. The subscription persistence could be set at the initialization of the shadow handler or directely at the shadow client initialization.
shadow_client = AwsIotDevice::MqttShadowClient::ShadowClient.new({:shadow_name => "Thing name", :persistent_subscribe => true})
# Or
shadow_client.create_shadow_handler_with_name(shadow_name, persistent_subscribe)
The default subscription persistence if desactivated, so the client might subscribe/unsubscribe to reserved topics before/after every actions.
The connection persistence enables the client to keep the mqtt connection alive until the client explicitly requests to disconnect. The basic client would disconnect from the remote host if no activity has been detected for a preset keep_alive timer. There is two ways to configure the connection persistence, at the initialization of the shadow client or at the connection time.
shadow_client = AwsIotDevice::MqttShadowClient::ShadowClient.new({:persistent => true})
# Or
shadow_client.connect({:persitent => true})
MQTT Adapter
The aws-iot-device
gem is based on a MQTT client (paho-mqtt
) that enables the usage of basic MQTT operations.
mqtt_client = AwsIoTDevice::MqttShadowClient::MqttManager.new
mqtt_client.config_endpoint(host, port)
mqtt_client.config_ssl_context(host, port)
mqtt_client.connect
mqtt_client.subscribe(topic, qos, callback)
mqtt_client.publish(topic, "Hello world!", qos, retain)
mqtt_client.unsubscribe(topic)
mqtt_client.disconnect
For the default paho mqtt_client, some callbacks are available for each event related with the MQTT protocol. We recommend to read the paho-mqtt
gem page for more details about the mqtt callbacks usage.
License
This SDK is distributed under the Apache License, Version 2.0.