Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
Nodemcu Firmware
Commits
c4600006
Commit
c4600006
authored
Mar 15, 2015
by
funshine
Browse files
reduce coap module memory usage
parent
d28a2c9e
Changes
7
Show whitespace changes
Inline
Side-by-side
app/coap/coap_client.h
View file @
c4600006
#ifndef _COAP_
SERVER
_H
#define _COAP_
SERVER
_H 1
#ifndef _COAP_
CLIENT
_H
#define _COAP_
CLIENT
_H 1
#ifdef __cplusplus
extern
"C"
{
#endif
size_t
coap_server_respond
(
char
*
data
,
unsigned
short
len
,
unsigned
short
size
);
void
coap_client_response_handler
(
char
*
data
,
unsigned
short
len
,
unsigned
short
size
,
const
uint32_t
ip
,
const
uint32_t
port
);
#ifdef __cplusplus
}
...
...
app/coap/coap_server.c
View file @
c4600006
...
...
@@ -3,14 +3,10 @@
#include "coap.h"
size_t
coap_server_respond
(
char
*
data
,
unsigned
short
len
,
unsigned
short
size
)
size_t
coap_server_respond
(
char
*
req
,
unsigned
short
req
len
,
char
*
rsp
,
unsigned
short
rsplen
)
{
NODE_DBG
(
"coap_server_respond is called.
\n
"
);
if
(
len
>
size
){
NODE_DBG
(
"len:%d, size:%d
\n
"
,
len
,
size
);
return
0
;
}
size_t
rsplen
=
size
;
size_t
rlen
=
rsplen
;
coap_packet_t
pkt
;
uint8_t
scratch_raw
[
4
];
coap_rw_buffer_t
scratch_buf
=
{
scratch_raw
,
sizeof
(
scratch_raw
)};
...
...
@@ -18,11 +14,11 @@ size_t coap_server_respond(char *data, unsigned short len, unsigned short size)
#ifdef COAP_DEBUG
NODE_DBG
(
"Received: "
);
coap_dump
(
data
,
len
,
true
);
coap_dump
(
req
,
req
len
,
true
);
NODE_DBG
(
"
\n
"
);
#endif
if
(
0
!=
(
rc
=
coap_parse
(
&
pkt
,
data
,
len
))){
if
(
0
!=
(
rc
=
coap_parse
(
&
pkt
,
req
,
req
len
))){
NODE_DBG
(
"Bad packet rc=%d
\n
"
,
rc
);
return
0
;
}
...
...
@@ -33,7 +29,7 @@ size_t coap_server_respond(char *data, unsigned short len, unsigned short size)
coap_dumpPacket
(
&
pkt
);
#endif
coap_handle_req
(
&
scratch_buf
,
&
pkt
,
&
rsppkt
);
if
(
0
!=
(
rc
=
coap_build
(
data
,
&
r
sp
len
,
&
rsppkt
))){
if
(
0
!=
(
rc
=
coap_build
(
rsp
,
&
rlen
,
&
rsppkt
))){
NODE_DBG
(
"coap_build failed rc=%d
\n
"
,
rc
);
return
0
;
}
...
...
@@ -41,13 +37,13 @@ size_t coap_server_respond(char *data, unsigned short len, unsigned short size)
{
#ifdef COAP_DEBUG
NODE_DBG
(
"Responding: "
);
coap_dump
(
data
,
r
sp
len
,
true
);
coap_dump
(
rsp
,
rlen
,
true
);
NODE_DBG
(
"
\n
"
);
#endif
#ifdef COAP_DEBUG
coap_dumpPacket
(
&
rsppkt
);
#endif
}
return
r
sp
len
;
return
rlen
;
}
}
app/coap/coap_server.h
View file @
c4600006
...
...
@@ -5,7 +5,7 @@
extern
"C"
{
#endif
size_t
coap_server_respond
(
char
*
data
,
unsigned
short
len
,
unsigned
short
size
);
size_t
coap_server_respond
(
char
*
req
,
unsigned
short
req
len
,
char
*
rsp
,
unsigned
short
rsplen
);
#ifdef __cplusplus
}
...
...
app/coap/endpoints.c
View file @
c4600006
...
...
@@ -8,8 +8,8 @@
#include "os_type.h"
static
char
rsp
[
MAX_PAYLOAD_SIZE
]
=
""
;
const
uint16_t
rsplen
=
MAX_PAYLOAD_SIZE
;
static
char
rsp
[
512
]
=
""
;
const
uint16_t
rsplen
=
512
;
void
build_well_known_rsp
(
void
);
void
endpoint_setup
(
void
)
...
...
@@ -29,6 +29,7 @@ static int handle_get_variable(const coap_endpoint_t *ep, coap_rw_buffer_t *scra
{
const
coap_option_t
*
opt
;
uint8_t
count
;
int
n
;
if
(
NULL
!=
(
opt
=
coap_findOptions
(
inpkt
,
COAP_OPTION_URI_PATH
,
&
count
)))
{
if
((
count
!=
ep
->
path
->
count
)
&&
(
count
!=
ep
->
path
->
count
+
1
))
// +1 for /f/[function], /v/[variable]
...
...
@@ -54,14 +55,15 @@ static int handle_get_variable(const coap_endpoint_t *ep, coap_rw_buffer_t *scra
return
coap_make_response
(
scratch
,
outpkt
,
NULL
,
0
,
id_hi
,
id_lo
,
&
inpkt
->
tok
,
COAP_RSPCODE_NOT_FOUND
,
COAP_CONTENTTYPE_NONE
);
if
(
c_strlen
(
h
->
name
))
{
n
=
lua_gettop
(
h
->
L
);
lua_getglobal
(
h
->
L
,
h
->
name
);
if
(
!
lua_isnumber
(
h
->
L
,
-
1
))
{
NODE_DBG
(
"should be a number.
\n
"
);
lua_
p
op
(
h
->
L
,
1
);
lua_
sett
op
(
h
->
L
,
n
);
return
coap_make_response
(
scratch
,
outpkt
,
NULL
,
0
,
id_hi
,
id_lo
,
&
inpkt
->
tok
,
COAP_RSPCODE_NOT_FOUND
,
COAP_CONTENTTYPE_NONE
);
}
else
{
const
char
*
res
=
lua_tostring
(
h
->
L
,
-
1
);
lua_
p
op
(
h
->
L
,
1
);
lua_
sett
op
(
h
->
L
,
n
);
return
coap_make_response
(
scratch
,
outpkt
,
(
const
uint8_t
*
)
res
,
c_strlen
(
res
),
id_hi
,
id_lo
,
&
inpkt
->
tok
,
COAP_RSPCODE_CONTENT
,
COAP_CONTENTTYPE_TEXT_PLAIN
);
}
}
...
...
@@ -84,6 +86,7 @@ static int handle_post_function(const coap_endpoint_t *ep, coap_rw_buffer_t *scr
{
const
coap_option_t
*
opt
;
uint8_t
count
;
int
n
;
if
(
NULL
!=
(
opt
=
coap_findOptions
(
inpkt
,
COAP_OPTION_URI_PATH
,
&
count
)))
{
if
((
count
!=
ep
->
path
->
count
)
&&
(
count
!=
ep
->
path
->
count
+
1
))
// +1 for /f/[function], /v/[variable]
...
...
@@ -111,10 +114,11 @@ static int handle_post_function(const coap_endpoint_t *ep, coap_rw_buffer_t *scr
if
(
c_strlen
(
h
->
name
))
{
n
=
lua_gettop
(
h
->
L
);
lua_getglobal
(
h
->
L
,
h
->
name
);
if
(
lua_type
(
h
->
L
,
-
1
)
!=
LUA_TFUNCTION
)
{
NODE_DBG
(
"should be a function
\n
"
);
lua_
p
op
(
h
->
L
,
1
);
lua_
sett
op
(
h
->
L
,
n
);
return
coap_make_response
(
scratch
,
outpkt
,
NULL
,
0
,
id_hi
,
id_lo
,
&
inpkt
->
tok
,
COAP_RSPCODE_NOT_FOUND
,
COAP_CONTENTTYPE_NONE
);
}
else
{
lua_pushlstring
(
h
->
L
,
inpkt
->
payload
.
p
,
inpkt
->
payload
.
len
);
// make sure payload.p is filled with '\0' after payload.len, or use lua_pushlstring
...
...
@@ -125,14 +129,17 @@ static int handle_post_function(const coap_endpoint_t *ep, coap_rw_buffer_t *scr
size_t
len
=
0
;
const
char
*
ret
=
luaL_checklstring
(
h
->
L
,
-
1
,
&
len
);
if
(
len
>
MAX_PAYLOAD_SIZE
){
lua_settop
(
h
->
L
,
n
);
luaL_error
(
h
->
L
,
"return string:<MAX_PAYLOAD_SIZE"
);
return
coap_make_response
(
scratch
,
outpkt
,
NULL
,
0
,
id_hi
,
id_lo
,
&
inpkt
->
tok
,
COAP_RSPCODE_NOT_FOUND
,
COAP_CONTENTTYPE_NONE
);
}
NODE_DBG
((
char
*
)
ret
);
NODE_DBG
(
"
\n
"
);
lua_settop
(
h
->
L
,
n
);
return
coap_make_response
(
scratch
,
outpkt
,
ret
,
len
,
id_hi
,
id_lo
,
&
inpkt
->
tok
,
COAP_RSPCODE_CONTENT
,
COAP_CONTENTTYPE_TEXT_PLAIN
);
}
}
else
{
lua_settop
(
h
->
L
,
n
);
return
coap_make_response
(
scratch
,
outpkt
,
NULL
,
0
,
id_hi
,
id_lo
,
&
inpkt
->
tok
,
COAP_RSPCODE_CONTENT
,
COAP_CONTENTTYPE_TEXT_PLAIN
);
}
}
...
...
app/include/user_modules.h
View file @
c4600006
...
...
@@ -27,7 +27,7 @@
#define LUA_USE_MODULES_OW
#define LUA_USE_MODULES_BIT
#define LUA_USE_MODULES_MQTT
// #define LUA_USE_MODULES_COAP // need about
4
k more ram for now
// #define LUA_USE_MODULES_COAP // need about
1
k more ram for now
#define LUA_USE_MODULES_U8G
#define LUA_USE_MODULES_WS2812
#endif
/* LUA_USE_MODULES */
...
...
app/modules/coap.c
View file @
c4600006
...
...
@@ -37,20 +37,20 @@ static void coap_received(void *arg, char *pdata, unsigned short len)
struct
espconn
*
pesp_conn
=
arg
;
lcoap_userdata
*
cud
=
(
lcoap_userdata
*
)
pesp_conn
->
reverse
;
static
uint8_t
buf
[
MAX_MESSAGE_SIZE
+
1
]
=
{
0
};
// +1 for string '\0'
// static uint8_t buf[MAX_MESSAGE_SIZE+1] = {0}; // +1 for string '\0'
uint8_t
buf
[
MAX_MESSAGE_SIZE
+
1
]
=
{
0
};
// +1 for string '\0'
c_memset
(
buf
,
0
,
sizeof
(
buf
));
// wipe prev data
if
(
len
>
MAX_MESSAGE_SIZE
)
{
NODE_DBG
(
"Request Entity Too Large.
\n
"
);
// NOTE: should response 4.13 to client...
return
;
}
else
{
c_memcpy
(
buf
,
pdata
,
len
);
}
// c_memcpy(buf, pdata, len);
size_t
rsplen
=
coap_server_respond
(
buf
,
len
,
MAX_MESSAGE_SIZE
+
1
);
size_t
rsplen
=
coap_server_respond
(
pdata
,
len
,
buf
,
MAX_MESSAGE_SIZE
+
1
);
espconn_sent
(
pesp_conn
,
(
unsigned
char
*
)
buf
,
rsplen
);
c_memset
(
buf
,
0
,
sizeof
(
buf
));
//
c_memset(buf, 0, sizeof(buf));
}
static
void
coap_sent
(
void
*
arg
)
...
...
@@ -227,26 +227,17 @@ static void coap_response_handler(void *arg, char *pdata, unsigned short len)
struct
espconn
*
pesp_conn
=
arg
;
coap_packet_t
pkt
;
static
uint8_t
buf
[
MAX_MESSAGE_SIZE
+
1
]
=
{
0
};
// +1 for string '\0'
// static uint8_t buf[MAX_MESSAGE_SIZE+1] = {0}; // +1 for string '\0'
uint8_t
buf
[
MAX_MESSAGE_SIZE
+
1
]
=
{
0
};
// +1 for string '\0'
c_memset
(
buf
,
0
,
sizeof
(
buf
));
// wipe prev data
static
int
n
=
0
;
int
rc
;
if
((
len
==
1460
)
&&
(
1460
<=
MAX_MESSAGE_SIZE
)){
c_memcpy
(
buf
,
pdata
,
len
);
// max length is 1460, another part of data is coming in next callback
n
=
len
;
return
;
}
else
{
if
(
len
>
MAX_MESSAGE_SIZE
)
{
NODE_DBG
(
"Request Entity Too Large.
\n
"
);
// NOTE: should response 4.13 to client...
c_memset
(
buf
,
0
,
sizeof
(
buf
));
// wipe prev data
n
=
0
;
return
;
}
c_memcpy
(
buf
+
n
,
pdata
,
len
);
len
+=
n
;
// more than 1460
}
c_memcpy
(
buf
,
pdata
,
len
);
if
(
0
!=
(
rc
=
coap_parse
(
&
pkt
,
buf
,
len
))){
NODE_DBG
(
"Bad packet rc=%d
\n
"
,
rc
);
...
...
@@ -306,8 +297,7 @@ end:
if
(
pesp_conn
->
proto
.
udp
->
remote_port
||
pesp_conn
->
proto
.
udp
->
local_port
)
espconn_delete
(
pesp_conn
);
}
c_memset
(
buf
,
0
,
sizeof
(
buf
));
n
=
0
;
// c_memset(buf, 0, sizeof(buf));
}
// Lua: client:request( [CON], uri, [payload] )
...
...
examples/fragment.lua
View file @
c4600006
...
...
@@ -355,8 +355,11 @@ cs:listen(5683)
myvar
=
1
cs
:
var
(
"myvar"
)
-- get coap://192.168.18.103:5683/v1/v/myvar will return the value of myvar: 1
function
myfun
()
-- function should tack one string, return one string.
function
myfun
(
payload
)
print
(
"myfun called"
)
respond
=
"hello"
return
respond
end
cs
:
func
(
"myfun"
)
-- post coap://192.168.18.103:5683/v1/f/myfun will call myfun
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment