Hello,
I'm trying to develop a C program that publishes temperature & humidity sensor data via MQTT on an Intel Up2 board. I'm using Arduino Create Web Editor to develop my program. The code is from an example project and everything was working fine in the past few weeks.
Here is the code:
// Eclipse Paho MQTT - Version: Latest
#include <ArduinoPahoASync.h>
#include <MQTTAsync.h>
#include <MQTTClient.h>
#include <MQTTClientPersistence.h>
// JSON-C - Version: Latest
#include <ArduinoJsonC.h>
#include <json-c/json.h>
#include "th02.hpp"
#include "upm_utilities.h"
#define ADDRESS "tcp://localhost:1883"
#define CLIENTID "MQTTExample"
#define TOPIC_ONE "sensors/temperature/data"
#define TOPIC_TWO "sensors/humidity/data"
#define QOS 1
#define TIMEOUT 10000L
int finished = 0;
void connLost(void *context, char *cause);
void onConnectFailure(void* context, MQTTAsync_failureData* response);
void onConnect(void* context, MQTTAsync_successData* response);
void onSend(void* context, MQTTAsync_successData* response);
int main();
void connLost(void *context, char *cause) {
MQTTAsync client = (MQTTAsync)context;
MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer;
int rc;
printf("\nConnection lost\n");
printf(" cause: %s\n", cause);
printf("Reconnecting\n");
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
if ((rc = MQTTAsync_connect(client, &conn_opts)) != MQTTASYNC_SUCCESS) {
printf("Failed to start connect, return code %d\n", rc);
finished = 1;
}
}
void onConnectFailure(void* context, MQTTAsync_failureData* response) {
printf("Connect failed, rc %d\n", response ? response->code : 0);
finished = 1;
}
void onConnect(void* context, MQTTAsync_successData* response) {
printf("Successful connection\n");
}
void onSend(void* context, MQTTAsync_successData* response) {
printf("Message with token value %d delivery confirmed\n", response->token);
finished = 1;
return;
}
int
main() {
// Set the subplatform for the shield
mraa_add_subplatform(MRAA_GROVEPI, "0");
// Create the temperature & humidity sensor object
upm::TH02 sensor;
MQTTAsync client;
MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer;
int rc;
MQTTAsync_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL);
MQTTAsync_setCallbacks(client, NULL, connLost, NULL, NULL);
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
conn_opts.onSuccess = onConnect;
conn_opts.onFailure = onConnectFailure;
conn_opts.context = client;
if ((rc = MQTTAsync_connect(client, &conn_opts)) != MQTTASYNC_SUCCESS) {
printf("Failed to start connect, return code %d\n", rc);
exit(EXIT_FAILURE);
}
// Read the temperature and humidity printing both the Celsius and
// equivalent Fahrenheit temperature and Relative Humidity, waiting two seconds between readings
while (1) {
float celsius = sensor.getTemperature();
float fahrenheit = (celsius * 9.0 / 5.0 + 32.0);
float humidity = sensor.getHumidity();
printf("%2.3f Celsius, or %2.3f Fahrenheit\n", celsius, fahrenheit);
printf("%2.3f%% Relative Humidity\n", humidity);
// Create JSON Objects for MQTT
char cnum[13];
sprintf(cnum, "%3.7f", celsius);
char hnum[13];
sprintf(hnum, "%3.7f", humidity);
struct timeval time;
gettimeofday(&time,NULL);
char snum[13];
sprintf(snum, "%d", (int) time.tv_sec);
char *sensor = "sensor_id";
char *temper = "temperature";
char *humid = "humidity";
char *value = "value";
char *timet = "timestamp";
//Create the json object for TOPIC_ONE i.e temperature
struct json_object *jobj_1;
jobj_1 = json_object_new_object();
json_object_object_add(jobj_1, sensor, json_object_new_string(temper));
json_object_object_add(jobj_1, value, json_object_new_string(cnum));
json_object_object_add(jobj_1, timet, json_object_new_string(snum));
//Create the json object for TOPIC_TWO i.e humidity
struct json_object *jobj_2;
jobj_2 = json_object_new_object();
json_object_object_add(jobj_2, sensor, json_object_new_string(humid));
json_object_object_add(jobj_2, value, json_object_new_string(hnum));
json_object_object_add(jobj_2, timet, json_object_new_string(snum));
char *str_mqtt;
str_mqtt = (char *) json_object_to_json_string(jobj_1);
MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer;
MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
opts.onSuccess = onSend;
opts.context = client;
// Send JSON Object via MQTT
pubmsg.payload = str_mqtt;
pubmsg.payloadlen = strlen(str_mqtt);
pubmsg.qos = QOS;
pubmsg.retained = 0;
// Publish TOPIC_ONE
if ((rc = MQTTAsync_sendMessage(client, TOPIC_ONE, &pubmsg, &opts)) != MQTTASYNC_SUCCESS) {
printf("Failed to start sendMessage, return code %d\n", rc);
}
// Wait until message is sent
while (!finished) {
usleep(10000L);
}
str_mqtt = (char *) json_object_to_json_string(jobj_2);
// Send JSON Object via MQTT
pubmsg.payload = str_mqtt;
// Publish TOPIC_ONE
if ((rc = MQTTAsync_sendMessage(client, TOPIC_TWO, &pubmsg, &opts)) != MQTTASYNC_SUCCESS) {
printf("Failed to start sendMessage, return code %d\n", rc);
}
// Wait until message is sent
while (!finished) {
usleep(10000L);
}
}
return 0;
}
Without any change in the settings and the code, today when I tried to re-verify (or re-compile) the code, I got the following error messages (for complete error message please see the attachment below):
./opt/arduino-builder/arduino-builder -compile -core-api-version 10611 -build-path /tmp/065750912/build -hardware opt/arduino-builder/hardware -hardware ./opt/cores -tools opt/arduino-builder/tools -tools ./opt/tools -built-in-libraries opt/libraries/latest -libraries /tmp/065750912/pinned -libraries /tmp/065750912/custom -fqbn arduino:mraa:intel_x86_64 -build-cache /tmp -logger humantags -verbose=false /tmp/065750912/sketch_temperature_humidity_MQTT
/tmp/065750912/build/sketch/sketch_temperature_humidity_MQTT.ino.cpp.o: In function `connLost(void*, char*)':
/tmp/065750912/sketch_temperature_humidity_MQTT/sketch_temperature_humidity_MQTT.ino:35: undefined reference to `MQTTAsync_connect'
/tmp/065750912/build/sketch/sketch_temperature_humidity_MQTT.ino.cpp.o: In function `main':
/tmp/065750912/sketch_temperature_humidity_MQTT/sketch_temperature_humidity_MQTT.ino:89: undefined reference to `MQTTAsync_create'
/tmp/065750912/sketch_temperature_humidity_MQTT/sketch_temperature_humidity_MQTT.ino:91: undefined reference to `MQTTAsync_setCallbacks'
/tmp/065750912/sketch_temperature_humidity_MQTT/sketch_temperature_humidity_MQTT.ino:98: undefined reference to `MQTTAsync_connect'
/tmp/065750912/sketch_temperature_humidity_MQTT/sketch_temperature_humidity_MQTT.ino:180: undefined reference to `MQTTAsync_sendMessage'
/tmp/065750912/sketch_temperature_humidity_MQTT/sketch_temperature_humidity_MQTT.ino:200: undefined reference to `MQTTAsync_sendMessage'
collect2: error: ld returned 1 exit status
exit status 1
I have confirmed that the "Eclipse Paho MQTT" library is included (it came with the board as part of the pre-installed packages), and Arduino Create Web Editor doesn't allow me to delete and re-install the library. Does anyone know why this is happening and how to fix it? If I want to manually compile the code without using Arduino Create Web Editor, how can I achieve that? I've downloaded Arduino IDE but found it doesn't support Intel UP2 board.
Thanks for your help.
Complete_error_message.txt (33.8 KB)