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
32e062f5
Commit
32e062f5
authored
Mar 31, 2015
by
funshine
Browse files
polish mqtt module
parent
dcb6e53a
Changes
5
Hide whitespace changes
Inline
Side-by-side
README.md
View file @
32e062f5
...
...
@@ -36,6 +36,12 @@ Tencent QQ group: 309957875<br />
-
cross compiler (done)
# Change log
2015-03-31
<br
/>
polish mqtt module, add queue for mqtt module.
<br
/>
add reconnect option to mqtt.connect api, :connect( host, port, secure, auto_reconnect, function(client) )
<br
/>
move node.readvdd33 to adc.readvdd33.
<br
/>
tools/esptool.py supported NodeMCU devkit automatic flash.
2015-03-18
<br
/>
update u8glib.
<br
/>
merge everything to master.
...
...
app/modules/mqtt.c
View file @
32e062f5
...
...
@@ -231,7 +231,7 @@ READPACKET:
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_queue_t
*
pending_msg
=
mud
->
mqtt_state
.
pending_msg_q
;
msg_queue_t
*
pending_msg
=
msg_peek
(
&
(
mud
->
mqtt_state
.
pending_msg_q
))
;
NODE_DBG
(
"MQTT_DATA: type: %d, qos: %d, msg_id: %d, pending_id: %d
\r\n
"
,
msg_type
,
...
...
@@ -263,12 +263,12 @@ READPACKET:
if
(
msg_qos
==
1
){
mud
->
mqtt_state
.
outbound_message
=
mqtt_msg_puback
(
&
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_PUBACK
,
(
int
)
msg_qos
);
msg_id
,
MQTT_MSG_TYPE_PUBACK
,
0
);
}
else
if
(
msg_qos
==
2
){
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
);
msg_id
,
MQTT_MSG_TYPE_PUBREC
,
0
);
}
if
(
msg_qos
==
1
||
msg_qos
==
2
){
NODE_DBG
(
"MQTT: Queue response QoS: %d
\r\n
"
,
msg_qos
);
...
...
@@ -290,19 +290,27 @@ READPACKET:
break
;
case
MQTT_MSG_TYPE_PUBREC
:
if
(
pending_msg
&&
pending_msg
->
msg_type
==
MQTT_MSG_TYPE_PUBLISH
&&
pending_msg
->
msg_id
==
msg_id
){
NODE_DBG
(
"MQTT: Publish with QoS = 2 Received PUBREC
\r\n
"
);
// Note: actrually, should not destroy the msg until PUBCOMP is received.
msg_destroy
(
msg_dequeue
(
&
(
mud
->
mqtt_state
.
pending_msg_q
)));
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
);
msg_id
,
MQTT_MSG_TYPE_PUBREL
,
1
);
NODE_DBG
(
"MQTT: Response PUBREL
\r\n
"
);
}
break
;
case
MQTT_MSG_TYPE_PUBREL
:
if
(
pending_msg
&&
pending_msg
->
msg_type
==
MQTT_MSG_TYPE_PUBREC
&&
pending_msg
->
msg_id
==
msg_id
){
msg_destroy
(
msg_dequeue
(
&
(
mud
->
mqtt_state
.
pending_msg_q
)));
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
);
msg_id
,
MQTT_MSG_TYPE_PUBCOMP
,
0
);
NODE_DBG
(
"MQTT: Response PUBCOMP
\r\n
"
);
}
break
;
case
MQTT_MSG_TYPE_PUBCOMP
:
if
(
pending_msg
&&
pending_msg
->
msg_type
==
MQTT_MSG_TYPE_PUB
LISH
&&
pending_msg
->
msg_id
==
msg_id
){
if
(
pending_msg
&&
pending_msg
->
msg_type
==
MQTT_MSG_TYPE_PUB
REL
&&
pending_msg
->
msg_id
==
msg_id
){
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
)
...
...
@@ -317,7 +325,7 @@ READPACKET:
case
MQTT_MSG_TYPE_PINGREQ
:
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
);
msg_id
,
MQTT_MSG_TYPE_PINGRESP
,
1
);
NODE_DBG
(
"MQTT: Response PINGRESP
\r\n
"
);
break
;
case
MQTT_MSG_TYPE_PINGRESP
:
...
...
@@ -345,7 +353,7 @@ READPACKET:
break
;
}
if
(
node
&&
(
mud
->
mqtt_state
.
pending_msg_q
->
next
==
NULL
)
&&
mud
->
event_timeout
==
0
){
if
(
node
&&
(
1
==
msg_size
(
&
(
mud
->
mqtt_state
.
pending_msg_q
))
)
&&
mud
->
event_timeout
==
0
){
mud
->
event_timeout
=
MQTT_SEND_TIMEOUT
;
NODE_DBG
(
"Sent: %d
\n
"
,
node
->
msg
.
length
);
if
(
mud
->
secure
)
...
...
@@ -355,6 +363,7 @@ READPACKET:
mud
->
keep_alive_tick
=
0
;
mud
->
mqtt_state
.
outbound_message
=
NULL
;
}
NODE_DBG
(
"receive, queue size: %d
\n
"
,
msg_size
(
&
(
mud
->
mqtt_state
.
pending_msg_q
)));
NODE_DBG
(
"leave mqtt_socket_received.
\n
"
);
return
;
}
...
...
@@ -376,9 +385,9 @@ static void mqtt_socket_sent(void *arg)
// call mqtt_sent()
mud
->
event_timeout
=
0
;
NODE_DBG
(
"sent1, queue size: %d
\n
"
,
msg_size
(
&
(
mud
->
mqtt_state
.
pending_msg_q
)));
// qos = 0, publish and forgot.
msg_queue_t
*
node
=
mud
->
mqtt_state
.
pending_msg_q
;
msg_queue_t
*
node
=
msg_peek
(
&
(
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
)
...
...
@@ -388,7 +397,14 @@ static void mqtt_socket_sent(void *arg)
lua_rawgeti
(
gL
,
LUA_REGISTRYINDEX
,
mud
->
cb_puback_ref
);
lua_rawgeti
(
gL
,
LUA_REGISTRYINDEX
,
mud
->
self_ref
);
// pass the userdata to callback func in lua
lua_call
(
gL
,
1
,
0
);
}
else
if
(
node
&&
node
->
msg_type
==
MQTT_MSG_TYPE_PUBACK
&&
node
->
publish_qos
==
1
)
{
msg_destroy
(
msg_dequeue
(
&
(
mud
->
mqtt_state
.
pending_msg_q
)));
}
else
if
(
node
&&
node
->
msg_type
==
MQTT_MSG_TYPE_PUBCOMP
)
{
msg_destroy
(
msg_dequeue
(
&
(
mud
->
mqtt_state
.
pending_msg_q
)));
}
else
if
(
node
&&
node
->
msg_type
==
MQTT_MSG_TYPE_PINGRESP
)
{
msg_destroy
(
msg_dequeue
(
&
(
mud
->
mqtt_state
.
pending_msg_q
)));
}
NODE_DBG
(
"sent2, queue size: %d
\n
"
,
msg_size
(
&
(
mud
->
mqtt_state
.
pending_msg_q
)));
NODE_DBG
(
"leave mqtt_socket_sent.
\n
"
);
}
...
...
@@ -423,16 +439,21 @@ static void mqtt_socket_connected(void *arg)
void
mqtt_socket_timer
(
void
*
arg
)
{
//
NODE_DBG("enter mqtt_socket_timer.\n");
NODE_DBG
(
"enter mqtt_socket_timer.
\n
"
);
lmqtt_userdata
*
mud
=
(
lmqtt_userdata
*
)
arg
;
if
(
mud
==
NULL
)
return
;
NODE_DBG
(
"timer, queue size: %d
\n
"
,
msg_size
(
&
(
mud
->
mqtt_state
.
pending_msg_q
)));
if
(
mud
->
event_timeout
>
0
){
NODE_DBG
(
"event_timeout: %d.
\n
"
,
mud
->
event_timeout
);
mud
->
event_timeout
--
;
if
(
mud
->
event_timeout
>
0
){
return
;
}
else
{
NODE_DBG
(
"event timeout.
\n
"
);
// should remove the head of the queue and re-send with DUP = 1
// Not implemented yet.
}
}
...
...
@@ -453,7 +474,7 @@ void mqtt_socket_timer(void *arg)
}
else
if
(
mud
->
connState
==
MQTT_CONNECT_SENT
){
// wait for CONACK time out.
NODE_DBG
(
"MQTT_CONNECT failed.
\n
"
);
}
else
if
(
mud
->
connState
==
MQTT_DATA
){
msg_queue_t
*
pending_msg
=
mud
->
mqtt_state
.
pending_msg_q
;
msg_queue_t
*
pending_msg
=
msg_peek
(
&
(
mud
->
mqtt_state
.
pending_msg_q
))
;
if
(
pending_msg
){
mud
->
event_timeout
=
MQTT_SEND_TIMEOUT
;
if
(
mud
->
secure
)
...
...
@@ -477,7 +498,7 @@ void mqtt_socket_timer(void *arg)
}
}
}
//
NODE_DBG("leave mqtt_socket_timer.\n");
NODE_DBG
(
"leave mqtt_socket_timer.
\n
"
);
}
// Lua: mqtt.Client(clientid, keepalive, user, pass)
...
...
@@ -1057,7 +1078,7 @@ static int mqtt_socket_subscribe( lua_State* L ) {
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
->
event_timeout
==
0
){
if
(
node
&&
(
1
==
msg_size
(
&
(
mud
->
mqtt_state
.
pending_msg_q
))
)
&&
mud
->
event_timeout
==
0
){
mud
->
event_timeout
=
MQTT_SEND_TIMEOUT
;
NODE_DBG
(
"Sent: %d
\n
"
,
node
->
msg
.
length
);
if
(
mud
->
secure
)
...
...
@@ -1073,6 +1094,7 @@ static int mqtt_socket_subscribe( lua_State* L ) {
lua_pushboolean
(
L
,
1
);
// enqueued succeed.
}
mud
->
mqtt_state
.
outbound_message
=
NULL
;
NODE_DBG
(
"subscribe, queue size: %d
\n
"
,
msg_size
(
&
(
mud
->
mqtt_state
.
pending_msg_q
)));
NODE_DBG
(
"leave mqtt_socket_subscribe.
\n
"
);
return
1
;
}
...
...
@@ -1133,7 +1155,7 @@ static int mqtt_socket_publish( lua_State* L )
msg_queue_t
*
node
=
msg_enqueue
(
&
(
mud
->
mqtt_state
.
pending_msg_q
),
mud
->
mqtt_state
.
outbound_message
,
msg_id
,
MQTT_MSG_TYPE_PUBLISH
,
(
int
)
qos
);
if
(
node
&&
(
mud
->
mqtt_state
.
pending_msg_q
->
next
==
NULL
)
&&
mud
->
event_timeout
==
0
){
if
(
node
&&
(
1
==
msg_size
(
&
(
mud
->
mqtt_state
.
pending_msg_q
))
)
&&
mud
->
event_timeout
==
0
){
mud
->
event_timeout
=
MQTT_SEND_TIMEOUT
;
NODE_DBG
(
"Sent: %d
\n
"
,
node
->
msg
.
length
);
if
(
mud
->
secure
)
...
...
@@ -1149,6 +1171,7 @@ static int mqtt_socket_publish( lua_State* L )
lua_pushboolean
(
L
,
1
);
// enqueued succeed.
}
mud
->
mqtt_state
.
outbound_message
=
NULL
;
NODE_DBG
(
"publish, queue size: %d
\n
"
,
msg_size
(
&
(
mud
->
mqtt_state
.
pending_msg_q
)));
NODE_DBG
(
"leave mqtt_socket_publish.
\n
"
);
return
1
;
}
...
...
app/mqtt/msg_queue.c
View file @
32e062f5
...
...
@@ -58,3 +58,25 @@ msg_queue_t * msg_dequeue(msg_queue_t **head){
node
->
next
=
NULL
;
return
node
;
}
msg_queue_t
*
msg_peek
(
msg_queue_t
**
head
){
if
(
!
head
||
!*
head
){
return
NULL
;
}
return
*
head
;
// fetch head.
}
int
msg_size
(
msg_queue_t
**
head
){
if
(
!
head
||
!*
head
){
return
0
;
}
int
i
=
1
;
msg_queue_t
*
tail
=
*
head
;
if
(
tail
){
while
(
tail
->
next
!=
NULL
){
tail
=
tail
->
next
;
i
++
;
}
}
return
i
;
}
app/mqtt/msg_queue.h
View file @
32e062f5
...
...
@@ -18,6 +18,8 @@ typedef struct 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
);
msg_queue_t
*
msg_peek
(
msg_queue_t
**
head
);
int
msg_size
(
msg_queue_t
**
head
);
#ifdef __cplusplus
}
...
...
examples/fragment.lua
View file @
32e062f5
...
...
@@ -418,7 +418,7 @@ 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
:
subscribe
(
"/topic3"
,
0
,
function
(
m
)
print
(
"sub done"
)
end
)
m
:
publish
(
"/topic3"
,
"hello3"
,
2
,
0
)
m
=
mqtt
.
Client
()
...
...
@@ -450,3 +450,13 @@ end)
m
:
connect
(
"192.168.18.88"
,
1883
)
m
:
close
()
m
=
mqtt
.
Client
()
m
:
connect
(
"192.168.18.88"
,
1883
)
m
:
on
(
"message"
,
function
(
m
,
t
,
pl
)
print
(
t
..
":"
)
if
pl
~=
nil
then
print
(
pl
)
end
end
)
m
:
subscribe
(
"/topic1"
,
0
,
function
(
m
)
print
(
"sub done"
)
end
)
m
:
publish
(
"/topic1"
,
"hello3"
,
2
,
0
)
m
:
publish
(
"/topic1"
,
"hello2"
,
2
,
0
)
m
:
publish
(
"/topic1"
,
"hello3"
,
0
,
0
)
m
:
publish
(
"/topic1"
,
"hello2"
,
2
,
0
)
m
:
subscribe
(
"/topic2"
,
2
,
function
(
m
)
print
(
"sub done"
)
end
)
m
:
publish
(
"/topic2"
,
"hello3"
,
0
,
0
)
m
:
publish
(
"/topic2"
,
"hello2"
,
2
,
0
)
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