Blink在arduino中使用MQTT

时间:2016-04-24 12:06:41

标签: arduino mqtt broker

我必须实现一个原型设计方案,使用MQTT协议使arduino中的LED闪烁。我已经尝试过几个MQTT库,但是它们不能很好地工作。与MQTT代理连接成功但是当我发布带有我在arduino中设置的主题的消息时,不会使LED闪烁。 Arduno必须在成功连接时发布消息,但此发布部分也无法正常工作

这是我的代码

    #include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>

// Set the MAC address
byte mac[]    = {  0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 100);
IPAddress server(192, 168, 1, 20);

// Set what PINs our Led's are connected to
int redPin = 13;                
//int greenPin = 6;
//int bluePin = 7;

// Set a generic code that will trigger our Blue Led
// think of this as a set of codes for automation you might write
byte triggerRed[13] = "12345";

// handles messages that are returned from the broker on our subscribed channel
void callback(char* topic, byte* payload, unsigned int length) {

  Serial.print("New message from broker on topic:");
  Serial.println(topic);

  Serial.print("Payload:");
  Serial.write(payload, length);



  // Check and see if our payload matches our simple trigger test
  if ((length == 5) & (memcmp(payload, triggerRed, 5) == 0) )
  {
    //blink(redPin);

  }

}
EthernetClient ethClient;
PubSubClient client(ethClient);
// Fire up our PubSub client
//PubSubClient client(server, 1883, callback);

void setup()
{

  // Open serial communications
  Serial.begin(9600);

  client.setServer(server, 1883);
  client.setCallback(callback);

  // Setup our Leds
  pinMode(redPin, OUTPUT);
 // pinMode(greenPin, OUTPUT);
 // pinMode(bluePin, OUTPUT);

  // attempt a DHCP connection
  Serial.println("Attempting to get an IP address using DHCP:");
  if (!Ethernet.begin(mac)) 
  {
    // if DHCP fails, start with a hard-coded address:
    Serial.println("failed to get an IP address using DHCP, trying manually");
    Ethernet.begin(mac, ip);
  }

  Serial.print("My address:");
  Serial.println(Ethernet.localIP());

  // Connect to Broker, give it arduino as the name
  if (client.connect("arduino")) {

    // Good, we connected turn on the red led
    digitalWrite(redPin, HIGH);

    // Publish a message to the status topic
    client.publish("status","Arduino is now online");

    // Listen for messages on the control topic
    client.subscribe("ultra");
  }

}

void loop()
{
  client.loop();
}

// Anything with flashing lights.
void blink(int targetLed) 
{
  digitalWrite(redPin, HIGH);

}

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

将连接例程放在循环中,首先尝试使用test.mosquitto.org。 这是适用于我的代码(以太网屏蔽硬件):

定义:

#define CLIENT_NAME "myclientname"
#define TOPIC "mytopic"
byte mac[]    = {  0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 105);
IPAddress server(85, 119, 83, 194);// test.mosquitto.org
#define MQTT_PORT 1883
IPAddress myDns(8, 8, 8, 8);
EthernetClient ethClient;
PubSubClient client(ethClient);

设置:

client.setServer(server, MQTT_PORT);
client.setCallback(callback);
Ethernet.begin(mac);

循环:

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

重新连接例程

void reconnect() {
    if (millis() - reconnectionTimer >reconnection_period){// Loop until we're reconnected
        reconnectionTimer = millis();
        if (!client.connected()) {
            // Attempt to connect
            if (client.connect(CLIENT_NAME)) {
                client.subscribe(TOPIC);
            }
            else {
                Serial.print(client.state());
                Serial3.print(client.state());
            }
        }
    }
}

更新为闪烁:

void blink(){
  digitalWrite(led, LOW);
  delay(500);
  digitalWrite(led, HIGH);
}

答案 1 :(得分:0)

我浪费了很多时间,因为我遇到了mqtt服务器的问题。确保您的服务器使用的是mqtt协议,因为我使用的是ws协议,而我尝试过的任何库均不适用于该协议