0

我试图让我的 Arduino 和 esp8266 将数据发送到 thingsboard,然后订阅 thingsboard 的 mqtt 频道并从中获取时间戳,但由于某种未知原因,它不起作用。检查服务器端并没问题,尝试邮递员模拟请求并从服务器获得正确的响应。另外,我已经阅读了关于 esp8266 的文档,它确实声明它只能同时有 1 个连接。但是试图让我的 Arduino 只订阅频道,但它仍然不起作用。

我的代码:(我为此使用 Arduino Mega)

#include "DHT.h"
#include <WiFiEspClient.h>
#include <WiFiEsp.h>
#include <WiFiEspUdp.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <TimeLib.h>

#define WIFI_AP "CEC"
#define WIFI_PASSWORD "#CEC@2017@CEC#"

#define TOKEN "A1_TEST_TOKEN"

// DHT
#define DHTPIN 2
#define DHTTYPE DHT22

char thingsboardServer[] = "192.168.0.250";

// Initialize the Ethernet client object
WiFiEspClient espClient;

// Initialize DHT sensor.
DHT dht(DHTPIN, DHTTYPE);

PubSubClient client(espClient);

int status = WL_IDLE_STATUS;
unsigned long lastSend;
unsigned long lastSync;

void setup() {
  // initialize serial for debugging
  Serial.begin(9600);
  Serial1.begin(9600);
  Serial2.begin(9600);

  //serial pin
      pinMode(LED_RUN_pin, OUTPUT);

  //dht.begin();
  InitWiFi();
  lastSend = 0;
  lastSync = 0;
  //client subscribe thingsboard rpc PUBLISH msg
  client.setServer( thingsboardServer, 1883 );
   client.setCallback(on_message);
}

void loop() {
  status = WiFi.status();
  if ( status != WL_CONNECTED) {
    while ( status != WL_CONNECTED) {
      Serial.print("Attempting to connect to WPA SSID: ");
      Serial.println(WIFI_AP);
      // Connect to WPA/WPA2 network
      status = WiFi.begin(WIFI_AP, WIFI_PASSWORD);
      delay(500);
    }
  }

  if ( !client.connected() ) {
    reconnect();
  }

  if ( millis() - lastSend > 30000 ) { // Update and send after 30 seconds
    getAndSendTemperatureAndHumidityData();
    lastSend = millis();
  }

  client.loop();
}

void getAndSendTemperatureAndHumidityData()
{
  Serial.println("Collecting temperature data.");

  // Reading temperature or humidity takes about 250 milliseconds!
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" *C ");

  String temperature = String(t);
  String humidity = String(h);

  // Prepare a JSON payload string
  String payload = "{";
  payload += "\"temperature\":"; payload += temperature; payload += ",";
  payload += "\"humidity\":"; payload += humidity;
  payload += "}";

  // Send payload
  char attributes[100];
  payload.toCharArray( attributes, 100 );
  client.publish( "v1/devices/me/rpc/request/1", attributes , 1);
  //Serial.println( attributes );
}


  // Prepare a JSON payload string
 String payload = "{method: getTime, params:{}}";

  // Send payload
  char attributes[100];
  payload.toCharArray( attributes, 100 );
  client.publish( "v1/A1_TEST_TOKEN/rpc", attributes );
  //Serial.println( attributes );
}

void InitWiFi()
{ 
  // initialize serial for ESP module
  Serial1.begin(9600);
  // initialize ESP module
  WiFi.init(&Serial1);
  // check for the presence of the shield
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    // don't continue
    while (false);
  }

  Serial.println("Connecting to AP ...");
  // attempt to connect to WiFi network
  while ( status != WL_CONNECTED) {
    // Connect to WPA/WPA2 network
    status = WiFi.begin(WIFI_AP, WIFI_PASSWORD);
    delay(500);
  }
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    //Serial.print("Connecting to Thingsboard node ...");
    // Attempt to connect (clientId, username, password)
    if ( client.connect("Arduino Uno Device", TOKEN, NULL) ) {
     Serial.println( "[DONE]" );
      delay(500);
     // Serial.println("Subscribing RPC");
     client.subscribe("v1/devices/me/rpc/request/+");
    } else {
      Serial.print( "[FAILED] [ rc = " );
      Serial.print( client.state() );
      Serial.println( " : retrying in 20  seconds]" );
      // Wait 20 seconds before retrying
      delay( 20000 );
    }
  }
}

void printDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

// The callback for when a PUBLISH message is received from the server.
void on_message (char* topic, byte* payload, unsigned int length) {

  //Serial.println("On message");

  char json[length + 1];
  strncpy (json, (char*)payload, length);
  json[length] = '\23';

  Serial.print("Topic: ");
  Serial.println(topic);
  Serial.print("Message: ");
  Serial.println(json); 

  // Decode JSON request
  StaticJsonBuffer<200> jsonBuffer;
  JsonObject& data = jsonBuffer.parseObject((char*)json);

  if (!data.success())
  {
    Serial.println("parseObject() failed");
    return;
  }
}
4

1 回答 1

0

可能是一句愚蠢的话,但是您的 TOKEN 是有效的 Thingsboard 设备令牌吗?我假设您输入的值A1_TEST_TOKEN是为了隐藏您的真实身份验证令牌。

我还假设您正在尝试将传感器数据(遥测)发送到 Thingsboard。您为什么决定使用 RPC API 来发送数据?我认为改用MQTT 设备 API可能更容易。

我没有任何为 Arduino 开发的经验。我正在使用 Thingsboard 和 Raspberry PI 来编写和显示传感器数据。希望您找到解决问题的方法!

于 2018-06-19T12:48:09.983 回答