Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of HelloMQTT by
Revision 24:fbc6e751e923, committed 2018-04-15
- Comitter:
- yuyangworld
- Date:
- Sun Apr 15 18:03:48 2018 +0000
- Parent:
- 23:e38aaf532823
- Commit message:
- TEST
Changed in this revision
--- a/C12832.lib Tue Jan 16 13:41:29 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -https://mbed.org/teams/components/code/C12832/#03069e3deaa4
--- a/Linux-example/LinuxIPStack.h Tue Jan 16 13:41:29 2018 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,119 +0,0 @@
-#if !defined(LINUX_IPSTACK_H)
-#define LINUX_IPSTACK_H
-
-class IPStack
-{
-public:
- IPStack()
- {
-
- }
-
- int Socket_error(const char* aString)
- {
-
- if (errno != EINTR && errno != EAGAIN && errno != EINPROGRESS && errno != EWOULDBLOCK)
- {
- if (strcmp(aString, "shutdown") != 0 || (errno != ENOTCONN && errno != ECONNRESET))
- printf("Socket error %s in %s for socket %d\n", strerror(errno), aString, mysock);
- }
- return errno;
- }
-
- int connect(const char* hostname, int port)
- {
- int type = SOCK_STREAM;
- struct sockaddr_in address;
- int rc = -1;
- sa_family_t family = AF_INET;
- struct addrinfo *result = NULL;
- struct addrinfo hints = {0, AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP, 0, NULL, NULL, NULL};
-
- if ((rc = getaddrinfo(hostname, NULL, &hints, &result)) == 0)
- {
- struct addrinfo* res = result;
-
- /* prefer ip4 addresses */
- while (res)
- {
- if (res->ai_family == AF_INET)
- {
- result = res;
- break;
- }
- res = res->ai_next;
- }
-
- if (result->ai_family == AF_INET)
- {
- address.sin_port = htons(port);
- address.sin_family = family = AF_INET;
- address.sin_addr = ((struct sockaddr_in*)(result->ai_addr))->sin_addr;
- }
- else
- rc = -1;
-
- freeaddrinfo(result);
- }
-
- if (rc == 0)
- {
- mysock = socket(family, type, 0);
- if (mysock != -1)
- {
- int opt = 1;
-
- //if (setsockopt(mysock, SOL_SOCKET, SO_NOSIGPIPE, (void*)&opt, sizeof(opt)) != 0)
- // printf("Could not set SO_NOSIGPIPE for socket %d", mysock);
-
- rc = ::connect(mysock, (struct sockaddr*)&address, sizeof(address));
- }
- }
-
- return rc;
- }
-
- int read(char* buffer, int len, int timeout_ms)
- {
- struct timeval interval = {timeout_ms / 1000, (timeout_ms % 1000) * 1000};
- if (interval.tv_sec < 0 || (interval.tv_sec == 0 && interval.tv_usec <= 0))
- {
- interval.tv_sec = 0;
- interval.tv_usec = 100;
- }
-
- setsockopt(mysock, SOL_SOCKET, SO_RCVTIMEO, (char *)&interval, sizeof(struct timeval));
-
- //printf("reading %d bytes\n", len);
- int rc = ::recv(mysock, buffer, (size_t)len, 0);
- if (rc == -1)
- Socket_error("read");
- //printf("read %d bytes\n", rc);
- return rc;
- }
-
- int write(char* buffer, int len, int timeout)
- {
- struct timeval tv;
-
- tv.tv_sec = 0; /* 30 Secs Timeout */
- tv.tv_usec = timeout * 1000; // Not init'ing this can cause strange errors
-
- setsockopt(mysock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv,sizeof(struct timeval));
- int rc = ::write(mysock, buffer, len);
- //printf("write rc %d\n", rc);
- return rc;
- }
-
- int disconnect()
- {
- return ::close(mysock);
- }
-
-private:
-
- int mysock;
-
-};
-
-#endif
\ No newline at end of file
--- a/Linux-example/LinuxMQTT.h Tue Jan 16 13:41:29 2018 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-#if !defined(LINUXMQTT_H)
-#define LINUXMQTT_H
-
-class Countdown
-{
-public:
- Countdown()
- {
-
- }
-
- Countdown(int ms)
- {
- countdown_ms(ms);
- }
-
-
- bool expired()
- {
- struct timeval now, res;
- gettimeofday(&now, NULL);
- timersub(&end_time, &now, &res);
- //printf("left %d ms\n", (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000);
- //if (res.tv_sec > 0 || res.tv_usec > 0)
- // printf("expired %d %d\n", res.tv_sec, res.tv_usec);
- return res.tv_sec < 0 || (res.tv_sec == 0 && res.tv_usec <= 0);
- }
-
-
- void countdown_ms(int ms)
- {
- struct timeval now;
- gettimeofday(&now, NULL);
- struct timeval interval = {ms / 1000, (ms % 1000) * 1000};
- //printf("interval %d %d\n", interval.tv_sec, interval.tv_usec);
- timeradd(&now, &interval, &end_time);
- }
-
-
- void countdown(int seconds)
- {
- struct timeval now;
- gettimeofday(&now, NULL);
- struct timeval interval = {seconds, 0};
- timeradd(&now, &interval, &end_time);
- }
-
-
- int left_ms()
- {
- struct timeval now, res;
- gettimeofday(&now, NULL);
- timersub(&end_time, &now, &res);
- //printf("left %d ms\n", (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000);
- return (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000;
- }
-
-private:
-
- struct timeval end_time;
-};
-
-
-#endif
\ No newline at end of file
--- a/Linux-example/linux-main.cpp Tue Jan 16 13:41:29 2018 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2014 IBM Corp.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * and Eclipse Distribution License v1.0 which accompany this distribution.
- *
- * The Eclipse Public License is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- * Ian Craggs - initial API and implementation and/or initial documentation
- *******************************************************************************/
-
- /**
- This is a sample program to illustrate the use of the MQTT Client library
- on Linux. The Client class requires two classes which mediate
- access to system interfaces for networking and timing. As long as these two
- classes provide the required public programming interfaces, it does not matter
- what facilities they use underneath. In this program, they use the Linux
- system libraries.
-
- */
-
-#if defined(LINUX)
-
-#include "LinuxMQTT.h"
-#include "LinuxIPStack.h"
-#include "MQTTClient.h"
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/select.h>
-#include <netinet/in.h>
-#include <netinet/tcp.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <errno.h>
-#include <fcntl.h>
-
-#include <stdlib.h>
-#include <string.h>
-#include <signal.h>
-
-#define DEFAULT_STACK_SIZE -1
-
-
-int arrivedcount = 0;
-
-void messageArrived(MQTT::Message* message)
-{
- printf("Message %d arrived: qos %d, retained %d, dup %d, packetid %d\n",
- ++arrivedcount, message->qos, message->retained, message->dup, message->id);
- printf("Payload %.*s\n", message->payloadlen, (char*)message->payload);
-}
-
-
-int connect(MQTT::Client<IPStack, Countdown>::connectionLostInfo* info)
-{
- const char* hostname = "localhost"; //"m2m.eclipse.org";
- int port = 1883;
- printf("Connecting to %s:%d\n", hostname, port);
- int rc = info->network->connect(hostname, port);
- if (rc != 0)
- printf("rc from TCP connect is %d\n", rc);
-
- MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
- data.MQTTVersion = 3;
- data.clientID.cstring = (char*)"mbed-icraggs";
- rc = info->client->connect(&data);
- if (rc != 0)
- printf("rc from MQTT connect is %d\n", rc);
-
- return rc;
-}
-
-
-int main(int argc, char* argv[])
-{
- IPStack ipstack = IPStack();
- float version = 0.3;
- const char* topic = "mbed-sample";
-
- printf("Version is %f\n", version);
-
- MQTT::Client<IPStack, Countdown> client = MQTT::Client<IPStack, Countdown>(ipstack);
-
- client.setConnectionLostHandler(connect);
-
- MQTT::Client<IPStack, Countdown>::connectionLostInfo info = {&client, &ipstack};
- int rc = connect(&info);
-
- rc = client.subscribe(topic, MQTT::QOS2, messageArrived);
- if (rc != 0)
- printf("rc from MQTT subscribe is %d\n", rc);
-
- MQTT::Message message;
-
- // QoS 0
- char buf[100];
- sprintf(buf, "Hello World! QoS 0 message from app version %f", version);
- message.qos = MQTT::QOS0;
- message.retained = false;
- message.dup = false;
- message.payload = (void*)buf;
- message.payloadlen = strlen(buf)+1;
- rc = client.publish(topic, &message);
- while (arrivedcount == 0)
- client.yield(100);
-
- // QoS 1
- printf("Now QoS 1\n");
- sprintf(buf, "Hello World! QoS 1 message from app version %f", version);
- message.qos = MQTT::QOS1;
- message.payloadlen = strlen(buf)+1;
- rc = client.publish(topic, &message);
- while (arrivedcount == 1)
- client.yield(100);
-
- // QoS 2
- sprintf(buf, "Hello World! QoS 2 message from app version %f", version);
- message.qos = MQTT::QOS2;
- message.payloadlen = strlen(buf)+1;
- rc = client.publish(topic, &message);
- while (arrivedcount == 2)
- client.yield(100);
-
- rc = client.unsubscribe(topic);
- if (rc != 0)
- printf("rc from unsubscribe was %d\n", rc);
-
- rc = client.disconnect();
- if (rc != 0)
- printf("rc from disconnect was %d\n", rc);
-
- ipstack.disconnect();
-
- printf("Finishing with %d messages received\n", arrivedcount);
-
- return 0;
-}
-
-#endif
--- a/easy-connect.lib Tue Jan 16 13:41:29 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -https://github.com/ARMmbed/easy-connect/#cb933fb19cda0a733a64d6b71d271fb6bdaf9e6d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/easy-connect/README.md Sun Apr 15 18:03:48 2018 +0000
@@ -0,0 +1,90 @@
+# Easy Connect - Easily add all supported connectivity methods to your mbed OS project
+
+Often you want to give users of your application the choice to switch between connectivity methods. The `NetworkInterface` API makes this easy, but you'll still need a mechanism for the user to chooce the method, throw in some `#define`'s, etc. Easy Connect handles all this for you. Just declare the desired connectivity method in your `mbed_app.json` file, and call `easy_connect()` from your application.
+
+## Specifying connectivity method
+
+Add the following to your ``mbed_app.json`` file:
+
+```json
+{
+ "config": {
+ "network-interface":{
+ "help": "options are ETHERNET,WIFI_ESP8266,MESH_LOWPAN_ND,MESH_THREAD",
+ "value": "ETHERNET"
+ }
+ },
+ "target_overrides": {
+ "*": {
+ "target.features_add": ["NANOSTACK", "LOWPAN_ROUTER", "COMMON_PAL"],
+ "mbed-mesh-api.6lowpan-nd-channel-page": 0,
+ "mbed-mesh-api.6lowpan-nd-channel": 12
+ }
+ }
+}
+```
+
+If you choose `WIFI_ESP8266`, you'll also need to add the WiFi SSID and password:
+
+```json
+ "config": {
+ "network-interface":{
+ "help": "options are ETHERNET,WIFI_ESP8266,MESH_LOWPAN_ND,MESH_THREAD",
+ "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-ssid": {
+ "value": "\"SSID\""
+ },
+ "esp8266-password": {
+ "value": "\"Password\""
+ },
+ "esp8266-debug": {
+ "value": true
+ }
+ }
+```
+
+If you use `MESH_LOWPAN_ND` or `MESH_THREAD` you will need to specify your radio module:
+
+```json
+ "config": {
+ "network-interface":{
+ "help": "options are ETHERNET,WIFI_ESP8266,MESH_LOWPAN_ND,MESH_THREAD",
+ "value": "MESH_LOWPAN_ND"
+ },
+ "mesh_radio_type": {
+ "help": "options are ATMEL, MCR20",
+ "value": "ATMEL"
+ }
+ }
+```
+
+## Using Easy Connect from your application
+
+Easy Connect has just one function which will either return a `NetworkInterface`-pointer or `NULL`:
+
+```cpp
+#include "easy-connect.h"
+
+int main(int, char**) {
+ NetworkInterface* network = easy_connect(true); /* has 1 argument, enable_logging (pass in true to log to serial port) */
+ if (!network) {
+ printf("Connecting to the network failed... See serial output.\r\n");
+ return 1;
+ }
+
+ // Rest of your program
+}
+```
+
+## Extra defines
+
+If you'd like to use Easy Connect with mbed Client then you're in luck. Easy Connect automatically defines the `MBED_SERVER_ADDRESS` macro depending on your connectivity method (either IPv4 or IPv6 address). Use this address to connect to the right instance of mbed Device Connector.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver.lib Sun Apr 15 18:03:48 2018 +0000 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/atmel-rf-driver/#62c0c49d7a948e56988a35c68ccc6bc56171c83a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/easy-connect/easy-connect.h Sun Apr 15 18:03:48 2018 +0000
@@ -0,0 +1,102 @@
+#ifndef __MAGIC_CONNECT_H__
+#define __MAGIC_CONNECT_H__
+
+#include "mbed.h"
+
+Serial output(USBTX, USBRX);
+
+#define ETHERNET 1
+#define WIFI_ESP8266 2
+#define MESH_LOWPAN_ND 3
+#define MESH_THREAD 4
+
+#if MBED_CONF_APP_NETWORK_INTERFACE == WIFI_ESP8266
+#include "ESP8266Interface.h"
+
+#ifdef MBED_CONF_APP_ESP8266_DEBUG
+ESP8266Interface esp(MBED_CONF_APP_ESP8266_TX, MBED_CONF_APP_ESP8266_RX, MBED_CONF_APP_ESP8266_DEBUG);
+#else
+ESP8266Interface esp(MBED_CONF_APP_ESP8266_TX, MBED_CONF_APP_ESP8266_RX);
+#endif
+
+#elif MBED_CONF_APP_NETWORK_INTERFACE == ETHERNET
+#include "EthernetInterface.h"
+EthernetInterface eth;
+#elif MBED_CONF_APP_NETWORK_INTERFACE == MESH_LOWPAN_ND
+#define MESH
+#include "NanostackInterface.h"
+LoWPANNDInterface mesh;
+#elif MBED_CONF_APP_NETWORK_INTERFACE == MESH_THREAD
+#define MESH
+#include "NanostackInterface.h"
+ThreadInterface mesh;
+#else
+#error "No connectivity method chosen. Please add 'config.network-interfaces.value' to your mbed_app.json (see README.md for more information)."
+#endif
+
+#if defined(MESH)
+#if MBED_CONF_APP_MESH_RADIO_TYPE == ATMEL
+#include "NanostackRfPhyAtmel.h"
+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"
+NanostackRfPhyMcr20a rf_phy(MCR20A_SPI_MOSI, MCR20A_SPI_MISO, MCR20A_SPI_SCLK, MCR20A_SPI_CS, MCR20A_SPI_RST, MCR20A_SPI_IRQ);
+#endif //MBED_CONF_APP_RADIO_TYPE
+#endif //MESH
+
+#ifndef MESH
+// This is address to mbed Device Connector
+#define MBED_SERVER_ADDRESS "coap://api.connector.mbed.com:5684"
+#else
+// This is address to mbed Device Connector
+#define MBED_SERVER_ADDRESS "coaps://[2607:f0d0:2601:52::20]:5684"
+#endif
+
+NetworkInterface* easy_connect(bool log_messages = false) {
+ NetworkInterface* network_interface = 0;
+ int connect_success = -1;
+#if MBED_CONF_APP_NETWORK_INTERFACE == WIFI_ESP8266
+ if (log_messages) {
+ output.printf("[EasyConnect] Using WiFi (ESP8266) \r\n");
+ output.printf("[EasyConnect] Connecting to WiFi..\r\n");
+ }
+ connect_success = esp.connect(MBED_CONF_APP_ESP8266_SSID, MBED_CONF_APP_ESP8266_PASSWORD);
+ network_interface = &esp;
+#elif MBED_CONF_APP_NETWORK_INTERFACE == ETHERNET
+ if (log_messages) {
+ output.printf("[EasyConnect] Using Ethernet\r\n");
+ }
+ connect_success = eth.connect();
+ network_interface = ð
+#endif
+#ifdef MESH
+ if (log_messages) {
+ output.printf("[EasyConnect] Using Mesh\r\n");
+ output.printf("[EasyConnect] Connecting to Mesh..\r\n");
+ }
+ connect_success = mesh.connect();
+ network_interface = &mesh;
+#endif
+ if(connect_success == 0) {
+ if (log_messages) {
+ output.printf("[EasyConnect] Connected to Network successfully\r\n");
+ }
+ } else {
+ if (log_messages) {
+ output.printf("[EasyConnect] Connection to Network Failed %d!\r\n", connect_success);
+ }
+ return NULL;
+ }
+ if (log_messages) {
+ const char *ip_addr = network_interface->get_ip_address();
+ if (ip_addr) {
+ output.printf("[EasyConnect] IP address %s\r\n", ip_addr);
+ } else {
+ output.printf("[EasyConnect] No IP address\r\n");
+ }
+ }
+ return network_interface;
+}
+
+#endif // __MAGIC_CONNECT_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver.lib Sun Apr 15 18:03:48 2018 +0000 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/esp8266-driver/#86ed47c8bf40c86fdc569c7e678a8944f5e01c2a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/easy-connect/mbed_lib.json Sun Apr 15 18:03:48 2018 +0000
@@ -0,0 +1,9 @@
+{
+ "name": "easy-connect",
+ "target_overrides": {
+ "*": {
+ "target.features_add": ["COMMON_PAL"]
+ }
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver.lib Sun Apr 15 18:03:48 2018 +0000 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/mcr20a-rf-driver/#d8810e105d7d35315aa708ec51d821156cad45e9
