wdt_on = Settings.get("sys_wdt") == "on"
server = Settings.get("net_dest")
-- импорт библиотек
local rfid = require("rfid")
local indication = require("indication")
-- иницализация
reader = rfid.Reader({})
leds = indication.Leds.new({RGB=true})
snd = indication.Sound.new()
locker = rfid.OUT()
-- читаем настройки
wdt_on = Settings.get("sys_wdt") == "on"
server = Settings.get("net_dest")
host, path, ssl, port = net.parseUrl(Settings.get("net_dest"))
-- стартовая анимация
leds:start()
snd:start()
-- настраиваем индикацию и время открытия замка
function locker_open_sound()
for i=1, 8 do
if wdt_on then
cpu.watchdog.reset()
end
snd:play("G6", 4)
thread.sleepms(500)
end
end
-- запускаем функцию-обработчик
reader.process({
timeout_ms = 200, -- таймаут в цикле. всегда должен быть больше 0
mode = rfid.MODE_LOOP, -- вечный цикл, однократный или в режиме сопрограммы
wdt = wdt_on, -- сторожевой таймер
checkfunc = function(uid) -- функция для проверки карты
-- отправляем http get-запрос и анализируем код ответа
local status, res = pcall(net.http.get, host, path.."?uid="..uid, "text/html", "", ssl, port);
return res == 200
end,
okfunc = function() -- функция для обработки успешного поведения.
locker.open() -- открытие замка
leds:ok() -- индикация
snd:ok() -- звук
thread.sleepms(100)
locker_open_sound() -- озвученная пауза на время открытия двери
locker.close() -- закрытие замка
end,
errfunc = function() -- индикация ошибки
leds:err()
snd:err()
end
})
from bottle import route, run, request
@route('/<path:path>')
def show_params(path):
params = request.query.decode()
print(f"Path: {path}")
print("Parameters:")
for key, value in params.items():
print(f" {key}: {value}")
return "Parameters received"
run(host='0.0.0.0', port=5000, debug=True)
-- импорт библиотек
rfid = require("rfid")
indication = require("indication")
-- иницализация
leds = indication.Leds.new({RGB=true})
snd = indication.Sound.new()
reader = rfid.Reader({})
locker = rfid.OUT()
database = rfid.UID_cache({file="userlist.txt", size=1000, strlen=0})
-- читаем настройки
wdt_on = Settings.get("sys_wdt") == "on"
format = Settings.get("rfid_format")
-- стартовая анимация
leds:start()
snd:start()
-- настраиваем индикацию и время открытия замка
function locker_open_sound()
for i=1, 8 do
if wdt_on then
cpu.watchdog.reset()
end
snd:play("G6", 4)
thread.sleepms(500)
end
end
-- запускаем функцию-обработчик
reader.process({
timeout_ms = 200, -- таймаут в цикле. всегда должен быть больше 0
mode = rfid.MODE_LOOP, -- вечный цикл, однократный или в режиме сопрограммы
wdt = wdt_on, -- сторожевой таймер
format = format, -- формат чтения с метки
uidtype = rfid.UID_INT,
checkfunc = function(uid) -- функция для проверки карты
return database.find(uid)
end,
okfunc = function() -- функция для обработки успешного поведения.
locker.open() -- открытие замка
leds:ok() -- индикация
snd:ok() -- звук
thread.sleepms(100)
locker_open_sound() -- озвученная пауза для выхода
locker.close() -- закрытие замка
end,
errfunc = function() -- индикация ошибки
leds:err()
snd:err()
end
})
-- импорт библиотек
rfid = require("rfid")
indication = require("indication")
local socket = require("socket")
local udp = assert(socket.udp())
-- читаем настройки
wdt_on = Settings.get("sys_wdt") == "on"
format = Settings.get("rfid_format")
dst = Settings.get("net_dest")
leds = indication.Leds.new({RGB=true})
snd = indication.Sound.new()
reader = rfid.Reader({})
-- стартовая индикация
leds:start()
snd:start()
-- запускаем функцию-обработчик
reader.process({
timeout_ms = 200, -- таймаут в цикле. всегда должен быть больше 0
mode = rfid.MODE_LOOP, -- вечный цикл, однократный или в режиме сопрограммы
wdt = wdt_on, -- сторожевой таймер
format = format, -- формат чтения с метки
checkfunc = function(uid)
udp:sendto(uid, dst, 5555)
return true
end,
okfunc = function() -- функция для обработки успешного поведения.
leds:ok() -- индикация
snd:ok() -- звук
end
})
-- импорт библиотек
rfid = require("rfid")
indication = require("indication")
-- читаем настройки
wdt_on = Settings.get("sys_wdt") == "on"
format = Settings.get("rfid_format")
dst = Settings.get("net_dest")
leds = indication.Leds.new({RGB=true})
snd = indication.Sound.new()
reader = rfid.Reader({})
locker = rfid.OUT()
client = mqtt.client("100", "test.mosquitto.org", 1883, false)
client:connect("","")
client:subscribe("/test112233/cmd", mqtt.QOS0, function(len, message, topic_len, topic_name)
if message == "ok" then
locker.open() -- открытие замка
leds:ok() -- индикация
snd:ok() -- звук
thread.sleepms(3000) -- пауза 3 сек
locker.close() -- закрытие замка
else
leds:err() -- индикация
snd:err() -- звук
end
print("message: "..message)
end)
-- стартовая индикация
leds:start()
snd:start()
-- запускаем функцию-обработчик
reader.process({
mode = rfid.MODE_LOOP, -- вечный цикл
wdt = wdt_on, -- сторожевой таймер включен
checkfunc = function(uid)
client:publish("/test112233/uid", uid, mqtt.QOS0)
end
})
Подписаться на топик
mosquitto_sub -h test.mosquitto.org -t "/test112233/uid" -v
Отправить команду "ok" на открытие
mosquitto_pub -h test.mosquitto.org -t "/test112233/cmd" -m ok
Отправить (любую другую) команду - "ошибка"
mosquitto_pub -h test.mosquitto.org -t "/test112233/cmd" -m err
-- импорт библиотек
rfid = require("rfid")
indication = require("indication")
Masterkey = require("masterkey")
-- инициализация
leds = indication.Leds.new({RGB=true})
snd = indication.Sound.new()
reader = rfid.Reader({})
locker = rfid.OUT()
time_filter = rfid.time_filter(1)
-- читаем настройки
wdt_on = Settings.get("sys_wdt") == "on"
format = Settings.get("rfid_format")
-- стартовая анимация
leds:start()
snd:start()
-- настраиваем индикацию и время открытия замка
function locker_open_sound()
for i=1, 8 do
if wdt_on then
cpu.watchdog.reset()
end
snd:play("G6", 4)
thread.sleepms(500)
end
end
-- большой класс для реализации функционала "Мастер-ключ"
master = MasterKey:new({
writeKey="348FBF61785966", -- мастер-ключ "запись"
deleteKey="042F0932AD4184", -- мастер-ключ "удаление"
filePath="userlist.txt", -- список ключей. его можно загрузить через web
writefunc=function() leds:set(200, 200, 0); snd:start() end, -- поведение при входе в запись
delfunc=function() leds:set(0, 0, 255); snd:start() end, -- поведение при входе в чтение
idlefunc=function() leds:clear(); snd:ok() end, -- поведение при входе в обычный режим
okfunc=function() leds:ok(); snd:ok(); end, -- индикация ок
errfunc=function() leds:err(); snd:err(); end}) -- индикация ошибки
-- запускаем функцию-обработчик
reader.process({
mode = rfid.MODE_LOOP, -- вечный цикл
wdt = wdt_on, -- сторожевой таймер
format = format, -- формат чтения с метки
checkfunc = function(uid) -- функция для проверки карты
if time_filter.find(uid) == nil then -- фильтр от повторного поднесения
time_filter.append(uid)
if master:process(uid) then -- обработчик "мастер-ключа"
return rfid.UID_finder("userlist.txt")
end
end
end,
okfunc = function() -- функция для обработки успешного поведения.
locker.open() -- открытие замка
leds:ok() -- индикация
snd:ok() -- звук
thread.sleepms(100)
locker_open_sound() -- озвученная пауза для выхода
locker.close() -- закрытие замка
end,
errfunc = function() -- индикация ошибки
leds:err()
snd:err()
end
})
-- импорт библиотек
rfid = require("rfid")
indication = require("indication")
-- иницализация
leds = indication.Leds.new({RG=true})
snd = indication.Sound.new(pio.GPIO2)
reader = rfid.Reader.new({})
-- читаем настройки
wdt_on = Settings.get("sys_wdt") == "on"
format = Settings.get("rfid_format")
-- стартовая анимация
leds:start()
snd:start()
--функция для хранения uid
function uid_storage()
local mtx = thread.createmutex()
local value = ""
return function(newValue) -- set
mtx:lock()
value = newValue
mtx:unlock()
end,
function() -- get
mtx:lock()
local currentValue = value
value = ""
mtx:unlock()
return currentValue
end
end
setUID, getUID = uid_storage()
-- функция, которую можно вызвать http-запросом
-- http://<ip>/backend?action=get
function http_get(params)
return getUID()
end
-- запускаем функцию-обработчик
reader:process({
timeout_ms = 200, -- таймаут в цикле. всегда должен быть больше 0
loop = true, -- вечный опрос
wdt = wdt_on, -- сторожевой таймер включен
format = format, -- формат чтения с метки
okfunc = function() -- функция для обработки успешного поведения.
setUID(uid)
leds:ok() -- индикация
snd:ok() -- звук
end
})
-- импорт библиотек
rfid = require("rfid")
indication = require("indication")
local socket = require("socket")
local tcp = socket.tcp()
-- читаем настройки и делаем инициализацию
wdt_on = Settings.get("sys_wdt") == "on"
format = Settings.get("rfid_format")
leds = indication.Leds.new({RGB=true})
snd = indication.Sound.new()
out = rfid.OUT()
reader = rfid.Reader({})
host, path, ssl, port = net.parseUrl(Settings.get("net_dest"))
if not port then port = 5555 end
-- стартовая индикация
leds:start()
snd:start()
out.set(0)
-- запускаем функцию-обработчик
reader.process({
timeout_ms = 200, -- таймаут в цикле. всегда должен быть больше 0
mode = rfid.MODE_LOOP, -- вечный цикл
wdt = wdt_on, -- сторожевой таймер
format = format, -- формат чтения с метки
checkfunc = function(uid)
out.set(1)
snd:ok()
leds:set(255, 0, 255)
local s, err = tcp:connect(host, port)
if s then
tcp:send(uid)
tcp:close()
thread.sleep(1)
end
leds:clear()
out.set(0)
end
})
Небольшие куски кода для решения типовых задач
-- задаем имя и порт почтового сервера
net.curl.mailserver("smtp.адрес.сервера", 465)
-- остальные настройки
options = {
user = "логин",
pass = "пароль",
to = {"получатель1", "получатель2"},
subj = "Тема",
msg = "Тестовая посылка",
secure = true,
attach = {"picture.jpg"}
}
ret, msg = net.curl.sendmail(options)
-- ip, path, content-type, ssl_en
code, ret = net.http.get("192.168.0.160", "/userlist.txt", "text/html", false)
if code == 200 then
file = io.open("userlist.txt", "a")
file:write(ret[1])
file:close()
end
local socket = require("socket")
local udp = socket.udp()
udp:setsockname("*", 53474)
udp:settimeout(0.1)
local data = udp:receive()
if data then
print("Received: ", data)
end
local socket = require("socket")
--- udp ---
udp = socket.udp()
udp:sendto("hi","192.168.68.115", 5555)
--- tcp ---
foo = socket.protect(function()
-- connect somewhere
local c = socket.try(socket.connect("192.168.68.115", 12345))
-- create a try function that closes 'c' on error
local try = socket.newtry(function() c:close() end)
-- do everything reassured c will be closed
try(c:send("hello there?\r\n"))
---local answer = try(c:receive())
---...
---try(c:send("good bye\r\n"))
c:close()
end)
local socket = require("socket")
local udp = socket.udp()
udp:setsockname("*", 53474)
udp:settimeout(0.1)
while true do
local data = udp:receive()
if data then
print("Received: ", data)
file = io.open("userlist.txt", "a")
file:write(data)
file:close()
end
thread.sleepms(100)
end