Уважаемые форумчане, приветствую Вас. Столкнулся с проблемой передачи JSON файла на Arduino. К сожалению, в программировании Arduino не силен. В наличии имеется Arduino Due и Ethernet Shield W5100. В общих словах, делаю систему которая отображает состояния линий (сообщает если случился обрыв). Arduino выступает в роли сервера, снимает информацию аварии с аппаратуры. Имеется клиентская часть написанная на JavaScript. Функция отправляет на сервер справочную информацию в JSON( периодически изменяется на клиентской стороне)
let response = await fetch ('editJSON', {
method: 'POST',
headers: {
'Content-Type': 'application/json;charset=utf-8'
},
body: JSON.stringify(systemsArray)
});
}
На сервере принимает и записывает в файл
#include <Ethernet.h>
#include <SD.h>
#define REQ_BUF_SZ 128
#define FIRST_PIN 40
#define LAST_PIN 51
#define FREE_SOCKETS 1
File webFile;
File sisFile;
EthernetClient client;
#define MAX_BUFFER_SIZE 1024
uint16_t rsize;
uint8_t buff[MAX_BUFFER_SIZE];
char HTTP_req[REQ_BUF_SZ] = { 0 }; // buffered HTTP request stored as null terminated string
char req_index = 0; // index into HTTP_req buffer
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 0, 110);
EthernetServer server(80);
void setup() {
Serial.begin(9600);
for (int i = FIRST_PIN; i <= LAST_PIN; i++) {
pinMode(i, INPUT);
}
SD.begin(4);
Ethernet.begin(mac, ip);
server.begin();
digitalWrite(10,HIGH);
}
void loop() {
serverWorks();
}
void serverWorks2(EthernetClient sclient) {
if (sclient) {
boolean currentLineIsBlank = true;
while (sclient.connected()) {
if (sclient.available()) {
char c = sclient.read();
if (req_index < (REQ_BUF_SZ - 1)) {
HTTP_req[req_index] = c; // читаем посимвольно запрос
req_index++;
}
if (c == '\n' && currentLineIsBlank) { //Здесь убрал ненужные запросы
else if (StrContains(HTTP_req, "POST /editJSON")) {
if (SD.exists("sisa.json")){
SD.remove("sisa.json");
}
sisFile = SD.open("sisa.json",FILE_WRITE);
while(sclient.connected()){
sclient.println("HTTP/1.1 200 OK");
sclient.println("Content-Type:application/json;charset=utf-8");
while(sclient.available()){
char f = sclient.read();
sisFile.write(f);
}
req_index = 0;
StrClear(HTTP_req, REQ_BUF_SZ);
break;
}
sisFile.close();
}
if (webFile) {
while (webFile.available()) {
sclient.write(webFile.read());
}
webFile.close();
}
req_index = 0;
StrClear(HTTP_req, REQ_BUF_SZ);
break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
} else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
sclient.stop();
}
}
void StrClear(char *str, char length) {
for (int i = 0; i < length; i++) {
str[i] = 0;
}
}
char StrContains(char *str, char *sfind) {
char found = 0;
char index = 0;
char len;
len = strlen(str);
if (strlen(sfind) > len) {
return 0;
}
while (index < len) {
if (str[index] == sfind[found]) {
found++;
if (strlen(sfind) == found) {
return 1;
}
} else {
found = 0;
}
index++;
}
return 0;
}
void serverWorks() {
for (int sock = 0; sock < MAX_SOCK_NUM - FREE_SOCKETS; sock++) {
EthernetClient sclient = server.available_(sock);
serverWorks2(sclient);
}
}
Но передача каждый раз обрывается на 1.49 секунде…Если поставить задержку в цикле не менее 4мс, то тогда передача проходит, но время передачи становится неприлично большое
while(sclient.available()){
char f = sclient.read();
sisFile.write(f);;
delay(4);
}
Использую нестандартную библиотеку Ethernet (Ethernet библиотека), т.к. стандартная частенько сбрасывала загрузку ресурсов и как-то нестабильно работала. Буду очень признателен за любую помощь.