Не распознаётся массив в websoket

фрагмент отправки в loop

void loop() {
  ws.cleanupClients();
  static unsigned long last = 0;
  if (millis() - last > 2000) {
    last = millis();

    // cheek register СВ4021, contact with rezistors 1,5kOm
    digitalWrite(LATCHPIN, 1);
    delayMicroseconds(20);
    digitalWrite(LATCHPIN, 0);
    //--- 1 register СВ4021
    switchVar1 = shiftIn(DATAPIN, CLOCKPIN);
    for (int n = 0; n <= 7; n++) {
      if (switchVar1 & (1 << n)) {       // array[0-7]
        ws.textAll(String("P=") + "1");  //nclose
      } else {
        ws.textAll(String("P=") + "0");  //nopen
      }
    }
    //--- 2 register СВ4021
    switchVar2 = shiftIn(DATAPIN, CLOCKPIN);
    for (int n = 0; n <= 7; n++) {
      if (switchVar2 & (1 << n)) {       // array[7-15]
        ws.textAll(String("P=") + "1");  //nclose
      } else {
        ws.textAll(String("P=") + "0");  //nopen
      }
    }
    updateSensors();
    ws.textAll(String("TEMP:") + tempC);
    ws.textAll(String("HUMID:") + byte(humidity));
    ws.textAll(String("SENSOR:") + byte(sensor));
  }
}

код js на сервере

<script>
    let ws = null,
        timer = null;
    const $s = document.getElementById('status')
    const $c = document.getElementById('conn')
    const $d = document.getElementById('sensor')
    const $b = document.getElementById('btn')
    const $t = document.getElementById('temp')
    const $h = document.getElementById('humidity')
    const $p = document.getElementById('pin_')

    function setConn(x) {
        $c.textContent = x ? 'подключено' : 'отключено';
        $c.style.color = x ? 'green' : 'red'
    }
    function reconnect() {
        if (timer) return;
        timer = setTimeout(() => {
            timer = null;
            connect()
        }, 2000)
    }
    function connect() {
        try {
            ws = new WebSocket('ws://' + window.location.host + '/ws');
        } catch (e) {
            reconnect();
            return;
        }
        ws.onopen = () => setConn(true);
        ws.onmessage = e => {
                const m = e.data || '';
                if (m === 'ON') {
                    $s.className = 'status on';
                    $s.textContent = 'Светодиод включён';
                } else if (m === 'OFF') {
                    $s.className = 'status off';
                    $s.textContent = 'Светодиод выключён';
                }  else if (m.startsWith('SENSOR:')) {
                        $d.textContent = m.split(':')[1];
                    } else if (m.startsWith('TEMP:')) {
                        $t.textContent = m.split(':')[1];
                    } else if (m.startsWith('HUMID:')) {
                        $h.textContent = m.split(':')[1];
                    }
                };
                ws.onclose = () => {
                    setConn(false);
                    $s.className = 'status off';
                    $s.textContent = 'Соединение потеряно';
                    console.log('Socket is closed. Reconnect will be attempted in 1 second.', e.reason);
                    reconnect();
                };
                ws.onerror = function(err) {
                    console.error('Socket encountered error: ', err.message, 'Closing socket');
                    ws.close();
                }
                $b.addEventListener('click', () => {
                    if (ws && ws.readyState === WebSocket.OPEN) ws.send('TOGGLE');
                    else alert('Нет соединения')
                });
                connect();

</script>

Что означает фраза «не распознается массив»? Усы не те или щёки толще?

отправляет есп 16 ть последовательных состояний , не получается в js принять с кодов кто поможет. с датчиков всё ок

                   else if (m.startsWith('p=')) {
                    var arrayS == e.data.split(: );
                    for (var i = 0; i < 11; i++) {
                        if (m === '1') {
                            $p.textContent = m.split(':')[1];
                        } else if (m === '0') {
                            $p.textContent = m.split(':')[1];
                        }
                     }
                    }

пробовал таким образом

Это не код на сервере, а код javascript. Кто выполняет код?

код в браузере, грузится с есп

весь код-рабочий на Ардуино + W5100 + 2 регистра CB4021 для опроса 16 входов (давно) перекладываю под есп

работало на AJAX. пробую переложить на ws и подключить rs485 для опроса частотника

Браузер на каком компьютере работает? На Вашем? IP ардуино верно указали в вашем javascript?

Какой сервер и клиент WS?

Какая библиотека WS используется в esp?

да как только внедряю в ws фрагмент с опросом массива всё не работает есп совсем

нет вифи

#ifdef ARDUINO_ARCH_ESP32
#include <WiFi.h>
#include <AsyncTCP.h>
#else
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#endif
#include <ESPAsyncWebServer.h>
#include "index.h"

Тут нет Websocket. Тут просто TCP соединения.

хорошо, но скрипт работает

Вы для начала сделайте получение через http url. AdvancedWebServer - example.

Websocket - это другое. Хорошо, что еще не wss применили, а то бы вообще ничего не получили.

у меня пока так кусок кода работает

Ну как бы в он есть ESPAsyncWebServer.h, там - Asynchronous HTTP and WebSocket Server

А в чем беда? Нет соединения из скрипта с сервером?

У меня небольшой проект работал, но были затыки с объемом и частотой отправки данных через WS. на гите есть целый параграф который описывает настройку под свои нужды.

Websocket предполагает фазу handshake, который определяет кодирование сообщения. Исходя из длины - сообщения имеют разный формат.

именно отправляю есп массив опроса регистров (16 входов) и как их оросить состояние в скрипте какой 1 или 0. мало опыта конструировать ява

раньше делал в ajax.

<script>
    // Reciver Analog, Digital, Sensor, Modbus DATA
    function GetKontState() {
        nocache = "&nocache=" + Math.random() * 1000000;
        var request = new XMLHttpRequest();
        request.onreadystatechange = function() {
            if (this.readyState == 4) {
                if (this.status == 200) {
                    if (this.responseText != null) {
                        var arrayOfStrings = this.responseText.split(":");
                        //Switches
                        console.log("**** Switches 0-11 ****");
                        for (var i = 0; i < 11; i++) { //Pin pump Service** all 0-12 DI
                            var text = "";
                            if (arrayOfStrings[i] == "1") { // "1" NORMAL Closed
                                text += arrayOfStrings[i];
                                document.getElementById("pin_" + i).innerHTML = text;
                                document.getElementById("pin_" + i).setAttribute("class", "krugOrange");
                                console.log("setpin" + i + "=" + text);
                                text = "";
                            } else {
                                text += arrayOfStrings[i]; // "0" NORMAL Open
                                document.getElementById("pin_" + i).innerHTML = text;
                                document.getElementById("pin_" + i).setAttribute("class", "krugGreen");
                                console.log("setpin" + i + "=" + text);
                                text = "";
                            }
                        }

Какой размер массива?

Передавай данные в JSON расшифровывать на стороне в JS будет просто.
Библиотека для ESP хорошая - https://arduinojson.org/

1 лайк

2 регистра по 8 каналов опроса т.е. [16] + [temp]+[ modbus….]

json в примерах все для ардуино, для есп надо допиливать опять блин.