[Приложение] Sound Direct Manager

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: [Приложение] Sound Direct Manager

Сообщение Bagir » Пт май 29, 2020 8:33 am

tarasfrompir писал(а):
Пт май 29, 2020 7:26 am
хотел опробовать - но компонент MCINET.OCX или его зависимости - не зарегестрировані....
Если MSINET, то он есть в первом сообщении. Вообще тема компонентов, это шило при написании программ на VB6. Умирающий язык, что сказать. Если бы VBA не был встроен в Excel, то давно уже ушел в историю.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
tarasfrompir
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 815 раз

Re: [Приложение] Sound Direct Manager

Сообщение tarasfrompir » Пт май 29, 2020 9:33 am

Я понял - спасибо - но нужен простой плеер который может воспроизвести аудио на определенную звуковую карту, и полный контроль над плеером, уровень звука, что проигрывает, выше писал....
Весь контроль этим плеером перейдет под мдм
Спасибо нам ПОМОЖЕТ..!
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: [Приложение] Sound Direct Manager

Сообщение Bagir » Пт май 29, 2020 10:28 am

Да без проблем, начало есть:
-music:play
Скрыть
Сообщает, что переданное имя файла это фоновая музыка, а не звуковое сообщение в очередь.
-music:pause
Скрыть
Поставить на паузу
-music:stop
Скрыть
Остановить воспроизведение трека и исключить его из списка
В данный момент модуль для Алисы подписан на функции say и sayTo. Весь контроль SDM происходит из этого модуля. У тебя свой модуль Терминалы, и уже только он будет управлять SDM. Мой модуль тебе не нужен. Твой модуль знает уровень звука для конкретной комнаты (маршрута, направления), и указывает этот параметр в передаваемой SDM задаче. Отправляя медиа задачу в SDM, модуль сразу получит в ответе хендл этой зачали. С его помощью можно остановить медиа или поставить на паузу. Про уровень звука при уже отправленной задаче пока не скажу, но не думаю, то будут трудности добавить. Когда песня закончится, модуль получит сообщение, что задача и этим хендлом закончена.
Что касается вопроса "что проигрывает", так если не лазать в SDM, а этот не задумывалось, то мы и так знаем, что отправили туда например mp3 трек. И пока не получили от SDM сообщение, что трек закончен, значит он играет. Могу конечно добавить подобный запрос, но вроде как получить сообщение о завершении трека лучше, чем постоянно опрашивать SDM о состоянии. Но если нужно, добавлю. Механизм ответов на подобные запросы вчера допилил.

Появились новые примеры работы с библиотекой bass.dll Сейчас изучаю. Много интересных плюшек. По мере возможности буду добавлять.

Ещё думаю над протоколом UPD. Хочу попробовать. Например, если в сети много SDM копий, то для общих сообщений, возможно, было бы уместно. А на временные терминалы тем более. Вечерком попробую что получится.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: [Приложение] Sound Direct Manager

Сообщение Bagir » Пт май 29, 2020 11:54 am

UDP такси заказывали? нет, а оно приехало :)

Добавил в SDM сервер UDP. Вот такой незамысловатый код просто отправляет сообщение в SDM на адрес 10.10.3.2 и порт 1002. Порт, и возможность включить UDP транспорт вынесу в ini файл.

Код: Выделить всё

    $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
    $msg = "Пинг !";
    $len = strlen($msg);
    socket_sendto($sock, $msg, $len, 0, '10.10.3.2', 1002);
    socket_close($sock);
Из плюсов, моментальная доставка и без каких либо задержек при выполнении php кода.
Минусы - нет уведомления о доставке. Ну это и понятно, протокол такой. Но для временных терминалов может как раз применяться этот способ. Если терминал в сети, то покажет сообщение. Если нет, да и фиг с ним. Пару дней на тест стабильности, и добавлю в код модуля Алисы. Для временных терминалов все сообщения полетят по UDP.
За это сообщение автора Bagir поблагодарили (всего 2):
tarasfrompir (Пт май 29, 2020 12:06 pm) • Chainik (Пт май 29, 2020 12:12 pm)
Рейтинг: 2.33%
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
tarasfrompir
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 815 раз

Re: [Приложение] Sound Direct Manager

Сообщение tarasfrompir » Пт май 29, 2020 12:11 pm

Окей - закажу тебе плеер - какой нужно мне - поставлю ТЗ понемногу напишеш... то что мне нужно
Спасибо нам ПОМОЖЕТ..!
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: [Приложение] Sound Direct Manager

Сообщение Bagir » Пт май 29, 2020 12:20 pm

Ну что, побоардкастим? Этот код прокричит сообщение сразу для всех SDM в сети. И это работает. Вечером выложу поиграться. Пока тестируется у меня. Я в сомнении как быть дальше для общих сообщений. UDP дал свои плюшки. Скорость, простота, возможность отправки сразу всем. Но мы не можем знать, доставлены ли сообщения. От TCP конечно не откажусь, многие задачи требуют получения ответа от SDM.
Пишите мысли по поводу транспорта.

Код: Выделить всё

$ip = "255.255.255.255";
$port = 1002;
$str = "ВСЕМ ВСЕМ ВСЕМ!!!";

$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); 
socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, 1);
socket_sendto($sock, $str, strlen($str), 0, $ip, $port);
socket_close($sock);
Последний раз редактировалось Bagir Пт май 29, 2020 4:32 pm, всего редактировалось 1 раз.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: [Приложение] Sound Direct Manager

Сообщение Bagir » Пт май 29, 2020 12:25 pm

tarasfrompir писал(а):
Пт май 29, 2020 12:11 pm
то что мне нужно
Давай решать задачу по частям. Можно начать с mp3 файлов. Я не углублялся в изучение медиа возможностей библиотеки. Так что будем по шагам идти.
Шаг первый. Нужно отправить задачу плееру, начать проигрывание файла в режиме медиа.
Шаг второй. Нужно получить подтверждение от плеера, что он принял задачу и приступил к ней.

Давай попробуем пока эти шаги, и уже будет видно как быть дальше. Не используй другие возможности SDM. Я покажу как всё отключить в ini файле. В будущем я планировал добавить в SDM потоки, радио и т.п. Просто времени не хватает.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: [Приложение] Sound Direct Manager

Сообщение Bagir » Пт май 29, 2020 1:41 pm

Немного музыки, и о том, как взаимодействовать с SDM. Получение событий.

Давайте для начала напишем простой код, чтобы отправить SDM задачу воспроизвести mp3 файл. У меня всё это уже разложено по классам, но я не хочу вываливать всё добро целиком. Я просто всех запутаю. Так что будем разбираться по шагам. Да и может быть вы придумайте более красивые решения, благо МД это позволяет.

Вот пример, как поставить задачу играть файл в режиме медиа. В этом режиме воспроизведение начнется немедленно, не смотря на наличие очереди. Фишка только в том, что если в очереди коротких сообщений что то появилось, то громкость песни будет немного убавлена на время чтения сообщения. файл song1.mp3 должен быть указан с полным путем, или лежать в папке с SDM для примера

Код: Выделить всё

$url = 'http://10.10.3.115:8090/-music:play song1.mp3';
$ctx = stream_context_create(array('http'=>array('timeout'=>2) ) ); 
$ans = trim( file_get_contents($url, 0, $ctx) );
echo $ans;
В ответ мы получим следующее:

Код: Выделить всё

streamHandle:-2147483618ok
Нам нужно разбить ответ по символу : и если слева streamHandle, то значит справа хендл нашей задачи. Хендл так и будет с минусом. Его нам нужно запомнить. Например можно записать в какое нибудь свойство. Теперь мы знаем, что SDM воспроизводит музыку в данный момент.

Если мы хотим остановить трек, то нужно отправить команду -music:stop указав ещё и хендл задачи
$url = 'http://10.10.3.115:8090/-streamhandle:-9999999999 -music:stop';

Далее нам хотелось бы узнать, когда трек закончится. Идем в sdm.ini файл и находим там строку
reportServer="http://localhost:83/objects/?script=sdmReceiver"
правим на свой адрес сервера, порт (если есть), и указываем имя сценария. в моем случае это sdmReceiver. Сохраняем ini и перезапускаем SDM.
Создадим в МД новый сценарий с таким именем, и напишем в нем код для проверки

Код: Выделить всё

debmes(serialize($_GET) );
Когда SDM закончит играть трек, то вызовет этот сценарий и передаст ему параметры. Мы должны увидеть это:
a:4:{s:6:"script";s:9:"sdmReceiv";s:5:"class";s:5:"music";s:12:"streamhandle";s:11:"-2147483646";s:5:"event";s:12:"song_is_over";}
нам нужно посмотреть, что streamhandle равняется нашему хендлу задачи, а event равен song_is_over. Так мы поймем, что SDM закончил играть трек.
Далее мы можем отправить например другой трек из хранилища вашей медиа библиотеки.

Ещё раз уточню, SDM не навороченный медиа плеер с крутым плей листом. И не логический узел для принятия решений. Это просто инструмент. Всем рулит Алиса. Удачных экспериментов. Далее покажу что можно ещё получить, и как парсить ответы.
За это сообщение автора Bagir поблагодарил:
Chainik (Пт май 29, 2020 2:30 pm)
Рейтинг: 1.16%
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: [Приложение] Sound Direct Manager

Сообщение Bagir » Пт май 29, 2020 4:46 pm

Подвожу промежуточные итоги по тестированию UDP транспорта. Для временных терминалов это самое то. UDP однозначно быть.
Но я не знаю, какой способ выбрать для доставки общих сообщений сразу всем SDM в локальной сети. Если SDM одна, ну или две, то TCP устраивает. При отправке общих сообщений в модуле Алисы просто идет перебор всех уникальных IP адресов в маршрутах. Я пробовал запустить 10 копий SDM. Это количество конечно может охватить целый торговый комплекс, учитывая что у каждой карты по 6 каналов, и нам подобное не актуально, но всё же, притормаживает. А если половина из них не работает, то вообще идет задержка в 5 секунд. Ну это уже из области когда всё плохо. У нас такого никогда не будет.
UDP вообще всё равно, сколько SDM в локальной сети. Для общих сообщений использую BROADCAST. Для сообщений, требующих ответа - TCP. только надо помнить, что при использовании UDP мы не получим подтверждения о доставке, и если SDM на этом маршруте не запущена, то ошибка зарегистрирована не будет.
Напишите, что думайте по этому поводу. Может стоит вообще вывести в настройки модуля Алисы, какой протокол использовать. А уже дальше, каждый выберет для себя.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: [Приложение] Sound Direct Manager

Сообщение Bagir » Пн июн 01, 2020 8:25 pm

Выложил на первой странице обновление. Не забывайте про правила обновлений, они есть в первом посте.
Полная поддержка UDP протокола в SDM и модуле для МД.
В модуле можно выбрать широковещательную рассылку общих сообщений сразу всем версиям SDM без их перебора в цикле. Главное, чтобы в вашей локальной сети ничто не мешало проходить подобным пакетам. Иначе сообщения могут теряться. У меня бывало не добегали UDP сообщения до SDM, которая на несколькими маршрутизаторами и WiFi.
Переход на json ответы. SDM теперь отвечает в формате json. Очень удобно для использования функции json_decode. Модуль и SDM теперь общаются так.
В модуле происходит вызов сценария с именем sdmReceiver. Создайте его обязательно, чтобы не было ошибок. Этот же сценарий вызывает и SDM, для отчетов Алисе. Можно оставить его пустым, или закомментировать строку вызова в модуле. По умолчанию в ini файле вызов тоже запрещен. Но я думаю, что он вам пригодится.

Код: Выделить всё

debmes('sdmReceiver '.json_encode($params) );

/*
  дополнительный $params['marker'] может быть передан в любой класс. Например в классе music можно разделить тревожные треки и музыкальный проигрыватель
  $params['from'] SDM берет из своего ini файла. По нему можно понять от какого именно экземпляра пришло сообщение 
*/

// $params['class'] обязательный. Он определяет дальнейший набор переданных параметров 
if (!array_key_exists('class', $params)) { return 'ERROR'; }

switch ($params['class']) {

 case 'recognize': // получение распознаваемого текста. Есть два варианта. В сценарий или сразу в файл command.php
  break;

 case 'volume': // сообщения громкости
  break;
 
 case 'task': // подтверждения о постановке задач в очередь
  //$params['event']
  break;
 
 case 'music': // событие с музыкой
  switch ($params['event']) {
 	 case 'play_song':
      break;
 	 case 'song_is_stop':
      break;
 	 case 'song_is_terminated':
      break;
 	 case 'song_is_over':
      break;
  }  
  //$params['streamhandle']);
  break;
}


echo 'ok';
return 'ok';
------------------
Модуль 3.1
SDM 2.92
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Ответить