Как подключиться к веб-розетке Action Cable от Arduino? - PullRequest
0 голосов
/ 13 декабря 2018

Я создал приложение в Python Flask, которое управляет светодиодной подсветкой на Arduino, передавая цвет, выбранный в форме, всем членам канала веб-сокета.Сейчас я перестраиваюсь в Rails и пытаюсь определить, как мой Arduino может указать, к какому каналу он хотел бы присоединиться.Я уже установил соединение с WebSocket и, похоже, получаю следующее от Rails: [WSc] Received text: {"type":"ping","message":1544679171}.

Теперь мне просто нужно определить, как я могу отправить запрос на конкретный поток из ArduinoChannel, но я не знаю, как это сделать.Я попытался добавить параметры к своему webSocket.begin, но, похоже, это никак не отразилось.

Ниже приведен мой код Arduino для справки:

#include <ESP8266WiFi.h>
#include <WebSocketsClient.h>
#include <ArduinoJson.h>
#include <EEPROM.h>

// Initialize pins
int redpin = D0;
int greenpin = D2;
int bluepin = D4;

//// Connecting to the internet
const char* ssid = "**************";
const char* password = "******";

// Setting up the websocket client
WebSocketsClient webSocket;

// Set up the WiFi client;
WiFiClient client;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);

  pinMode(redpin, OUTPUT);
  pinMode(bluepin, OUTPUT);
  pinMode(greenpin, OUTPUT);


  delay(10);
  WiFi.begin(ssid, password);
  while(WiFi.status()!= WL_CONNECTED) {
    Serial.print(".");
    delay(500);  
  }
  Serial.println("");
  Serial.print("IP Address: ");
  Serial.print(WiFi.localIP() + "\n");
  Serial.print(WiFi.macAddress() + "\n");

  // Initializing the WS2812B communication
  setRgb(255,80,90);

  // Initializing the websocket connection

  webSocket.begin("192.168.1.93",3000, "/cable" );
//  webSocket.sendTXT('{"command":"subscribe","identifier":"{\"channel\":\"ArduinoChannel\"}"', 0);
  webSocket.onEvent(webSocketEvent);
  webSocket.setReconnectInterval(5);

}
void loop() {
  // put your main code here, to run repeatedly:
  webSocket.loop();

} 

void webSocketEvent(WStype_t type, uint8_t *payload, size_t length) {
  switch(type) {
    Serial.write(type);
    case WStype_DISCONNECTED:
      Serial.printf("[WSc] Disconnected!\n");
      break;
    case WStype_CONNECTED:
      Serial.printf("[WSc] Connected to url: %s\n", payload);
      break;
    case WStype_TEXT:
      Serial.printf("[WSc] Received text: %s\n", payload);
      DynamicJsonBuffer jBuffer;
      JsonObject &root = jBuffer.parseObject(payload);
      setRgb(root["r"],root["g"],root["b"]);
      break;
  }
}

  void setRgb(uint8_t r, uint8_t g, uint8_t b) {
  analogWrite(redpin, r);
  analogWrite(bluepin, b);
  analogWrite(greenpin, g);
  delay(10);
}

1 Ответ

0 голосов
/ 13 декабря 2018

TL; DR:

как я могу отправить запрос на конкретный поток из ArduinoChannel

Чтобы получать потоки от ArduinoChannel, вам потребуется«подписаться», отправив через соединение Websocket следующие данные String из Arduino-клиента:

"{\"command\":\"subscribe\",\"identifier\":\"{\\\"channel\\\":\\\"ArduinoChannel\\\"}\"}"

... что почти совпадает с вашим закомментированным sendTXT кодом, но, вероятно, вы былипросто некорректно "избегать" двойных кавычек.

Ссылки:

Я проследил от версии JS-клиента ActionCable здесь

  1. App.cable.subscriptions.create('ArduinoChannel')
    
  2. Subscriptions.prototype.create = function create(channelName, mixin) {
      var channel = channelName;
      var params = (typeof channel === "undefined" ? "undefined" : _typeof(channel)) === "object" ? channel : {
        channel: channel
      };
      // params = { channel: "ArduinoChannel" }
      var subscription = new Subscription(this.consumer, params, mixin);
      return this.add(subscription);
    };
    
  3. function Subscription(consumer) {
      var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
      var mixin = arguments[2];
      classCallCheck(this, Subscription);
      this.consumer = consumer;
      this.identifier = JSON.stringify(params);
      extend(this, mixin);
    }
    
  4. Subscriptions.prototype.add = function add(subscription) {
      this.subscriptions.push(subscription);
      this.consumer.ensureActiveConnection();
      this.notify(subscription, "initialized");
      this.sendCommand(subscription, "subscribe");
      return subscription;
    };
    
  5. Subscriptions.prototype.sendCommand = function sendCommand(subscription, command) {
      var identifier = subscription.identifier;
      // command =  "subscribe"; identifier = JSON.stringify(params) = '{"channel":"ArduinoChannel"}';
      return this.consumer.send({
        command: command,
        identifier: identifier
      });
    };
    
  6. Consumer.prototype.send = function send(data) {
      // data = { command: 'subscribe', identifier: '{"channel":"ArduinoChannel"}' }
      return this.connection.send(data);
    };
    
  7. Connection.prototype.send = function send(data) {
      if (this.isOpen()) {
        // JSON.stringify(data) = '{"command":"subscribe","identifier":"{\"channel\":\"ArduinoChannel\"}"}'
        this.webSocket.send(JSON.stringify(data));
        return true;
      } else {
        return false;
      }
    };
    
...