Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
12a546ce3d
|
@ -220,7 +220,8 @@ m:connect("192.168.11.118", 1880, 0, function(conn) print("connected") end)
|
|||
|
||||
-- subscribe topic with qos = 0
|
||||
m:subscribe("/topic",0, function(conn) print("subscribe success") end)
|
||||
|
||||
-- or subscribe multiple topic (topic/0, qos = 0; topic/1, qos = 1; topic2 , qos = 2)
|
||||
-- m:subscribe({["topic/0"]=0,["topic/1"]=1,topic2=2}, function(conn) print("subscribe success") end)
|
||||
-- publish a message with data = hello, QoS = 0, retain = 0
|
||||
m:publish("/topic","hello",0,0, function(conn) print("sent") end)
|
||||
|
||||
|
|
|
@ -33,6 +33,9 @@ typedef enum {
|
|||
} UartExistParity;
|
||||
|
||||
typedef enum {
|
||||
BIT_RATE_1200 = 1200,
|
||||
BIT_RATE_2400 = 2400,
|
||||
BIT_RATE_4800 = 4800,
|
||||
BIT_RATE_9600 = 9600,
|
||||
BIT_RATE_19200 = 19200,
|
||||
BIT_RATE_38400 = 38400,
|
||||
|
|
|
@ -529,23 +529,35 @@ static int mqtt_delete( lua_State* L )
|
|||
}
|
||||
|
||||
if(mud->connect_info.will_topic){
|
||||
c_free(mud->connect_info.client_id);
|
||||
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;
|
||||
}
|
||||
|
||||
if(mud->connect_info.client_id)
|
||||
if(mud->connect_info.client_id){
|
||||
c_free(mud->connect_info.client_id);
|
||||
if(mud->connect_info.username)
|
||||
mud->connect_info.client_id = NULL;
|
||||
}
|
||||
if(mud->connect_info.username){
|
||||
c_free(mud->connect_info.username);
|
||||
if(mud->connect_info.password)
|
||||
mud->connect_info.username = NULL;
|
||||
}
|
||||
if(mud->connect_info.password){
|
||||
c_free(mud->connect_info.password);
|
||||
if(mud->mqtt_state.in_buffer)
|
||||
mud->connect_info.password = NULL;
|
||||
}
|
||||
if(mud->mqtt_state.in_buffer){
|
||||
c_free(mud->mqtt_state.in_buffer);
|
||||
if(mud->mqtt_state.out_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;
|
||||
}
|
||||
|
||||
// free (unref) callback ref
|
||||
if(LUA_NOREF!=mud->cb_connect_ref){
|
||||
|
@ -879,52 +891,111 @@ static int mqtt_socket_on( lua_State* L )
|
|||
}
|
||||
|
||||
// Lua: mqtt:subscribe(topic, qos, function())
|
||||
static int mqtt_socket_subscribe( lua_State* L )
|
||||
{
|
||||
NODE_DBG("mqtt_socket_subscribe is called.\n");
|
||||
uint8_t stack = 1, qos = 0, retain = 0;
|
||||
const char *topic;
|
||||
size_t il;
|
||||
lmqtt_userdata *mud;
|
||||
static int mqtt_socket_subscribe( lua_State* L ) {
|
||||
NODE_DBG("mqtt_socket_subscribe is called.\n");
|
||||
typedef struct SUB_STORAGE {
|
||||
uint32_t length;
|
||||
uint8_t *data;
|
||||
struct SUB_STORAGE *next;
|
||||
} SUB_STORAGE;
|
||||
|
||||
mud = (lmqtt_userdata *)luaL_checkudata(L, stack, "mqtt.socket");
|
||||
luaL_argcheck(L, mud, stack, "mqtt.socket expected");
|
||||
stack++;
|
||||
|
||||
if(mud->send_timeout != 0)
|
||||
return luaL_error( L, "sending in process" );
|
||||
uint8_t stack = 1, qos = 0;
|
||||
const char *topic;
|
||||
size_t il;
|
||||
lmqtt_userdata *mud;
|
||||
|
||||
if(!mud->connected)
|
||||
return luaL_error(L, "not connected");
|
||||
mud = (lmqtt_userdata *) luaL_checkudata( L, stack, "mqtt.socket" );
|
||||
luaL_argcheck( L, mud, stack, "mqtt.socket expected" );
|
||||
stack++;
|
||||
|
||||
topic = luaL_checklstring( L, stack, &il );
|
||||
stack++;
|
||||
if(topic == NULL)
|
||||
return luaL_error( L, "need topic name" );
|
||||
|
||||
qos = luaL_checkinteger( L, stack);
|
||||
stack++;
|
||||
if( mud->send_timeout != 0 )
|
||||
return luaL_error( L, "sending in process" );
|
||||
|
||||
mud->mqtt_state.outbound_message = mqtt_msg_subscribe(&mud->mqtt_state.mqtt_connection,
|
||||
topic, qos,
|
||||
&mud->mqtt_state.pending_msg_id);
|
||||
mud->send_timeout = MQTT_SEND_TIMEOUT;
|
||||
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( !mud->connected )
|
||||
return luaL_error( L, "not connected" );
|
||||
|
||||
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
|
||||
if(mud->cb_suback_ref != LUA_NOREF)
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->cb_suback_ref);
|
||||
mud->cb_suback_ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
}
|
||||
if( lua_istable( L, stack ) ) {
|
||||
NODE_DBG("subscribe table\n");
|
||||
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(mud->secure)
|
||||
espconn_secure_sent(mud->pesp_conn, mud->mqtt_state.outbound_message->data, mud->mqtt_state.outbound_message->length);
|
||||
else
|
||||
espconn_sent(mud->pesp_conn, mud->mqtt_state.outbound_message->data, mud->mqtt_state.outbound_message->length);
|
||||
|
||||
return 0;
|
||||
if( curr == NULL )
|
||||
return luaL_error( L, "not enough memory" );
|
||||
topic = luaL_checkstring( L, -2 );
|
||||
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 );
|
||||
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;
|
||||
uint32_t ptr = 0;
|
||||
while( curr != NULL ) {
|
||||
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_free(curr);
|
||||
curr = curr->next;
|
||||
}
|
||||
c_free(first);
|
||||
if( ptr == 0 ) {
|
||||
return luaL_error( L, "invalid data" );
|
||||
}
|
||||
mud->mqtt_state.outbound_message->data = mud->mqtt_state.out_buffer;
|
||||
mud->mqtt_state.outbound_message->length = ptr;
|
||||
stack++;
|
||||
} else {
|
||||
NODE_DBG("subscribe string\n");
|
||||
topic = luaL_checklstring( L, stack, &il );
|
||||
stack++;
|
||||
if( topic == NULL )
|
||||
return luaL_error( L, "need topic name" );
|
||||
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 );
|
||||
stack++;
|
||||
}
|
||||
|
||||
mud->send_timeout = MQTT_SEND_TIMEOUT;
|
||||
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
|
||||
if( mud->cb_suback_ref != LUA_NOREF )
|
||||
luaL_unref( L, LUA_REGISTRYINDEX, mud->cb_suback_ref );
|
||||
mud->cb_suback_ref = luaL_ref( L, LUA_REGISTRYINDEX );
|
||||
}
|
||||
NODE_DBG("Sent: %d\n", mud->mqtt_state.outbound_message->length);
|
||||
if( mud->secure )
|
||||
espconn_secure_sent( mud->pesp_conn, mud->mqtt_state.outbound_message->data, mud->mqtt_state.outbound_message->length );
|
||||
else
|
||||
espconn_sent( mud->pesp_conn, mud->mqtt_state.outbound_message->data, mud->mqtt_state.outbound_message->length );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Lua: mqtt:publish( topic, payload, qos, retain, function() )
|
||||
|
|
|
@ -185,6 +185,9 @@ uint32_t platform_uart_setup( unsigned id, uint32_t baud, int databits, int pari
|
|||
{
|
||||
switch( baud )
|
||||
{
|
||||
case BIT_RATE_1200:
|
||||
case BIT_RATE_2400:
|
||||
case BIT_RATE_4800:
|
||||
case BIT_RATE_9600:
|
||||
case BIT_RATE_19200:
|
||||
case BIT_RATE_38400:
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
# DHT22 module
|
||||
|
||||
This module is compatible with DHT22 and DHT21.
|
||||
Supports nodemcu with or without floating point.
|
||||
No need to use a resistor to connect the pin data of DHT22 to ESP8266.
|
||||
|
||||
## Example
|
||||
|
@ -12,15 +13,20 @@ dht22.read(PIN)
|
|||
t = dht22.getTemperature()
|
||||
h = dht22.getHumidity()
|
||||
|
||||
if h == -1 then
|
||||
if h == nil then
|
||||
print("Error reading from DHT22")
|
||||
else
|
||||
-- temperature in degrees Celsius and Farenheit
|
||||
print("Temperature: "..(t / 10).."."..(t % 10).." deg C")
|
||||
-- floating point and integer version:
|
||||
print("Temperature: "..((t-(t % 10)) / 10).."."..(t % 10).." deg C")
|
||||
-- only integer version:
|
||||
print("Temperature: "..(9 * t / 50 + 32).."."..(9 * t / 5 % 10).." deg F")
|
||||
|
||||
-- only float point version:
|
||||
print("Temperature: "..(9 * t / 50 + 32).." deg F")
|
||||
|
||||
-- humidity
|
||||
print("Humidity: "..(h/10).."."..(h%10).."%")
|
||||
-- floating point and integer version
|
||||
print("Humidity: "..((h - (h % 10)) / 10).."."..(h % 10).."%")
|
||||
end
|
||||
|
||||
-- release module
|
||||
|
@ -29,7 +35,7 @@ package.loaded["dht22"]=nil
|
|||
```
|
||||
## Functions
|
||||
### read
|
||||
read(pin)
|
||||
read(pin)
|
||||
Read humidity and temperature from DHT22.
|
||||
|
||||
**Parameters:**
|
||||
|
|
|
@ -77,15 +77,17 @@ function M.read(pin)
|
|||
end
|
||||
end
|
||||
|
||||
checksumTest=((humidity / 256) + (humidity % 256) + (temperature / 256) + (temperature % 256)) % 256
|
||||
checksumTest = (bit.band(humidity, 0xFF) + bit.rshift(humidity, 8) + bit.band(temperature, 0xFF) + bit.rshift(temperature, 8))
|
||||
checksumTest = bit.band(checksumTest, 0xFF)
|
||||
|
||||
if temperature > 0x8000 then
|
||||
-- convert to negative format
|
||||
temperature = -(temperature - 0x8000)
|
||||
end
|
||||
|
||||
if checksum ~= checksumTest then
|
||||
humidity = -1
|
||||
-- conditions compatible con float point and integer
|
||||
if (checksumTest - checksum >= 1) or (checksum - checksumTest >= 1) then
|
||||
humidity = nil
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -105,11 +105,10 @@ function readNumber(addr, unit)
|
|||
else
|
||||
return nil
|
||||
end
|
||||
t1 = t / 10000
|
||||
t2 = t % 10000
|
||||
t = t / 10000
|
||||
-- print("Temperature="..t1.."."..t2.." Centigrade")
|
||||
-- result = t1.."."..t2
|
||||
return t1, t2
|
||||
return t
|
||||
end
|
||||
tmr.wdclr()
|
||||
else
|
||||
|
@ -122,11 +121,11 @@ function readNumber(addr, unit)
|
|||
end
|
||||
|
||||
function read(addr, unit)
|
||||
t1, t2 = readNumber(addr, unit)
|
||||
if((t1 == nil ) or (t2 ==nil)) then
|
||||
t = readNumber(addr, unit)
|
||||
if (t == nil) then
|
||||
return nil
|
||||
else
|
||||
return t1.."."..string.format("%04u", t2)
|
||||
return t
|
||||
end
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in New Issue