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
09750b56
Commit
09750b56
authored
Mar 30, 2015
by
funshine
Browse files
add queue to mqtt module
parent
3dd1ac37
Changes
10
Show whitespace changes
Inline
Side-by-side
app/cjson/strbuf.c
View file @
09750b56
...
@@ -46,7 +46,7 @@ int strbuf_init(strbuf_t *s, int len)
...
@@ -46,7 +46,7 @@ int strbuf_init(strbuf_t *s, int len)
s
->
reallocs
=
0
;
s
->
reallocs
=
0
;
s
->
debug
=
0
;
s
->
debug
=
0
;
s
->
buf
=
c_malloc
(
size
);
s
->
buf
=
(
char
*
)
c_malloc
(
size
);
if
(
!
s
->
buf
){
if
(
!
s
->
buf
){
NODE_ERR
(
"not enough memory
\n
"
);
NODE_ERR
(
"not enough memory
\n
"
);
return
-
1
;
return
-
1
;
...
@@ -60,7 +60,7 @@ strbuf_t *strbuf_new(int len)
...
@@ -60,7 +60,7 @@ strbuf_t *strbuf_new(int len)
{
{
strbuf_t
*
s
;
strbuf_t
*
s
;
s
=
c_malloc
(
sizeof
(
strbuf_t
));
s
=
(
strbuf_t
*
)
c_malloc
(
sizeof
(
strbuf_t
));
if
(
!
s
){
if
(
!
s
){
NODE_ERR
(
"not enough memory
\n
"
);
NODE_ERR
(
"not enough memory
\n
"
);
return
NULL
;
return
NULL
;
...
...
app/include/user_version.h
View file @
09750b56
...
@@ -7,6 +7,6 @@
...
@@ -7,6 +7,6 @@
#define NODE_VERSION_INTERNAL 0U
#define NODE_VERSION_INTERNAL 0U
#define NODE_VERSION "NodeMCU 0.9.5"
#define NODE_VERSION "NodeMCU 0.9.5"
#define BUILD_DATE "build 201503
18
"
#define BUILD_DATE "build 201503
30
"
#endif
/* __USER_VERSION_H__ */
#endif
/* __USER_VERSION_H__ */
app/libc/c_stdio.h
View file @
09750b56
...
@@ -47,9 +47,9 @@ extern int c_stderr;
...
@@ -47,9 +47,9 @@ extern int c_stderr;
#define SEEK_END 2
/* set file offset to EOF plus offset */
#define SEEK_END 2
/* set file offset to EOF plus offset */
#endif
#endif
#define c_malloc os_malloc
//
#define c_malloc os_malloc
#define c_zalloc os_zalloc
//
#define c_zalloc os_zalloc
#define c_free os_free
//
#define c_free os_free
extern
void
output_redirect
(
const
char
*
str
);
extern
void
output_redirect
(
const
char
*
str
);
#define c_puts output_redirect
#define c_puts output_redirect
...
...
app/libc/c_stdlib.h
View file @
09750b56
...
@@ -29,9 +29,9 @@
...
@@ -29,9 +29,9 @@
#define os_realloc(p, s) mem_realloc((p), (s))
#define os_realloc(p, s) mem_realloc((p), (s))
#endif
#endif
//
#define c_free os_free
#define c_free os_free
//
#define c_malloc os_malloc
#define c_malloc os_malloc
//
#define c_zalloc os_zalloc
#define c_zalloc os_zalloc
#define c_realloc os_realloc
#define c_realloc os_realloc
#define c_abs abs
#define c_abs abs
...
@@ -47,9 +47,9 @@
...
@@ -47,9 +47,9 @@
// c_getenv() get env "LUA_INIT" string for lua initialization.
// c_getenv() get env "LUA_INIT" string for lua initialization.
const
char
*
c_getenv
(
const
char
*
__string
);
const
char
*
c_getenv
(
const
char
*
__string
);
void
*
c_malloc
(
size_t
__size
);
//
void *c_malloc(size_t __size);
void
*
c_zalloc
(
size_t
__size
);
//
void *c_zalloc(size_t __size);
void
c_free
(
void
*
);
//
void c_free(void *);
// int c_rand(void);
// int c_rand(void);
// void c_srand(unsigned int __seed);
// void c_srand(unsigned int __seed);
...
...
app/modules/mqtt.c
View file @
09750b56
...
@@ -15,6 +15,7 @@
...
@@ -15,6 +15,7 @@
#include "espconn.h"
#include "espconn.h"
#include "mqtt_msg.h"
#include "mqtt_msg.h"
#include "msg_queue.h"
static
lua_State
*
gL
=
NULL
;
static
lua_State
*
gL
=
NULL
;
...
@@ -27,7 +28,7 @@ static lua_State *gL = NULL;
...
@@ -27,7 +28,7 @@ static lua_State *gL = NULL;
typedef
enum
{
typedef
enum
{
MQTT_INIT
,
MQTT_INIT
,
MQTT_CONNECT_SEN
D
,
MQTT_CONNECT_SEN
T
,
MQTT_CONNECT_SENDING
,
MQTT_CONNECT_SENDING
,
MQTT_DATA
MQTT_DATA
}
tConnState
;
}
tConnState
;
...
@@ -55,10 +56,7 @@ typedef struct mqtt_state_t
...
@@ -55,10 +56,7 @@ typedef struct mqtt_state_t
uint16_t
message_length_read
;
uint16_t
message_length_read
;
mqtt_message_t
*
outbound_message
;
mqtt_message_t
*
outbound_message
;
mqtt_connection_t
mqtt_connection
;
mqtt_connection_t
mqtt_connection
;
msg_queue_t
*
pending_msg_q
;
uint16_t
pending_msg_id
;
int
pending_msg_type
;
int
pending_publish_qos
;
}
mqtt_state_t
;
}
mqtt_state_t
;
typedef
struct
lmqtt_userdata
typedef
struct
lmqtt_userdata
...
@@ -75,7 +73,7 @@ typedef struct lmqtt_userdata
...
@@ -75,7 +73,7 @@ typedef struct lmqtt_userdata
uint32_t
keep_alive_tick
;
uint32_t
keep_alive_tick
;
uint32_t
send_timeout
;
uint32_t
send_timeout
;
uint8_t
secure
;
uint8_t
secure
;
uint8_t
connected
;
bool
connected
;
// indicate socket connected, not mqtt prot connected.
ETSTimer
mqttTimer
;
ETSTimer
mqttTimer
;
tConnState
connState
;
tConnState
connState
;
}
lmqtt_userdata
;
}
lmqtt_userdata
;
...
@@ -89,27 +87,35 @@ static void mqtt_socket_disconnected(void *arg) // tcp only
...
@@ -89,27 +87,35 @@ static void mqtt_socket_disconnected(void *arg) // tcp only
lmqtt_userdata
*
mud
=
(
lmqtt_userdata
*
)
pesp_conn
->
reverse
;
lmqtt_userdata
*
mud
=
(
lmqtt_userdata
*
)
pesp_conn
->
reverse
;
if
(
mud
==
NULL
)
if
(
mud
==
NULL
)
return
;
return
;
if
(
mud
->
cb_disconnect_ref
!=
LUA_NOREF
&&
mud
->
self_ref
!=
LUA_NOREF
)
{
lua_rawgeti
(
gL
,
LUA_REGISTRYINDEX
,
mud
->
cb_disconnect_ref
);
lua_rawgeti
(
gL
,
LUA_REGISTRYINDEX
,
mud
->
self_ref
);
// pass the userdata(client) to callback func in lua
lua_call
(
gL
,
1
,
0
);
}
mud
->
connected
=
0
;
os_timer_disarm
(
&
mud
->
mqttTimer
);
if
(
pesp_conn
->
proto
.
tcp
)
if
(
mud
->
connected
){
c_free
(
pesp_conn
->
proto
.
tcp
);
mud
->
connected
=
false
;
pesp_conn
->
proto
.
tcp
=
NULL
;
if
(
mud
->
pesp_conn
&&
mud
->
pesp_conn
->
proto
.
tcp
)
c_free
(
mud
->
pesp_conn
->
proto
.
tcp
);
mud
->
pesp_conn
->
proto
.
tcp
=
NULL
;
if
(
mud
->
pesp_conn
)
if
(
mud
->
pesp_conn
)
c_free
(
mud
->
pesp_conn
);
c_free
(
mud
->
pesp_conn
);
mud
->
pesp_conn
=
NULL
;
// espconn is already disconnected
mud
->
pesp_conn
=
NULL
;
// espconn is already disconnected
lua_gc
(
gL
,
LUA_GCSTOP
,
0
);
lua_gc
(
gL
,
LUA_GCSTOP
,
0
);
if
(
mud
->
self_ref
!=
LUA_NOREF
){
if
(
mud
->
self_ref
!=
LUA_NOREF
){
// TODO: should we unref the client and delete it?
luaL_unref
(
gL
,
LUA_REGISTRYINDEX
,
mud
->
self_ref
);
luaL_unref
(
gL
,
LUA_REGISTRYINDEX
,
mud
->
self_ref
);
mud
->
self_ref
=
LUA_NOREF
;
// unref this, and the mqtt.socket userdata will delete it self
mud
->
self_ref
=
LUA_NOREF
;
// unref this, and the mqtt.socket userdata will delete it self
}
}
lua_gc
(
gL
,
LUA_GCRESTART
,
0
);
lua_gc
(
gL
,
LUA_GCRESTART
,
0
);
}
mud
->
connected
=
false
;
os_timer_disarm
(
&
mud
->
mqttTimer
);
if
(
mud
->
cb_disconnect_ref
!=
LUA_NOREF
)
{
lua_rawgeti
(
gL
,
LUA_REGISTRYINDEX
,
mud
->
cb_disconnect_ref
);
if
(
mud
->
self_ref
!=
LUA_NOREF
)
lua_rawgeti
(
gL
,
LUA_REGISTRYINDEX
,
mud
->
self_ref
);
// pass the userdata(client) to callback func in lua
else
lua_pushnil
(
gL
);
lua_call
(
gL
,
1
,
0
);
}
}
}
static
void
mqtt_socket_reconnected
(
void
*
arg
,
sint8_t
err
)
static
void
mqtt_socket_reconnected
(
void
*
arg
,
sint8_t
err
)
...
@@ -135,10 +141,7 @@ static void deliver_publish(lmqtt_userdata * mud, uint8_t* message, int length)
...
@@ -135,10 +141,7 @@ static void deliver_publish(lmqtt_userdata * mud, uint8_t* message, int length)
return
;
return
;
lua_rawgeti
(
gL
,
LUA_REGISTRYINDEX
,
mud
->
cb_message_ref
);
lua_rawgeti
(
gL
,
LUA_REGISTRYINDEX
,
mud
->
cb_message_ref
);
lua_rawgeti
(
gL
,
LUA_REGISTRYINDEX
,
mud
->
self_ref
);
// pass the userdata to callback func in lua
lua_rawgeti
(
gL
,
LUA_REGISTRYINDEX
,
mud
->
self_ref
);
// pass the userdata to callback func in lua
// expose_array(gL, pdata, len);
// *(pdata+len) = 0;
// NODE_DBG(pdata);
// NODE_DBG("\n");
lua_pushlstring
(
gL
,
event_data
.
topic
,
event_data
.
topic_length
);
lua_pushlstring
(
gL
,
event_data
.
topic
,
event_data
.
topic_length
);
if
(
event_data
.
data_length
>
0
){
if
(
event_data
.
data_length
>
0
){
lua_pushlstring
(
gL
,
event_data
.
data
,
event_data
.
data_length
);
lua_pushlstring
(
gL
,
event_data
.
data
,
event_data
.
data_length
);
...
@@ -155,6 +158,7 @@ static void mqtt_socket_received(void *arg, char *pdata, unsigned short len)
...
@@ -155,6 +158,7 @@ static void mqtt_socket_received(void *arg, char *pdata, unsigned short len)
uint8_t
msg_type
;
uint8_t
msg_type
;
uint8_t
msg_qos
;
uint8_t
msg_qos
;
uint16_t
msg_id
;
uint16_t
msg_id
;
msg_queue_t
*
node
=
NULL
;
struct
espconn
*
pesp_conn
=
arg
;
struct
espconn
*
pesp_conn
=
arg
;
if
(
pesp_conn
==
NULL
)
if
(
pesp_conn
==
NULL
)
...
@@ -171,6 +175,7 @@ READPACKET:
...
@@ -171,6 +175,7 @@ READPACKET:
mud
->
mqtt_state
.
outbound_message
=
NULL
;
mud
->
mqtt_state
.
outbound_message
=
NULL
;
switch
(
mud
->
connState
){
switch
(
mud
->
connState
){
case
MQTT_CONNECT_SENDING
:
case
MQTT_CONNECT_SENDING
:
case
MQTT_CONNECT_SENT
:
if
(
mqtt_get_type
(
mud
->
mqtt_state
.
in_buffer
)
!=
MQTT_MSG_TYPE_CONNACK
){
if
(
mqtt_get_type
(
mud
->
mqtt_state
.
in_buffer
)
!=
MQTT_MSG_TYPE_CONNACK
){
NODE_DBG
(
"MQTT: Invalid packet
\r\n
"
);
NODE_DBG
(
"MQTT: Invalid packet
\r\n
"
);
mud
->
connState
=
MQTT_INIT
;
mud
->
connState
=
MQTT_INIT
;
...
@@ -201,16 +206,19 @@ READPACKET:
...
@@ -201,16 +206,19 @@ READPACKET:
msg_qos
=
mqtt_get_qos
(
mud
->
mqtt_state
.
in_buffer
);
msg_qos
=
mqtt_get_qos
(
mud
->
mqtt_state
.
in_buffer
);
msg_id
=
mqtt_get_id
(
mud
->
mqtt_state
.
in_buffer
,
mud
->
mqtt_state
.
in_buffer_length
);
msg_id
=
mqtt_get_id
(
mud
->
mqtt_state
.
in_buffer
,
mud
->
mqtt_state
.
in_buffer_length
);
msg_queue_t
*
pending_msg
=
mud
->
mqtt_state
.
pending_msg_q
;
NODE_DBG
(
"MQTT_DATA: type: %d, qos: %d, msg_id: %d, pending_id: %d
\r\n
"
,
NODE_DBG
(
"MQTT_DATA: type: %d, qos: %d, msg_id: %d, pending_id: %d
\r\n
"
,
msg_type
,
msg_type
,
msg_qos
,
msg_qos
,
msg_id
,
msg_id
,
mud
->
mqtt_state
.
pending_msg_id
);
(
pending_msg
)
?
pending_msg
->
msg
_id
:
0
);
switch
(
msg_type
)
switch
(
msg_type
)
{
{
case
MQTT_MSG_TYPE_SUBACK
:
case
MQTT_MSG_TYPE_SUBACK
:
if
(
mud
->
mqtt_state
.
pending_msg_type
==
MQTT_MSG_TYPE_SUBSCRIBE
&&
mud
->
mqtt_state
.
pending_msg_id
==
msg_id
)
if
(
pending_msg
&&
pending_msg
->
msg
_type
==
MQTT_MSG_TYPE_SUBSCRIBE
&&
pending_msg
->
msg
_id
==
msg_id
)
{
NODE_DBG
(
"MQTT: Subscribe successful
\r\n
"
);
NODE_DBG
(
"MQTT: Subscribe successful
\r\n
"
);
msg_destroy
(
msg_dequeue
(
&
(
mud
->
mqtt_state
.
pending_msg_q
)));
if
(
mud
->
cb_suback_ref
==
LUA_NOREF
)
if
(
mud
->
cb_suback_ref
==
LUA_NOREF
)
break
;
break
;
if
(
mud
->
self_ref
==
LUA_NOREF
)
if
(
mud
->
self_ref
==
LUA_NOREF
)
...
@@ -218,22 +226,34 @@ READPACKET:
...
@@ -218,22 +226,34 @@ READPACKET:
lua_rawgeti
(
gL
,
LUA_REGISTRYINDEX
,
mud
->
cb_suback_ref
);
lua_rawgeti
(
gL
,
LUA_REGISTRYINDEX
,
mud
->
cb_suback_ref
);
lua_rawgeti
(
gL
,
LUA_REGISTRYINDEX
,
mud
->
self_ref
);
lua_rawgeti
(
gL
,
LUA_REGISTRYINDEX
,
mud
->
self_ref
);
lua_call
(
gL
,
1
,
0
);
lua_call
(
gL
,
1
,
0
);
}
break
;
break
;
case
MQTT_MSG_TYPE_UNSUBACK
:
case
MQTT_MSG_TYPE_UNSUBACK
:
if
(
mud
->
mqtt_state
.
pending_msg_type
==
MQTT_MSG_TYPE_UNSUBSCRIBE
&&
mud
->
mqtt_state
.
pending_msg_id
==
msg_id
)
if
(
pending_msg
&&
pending_msg
->
msg
_type
==
MQTT_MSG_TYPE_UNSUBSCRIBE
&&
pending_msg
->
msg
_id
==
msg_id
)
{
NODE_DBG
(
"MQTT: UnSubscribe successful
\r\n
"
);
NODE_DBG
(
"MQTT: UnSubscribe successful
\r\n
"
);
msg_destroy
(
msg_dequeue
(
&
(
mud
->
mqtt_state
.
pending_msg_q
)));
}
break
;
break
;
case
MQTT_MSG_TYPE_PUBLISH
:
case
MQTT_MSG_TYPE_PUBLISH
:
if
(
msg_qos
==
1
)
if
(
msg_qos
==
1
)
{
mud
->
mqtt_state
.
outbound_message
=
mqtt_msg_puback
(
&
mud
->
mqtt_state
.
mqtt_connection
,
msg_id
);
mud
->
mqtt_state
.
outbound_message
=
mqtt_msg_puback
(
&
mud
->
mqtt_state
.
mqtt_connection
,
msg_id
);
else
if
(
msg_qos
==
2
)
node
=
msg_enqueue
(
&
(
mud
->
mqtt_state
.
pending_msg_q
),
mud
->
mqtt_state
.
outbound_message
,
msg_id
,
MQTT_MSG_TYPE_PUBACK
,
(
int
)
msg_qos
);
}
else
if
(
msg_qos
==
2
){
mud
->
mqtt_state
.
outbound_message
=
mqtt_msg_pubrec
(
&
mud
->
mqtt_state
.
mqtt_connection
,
msg_id
);
mud
->
mqtt_state
.
outbound_message
=
mqtt_msg_pubrec
(
&
mud
->
mqtt_state
.
mqtt_connection
,
msg_id
);
node
=
msg_enqueue
(
&
(
mud
->
mqtt_state
.
pending_msg_q
),
mud
->
mqtt_state
.
outbound_message
,
msg_id
,
MQTT_MSG_TYPE_PUBREC
,
(
int
)
msg_qos
);
}
if
(
msg_qos
==
1
||
msg_qos
==
2
){
NODE_DBG
(
"MQTT: Queue response QoS: %d
\r\n
"
,
msg_qos
);
}
deliver_publish
(
mud
,
mud
->
mqtt_state
.
in_buffer
,
mud
->
mqtt_state
.
message_length_read
);
deliver_publish
(
mud
,
mud
->
mqtt_state
.
in_buffer
,
mud
->
mqtt_state
.
message_length_read
);
break
;
break
;
case
MQTT_MSG_TYPE_PUBACK
:
case
MQTT_MSG_TYPE_PUBACK
:
if
(
mud
->
mqtt_state
.
pending_msg_type
==
MQTT_MSG_TYPE_PUBLISH
&&
mud
->
mqtt_state
.
pending_msg_id
==
msg_id
){
if
(
pending_msg
&&
pending_msg
->
msg
_type
==
MQTT_MSG_TYPE_PUBLISH
&&
pending_msg
->
msg
_id
==
msg_id
){
NODE_DBG
(
"MQTT: Publish with QoS = 1 successful
\r\n
"
);
NODE_DBG
(
"MQTT: Publish with QoS = 1 successful
\r\n
"
);
msg_destroy
(
msg_dequeue
(
&
(
mud
->
mqtt_state
.
pending_msg_q
)));
if
(
mud
->
cb_puback_ref
==
LUA_NOREF
)
if
(
mud
->
cb_puback_ref
==
LUA_NOREF
)
break
;
break
;
if
(
mud
->
self_ref
==
LUA_NOREF
)
if
(
mud
->
self_ref
==
LUA_NOREF
)
...
@@ -246,15 +266,20 @@ READPACKET:
...
@@ -246,15 +266,20 @@ READPACKET:
break
;
break
;
case
MQTT_MSG_TYPE_PUBREC
:
case
MQTT_MSG_TYPE_PUBREC
:
mud
->
mqtt_state
.
outbound_message
=
mqtt_msg_pubrel
(
&
mud
->
mqtt_state
.
mqtt_connection
,
msg_id
);
mud
->
mqtt_state
.
outbound_message
=
mqtt_msg_pubrel
(
&
mud
->
mqtt_state
.
mqtt_connection
,
msg_id
);
node
=
msg_enqueue
(
&
(
mud
->
mqtt_state
.
pending_msg_q
),
mud
->
mqtt_state
.
outbound_message
,
msg_id
,
MQTT_MSG_TYPE_PUBREL
,
(
int
)
msg_qos
);
NODE_DBG
(
"MQTT: Response PUBREL
\r\n
"
);
NODE_DBG
(
"MQTT: Response PUBREL
\r\n
"
);
break
;
break
;
case
MQTT_MSG_TYPE_PUBREL
:
case
MQTT_MSG_TYPE_PUBREL
:
mud
->
mqtt_state
.
outbound_message
=
mqtt_msg_pubcomp
(
&
mud
->
mqtt_state
.
mqtt_connection
,
msg_id
);
mud
->
mqtt_state
.
outbound_message
=
mqtt_msg_pubcomp
(
&
mud
->
mqtt_state
.
mqtt_connection
,
msg_id
);
node
=
msg_enqueue
(
&
(
mud
->
mqtt_state
.
pending_msg_q
),
mud
->
mqtt_state
.
outbound_message
,
msg_id
,
MQTT_MSG_TYPE_PUBCOMP
,
(
int
)
msg_qos
);
NODE_DBG
(
"MQTT: Response PUBCOMP
\r\n
"
);
NODE_DBG
(
"MQTT: Response PUBCOMP
\r\n
"
);
break
;
break
;
case
MQTT_MSG_TYPE_PUBCOMP
:
case
MQTT_MSG_TYPE_PUBCOMP
:
if
(
mud
->
mqtt_state
.
pending_msg_type
==
MQTT_MSG_TYPE_PUBLISH
&&
mud
->
mqtt_state
.
pending_msg_id
==
msg_id
){
if
(
pending_msg
&&
pending_msg
->
msg
_type
==
MQTT_MSG_TYPE_PUBLISH
&&
pending_msg
->
msg
_id
==
msg_id
){
NODE_DBG
(
"MQTT: Publish with QoS = 2 successful
\r\n
"
);
NODE_DBG
(
"MQTT: Publish with QoS = 2 successful
\r\n
"
);
msg_destroy
(
msg_dequeue
(
&
(
mud
->
mqtt_state
.
pending_msg_q
)));
if
(
mud
->
cb_puback_ref
==
LUA_NOREF
)
if
(
mud
->
cb_puback_ref
==
LUA_NOREF
)
break
;
break
;
if
(
mud
->
self_ref
==
LUA_NOREF
)
if
(
mud
->
self_ref
==
LUA_NOREF
)
...
@@ -266,9 +291,13 @@ READPACKET:
...
@@ -266,9 +291,13 @@ READPACKET:
break
;
break
;
case
MQTT_MSG_TYPE_PINGREQ
:
case
MQTT_MSG_TYPE_PINGREQ
:
mud
->
mqtt_state
.
outbound_message
=
mqtt_msg_pingresp
(
&
mud
->
mqtt_state
.
mqtt_connection
);
mud
->
mqtt_state
.
outbound_message
=
mqtt_msg_pingresp
(
&
mud
->
mqtt_state
.
mqtt_connection
);
node
=
msg_enqueue
(
&
(
mud
->
mqtt_state
.
pending_msg_q
),
mud
->
mqtt_state
.
outbound_message
,
msg_id
,
MQTT_MSG_TYPE_PINGRESP
,
(
int
)
msg_qos
);
NODE_DBG
(
"MQTT: Response PINGRESP
\r\n
"
);
break
;
break
;
case
MQTT_MSG_TYPE_PINGRESP
:
case
MQTT_MSG_TYPE_PINGRESP
:
// Ignore
// Ignore
NODE_DBG
(
"MQTT: PINGRESP received
\r\n
"
);
break
;
break
;
}
}
// NOTE: this is done down here and not in the switch case above
// NOTE: this is done down here and not in the switch case above
...
@@ -291,13 +320,17 @@ READPACKET:
...
@@ -291,13 +320,17 @@ READPACKET:
break
;
break
;
}
}
if
(
mud
->
mqtt_state
.
outbound_message
!=
NULL
){
if
(
node
&&
(
mud
->
mqtt_state
.
pending_msg_q
->
next
==
NULL
)
&&
mud
->
send_timeout
==
0
){
if
(
mud
->
secure
)
mud
->
send_timeout
=
MQTT_SEND_TIMEOUT
;
espconn_secure_sent
(
pesp_conn
,
mud
->
mqtt_state
.
outbound_message
->
data
,
mud
->
mqtt_state
.
outbound_message
->
length
);
NODE_DBG
(
"Sent: %d
\n
"
,
node
->
msg
.
length
);
if
(
mud
->
secure
)
espconn_secure_sent
(
pesp_conn
,
node
->
msg
.
data
,
node
->
msg
.
length
);
else
else
espconn_sent
(
pesp_conn
,
mud
->
mqtt_state
.
outbound_message
->
data
,
mud
->
mqtt_state
.
outbound_message
->
length
);
espconn_sent
(
pesp_conn
,
node
->
msg
.
data
,
node
->
msg
.
length
);
mud
->
keep_alive_tick
=
0
;
mud
->
mqtt_state
.
outbound_message
=
NULL
;
mud
->
mqtt_state
.
outbound_message
=
NULL
;
}
}
return
;
return
;
}
}
...
@@ -312,9 +345,17 @@ static void mqtt_socket_sent(void *arg)
...
@@ -312,9 +345,17 @@ static void mqtt_socket_sent(void *arg)
return
;
return
;
if
(
!
mud
->
connected
)
if
(
!
mud
->
connected
)
return
;
return
;
if
(
mud
->
connState
==
MQTT_CONNECT_SENDING
){
mud
->
connState
=
MQTT_CONNECT_SENT
;
}
// call mqtt_sent()
// call mqtt_sent()
mud
->
send_timeout
=
0
;
mud
->
send_timeout
=
0
;
if
(
mud
->
mqtt_state
.
pending_msg_type
==
MQTT_MSG_TYPE_PUBLISH
&&
mud
->
mqtt_state
.
pending_publish_qos
==
0
)
{
// qos = 0, publish and forgot.
msg_queue_t
*
node
=
mud
->
mqtt_state
.
pending_msg_q
;
if
(
node
&&
node
->
msg_type
==
MQTT_MSG_TYPE_PUBLISH
&&
node
->
publish_qos
==
0
)
{
msg_destroy
(
msg_dequeue
(
&
(
mud
->
mqtt_state
.
pending_msg_q
)));
if
(
mud
->
cb_puback_ref
==
LUA_NOREF
)
if
(
mud
->
cb_puback_ref
==
LUA_NOREF
)
return
;
return
;
if
(
mud
->
self_ref
==
LUA_NOREF
)
if
(
mud
->
self_ref
==
LUA_NOREF
)
...
@@ -360,14 +401,48 @@ void mqtt_socket_timer(void *arg)
...
@@ -360,14 +401,48 @@ void mqtt_socket_timer(void *arg)
{
{
lmqtt_userdata
*
mud
=
(
lmqtt_userdata
*
)
arg
;
lmqtt_userdata
*
mud
=
(
lmqtt_userdata
*
)
arg
;
if
(
mud
==
NULL
)
return
;
if
(
mud
->
send_timeout
>
0
){
mud
->
send_timeout
--
;
}
if
(
mud
->
pesp_conn
==
NULL
){
NODE_DBG
(
"mud->pesp_conn is NULL.
\n
"
);
return
;
}
if
(
mud
->
send_timeout
==
0
){
// switch to next queued event.
if
(
mud
->
connState
==
MQTT_CONNECT_SENDING
){
// MQTT_CONNECT time out.
mud
->
connState
=
MQTT_INIT
;
if
(
mud
->
secure
){
espconn_secure_disconnect
(
mud
->
pesp_conn
);
}
else
{
espconn_disconnect
(
mud
->
pesp_conn
);
}
mud
->
keep_alive_tick
=
0
;
// not need count anymore
}
else
if
(
mud
->
connState
==
MQTT_DATA
){
msg_queue_t
*
pending_msg
=
mud
->
mqtt_state
.
pending_msg_q
;
if
(
pending_msg
){
mud
->
send_timeout
=
MQTT_SEND_TIMEOUT
;
if
(
mud
->
secure
)
espconn_secure_sent
(
mud
->
pesp_conn
,
pending_msg
->
msg
.
data
,
pending_msg
->
msg
.
length
);
else
espconn_sent
(
mud
->
pesp_conn
,
pending_msg
->
msg
.
data
,
pending_msg
->
msg
.
length
);
mud
->
keep_alive_tick
=
0
;
NODE_DBG
(
"id: %d - qos: %d, length: %d
\n
"
,
pending_msg
->
msg_id
,
pending_msg
->
publish_qos
,
pending_msg
->
msg
.
length
);
}
// no queued event.
}
}
if
(
mud
->
connState
==
MQTT_DATA
){
if
(
mud
->
connState
==
MQTT_DATA
){
mud
->
keep_alive_tick
++
;
mud
->
keep_alive_tick
++
;
if
(
mud
->
keep_alive_tick
>
mud
->
mqtt_state
.
connect_info
->
keepalive
){
if
(
mud
->
keep_alive_tick
>
mud
->
mqtt_state
.
connect_info
->
keepalive
){
mud
->
mqtt_state
.
pending_msg_type
=
MQTT_MSG_TYPE_PINGREQ
;
mud
->
send_timeout
=
MQTT_SEND_TIMEOUT
;
mud
->
send_timeout
=
MQTT_SEND_TIMEOUT
;
NODE_DBG
(
"
\r\n
MQTT: Send keepalive packet
\r\n
"
);
NODE_DBG
(
"
\r\n
MQTT: Send keepalive packet
\r\n
"
);
mud
->
mqtt_state
.
outbound_message
=
mqtt_msg_pingreq
(
&
mud
->
mqtt_state
.
mqtt_connection
);
mud
->
mqtt_state
.
outbound_message
=
mqtt_msg_pingreq
(
&
mud
->
mqtt_state
.
mqtt_connection
);
if
(
mud
->
secure
)
if
(
mud
->
secure
)
espconn_secure_sent
(
mud
->
pesp_conn
,
mud
->
mqtt_state
.
outbound_message
->
data
,
mud
->
mqtt_state
.
outbound_message
->
length
);
espconn_secure_sent
(
mud
->
pesp_conn
,
mud
->
mqtt_state
.
outbound_message
->
data
,
mud
->
mqtt_state
.
outbound_message
->
length
);
else
else
...
@@ -375,8 +450,6 @@ void mqtt_socket_timer(void *arg)
...
@@ -375,8 +450,6 @@ void mqtt_socket_timer(void *arg)
mud
->
keep_alive_tick
=
0
;
mud
->
keep_alive_tick
=
0
;
}
}
}
}
if
(
mud
->
send_timeout
>
0
)
mud
->
send_timeout
--
;
}
}
// Lua: mqtt.Client(clientid, keepalive, user, pass)
// Lua: mqtt.Client(clientid, keepalive, user, pass)
...
@@ -389,8 +462,11 @@ static int mqtt_socket_client( lua_State* L )
...
@@ -389,8 +462,11 @@ static int mqtt_socket_client( lua_State* L )
c_sprintf
(
tempid
,
"%s%x"
,
"NodeMCU_"
,
system_get_chip_id
()
);
c_sprintf
(
tempid
,
"%s%x"
,
"NodeMCU_"
,
system_get_chip_id
()
);
NODE_DBG
(
tempid
);
NODE_DBG
(
tempid
);
NODE_DBG
(
"
\n
"
);
NODE_DBG
(
"
\n
"
);
size_t
il
=
c_strlen
(
tempid
);
const
char
*
clientId
=
tempid
,
*
username
=
NULL
,
*
password
=
NULL
;
const
char
*
clientId
=
tempid
,
*
username
=
NULL
,
*
password
=
NULL
;
size_t
idl
=
c_strlen
(
tempid
);
size_t
unl
=
0
,
pwl
=
0
;
int
keepalive
=
0
;
int
stack
=
1
;
int
stack
=
1
;
unsigned
secure
=
0
;
unsigned
secure
=
0
;
int
top
=
lua_gettop
(
L
);
int
top
=
lua_gettop
(
L
);
...
@@ -419,87 +495,89 @@ static int mqtt_socket_client( lua_State* L )
...
@@ -419,87 +495,89 @@ static int mqtt_socket_client( lua_State* L )
luaL_getmetatable
(
L
,
"mqtt.socket"
);
luaL_getmetatable
(
L
,
"mqtt.socket"
);
lua_setmetatable
(
L
,
-
2
);
lua_setmetatable
(
L
,
-
2
);
gL
=
L
;
// global L for mqtt module.
if
(
lua_isstring
(
L
,
stack
)
)
// deal with the clientid string
if
(
lua_isstring
(
L
,
stack
)
)
// deal with the clientid string
{
{
clientId
=
luaL_checklstring
(
L
,
stack
,
&
il
);
clientId
=
luaL_checklstring
(
L
,
stack
,
&
i
d
l
);
stack
++
;
stack
++
;
}
}
// TODO: check the zalloc result.
mud
->
connect_info
.
client_id
=
(
uint8_t
*
)
c_zalloc
(
il
+
1
);
if
(
!
mud
->
connect_info
.
client_id
){
return
luaL_error
(
L
,
"not enough memory"
);
}
c_memcpy
(
mud
->
connect_info
.
client_id
,
clientId
,
il
);
mud
->
connect_info
.
client_id
[
il
]
=
0
;
mud
->
mqtt_state
.
in_buffer
=
(
uint8_t
*
)
c_zalloc
(
MQTT_BUF_SIZE
);
if
(
!
mud
->
mqtt_state
.
in_buffer
){
return
luaL_error
(
L
,
"not enough memory"
);
}
mud
->
mqtt_state
.
out_buffer
=
(
uint8_t
*
)
c_zalloc
(
MQTT_BUF_SIZE
);
if
(
!
mud
->
mqtt_state
.
out_buffer
){
return
luaL_error
(
L
,
"not enough memory"
);
}
mud
->
mqtt_state
.
in_buffer_length
=
MQTT_BUF_SIZE
;
mud
->
mqtt_state
.
out_buffer_length
=
MQTT_BUF_SIZE
;
mud
->
connState
=
MQTT_INIT
;
mud
->
connect_info
.
clean_session
=
1
;
mud
->
connect_info
.
will_qos
=
0
;
mud
->
connect_info
.
will_retain
=
0
;
mud
->
keep_alive_tick
=
0
;
mud
->
connect_info
.
keepalive
=
0
;
mud
->
mqtt_state
.
connect_info
=
&
mud
->
connect_info
;
gL
=
L
;
// global L for mqtt module.
if
(
lua_isnumber
(
L
,
stack
))
if
(
lua_isnumber
(
L
,
stack
))
{
{
mud
->
connect_info
.
keepalive
=
luaL_checkinteger
(
L
,
stack
);
keepalive
=
luaL_checkinteger
(
L
,
stack
);
stack
++
;
stack
++
;
}
}
if
(
mud
->
connect_info
.
keepalive
==
0
){
if
(
keepalive
==
0
){
mud
->
connect_info
.
keepalive
=
MQTT_DEFAULT_KEEPALIVE
;
keepalive
=
MQTT_DEFAULT_KEEPALIVE
;
return
1
;
}
}
if
(
lua_isstring
(
L
,
stack
)){
if
(
lua_isstring
(
L
,
stack
)){
username
=
luaL_checklstring
(
L
,
stack
,
&
i
l
);
username
=
luaL_checklstring
(
L
,
stack
,
&
un
l
);
stack
++
;
stack
++
;
}
}
if
(
username
==
NULL
)
if
(
username
==
NULL
)
il
=
0
;
unl
=
0
;
NODE_DBG
(
"lengh username: %d
\r\n
"
,
il
);
NODE_DBG
(
"lengh username: %d
\r\n
"
,
unl
);
mud
->
connect_info
.
username
=
(
uint8_t
*
)
c_zalloc
(
il
+
1
);
if
(
!
mud
->
connect_info
.
username
){
return
luaL_error
(
L
,
"not enough memory"
);
}
c_memcpy
(
mud
->
connect_info
.
username
,
username
,
il
);
mud
->
connect_info
.
username
[
il
]
=
0
;
if
(
lua_isstring
(
L
,
stack
)){
if
(
lua_isstring
(
L
,
stack
)){
password
=
luaL_checklstring
(
L
,
stack
,
&
i
l
);
password
=
luaL_checklstring
(
L
,
stack
,
&
pw
l
);
stack
++
;
stack
++
;
}
}
if
(
password
==
NULL
)
if
(
password
==
NULL
)
i
l
=
0
;
pw
l
=
0
;
NODE_DBG
(
"lengh password: %d
\r\n
"
,
i
l
);
NODE_DBG
(
"lengh password: %d
\r\n
"
,
pw
l
);
mud
->
connect_info
.
password
=
(
uint8_t
*
)
c_zalloc
(
il
+
1
);
// TODO: check the zalloc result.
if
(
!
mud
->
connect_info
.
password
){
mud
->
connect_info
.
client_id
=
(
uint8_t
*
)
c_zalloc
(
idl
+
1
);
mud
->
connect_info
.
username
=
(
uint8_t
*
)
c_zalloc
(
unl
+
1
);
mud
->
connect_info
.
password
=
(
uint8_t
*
)
c_zalloc
(
pwl
+
1
);
mud
->
mqtt_state
.
in_buffer
=
(
uint8_t
*
)
c_zalloc
(
MQTT_BUF_SIZE
);
mud
->
mqtt_state
.
out_buffer
=
(
uint8_t
*
)
c_zalloc
(
MQTT_BUF_SIZE
);
if
(
!
mud
->
connect_info
.
client_id
||
!
mud
->
connect_info
.
username
||
!
mud
->
connect_info
.
password
||
!
mud
->
mqtt_state
.
in_buffer
||
!
mud
->
mqtt_state
.
out_buffer
){
if
(
mud
->
connect_info
.
client_id
)
{
c_free
(
mud
->
connect_info
.
client_id
);
mud
->
connect_info
.
client_id
=
NULL
;
}
if
(
mud
->
connect_info
.
username
)
{
c_free
(
mud
->
connect_info
.
username
);
mud
->
connect_info
.
username
=
NULL
;
}
if
(
mud
->
connect_info
.
password
)
{
c_free
(
mud
->
connect_info
.
password
);
mud
->
connect_info
.
password
=
NULL
;
}
if
(
mud
->
mqtt_state
.
in_buffer
)
{
c_free
(
mud
->
mqtt_state
.
in_buffer
);
mud
->
mqtt_state
.
in_buffer
=
NULL
;
}
if
(
mud
->
mqtt_state
.
out_buffer
)
{
c_free
(
mud
->
mqtt_state
.
out_buffer
);
mud
->
mqtt_state
.
out_buffer
=
NULL
;
}
return
luaL_error
(
L
,
"not enough memory"
);
return
luaL_error
(
L
,
"not enough memory"
);
}
}
c_memcpy
(
mud
->
connect_info
.
password
,
password
,
il
);
c_memcpy
(
mud
->
connect_info
.
client_id
,
clientId
,
idl
);
mud
->
connect_info
.
password
[
il
]
=
0
;
mud
->
connect_info
.
client_id
[
idl
]
=
0
;
c_memcpy
(
mud
->
connect_info
.
username
,
username
,
unl
);
mud
->
connect_info
.
username
[
unl
]
=
0
;
c_memcpy
(
mud
->
connect_info
.
password
,
password
,
pwl
);
mud
->
connect_info
.
password
[
pwl
]
=
0
;
NODE_DBG
(
"MQTT: Init info: %s, %s, %s
\r\n
"
,
mud
->
connect_info
.
client_id
,
mud
->
connect_info
.
username
,
mud
->
connect_info
.
password
);
NODE_DBG
(
"MQTT: Init info: %s, %s, %s
\r\n
"
,
mud
->
connect_info
.
client_id
,
mud
->
connect_info
.
username
,
mud
->
connect_info
.
password
);
mud
->
connect_info
.
clean_session
=
1
;
mud
->
connect_info
.
will_qos
=
0
;
mud
->
connect_info
.
will_retain
=
0
;
mud
->
connect_info
.
keepalive
=
keepalive
;
mud
->
mqtt_state
.
in_buffer_length
=
MQTT_BUF_SIZE
;
mud
->
mqtt_state
.
out_buffer_length
=
MQTT_BUF_SIZE
;
mud
->
mqtt_state
.
pending_msg_q
=
NULL
;
mud
->
mqtt_state
.
connect_info
=
&
mud
->
connect_info
;
return
1
;
return
1
;
}
}
...
@@ -518,7 +596,9 @@ static int mqtt_delete( lua_State* L )
...
@@ -518,7 +596,9 @@ static int mqtt_delete( lua_State* L )
}
}
os_timer_disarm
(
&
mud
->
mqttTimer
);
os_timer_disarm
(
&
mud
->
mqttTimer
);
mud
->
connected
=
0
;
mud
->
connected
=
false
;
// ---- alloc-ed in mqtt_socket_connect()
if
(
mud
->
pesp_conn
){
// for client connected to tcp server, this should set NULL in disconnect cb
if
(
mud
->
pesp_conn
){
// for client connected to tcp server, this should set NULL in disconnect cb
mud
->
pesp_conn
->
reverse
=
NULL
;
mud
->
pesp_conn
->
reverse
=
NULL
;
if
(
mud
->
pesp_conn
->
proto
.
tcp
)
if
(
mud
->
pesp_conn
->
proto
.
tcp
)
...
@@ -528,6 +608,7 @@ static int mqtt_delete( lua_State* L )
...
@@ -528,6 +608,7 @@ static int mqtt_delete( lua_State* L )
mud
->
pesp_conn
=
NULL
;
// for socket, it will free this when disconnected
mud
->
pesp_conn
=
NULL
;
// for socket, it will free this when disconnected
}
}
// ---- alloc-ed in mqtt_socket_lwt()
if
(
mud
->
connect_info
.
will_topic
){
if
(
mud
->
connect_info
.
will_topic
){
c_free
(
mud
->
connect_info
.
will_topic
);
c_free
(
mud
->
connect_info
.
will_topic
);
mud
->
connect_info
.
will_topic
=
NULL
;
mud
->
connect_info
.
will_topic
=
NULL
;
...
@@ -537,7 +618,9 @@ static int mqtt_delete( lua_State* L )
...
@@ -537,7 +618,9 @@ static int mqtt_delete( lua_State* L )
c_free
(
mud
->
connect_info
.
will_message
);
c_free
(
mud
->
connect_info
.
will_message
);
mud
->
connect_info
.
will_message
=
NULL
;
mud
->
connect_info
.
will_message
=
NULL
;
}
}
// ----
//--------- alloc-ed in mqtt_socket_client()
if
(
mud
->
connect_info
.
client_id
){
if
(
mud
->
connect_info
.
client_id
){
c_free
(
mud
->
connect_info
.
client_id
);
c_free
(
mud
->
connect_info
.
client_id
);
mud
->
connect_info
.
client_id
=
NULL
;
mud
->
connect_info
.
client_id
=
NULL
;
...
@@ -558,6 +641,7 @@ static int mqtt_delete( lua_State* L )
...
@@ -558,6 +641,7 @@ static int mqtt_delete( lua_State* L )
c_free
(
mud
->
mqtt_state
.
out_buffer
);
c_free
(
mud
->
mqtt_state
.
out_buffer
);
mud
->
mqtt_state
.
out_buffer
=
NULL
;
mud
->
mqtt_state
.
out_buffer
=
NULL
;
}
}
// -------
// free (unref) callback ref
// free (unref) callback ref
if
(
LUA_NOREF
!=
mud
->
cb_connect_ref
){
if
(
LUA_NOREF
!=
mud
->
cb_connect_ref
){
...
@@ -647,11 +731,11 @@ static void socket_dns_found(const char *name, ip_addr_t *ipaddr, void *arg)
...
@@ -647,11 +731,11 @@ static void socket_dns_found(const char *name, ip_addr_t *ipaddr, void *arg)
}
}
}
}
// Lua: mqtt:
connect( host, port, secure
, function(client) )
// Lua: mqtt:
lwt( topic, message, qos, retain
, function(client) )
static
int
mqtt_socket_lwt
(
lua_State
*
L
)
static
int
mqtt_socket_lwt
(
lua_State
*
L
)
{
{
uint8_t
stack
=
1
;
uint8_t
stack
=
1
;
size_t
topicSize
,
il
;
size_t
topicSize
,
msgSize
;
NODE_DBG
(
"mqtt_socket_lwt.
\n
"
);
NODE_DBG
(
"mqtt_socket_lwt.
\n
"
);
lmqtt_userdata
*
mud
=
NULL
;
lmqtt_userdata
*
mud
=
NULL
;
const
char
*
lwtTopic
,
*
lwtMsg
;
const
char
*
lwtTopic
,
*
lwtMsg
;
...
@@ -671,32 +755,40 @@ static int mqtt_socket_lwt( lua_State* L )
...
@@ -671,32 +755,40 @@ static int mqtt_socket_lwt( lua_State* L )
}
}
stack
++
;
stack
++
;
lwtMsg
=
luaL_checklstring
(
L
,
stack
,
&
il
);
lwtMsg
=
luaL_checklstring
(
L
,
stack
,
&
msgSize
);
if
(
lwtMsg
==
NULL
)
if
(
lwtMsg
==
NULL
)
{
{
return
luaL_error
(
L
,
"need lwt message"
);
return
luaL_error
(
L
,
"need lwt message"
);
}
}
mud
->
connect_info
.
will_topic
=
(
uint8_t
*
)
c_zalloc
(
topicSize
+
1
);
mud
->
connect_info
.
will_topic
=
(
uint8_t
*
)
c_zalloc
(
topicSize
+
1
);
if
(
!
mud
->
connect_info
.
will_topic
){
mud
->
connect_info
.
will_message
=
(
uint8_t
*
)
c_zalloc
(
msgSize
+
1
);
if
(
!
mud
->
connect_info
.
will_topic
||
!
mud
->
connect_info
.
will_message
){
if
(
mud
->
connect_info
.
will_topic
){
c_free
(
mud
->
connect_info
.
will_topic
);
mud
->
connect_info
.
will_topic
=
NULL
;
}
if
(
mud
->
connect_info
.
will_message
){
c_free
(
mud
->
connect_info
.
will_message
);
mud
->
connect_info
.
will_message
=
NULL
;
}
return
luaL_error
(
L
,
"not enough memory"
);
return
luaL_error
(
L
,
"not enough memory"
);
}
}
c_memcpy
(
mud
->
connect_info
.
will_topic
,
lwtTopic
,
topicSize
);
c_memcpy
(
mud
->
connect_info
.
will_topic
,
lwtTopic
,
topicSize
);
mud
->
connect_info
.
will_topic
[
topicSize
]
=
0
;
mud
->
connect_info
.
will_topic
[
topicSize
]
=
0
;
c_memcpy
(
mud
->
connect_info
.
will_message
,
lwtMsg
,
msgSize
);
mud
->
connect_info
.
will_message
[
msgSize
]
=
0
;
mud
->
connect_info
.
will_message
=
(
uint8_t
*
)
c_zalloc
(
il
+
1
);
if
(
lua_isnumber
(
L
,
stack
)
)
if
(
!
mud
->
connect_info
.
will_message
){
{
return
luaL_error
(
L
,
"not enough memory"
);
mud
->
connect_info
.
will_qos
=
lua_tointeger
(
L
,
stack
);
}
c_memcpy
(
mud
->
connect_info
.
will_message
,
lwtMsg
,
il
);
mud
->
connect_info
.
will_message
[
il
]
=
0
;
stack
++
;
stack
++
;
mud
->
connect_info
.
will_qos
=
luaL_checkinteger
(
L
,
stack
);
}
if
(
lua_isnumber
(
L
,
stack
)
)
{
mud
->
connect_info
.
will_retain
=
lua_tointeger
(
L
,
stack
);
stack
++
;
stack
++
;
mud
->
connect_info
.
will_retain
=
luaL_checkinteger
(
L
,
stack
);
}
NODE_DBG
(
"mqtt_socket_lwt: topic: %s, message: %s, qos: %d, retain: %d
\n
"
,
NODE_DBG
(
"mqtt_socket_lwt: topic: %s, message: %s, qos: %d, retain: %d
\n
"
,
mud
->
connect_info
.
will_topic
,
mud
->
connect_info
.
will_topic
,
...
@@ -750,7 +842,7 @@ static int mqtt_socket_connect( lua_State* L )
...
@@ -750,7 +842,7 @@ static int mqtt_socket_connect( lua_State* L )
pesp_conn
->
reverse
=
mud
;
pesp_conn
->
reverse
=
mud
;
pesp_conn
->
type
=
ESPCONN_TCP
;
pesp_conn
->
type
=
ESPCONN_TCP
;
pesp_conn
->
state
=
ESPCONN_NONE
;
pesp_conn
->
state
=
ESPCONN_NONE
;
mud
->
connected
=
0
;
mud
->
connected
=
false
;
if
(
(
stack
<=
top
)
&&
lua_isstring
(
L
,
stack
)
)
// deal with the domain string
if
(
(
stack
<=
top
)
&&
lua_isstring
(
L
,
stack
)
)
// deal with the domain string
{
{
...
@@ -822,7 +914,6 @@ static int mqtt_socket_connect( lua_State* L )
...
@@ -822,7 +914,6 @@ static int mqtt_socket_connect( lua_State* L )
os_timer_disarm
(
&
mud
->
mqttTimer
);
os_timer_disarm
(
&
mud
->
mqttTimer
);
os_timer_setfn
(
&
mud
->
mqttTimer
,
(
os_timer_func_t
*
)
mqtt_socket_timer
,
mud
);
os_timer_setfn
(
&
mud
->
mqttTimer
,
(
os_timer_func_t
*
)
mqtt_socket_timer
,
mud
);
os_timer_arm
(
&
mud
->
mqttTimer
,
1000
,
1
);
os_timer_arm
(
&
mud
->
mqttTimer
,
1000
,
1
);
return
0
;
return
0
;
}
}
...
@@ -897,16 +988,12 @@ static int mqtt_socket_on( lua_State* L )
...
@@ -897,16 +988,12 @@ static int mqtt_socket_on( lua_State* L )
return
0
;
return
0
;
}
}
// Lua: mqtt:subscribe(topic, qos, function())
// Lua:
bool =
mqtt:subscribe(topic, qos, function())
static
int
mqtt_socket_subscribe
(
lua_State
*
L
)
{
static
int
mqtt_socket_subscribe
(
lua_State
*
L
)
{
NODE_DBG
(
"mqtt_socket_subscribe is called.
\n
"
);
NODE_DBG
(
"mqtt_socket_subscribe is called.
\n
"
);
typedef
struct
SUB_STORAGE
{
uint32_t
length
;
uint8_t
*
data
;
struct
SUB_STORAGE
*
next
;
}
SUB_STORAGE
;
uint8_t
stack
=
1
,
qos
=
0
;
uint8_t
stack
=
1
,
qos
=
0
;
uint16_t
msg_id
=
0
;
const
char
*
topic
;
const
char
*
topic
;
size_t
il
;
size_t
il
;
lmqtt_userdata
*
mud
;
lmqtt_userdata
*
mud
;
...
@@ -915,97 +1002,92 @@ static int mqtt_socket_subscribe( lua_State* L ) {
...
@@ -915,97 +1002,92 @@ static int mqtt_socket_subscribe( lua_State* L ) {
luaL_argcheck
(
L
,
mud
,
stack
,
"mqtt.socket expected"
);
luaL_argcheck
(
L
,
mud
,
stack
,
"mqtt.socket expected"
);
stack
++
;
stack
++
;
if
(
mud
->
send_timeout
!=
0
)
if
(
!
mud
->
connected
){
return
luaL_error
(
L
,
"
sending in process
"
);
luaL_error
(
L
,
"
not connected
"
);
lua_pushboolean
(
L
,
0
);
if
(
!
mud
->
connected
)
return
1
;
return
luaL_error
(
L
,
"not connected"
);
}
if
(
lua_istable
(
L
,
stack
)
)
{
if
(
lua_istable
(
L
,
stack
)
)
{
NODE_DBG
(
"subscribe table
\n
"
);
NODE_DBG
(
"subscribe table
\n
"
);
lua_pushnil
(
L
);
/* first key */
lua_pushnil
(
L
);
/* first key */
SUB_STORAGE
*
first
,
*
last
,
*
curr
;
first
=
(
SUB_STORAGE
*
)
c_zalloc
(
sizeof
(
SUB_STORAGE
));
if
(
first
==
NULL
)
return
luaL_error
(
L
,
"not enough memory"
);
first
->
length
=
0
;
last
=
first
;
first
->
next
=
NULL
;
while
(
lua_next
(
L
,
stack
)
!=
0
)
{
curr
=
(
SUB_STORAGE
*
)
c_zalloc
(
sizeof
(
SUB_STORAGE
));
if
(
curr
==
NULL
)
uint8_t
temp_buffer
[
MQTT_BUF_SIZE
];
return
luaL_error
(
L
,
"not enough memory"
);
uint32_t
temp_pos
=
0
;
while
(
lua_next
(
L
,
stack
)
!=
0
)
{
topic
=
luaL_checkstring
(
L
,
-
2
);
topic
=
luaL_checkstring
(
L
,
-
2
);
qos
=
luaL_checkinteger
(
L
,
-
1
);
qos
=
luaL_checkinteger
(
L
,
-
1
);
mud
->
mqtt_state
.
outbound_message
=
mqtt_msg_subscribe
(
&
mud
->
mqtt_state
.
mqtt_connection
,
topic
,
qos
,
&
mud
->
mqtt_state
.
pending_
msg_id
);
mud
->
mqtt_state
.
outbound_message
=
mqtt_msg_subscribe
(
&
mud
->
mqtt_state
.
mqtt_connection
,
topic
,
qos
,
&
msg_id
);
NODE_DBG
(
"topic: %s - qos: %d, length: %d
\n
"
,
topic
,
qos
,
mud
->
mqtt_state
.
outbound_message
->
length
);
NODE_DBG
(
"topic: %s - qos: %d, length: %d
\n
"
,
topic
,
qos
,
mud
->
mqtt_state
.
outbound_message
->
length
);
curr
->
data
=
(
uint8_t
*
)
c_zalloc
(
mud
->
mqtt_state
.
outbound_message
->
length
);
if
(
curr
->
data
==
NULL
)
return
luaL_error
(
L
,
"not enough memory"
);
c_memcpy
(
curr
->
data
,
mud
->
mqtt_state
.
outbound_message
->
data
,
mud
->
mqtt_state
.
outbound_message
->
length
);
curr
->
length
=
mud
->
mqtt_state
.
outbound_message
->
length
;
curr
->
next
=
NULL
;
last
->
next
=
curr
;
last
=
curr
;
lua_pop
(
L
,
1
);
}
curr
=
first
;
if
(
temp_pos
+
mud
->
mqtt_state
.
outbound_message
->
length
>
MQTT_BUF_SIZE
){
uint32_t
ptr
=
0
;
lua_pop
(
L
,
1
);
while
(
curr
!=
NULL
)
{
break
;
// too long message for the outbuffer.
if
(
curr
->
length
==
0
)
{
curr
=
curr
->
next
;
continue
;
}
if
(
ptr
+
curr
->
length
<
mud
->
mqtt_state
.
out_buffer_length
)
{
c_memcpy
(
mud
->
mqtt_state
.
out_buffer
+
ptr
,
curr
->
data
,
curr
->
length
);
ptr
+=
curr
->
length
;
}
}
c_free
(
curr
->
data
);
c_memcpy
(
temp_buffer
+
temp_pos
,
mud
->
mqtt_state
.
outbound_message
->
data
,
mud
->
mqtt_state
.
outbound_message
->
length
);
c_free
(
curr
);
temp_pos
+=
mud
->
mqtt_state
.
outbound_message
->
length
;
curr
=
curr
->
next
;
lua_pop
(
L
,
1
);
}
}
c_free
(
first
);
if
(
ptr
==
0
)
{
if
(
temp_pos
==
0
){
return
luaL_error
(
L
,
"invalid data"
);
luaL_error
(
L
,
"invalid data"
);
lua_pushboolean
(
L
,
0
);
return
1
;
}
}
c_memcpy
(
mud
->
mqtt_state
.
out_buffer
,
temp_buffer
,
temp_pos
);
mud
->
mqtt_state
.
outbound_message
->
data
=
mud
->
mqtt_state
.
out_buffer
;
mud
->
mqtt_state
.
outbound_message
->
data
=
mud
->
mqtt_state
.
out_buffer
;
mud
->
mqtt_state
.
outbound_message
->
length
=
ptr
;
mud
->
mqtt_state
.
outbound_message
->
length
=
temp_pos
;
stack
++
;
stack
++
;
}
else
{
}
else
{
NODE_DBG
(
"subscribe string
\n
"
);
NODE_DBG
(
"subscribe string
\n
"
);
topic
=
luaL_checklstring
(
L
,
stack
,
&
il
);
topic
=
luaL_checklstring
(
L
,
stack
,
&
il
);
stack
++
;
stack
++
;
if
(
topic
==
NULL
)
if
(
topic
==
NULL
){
return
luaL_error
(
L
,
"need topic name"
);
luaL_error
(
L
,
"need topic name"
);
lua_pushboolean
(
L
,
0
);
return
1
;
}
qos
=
luaL_checkinteger
(
L
,
stack
);
qos
=
luaL_checkinteger
(
L
,
stack
);
mud
->
mqtt_state
.
outbound_message
=
mqtt_msg_subscribe
(
&
mud
->
mqtt_state
.
mqtt_connection
,
topic
,
qos
,
&
mud
->
mqtt_state
.
pending_
msg_id
);
mud
->
mqtt_state
.
outbound_message
=
mqtt_msg_subscribe
(
&
mud
->
mqtt_state
.
mqtt_connection
,
topic
,
qos
,
&
msg_id
);
stack
++
;
stack
++
;
}
}
mud
->
send_timeout
=
MQTT_SEND_TIMEOUT
;
if
(
lua_type
(
L
,
stack
)
==
LUA_TFUNCTION
||
lua_type
(
L
,
stack
)
==
LUA_TLIGHTFUNCTION
)
{
// TODO: this will overwrite the previous one.
mud
->
mqtt_state
.
pending_msg_type
=
MQTT_MSG_TYPE_SUBSCRIBE
;
mud
->
mqtt_state
.
pending_publish_qos
=
mqtt_get_qos
(
mud
->
mqtt_state
.
outbound_message
->
data
);
if
(
lua_type
(
L
,
stack
)
==
LUA_TFUNCTION
||
lua_type
(
L
,
stack
)
==
LUA_TLIGHTFUNCTION
)
{
lua_pushvalue
(
L
,
stack
);
// copy argument (func) to the top of stack
lua_pushvalue
(
L
,
stack
);
// copy argument (func) to the top of stack
if
(
mud
->
cb_suback_ref
!=
LUA_NOREF
)
if
(
mud
->
cb_suback_ref
!=
LUA_NOREF
)
luaL_unref
(
L
,
LUA_REGISTRYINDEX
,
mud
->
cb_suback_ref
);
luaL_unref
(
L
,
LUA_REGISTRYINDEX
,
mud
->
cb_suback_ref
);
mud
->
cb_suback_ref
=
luaL_ref
(
L
,
LUA_REGISTRYINDEX
);
mud
->
cb_suback_ref
=
luaL_ref
(
L
,
LUA_REGISTRYINDEX
);
}
}
NODE_DBG
(
"Sent: %d
\n
"
,
mud
->
mqtt_state
.
outbound_message
->
length
);
msg_queue_t
*
node
=
msg_enqueue
(
&
(
mud
->
mqtt_state
.
pending_msg_q
),
mud
->
mqtt_state
.
outbound_message
,
msg_id
,
MQTT_MSG_TYPE_SUBSCRIBE
,
(
int
)
mqtt_get_qos
(
mud
->
mqtt_state
.
outbound_message
->
data
)
);
NODE_DBG
(
"topic: %s - id: %d - qos: %d, length: %d
\n
"
,
topic
,
node
->
msg_id
,
node
->
publish_qos
,
node
->
msg
.
length
);
if
(
node
&&
(
mud
->
mqtt_state
.
pending_msg_q
->
next
==
NULL
)
&&
mud
->
send_timeout
==
0
){
mud
->
send_timeout
=
MQTT_SEND_TIMEOUT
;
NODE_DBG
(
"Sent: %d
\n
"
,
node
->
msg
.
length
);
if
(
mud
->
secure
)
if
(
mud
->
secure
)
espconn_secure_sent
(
mud
->
pesp_conn
,
mud
->
mqtt_state
.
outbound_message
->
data
,
mud
->
mqtt_state
.
outbound_message
->
length
);
espconn_secure_sent
(
mud
->
pesp_conn
,
node
->
msg
.
data
,
node
->
msg
.
length
);
else
else
espconn_sent
(
mud
->
pesp_conn
,
mud
->
mqtt_state
.
outbound_message
->
data
,
mud
->
mqtt_state
.
outbound_message
->
length
);
espconn_sent
(
mud
->
pesp_conn
,
node
->
msg
.
data
,
node
->
msg
.
length
);
mud
->
keep_alive_tick
=
0
;
}
return
0
;
if
(
!
node
){
lua_pushboolean
(
L
,
0
);
}
else
{
lua_pushboolean
(
L
,
1
);
// enqueued succeed.
}
mud
->
mqtt_state
.
outbound_message
=
NULL
;
return
1
;
}
}
// Lua: mqtt:publish( topic, payload, qos, retain, function() )
// Lua:
bool =
mqtt:publish( topic, payload, qos, retain, function() )
static
int
mqtt_socket_publish
(
lua_State
*
L
)
static
int
mqtt_socket_publish
(
lua_State
*
L
)
{
{
// NODE_DBG("mqtt_publish is called.\n");
// NODE_DBG("mqtt_publish is called.\n");
...
@@ -1013,35 +1095,31 @@ static int mqtt_socket_publish( lua_State* L )
...
@@ -1013,35 +1095,31 @@ static int mqtt_socket_publish( lua_State* L )
lmqtt_userdata
*
mud
;
lmqtt_userdata
*
mud
;
size_t
l
;
size_t
l
;
uint8_t
stack
=
1
;
uint8_t
stack
=
1
;
uint16_t
msg_id
=
0
;
mud
=
(
lmqtt_userdata
*
)
luaL_checkudata
(
L
,
stack
,
"mqtt.socket"
);
mud
=
(
lmqtt_userdata
*
)
luaL_checkudata
(
L
,
stack
,
"mqtt.socket"
);
luaL_argcheck
(
L
,
mud
,
stack
,
"mqtt.socket expected"
);
luaL_argcheck
(
L
,
mud
,
stack
,
"mqtt.socket expected"
);
stack
++
;
stack
++
;
if
(
mud
==
NULL
){
if
(
mud
==
NULL
){
NODE_DBG
(
"userdata is nil.
\n
"
);
NODE_DBG
(
"userdata is nil.
\n
"
);
return
0
;
lua_pushboolean
(
L
,
0
);
return
1
;
}
}
if
(
mud
->
pesp_conn
==
NULL
){
if
(
mud
->
pesp_conn
==
NULL
){
NODE_DBG
(
"mud->pesp_conn is NULL.
\n
"
);
NODE_DBG
(
"mud->pesp_conn is NULL.
\n
"
);
return
0
;
lua_pushboolean
(
L
,
0
);
return
1
;
}
}
if
(
mud
->
send_timeout
!=
0
)
return
luaL_error
(
L
,
"sending in process"
);
pesp_conn
=
mud
->
pesp_conn
;
pesp_conn
=
mud
->
pesp_conn
;
#if 0
char temp[20] = {0};
c_sprintf(temp, IPSTR, IP2STR( &(pesp_conn->proto.tcp->remote_ip) ) );
NODE_DBG("remote ");
NODE_DBG(temp);
NODE_DBG(":");
NODE_DBG("%d",pesp_conn->proto.tcp->remote_port);
NODE_DBG(" sending data.\n");
#endif
const
char
*
topic
=
luaL_checklstring
(
L
,
stack
,
&
l
);
const
char
*
topic
=
luaL_checklstring
(
L
,
stack
,
&
l
);
stack
++
;
stack
++
;
if
(
topic
==
NULL
)
if
(
topic
==
NULL
){
return
luaL_error
(
L
,
"need topic"
);
luaL_error
(
L
,
"need topic"
);
lua_pushboolean
(
L
,
0
);
return
1
;
}
const
char
*
payload
=
luaL_checklstring
(
L
,
stack
,
&
l
);
const
char
*
payload
=
luaL_checklstring
(
L
,
stack
,
&
l
);
stack
++
;
stack
++
;
...
@@ -1050,14 +1128,11 @@ static int mqtt_socket_publish( lua_State* L )
...
@@ -1050,14 +1128,11 @@ static int mqtt_socket_publish( lua_State* L )
uint8_t
retain
=
luaL_checkinteger
(
L
,
stack
);
uint8_t
retain
=
luaL_checkinteger
(
L
,
stack
);
stack
++
;
stack
++
;
mud
->
mqtt_state
.
outbound_message
=
mqtt_msg_publish
(
&
mud
->
mqtt_state
.
mqtt_connection
,
mud
->
mqtt_state
.
outbound_message
=
mqtt_msg_publish
(
&
mud
->
mqtt_state
.
mqtt_connection
,
topic
,
payload
,
l
,
topic
,
payload
,
l
,
qos
,
retain
,
qos
,
retain
,
&
mud
->
mqtt_state
.
pending_msg_id
);
&
msg_id
);
mud
->
mqtt_state
.
pending_msg_type
=
MQTT_MSG_TYPE_PUBLISH
;
mud
->
mqtt_state
.
pending_publish_qos
=
qos
;
mud
->
send_timeout
=
MQTT_SEND_TIMEOUT
;
if
(
lua_type
(
L
,
stack
)
==
LUA_TFUNCTION
||
lua_type
(
L
,
stack
)
==
LUA_TLIGHTFUNCTION
){
if
(
lua_type
(
L
,
stack
)
==
LUA_TFUNCTION
||
lua_type
(
L
,
stack
)
==
LUA_TLIGHTFUNCTION
){
lua_pushvalue
(
L
,
stack
);
// copy argument (func) to the top of stack
lua_pushvalue
(
L
,
stack
);
// copy argument (func) to the top of stack
if
(
mud
->
cb_puback_ref
!=
LUA_NOREF
)
if
(
mud
->
cb_puback_ref
!=
LUA_NOREF
)
...
@@ -1065,12 +1140,26 @@ static int mqtt_socket_publish( lua_State* L )
...
@@ -1065,12 +1140,26 @@ static int mqtt_socket_publish( lua_State* L )
mud
->
cb_puback_ref
=
luaL_ref
(
L
,
LUA_REGISTRYINDEX
);
mud
->
cb_puback_ref
=
luaL_ref
(
L
,
LUA_REGISTRYINDEX
);
}
}
if
(
mud
->
secure
)
msg_queue_t
*
node
=
msg_enqueue
(
&
(
mud
->
mqtt_state
.
pending_msg_q
),
mud
->
mqtt_state
.
outbound_message
,
espconn_secure_sent
(
pesp_conn
,
mud
->
mqtt_state
.
outbound_message
->
data
,
mud
->
mqtt_state
.
outbound_message
->
length
);
msg_id
,
MQTT_MSG_TYPE_PUBLISH
,
(
int
)
qos
);
if
(
node
&&
(
mud
->
mqtt_state
.
pending_msg_q
->
next
==
NULL
)
&&
mud
->
send_timeout
==
0
){
mud
->
send_timeout
=
MQTT_SEND_TIMEOUT
;
NODE_DBG
(
"Sent: %d
\n
"
,
node
->
msg
.
length
);
if
(
mud
->
secure
)
espconn_secure_sent
(
mud
->
pesp_conn
,
node
->
msg
.
data
,
node
->
msg
.
length
);
else
else
espconn_sent
(
pesp_conn
,
mud
->
mqtt_state
.
outbound_message
->
data
,
mud
->
mqtt_state
.
outbound_message
->
length
);
espconn_sent
(
mud
->
pesp_conn
,
node
->
msg
.
data
,
node
->
msg
.
length
);
mud
->
keep_alive_tick
=
0
;
}
if
(
!
node
){
lua_pushboolean
(
L
,
0
);
}
else
{
lua_pushboolean
(
L
,
1
);
// enqueued succeed.
}
mud
->
mqtt_state
.
outbound_message
=
NULL
;
mud
->
mqtt_state
.
outbound_message
=
NULL
;
return
0
;
return
1
;
}
}
// Module function map
// Module function map
...
...
app/mqtt/mqtt_msg.c
View file @
09750b56
...
@@ -29,7 +29,7 @@
...
@@ -29,7 +29,7 @@
*
*
*/
*/
#include
<
string.h
>
#include
"c_
string.h
"
#include "mqtt_msg.h"
#include "mqtt_msg.h"
#define MQTT_MAX_FIXED_HEADER_SIZE 3
#define MQTT_MAX_FIXED_HEADER_SIZE 3
...
@@ -61,7 +61,7 @@ static int append_string(mqtt_connection_t* connection, const char* string, int
...
@@ -61,7 +61,7 @@ static int append_string(mqtt_connection_t* connection, const char* string, int
connection
->
buffer
[
connection
->
message
.
length
++
]
=
len
>>
8
;
connection
->
buffer
[
connection
->
message
.
length
++
]
=
len
>>
8
;
connection
->
buffer
[
connection
->
message
.
length
++
]
=
len
&
0xff
;
connection
->
buffer
[
connection
->
message
.
length
++
]
=
len
&
0xff
;
memcpy
(
connection
->
buffer
+
connection
->
message
.
length
,
string
,
len
);
c_
memcpy
(
connection
->
buffer
+
connection
->
message
.
length
,
string
,
len
);
connection
->
message
.
length
+=
len
;
connection
->
message
.
length
+=
len
;
return
len
+
2
;
return
len
+
2
;
...
@@ -121,7 +121,7 @@ static mqtt_message_t* fini_message(mqtt_connection_t* connection, int type, int
...
@@ -121,7 +121,7 @@ static mqtt_message_t* fini_message(mqtt_connection_t* connection, int type, int
void
mqtt_msg_init
(
mqtt_connection_t
*
connection
,
uint8_t
*
buffer
,
uint16_t
buffer_length
)
void
mqtt_msg_init
(
mqtt_connection_t
*
connection
,
uint8_t
*
buffer
,
uint16_t
buffer_length
)
{
{
memset
(
connection
,
0
,
sizeof
(
connection
));
c_
memset
(
connection
,
0
,
sizeof
(
connection
));
connection
->
buffer
=
buffer
;
connection
->
buffer
=
buffer
;
connection
->
buffer_length
=
buffer_length
;
connection
->
buffer_length
=
buffer_length
;
}
}
...
@@ -294,7 +294,7 @@ mqtt_message_t* mqtt_msg_connect(mqtt_connection_t* connection, mqtt_connect_inf
...
@@ -294,7 +294,7 @@ mqtt_message_t* mqtt_msg_connect(mqtt_connection_t* connection, mqtt_connect_inf
variable_header
->
lengthMsb
=
0
;
variable_header
->
lengthMsb
=
0
;
variable_header
->
lengthLsb
=
4
;
variable_header
->
lengthLsb
=
4
;
memcpy
(
variable_header
->
magic
,
"MQTT"
,
4
);
c_
memcpy
(
variable_header
->
magic
,
"MQTT"
,
4
);
variable_header
->
version
=
4
;
variable_header
->
version
=
4
;
variable_header
->
flags
=
0
;
variable_header
->
flags
=
0
;
variable_header
->
keepaliveMsb
=
info
->
keepalive
>>
8
;
variable_header
->
keepaliveMsb
=
info
->
keepalive
>>
8
;
...
@@ -305,7 +305,7 @@ mqtt_message_t* mqtt_msg_connect(mqtt_connection_t* connection, mqtt_connect_inf
...
@@ -305,7 +305,7 @@ mqtt_message_t* mqtt_msg_connect(mqtt_connection_t* connection, mqtt_connect_inf
if
(
info
->
client_id
!=
NULL
&&
info
->
client_id
[
0
]
!=
'\0'
)
if
(
info
->
client_id
!=
NULL
&&
info
->
client_id
[
0
]
!=
'\0'
)
{
{
if
(
append_string
(
connection
,
info
->
client_id
,
strlen
(
info
->
client_id
))
<
0
)
if
(
append_string
(
connection
,
info
->
client_id
,
c_
strlen
(
info
->
client_id
))
<
0
)
return
fail_message
(
connection
);
return
fail_message
(
connection
);
}
}
else
else
...
@@ -313,10 +313,10 @@ mqtt_message_t* mqtt_msg_connect(mqtt_connection_t* connection, mqtt_connect_inf
...
@@ -313,10 +313,10 @@ mqtt_message_t* mqtt_msg_connect(mqtt_connection_t* connection, mqtt_connect_inf
if
(
info
->
will_topic
!=
NULL
&&
info
->
will_topic
[
0
]
!=
'\0'
)
if
(
info
->
will_topic
!=
NULL
&&
info
->
will_topic
[
0
]
!=
'\0'
)
{
{
if
(
append_string
(
connection
,
info
->
will_topic
,
strlen
(
info
->
will_topic
))
<
0
)
if
(
append_string
(
connection
,
info
->
will_topic
,
c_
strlen
(
info
->
will_topic
))
<
0
)
return
fail_message
(
connection
);
return
fail_message
(
connection
);
if
(
append_string
(
connection
,
info
->
will_message
,
strlen
(
info
->
will_message
))
<
0
)
if
(
append_string
(
connection
,
info
->
will_message
,
c_
strlen
(
info
->
will_message
))
<
0
)
return
fail_message
(
connection
);
return
fail_message
(
connection
);
variable_header
->
flags
|=
MQTT_CONNECT_FLAG_WILL
;
variable_header
->
flags
|=
MQTT_CONNECT_FLAG_WILL
;
...
@@ -327,7 +327,7 @@ mqtt_message_t* mqtt_msg_connect(mqtt_connection_t* connection, mqtt_connect_inf
...
@@ -327,7 +327,7 @@ mqtt_message_t* mqtt_msg_connect(mqtt_connection_t* connection, mqtt_connect_inf
if
(
info
->
username
!=
NULL
&&
info
->
username
[
0
]
!=
'\0'
)
if
(
info
->
username
!=
NULL
&&
info
->
username
[
0
]
!=
'\0'
)
{
{
if
(
append_string
(
connection
,
info
->
username
,
strlen
(
info
->
username
))
<
0
)
if
(
append_string
(
connection
,
info
->
username
,
c_
strlen
(
info
->
username
))
<
0
)
return
fail_message
(
connection
);
return
fail_message
(
connection
);
variable_header
->
flags
|=
MQTT_CONNECT_FLAG_USERNAME
;
variable_header
->
flags
|=
MQTT_CONNECT_FLAG_USERNAME
;
...
@@ -335,7 +335,7 @@ mqtt_message_t* mqtt_msg_connect(mqtt_connection_t* connection, mqtt_connect_inf
...
@@ -335,7 +335,7 @@ mqtt_message_t* mqtt_msg_connect(mqtt_connection_t* connection, mqtt_connect_inf
if
(
info
->
password
!=
NULL
&&
info
->
password
[
0
]
!=
'\0'
)
if
(
info
->
password
!=
NULL
&&
info
->
password
[
0
]
!=
'\0'
)
{
{
if
(
append_string
(
connection
,
info
->
password
,
strlen
(
info
->
password
))
<
0
)
if
(
append_string
(
connection
,
info
->
password
,
c_
strlen
(
info
->
password
))
<
0
)
return
fail_message
(
connection
);
return
fail_message
(
connection
);
variable_header
->
flags
|=
MQTT_CONNECT_FLAG_PASSWORD
;
variable_header
->
flags
|=
MQTT_CONNECT_FLAG_PASSWORD
;
...
@@ -351,7 +351,7 @@ mqtt_message_t* mqtt_msg_publish(mqtt_connection_t* connection, const char* topi
...
@@ -351,7 +351,7 @@ mqtt_message_t* mqtt_msg_publish(mqtt_connection_t* connection, const char* topi
if
(
topic
==
NULL
||
topic
[
0
]
==
'\0'
)
if
(
topic
==
NULL
||
topic
[
0
]
==
'\0'
)
return
fail_message
(
connection
);
return
fail_message
(
connection
);
if
(
append_string
(
connection
,
topic
,
strlen
(
topic
))
<
0
)
if
(
append_string
(
connection
,
topic
,
c_
strlen
(
topic
))
<
0
)
return
fail_message
(
connection
);
return
fail_message
(
connection
);
if
(
qos
>
0
)
if
(
qos
>
0
)
...
@@ -364,7 +364,7 @@ mqtt_message_t* mqtt_msg_publish(mqtt_connection_t* connection, const char* topi
...
@@ -364,7 +364,7 @@ mqtt_message_t* mqtt_msg_publish(mqtt_connection_t* connection, const char* topi
if
(
connection
->
message
.
length
+
data_length
>
connection
->
buffer_length
)
if
(
connection
->
message
.
length
+
data_length
>
connection
->
buffer_length
)
return
fail_message
(
connection
);
return
fail_message
(
connection
);
memcpy
(
connection
->
buffer
+
connection
->
message
.
length
,
data
,
data_length
);
c_
memcpy
(
connection
->
buffer
+
connection
->
message
.
length
,
data
,
data_length
);
connection
->
message
.
length
+=
data_length
;
connection
->
message
.
length
+=
data_length
;
return
fini_message
(
connection
,
MQTT_MSG_TYPE_PUBLISH
,
0
,
qos
,
retain
);
return
fini_message
(
connection
,
MQTT_MSG_TYPE_PUBLISH
,
0
,
qos
,
retain
);
...
@@ -412,7 +412,7 @@ mqtt_message_t* mqtt_msg_subscribe(mqtt_connection_t* connection, const char* to
...
@@ -412,7 +412,7 @@ mqtt_message_t* mqtt_msg_subscribe(mqtt_connection_t* connection, const char* to
if
((
*
message_id
=
append_message_id
(
connection
,
0
))
==
0
)
if
((
*
message_id
=
append_message_id
(
connection
,
0
))
==
0
)
return
fail_message
(
connection
);
return
fail_message
(
connection
);
if
(
append_string
(
connection
,
topic
,
strlen
(
topic
))
<
0
)
if
(
append_string
(
connection
,
topic
,
c_
strlen
(
topic
))
<
0
)
return
fail_message
(
connection
);
return
fail_message
(
connection
);
if
(
connection
->
message
.
length
+
1
>
connection
->
buffer_length
)
if
(
connection
->
message
.
length
+
1
>
connection
->
buffer_length
)
...
@@ -432,7 +432,7 @@ mqtt_message_t* mqtt_msg_unsubscribe(mqtt_connection_t* connection, const char*
...
@@ -432,7 +432,7 @@ mqtt_message_t* mqtt_msg_unsubscribe(mqtt_connection_t* connection, const char*
if
((
*
message_id
=
append_message_id
(
connection
,
0
))
==
0
)
if
((
*
message_id
=
append_message_id
(
connection
,
0
))
==
0
)
return
fail_message
(
connection
);
return
fail_message
(
connection
);
if
(
append_string
(
connection
,
topic
,
strlen
(
topic
))
<
0
)
if
(
append_string
(
connection
,
topic
,
c_
strlen
(
topic
))
<
0
)
return
fail_message
(
connection
);
return
fail_message
(
connection
);
return
fini_message
(
connection
,
MQTT_MSG_TYPE_SUBSCRIBE
,
0
,
1
,
0
);
return
fini_message
(
connection
,
MQTT_MSG_TYPE_SUBSCRIBE
,
0
,
1
,
0
);
...
...
app/mqtt/msg_queue.c
0 → 100644
View file @
09750b56
#include "c_string.h"
#include "c_stdlib.h"
#include "c_stdio.h"
#include "msg_queue.h"
msg_queue_t
*
msg_enqueue
(
msg_queue_t
**
head
,
mqtt_message_t
*
msg
,
uint16_t
msg_id
,
int
msg_type
,
int
publish_qos
){
if
(
!
head
){
return
NULL
;
}
if
(
!
msg
||
!
msg
->
data
||
msg
->
length
==
0
){
NODE_DBG
(
"empty message
\n
"
);
return
NULL
;
}
msg_queue_t
*
node
=
(
msg_queue_t
*
)
c_zalloc
(
sizeof
(
msg_queue_t
));
if
(
!
node
){
NODE_DBG
(
"not enough memory
\n
"
);
return
NULL
;
}
node
->
msg
.
data
=
(
uint8_t
*
)
c_zalloc
(
msg
->
length
);
if
(
!
node
->
msg
.
data
){
NODE_DBG
(
"not enough memory
\n
"
);
c_free
(
node
);
return
NULL
;
}
c_memcpy
(
node
->
msg
.
data
,
msg
->
data
,
msg
->
length
);
node
->
msg
.
length
=
msg
->
length
;
node
->
next
=
NULL
;
node
->
msg_id
=
msg_id
;
node
->
msg_type
=
msg_type
;
node
->
publish_qos
=
publish_qos
;
msg_queue_t
*
tail
=
*
head
;
if
(
tail
){
while
(
tail
->
next
!=
NULL
)
tail
=
tail
->
next
;
tail
->
next
=
node
;
}
else
{
*
head
=
node
;
}
return
node
;
}
void
msg_destroy
(
msg_queue_t
*
node
){
if
(
!
node
)
return
;
if
(
node
->
msg
.
data
){
c_free
(
node
->
msg
.
data
);
node
->
msg
.
data
=
NULL
;
}
c_free
(
node
);
}
msg_queue_t
*
msg_dequeue
(
msg_queue_t
**
head
){
if
(
!
head
||
!*
head
){
return
NULL
;
}
msg_queue_t
*
node
=
*
head
;
// fetch head.
*
head
=
node
->
next
;
// update head.
node
->
next
=
NULL
;
return
node
;
}
app/mqtt/msg_queue.h
0 → 100644
View file @
09750b56
#ifndef _MSG_QUEUE_H
#define _MSG_QUEUE_H 1
#include "mqtt_msg.h"
#ifdef __cplusplus
extern
"C"
{
#endif
struct
msg_queue_t
;
typedef
struct
msg_queue_t
{
struct
msg_queue_t
*
next
;
mqtt_message_t
msg
;
uint16_t
msg_id
;
int
msg_type
;
int
publish_qos
;
}
msg_queue_t
;
msg_queue_t
*
msg_enqueue
(
msg_queue_t
**
head
,
mqtt_message_t
*
msg
,
uint16_t
msg_id
,
int
msg_type
,
int
publish_qos
);
void
msg_destroy
(
msg_queue_t
*
node
);
msg_queue_t
*
msg_dequeue
(
msg_queue_t
**
head
);
#ifdef __cplusplus
}
#endif
#endif
examples/fragment.lua
View file @
09750b56
...
@@ -396,3 +396,33 @@ string.gsub("abc%0Ddef", "%%(%x%x)", ex) print("hello")
...
@@ -396,3 +396,33 @@ string.gsub("abc%0Ddef", "%%(%x%x)", ex) print("hello")
v
=
"abc%0D%0Adef"
v
=
"abc%0D%0Adef"
pcall
(
function
()
print
(
string.gsub
(
v
,
"%%(%x%x)"
,
function
(
x
)
return
string.char
(
tonumber
(
x
,
16
))
end
))
end
)
pcall
(
function
()
print
(
string.gsub
(
v
,
"%%(%x%x)"
,
function
(
x
)
return
string.char
(
tonumber
(
x
,
16
))
end
))
end
)
m
=
mqtt
.
Client
()
m
:
connect
(
"192.168.18.88"
,
1883
)
topic
=
{}
topic
[
"/topic1"
]
=
0
topic
[
"/topic2"
]
=
0
m
:
subscribe
(
topic
,
function
(
m
)
print
(
"sub done"
)
end
)
m
:
on
(
"message"
,
function
(
m
,
t
,
pl
)
print
(
t
..
":"
)
if
pl
~=
nil
then
print
(
pl
)
end
end
)
m
:
publish
(
"/topic1"
,
"hello"
,
0
,
0
)
m
:
publish
(
"/topic3"
,
"hello"
,
0
,
0
)
m
:
publish
(
"/topic4"
,
"hello"
,
0
,
0
)
m
=
mqtt
.
Client
()
m
:
connect
(
"192.168.18.88"
,
1883
)
m
:
subscribe
(
"/topic1"
,
0
,
function
(
m
)
print
(
"sub done"
)
end
)
m
:
subscribe
(
"/topic2"
,
0
,
function
(
m
)
print
(
"sub done"
)
end
)
m
:
on
(
"message"
,
function
(
m
,
t
,
pl
)
print
(
t
..
":"
)
if
pl
~=
nil
then
print
(
pl
)
end
end
)
m
:
publish
(
"/topic1"
,
"hello"
,
0
,
0
)
m
:
publish
(
"/topic3"
,
"hello"
,
0
,
0
)
m
:
publish
(
"/topic4"
,
"hello"
,
0
,
0
)
m
:
publish
(
"/topic1"
,
"hello1"
,
0
,
0
)
m
:
publish
(
"/topic2"
,
"hello2"
,
0
,
0
)
m
:
publish
(
"/topic1"
,
"hello"
,
1
,
0
)
m
:
subscribe
(
"/topic3"
,
2
,
function
(
m
)
print
(
"sub done"
)
end
)
m
:
publish
(
"/topic3"
,
"hello3"
,
2
,
0
)
m
=
mqtt
.
Client
()
m
:
connect
(
"192.168.18.88"
,
1883
,
function
(
con
)
print
(
"connected hello"
)
end
)
m
=
mqtt
.
Client
()
m
:
on
(
"connect"
,
function
(
m
)
print
(
"connection"
)
end
)
m
:
connect
(
"192.168.18.88"
,
1883
)
m
:
on
(
"offline"
,
function
(
m
)
print
(
"disconnection"
)
end
)
ld/eagle.app.v6.ld
View file @
09750b56
...
@@ -5,7 +5,7 @@ MEMORY
...
@@ -5,7 +5,7 @@ MEMORY
dport0_0_seg : org = 0x3FF00000, len = 0x10
dport0_0_seg : org = 0x3FF00000, len = 0x10
dram0_0_seg : org = 0x3FFE8000, len = 0x14000
dram0_0_seg : org = 0x3FFE8000, len = 0x14000
iram1_0_seg : org = 0x40100000, len = 0x8000
iram1_0_seg : org = 0x40100000, len = 0x8000
irom0_0_seg : org = 0x40210000, len = 0x
5A
000
irom0_0_seg : org = 0x40210000, len = 0x
60
000
}
}
PHDRS
PHDRS
...
...
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