Skip to content
This repository has been archived by the owner on May 24, 2019. It is now read-only.

Cleaner .h/.cpp, overloaded for WiFi parameters #59

Merged
merged 5 commits into from
Dec 14, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 42 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,17 +40,6 @@ If you select `WIFI_ESP8266`, `WIFI_IDW0XX1`, `WIFI_ODIN` or `WIFI_RTW`, you als
"help": "options are ETHERNET, WIFI_ESP8266, WIFI_IDW0XX1, WIFI_ODIN, WIFI_RTW, MESH_LOWPAN_ND, MESH_THREAD, CELLULAR_ONBOARD",
"value": "WIFI_ESP8266"
},
"esp8266-tx": {
"help": "Pin used as TX (connects to ESP8266 RX)",
"value": "PTD3"
},
"esp8266-rx": {
"help": "Pin used as RX (connects to ESP8266 TX)",
"value": "PTD2"
},
"esp8266-debug": {
"value": true
},
"wifi-ssid": {
"value": "\"SSID\""
},
Expand Down Expand Up @@ -127,6 +116,48 @@ int main(int, char**) {
}
```

## Using Easy connect with WiFi

The easy-connect `easy_connect()` is overloaded now for WiFi so that you can submit your WiFi SSID and password programmatically in you want
the user to be able to supply them via some means.

```cpp
#include "easy-connect.h"

int main(int, char**) {
char* wifi_SSID = "SSID";
char* wifi_password = "password";

NetworkInterface* network = easy_connect(true, wifi_SSID, wifi_password);
if (!network) {
printf("Connecting to the network failed... See serial output.\r\n");
return 1;
}

// Rest of your program
}
```

## Overriding settings

Easy-connect was changed recently with [PR #59](https://github.com/ARMmbed/easy-connect/pull/59) - where some of the defines expected via `mbed_app.json` were
moved to the [`mbed_lib.json`](https://github.com/ARMmbed/easy-connect/blob/master/mbed_lib.json).
This minimises the amount of lines needed (in typical cases) in the applications `mbed_app.json`. However, due to this the overrides
need to be done slightly differently, as you need to override the `easy-connect` defines.

So, for example changing the ESP8266 TX/RX pins and enable debugs - you would now have modify as below.

```json
"target_overrides": {
"*": {
"easy-connect.wifi-esp8266-tx": "A1",
"easy-connect.wifi-esp8266-rx": "A2",
"easy-connect.wifi-esp8266-debug: true
}
}
```


## Configuration examples

There are many things that you have to modify for all of the combinations. Examples for configurations are available for example in the [mbed-os-example-client](https://github.com/ARMmbed/mbed-os-example-client/tree/master/configs) repository.
Expand Down
292 changes: 292 additions & 0 deletions easy-connect.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,292 @@
/*
* FILE: easy-connect.cpp
*
* Copyright (c) 2015 - 2017 ARM Limited. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
* Licensed under the Apache License, Version 2.0 (the License); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#include "mbed.h"
#include "easy-connect.h"

/*
* Instantiate the configured network interface
*/
#if MBED_CONF_APP_NETWORK_INTERFACE == WIFI_ESP8266
#include "ESP8266Interface.h"
#define EASY_CONNECT_WIFI_TYPE "ESP8266"

#ifdef MBED_CONF_APP_ESP8266_DEBUG
ESP8266Interface wifi(MBED_CONF_EASY_CONNECT_WIFI_ESP8266_TX, MBED_CONF_EASY_CONNECT_WIFI_ESP8266_RX, MBED_CONF_EASY_CONNECT_WIFI_ESP8266_DEBUG);
#else
ESP8266Interface wifi(MBED_CONF_EASY_CONNECT_WIFI_ESP8266_TX, MBED_CONF_EASY_CONNECT_WIFI_ESP8266_RX);
#endif

#elif MBED_CONF_APP_NETWORK_INTERFACE == WIFI_ODIN
#define EASY_CONNECT_WIFI_TYPE "Odin"
#include "OdinWiFiInterface.h"
OdinWiFiInterface wifi;

#elif MBED_CONF_APP_NETWORK_INTERFACE == WIFI_RTW
#define EASY_CONNECT_WIFI_TYPE "RTW"
#include "RTWInterface.h"
RTWInterface wifi;

#elif MBED_CONF_APP_NETWORK_INTERFACE == WIFI_IDW0XX1
#if MBED_CONF_IDW0XX1_EXPANSION_BOARD == IDW01M1
#define EASY_CONNECT_WIFI_TYPE "IDW01M1"
#include "SpwfSAInterface.h"
SpwfSAInterface wifi(MBED_CONF_EASY_CONNECT_WIFI_IDW01M1_TX, MBED_CONF_EASY_CONNECT_WIFI_IDW01M1_RX);
#endif // MBED_CONF_IDW0XX1_EXPANSION_BOARD == IDW01M1

#if MBED_CONF_IDW0XX1_EXPANSION_BOARD == IDW01A1
#define EASY_CONNECT_WIFI_TYPE "IDW01A1"
#include "SpwfSAInterface.h"
SpwfSAInterface wifi(MBED_CONF_EASY_CONNECT_WIFI_IDW01A1_TX, MBED_CONF_EASY_CONNECT_WIFI_IDW01A1_RX);
#endif // MBED_CONF_IDW0XX1_EXPANSION_BOARD == IDW01A1

#elif MBED_CONF_APP_NETWORK_INTERFACE == ETHERNET
#include "EthernetInterface.h"
EthernetInterface eth;

#elif MBED_CONF_APP_NETWORK_INTERFACE == MESH_LOWPAN_ND
#define EASY_CONNECT_MESH
#include "NanostackInterface.h"
LoWPANNDInterface mesh;

#elif MBED_CONF_APP_NETWORK_INTERFACE == MESH_THREAD
#define EASY_CONNECT_MESH
#include "NanostackInterface.h"
ThreadInterface mesh;

#elif MBED_CONF_APP_NETWORK_INTERFACE == CELLULAR_ONBOARD
#include "OnboardCellularInterface.h"
OnboardCellularInterface cellular;

#else
#error "No connectivity method chosen. Please add 'config.network-interfaces.value' to your mbed_app.json (see README.md for more information)."
#endif // MBED_CONF_APP_NETWORK_INTERFACE

/*
* In case of Mesh, instantiate the configured RF PHY.
*/
#if defined (EASY_CONNECT_MESH)
#if MBED_CONF_APP_MESH_RADIO_TYPE == ATMEL
#include "NanostackRfPhyAtmel.h"
#define EASY_CONNECT_MESH_TYPE "Atmel"
NanostackRfPhyAtmel rf_phy(ATMEL_SPI_MOSI, ATMEL_SPI_MISO, ATMEL_SPI_SCLK, ATMEL_SPI_CS,
ATMEL_SPI_RST, ATMEL_SPI_SLP, ATMEL_SPI_IRQ, ATMEL_I2C_SDA, ATMEL_I2C_SCL);

#elif MBED_CONF_APP_MESH_RADIO_TYPE == MCR20
#include "NanostackRfPhyMcr20a.h"
#define EASY_CONNECT_MESH_TYPE "Mcr20A"
NanostackRfPhyMcr20a rf_phy(MCR20A_SPI_MOSI, MCR20A_SPI_MISO, MCR20A_SPI_SCLK, MCR20A_SPI_CS, MCR20A_SPI_RST, MCR20A_SPI_IRQ);

#elif MBED_CONF_APP_MESH_RADIO_TYPE == SPIRIT1
#include "NanostackRfPhySpirit1.h"
#define EASY_CONNECT_MESH_TYPE "Spirit1"
NanostackRfPhySpirit1 rf_phy(SPIRIT1_SPI_MOSI, SPIRIT1_SPI_MISO, SPIRIT1_SPI_SCLK,
SPIRIT1_DEV_IRQ, SPIRIT1_DEV_CS, SPIRIT1_DEV_SDN, SPIRIT1_BRD_LED);

#elif MBED_CONF_APP_MESH_RADIO_TYPE == EFR32
#include "NanostackRfPhyEfr32.h"
#define EASY_CONNECT_MESH_TYPE "EFR32"
NanostackRfPhyEfr32 rf_phy;

#endif // MBED_CONF_APP_RADIO_TYPE
#endif // EASY_CONNECT_MESH

#if defined (EASY_CONNECT_WIFI)
#define WIFI_SSID_MAX_LEN 32 // As per IEEE 802.11 chapter 7.3.2.1 (SSID element)
#define WIFI_PASSWORD_MAX_LEN 64 //

char* _ssid = NULL;
char* _password = NULL;
#endif // EASY_CONNECT_WIFI

/* \brief print_MAC - print_MAC - helper function to print out MAC address
* in: network_interface - pointer to network i/f
* bool log-messages print out logs or not
* MAC address is print, if it can be acquired & log_messages is true.
*
*/
void print_MAC(NetworkInterface* network_interface, bool log_messages) {
#if MBED_CONF_APP_NETWORK_INTERFACE != CELLULAR_ONBOARD
const char *mac_addr = network_interface->get_mac_address();
if (mac_addr == NULL) {
if (log_messages) {
printf("[EasyConnect] ERROR - No MAC address\n");
}
return;
}
if (log_messages) {
printf("[EasyConnect] MAC address %s\n", mac_addr);
}
#endif
}



/* \brief easy_connect easy_connect() function to connect the pre-defined network bearer,
* config done via mbed_app.json (see README.md for details).
* IN: bool log_messages print out diagnostics or not.
*/
NetworkInterface* easy_connect(bool log_messages) {
NetworkInterface* network_interface = NULL;
int connect_success = -1;

#if defined (EASY_CONNECT_WIFI)
// We check if the _ssid and _password have already been set (via the easy_connect()
// that takes thoses parameters or not.
// If they have not been set, use the ones we can gain from mbed_app.json.
if (_ssid == NULL) {
if(strlen(MBED_CONF_APP_WIFI_SSID) > WIFI_SSID_MAX_LEN) {
printf("ERROR - MBED_CONF_APP_WIFI_SSID is too long %d vs. %d\n",
strlen(MBED_CONF_APP_WIFI_SSID),
WIFI_SSID_MAX_LEN);
return NULL;
}
}

if (_password == NULL) {
if(strlen(MBED_CONF_APP_WIFI_PASSWORD) > WIFI_PASSWORD_MAX_LEN) {
printf("ERROR - MBED_CONF_APP_WIFI_PASSWORD is too long %d vs. %d\n",
strlen(MBED_CONF_APP_WIFI_PASSWORD),
WIFI_PASSWORD_MAX_LEN);
return NULL;
}
}
#endif // EASY_CONNECT_WIFI

/// This should be removed once mbedOS supports proper dual-stack
#if defined (EASY_CONNECT_MESH) || (MBED_CONF_LWIP_IPV6_ENABLED==true)
printf("[EasyConnect] IPv6 mode\n");
#else
printf("[EasyConnect] IPv4 mode\n");
#endif

#if defined (EASY_CONNECT_WIFI)
if (log_messages) {
printf("[EasyConnect] Using WiFi (%s) \n", EASY_CONNECT_WIFI_TYPE);
printf("[EasyConnect] Connecting to WiFi %s\n",
((_ssid == NULL) ? MBED_CONF_APP_WIFI_SSID : _ssid) );
}
network_interface = &wifi;
if (_ssid == NULL) {
connect_success = wifi.connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD,
(strlen(MBED_CONF_APP_WIFI_PASSWORD) > 1) ? NSAPI_SECURITY_WPA_WPA2 : NSAPI_SECURITY_NONE);
}
else {
connect_success = wifi.connect(_ssid, _password, (strlen(_password) > 1) ? NSAPI_SECURITY_WPA_WPA2 : NSAPI_SECURITY_NONE);
}
#elif MBED_CONF_APP_NETWORK_INTERFACE == CELLULAR_ONBOARD
# ifdef MBED_CONF_APP_CELLULAR_SIM_PIN
cellular.set_sim_pin(MBED_CONF_APP_CELLULAR_SIM_PIN);
# endif
# ifdef MBED_CONF_APP_CELLULAR_APN
# ifndef MBED_CONF_APP_CELLULAR_USERNAME
# define MBED_CONF_APP_CELLULAR_USERNAME 0
# endif
# ifndef MBED_CONF_APP_CELLULAR_PASSWORD
# define MBED_CONF_APP_CELLULAR_PASSWORD 0
# endif
cellular.set_credentials(MBED_CONF_APP_CELLULAR_APN, MBED_CONF_APP_CELLULAR_USERNAME, MBED_CONF_APP_CELLULAR_PASSWORD);
if (log_messages) {
printf("[EasyConnect] Connecting using Cellular interface and APN %s\n", MBED_CONF_APP_CELLULAR_APN);
}
# else
if (log_messages) {
printf("[EasyConnect] Connecting using Cellular interface and default APN\n");
}
# endif
connect_success = cellular.connect();
network_interface = &cellular;
#elif MBED_CONF_APP_NETWORK_INTERFACE == ETHERNET
if (log_messages) {
printf("[EasyConnect] Using Ethernet\n");
}
network_interface = ð
connect_success = eth.connect();
#endif

#ifdef EASY_CONNECT_MESH
if (log_messages) {
printf("[EasyConnect] Using Mesh (%s)\n", EASY_CONNECT_MESH_TYPE);
printf("[EasyConnect] Connecting to Mesh...\n");
}
network_interface = &mesh;
mesh.initialize(&rf_phy);
connect_success = mesh.connect();
#endif
if(connect_success == 0) {
if (log_messages) {
printf("[EasyConnect] Connected to Network successfully\n");
print_MAC(network_interface, log_messages);
}
} else {
if (log_messages) {
print_MAC(network_interface, log_messages);
printf("[EasyConnect] Connection to Network Failed %d!\n", connect_success);
}
return NULL;
}
const char *ip_addr = network_interface->get_ip_address();
if (ip_addr == NULL) {
if (log_messages) {
printf("[EasyConnect] ERROR - No IP address\n");
}
return NULL;
}

if (log_messages) {
printf("[EasyConnect] IP address %s\n", ip_addr);
}
return network_interface;
}

/* \brief easy_connect - easy_connect function to connect the pre-defined network bearer,
* config done via mbed_app.json (see README.md for details).
* This version is just a helper version and uses the easy_connect() with
* one parameters to do it's job.
* IN: bool log_messages print out diagnostics or not.
* char* WiFiSSID WiFi SSID - pointer to WiFi SSID, but if it is NULL
* then MBED_CONF_APP_WIFI_SSID will be used
* char* WiFiPassword WiFi Password - pointer to WiFI password, but if it's NULL
* then MBED_CONF_APP_WIFI_PASSWORD will be used
*/

NetworkInterface* easy_connect(bool log_messages,
char* WiFiSSID,
char* WiFiPassword ) {

// This functionality only makes sense when using WiFi
#if defined (EASY_CONNECT_WIFI)
// We essentially want to populate the _ssid and _password and then call easy_connect() again.
if (WiFiSSID != NULL) {
if(strlen(WiFiSSID) > WIFI_SSID_MAX_LEN) {
printf("ERROR - WiFi SSID is too long - %d vs %d.\n", strlen(WiFiSSID), WIFI_SSID_MAX_LEN);
return NULL;
}
_ssid = WiFiSSID;
}

if (WiFiPassword != NULL) {
if(strlen(WiFiPassword) > WIFI_PASSWORD_MAX_LEN) {
printf("ERROR - WiFi Password is too long - %d vs %d\n", strlen(WiFiPassword), WIFI_PASSWORD_MAX_LEN);
return NULL;
}
_password = WiFiPassword;
}
#endif // EASY_CONNECT_WIFI
return easy_connect(log_messages);
}
Loading