ExistsSync fixes (#435)
- Fixing warning: “Passing invalid argument types to fs.existsSync is deprecated” #434)
- Update CI to use action-sourced session-based credentials
- Update integration tests to only use CRT resources
- Removed some fields from debug logging
Co-authored-by: mpatfield martin@patfield.com Co-authored-by: Bret Ambrose bambrose@amazon.com
版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9
京公网安备 11010802032778号
New Version Available
A new AWS IoT Device SDK is now available. It is a complete rework, built to improve reliability, performance, and security. We invite your feedback!
This SDK will no longer receive feature updates, but will receive security updates.
AWS IoT SDK for JavaScript
The aws-iot-device-sdk.js package allows developers to write JavaScript applications which access the AWS IoT Platform via MQTT or MQTT over the Secure WebSocket Protocol. It can be used in Node.js environments as well as in browser applications.
Overview
This document provides instructions on how to install and configure the AWS IoT device SDK for JavaScript, and includes examples demonstrating use of the SDK APIs.
MQTT Connection
This package is built on top of mqtt.js and provides three classes: ‘device’, ‘thingShadow’ and ‘jobs’. The ‘device’ class wraps mqtt.js to provide a secure connection to the AWS IoT platform and expose the mqtt.js interfaces upward. It provides features to simplify handling of intermittent connections, including progressive backoff retries, automatic re-subscription upon connection, and queued offline publishing with configurable drain rate.
Collection of Metrics
Beginning with Release v2.2.0 of the SDK, AWS collects usage metrics indicating which language and version of the SDK is being used. This allows us to prioritize our resources towards addressing issues faster in SDKs that see the most and is an important data point. However, we do understand that not all customers would want to report this data by default. In that case, the sending of usage metrics can be easily disabled by set options.enableMetrics to false.
Thing Shadows
The ‘thingShadow’ class implements additional functionality for accessing Thing Shadows via the AWS IoT API; the thingShadow class allows devices to update, be notified of changes to, get the current state of, or delete Thing Shadows from AWS IoT. Thing Shadows allow applications and devices to synchronize their state on the AWS IoT platform. For example, a remote device can update its Thing Shadow in AWS IoT, allowing a user to view the device’s last reported state via a mobile app. The user can also update the device’s Thing Shadow in AWS IoT and the remote device will synchronize with the new state. The ‘thingShadow’ class supports multiple Thing Shadows per mqtt connection and allows pass-through of non-Thing-Shadow topics and mqtt events.
Jobs
The ‘jobs’ class implements functionality to interact with the AWS IoT Jobs service. The IoT Job service manages deployment of IoT fleet wide tasks such as device software/firmware deployments and updates, rotation of security certificates, device reboots, and custom device specific management tasks.
Included in this package is an example ‘agent’. The agent can be used either as a stand-alone program to manage installation and maintenance of files and other running processes or it can be incorporated into a customized agent to meet specific application needs.
Installation
NOTE: AWS IoT Node.js SDK will only support Node version 8.17 or above.
You can check your node version by
Installing with npm:
Installing from github:
Mac-Only TLS Behavior
Please note that on Mac, once a private key is used with a certificate, that certificate-key pair is imported into the Mac Keychain. All subsequent uses of that certificate will use the stored private key and ignore anything passed in programmatically.
Examples
Device Class
Thing Shadow Class
Jobs Class
API Documentation
awsIot.device()awsIot.thingShadow()awsIot.jobs()awsIot.thingShadow#register()awsIot.thingShadow#unregister()awsIot.thingShadow#update()awsIot.thingShadow#get()awsIot.thingShadow#delete()awsIot.thingShadow#publish()awsIot.thingShadow#subscribe()awsIot.thingShadow#unsubscribe()awsIot.thingShadow#end()awsIot.jobs#subscribeToJobs()awsIot.jobs#unsubscribeFromJobs()awsIot.jobs#startJobNotifications()jobjob#documentjob#idjob#operationjob#statusjob#inProgress()job#failed()job#succeeded()awsIot.device(options)
Returns a wrapper for the mqtt.Client() class, configured for a TLS connection with the AWS IoT platform and with arguments as specified in
options. The AWSIoT-specific arguments are as follows:host: the AWS IoT endpoint you will use to connectclientId: the client ID you will use to connect to AWS IoTcertPath: path of the client certificate filekeyPath: path of the private key file associated with the client certificatecaPath: path of your CA certificate fileclientCert: same ascertPath, but can also accept a buffer containing client certificate dataprivateKey: same askeyPath, but can also accept a buffer containing private key datacaCert: same ascaPath, but can also accept a buffer containing CA certificate dataautoResubscribe: set to ‘true’ to automatically re-subscribe to topics after reconnection (default ‘true’)offlineQueueing: set to ‘true’ to automatically queue published messages while offline (default ‘true’)offlineQueueMaxSize: enforce a maximum size for the offline message queue (default 0, e.g. no maximum)offlineQueueDropBehavior: set to ‘oldest’ or ‘newest’ to define drop behavior on a full queue when offlineQueueMaxSize > 0drainTimeMs: the minimum time in milliseconds between publishes when draining after reconnection (default 250)baseReconnectTimeMs: the base reconnection time in milliseconds (default 1000)maximumReconnectTimeMs: the maximum reconnection time in milliseconds (default 128000)minimumConnectionTimeMs: the minimum time in milliseconds that a connection must be maintained in order to be considered stable (default 20000)protocol: the connection type, either ‘mqtts’ (default), ‘wss’ (WebSocket/TLS), or ‘wss-custom-auth’ (WebSocket/TLS with custom authentication). Note that when set to ‘wss’, values must be provided for the Access Key ID and Secret Key in either the following options or in environment variables as specified in WebSocket Configuration. When set to ‘wss-custom-auth’, valid headers must be provided as specified in Custom AuthwebsocketOptions: ifprotocolis set to ‘wss’, you can use this parameter to pass additional options to the underlying WebSocket object; these options are documented here.filename: used to load credentials from the file different than the default location whenprotocolis set to ‘wss’. Default value is ‘~/.aws/credentials’profile: used to specify which credential profile to be used whenprotocolis set to ‘wss’. Default value is ‘default’accessKeyId: used to specify the Access Key ID whenprotocolis set to ‘wss’. Overrides the environment variableAWS_ACCESS_KEY_IDandAWS_ACCESS_KEY_IDfromfilenameif set.secretKey: used to specify the Secret Key whenprotocolis set to ‘wss’. Overrides the environment variableAWS_SECRET_ACCESS_KEYandAWS_SECRET_ACCESS_KEYfromfilenameif set.sessionToken: (required when authenticating via Cognito, optional otherwise) used to specify the Session Token whenprotocolis set to ‘wss’. Overrides the environment variableAWS_SESSION_TOKENif set.region: used to specify AWS account region (e.g. ‘us-east-1’) whenprotocolis set towss. If undefined, a value is derived fromhost.customAuthHeaders: used to specify your custom authorization headers whenprotocolis set to ‘wss-custom-auth’. The fields ‘X-Amz-CustomAuthorizer-Name’, ‘X-Amz-CustomAuthorizer-Signature’, and the field for your token name are required.servername: used for SNI. If undefined, a value is derived fromhost.port: used to specify which port to connect to. If undefined, 443 or 8883 will be chosen depending onprotocol.customAuthQueryString: used to specify the token credentials in a query string for custom authorization whenprotocolis set towss-custom-auth. More info can be found here.keepalive: used to specify the time interval for each ping request. Default is set to 300 seconds to connect to AWS IoT.enableMetrics: used to report SDK version usage metrics. It is set to true by default. To disable metrics collection, set value to false.debug: set to ‘true’ for verbose logging (default ‘false’).All certificates and keys must be in PEM format.
optionsalso contains arguments specific to mqtt. See [the mqtt client documentation] (https://github.com/mqttjs/MQTT.js/blob/master/README.md#client) for details of these arguments. Note, AWS IoT doesn’t support retained messages; settingretainflag to ‘true’ for message publishing, including Last Will and Testament messages, will result in connection termination. For AWS IoT protocol specifics, please visit here.Supports all events emitted by the mqtt.Client() class.
awsIot.device#updateWebSocketCredentials(accessKeyId, secretKey, sessionToken, expiration)
Update the credentials set used to authenticate via WebSocket/SigV4. This method is designed to be invoked during the callback of the getCredentialsForIdentity method in the AWS SDK for JavaScript.
accessKeyId: the latest Access Key to use when connecting via WebSocket/SigV4secretKey: the latest Secret Key to use when connecting via WebSocket/SigV4sessionToken: the latest Session Token to use when connecting via WebSocket/SigV4expiration: the time this credentials set will expireawsIot.thingShadow(deviceOptions, thingShadowOptions)
The
thingShadowclass wraps an instance of thedeviceclass with additional functionality to operate on Thing Shadows via the AWS IoT API. The arguments indeviceOptionsinclude all those in the device class. thingShadowOptions has the addition of the following arguments specific to thethingShadowclass:operationTimeout: the timeout for thing operations (default 10 seconds)Supports all events emitted by the mqtt.Client() class; however, the semantics for the
messageevent are slightly different and additional events are available as described below:Event
'message'function(topic, message) {}Emitted when a message is received on a topic not related to any Thing Shadows:
topictopic of the received packetmessagepayload of the received packetEvent
'status'function(thingName, stat, clientToken, stateObject) {}Emitted when an operation
update|get|deletecompletes.thingNamename of the Thing Shadow for which the operation has completedstatstatus of the operationaccepted|rejectedclientTokenthe operation’s clientTokenstateObjectthe stateObject returned for the operationApplications can use clientToken values to correlate status events with the operations that they are associated with by saving the clientTokens returned from each operation.
Event
'delta'function(thingName, stateObject) {}Emitted when a delta has been received for a registered Thing Shadow.
thingNamename of the Thing Shadow that has received a deltastateObjectthe stateObject returned for the operationEvent
'foreignStateChange'function(thingName, operation, stateObject) {}Emitted when a different client’s update or delete operation is accepted on the shadow.
thingNamename of the Thing Shadow for which the operation has completedoperationoperation performed by the foreign clientupdate|deletestateObjectthe stateObject returned for the operationThis event allows an application to be aware of successful update or delete operations performed by different clients.
Event
'timeout'function(thingName, clientToken) {}Emitted when an operation
update|get|deletehas timed out.thingNamename of the Thing Shadow that has received a timeoutclientTokenthe operation’s clientTokenApplications can use clientToken values to correlate timeout events with the operations that they are associated with by saving the clientTokens returned from each operation.
awsIot.thingShadow#register(thingName, [options], [callback] )
Register interest in the Thing Shadow named
thingName. The thingShadow class will subscribe to any applicable topics, and will fire events for the Thing Shadow until awsIot.thingShadow#unregister() is called withthingName.optionscan contain the following arguments to modify how this Thing Shadow is processed:ignoreDeltas: set totrueto not subscribe to thedeltasub-topic for this Thing Shadow; used in cases where the application is not interested in changes (e.g. update only.) (defaultfalse)persistentSubscribe: set tofalseto unsubscribe from all operation sub-topics while not performing an operation (defaulttrue)discardStale: set tofalseto allow receiving messages with old version numbers (defaulttrue)enableVersioning: set totrueto send version numbers with shadow updates (defaulttrue)The
persistentSubscribeargument allows an application to get faster operation responses at the expense of potentially receiving more irrelevant response traffic (i.e., response traffic for other clients who have registered interest in the same Thing Shadow). WhenpersistentSubscribeis set tofalse, operation sub-topics are only subscribed to during the scope of that operation; note that in this mode, update, get, and delete operations will be much slower; however, the application will be less likely to receive irrelevant response traffic.The
discardStaleargument allows applications to receive messages which have obsolete version numbers. This can happen when messages are received out-of-order; applications which set this argument tofalseshould use other methods to determine how to treat the data (e.g. use a time stamp property to know how old/stale it is).If
enableVersioningis set to true, version numbers will be sent with each operation. AWS IoT maintains version numbers for each shadow, and will reject operations which contain the incorrect version; in applications where multiple clients update the same shadow, clients can use versioning to avoid overwriting each other’s changes.If the
callbackparameter is provided, it will be invoked after registration is complete (i.e., when subscription ACKs have been received for all shadow topics). Applications should wait until shadow registration is complete before performing update/get/delete operations.awsIot.thingShadow#unregister(thingName)
Unregister interest in the Thing Shadow named
thingName. The thingShadow class will unsubscribe from all applicable topics and no more events will be fired forthingName.awsIot.thingShadow#update(thingName, stateObject)
Update the Thing Shadow named
thingNamewith the state specified in the JavaScript objectstateObject.thingNamemust have been previously registered using awsIot.thingShadow#register(). The thingShadow class will subscribe to all applicable topics and publishstateObjecton the update sub-topic.This function returns a
clientToken, which is a unique value associated with the update operation. When a ‘status’ or ‘timeout’ event is emitted, theclientTokenwill be supplied as one of the parameters, allowing the application to keep track of the status of each operation. The caller may create their ownclientTokenvalue; ifstateObjectcontains aclientTokenproperty, that will be used rather than the internally generated value. Note that it should be of atomic type (i.e. numeric or string). This function returns ‘null’ if an operation is already in progress.awsIot.thingShadow#get(thingName, [clientToken])
Get the current state of the Thing Shadow named
thingName, which must have been previously registered using awsIot.thingShadow#register(). The thingShadow class will subscribe to all applicable topics and publish on the get sub-topic.This function returns a
clientToken, which is a unique value associated with the get operation. When a ‘status or ‘timeout’ event is emitted, theclientTokenwill be supplied as one of the parameters, allowing the application to keep track of the status of each operation. The caller may supply their ownclientTokenvalue (optional); if supplied, the value ofclientTokenwill be used rather than the internally generated value. Note that this value should be of atomic type (i.e. numeric or string). This function returns ‘null’ if an operation is already in progress.awsIot.thingShadow#delete(thingName, [clientToken])
Delete the Thing Shadow named
thingName, which must have been previously registered using awsIot.thingShadow#register(). The thingShadow class will subscribe to all applicable topics and publish on the delete sub-topic.This function returns a
clientToken, which is a unique value associated with the delete operation. When a ‘status’ or ‘timeout’ event is emitted, theclientTokenwill be supplied as one of the parameters, allowing the application to keep track of the status of each operation. The caller may supply their ownclientTokenvalue (optional); if supplied, the value ofclientTokenwill be used rather than the internally generated value. Note that this value should be of atomic type (i.e. numeric or string). This function returns ‘null’ if an operation is already in progress.awsIot.thingShadow#publish(topic, message, [options], [callback])
Identical to the mqtt.Client#publish() method, with the restriction that the topic may not represent a Thing Shadow. This method allows the user to publish messages to topics on the same connection used to access Thing Shadows.
awsIot.thingShadow#subscribe(topic, [options], [callback])
Identical to the mqtt.Client#subscribe() method, with the restriction that the topic may not represent a Thing Shadow. This method allows the user to subscribe to messages from topics on the same connection used to access Thing Shadows.
awsIot.thingShadow#unsubscribe(topic, [callback])
Identical to the mqtt.Client#unsubscribe() method, with the restriction that the topic may not represent a Thing Shadow. This method allows the user to unsubscribe from topics on the same used to access Thing Shadows.
awsIot.thingShadow#end([force], [callback])
Invokes the mqtt.Client#end() method on the MQTT connection owned by the
thingShadowclass. Theforceandcallbackparameters are optional and identical in function to the parameters in the mqtt.Client#end() method.awsIot.jobs(deviceOptions)
The
jobsclass wraps an instance of thedeviceclass with additional functionality to handle job execution management through the AWS IoT Jobs platform. Arguments indeviceOptionsare the same as those in the device class and thejobsclass supports all of the same events and functions as thedeviceclass.The
jobsclass also supports the following methods:awsIot.jobs#subscribeToJobs(thingName, [operationName], callback)
Subscribes to job execution notifications for the thing named
thingName. IfoperationNameis specified then the callback will only be called when a job ready for execution contains a property calledoperationin its job document with a value matchingoperationName. IfoperationNameis omitted then the callback will be called for every job ready for execution that does not match anothersubscribeToJobssubscription.thingNamename of the Thing to receive job execution notificationsoperationNameoptionally filter job execution notifications to jobs with a valuecallback- function (err, job) callback for when a job execution is ready for processing or an error occursawsIot.jobs#unsubscribeFromJobs(thingName, [operationName], callback)
Unsubscribes from job execution notifications for the thing named
thingNamehaving operations with a value of the givenoperationName. IfoperationNameis omitted then the default handler for the thing with the given name is unsubscribed.thingNamename of the Thing to cancel job execution notifications foroperationNameoptional name of previously subscribed operation namescallback- function (err) callback for when the unsubscribe operation completesawsIot.jobs#startJobNotifications(thingName, [callback])
Causes any existing queued job executions for the given thing to be published to the appropriate subscribeToJobs handler. Only needs to be called once per thing.
thingNamename of the Thing to cancel job execution notifications forcallback- function (err) callback for when the startJobNotifications operation completesjob
Object that contains job execution information and functions for updating job execution status.
job.document
The JSON document describing details of the job to be executed eg.
job.id
Returns the job id.
job.operation
Returns the job operation from the job document. Eg. ‘install’, ‘reboot’, etc.
job.status
Returns the current job status according to AWS Orchestra.
job.inProgress([statusDetails],[callback])
Update the status of the job execution to be IN_PROGRESS for the thing associated with the job.
statusDetailsoptional document describing the status details of the in progress job e.g.callback- function(err) optional callback for when the operation completes, err is null if no error occurredjob.failed([statusDetails],[callback])
Update the status of the job execution to be FAILED for the thing associated with the job.
statusDetailsoptional document describing the status details of the in progress job e.g.callback- function(err) optional callback for when the operation completes, err is null if no error occurredjob.succeeded([statusDetails],[callback])
Update the status of the job execution to be SUCCESS for the thing associated with the job.
statusDetailsoptional document describing the status details of the in progress job e.g.callback- function(err) optional callback for when the operation completes, err is null if no error occurredConnection Types
This SDK supports three types of connections to the AWS IoT platform:
The default connection type is MQTT over TLS with mutual certificate authentication; to configure a WebSocket/TLS connection, set the
protocoloption towsswhen instantiating the awsIot.device() or awsIot.thingShadow() classes. To use custom auth, set theprotocoloption towss-custom-auth.Custom Authorization Configuration
To use custom authorization, you must first set up an authorizer function in Lambda and register it with IoT. Once you do, you will be able to authenticate using this function. There are two ways to use custom auth:
customAuthHeadersoption to your headers object when instantiating the awsIotDevice() or awsIot.thingShadow() classes. The headers object is an object containing the header name and values as key-value pairs:customAuthQueryStringoption to your headers object when instantiating the awsIotDevice() class. The query string is a string containing the values as key-value pairs:Example Programs
The ‘examples’ directory contains several programs which demonstrate usage of the AWS IoT APIs:
device-example.js: demonstrate simple MQTT publish and subscribe operations.
echo-example.js: test Thing Shadow operation by echoing all delta state updates to the update topic; used in conjunction with the AWS IoT Console to verify connectivity with the AWS IoT platform.
thing-example.js: use a Thing Shadow to automatically synchronize state between a simulated device and a control application.
thing-passthrough-example.js: demonstrate use of a Thing Shadow with pasthrough of standard MQTT publish and subscribe messages.
temperature-control/temperature-control.js: an interactive device simulation which uses Thing Shadows.
jobs-example.js: receive example job execution messages and update job execution status.
jobs-agent.js: example agent to handle standard operations such as reboot, report system status, and shutdown. It also handles installation of files including but not limited to configuration files, program updates and security certificates. It also can install and launch other programs and manage their executions (start, stop and restart).
The example programs use command line parameters to set options. To see the available options, run the program and specify the ‘-h’ option as follows:
NOTE: You have to use the certificate created in the same region as your host end point. You will also need to use unique custom endpoint with ‘-H’ command line option when connect examples to IoT cloud.
WebSocket Configuration
The example programs can be configured to use a WebSocket/TLS connection to the AWS IoT platform by adding ‘–protocol=wss’ to the command line to override the default setting of ‘mqtts’.
When using a WebSocket/TLS connection, you have the following options to set credentials.
Export variables to system environment
Load IAM credentials from shared credential file
The default shared credential file is located in
~/.aws/credentialsfor Linux users and%UserProfile%\.aws\credentialsfor Windows users. This could be configured using AWS CLI visit the AWS CLI home page. Alternatively, you could provide credential file in different path or another profile by specifying in theawsIot.device(options).The values of
AWS_ACCESS_KEY_IDandAWS_SECRET_ACCESS_KEYmust contain valid AWS Identity and Access Management (IAM) credentials. For more information about AWS IAM, visit the AWS IAM home page.Certificate Configuration
When not configured to use a WebSocket/TLS connection, the example programs require a client certificate and private key (created using either the AWS IoT Console or the AWS IoT CLI) in order to authenticate with AWS IoT. Each example program uses command line options to specify the names and/or locations of certificates as follows:
Specify a directory containing default-named certificates
The –certificate-dir (-f) option will read all certificate and key files from the directory specified. Default certificate/key file names are as follows:
Specify certificate names and locations individually
The ‘-f’ (certificate directory) option can be combined with these so that you don’t have to specify absolute pathnames for each file.
Use a configuration file
The AWS IoT Console can generate JSON configuration data specifying the parameters required to connect a device to the AWS IoT Platform. The JSON configuration data includes pathnames to certificates, the hostname and port number, etc… The command line option ‘–configuration-file (-F)’ is used when reading parameters from a configuration file.
The configuration file is in JSON format, and may contain the following properties:
Tips for using JSON configuration files
device-example.js
device-example.js is run as two processes which communicate with one another via the AWS IoT platform using MQTT publish and subscribe. The command line option ‘–test-mode (-t)’ is used to set which role each process performs. It’s easiest to run each process in its own terminal window so that you can see the output generated by each. Note that in the following examples, all certificates are located in the ~/certs directory and have the default names as specified in the Certificate Configuration section.
Terminal Window 1
Terminal Window 2
thing-example.js
Similar to device-example.js, thing-example.js is also run as two processes which communicate with one another via the AWS IoT platform. thing-example.js uses a Thing Shadow to synchronize state between the two processes, and the command line option ‘–test-mode (-t)’ is used to set which role each process performs. As with device-example.js, it’s best to run each process in its own terminal window or on separate hosts. In this example, the example programs are configured to use WebSocket/TLS connections to the AWS IoT platform as specified in the WebSocket Configuration.
Terminal Window 1
Terminal Window 2
thing-passthrough-example.js
Similar to thing-example.js, thing-passthrough-example.js is also run as two processes which communicate with one another via the AWS IoT platform. thing-passthrough-example.js uses a Thing Shadow to synchronize state from one process to another, and uses MQTT publish/subscribe to send information in the other direction. The command line option ‘–test-mode (-t)’ is used to set which role each process performs. As with thing-example.js, it’s best to run each process in its own terminal window. Note that in the following examples, all certificates are located in the ~/certs directory and have the default names as specified in the Certificate Configuration section.
Terminal Window 1
Terminal Window 2
echo-example.js
echo-example.js is used in conjunction with the AWS IoT Console to verify connectivity with the AWS IoT platform and to perform interactive observation of Thing Shadow operation. In the following example, the program is run using the configuration file ‘../config.json’, and the certificates are located in the ‘~/certs’ directory. Here, the ‘-f’ (certificate directory) and ‘-F’ (configuration file) options are combined so that the configuration file doesn’t need to contain absolute pathnames.
temperature-control.js
temperature-control.js is an interactive simulation which demonstrates how Thing Shadows can be used to easily synchronize applications and internet-connected devices.
Like thing-example.js, temperature-control.js runs in two separate terminal windows and is configured via command-line options; in the following example, all certificates are located in the ~/certs directory and have the default names as specified in the Certificate Configuration section. The process running with ‘–test-mode=2’ simulates an internet-connected temperature control device, and the process running with ‘–test-mode=1’ simulates a mobile application which is monitoring/controlling it. The processes may be run on different hosts if desired.
Installing Dependencies
temperature-control.js uses the blessed.js and blessed-contrib.js libraries to provide an interactive terminal interface; it looks best on an 80x25 terminal with a black background and white or green text and requires UTF-8 character encoding. You’ll need to install these libraries in the examples/temperature-control directory as follows:
Running the Simulation - Terminal Window 1
Running the Simulation - Terminal Window 2
Using the simulation
The simulated temperature control device has two controls; Setpoint and Status. Status controls whether or not the device is active, and Setpoint controls the interior temperature the device will attempt to achieve. In addition, the device reports the current interior and exterior temperatures as well as its operating state (heating, cooling, or stopped).
Two Thing Shadows are used to connect the simulated device and mobile application; one contains the controls and the other contains the measured temperatures and operating state. Both processes can update the controls, but only the device can update the measured temperatures and the operating state.
Controlling the simulation is done using the up, down, left, right, and Enter keys as follows:
Operating State
The operating state of the device is indicated by the color of the Interior temperature field as follows:
The following example shows the temperature control simulation in ‘device’ mode while the operating state is ‘heating’.
Log
The log window displays events of interest, e.g. network connectivity, Status toggles, re-synchronization with the Thing Shadow, etc…
Menu Options
In this example, the mobile application is disconnected from the network. Although it has requested that the Setpoint be lowered to 58 degrees, the command can’t be sent to the device as there is no network connectivity, so the operating state still shows as ‘stopped’. When the mobile application is reconnected to the network, it will attempt to update the Thing Shadow for the device’s controls; if no control changes have been made on the device side during the disconnection period, the device will synchronize to the mobile application’s requested state; otherwise, the mobile application will re- synchronize to the device’s current state.
Exiting the Simulation
The simulation can be exited at any time by pressing q, Ctrl+c, or by selecting ‘exit’ on the menu bar.
jobs-example.js
jobs-example.js, like the echo-example.js can receive messages via the AWS IoT Console to verify connectivity with the AWS IoT platform. But it can also receive and process job executions initiated through the AWS IoT device jobs management platform. See the AWS IoT Jobs documentation here for more information on creating and deploying jobs.
Running the jobs-example
jobs-agent.js
jobs-agent.js can be run on a device as-is or it can be modified to suit specific use cases. Example job documents are provided below. For more information see the AWS IoT connected device management documentation here.
Running the jobs-agent
Using the jobs-agent
systemStatus operation
The jobs-agent will respond to the AWS IoT jobs management platform with system status information when it receives a job execution notification with a job document that looks like this:
reboot operation
When the jobs-agent receives a reboot job document it will attempt to reboot the device it is running on while sending updates on its progress to the AWS IoT jobs management platform. After the reboot the job execution status will be marked as IN_PROGRESS until the jobs-agent is also restarted at which point the status will be updated to SUCCESS. To avoid manual steps during reboot it is suggested that device be configured to automatically start the jobs-agent at device startup time. Job document format:
shutdown operation
When the jobs-agent receives a shutdown job document it will attempt to shutdown the device.
install operation
When the jobs-agent receives an install job document it will attempt to install the files specified in the job document. An install job document should follow this general format.
packageName: Each install operation must have a unique package name. If the packageName matches a previous install operation then the new install operation overwrites the previous one.workingDirectory: Optional property for working directorylaunchCommand: Optional property for launching an application/package. If omitted copy files only.autoStart: If set to true then agent will execute launch command when agent starts up.files: Specifies files to be installedfileName: Name of file as written to file systemfileSource.url: Location of file to be downloaded fromchecksum: Optional file checksuminline.value: Checksum valuehashAlgorithm: Checksum hash algorithm usedstart operation
When the jobs-agent receives a start job document it will attempt to startup the specified package.stop operation
When the jobs-agent receives a stop job document it will attempt to stop the specified package.restart operation
When the jobs-agent receives a restart job document it will attempt to restart the specified package.Browser Applications
This SDK can be packaged to run in a browser using browserify or webpack, and includes helper scripts and example application code to help you get started writing browser applications that use AWS IoT.
Background
Browser applications connect to AWS IoT using MQTT over the Secure WebSocket Protocol. There are some important differences between Node.js and browser environments, so a few adjustments are necessary when using this SDK in a browser application.
When running in a browser environment, the SDK doesn’t have access to the filesystem or process environment variables, so these can’t be used to store credentials. While it might be possible for an application to prompt the user for IAM credentials, the Amazon Cognito Identity Service provides a more user-friendly way to retrieve credentials which can be used to access AWS IoT. The temperature-monitor browser example application illustrates this use case.
Using SDK with browserify
Installing browserify
This SDK could also work with web applications using
browserify. First, you’ll need to make sure thatbrowserifyis installed. The following instructions and the scripts in this package assume that it is installed globally, as with:Browser Application Utility
This SDK includes a utility script called
scripts/browserize.sh. This script can create a browser bundle containing both the AWS SDK for JavaScript and this SDK, or you can use it to create application bundles for browser applications, like the ones under theexamples/browserdirectory. For Windows user who does not want to use bash shell, the SDK also includes batch filewindows-browserize.batwhich does the same job asbrowserize.shbut able to run in Windows CMD. To create the combined AWS SDK browser bundle, run this command in the SDK’s top-level directory:This command will create a browser bundle in
browser/aws-iot-sdk-browser-bundle.js. The browser bundle makes both theaws-sdkandaws-iot-device-sdkmodules available so that you canrequirethem from your browserified application bundle.NOTE: For Windows user who running scripts in CMD, since batch script file does not work well with NPM package script, Windows user could just call script directly to replace
npm run-script browserize. This also applies for example applications demonstrated below.Creating Application Bundles
You can also use the
scripts/browserize.shscript to browserify your own applications and use them with the AWS SDK browser bundle. For example, to prepare the temperature-monitor browser example application for use, run this command in the SDK’s top-level directory:This command does two things. First, it creates an application bundle from
examples/browser/temperature-monitor/index.jsand places it inexamples/browser/temperature-monitor/bundle.js. Second, it copies thebrowser/aws-iot-sdk-browser-bundle.jsinto your application’s directory where it can be used, e.g.:Temperature Monitor Browser Example Application
This SDK includes a companion browser application to the Temperature Control Example Application. The browser application allows you to monitor the status of the simulated temperature control device.
Follow the instructions to install the Temperature Control Example Application
In order for the browser application to be able to authenticate and connect to AWS IoT, you’ll need to configure a Cognito Identity Pool. In the Amazon Cognito console, use Amazon Cognito to create a new identity pool, and allow unauthenticated identities to connect. Obtain the
PoolIDconstant. Make sure that the policy attached to the unauthenticated role has permissions to access the required AWS IoT APIs. More information about AWS IAM roles and policies can be found here.Edit
examples/browser/temperature-monitor/aws-configuration.js, and replace the values ofpoolIdandregionwith strings containing the ID of the Cognito Identity Pool and your AWS region (e.g.,'us-east-1') from the previous step.Create the application browser bundle by executing the following command in the top-level directory of the SDK:
Start an instance of the device simulation using:
NOTE: Although the above example shows connecting using a certificate/private key set, you can use any of the command line options described in the Example Programs Section.
Open
examples/browser/temperature-monitor/index.htmlin your web browser. It should connect to AWS IoT and began displaying the status of the simulated temperature control device you started in the previous step. If you change the device’s settings, the browser window should update and display the latest status values.Lifecycle Event Monitor Browser Example Application
This SDK includes a browser application which demonstrates the functionality of AWS IoT lifecycle events. AWS IoT generates lifecycle events whenever clients connect or disconnect; applications can monitor these and take action when clients connect or disconnect from AWS IoT. Follow these instructions to run the application:
In order for the browser application to be able to authenticate and connect to AWS IoT, you’ll need to configure a Cognito Identity Pool. In the Amazon Cognito console, use Amazon Cognito to create a new identity pool, and allow unauthenticated identities to connect. Obtain the
PoolIDconstant. Make sure that the policy attached to the unauthenticated role has permissions to access the required AWS IoT APIs. More information about AWS IAM roles and policies can be found here.Edit
examples/browser/lifecycle/aws-configuration.js, and replace the values ofpoolIdandregionwith strings containing the ID of the Cognito Identity Pool and your AWS region (e.g.,'us-east-1') from the previous step.Create the application browser bundle by executing the following command in the top-level directory of the SDK:
Open
examples/browser/lifecycle/index.htmlin your web browser. After connecting to AWS IoT, it should display ‘connected clients’.Start programs which connect to AWS IoT (e.g., the example programs in this package). Make sure that these programs are connecting to the same AWS region that your Cognito Identity Pool was created in. The browser application will display a green box containing the client ID of each client which connects; when the client disconnects, the box will disappear.
If a DynamoDB table named
LifecycleEventsexists in your account and has a primary key namedclientId, the lifecycle event browser monitor browser application will display the client ID contained in each row. By updating this table using an AWS IoT rule triggered by lifecycle events, you can maintain a persistent list of all of the currently connected clients within your account.MQTT Explorer Browser Example Application
This SDK includes a browser application which implements a simple interactive MQTT client. You can use this application to subscribe to a topic and view the messages that arrive on it, or to publish to a topic. Follow these instructions to run the application:
In order for the browser application to be able to authenticate and connect to AWS IoT, you’ll need to configure a Cognito Identity Pool. In the Amazon Cognito console, use Amazon Cognito to create a new identity pool, and allow unauthenticated identities to connect. Obtain the
PoolIDconstant. Make sure that the policy attached to the unauthenticated role has permissions to access the required AWS IoT APIs. More information about AWS IAM roles and policies can be found here.Edit
examples/browser/mqtt-explorer/aws-configuration.js, and replace the values ofpoolIdandregionwith strings containing the ID of the Cognito Identity Pool and your AWS region (e.g.,'us-east-1') from the previous step.Create the application browser bundle by executing the following command in the top-level directory of the SDK:
Open
examples/browser/mqtt-explorer/index.htmlin your web browser. After connecting to AWS IoT, it should display input fields allowing you to subscribe or publish to a topic. By subscribing to ‘#’, for example, you will be able to monitor all traffic within your AWS account as allowed by the policy associated with the unauthenticated role of your Cognito Identity Pool.Reducing Browser Bundle Size
After your application development is complete, you will probably want to reduce the size of the browser bundle. There are a couple of easy techniques to do this, and by combining both of them you can create much smaller browser bundles.
Eliminate unused features from the AWS SDK
The AWS SDK for JavaScript allows you to install only the features you use in your application. In order to use this feature when preparing a browser bundle, first you’ll need to remove any existing bundle that you’ve already created:
Define the AWS features your application uses as a comma-separated list in the
AWS_SERVICESenvironment variable. For example, the MQTT Explorer example uses only AWS Cognito Identity, so to create a bundle containing only this feature, do:For a list of the AWS SDK feature names, refer to the features subdirectory of the AWS SDK for JavaScript. As another example, if your application uses Cognito Identity, DynamoDB, S3, and SQS, you would do:
Create the browser app and bundle, e.g. for the MQTT Explorer example, do:
Uglify the bundle source
Uglify is an npm utility for minimizing the size of JavaScript source files. To use it, first install it as a global npm package:
Once installed, you can use it to reduce the bundle size:
After you’ve created the minimized bundle, you’ll need to make sure that your application loads this version rather than the non-minimized version, e.g:
Optimization results
By using both of the above techniques for the MQTT Explorer example, the bundle size can be reduced from 2.4MB to 615KB.
Using SDK with webpack
In order to work with webpack, you have to create a webpack package. You can put your file dependencies in
entry.jsand output it asbundle.js. An example is provided in the location./examples/browser/mqtt-webpackThe
index.htmlwill load the output filebundle.jsand execute functions defined inentry.js. This duplicates the example of mqtt-explore above which loaded SDK into web browser using browserify.Troubleshooting
If you have problems connecting to the AWS IoT Platform when using this SDK or running the example programs, there are a few things to check:
npm -v.Unit Tests
This package includes unit tests which can be run as follows:
Running the unit tests will also generate code coverage data in the ‘reports’ directory.
License
This SDK is distributed under the Apache License, Version 2.0, see LICENSE.txt and NOTICE.txt for more information.
Support
If you have technical questions about AWS IoT Device SDK, use the AWS IoT Forum. For any other questions on AWS IoT, contact AWS Support.