Как реализованы запросы к BlynkServer?

Уважаемые разработчики Blynk, расскажите пожалуйста, как у вас реализованы запросы к BlynkServer из приложения под iOS?

Пробовал в Swift написать по аналогии с вашими примерами из Blynk.API. Все работает, но …

Сделал периодическое обновление данных через NSTimer с интервалом в 1 секунду, но мне нужно обновлять данные значительно чаще, 10 раз в секунду и более. При этом получается слишком много почти одновременных HTTP запросов, большая нагрузка на канал связи.

Расскажите, если это не секрет, как у вас реализовано обновление состояний в приложении под iOS
Если возможно с примером кода)
Спасибо!

Добрый день. Мы не используем Http, просто открываем сокет и шлем сообщения через наш протокол, который очень похож на mqtt.

Спасибо за ответ. Теперь в принципе логика понятна, я практически был уверен что у вас это сделано не через HTTP, просто смутили примеры в Blynk.API

Прошу прощения за наглость, но могли бы вы дать кусок кода под Swift с примером обмена по вашему протоколу? Или это секретная информация? )

Нет, мы не предоставляем такой реализации.

Посмотрел описание вашего протокола, сам протокол более-менее понятен.
Не смог разобраться как происходит аутентификация при подключении к сокету с использованием токена.
Где можно про это почитать?

@SmartModules к сожалению документации по этому вопросу нету. И ее некогда сейчас создавать. Но есть джава клиент. По его коду вполне можно разобратся как все работает - https://github.com/blynkkk/blynk-server/tree/master/client

Dmitriy, спасибо за ссылку на клиент, смотрю исходники, пробую использовать под свою задачу

Появилось еще несколько вопросов, если я правильно все понял, подтвердите

  1. удаленно приложение общается с сервером через 443 порт, верно?

  2. обмен данными идет в binary, верно? (хотя еще вчера где-то прочитал, что в plain text, но не могу найти где я это видел, может я ошибся)

Заголовок пакета сделал по аналогии с этим
struct BlynkHeader
{
uint8_t type;
uint16_t msg_id;
uint16_t length;
}

Согласно вашему описанию я формирую заголовок на аутентификацию по токену:

первый байт - команда (2 - login)
два байта - message_id (не знаю, что это?, ставлю 1)
четыре байта - размер пакета (32)
отправляемый пакет данных (в данном случае токен)

Отправляю в сокет: 2 1 32 token
соединение не происходит

Каким образом формируется msg_id и что означает?

Напишите пожалуйста хоть на java хоть на чем угодно пример для соединения и отправки команды, допустим vw 1 1

Да. Для локальных серверов 9443.

Да. Первые 5 байт (для железа 1 + 2 + 2) и первые 7 байт (для приложения 1 + 2 + 4) - бинари. Остальное - текст.

Да, для железа. Для приложения это uint32_t length;.

У вас в структуре 16, откуда 32?

У железа и апки немного различаются протоколы. У приложения длина это 4 байта, а не 2 как ужелеза. Так же, если вы логинитесь как железо по токену, то Вы должны конектистя на порт 80 (или 8080 для локального сервера).

Что означает msg_id? Что туда писать?

Я логинюсь, как приложение, удаленно на 443

Теперь стало понятнее, значит если я приложение, отправляю первые 7 байт в бинари, потом как текст.

Размер токена 32 байта

А приложение логинится не по токену? Что тогда использовать email/password?

Все, я вроде понял в чем мои ошибки, железо и приложение общаются с сервером по разному. Сейчас попробую еще поэкспериментировать с запросами.

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

Любое последовательное число. Просто айди сообщения.

Логин как приложение подразумевает имейл и хеш пароля.

Нет. Тут есть приципиальное отличие. У железа своя цепочка обработчиков, у приложения - другая. Если вы железо, вы логинитесь через токен и на порт 80. Если вы приложение через пароль и имейл и на порт 443.

Тогда опишу свою задачу. Мне необходимо из приложения на Swift (под iOS) постоянно отслеживать состояние одного пина (лучше виртуального) с периодичностью 10-20 запросов в секунду.

Т.е. в принципе я так понял мне не требуется логиниться как приложение.
Достаточно залогиниться как железо по 80 порту используя только токен.

Т.е. я открываю сокет по 80 порту, отправляю в бинари:
первый байт - 29 (HARDWARE_LOGIN)
затем два байта - любое целое число (msg_id)
затем два байта размер строки - 32 (размер body)

потом в body виде обычного текста отправляю токен

После этого могу начинать обмен следующими пакетами?
Так получится?

Требуется. Все сообщения из железа пересылаются на сокеты приложений, не железа.