Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
Nodemcu Firmware
Commits
bcbde08b
Commit
bcbde08b
authored
Apr 05, 2015
by
funshine
Browse files
fix mqtt keepalive ping, add a example for mqtt in lua_examples.
parent
85586411
Changes
4
Show whitespace changes
Inline
Side-by-side
app/include/user_version.h
View file @
bcbde08b
...
...
@@ -7,6 +7,6 @@
#define NODE_VERSION_INTERNAL 0U
#define NODE_VERSION "NodeMCU 0.9.5"
#define BUILD_DATE "build 2015040
3
"
#define BUILD_DATE "build 2015040
5
"
#endif
/* __USER_VERSION_H__ */
app/modules/mqtt.c
View file @
bcbde08b
...
...
@@ -47,8 +47,6 @@ typedef struct mqtt_state_t
uint16_t
port
;
int
auto_reconnect
;
mqtt_connect_info_t
*
connect_info
;
uint8_t
*
in_buffer
;
int
in_buffer_length
;
uint16_t
message_length
;
uint16_t
message_length_read
;
mqtt_connection_t
mqtt_connection
;
...
...
@@ -166,7 +164,6 @@ static void deliver_publish(lmqtt_userdata * mud, uint8_t* message, int length)
NODE_DBG
(
"enter deliver_publish.
\n
"
);
if
(
mud
==
NULL
)
return
;
const
char
comma
[]
=
","
;
mqtt_event_data_t
event_data
;
event_data
.
topic_length
=
length
;
...
...
@@ -181,11 +178,15 @@ static void deliver_publish(lmqtt_userdata * mud, uint8_t* message, int length)
return
;
if
(
mud
->
L
==
NULL
)
return
;
if
(
event_data
.
topic
&&
(
event_data
.
topic_length
>
0
)){
lua_rawgeti
(
mud
->
L
,
LUA_REGISTRYINDEX
,
mud
->
cb_message_ref
);
lua_rawgeti
(
mud
->
L
,
LUA_REGISTRYINDEX
,
mud
->
self_ref
);
// pass the userdata to callback func in lua
lua_pushlstring
(
mud
->
L
,
event_data
.
topic
,
event_data
.
topic_length
);
if
(
event_data
.
data_length
>
0
){
}
else
{
NODE_DBG
(
"get wrong packet.
\n
"
);
return
;
}
if
(
event_data
.
data
&&
(
event_data
.
data_length
>
0
)){
lua_pushlstring
(
mud
->
L
,
event_data
.
data
,
event_data
.
data_length
);
lua_call
(
mud
->
L
,
3
,
0
);
}
else
{
...
...
@@ -202,6 +203,9 @@ static void mqtt_socket_received(void *arg, char *pdata, unsigned short len)
uint8_t
msg_qos
;
uint16_t
msg_id
;
msg_queue_t
*
node
=
NULL
;
int
length
=
(
int
)
len
;
// uint8_t in_buffer[MQTT_BUF_SIZE];
uint8_t
*
in_buffer
=
(
uint8_t
*
)
pdata
;
struct
espconn
*
pesp_conn
=
arg
;
if
(
pesp_conn
==
NULL
)
...
...
@@ -211,17 +215,17 @@ static void mqtt_socket_received(void *arg, char *pdata, unsigned short len)
return
;
READPACKET:
if
(
len
>
MQTT_BUF_SIZE
&&
len
<=
0
)
if
(
len
gth
>
MQTT_BUF_SIZE
||
len
gth
<=
0
)
return
;
c_memcpy
(
mud
->
mqtt_state
.
in_buffer
,
pdata
,
len
);
//
c_memcpy(in_buffer, pdata, len
gth
);
uint8_t
temp_buffer
[
MQTT_BUF_SIZE
];
mqtt_msg_init
(
&
mud
->
mqtt_state
.
mqtt_connection
,
temp_buffer
,
MQTT_BUF_SIZE
);
mqtt_message_t
*
temp_msg
=
NULL
;
switch
(
mud
->
connState
){
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
(
in_buffer
)
!=
MQTT_MSG_TYPE_CONNACK
){
NODE_DBG
(
"MQTT: Invalid packet
\r\n
"
);
mud
->
connState
=
MQTT_INIT
;
if
(
mud
->
secure
)
...
...
@@ -245,11 +249,11 @@ READPACKET:
break
;
case
MQTT_DATA
:
mud
->
mqtt_state
.
message_length_read
=
len
;
mud
->
mqtt_state
.
message_length
=
mqtt_get_total_length
(
mud
->
mqtt_state
.
in_buffer
,
mud
->
mqtt_state
.
message_length_read
);
msg_type
=
mqtt_get_type
(
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
);
mud
->
mqtt_state
.
message_length_read
=
len
gth
;
mud
->
mqtt_state
.
message_length
=
mqtt_get_total_length
(
in_buffer
,
mud
->
mqtt_state
.
message_length_read
);
msg_type
=
mqtt_get_type
(
in_buffer
);
msg_qos
=
mqtt_get_qos
(
in_buffer
);
msg_id
=
mqtt_get_id
(
in_buffer
,
mud
->
mqtt_state
.
message
_length
);
msg_queue_t
*
pending_msg
=
msg_peek
(
&
(
mud
->
mqtt_state
.
pending_msg_q
));
...
...
@@ -295,7 +299,7 @@ READPACKET:
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
,
in_buffer
,
mud
->
mqtt_state
.
message_length
);
break
;
case
MQTT_MSG_TYPE_PUBACK
:
if
(
pending_msg
&&
pending_msg
->
msg_type
==
MQTT_MSG_TYPE_PUBLISH
&&
pending_msg
->
msg_id
==
msg_id
){
...
...
@@ -365,11 +369,11 @@ READPACKET:
if
(
msg_type
==
MQTT_MSG_TYPE_PUBLISH
)
{
len
=
mud
->
mqtt_state
.
message_length_read
;
len
gth
=
mud
->
mqtt_state
.
message_length_read
;
if
(
mud
->
mqtt_state
.
message_length
<
mud
->
mqtt_state
.
message_length_read
)
{
len
-=
mud
->
mqtt_state
.
message_length
;
len
gth
-=
mud
->
mqtt_state
.
message_length
;
pdata
+=
mud
->
mqtt_state
.
message_length
;
NODE_DBG
(
"Get another published message
\r\n
"
);
...
...
@@ -386,8 +390,8 @@ READPACKET:
espconn_secure_sent
(
pesp_conn
,
node
->
msg
.
data
,
node
->
msg
.
length
);
else
espconn_sent
(
pesp_conn
,
node
->
msg
.
data
,
node
->
msg
.
length
);
mud
->
keep_alive_tick
=
0
;
}
mud
->
keep_alive_tick
=
0
;
NODE_DBG
(
"receive, queue size: %d
\n
"
,
msg_size
(
&
(
mud
->
mqtt_state
.
pending_msg_q
)));
NODE_DBG
(
"leave mqtt_socket_received.
\n
"
);
return
;
...
...
@@ -406,6 +410,7 @@ static void mqtt_socket_sent(void *arg)
return
;
// call mqtt_sent()
mud
->
event_timeout
=
0
;
mud
->
keep_alive_tick
=
0
;
if
(
mud
->
connState
==
MQTT_CONNECT_SENDING
){
mud
->
connState
=
MQTT_CONNECT_SENT
;
...
...
@@ -430,7 +435,7 @@ static void mqtt_socket_sent(void *arg)
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_PINGRE
SP
)
{
}
else
if
(
node
&&
node
->
msg_type
==
MQTT_MSG_TYPE_PINGRE
Q
)
{
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
)));
...
...
@@ -462,6 +467,7 @@ static void mqtt_socket_connected(void *arg)
espconn_secure_sent
(
pesp_conn
,
temp_msg
->
data
,
temp_msg
->
length
);
else
espconn_sent
(
pesp_conn
,
temp_msg
->
data
,
temp_msg
->
length
);
mud
->
keep_alive_tick
=
0
;
mud
->
connState
=
MQTT_CONNECT_SENDING
;
NODE_DBG
(
"leave mqtt_socket_connected.
\n
"
);
...
...
@@ -625,8 +631,7 @@ static int mqtt_socket_client( lua_State* L )
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
);
if
(
!
mud
->
connect_info
.
client_id
||
!
mud
->
connect_info
.
username
||
!
mud
->
connect_info
.
password
||
!
mud
->
mqtt_state
.
in_buffer
){
if
(
!
mud
->
connect_info
.
client_id
||
!
mud
->
connect_info
.
username
||
!
mud
->
connect_info
.
password
){
if
(
mud
->
connect_info
.
client_id
)
{
c_free
(
mud
->
connect_info
.
client_id
);
mud
->
connect_info
.
client_id
=
NULL
;
...
...
@@ -638,10 +643,6 @@ static int mqtt_socket_client( lua_State* L )
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
;
}
return
luaL_error
(
L
,
"not enough memory"
);
}
...
...
@@ -660,9 +661,8 @@ static int mqtt_socket_client( lua_State* L )
mud
->
connect_info
.
will_retain
=
0
;
mud
->
connect_info
.
keepalive
=
keepalive
;
mud
->
mqtt_state
.
in_buffer_length
=
MQTT_BUF_SIZE
;
mud
->
mqtt_state
.
pending_msg_q
=
NULL
;
mud
->
mqtt_state
.
auto_reconnect
=
1
;
mud
->
mqtt_state
.
auto_reconnect
=
0
;
mud
->
mqtt_state
.
port
=
1883
;
mud
->
mqtt_state
.
connect_info
=
&
mud
->
connect_info
;
...
...
@@ -722,10 +722,6 @@ static int mqtt_delete( lua_State* L )
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
;
}
// -------
// free (unref) callback ref
...
...
examples/fragment.lua
View file @
bcbde08b
...
...
@@ -484,3 +484,34 @@ gpio.mode(1,gpio.OUTPUT,gpio.PULLUP)
gpio
.
serout
(
1
,
0
,{
20
,
10
,
10
,
20
,
10
,
10
,
10
,
100
})
-- sim uart one byte 0x5A at about 100kbps
gpio
.
serout
(
1
,
1
,{
8
,
18
},
8
)
-- serial 30% pwm 38k, lasts 8 cycles
-- Lua: mqtt.Client(clientid, keepalive, user, pass)
-- test with cloudmqtt.com
m_dis
=
{}
function
dispatch
(
m
,
t
,
pl
)
if
pl
~=
nil
and
m_dis
[
t
]
then
m_dis
[
t
](
pl
)
end
end
function
topic1func
(
pl
)
print
(
"get1: "
..
pl
)
end
function
topic2func
(
pl
)
print
(
"get2: "
..
pl
)
end
m_dis
[
"/topic1"
]
=
topic1func
m_dis
[
"/topic2"
]
=
topic2func
m
=
mqtt
.
Client
(
"nodemcu1"
,
60
,
"test"
,
"test123"
)
m
:
on
(
"connect"
,
function
(
m
)
print
(
"connection "
..
node
.
heap
())
m
:
subscribe
(
"/topic1"
,
0
,
function
(
m
)
print
(
"sub done"
)
end
)
m
:
subscribe
(
"/topic2"
,
0
,
function
(
m
)
print
(
"sub done"
)
end
)
m
:
publish
(
"/topic1"
,
"hello"
,
0
,
0
)
m
:
publish
(
"/topic2"
,
"world"
,
0
,
0
)
end
)
m
:
on
(
"offline"
,
function
(
conn
)
print
(
"disconnect to broker..."
)
print
(
node
.
heap
())
end
)
m
:
on
(
"message"
,
dispatch
)
m
:
connect
(
"m11.cloudmqtt.com"
,
11214
,
0
,
1
)
-- Lua: mqtt:connect( host, port, secure, auto_reconnect, function(client) )
lua_examples/mqtt_test.lua
0 → 100644
View file @
bcbde08b
-- Lua: mqtt.Client(clientid, keepalive, user, pass)
-- test with cloudmqtt.com
m_dis
=
{}
function
dispatch
(
m
,
t
,
pl
)
if
pl
~=
nil
and
m_dis
[
t
]
then
m_dis
[
t
](
pl
)
end
end
function
topic1func
(
pl
)
print
(
"get1: "
..
pl
)
end
function
topic2func
(
pl
)
print
(
"get2: "
..
pl
)
end
m_dis
[
"/topic1"
]
=
topic1func
m_dis
[
"/topic2"
]
=
topic2func
m
=
mqtt
.
Client
(
"nodemcu1"
,
60
,
"test"
,
"test123"
)
m
:
on
(
"connect"
,
function
(
m
)
print
(
"connection "
..
node
.
heap
())
m
:
subscribe
(
"/topic1"
,
0
,
function
(
m
)
print
(
"sub done"
)
end
)
m
:
subscribe
(
"/topic2"
,
0
,
function
(
m
)
print
(
"sub done"
)
end
)
m
:
publish
(
"/topic1"
,
"hello"
,
0
,
0
)
m
:
publish
(
"/topic2"
,
"world"
,
0
,
0
)
end
)
m
:
on
(
"offline"
,
function
(
conn
)
print
(
"disconnect to broker..."
)
print
(
node
.
heap
())
end
)
m
:
on
(
"message"
,
dispatch
)
m
:
connect
(
"m11.cloudmqtt.com"
,
11214
,
0
,
1
)
-- Lua: mqtt:connect( host, port, secure, auto_reconnect, function(client) )
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