PubNub Arduino подписаться
Привет, я использую пример PubNubsubscriber с https://github.com/pubnub/arduino Я могу получать сообщения, и пока я получаю сообщение, все работает нормально, если по прошествии некоторого времени, скажем, 20 секунд без нового сообщения, arduino кажется зависает при ожидании сообщения (подписка) и не может получать новые входящие сообщения
Кто-нибудь знает, почему это происходит?
/*
PubNub sample subscribe client
This sample client will subscribe to and handle raw PubNub messages
(not doing any JSON decoding). It does so with a randomly generated
UUID.
Circuit:
* Ethernet shield attached to pins 10, 11, 12, 13
* (Optional.) LED on pin 8 for reception indication.
* Pin A4 unconnected (noise source for random number generator)
created 23 October 2012
by Petr Baudis
https://github.com/pubnub/pubnub-api/tree/master/arduino
This code is in the public domain.
*/
#include <SPI.h>
#include <Ethernet.h>
#include <PubNub.h>
// Some Ethernet shields have a MAC address printed on a sticker on the shield;
// fill in that address here, or choose your own at random:
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
const int subLedPin = 8;
char pubkey[] =
char subkey[] =
char channel[] = "hello_world";
char uuid[] = "xxxxxxxx-xxxx-4444-9999-xxxxxxxxxxxx";
void random_uuid() {
randomSeed(analogRead(4) + millis() * 1024);
snprintf(uuid, sizeof(uuid), "%04lx%04lx-%04lx-4444-9999-%04lx%04lx%04lx",
random(0x10000), random(0x10000), random(0x10000),
random(0x10000), random(0x10000), random(0x10000));
}
void setup()
{
pinMode(subLedPin, OUTPUT);
digitalWrite(subLedPin, LOW);
Serial.begin(9600);
Serial.println("Serial set up");
while (!Ethernet.begin(mac)) {
Serial.println("Ethernet setup error");
delay(1000);
}
Serial.println("Ethernet set up");
PubNub.begin(pubkey, subkey);
random_uuid();
PubNub.set_uuid(uuid);
Serial.println("PubNub set up");
}
void flash(int ledPin)
{
/* Flash LED three times. */
for (int i = 0; i < 3; i++) {
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
delay(100);
}
}
void loop()
{
Ethernet.maintain();
PubSubClient *client;
Serial.println("waiting for a message (subscribe)");
client = PubNub.subscribe(channel);
if (!client) {
Serial.println("subscription error");
delay(1000);
return;
}
Serial.print("Received: ");
while (client->wait_for_data()) {
char c = client->read();
Serial.print(c);
}
client->stop();
Serial.println();
flash(subLedPin);
delay(200);
}
1 ответ
Я провел некоторое время и узнал, что проблема была в void PubSubClient::stop()
функция, пытаясь получить отметку времени. Теперь я не очень уверен, что именно здесь происходит и почему он застревает, хотя выглядит так, что если вы прервете здесь соединение и пропустите улов с меткой времени, это будет работать как шарм.
Это оригинальный код в PubNub.cpp:
void PubSubClient::stop()
{
if ((!available() && !connected()) || !json_enabled) {
PubNub_BASE_CLIENT::stop();
return;
}
/* We are still connected. Read the rest of the stream so that
* we catch the timetoken. */
while (wait_for_data()) {
char ch = read();
this->_state_input(ch, NULL, 0);
}
json_enabled = false;
}
который я заменил (временно) на:
void PubSubClient::stop()
{
PubNub_BASE_CLIENT::stop();
return;
}
Пока это обходной путь (без учета времени), и я надеюсь, что это поможет, пока не будет найдено правильное решение.