Перейти к содержимому
Lgmrszd

Библиотеки для "умного дома" (SHCS, dns)

Рекомендуемые сообщения

Библиотеки и программы для умного дома:

"SWTF, в общем, вумная коблокоробочка."

© Fingercomp

 

программа dns.lua:

55%

Стадия: улучшение/написание базовых функций.

Pastebin: uDrk5unp

библиотека operator.lua:

0%

Стадия: подготовка.

библиотека SHCS.lua:

50%

Стадия: улучшение/написание базовых функций.

Pastebin: F37yFUhs

Подбиблиотеки для SHCS:

 

Для использования подбиблиотеки нужно прописать SHCS.<Название подбиблиотеки>=require('<название библиотеки>')

SHCS-doors.lua:

85%

Стадия: обработка напильником

Pastebin: rEW4h4Bi

Описание, использование:

 

Эта подбиблиотека позволяет управлять дверьми с помощью сигнала красного камня.

 

 

 

 

Решил я недельку назад во время отсутствия на сервере сделать полезную библиотеку (ибо нефиг, я ж прогер, а прог не выкладываю), которая позволяла бы объединять все компы в единую сеть, чтобы они могли свободно использовать сервисы друг друга. Позже выяснилось, что библиотек должно быть несколько. Суть такова, что в общей сети есть несколько видов компов:

  1. Сервер имён сервисов (по сути dns). Он регистрирует сервисы и сообщает остальным компам (по запросу) о подключённых сервисах.
  2. Комп-сервис. Имеет подключённый компонент(ы) (или отвечает за определённую функцию, к примеру, контроль дверей). Библиотека была названа SHCS (Smart Home Control System)
  3. Комп-оператор, работает с компами-сервисами.

Описание функций:

 

dns.lua

 

 

Далее запись вида функция(знач1, знач2): знач3, знач4 обозначает, что запрос к серверу посылается в виде modem.broadcast(порт, функция, знач1, знач2) и сервер отсылает ответ вида знач3, знач4 на адрес, с которого был получен запрос.

 

searchDns(): address:string -- возвращает свой адрес (вернее, адрес сетевой карты) address

addService(type:string,name:string): result:string, type, name -- регистрирует сервис. В случае успеха result равно 'registered', иначе там тип ошибки

servicesTypes(): type1:string, type2:string... -- возвращает типы сервисов

servicesOfType(type:string): name1:string, name2:string... -- возвращает имена сервисов для типа сервиса type

 

 

 

 

SHCS.lua

 

 

Work in progress

 

 

 

 

operator.lua

 

 

Work in progress

 

 

 

Пример программы для управления дверьми:

 

 

local component=require('component')
local rs=component.redstone
local modem=component.modem
local event=require('event')
local SHCS=require('SHCS')

PORT=111

f={}

local side=2
local mdopen=5
local mdclose=14

--Функции для открывания/закрывания/проверки двери

local function checkDoor()
  if rs.getBundledOutput(side,7)>100 then
    return true
  else
    return false
  end
end

local function openDoor()
  rs.setBundledOutput(side,7,255)
  return true
end

local function closeDoor()
  rs.setBundledOutput(side,7,0)
  return true
end


modem.open(PORT)

--создаём новый сервис дверей с названием 'entrance'
doors=SHCS.services.doorControl:new('entrance')
--добавляем дверь 'main'
doors:addDoor('main',openDoor,closeDoor,checkDoor)
--запускаем сервис
SHCS.startService(doors)


 

 

Изменено пользователем MineUbuntu

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Интересный проект)

Вопросы:

  1. Оператор является посредником между сервером и сервисом или выступает в роли терминала доступа для управления сервисом?
    (сервер -> оператор -> сервис / оператор -> сервер -> сервис)
  2. Распознование доступных компонентов и сервисов происходит автоматически? При подключении нового элемента происходит ли обновление онлайн?
  3. Какой блок используется в качестве сервиса, обычный системник?
  4. Поддерживаются ли разные виды подключения (wire+ / wire-) ? Возможно ли параллельное использование обоих вариантов?
  5. Что представляет из себя информация в сервере, древо с доступными функциями?
  6. Присутствует ли ультра-модный супер-современный мега-понтовый лакшери интерфейс? (это же только библиотека, точно)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

1. Оператор связывается с сервисом, сервер служит для хранения списка сервисов. (сервис ---регистрация в списке сервера---> сервер.

оператор серверов.

оператор сервис)

По сути, можно обойтись без сервера, но тогда сеть будет заспамлена информационными сообщениями (мол, я такой-то сервис, делаю то-то)

2. Всё зависит от программы, библиотеки реализуют лишь упрощение взаимодействия. Насчёт компонентов... предполагалось, что каждый сервис соответствует одному компоненту (группе компонентов), однако, один комп может регистрировать несколько сервисов.

3. Системник 1 лвл без монитора с модемом или другого уровня (для нескольких компонентов), монитор можно использовать для сервиса-авторизации, к примеру. Возможно (но маловероятно) сделаю прогу для микроконтроллера, но они не поддерживают внешние компоненты.

4. Что-то не понял. Все компы подключены в одну сеть с коммутатором, пока что пакеты беспроводных плат не фильтруются.

5. Напишу, когда с компа буду.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот по поводу 1-го вопроса так и не разобрался до конца, возможно разъяснение работы самого сервера поможет :с

Спасибо за столь полноценный ответ)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Подробности:

Сервев имён хранит информацию о сервисах в виде двух таблиц. Первая имеет вид: services[<тип сервиса>][<имя сервиса>]={address=<адрес сетевой платы компа-сервиса>,<поле1>=<значение 1> и т.д.}. Вторая: addresses[<адрес сетевой платы компа-сервиса>]={type=<тип сервиса>,name=<имя сервиса>}

Библиотека для сервисов на самом деле подгружает другую библиотеку для каждого типа сервиса, сама лишь служит для регистрации "слушателя".

Описание, понятно, ужасное, но скоро залью примеры.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Времени мало, поэтому пишу либлу медленно. Скоро допилю. Залил SHCS, SHCS-doors, а также пример.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А можно сервису ипользовать сервис? Можно ли обращаться сразу ко всем сервисам с одной функцией? Например, контроллеры датчиков движения, которые будут отсылать и сваливать в кучу всё, что они видят и где это.

А также, можно ли сделать сеть сервисов низшего уровня?

Изменено пользователем Quant

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А можно сервису ипользовать сервис?

Да, можно. Всё зависит от проги

 

 

Можно ли обращаться сразу ко всем сервисам с одной функцией? Например, контроллеры датчиков движения, которые будут отсылать и сваливать в кучу всё, что они видят и где это.

 

 

В цикле пройтись по каждому сервису, вызвать функцию. А так, есть идея: комп с несколькими датчиками/радарами, который устанавливает абсолютные (ну, то есть относительно какой-то точки :) ) координаты игрока. А потом... план дома с игроками, кто где и проч... Но всё потом.

 

 

А также, можно ли сделать сеть сервисов низшего уровня?

 

Сервис для сервиса? Вполне возможно. (два-три компа с 3-4 сенсорами, один главный.)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...