Можно ли использовать MS Band с автономной сборкой Unity для Windows?

Я пытаюсь найти самый быстрый способ получить данные из MS Band 2 в автономную сборку Unity для Windows с поддержкой VR. Я могу создавать и запускать примеры приложений SDK на моем ноутбуке с Win10, и они работают.

Я пробовал разные вещи, начиная от импорта Microsoft.Band.DLL в Unity в качестве управляемого плагина и заканчивая попыткой обернуть Band DLL в собственный плагин. Тем не менее, я не нашел способ сделать эту работу. Я начинаю подозревать, что мне просто не удастся заставить Band DLL работать с отдельной сборкой Windows по ряду причин.

Когда я пытаюсь использовать Band DLL в качестве управляемого плагина, Unity не поддерживает C# 4, который требуется для Band DLL. Когда я пытаюсь создать собственную DLL, я не могу понять, как создать проект в VS2015, который будет работать с Band SDK, и я не могу изменить примеры проектов, чтобы выводить DLL вместо приложения. Когда я пробую новый проект, который может выводить DLL, и пытаюсь установить пакет Microsoft.Band NuGet, он сообщает мне, что мой проект нацелен на «native,Version=v0.0», хотя версия SDK — 10.*.

В идеале должен быть способ включить необходимые библиотеки DLL вместе с Band DLL в Unity, и я мог бы получить к нему доступ как к управляемому плагину. Но я был бы даже рад обернуть файл C++ в extern "C" и сделать отдельную функцию для возврата каждого фрагмента данных из Band.

Я просто недостаточно знаком с концепцией универсальной Windows, чтобы знать, есть ли способ заставить ее работать с автономной сборкой Unity для Windows, или она намеренно не работает таким образом. Поскольку они оба работают на одной машине, кажется, что это должно быть возможно.

Мой запасной план состоит в том, чтобы написать универсальное приложение для Windows, которое считывает данные устройства и подключается к автономному приложению Unity для Windows, чтобы предоставить к нему доступ. Будь то через локальный файл, сетевое соединение или удаленный сервер, это совсем другая проблема.


person David Merrill    schedule 09.03.2016    source источник


Ответы (1)


Лучший способ сделать это — использовать C++ для создания оболочки вокруг MS Band, но это не вариант. strong> в данном случае, потому что Microsoft не имеет C++ API для MS Band, а их веб-сайт полон запросов от программистов, запрашивающих >C++ поддерживается с конца 2015 года, но они игнорировали. У вас все еще есть 4 других варианта, которые могут работать, а могут и не работать.

  1. Попробуйте интеграцию Unity C# 5.0 и 6.0 https://bitbucket.org/alexzzzz/unity-c-5.0-and-6.0-integration/src Это позволит вам использовать C# > 4 с Unity. Как настроить — на странице.

  2. Используйте локальное межпроцессное взаимодействие. Создайте подключаемый модуль консоли на C# и создайте проект на C# с помощью Visual Studio вместо Unity. Скомпилируйте его в exe вместо DLL и назовите MSBandLIC.exe. Напишите весь код, взаимодействующий с MS Band, в этой программе.

    Запустите программу MSBandLIC.exe из вашей программы Unity.

    Затем вы можете использовать Anonymous Pipes для связи с MSBandLIC.exe из Unity. Код длинный, но его легко написать. Вот ссылка от Microsoft о том, как это сделать. https://msdn.microsoft.com/en-us/library/bb546102.aspx

  3. Подключаемый модуль TCP-консоли

    Создайте подключаемый модуль консоли на C# и создайте проект на C# с помощью Visual Studio вместо Unity. Скомпилируйте его в exe вместо DLL и назовите MSBandTCP.exe.

    Запустите программу MSBandTCP.exe из вашей программы Unity. Запишите весь код, взаимодействующий с MS Band, в этом затем создайте сервер TCP, прослушивающий порт 5550.

    На стороне Unity используйте TCP для подключения к вашему локальному компьютеру через порт 5550, и там вы сможете общаться и < strong>получать информацию от MS Band.

  4. Проведите обратный инжиниринг API и создайте свой простой API с функциями, которые вам нужны для доступа из MS Band. Похоже, что MS Band взаимодействует с компьютером/мобильным телефоном через Bluetooth. Bluefruit LE Sniffer и Wireshark должны помочь вам достичь этого.

    Как это сделать:

    Выберите нужные функции из API MS Band. Напишите приложение C# без Unity, которое отправляет сообщение в MS Band в цикле while всего 2 секунды. Используйте Bluefruit LE Sniffer и Wireshark, чтобы узнать, какое сообщение отправляется из Windows в MS Band. MS Band должен ответить, если это так, но то, что он отправил, зашифровано, используйте JustDecompile для декомпиляции части DLL API и рис. узнать, как API декомпилирует байты, полученные от MS Band. Затем вы можете восстановить свой собственный API на основе собранной информации.

person Programmer    schedule 09.03.2016
comment
сложный ответ :О - person Fattie; 09.03.2016
comment
Lol .. Существует проблема совместимости с DLL, поэтому решение кажется сложным, но только # 4 кажется сложным. С №1 по №3 на самом деле легко, если он погуглит TCP или локальную межпроцессную связь, он сможет это сделать. Написание того, как сделать каждый из них, займет вечность, но делать это самостоятельно не получится. - person Programmer; 09.03.2016
comment
Быстрое обновление: я попробовал № 1 и получил пример кода, работающего с пакетом CSharp60Support. Однако, когда я попытался добавить Band SDK в проект, у меня отсутствовали ссылки на ошибки для System.Runtime и System.Threading.Tasks в самом SDK, которые я не знаю, как исправить. Затем я попробовал № 2, который привел меня к исключению UnauthorizedAccessException в клиенте. Читая об этом, я обнаружил, что анонимные каналы — это один путь от сервера к клиенту, так что это не сработает для доступа к Band. Я на № 3, и сообщу о своих результатах. - person David Merrill; 10.03.2016
comment
Я думал, ты сдался, потому что не ответил. Рад, что ты этого не сделал. Вы можете использовать несколько анонимных каналов для двусторонней связи, но я предлагаю вместо этого использовать именованный канал. Замените его на № 2. stackoverflow.com/questions/13806153/example-of-named-pipes< /а>. Каналы имен выглядят намного проще, чем TCP. - person Programmer; 10.03.2016
comment
Я видел ссылку на странице анонимных каналов, в которой упоминались именные каналы, поэтому я пробую это сейчас. Я просто использовал образец кода и создал клиентское приложение, а код сервера поместил в класс Unity. К сожалению, Unity дает сбой, когда я его запускаю, поэтому сейчас я собираюсь создать отдельное серверное приложение и просто убедиться, что я могу запустить образец. Как только я это проверю, я верну его в Unity и выясню, почему он падает. По крайней мере, я узнаю что-то новое. Ух! - person David Merrill; 10.03.2016
comment
Повезло тебе. Если вы прочитаете мой ответ, вы поймете, что я сказал, что сервер должен быть консольным приложением, а клиент должен быть единым. Это правильный способ сделать это. Так что, когда вы открываете эту консоль из единства, вы можете подключиться к ней, отключиться от нее, подключиться к ней позже снова и снова отключиться от нее. Unity, вероятно, дает сбой, потому что ему нужна многопоточность. Для этого следует использовать многопоточность. Этот ответ уже большой, просто погуглите многопоточность С# и как вызвать функцию в другом потоке с помощью С# - person Programmer; 10.03.2016
comment
Хорошо, я пробовал два отдельных примера для именованных каналов. Один порождает 4 потока на сервере и подключается к 4 отдельным экземплярам клиента. Другой — простое одиночное соединение в основном потоке с передачей предустановленной строки. Они прекрасно работают как отдельные приложения. Когда я пытаюсь реализовать их в Unity в качестве сервера или клиента, я получаю ошибку Win32Exception: операция успешно завершена. Я видел другие потоки в Интернете, которые указывают на то, что люди получили трубы для работы в Unity, поэтому я все еще надеюсь. Я должен буду продолжить завтра, так как мой мозг сейчас в каше. - person David Merrill; 10.03.2016
comment
О! Я написал свой комментарий без обновления, поэтому я пропустил ваш предыдущий комментарий. Я сделаю чистую попытку завтра утром и дам вам знать, как это идет. Спасибо за вашу помощь. - person David Merrill; 10.03.2016
comment
Сегодня утром я начал с новых проектов и до сих пор не могу заставить работать именованные каналы. В основном я использую пример кода со страниц документации MSDN NamedPipeServerStream/NamedPipeClientStream. Он работает с автономными приложениями, но когда я помещаю клиент в Unity, он терпит неудачу. Иногда подключается, но не всегда. Я не получаю никаких ошибок или необработанных исключений, поэтому я не знаю, что с этим происходит. - person David Merrill; 10.03.2016
comment
Раньше я использовал его вне Unity, и он работал очень хорошо. Вероятно, не работает, потому что Unity использует моно во время выполнения. Ваш ЕДИНСТВЕННЫЙ оставшийся простой вариант - TCP. TCP работает с Unity на 100%, и я использовал его много раз без проблем. c# tcpclient и tcplistener(server) сделаны проще. Используйте их вместо необработанного сокета. Используйте их также с ниткой. Их поиск в Google должен предоставить достаточно примеров для начала. - person Programmer; 10.03.2016
comment
Еще раз спасибо за вашу помощь. Я только что получил сообщение, переданное с анонимного сервера клиенту в Unity. Я собираюсь продвигаться вперед с анонимным каналом и посмотреть, смогу ли я заставить его работать на меня. Если я столкнусь с другим препятствием, я попробую подход TCP. Быть в курсе. - person David Merrill; 10.03.2016
comment
Если это работает иногда и не работает иногда, то забудьте об этом. Если это работает все время, то вперед. Ваше приложение не должно работать сегодня утром и перестать работать вечером. Я буду следить за тем, какое решение вы выбрали. - person Programmer; 11.03.2016
comment
Что ж, решение с анонимным каналом выглядело многообещающе, пока я не попытался подключиться к Band из кода сервера. Я думаю, что мне нужно настроить таргетинг на универсальное приложение или приложение 8.1, чтобы получить доступ к BandClientManager, и это, похоже, использует другой код канала, поэтому я даже не знаю на данный момент, могу ли я соединить два типа процессов вместе. Похоже, я перехожу на решение TCP. - person David Merrill; 11.03.2016
comment
Меня смущает ваш последний пост. Серверное приложение — это место, где вы пишете функции, которые подключают MS Band с помощью API MS Band. Здесь вы можете использовать библиотеку MS Band. Например, функция getHeartRate, которая использует API-интерфейс MS Band для получения частоты сердечных сокращений. Затем вы можете написать простое реле, которое выбирает, какую функцию вызывать, когда сервер получает сообщение от клиента. Например, если вы получаете gHR от клиента (Unity), вы можете вызвать функцию getHeartRate, которая использует API MS Band для связи с MS Band, а затем отправить результат обратно клиенту (Unity). - person Programmer; 11.03.2016
comment
Вы не используете канал для прямого общения с Band. Вы используете канал для связи между клиентом (Unity) и сервером (консольное приложение). Внутри этой консоли вы используете официальный API MS Band для связи с MS Band, а не с каналом. - person Programmer; 11.03.2016
comment
Я создал серверный проект как консольное приложение .NET Framework 4.5.1 в VS. Я добавил ссылку на пакет Microsoft.Band NuGet и подумал, что это даст мне доступ к Band SDK. После того, как я заработал анонимный канал между сервером и Unity, я попытался добавить код для доступа к Band. Тогда я понял, что в проекте нет BandClientManager и других интерфейсов. Когда я создал пустое приложение (универсальное приложение Windows), чтобы получить доступ к Band, я потерял доступ к System.IO.Pipes. - person David Merrill; 11.03.2016
comment
Когда я искал использование каналов в универсальных приложениях для Windows, я обнаружил совершенно новый набор кода каналов. Меня действительно смущает разница между универсальными приложениями для Windows и обычными автономными исполняемыми файлами Windows. На данный момент кажется, что TCP будет самым простым и надежным решением. - person David Merrill; 11.03.2016
comment
Я понимаю. Microsoft изменила свой API для универсальной Windows. С# tcpclient и tcplistener(server) - единственный оставшийся разумный вариант. Я предлагаю вам проверить, доступны ли С# tcpclient и tcplistener (сервер) в Windows Universal Windows, прежде чем идти дальше. Если это не так, то должен быть доступен Socket, который вы также можете использовать для создания TCP-соединений. - person Programmer; 11.03.2016
comment
Быстрое обновление: я могу установить TCP-соединение из приложения UWP с обычным исполняемым файлом Windows. Однако только в том случае, если приложение UWP работает в эмуляторе. Я пытался подключиться через локальный хост на 8.1 и 10, и соединение не удалось. Теперь я думаю, что Microsoft блокирует локальные соединения между приложениями UWP и Windows на одном компьютере. Моя следующая попытка будет состоять в том, чтобы запустить приложение UWP Band на моем ноутбуке и Unity на моем рабочем столе и посмотреть, работает ли это. Microsoft не перестает меня удивлять. - person David Merrill; 11.03.2016
comment
Нет никаких причин, почему это не должно работать. Вы можете создать сервер и подключиться к нему на той же машине. Unity делает это, когда вы создаете WebGL. Autodesk Maya использует это для связи между другим программным обеспечением. Я сделал это раньше. Так что вы можете. Microsoft не блокирует вас. Убедитесь, что фейерверк не блокирует ваше приложение. Напишите простую функцию, которая получает IP-адрес вашего компьютера. Подключитесь к этому IP-адресу с клиента. Если это не сработает, попробуйте подключиться к петлевому адресу 127.0.0.1. - person Programmer; 11.03.2016
comment
Я могу подключиться между моим ноутбуком и моим рабочим столом, используя один и тот же код, поэтому я собираюсь попробовать этот подход сейчас. Поскольку мой проект все еще находится в стадии подготовки и распространяется внутри компании, я могу даже попытаться передать данные локального файла, если у меня возникнут проблемы с маршрутизацией и брандмауэрами. Я действительно ожидал, что это сработает на прошлой неделе, поэтому я немного раздражен на данный момент. Еще раз спасибо за вашу помощь. Это был весьма полезный опыт. - person David Merrill; 11.03.2016
comment
Lol Microsoft действительно делает это. Это безумие, но я не думаю, что это относится к автономной сборке. Это относится только к сборкам приложений для магазина Windows. Создайте свое приложение для автономного использования. - person Programmer; 11.03.2016
comment
В этом суть моей проблемы. Мне нужно использовать UWP для доступа к Band, и мне нужно использовать автономный режим для доступа к Oculus Rift. Положительным моментом является то, что я могу установить TCP-соединение от Unity на моем рабочем столе с Win 8.1 до примера приложения Band на моем ноутбуке с Win 10. Конечно, передача данных пока не работает, но подключаются. Так что, думаю, я вижу небольшой свет в конце этого туннеля. - person David Merrill; 11.03.2016
comment
В порядке. Вы знаете, что делаете - person Programmer; 11.03.2016
comment
Успех! Мне просто нужно было добавить '\n' в конец моих тестовых данных. Теперь нужно упаковать данные Band и отправить их по TCP-соединению. В последний раз большое спасибо за вашу помощь, и я отмечу ответ на этот вопрос сейчас. - person David Merrill; 12.03.2016