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(function () return net.http.get(host, path.."?uid="..uid, "text/html", "", ssl, port) end)
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")
-- читаем настройки
wdt_on = Settings.get("sys_wdt") == "on"
format = Settings.get("rfid_format")
host, path, ssl, port = net.parseUrl(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)
return net.udp.sendto(host, port, uid)
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")
-- читаем настройки и делаем инициализацию
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)
return net.tcp.sendto(host, port, uid)
end,
okfunc = function() -- функция для обработки успешного поведения.
leds:ok() -- индикация
snd:ok() -- звук
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
createBot = require("telegram")
token = "токен_вашего_бота"
bot = createBot(token,
function(chat_id, text, sendMessage, sendDocument)
-- input text
sendMessage(chat_id, "Вы сказали: " .. text)
end,
function(chat_id, document, sendMessage, saveDocument)
-- input file
local res, msg = saveDocument(document.file_id, "/downloads/"..document.file_name)
sendMessage(chat_id, "Загрузка документа: " .. (res and "успешно" or msg))
end
)
while true do
bot.getUpdates()
thread.sleepms(200)
end
--- udp ---
net.udp.sendto("192.168.68.110", 5555, "hello")
--- tcp ---
net.tcp.sendto("192.168.68.110", 5555, "hello")
s = net.udp.bind(5555)
while true do
from, data = net.udp.recvfrom(s, 100)
if from then
print(from, data)
file = io.open("userlist.txt", "a")
file:write(data)
file:close()
end
print("timeout")
thread.sleepms(100)
end