commit
274e3b359b
@ -1,61 +0,0 @@ |
|||||||
# --------------- esphttpd config options ---------------
|
|
||||||
|
|
||||||
# If GZIP_COMPRESSION is set to "yes" then the static css, js, and html files will be compressed with gzip before added to the espfs image
|
|
||||||
# and will be served with gzip Content-Encoding header.
|
|
||||||
# This could speed up the downloading of these files, but might break compatibility with older web browsers not supporting gzip encoding
|
|
||||||
# because Accept-Encoding is simply ignored. Enable this option if you have large static files to serve (for e.g. JQuery, Twitter bootstrap)
|
|
||||||
# By default only js, css and html files are compressed.
|
|
||||||
# If you have text based static files with different extensions what you want to serve compressed then you will need to add the extension to the following places:
|
|
||||||
# - Add the extension to this Makefile at the webpages.espfs target to the find command
|
|
||||||
# - Add the extension to the gzippedFileTypes array in the user/httpd.c file
|
|
||||||
#
|
|
||||||
# Adding JPG or PNG files (and any other compressed formats) is not recommended, because GZIP compression does not works effectively on compressed files.
|
|
||||||
|
|
||||||
#Static gzipping is disabled by default.
|
|
||||||
GZIP_COMPRESSION = yes
|
|
||||||
|
|
||||||
# If COMPRESS_W_YUI is set to "yes" then the static css and js files will be compressed with yui-compressor
|
|
||||||
# This option works only when GZIP_COMPRESSION is set to "yes"
|
|
||||||
# http://yui.github.io/yuicompressor/
|
|
||||||
#Disabled by default.
|
|
||||||
COMPRESS_W_YUI = no
|
|
||||||
|
|
||||||
YUI-COMPRESSOR = /usr/bin/yui-compressor
|
|
||||||
|
|
||||||
#If USE_HEATSHRINK is set to "yes" then the espfs files will be compressed with Heatshrink and decompressed
|
|
||||||
#on the fly while reading the file. Because the decompression is done in the esp8266, it does not require
|
|
||||||
#any support in the browser.
|
|
||||||
USE_HEATSHRINK = yes
|
|
||||||
|
|
||||||
USE_OPENSDK = yes
|
|
||||||
|
|
||||||
# this ugly trick is needed to allow a relative path
|
|
||||||
SDK_BASE=$(dir $(lastword $(MAKEFILE_LIST)))/esp_iot_sdk_v1.5.2/
|
|
||||||
|
|
||||||
# combined / separate / ota
|
|
||||||
OUTPUT_TYPE = combined
|
|
||||||
|
|
||||||
# SPI flash size, in K
|
|
||||||
ESP_SPI_FLASH_SIZE_K = 1024
|
|
||||||
|
|
||||||
GLOBAL_CFLAGS = \
|
|
||||||
-DDEBUG_ROUTER=0 \
|
|
||||||
-DDEBUG_CAPTDNS=0 \
|
|
||||||
-DDEBUG_HTTP=0 \
|
|
||||||
-DDEBUG_ESPFS=0 \
|
|
||||||
-DDEBUG_PERSIST=1 \
|
|
||||||
-DDEBUG_UTFCACHE=0 \
|
|
||||||
-DDEBUG_CGI=0 \
|
|
||||||
-DDEBUG_WIFI=0 \
|
|
||||||
-DDEBUG_WS=0 \
|
|
||||||
-DDEBUG_ANSI=1 \
|
|
||||||
-DDEBUG_ANSI_NOIMPL=1 \
|
|
||||||
-DDEBUG_INPUT=0 \
|
|
||||||
-DDEBUG_HEAP=1 \
|
|
||||||
-DDEBUG_MALLOC=0 \
|
|
||||||
-DHTTPD_MAX_BACKLOG_SIZE=8192 \
|
|
||||||
-DHTTPD_MAX_HEAD_LEN=1024 \
|
|
||||||
-DHTTPD_MAX_POST_LEN=512 \
|
|
||||||
-DDEBUG_LOGBUF_SIZE=1024 \
|
|
||||||
-mforce-l32 \
|
|
||||||
-DUSE_OPTIMIZE_PRINTF=1
|
|
@ -1 +1 @@ |
|||||||
Subproject commit f5dd70a6f32ac36f0820badc170832f27242a09d |
Subproject commit 01148465b71b640892a50ec825205ae581d6dca7 |
@ -0,0 +1,14 @@ |
|||||||
|
//
|
||||||
|
// Created by MightyPork on 2017/10/03.
|
||||||
|
//
|
||||||
|
// helper for building release packages
|
||||||
|
//
|
||||||
|
// Run with `tcc -run`
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "user/version.h" |
||||||
|
#include <stdio.h> |
||||||
|
|
||||||
|
void main() { |
||||||
|
printf(FW_VERSION); |
||||||
|
} |
@ -1 +0,0 @@ |
|||||||
|
|
@ -1 +1 @@ |
|||||||
Subproject commit 3479ab3efcb4581669370cde6a607f936ff5515a |
Subproject commit e4ecf0724e36c828be5222eddce58a6a5cd2386f |
@ -0,0 +1,21 @@ |
|||||||
|
This is a release archive of ESPTerm, |
||||||
|
the VT100 terminal emulator for ESP8266. |
||||||
|
|
||||||
|
-------------------------------------------- |
||||||
|
Version: %VERS% |
||||||
|
Locale : %LANG% |
||||||
|
Built : %DATETIME% |
||||||
|
-------------------------------------------- |
||||||
|
|
||||||
|
Source repository: |
||||||
|
https://github.com/espterm/espterm-firmware |
||||||
|
|
||||||
|
Report any bugs to our bug-tracker at |
||||||
|
https://github.com/espterm/espterm-firmware/issues |
||||||
|
or send them to out mailing list |
||||||
|
espterm-dev@googlegroups.com |
||||||
|
|
||||||
|
On-line demo is available at |
||||||
|
https://espterm.github.io/term.html |
||||||
|
|
||||||
|
[EOF] |
@ -0,0 +1,26 @@ |
|||||||
|
#!/usr/bin/env bash |
||||||
|
|
||||||
|
# The parameters ESPTOOL, ESPPORT and ESPBAUD can be customized |
||||||
|
# - export your preferred values in .bashrc |
||||||
|
|
||||||
|
echo -e "\e[32;1mFlashing ESPTerm %VERS% (%LANG%)\e[0m" |
||||||
|
|
||||||
|
if [ -z ${ESPTOOL} ]; then |
||||||
|
ESPTOOL='esptool' |
||||||
|
which ${ESPTOOL} &>/dev/null |
||||||
|
if [ $? -ne 0 ]; then |
||||||
|
ESPTOOL='esptool.py' |
||||||
|
which ${ESPTOOL} &>/dev/null |
||||||
|
if [ $? -ne 0 ]; then |
||||||
|
echo -e '\e[31;1mesptool not found!\e[0m' |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
fi |
||||||
|
fi |
||||||
|
|
||||||
|
[ -z ESPPORT ] && ESPPORT=/dev/ttyUSB0 |
||||||
|
[ -z ESPBAUD ] && ESPBAUD=460800 |
||||||
|
|
||||||
|
set -x |
||||||
|
${ESPTOOL} --port ${ESPPORT} --baud ${ESPBAUD} \ |
||||||
|
write_flash 0x00000 '%FILE0%' 0x40000 '%FILE4%' |
@ -0,0 +1,3 @@ |
|||||||
|
* |
||||||
|
!.gitignore |
||||||
|
!flash-tpl.sh |
@ -0,0 +1,69 @@ |
|||||||
|
#!/usr/bin/env bash |
||||||
|
|
||||||
|
if [ -z "$1" ]; then |
||||||
|
vers=$(tcc -run get_version.c) |
||||||
|
else |
||||||
|
vers=$1 |
||||||
|
fi |
||||||
|
|
||||||
|
git pull |
||||||
|
|
||||||
|
echo -n -e "\e[1;36mBuilding packages for version $vers\e[0m" |
||||||
|
|
||||||
|
cd front-end |
||||||
|
git pull |
||||||
|
cd .. |
||||||
|
|
||||||
|
function buildlang() { |
||||||
|
lang=$1 |
||||||
|
|
||||||
|
echo -e "\n\e[33;1m------ Building \"${lang}\" package ------\e[0m\n" |
||||||
|
|
||||||
|
make clean |
||||||
|
ESP_LANG=${lang} make web |
||||||
|
ESP_LANG=${lang} make actual_all -B -j4 |
||||||
|
|
||||||
|
cd release |
||||||
|
|
||||||
|
destdir="$vers-$lang" |
||||||
|
file0=${vers}-0x00000-${lang}.bin |
||||||
|
file4=${vers}-0x40000-${lang}.bin |
||||||
|
[ -e ${destdir} ] && rm -r ${destdir} |
||||||
|
mkdir ${destdir} |
||||||
|
cp ../firmware/0x00000.bin ${destdir}/${file0} |
||||||
|
cp ../firmware/0x40000.bin ${destdir}/${file4} |
||||||
|
|
||||||
|
flashsh=${destdir}/flash.sh |
||||||
|
cp ../rel-tpl/flash.sh ${flashsh} |
||||||
|
sed -i s/%FILE0%/${file0}/ ${flashsh} |
||||||
|
sed -i s/%FILE4%/${file4}/ ${flashsh} |
||||||
|
sed -i s/%VERS%/${vers}/ ${flashsh} |
||||||
|
sed -i s/%LANG%/${lang}/ ${flashsh} |
||||||
|
chmod +x ${flashsh} |
||||||
|
|
||||||
|
readmefil=${destdir}/README.txt |
||||||
|
cp ../rel-tpl/README.txt ${readmefil} |
||||||
|
sed -i s/%VERS%/${vers}/ ${readmefil} |
||||||
|
sed -i s/%LANG%/${lang}/ ${readmefil} |
||||||
|
dt=$(LC_TIME=en_US.UTF-8 date '+%c') |
||||||
|
sed -i "s#%DATETIME%#${dt}#" ${readmefil} |
||||||
|
unix2dos ${readmefil} |
||||||
|
|
||||||
|
cd ${destdir} |
||||||
|
sha256sum ${file0} ${file4} README.txt flash.sh > checksums.txt |
||||||
|
cd .. |
||||||
|
|
||||||
|
targetfile=espterm-${vers}-${lang}.zip |
||||||
|
[[ -e ${targetfile}.zip ]] && rm ${targetfile}.zip |
||||||
|
pwd |
||||||
|
zip -9 ${targetfile} ${destdir}/* |
||||||
|
cd .. |
||||||
|
} |
||||||
|
|
||||||
|
if [ -z "$ESP_LANG" ]; then |
||||||
|
buildlang cs |
||||||
|
buildlang en |
||||||
|
buildlang de |
||||||
|
else |
||||||
|
buildlang ${ESP_LANG} |
||||||
|
fi |
@ -0,0 +1,34 @@ |
|||||||
|
//
|
||||||
|
// Created by MightyPork on 2017/08/20.
|
||||||
|
//
|
||||||
|
// Handle privacy messages
|
||||||
|
// PM Pt ST
|
||||||
|
// (PM = ESC ^)
|
||||||
|
//
|
||||||
|
// Those are used for device-to-device communication.
|
||||||
|
// They were not used for anything in the original VT100 and are not
|
||||||
|
// used by Xterm or any other common emulator, but they should be safely discarded.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <esp8266.h> |
||||||
|
#include <httpclient.h> |
||||||
|
#include "apars_pm.h" |
||||||
|
#include "version.h" |
||||||
|
#include "ansi_parser_callbacks.h" |
||||||
|
#include "screen.h" |
||||||
|
#include "apars_logging.h" |
||||||
|
#include "cgi_d2d.h" |
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper function to parse incoming DCS (Device Control String) |
||||||
|
* @param msg - the DCS body (after DCS and before ST) |
||||||
|
*/ |
||||||
|
void ICACHE_FLASH_ATTR |
||||||
|
apars_handle_pm(char *msg) |
||||||
|
{ |
||||||
|
if (d2d_parse_command(msg)) return; |
||||||
|
|
||||||
|
return; |
||||||
|
fail: |
||||||
|
ansi_warn("D2D message error: %s", msg); |
||||||
|
} |
@ -0,0 +1,10 @@ |
|||||||
|
//
|
||||||
|
// Created by MightyPork on 2017/08/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef ESP_VT100_FIRMWARE_APARS_PM_H |
||||||
|
#define ESP_VT100_FIRMWARE_APARS_PM_H |
||||||
|
|
||||||
|
void apars_handle_pm(char *msg); |
||||||
|
|
||||||
|
#endif //ESP_VT100_FIRMWARE_APARS_PM_H
|
@ -0,0 +1,15 @@ |
|||||||
|
//
|
||||||
|
// Created by MightyPork on 2017/10/01.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef ESPTERM_API_H |
||||||
|
#define ESPTERM_API_H |
||||||
|
|
||||||
|
// TODO use X-MACRO for access restrictions etc
|
||||||
|
|
||||||
|
#define API_D2D_MSG "/api/v1/msg" |
||||||
|
#define API_REBOOT "/api/v1/reboot" |
||||||
|
#define API_PING "/api/v1/ping" |
||||||
|
#define API_CLEAR "/api/v1/clear" |
||||||
|
|
||||||
|
#endif //ESPTERM_API_H
|
@ -0,0 +1,324 @@ |
|||||||
|
//
|
||||||
|
// Created by MightyPork on 2017/10/01.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <esp8266.h> |
||||||
|
#include "cgi_d2d.h" |
||||||
|
#include "version.h" |
||||||
|
#include "ansi_parser_callbacks.h" |
||||||
|
#include "api.h" |
||||||
|
#include "uart_driver.h" |
||||||
|
#include <httpclient.h> |
||||||
|
#include <esp_utils.h> |
||||||
|
|
||||||
|
#define D2D_TIMEOUT_MS 2000 |
||||||
|
|
||||||
|
#define D2D_HEADERS \ |
||||||
|
"User-Agent: ESPTerm "VERSION_STRING" like curl wget HTTPie\r\n" \
|
||||||
|
"Content-Type: text/plain; charset=utf-8\r\n" \
|
||||||
|
"Accept-Encoding: identity\r\n" \
|
||||||
|
"Accept-Charset: utf-8\r\n" \
|
||||||
|
"Accept: text/*, application/json\r\n" \
|
||||||
|
"Cache-Control: no-cache,private,max-age=0\r\n" |
||||||
|
|
||||||
|
struct d2d_request_opts { |
||||||
|
bool want_body; |
||||||
|
bool want_head; |
||||||
|
size_t max_result_len; |
||||||
|
char *nonce; |
||||||
|
}; |
||||||
|
|
||||||
|
volatile bool request_pending = false; |
||||||
|
|
||||||
|
// NOTE! We bypass the async buffer here - used for user input and
|
||||||
|
// responses to queries {apars_respond()}. In rare situations this could
|
||||||
|
// lead to a race condition and mixing two different messages
|
||||||
|
static inline void ICACHE_FLASH_ATTR sendResponseToUART(const char *str) |
||||||
|
{ |
||||||
|
UART_WriteString(UART0, str, UART_TIMEOUT_US); |
||||||
|
} |
||||||
|
|
||||||
|
static void ICACHE_FLASH_ATTR |
||||||
|
requestNoopCb(int http_status, |
||||||
|
char *response_headers, |
||||||
|
char *response_body, |
||||||
|
size_t body_size, |
||||||
|
void *userArg) |
||||||
|
{ |
||||||
|
request_pending = false; |
||||||
|
if (userArg != NULL) free(userArg); |
||||||
|
} |
||||||
|
|
||||||
|
static void ICACHE_FLASH_ATTR |
||||||
|
requestCb(int http_status, |
||||||
|
char *response_headers, |
||||||
|
char *response_body, |
||||||
|
size_t body_size, |
||||||
|
void *userArg) |
||||||
|
{ |
||||||
|
if (userArg == NULL) { |
||||||
|
request_pending = false; |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
struct d2d_request_opts *opts = userArg; |
||||||
|
|
||||||
|
// ensure positive - would be hard to parse
|
||||||
|
if (http_status < 0) http_status = -http_status; |
||||||
|
|
||||||
|
char buff100[100]; |
||||||
|
int len = 0; |
||||||
|
size_t headers_size = strlen(response_headers); |
||||||
|
|
||||||
|
if (opts->want_head) len += headers_size; |
||||||
|
if (opts->want_body) len += body_size + (opts->want_head*2); |
||||||
|
if (opts->max_result_len > 0 && len > opts->max_result_len) |
||||||
|
len = (int) opts->max_result_len; |
||||||
|
|
||||||
|
d2d_info("Rx HTTP response, code %d, len %d, nonce \"%s\"", http_status, len, opts->nonce?opts->nonce:""); |
||||||
|
|
||||||
|
char *bb = buff100; |
||||||
|
bb += sprintf(bb, "\x1b^h;%d;", http_status); |
||||||
|
const char *comma = ""; |
||||||
|
|
||||||
|
if (opts->want_head) { |
||||||
|
bb += sprintf(bb, "%sH", comma); |
||||||
|
comma = ","; |
||||||
|
} |
||||||
|
|
||||||
|
if (opts->want_body) { |
||||||
|
bb += sprintf(bb, "%sB", comma); |
||||||
|
comma = ","; |
||||||
|
} |
||||||
|
|
||||||
|
if (opts->nonce) { |
||||||
|
bb += sprintf(bb, "%sN=%s", comma, opts->nonce); |
||||||
|
comma = ","; |
||||||
|
} |
||||||
|
|
||||||
|
if (opts->want_head || opts->want_body) { |
||||||
|
bb += sprintf(bb, "%sL=%d", comma, len); |
||||||
|
//comma = ",";
|
||||||
|
} |
||||||
|
|
||||||
|
// semicolon only if more data is to be sent
|
||||||
|
if (opts->want_head || opts->want_body) sprintf(bb, ";"); |
||||||
|
|
||||||
|
sendResponseToUART(buff100); |
||||||
|
|
||||||
|
//d2d_dbg("Headers (part) %100s", response_headers);
|
||||||
|
//d2d_dbg("Body (part) %100s", response_body);
|
||||||
|
|
||||||
|
// head and payload separated by \r\n\r\n (one \r\n is at the end of head - maybe)
|
||||||
|
if (opts->want_head) { |
||||||
|
// truncate
|
||||||
|
if (headers_size > len) { |
||||||
|
response_headers[len] = 0; |
||||||
|
opts->want_body = false; // soz, it wouldn't fit
|
||||||
|
} |
||||||
|
sendResponseToUART(response_headers); |
||||||
|
if(opts->want_body) sendResponseToUART("\r\n"); |
||||||
|
} |
||||||
|
|
||||||
|
if(opts->want_body) { |
||||||
|
// truncate
|
||||||
|
if (opts->want_head*(headers_size+2)+body_size > len) { |
||||||
|
response_body[len - (opts->want_head*(headers_size+2))] = 0; |
||||||
|
} |
||||||
|
|
||||||
|
sendResponseToUART(response_body); |
||||||
|
} |
||||||
|
|
||||||
|
sendResponseToUART("\a"); |
||||||
|
|
||||||
|
free(opts->nonce); |
||||||
|
free(opts); |
||||||
|
|
||||||
|
request_pending = false; |
||||||
|
} |
||||||
|
|
||||||
|
bool ICACHE_FLASH_ATTR |
||||||
|
d2d_parse_command(char *msg) |
||||||
|
{ |
||||||
|
char buff40[40]; |
||||||
|
char *p; |
||||||
|
|
||||||
|
#define FIND_NEXT(target, delim) do { \ |
||||||
|
p = strchr(msg, (delim)); \
|
||||||
|
if (p == NULL) return false; \
|
||||||
|
*p = '\0'; \
|
||||||
|
(target) = msg; \
|
||||||
|
msg = p + 1; \
|
||||||
|
} while(0) \
|
||||||
|
|
||||||
|
if (strstarts(msg, "M;")) { |
||||||
|
if (request_pending) return false; |
||||||
|
|
||||||
|
// Send a esp-esp message
|
||||||
|
msg += 2; |
||||||
|
const char *ip; |
||||||
|
FIND_NEXT(ip, ';'); |
||||||
|
const char *payload = msg; |
||||||
|
|
||||||
|
d2d_info("D2D Tx,dest=%s,msg=%s", ip, payload); |
||||||
|
sprintf(buff40, "http://%s" API_D2D_MSG, ip); |
||||||
|
|
||||||
|
httpclient_args args; |
||||||
|
httpclient_args_init(&args); |
||||||
|
args.method = HTTPD_METHOD_POST; |
||||||
|
args.body = payload; |
||||||
|
args.headers = D2D_HEADERS; |
||||||
|
args.timeout = D2D_TIMEOUT_MS; |
||||||
|
args.url = buff40; // "escapes scope" warning - can ignore, strdup is used
|
||||||
|
|
||||||
|
request_pending = true; |
||||||
|
http_request(&args, requestNoopCb); |
||||||
|
return true; |
||||||
|
} |
||||||
|
else if (strstarts(msg, "H;")) { |
||||||
|
if (request_pending) return false; |
||||||
|
|
||||||
|
// Send a esp-esp message
|
||||||
|
msg += 2; |
||||||
|
const char *method = NULL; |
||||||
|
const char *params = NULL; |
||||||
|
const char *nonce = NULL; |
||||||
|
const char *url = NULL; |
||||||
|
const char *payload = NULL; |
||||||
|
httpd_method methodNum; |
||||||
|
|
||||||
|
FIND_NEXT(method, ';'); |
||||||
|
|
||||||
|
if (streq(method, "GET")) methodNum = HTTPD_METHOD_GET; |
||||||
|
else if (streq(method, "POST")) methodNum = HTTPD_METHOD_POST; |
||||||
|
else if (streq(method, "OPTIONS")) methodNum = HTTPD_METHOD_OPTIONS; |
||||||
|
else if (streq(method, "PUT")) methodNum = HTTPD_METHOD_PUT; |
||||||
|
else if (streq(method, "DELETE")) methodNum = HTTPD_METHOD_DELETE; |
||||||
|
else if (streq(method, "PATCH")) methodNum = HTTPD_METHOD_PATCH; |
||||||
|
else if (streq(method, "HEAD")) methodNum = HTTPD_METHOD_HEAD; |
||||||
|
else { |
||||||
|
d2d_warn("BAD METHOD: %s", method); |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
FIND_NEXT(params, ';'); |
||||||
|
|
||||||
|
d2d_info("HTTP request"); |
||||||
|
d2d_dbg("Method %s", method); |
||||||
|
size_t max_buf_len = HTTPCLIENT_DEF_MAX_LEN; |
||||||
|
size_t max_result_len = 0; // 0 = no truncate
|
||||||
|
uint timeout = HTTPCLIENT_DEF_TIMEOUT_MS; |
||||||
|
bool want_body = 0; |
||||||
|
bool want_head = 0; |
||||||
|
bool no_resp = 0; |
||||||
|
|
||||||
|
do { |
||||||
|
p = strchr(params, ','); |
||||||
|
if (p != NULL) *p = '\0'; |
||||||
|
const char *param = params; |
||||||
|
if (params[0] == 0) break; // no params
|
||||||
|
|
||||||
|
if(streq(param, "H")) want_head = 1; // Return head
|
||||||
|
else if(streq(param, "B")) want_body = 1; // Return body
|
||||||
|
else if(streq(param, "X")) no_resp = 1; // X - no response, no callback
|
||||||
|
else if(strstarts(param, "l=")) { // max buffer length
|
||||||
|
max_buf_len = (size_t) atoi(param + 2); |
||||||
|
} else if(strstarts(param, "L=")) { // max length
|
||||||
|
max_result_len = (size_t) atoi(param + 2); |
||||||
|
} else if(strstarts(param, "T=")) { // timeout
|
||||||
|
timeout = (uint) atoi(param + 2); |
||||||
|
} else if(strstarts(param, "N=")) { // Nonce
|
||||||
|
nonce = param+2; |
||||||
|
} else { |
||||||
|
d2d_warn("BAD PARAM: %s", param); |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
d2d_dbg("- param %s", params); |
||||||
|
|
||||||
|
if (p == NULL) break; |
||||||
|
params = p + 1; |
||||||
|
} while(1); |
||||||
|
|
||||||
|
p = strchr(msg, '\n'); |
||||||
|
if (p != NULL) *p = '\0'; |
||||||
|
url = msg; |
||||||
|
d2d_dbg("URL: %s", url); |
||||||
|
|
||||||
|
if (p != NULL) { |
||||||
|
payload = p + 1; |
||||||
|
d2d_dbg("Payload: %s", payload); |
||||||
|
} else { |
||||||
|
payload = NULL; |
||||||
|
} |
||||||
|
|
||||||
|
httpclient_args args; |
||||||
|
httpclient_args_init(&args); |
||||||
|
args.method = methodNum; |
||||||
|
args.body = payload; |
||||||
|
args.headers = D2D_HEADERS; |
||||||
|
args.timeout = timeout; |
||||||
|
args.max_response_len = max_buf_len; |
||||||
|
args.url = url; |
||||||
|
|
||||||
|
if (!no_resp) { |
||||||
|
struct d2d_request_opts *opts = malloc(sizeof(struct d2d_request_opts)); |
||||||
|
opts->want_body = want_body; |
||||||
|
opts->want_head = want_head; |
||||||
|
opts->max_result_len = max_result_len; |
||||||
|
opts->nonce = esp_strdup(nonce); |
||||||
|
args.userData = opts; |
||||||
|
} |
||||||
|
|
||||||
|
request_pending = true; |
||||||
|
http_request(&args, no_resp ? requestNoopCb : requestCb); |
||||||
|
|
||||||
|
d2d_dbg("Request sent."); |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
httpd_cgi_state ICACHE_FLASH_ATTR cgiD2DMessage(HttpdConnData *connData) |
||||||
|
{ |
||||||
|
if (connData->conn==NULL) { |
||||||
|
//Connection aborted. Clean up.
|
||||||
|
return HTTPD_CGI_DONE; |
||||||
|
} |
||||||
|
|
||||||
|
size_t len = 0; |
||||||
|
if (connData->post && connData->post->buff) |
||||||
|
len = strlen(connData->post->buff); |
||||||
|
else if (connData->getArgs) |
||||||
|
len = strlen(connData->getArgs); |
||||||
|
else |
||||||
|
len = 0; |
||||||
|
|
||||||
|
u8 *ip = connData->remote_ip; |
||||||
|
char buf[20]; |
||||||
|
sprintf(buf, "\x1b^m;"IPSTR";L=%d;", ip[0], ip[1], ip[2], ip[3], (int)len); |
||||||
|
sendResponseToUART(buf); |
||||||
|
|
||||||
|
if (connData->post && connData->post->buff) |
||||||
|
sendResponseToUART(connData->post->buff); |
||||||
|
else if (connData->getArgs) |
||||||
|
sendResponseToUART(connData->getArgs); |
||||||
|
|
||||||
|
sendResponseToUART("\a"); |
||||||
|
|
||||||
|
d2d_info("D2D Rx src="IPSTR",len=%d", ip[0], ip[1], ip[2], ip[3],len); |
||||||
|
|
||||||
|
// Received a msg
|
||||||
|
|
||||||
|
httdResponseOptions(connData, 0); |
||||||
|
httdSetTransferMode(connData, HTTPD_TRANSFER_CLOSE); |
||||||
|
|
||||||
|
httpdStartResponse(connData, 200); |
||||||
|
httpdHeader(connData, "Content-Type", "text/plain"); |
||||||
|
httpdEndHeaders(connData); |
||||||
|
|
||||||
|
httpdSend(connData, "message received\r\n", -1); |
||||||
|
|
||||||
|
return HTTPD_CGI_DONE; |
||||||
|
} |
@ -0,0 +1,25 @@ |
|||||||
|
//
|
||||||
|
// Created by MightyPork on 2017/10/01.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef ESPTERM_CGI_D2D_H |
||||||
|
#define ESPTERM_CGI_D2D_H |
||||||
|
|
||||||
|
#include <esp8266.h> |
||||||
|
#include <httpd.h> |
||||||
|
|
||||||
|
#if DEBUG_D2D |
||||||
|
#define d2d_warn warn |
||||||
|
#define d2d_dbg dbg |
||||||
|
#define d2d_info info |
||||||
|
#else |
||||||
|
#define d2d_warn(fmt, ...) |
||||||
|
#define d2d_dbg(fmt, ...) |
||||||
|
#define d2d_info(fmt, ...) |
||||||
|
#endif |
||||||
|
|
||||||
|
bool d2d_parse_command(char *msg); |
||||||
|
|
||||||
|
httpd_cgi_state cgiD2DMessage(HttpdConnData *connData); |
||||||
|
|
||||||
|
#endif //ESPTERM_CGI_D2D_H
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue