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
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
Hide 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;
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
){
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);
} 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