IOTs WSO2 : Данные не отображаются на сервере с помощью Arduino, подключенного через Ethernet

Описание: При регистрации устройства Arduino на сервере интернета вещей WSO2 я внес необходимые изменения(подключение Wi-Fi к Ethernet) в скетч, который я загрузил с сервера и загрузил его. На последовательном мониторе появилось следующее сообщение:

Internal Temperature Sensor
My IP: 192.168.1.166
Host: 192.168.1.57:9443
JSON Payload: {"event":{"metaData":{"owner":"[email protected]","deviceId":"1iepgvrk0whtf"}, "payloadData":{
-------------------------------
connected
Temperature is
34.99
POST /endpoints/arduino_receiver?deviceId=1iepgvrk0whtf HTTP/1.1
Host: 192.168.1.57:9443
Content-Type: application/json
Content-Length: 117

{"event":{"metaData":{"owner":"[email protected]","deviceId":"1iepgvrk0whtf"}, "payloadData":{"temperature":34.99}}}
���
-------------------------------
connected
Read Controls
Started..
GET /arduino/device/1iepgvrk0whtf/controls HTTP/1.1
Host: 192.168.1.57:9443
Content-Type: application/json

 ���

Ended..
Polling Response: ���
-------------------------------
My IP: 192.168.1.166

Нет никакого сообщения(ни ошибки, ни предупреждения, ни подключенного сообщения) от IoT-сервера.

Затронутая версия продукта: Сервер интернета вещей WSO2 3.3.0 Oracle JAVA 1.8.0_181

Сведения об операционной системе, базе данных, другой среде и версиях: Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-131-универсальный x86_64) Arduino IDE 1.8.7 Библиотека Ethernet

Шаги для воспроизведения:

  1. mvn чистая установка -f ./wso2iot-3.3.0/samples/device-plugins-deployer.xml
  2. ./wso2iot-3.3.0/scripts/change-ip.sh С "localhost" на "192.168.1.57"
  3. Запустите сервер

    ./wso2iot-3.3.0/bin/broker.sh

    ./wso2iot-3.3.0/bin/iot-server.sh

    ./wso2iot-3.3.0/bin/analytics.sh

  4. Войдите на сервер интернета вещей (https://192.168.1.57:9443/devicemgt) с"администратором"/"администратором"

  5. Зарегистрируйте устройство с типом Arduino с именем "Arduino"
  6. Скачайте архив с прошивкой. Расстегни молнию. Во всех файлах код изменен для Ethernet.
  7. Загрузил его в Arduino Uno с помощью Ethernet-экрана.
  8. Включите питание Arduino.

ArduinoBoardSketch.ino:

#include "ArduinoBoardSketch.h"
#include <Ethernet.h>
#include <SPI.h>

EthernetClient httpClient;

void setup()
{
    Serial.begin(115200);
    Serial.println("Internal Temperature Sensor");
    pinMode(6, OUTPUT);
    pinMode(13, OUTPUT);
    connectHttp();
    setupResource();

}

void loop()
{
    while( !httpClient.connected() ){
        connectHttp();

    }


    cpuTemperature=getBoardTemp();

    Serial.println("Internal Temperature is");
    Serial.print(cpuTemperature);


    if(millis() - pushTimestamp > PUSH_INTERVAL){
        while (!httpClient.connected()) {
            connectHttp();
        }
        pushData();

        pushTimestamp = millis();
    }

    //Serial.println("PUSHED");



    if(millis() - pollTimestamp > POLL_INTERVAL){
        while (!httpClient.connected()) {
            connectHttp();
        }
        Serial.println("Read Controls");
        readControls();

        pollTimestamp = millis();

    }


}

ArduinoBoardSketch.h:

#ifndef ArduinoEthernetAgent_H
#define ArduinoEthernetAgent_H

#include "Arduino.h"

byte mac[6] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x09};

#define DEVICE_OWNER "[email protected]"
#define DEVICE_ID "1iepgvrk0whtf"
#define DEVICE_TOKEN "f9f94dce-cc13-3319-9d33-a1e54e90f2ba"
#define REFRESH_DEVICE_TOKEN "00f6d01f-cb1f-38ed-9990-1c719bd66f0c"
#define DEVICE_TYPE  "arduino"
#define TIME  0
#define SUPER_TENANT "carbon.super"

#define DAS_SERVICE_EPOINT "/endpoints/arduino_receiver?deviceId=1iepgvrk0whtf"

#define IOT_SERVICE_EPOINT "/arduino/device/1iepgvrk0whtf/controls"

#define POLL_INTERVAL 1000
#define PUSH_INTERVAL 10000
#define DEBUG true
#define CON_DEBUG true

#define SERVICE_PORT 9763                 //http port of iot server

byte server[4] = {192,168,1,57};        //Ip address of iot server

//set static Ip

byte deviceIP[4] = { 192, 168, 1, 166};   //Ststic ip address of arduino
byte dns2[] = { 192, 168, 1, 1 };             //Ststic dns of arduino
byte subnet[] = { 255, 255, 255, 0 };     //Ststic subnet of arduino
byte gateway[] = { 192, 168, 1, 1 };      //Ststic gateway of arduino


String host, jsonPayLoad, replyMsg;
String responseMsg, subStrn;
double cpuTemperature = 0;
static unsigned long pushTimestamp = 0;
static unsigned long pollTimestamp = 0;
char charBuf[10];
String payLoad;


#endif

Подключение. ино:

#include "ArduinoBoardSketch.h"

String connecting = "connecting.... ";

void connectHttp() {
   if(DEBUG) Serial.println("-------------------------------");

   Ethernet.begin(mac, deviceIP, dns2, gateway, subnet);
   delay(2000);

   if(DEBUG) {
   Serial.print("My IP: ");
   Serial.println(Ethernet.localIP());
   }

   connecting += httpClient.connect(server, SERVICE_PORT);
   delay(2000);
   if(DEBUG) Serial.println(connecting);

   if (httpClient.connected()) {
     if(DEBUG) Serial.println("connected");
   } else {
     if(DEBUG) Serial.println("connection failed");

     while(!httpClient.connected()){
       if(DEBUG) Serial.println("retrying to connect......");
       httpClient.connect(server, SERVICE_PORT);
       delay(2000);
     }

     if(DEBUG) Serial.println("connected to server!");
   }
   if(DEBUG) Serial.println("-------------------------------");
}


void setupResource(){
    String hostIP = getHostIP(server);
    String port = String(SERVICE_PORT);

    host = "Host: " + hostIP + ":" + port;
    if(DEBUG) Serial.println(host);

    jsonPayLoad = "{\"event\":{\"metaData\":";
    jsonPayLoad += "{\"owner\":\"";
    jsonPayLoad += String(DEVICE_OWNER);
    jsonPayLoad += "\",\"deviceId\":\"";
    jsonPayLoad += String(DEVICE_ID);
    jsonPayLoad += "\"}, \"payloadData\":{";

    if(DEBUG) {
        Serial.print("JSON Payload: ");
        Serial.println(jsonPayLoad);
        Serial.println("-------------------------------");
    }
}

String getHostIP(byte server[4]){
    String hostIP = String(server[0]);

    for ( int index = 1; index < 4; index++) {
        hostIP += "." + String(server[index]);
    }

    return hostIP;
}

String getMyIP(){
  String myIP = "";
  myIP = String(Ethernet.localIP()[0]);

  for ( int index = 1; index < 4; index++) {
    myIP += "." + String(Ethernet.localIP()[index]);
  }  
  return myIP;
}

PollServer.ino:

#include "ArduinoBoardSketch.h"
void readControls() {
    String responseMsg;

    Serial.println("Started..");

    httpClient.print("GET ");
    httpClient.print(IOT_SERVICE_EPOINT);
    httpClient.println(" HTTP/1.1");
    httpClient.println("\n");
    httpClient.println(host.c_str());httpClient.println("\n"); 
    httpClient.println("Authorization: Bearer "); httpClient.println(DEVICE_TOKEN); httpClient.println("\n");
    httpClient.println("\n");
    httpClient.println("protocol: HTTP\n");

    httpClient.println();

    if(DEBUG) {
        Serial.print("GET ");
        Serial.print(IOT_SERVICE_EPOINT);
        Serial.print(" HTTP/1.1"); Serial.println();
        Serial.print(host); Serial.println();
        Serial.print("Content-Type: application/json"); Serial.println();
        Serial.println();
    }

    delay(1000);

    while (httpClient.available()) {
        char response = httpClient.read();
        if(DEBUG) Serial.print(response);
        responseMsg += response;

    }
    Serial.println();
    Serial.println("Ended..");
    int index = responseMsg.lastIndexOf(":");
    int newLine = responseMsg.lastIndexOf("\n");
    subStrn = responseMsg.substring(index + 1);
    responseMsg = responseMsg.substring(newLine + 1, index);

    if(DEBUG) {
        Serial.print("Polling Response: ");
        Serial.print(responseMsg);
        Serial.println();
        Serial.println("-------------------------------");
    }

    if (subStrn.equals("ON")) {
        Serial.println("ITS ON");
        digitalWrite(13, HIGH);
        digitalWrite(6, HIGH);
    } else if (subStrn.equals("OFF")){

        Serial.println("ITS OFF");
        digitalWrite(13, LOW);
        digitalWrite(6, LOW);

    }
    responseMsg = "";

}

PushData.ino

#include "ArduinoBoardSketch.h"

void pushData(){

    payLoad = "\"temperature\":";
    payLoad += dtostrf(cpuTemperature, 3, 2, charBuf);
    payLoad += "}}}";

    httpClient.println("POST ");
    httpClient.println(DAS_SERVICE_EPOINT);
    httpClient.println(" HTTP/1.1"); httpClient.println("\n");
    httpClient.println(host.c_str()); httpClient.println("\n");
    httpClient.println("Authorization: Bearer "); httpClient.println(DEVICE_TOKEN); httpClient.println("\n");
    httpClient.println("Content-Type: application/json"); httpClient.println("\n");
    httpClient.println("Accept: application/json"); httpClient.println("\n");
    httpClient.println("Content-Length: ");

    int payLength = jsonPayLoad.length() + payLoad.length();

    httpClient.println(String(payLength).c_str()); httpClient.println("\n");
    httpClient.println("\n");

    if(DEBUG) {
        Serial.print("POST ");
        Serial.print(DAS_SERVICE_EPOINT);
        Serial.print(" HTTP/1.1"); Serial.println();
        Serial.print(host); Serial.println();
        Serial.print("Content-Type: application/json"); Serial.println();
        Serial.print("Content-Length: ");
        Serial.print(payLength); Serial.println();
        Serial.println();
    }


    int chunkSize = 50;

    for (int i = 0; i < jsonPayLoad.length(); i++) {
        if ( (i+1)*chunkSize > jsonPayLoad.length()) {
            httpClient.print(jsonPayLoad.substring(i*chunkSize, jsonPayLoad.length()));
            if(DEBUG) Serial.print(jsonPayLoad.substring(i*chunkSize, jsonPayLoad.length()));
            i = jsonPayLoad.length();
        } else {
            httpClient.print(jsonPayLoad.substring(i*chunkSize, (i+1)*chunkSize));
            if(DEBUG) Serial.print(jsonPayLoad.substring(i*chunkSize, (i+1)*chunkSize));
        }
    }

    for (int i = 0; i < payLoad.length(); i++) {
        if ( (i+1)*chunkSize > payLoad.length()) {
            httpClient.print(payLoad.substring(i*chunkSize, payLoad.length()));
            if(DEBUG) Serial.print(payLoad.substring(i*chunkSize, payLoad.length()));
            i = payLoad.length();
        } else {
            httpClient.print(payLoad.substring(i*chunkSize, (i+1)*chunkSize));
            if(DEBUG) Serial.print(payLoad.substring(i*chunkSize, (i+1)*chunkSize));
        }
    }

    httpClient.println(F("\n"));
    if(DEBUG) Serial.println();

    delay(1000);


    while (httpClient.available()) {
        char response = httpClient.read();
        if(DEBUG) Serial.print(response);
    }


    if(DEBUG)  {
        Serial.println();
        Serial.println("-------------------------------");
    }

    payLoad = "";
}


double getBoardTemp(void)
{
    unsigned int wADC;
    double t;

    // The internal temperature has to be used
    // with the internal reference of 1.1V.
    // Channel 8 can not be selected with
    // the analogRead function yet.

    // Set the internal reference and mux.
    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

Обсуждение

вы хотите получить доступ к https из Uno?, @Juraj

Я спрашиваю о защищенном протоколе SSL. Уно не может этого сделать., @Juraj

настройте для своего сервера порт без SSL. обычный HTTP-порт, а не безопасный HTTPS. в ссылке не упоминается https или SSL. Речь идет об ограничениях для HTTP., @Juraj

добавьте исходный код к вопросу, @Juraj

Скетч, предоставленный WSO2 IOTs, недоступен в Интернете. Я не буду устанавливать его, чтобы получить скетч. Добавьте полный скетч., @Juraj

вы заглядывали в журналы сервера? действителен ли ваш json? ваш установочный ресурс отличается, @Juraj

'HttpClient.println("\n");` отправляет \r\n\n, и это недопустимо для HTTP, @Juraj

Удалено все " HttpClient.println("\n")"; Отображается следующая ошибка: HTTP/1.1 401 Несанкционированный Не удалось загрузить соответствующий аутентификатор для проверки подлинности запроса Законченный.., @Shaheen Khan

удалите ln из HttpClient.println("Авторизация: Предъявитель "). удалите \n из HttpClient.println("протокол: HTTP\n");, @Juraj

помогло ли это? примите ответ, чтобы отметить, что вопрос решен, @Juraj

Я удалил все строки \n и ln из Authorization : Bearer, и он вернул следующую ошибку: Конфликт HTTP/1.1 409 `Для устройства u7ol5xzeas6w администратора владельца не установлено никаких элементов управления", @Shaheen Khan

есть ли что-то еще в журналах сервера?, @Juraj

В журнале сервера ничего нет. Эта ошибка отображается на последовательном мониторе. Конфликт HTTP/1.1 409 Дата: Пн, 19 ноября 2018 07:47:50 GMT Тип контента: приложение/октет-поток Содержание-Длина: 64 Сервер: Углеродный сервер WSO2 Для устройства u7ol5xzeas6w администратора владельца не установлено никаких элементов управления Законченный. Ответ на опрос:Углеродный сервер WSO2, @Shaheen Khan

теперь проблема заключается в настройке сервера. больше нечего делать на стороне Ардуино. примите ответ, чтобы отметить, что вопрос решен, @Juraj


1 ответ


0

Настройте для своего сервера порт без SSL. Обычный HTTP-порт, а не безопасный HTTPS. Arduino Uno не обладает вычислительной мощностью и памятью для требуемых хэшей безопасности.


Ваши окончания строк в запросе неверны. Вы добавляете пустую строку с println("\n"). Удалите все HttpClient.println("\n");. Вы добавляете \n перед \r\n, отправленным println в println("протокол: HTTP\n"). Протокол HTTP требует только \r\n. У вас есть \r\n внутри заголовка авторизации перед токеном. Измените println("Авторизация: на предъявителя ") на печать("Авторизация: на предъявителя ").

,