2017-06-29 90 views
0

我有arduino uno + wifishield,并且无法连接到Bluemix。它出现此错误: “来自194.228.11.222的关闭连接,该操作未经授权。”arduino uno + wifishield无法使用令牌连接bluemix

任何想法为什么连接被踢出?什么操作没有被授权?

感谢您的任何想法;)

======

下面是代码:

#include <SPI.h> 
#include <Ethernet.h> 
#include <WiFi.h> 
#include <WifiIPStack.h> 
#include <IPStack.h> 
#include <Countdown.h> 
#include <MQTTClient.h> 

#define MQTT_MAX_PACKET_SIZE 100 
#define SIZE 100 
#define MQTT_PORT 1883 
#define PUBLISH_TOPIC "iot-2/evt/status/fmt/json" 
#define SUBSCRIBE_TOPIC "iot-2/cmd/+/fmt/json" 
#define USERID "use-token-auth" 
#define CLIENT_ID "d:6735ra:hlinoponie:petasek" 
#define MS_PROXY "6735ra.messaging.internetofthings.ibmcloud.com" 
#define AUTHTOKEN “xxxxx” 

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0xD6, 0x8F }; 




WiFiClient c; 
IPStack ipstack(c); 

MQTT::Client<IPStack, Countdown, 100, 1> client = MQTT::Client<IPStack, Countdown, 100, 1>(ipstack); 


String deviceEvent; 

char ssid[] = “XXXXX”;  // your network SSID (name) 
char pass[] = “XXXXX”; // your network password 
int status = WL_IDLE_STATUS;  // the Wifi radio's status 

void setup() { 
    Serial.begin(9600); 
    while (!Serial) { 
    ; // wait for serial port to connect. Needed for Leonardo only 
    } 
    if (WiFi.status() == WL_NO_SHIELD) { 
    Serial.println("WiFi shield not present"); 
    // don't continue: 
    while (true); 
    } 
    String fv = WiFi.firmwareVersion(); 
    if (fv != "1.1.0") 
    Serial.println("Please upgrade the firmware"); 

    // attempt to connect to Wifi network: 
    while (status != WL_CONNECTED) { 
    Serial.print("Attempting to connect to WPA SSID: "); 
    Serial.println(ssid); 
    // Connect to WPA/WPA2 network: 
    status = WiFi.begin(ssid, pass); 

    // wait 5 seconds for connection: 
    delay(5000); 
    } 

    // you're connected now, so print out the data: 
    Serial.print("Hooray!!! You're connected to the network\n"); 

} 

void loop() { 
    float tep = mojeDHT.readTemperature(); 
    float vlh = mojeDHT.readHumidity(); 
    int rc = -1; 
    if (!client.isConnected()) { 
    Serial.println("Connecting to Watson IoT Foundation ..."); 

    rc = ipstack.connect((char*)MS_PROXY, MQTT_PORT); 

    MQTTPacket_connectData data = MQTTPacket_connectData_initializer; 
    data.MQTTVersion = 3; 
    data.clientID.cstring = (char*)CLIENT_ID; 
    data.username.cstring = (char*)USERID; 
    data.password.cstring = (char*)AUTHTOKEN; 
    data.keepAliveInterval = 60; 

    rc = -1; 
    while ((rc = client.connect(data)) != 0) { 
     Serial.println("rc="); 
     Serial.println(rc); 
     delay(2000); 
     } 
    Serial.println("Connected successfully\n"); 
    // Serial.println("Temperature(in C)\tDevice Event (JSON)"); 
    Serial.println("____________________________________________________________________________"); 

    } 
    Serial.println("\n"); 
    MQTT::Message message; 
    message.qos = MQTT::QOS0; 
    message.retained = false; 
    deviceEvent = String("{\"d\":{\"myName\":\"Arduino Uno\",\"temperature\":"); 
    char buffer[60]; 
// convert double to string 
    dtostrf(getTemp(),1,2, buffer); 
    deviceEvent += buffer; 
    deviceEvent += "}}"; 
    Serial.print("\t"); 
    Serial.print(buffer); 
    Serial.print("\t\t"); 
    deviceEvent.toCharArray(buffer, 60); 
    Serial.println(buffer); 
    message.payload = buffer; 
    message.payloadlen = strlen(buffer); 
    rc = client.publish(PUBLISH_TOPIC, message); 




    if (rc != 0) { 
    Serial.print("return code from publish was "); 
    Serial.println(rc); 
} 

    client.yield(5000); 
} 


    /* 
This function is reproduced as is from Arduino site => http://playground.arduino.cc/Main/InternalTemperatureSensor 
*/ 
double getTemp(void) { 
    unsigned int wADC; 
    double t; 
    ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3)); 
    ADCSRA |= _BV(ADEN); // enable the ADC 
    delay(20); // wait for voltages to become stable. 
    ADCSRA |= _BV(ADSC); // Start the ADC 
    // Detect end-of-conversion 
    while (bit_is_set(ADCSRA,ADSC)); 
    // Reading register "ADCW" takes care of how to read ADCL and ADCH. 
    wADC = ADCW; 
    // The offset of 324.31 could be wrong. It is just an indication. 
    t = (wADC - 324.31)/1.22; 
    // The returned temperature is in degrees Celcius. 
    return (t); 
} 

回答

0

我注意到这个错误日志中:主题是无效的:主题=“LWT”客户端ID =“d:6735ra:hlinoponie:petasek”原因=“的话题呢不符合允许的规则“。

我没有在您的代码中看到该主题,但您可能想要查看如何设置为主题。