0

我有 arduino uno + wifishield,如果无法连接到 Bluemix。它给出了这个错误:“来自 194.228.11.222 的关闭连接。该操作未经授权。”

知道为什么连接会被踢掉吗?什么操作没有授权?

感谢您的任何想法;)

======

这是代码:

#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);
}
4

2 回答 2

1

您的组织可能被配置为阻止非安全连接(因为您使用的是端口 1883)。检查此配方的第 5 步 https://developer.ibm.com/recipes/tutorials/connect-an-arduino-uno-device-to-the-ibm-internet-of-things-foundation/

于 2017-06-29T19:25:20.577 回答
0

我在日志中注意到了这个错误: 主题无效:主题=“lwt”客户端ID=“d:6735ra:hlinoponie:petasek”原因=“主题与允许的规则不匹配”。

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

于 2017-06-29T19:46:30.300 回答