Samsung Chord SDK для разработки Android сетевых P2P игр

    Доброй пятницы, Хабр!

    Создание игр — трудоемкий процесс, но в нем нет магии и таинственности. Он не отличается от создания любого приложения, состоит из тех же шагов, и его возможно разделить на блоки, модули и этапы. Создание сетевой игры может увеличить время и стоимость разработки в несколько раз. Но сетевое взаимодействие приложений — это независимый модуль, разрабатываемый и тестируемый отдельно от самой игры. Именно о таком модуле мы сегодня поговорим. Представляем вам Samsung Chord SDK — бесплатный инструмент для простого и быстрого создания приложений по обмену файлами и сообщениями в реальном времени между устройствами в одной сети.



    Samsung много сил вкладывает в развитие Android. Посетите ресурс для разработчиков — там вы обнаружите много полезных инструментов, и одним из них является Samsung Mobile SDK, о котором мы уже писали ранее. В следующих публикациях мы подробнее расскажем о каждом из прочих инструментов.



    Samsung Chord SDK (произ. как рус. “коод”, англ. [kɔːd]; перев. связка, хорда, струна, аккорд) позволяет разрабатывать приложения для локального обмена информацией, не используя облако или без знания деталей сети.

    Преимущества Chord:
    ● легкое обнаружение и установка соединения с устройствами рядом;
    ● взаимодействие в реальном времени с множеством устройств;
    ● быстрое peer-to-peer соединение без сервера;
    ● децентрализованная сеть, где участники могут подключать и отключаться в любое время налету.

    Samsung Chord SDK v1.0 был выпущен в 25 апреля 2013, он поддерживает Android 4.0 (>= API level 14) — как arm, так и x86 архитектуры. И уже в сентябре 2013 Chord появился в составе Samsung Mobile SDK: был существенно переработан код (к сожалению, обратная совместимость не сохранена), добавлена поддержка шифрованных каналов. Очень полезно будет ознакомиться с FAQ.

    Давайте в общих чертах рассмотрим как работает Samsung Chord SDK:



    Устройства “device 1-N” подключены к сети одним из способов: Wi-Fi, AndroidAP или Wi-Fi Direct (описание ниже). На устройствах установлено приложение, которое содержит сервис, взаимодействующий с Chord и “activity” приложения. В свою очередь “game” посылает или получает сообщения от “activity”. Каждое из “device” является узлом. Передача сообщений возможна как конкретному узлу, так и каналу. Канал может быть публичным или приватным (более подробно здесь).

    Чтобы продемонстрировать, как легко интегрировать Chord в любое игровое приложение, возьмем уже готовую игру Snake из образцов Android SDK: проект доступен на github.

    Для начала необходимо установить Samsung Mobile SDK через Eclipse update. Создадим проект из примеров Snake. Далее необходимо скопировать файлы из “%android_path%/samsungmobilesdk/Samsung Mobile SDK/1.0.3/Libs/chord” папку libs нашего проекта и подключить их в Build path.

    Далее приведен простой код, не нуждающийся в комментариях:

    ...
    @Override
        public void onCreate(Bundle savedInstanceState) {
    ...
            mChordManager = new SchordManager(getActivity());
    
            List<Integer> infList = mChordManager.getAvailableInterfaceTypes();
            if(infList.isEmpty()){
                return;
            }
       
            int interfaceType = SchordManager.INTERFACE_TYPE_WIFI;
            try {
                mChordManager.start(interfaceType, mManagerListener);
                mSelectedInterface = interfaceType;
                Log.d(TAG, TAGClass +"    start(" + getInterfaceName(interfaceType) + ")");
            } catch (IllegalArgumentException e) {
                Log.d(TAG, TAGClass +"    Fail to start -" + e.getMessage());
            } catch (InvalidInterfaceException e) {
                Log.d(TAG, TAGClass +"    There is no such a connection.");
            } catch (Exception e) {
                Log.d(TAG, TAGClass +"    Fail to start -" + e.getMessage());
            }
    }
    …
    SchordManager.StatusListener mManagerListener = new SchordManager.StatusListener() {
            @Override
            public void onStarted(String nodeName, int reason) {
                if (reason == STARTED_BY_USER) {
                    SchordChannel channel = mChordManager.joinChannel(CHORD_HELLO_TEST_CHANNEL, mChannelListener);
                } else if (reason == STARTED_BY_RECONNECTION) {
                    // Re-start by network re-connection.
                }
            }
            @Override
            public void onStopped(int reason) {
                 if (STOPPED_BY_USER == reason) {
                    // Success to stop by calling stop() method
                 } else if (NETWORK_DISCONNECTED == reason) {
                    // Stopped by network disconnected
                }
            }
        };
    private SchordChannel.StatusListener mChannelListener = new SchordChannel.StatusListener() {
            @Override
            public void onNodeJoined(String fromNode, String fromChannel) {
                //сообщаем другим игрокам о том, что мы готовы
            }
    
            @Override
            public void onDataReceived(String node, String channel, String payloadType,
                    byte[][] payload) {
                String message = new String(payload[0]);
                //здесь управляем змейкой
            }
            …
            //здесь опущены другие доступные методы 
        };
    

    Отправить сообщения от других клиентов можно следующим образом (всем нодам публичного канала):
        byte[][] payload = new byte[1][];
        payload[0] = ”Hello, chord”.getBytes();
        SchordChannel channel = mChordManager.getJoinedChannel(CHORD_HELLO_TEST_CHANNEL);
        channel.sendDataToAll(CHORD_SAMPLE_MESSAGE_TYPE, payload);
    


    Chord позволяет создавать каналы (абстрактные), посредством которых происходит взаимодействие. Каналы могут быть как публичными, так и приватными.

    Связь можно установить по Wi-Fi, используя следующие методы:

    ● INTERFACE_TYPE_WIFI — обычное подключение всех устройств к одной общей точке доступа Wi-Fi;
    ● INTERFACE_TYPE_WIFIAP — AndroidAP, точкой доступа является один из устройств Android;
    ● INTERFACE_TYPE_WIFIP2P — обычное соединение Wi-Fi Direct.

    Можно предложить пользователю выбрать способ соединения или программно выбрать наиболее подходящий, например, так:

            int interfaceType = 0;
            for (int interfaceValue : mChordManager.getAvailableInterfaceTypes()) {
                if (interfaceValue == SchordManager.INTERFACE_TYPE_WIFI) {
                	interfaceType = SchordManager.INTERFACE_TYPE_WIFI;
                	break;
                } else if (interfaceValue == SchordManager.INTERFACE_TYPE_WIFI_AP) {
                	interfaceType = SchordManager.INTERFACE_TYPE_WIFI_AP;
                	break;
                } else if (interfaceValue == SchordManager.INTERFACE_TYPE_WIFI_P2P) {
                	interfaceType = SchordManager.INTERFACE_TYPE_WIFI_P2P;
                	break;
                }
            }
    


    Весь код по подключению и созданию простой игровой механики можно найти в этом коммите, который обеспечивает самую необходимую интеграцию с Chord SDK. Рассмотрим ключевые моменты:

    1. Добавлена страница для статуса игроков;
    2. каждый управляет своей змейкой;
    3. коллизия считается только со своим хвостом, другие игроки игнорируются;
    4. змейка видит и есть только “свои” яблоки;
    5. скорость змейки остается постоянной;
    6. выигрывает тот, у кого змейка длиннее.

    Небольшая демонстрация:



    и скриншоты:



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

    Пиринговые оверлейные сети требуют много ресурсов, и поэтому встает вопрос о производительности. Взгляните на этот демонстрационный ролик:



    Надеюсь, мы уже убедили вас, что Chord — довольно интересный инструмент. Что ещё можно сделать с ним и зачем это Samsung? Все просто: Samsung занимает более 47% Android-рынка (по данным open signal), поэтому кому еще, как не нашей компании, заботиться об экосистеме. Больше хороших приложений — больше довольных пользователей. Вы, как разработчик, можете получить больше новых пользователей и больше игровых сессий, если добавите своё приложение, использующее Samsung Chord SDK, в особый раздел “Play games” в предустановленном приложении “Group Play”, которое можно найти во всех современных телефонах Samsung на Android. Документацию можно найти здесь.

    Если у вас появились вопросы или предложения, смело пишите на e-mail: dev.cis@partner.samsung.com.

    Как мы уже писали, 13-14 декабря пройдет Apps4All Hackathon и, если у вас есть игра собственной разработки, вы можете попробовать сделать её сетевой с помощью Chord SDK и выиграть призы от Samsung.

    Дерзайте и встретимся на хакатоне!
    • +12
    • 7,7k
    • 8
    Samsung 77,02
    Компания
    Поделиться публикацией
    Комментарии 8
    • +3
      Я не очень разбираюсь в вопросе, но скажите, в чём отличие Chord от Google Play Game Services? При помощи чего будет возможно легко и быстро прикрутить мультиплеер в игру?
      • 0
        Мне кажется тут локальная сеть.
      • +1
        Все это круто, но, как я понял, все еще работает только между самсунговскими девайсами? В таком случае, это все совершенно бесполезно.
        • +2
          О чем вы? Судя по FAQ, все даже в эмуляторе работает.
          Другое дело, что в требованиях заявлен Android >=4.0, а девайсов с 2.3, увы, все еще остается весьма много.

          А начиная с Android 4.0 и так поддерживается Wi-Fi P2P (http://developer.android.com/training/connect-devices-wirelessly/wifi-direct.html), так что смысла в этой штуке действительно не особо много.
          • +5
            Я тестировал Chord пару месяцев назад. В эмуляторе действительно работало, на живых не-самсунговских девайсах — увы, нет.
            Глянул в FAQ. Ничего не изменилось:
            [Chord] Do apps developed using Chord only run on Samsung devices?
            The current SDK is designed to only run on Samsung devices.

            И тот факт, что об этом статье даже не упомянуто — полное свинство, ИМХО.

            В общем, это какое-то жутко нишевое решение. Samsung 4.0+ only. Не могу представить, чтобы кто-то на основе Chord сделал игру кроме как для самсунговского же хакатона.
            • +1
              Если так, то прошу прощения.
              В таком случае фраза «Samsung занимает более 47% Android-рынка, поэтому кому еще, как не нашей компании, заботиться об экосистеме.» выглядит вообще как полное издевательство.
        • +1
          Эх… Я помню, как мы толпой в Bomberman играли на Nokia 3230 и N70 по bluetooth. Клавиатуры стирали в дым. И ничего. Не тормозило в большой аудитории. Человек по 5 играли. А сейчас просто нет подобного (
          • 0
            я так понимаю это только для самсунгов?
            Если да, то имхо укрепляется новая монополия (

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

            Самое читаемое