An mbed wrapper around the helium-client to communicate with the Helium Atom

Helium for ARM mbed

This code repository exposes an mbed library for the Helium Atom module. The Helium Atom makes it easy to securely connect IoT devices and applications to back-end IoT services.

Getting Started

See a getting started guide on the Helium site.

Supported Boards

The Helium mbed client should work with any mbed board with an available serial port.

Example Setup

Example applications can be found in the mbed Helium team.

Getting Help

If you have any questions or ideas about how to use this code - or any part of Helium - head over to the Helium Community Slack. We're standing by to help.

Contributing

Want to contribute to helium-mbed? That's awesome!

Please see CONTRIBUTING.md in this repository for details.

Committer:
Marc Nijdam
Date:
Wed Jul 05 12:44:35 2017 -0700
Revision:
12:07a4782fe9f2
Parent:
3:475fae677f2d
Child:
14:af7682f4e610
native spelling of license

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Marc Nijdam 3:475fae677f2d 1 /*
Marc Nijdam 3:475fae677f2d 2 * Copyright 2017, Helium Systems, Inc.
Marc Nijdam 12:07a4782fe9f2 3 * All Rights Reserved. See LICENSE.txt for license information
Marc Nijdam 3:475fae677f2d 4 */
Marc Nijdam 3:475fae677f2d 5
Marc Nijdam 3:475fae677f2d 6 #ifndef HELIUM_H
Marc Nijdam 3:475fae677f2d 7 #define HELIUM_H
Marc Nijdam 3:475fae677f2d 8
Marc Nijdam 3:475fae677f2d 9 #include "mbed.h"
Marc Nijdam 3:475fae677f2d 10 #include "helium-client/helium-client.h"
Marc Nijdam 3:475fae677f2d 11
Marc Nijdam 3:475fae677f2d 12 /**
Marc Nijdam 3:475fae677f2d 13 * \class Helium
Marc Nijdam 3:475fae677f2d 14 *
Marc Nijdam 3:475fae677f2d 15 * \brief Enables communication with the Helium Atom
Marc Nijdam 3:475fae677f2d 16 *
Marc Nijdam 3:475fae677f2d 17 * This class offers the basic ability to communicate with the Helium
Marc Nijdam 3:475fae677f2d 18 * Atom module.
Marc Nijdam 3:475fae677f2d 19 *
Marc Nijdam 3:475fae677f2d 20 * See the @ref Basic.ino sketch for an example on how to create a
Marc Nijdam 3:475fae677f2d 21 * channel and send to it.
Marc Nijdam 3:475fae677f2d 22 *
Marc Nijdam 3:475fae677f2d 23 */
Marc Nijdam 3:475fae677f2d 24 class Helium
Marc Nijdam 3:475fae677f2d 25 {
Marc Nijdam 3:475fae677f2d 26 public:
Marc Nijdam 3:475fae677f2d 27 /** Create a Helium instance on a hardware serial port.
Marc Nijdam 3:475fae677f2d 28 *
Marc Nijdam 3:475fae677f2d 29 * @param serial The hardware serial port to use
Marc Nijdam 3:475fae677f2d 30 */
Marc Nijdam 3:475fae677f2d 31 Helium(PinName tx, PinName rx);
Marc Nijdam 3:475fae677f2d 32
Marc Nijdam 3:475fae677f2d 33 /** Set communication speed with the Helium Atom.
Marc Nijdam 3:475fae677f2d 34 *
Marc Nijdam 3:475fae677f2d 35 * This sets communication speed with the Helium Atom to the given
Marc Nijdam 3:475fae677f2d 36 * value.
Marc Nijdam 3:475fae677f2d 37 *
Marc Nijdam 3:475fae677f2d 38 * @param baud The baud rate to use.
Marc Nijdam 3:475fae677f2d 39 */
Marc Nijdam 3:475fae677f2d 40 int baud(enum helium_baud baud);
Marc Nijdam 3:475fae677f2d 41
Marc Nijdam 3:475fae677f2d 42 /** Get information on the Helium atom
Marc Nijdam 3:475fae677f2d 43 *
Marc Nijdam 3:475fae677f2d 44 * Gets basic information about the Helium Atom such as it's MAC
Marc Nijdam 3:475fae677f2d 45 * address and the current network time, if connected.
Marc Nijdam 3:475fae677f2d 46 *
Marc Nijdam 3:475fae677f2d 47 * @param info The information structure to fill out
Marc Nijdam 3:475fae677f2d 48 */
Marc Nijdam 3:475fae677f2d 49 int info(struct helium_info * info);
Marc Nijdam 3:475fae677f2d 50
Marc Nijdam 3:475fae677f2d 51 /** Connect the Helium Atom to the network.
Marc Nijdam 3:475fae677f2d 52 *
Marc Nijdam 3:475fae677f2d 53 * This tries to connect the Helium Atom to a nearby Element and
Marc Nijdam 3:475fae677f2d 54 * the Helium Network. Connections can be quick or slow. A quick
Marc Nijdam 3:475fae677f2d 55 * connection attempt to re-connect to the network using revious
Marc Nijdam 3:475fae677f2d 56 * _connection_ state which was retrieved using %sleep. If the
Marc Nijdam 3:475fae677f2d 57 * quick connect was not requested or if it fails a normal, slower
Marc Nijdam 3:475fae677f2d 58 * connection attempt is made.
Marc Nijdam 3:475fae677f2d 59 *
Marc Nijdam 3:475fae677f2d 60 * Connect is an asynchronous operation. The given are a
Marc Nijdam 3:475fae677f2d 61 * convenience to attempt a number of retries before returning the
Marc Nijdam 3:475fae677f2d 62 * current connection state.
Marc Nijdam 3:475fae677f2d 63 *
Marc Nijdam 3:475fae677f2d 64 * @param connection A previously retrieved connection structure
Marc Nijdam 3:475fae677f2d 65 * that reflects sleep state.
Marc Nijdam 3:475fae677f2d 66 *
Marc Nijdam 3:475fae677f2d 67 * @param retries The number of retries to attempt to connect.
Marc Nijdam 3:475fae677f2d 68 *
Marc Nijdam 3:475fae677f2d 69 * @return helium_connect_status
Marc Nijdam 3:475fae677f2d 70 *
Marc Nijdam 3:475fae677f2d 71 * @see Helium#connect()
Marc Nijdam 3:475fae677f2d 72 */
Marc Nijdam 3:475fae677f2d 73 int connect(struct connection * connection, uint32_t retries);
Marc Nijdam 3:475fae677f2d 74
Marc Nijdam 3:475fae677f2d 75 /** Short form connect to the Helium Network.
Marc Nijdam 3:475fae677f2d 76 *
Marc Nijdam 3:475fae677f2d 77 * This is the recommended connect call. It assumes no connection
Marc Nijdam 3:475fae677f2d 78 * state and tries to connect for up to a 5 seconds.
Marc Nijdam 3:475fae677f2d 79 *
Marc Nijdam 3:475fae677f2d 80 */
Marc Nijdam 3:475fae677f2d 81 int connect()
Marc Nijdam 3:475fae677f2d 82 {
Marc Nijdam 3:475fae677f2d 83 return connect(NULL, HELIUM_POLL_RETRIES_5S);
Marc Nijdam 3:475fae677f2d 84 }
Marc Nijdam 3:475fae677f2d 85
Marc Nijdam 3:475fae677f2d 86 /** Check if the Atom is connected to the network
Marc Nijdam 3:475fae677f2d 87 *
Marc Nijdam 3:475fae677f2d 88 * Checks whether the Atom is connected to the network.
Marc Nijdam 3:475fae677f2d 89 *
Marc Nijdam 3:475fae677f2d 90 * @returns true if connected, false if not connected
Marc Nijdam 3:475fae677f2d 91 */
Marc Nijdam 3:475fae677f2d 92 bool connected();
Marc Nijdam 3:475fae677f2d 93
Marc Nijdam 3:475fae677f2d 94 /** Disconnects the Atom from the network and puts it in sleep mode.
Marc Nijdam 3:475fae677f2d 95 *
Marc Nijdam 3:475fae677f2d 96 * This disconnects the Helium Atom from the network and puts it
Marc Nijdam 3:475fae677f2d 97 * in sleep mode. If a connection structure is given, it is filled
Marc Nijdam 3:475fae677f2d 98 * with sleep state which can be used in a sub-sequent connect
Marc Nijdam 3:475fae677f2d 99 * call to quick connect to the network.
Marc Nijdam 3:475fae677f2d 100 *
Marc Nijdam 3:475fae677f2d 101 * @param connection Sleep connection buffer to fill in.
Marc Nijdam 3:475fae677f2d 102 *
Marc Nijdam 3:475fae677f2d 103 * @see Helium::sleep() for the easy version.
Marc Nijdam 3:475fae677f2d 104 */
Marc Nijdam 3:475fae677f2d 105 int sleep(struct connection * connection);
Marc Nijdam 3:475fae677f2d 106
Marc Nijdam 3:475fae677f2d 107 /** Disconnect the Atom and put it to sleep.
Marc Nijdam 3:475fae677f2d 108 *
Marc Nijdam 3:475fae677f2d 109 * This is the convenience version of sleep. A subsequent connect
Marc Nijdam 3:475fae677f2d 110 * call will go through a normal connect cycle.
Marc Nijdam 3:475fae677f2d 111 *
Marc Nijdam 3:475fae677f2d 112 */
Marc Nijdam 3:475fae677f2d 113 int sleep()
Marc Nijdam 3:475fae677f2d 114 {
Marc Nijdam 3:475fae677f2d 115 return sleep(NULL);
Marc Nijdam 3:475fae677f2d 116 }
Marc Nijdam 3:475fae677f2d 117
Marc Nijdam 3:475fae677f2d 118 private:
Marc Nijdam 3:475fae677f2d 119 Serial serial;
Marc Nijdam 3:475fae677f2d 120 struct helium_ctx _ctx;
Marc Nijdam 3:475fae677f2d 121
Marc Nijdam 3:475fae677f2d 122 friend class Channel;
Marc Nijdam 3:475fae677f2d 123 };
Marc Nijdam 3:475fae677f2d 124
Marc Nijdam 3:475fae677f2d 125 /**
Marc Nijdam 3:475fae677f2d 126 * \class Channel
Marc Nijdam 3:475fae677f2d 127 *
Marc Nijdam 3:475fae677f2d 128 * \brief A Channel to an IoT platform.
Marc Nijdam 3:475fae677f2d 129 *
Marc Nijdam 3:475fae677f2d 130 * Channels represent a delivery mechanism from the device to a number
Marc Nijdam 3:475fae677f2d 131 * of supported back-end IoT platforms.
Marc Nijdam 3:475fae677f2d 132 *
Marc Nijdam 3:475fae677f2d 133 * To use a channel, make sure you have it set up in your Helium
Marc Nijdam 3:475fae677f2d 134 * Dashboard and then call Channel#begin with the channel name as you
Marc Nijdam 3:475fae677f2d 135 * configured it on the Helium Dashboard. This will automatically
Marc Nijdam 3:475fae677f2d 136 * ensure that the device is securely authenticated and registered
Marc Nijdam 3:475fae677f2d 137 * with the channel.
Marc Nijdam 3:475fae677f2d 138 *
Marc Nijdam 3:475fae677f2d 139 */
Marc Nijdam 3:475fae677f2d 140 class Channel
Marc Nijdam 3:475fae677f2d 141 {
Marc Nijdam 3:475fae677f2d 142 public:
Marc Nijdam 3:475fae677f2d 143 /** Construct a channel.
Marc Nijdam 3:475fae677f2d 144 *
Marc Nijdam 3:475fae677f2d 145 * @param helium The Helium Atom to communicate with
Marc Nijdam 3:475fae677f2d 146 */
Marc Nijdam 3:475fae677f2d 147 Channel(Helium * helium);
Marc Nijdam 3:475fae677f2d 148
Marc Nijdam 3:475fae677f2d 149 /** Begin communicating over a channel
Marc Nijdam 3:475fae677f2d 150 *
Marc Nijdam 3:475fae677f2d 151 * Always call this method before calling Channel#send. Beginning
Marc Nijdam 3:475fae677f2d 152 * communication will ensure that the device is authenticated and
Marc Nijdam 3:475fae677f2d 153 * registered with the channel with the given name as configured
Marc Nijdam 3:475fae677f2d 154 * in the Helium Dashboard.
Marc Nijdam 3:475fae677f2d 155 *
Marc Nijdam 3:475fae677f2d 156 * The `result` value will be 0 if the channel was created
Marc Nijdam 3:475fae677f2d 157 * successfully and non-`0` otherwise.
Marc Nijdam 3:475fae677f2d 158 *
Marc Nijdam 3:475fae677f2d 159 * @param name The name of the channel to authenticate with.
Marc Nijdam 3:475fae677f2d 160 * @param result An out parameter for the result of the request.
Marc Nijdam 3:475fae677f2d 161 */
Marc Nijdam 3:475fae677f2d 162 int begin(const char * name, int8_t * result);
Marc Nijdam 3:475fae677f2d 163
Marc Nijdam 3:475fae677f2d 164 /** Send data to this channel.
Marc Nijdam 3:475fae677f2d 165 *
Marc Nijdam 3:475fae677f2d 166 * Send data to a given channel. The given data is sent to the
Marc Nijdam 3:475fae677f2d 167 * configured channel and the result as returned by the channel is
Marc Nijdam 3:475fae677f2d 168 * put in the `result` output variable. The result value is `0`
Marc Nijdam 3:475fae677f2d 169 * for success and non-`0` if an error occurred.
Marc Nijdam 3:475fae677f2d 170 *
Marc Nijdam 3:475fae677f2d 171 * @note The maximum number of bytes that can be transmitted is
Marc Nijdam 3:475fae677f2d 172 * limited to HELIUM_MAX_DATA_SIZE (about 100 bytes).
Marc Nijdam 3:475fae677f2d 173 *
Marc Nijdam 3:475fae677f2d 174 * @param data The data bytes to send
Marc Nijdam 3:475fae677f2d 175 * @param len The number of bytes in data to send
Marc Nijdam 3:475fae677f2d 176 * @param result An out parameter for the result returned by the channel
Marc Nijdam 3:475fae677f2d 177 */
Marc Nijdam 3:475fae677f2d 178 int send(void const * data, size_t len, int8_t * result);
Marc Nijdam 3:475fae677f2d 179
Marc Nijdam 3:475fae677f2d 180 /** Asynchronous begin method.
Marc Nijdam 3:475fae677f2d 181 *
Marc Nijdam 3:475fae677f2d 182 * The Channel#begin(const char *) method is a synchronous version
Marc Nijdam 3:475fae677f2d 183 * of this method. Sending a request to a channel returns a
Marc Nijdam 3:475fae677f2d 184 * `token` which can be used in a subsequent call to #poll() to
Marc Nijdam 3:475fae677f2d 185 * check for results from the remote channel.
Marc Nijdam 3:475fae677f2d 186 *
Marc Nijdam 3:475fae677f2d 187 * @param name The name of the channel to authenticate with.
Marc Nijdam 3:475fae677f2d 188 * @param token The output parameter for the pending result token.
Marc Nijdam 3:475fae677f2d 189 */
Marc Nijdam 3:475fae677f2d 190 int begin(const char * name, uint16_t * token);
Marc Nijdam 3:475fae677f2d 191
Marc Nijdam 3:475fae677f2d 192 /** Asynchornous send method.
Marc Nijdam 3:475fae677f2d 193 *
Marc Nijdam 3:475fae677f2d 194 * This is the asynchronous version of the #send(void const *data,
Marc Nijdam 3:475fae677f2d 195 * size_t int8_t *) method.
Marc Nijdam 3:475fae677f2d 196 *
Marc Nijdam 3:475fae677f2d 197 * @param data The data bytes to send
Marc Nijdam 3:475fae677f2d 198 * @param len The number of bytes in data to send
Marc Nijdam 3:475fae677f2d 199 * @param token The output parameter for the pending result token
Marc Nijdam 3:475fae677f2d 200 */
Marc Nijdam 3:475fae677f2d 201 int send(void const * data, size_t len, uint16_t * token);
Marc Nijdam 3:475fae677f2d 202
Marc Nijdam 3:475fae677f2d 203 /** Poll for a result token.
Marc Nijdam 3:475fae677f2d 204 *
Marc Nijdam 3:475fae677f2d 205 * This polls the Helium Atom for the given number of retries for
Marc Nijdam 3:475fae677f2d 206 * the result of a given `token`. Use HELIUM_POLL_RETRIES_5S for
Marc Nijdam 3:475fae677f2d 207 * the recommended number of retries.
Marc Nijdam 3:475fae677f2d 208 *
Marc Nijdam 3:475fae677f2d 209 * If succcessful the result will be helium_status_OK and the
Marc Nijdam 3:475fae677f2d 210 * result value will be set to the result of the original request
Marc Nijdam 3:475fae677f2d 211 * that the token represents.
Marc Nijdam 3:475fae677f2d 212 *
Marc Nijdam 3:475fae677f2d 213 * @param token The token to check for
Marc Nijdam 3:475fae677f2d 214 * @param result The out parameter for the result of the given request token
Marc Nijdam 3:475fae677f2d 215 * @param retries The number of times to retry
Marc Nijdam 3:475fae677f2d 216 */
Marc Nijdam 3:475fae677f2d 217 int poll(uint16_t token, int8_t * result, uint32_t retries);
Marc Nijdam 3:475fae677f2d 218
Marc Nijdam 3:475fae677f2d 219 private:
Marc Nijdam 3:475fae677f2d 220 Helium * _helium;
Marc Nijdam 3:475fae677f2d 221 int8_t _channel_id;
Marc Nijdam 3:475fae677f2d 222 };
Marc Nijdam 3:475fae677f2d 223
Marc Nijdam 3:475fae677f2d 224 #endif // HELIUM_H
Marc Nijdam 3:475fae677f2d 225
Marc Nijdam 3:475fae677f2d 226 /** @example Basic.cpp
Marc Nijdam 3:475fae677f2d 227 *
Marc Nijdam 3:475fae677f2d 228 * shows a basic example of how to construct Helium, an MQTT channel
Marc Nijdam 3:475fae677f2d 229 * and transmitting data to that channel
Marc Nijdam 3:475fae677f2d 230 */