Skip to content

Commit fd084c6

Browse files
committed
Add CloudSerial and bridge stdout + stdin topics
1 parent 5e6e58f commit fd084c6

File tree

5 files changed

+183
-2
lines changed

5 files changed

+183
-2
lines changed

examples/MKR1000_Cloud_Blink/MKR1000_Cloud_Blink.ino

+10
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,19 @@ void setup() {
5757
}
5858

5959
Serial.println("Successfully connected to Arduino Cloud :)");
60+
61+
CloudSerial.begin(9600);
6062
}
6163

6264
void loop() {
6365
ArduinoCloud.poll();
66+
67+
if (CloudSerial.available()) {
68+
Serial.write(CloudSerial.read());
69+
}
70+
71+
if (Serial.available()) {
72+
CloudSerial.write(Serial.read());
73+
}
6474
}
6575

src/ArduinoCloud.cpp

+30
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
#include <utility/ECCX08.h>
44
#include <utility/ECCX08Cert.h>
55

6+
#include "CloudSerial.h"
7+
68
const static char server[] = "a19g5nbe27wn47.iot.eu-west-1.amazonaws.com"; //"xxxxxxxxxxxxxx.iot.xx-xxxx-x.amazonaws.com";
79

810
const static int keySlot = 0;
@@ -48,10 +50,14 @@ int ArduinoCloudClass::begin(Client& net, const String& id)
4850
_bearSslClient = new BearSSLClient(net);
4951
_bearSslClient->setEccSlot(keySlot, ECCX08Cert.bytes(), ECCX08Cert.length());
5052

53+
_mqttClient.onMessageAdvanced(ArduinoCloudClass::onMessage);
5154
_mqttClient.begin(server, 8883, *_bearSslClient);
5255

5356
_id = id;
5457

58+
_stdoutTopic = "$aws/things/" + _id + "/stdout";
59+
_stdinTopic = "$aws/things/" + _id + "/stdin";
60+
5561
return 1;
5662
}
5763

@@ -61,6 +67,8 @@ int ArduinoCloudClass::connect()
6167
return 0;
6268
}
6369

70+
_mqttClient.subscribe(_stdinTopic);
71+
6472
return 1;
6573
}
6674

@@ -74,4 +82,26 @@ void ArduinoCloudClass::onGetTime(unsigned long(*callback)(void))
7482
ArduinoBearSSL.onGetTime(callback);
7583
}
7684

85+
int ArduinoCloudClass::connected()
86+
{
87+
return _mqttClient.connected();
88+
}
89+
90+
int ArduinoCloudClass::writeStdout(const byte data[], int length)
91+
{
92+
return _mqttClient.publish(_stdoutTopic.c_str(), (const char*)data, length);
93+
}
94+
95+
void ArduinoCloudClass::onMessage(MQTTClient* /*client*/, char topic[], char bytes[], int length)
96+
{
97+
ArduinoCloud.handleMessage(topic, bytes, length);
98+
}
99+
100+
void ArduinoCloudClass::handleMessage(char topic[], char bytes[], int length)
101+
{
102+
if (_stdinTopic == topic) {
103+
CloudSerial.appendStdin((uint8_t*)bytes, length);
104+
}
105+
}
106+
77107
ArduinoCloudClass ArduinoCloud;

src/ArduinoCloudV2.h

+18-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
#ifndef ARDUINO_CLOUD_V2
2-
#define ARDUINO_CLOUD_V2
1+
#ifndef ARDUINO_CLOUD_V2_H
2+
#define ARDUINO_CLOUD_V2_H
33

44
#include <MQTTClient.h>
55
#include <ArduinoBearSSL.h>
66

7+
#include "CloudSerial.h"
8+
79
class ArduinoCloudClass {
810

911
public:
@@ -18,10 +20,24 @@ class ArduinoCloudClass {
1820

1921
void onGetTime(unsigned long(*)(void));
2022

23+
int connected();
24+
25+
protected:
26+
friend class CloudSerialClass;
27+
int writeStdout(const byte data[], int length);
28+
29+
private:
30+
static void onMessage(MQTTClient *client, char topic[], char bytes[], int length);
31+
32+
void handleMessage(char topic[], char bytes[], int length);
33+
2134
private:
2235
String _id;
2336
BearSSLClient* _bearSslClient;
2437
MQTTClient _mqttClient;
38+
39+
String _stdinTopic;
40+
String _stdoutTopic;
2541
};
2642

2743

src/CloudSerial.cpp

+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
#include "ArduinoCloudV2.h"
2+
3+
#include "CloudSerial.h"
4+
5+
CloudSerialClass::CloudSerialClass()
6+
{
7+
}
8+
9+
CloudSerialClass::~CloudSerialClass()
10+
{
11+
}
12+
13+
void CloudSerialClass::begin(int /*baud*/)
14+
{
15+
_rxBuffer.clear();
16+
}
17+
18+
void CloudSerialClass::end()
19+
{
20+
}
21+
22+
int CloudSerialClass::available()
23+
{
24+
ArduinoCloud.poll();
25+
26+
return _rxBuffer.available();
27+
}
28+
29+
int CloudSerialClass::availableForWrite()
30+
{
31+
ArduinoCloud.poll();
32+
33+
return 1;
34+
}
35+
36+
int CloudSerialClass::peek()
37+
{
38+
ArduinoCloud.poll();
39+
40+
return _rxBuffer.peek();
41+
}
42+
43+
int CloudSerialClass::read()
44+
{
45+
ArduinoCloud.poll();
46+
47+
return _rxBuffer.read_char();
48+
}
49+
50+
void CloudSerialClass::flush()
51+
{
52+
ArduinoCloud.poll();
53+
}
54+
55+
size_t CloudSerialClass::write(const uint8_t data)
56+
{
57+
return write(&data, sizeof(data));
58+
}
59+
60+
size_t CloudSerialClass::write(const uint8_t *buffer, size_t size)
61+
{
62+
ArduinoCloud.poll();
63+
Serial.write(buffer, size);
64+
if (!ArduinoCloud.writeStdout(buffer, size)) {
65+
return 0;
66+
}
67+
68+
return size;
69+
}
70+
71+
CloudSerialClass::operator bool()
72+
{
73+
ArduinoCloud.poll();
74+
75+
return ArduinoCloud.connected();
76+
}
77+
78+
void CloudSerialClass::appendStdin(const uint8_t *buffer, size_t size)
79+
{
80+
while (!_rxBuffer.isFull() && size--) {
81+
_rxBuffer.store_char(*buffer++);
82+
}
83+
}
84+
85+
CloudSerialClass CloudSerial;

src/CloudSerial.h

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#ifndef CLOUD_SERIAL_H
2+
#define CLOUD_SERIAL_H
3+
4+
#include <Arduino.h>
5+
6+
#include <RingBuffer.h>
7+
8+
class ArduinoCloudClass;
9+
10+
class CloudSerialClass : public Stream
11+
{
12+
public:
13+
CloudSerialClass();
14+
~CloudSerialClass();
15+
16+
void begin(int baud);
17+
void end();
18+
int available();
19+
int availableForWrite();
20+
int peek();
21+
int read();
22+
void flush();
23+
size_t write(const uint8_t data);
24+
size_t write(const uint8_t *buffer, size_t size);
25+
using Print::write; // pull in write(str) and write(buf, size) from Print
26+
27+
operator bool();
28+
29+
protected:
30+
friend class ArduinoCloudClass;
31+
32+
void appendStdin(const uint8_t *buffer, size_t size);
33+
34+
private:
35+
RingBufferN<512> _rxBuffer;
36+
};
37+
38+
extern CloudSerialClass CloudSerial;
39+
40+
#endif

0 commit comments

Comments
 (0)