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

Библиотека для работы с мобильным мостом. Клиент OpenComputers

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

https://github.com/1Ridav/Bridge-OpenComputers/blob/master/bridgeLIB.lua
мобильное приложение
 
Система работает по принципу
Мобильное приложение соединяется с мостом и передает ключ
Клиентская часть OC соединяется с мостом и передает ключ
Мост найдя два одинаковых ключа начнет ретранслировать сообщения от мобильного приложения к ОС, так и от ОС к мобильному приложению.
 


b391e31b50.png


 
Подключать приложение и ОС к мосту можно в любом порядке очереди, активность соединения поддерживается самостоятельно. При обрыве соединения OC с мостом, в ОС требуется использовать init(КЛЮЧ)
 
 
Функции

init("стринг ключ", "HOST/IP:PORT"):true/false вводный аргумент ключ соединения, возвращает true/false успешно ли соединение, используется для того, чтобы подключиться к мосту с заданным ключом

send("стринг"):true/false вводный аргумент сообщение для пересылки, возвращает true/false успешности отсылания на мост
receive():string/nil:true/false --НЕ БЛОКИРУЕТ программу
первый аргумент сообщение message, оно может принимать значения:
 "" пустышки при отсутствии сообщений, nil при потере соединения с мостом
Второй аргумент указывает на то, есть ли соединение с мобильным устройством true/false
isBridgeConnected():true/false Проверка соединения с мостом
isPairConnected():true/false Проверка соединения с мобильным устройством
split("стринг", "разделитель"):table -- легкий способ разделить ваши сообщения по разделителям. 
sendToast("стринг", 0/1) --Дает команду андроиду показать тост, второй аргумент указывает продолжительность. 0 короткий 1 длинный


sendNotification(table) -- Дает команду андроиду показать push нотификацию, функция получает таблицу с параметрами
К примеру:
local notif = {} -- Создали таблицу
notif["title"] = "Заголовок" --Обязательный параметр
notif["text"] = "Текст нотификации" --Обязательный параметр
--Далее идут опциональные параметры, которые расширят ваши возможности оповещения пользователя:
notif["blinkTitle"] = "Первичный показывающийся заголовок" -- Показывает этот текст проносящейся строкой
notif["id"] = "2" --Айди нотификации, можно использовать айди от 2, тк 1 зарезервирован приложением для собственных нужд
--Айди позволяет создавать независимые друг от друга нотификации, иначе они будут наслаиваться друг на друга.
--К примеру отослали 3 нотификации с одним айди - они все запишутся поверх, так что пользователь увидит лишь последнюю
--Айди так же позволяют исправлять/обновлять предыдущую нотификацию с этим же айди, если она не была прочтена пользователем
notif["vibrate"] = true  -- Включать ли вибрацию при появлении нотификации. Можно не передавать этот параметр 
notif["sound"] = true -- Включать ли звук при появлении нотификации. Можно не передавать этот параметр
notif["urgent"] = true -- Короткий аналог vibrate&sound, включает звук и вибрацию при появлении нотификации
Пример использования:

local br = dofile("bridge.lua")
local KEY = "q1w2e3r4t5"
local msg, pair
while true do
   --Это главный цикл вашей программы
   msg, pair = br.receive() --НЕ БЛОКИРУЕТ ПРОГРАММУ
   if msg == nil then --соединение с мостом оборвано или отсутствует
      br.init(KEY) -- вернет true/false, но мы не проверяем, а просто пропускаем ход
   elseif msg == "" then --соединение активно, но сообщения для нас нет
      --ничего не делаем
   else
      --сообщение к нам пришло, принтим
      print(msg)
      local msgArray = br.split(msg, " ") --разделили наше сообщение по знакам пробела.
      if(msgArray[1] == "notify") then --если андроид прислал notify строку
         local notif = {}
         notif["blinkTitle"] = "Мигающий заголовок"
         notif["title"] = "Заголовок"
         notif["text"] = "Текст нотификации"
         notif["id"] = 2
         notif["urgent"] = true
         br.sendNotification(notif)
      elseif(msgArray[1] == "toast") --если андроид прислал toast строку
         br.sendToast("текст всплывающего тоста", 1) -- второй аргумент не обязателен, указывает продолжительность 0 или 1
      else
         br.send("Получено: " .. msg)
      end
   end
   os.sleep(0.5)
end

 

Библиотека на своем уровне обрабатывает следующие сервисные коды, они не видны в возвратных данных receive:
00 - PING
01 - PONG
02 - BRIDGE SHUTDOWN

03 - INIT OK
 
10 - FAILED TO TRANSMIT
 
20 - PAIR FOUND
21 - PAIR LOST

 


 
Я переделал буферизированную реализацию сокетов по своему, так что receive() НЕ БЛОКИРУЕТ программу так что можно сказать - она на асинхронных сокетах. Если есть данные - она их считывает, иначе возвращает "" если нет сообщений для юзера, но сообщения для самой библы могут быть, однако они не должны касаться юзера
 
В примере описано все очень просто.
Библиотека основана на проходной логике, то есть необходимо иметь цикл, который постоянно крутится, лучше всего для этого подходит главный цикл.
Где нибудь в конце цикла можно поставить br.receive() который сначала вернет nil - мы не подсоединены к мосту, так что
if msg == nil then
   br.init("КЛЮЧ")
Соединит нас с мостом, этот проход цикла можно считать холостым. На следующем проходе цикла, msg будет иметь скорее всего или "" пустой стринг или какое нибудь сообщение, которое можно обработать в вашей проге. Второй аргумент ретурна - это переменная со значениями true/false - Она показывает подключен ли андроид к ОС через мост. При значении false не советую кидать сообщения через мост, это может спровоцировать невидимый спам
 
 
 
PS:
Если отсылать сообщения при помощи send при том, что receive вернула false вторым аргументом - мост будет отвечать сервисным сообщением 10, которое обрабатывается на уровне библиотеки и невидимо для вас. Таким образом вы нечаянно можете спровоцировать спам сообщениями, которые не дойдут до мобильного приложения, которое фактически не подключено к вам по ключу

 

 

Обновление 1:

Оптимизирована буферизация и обработка команд, уменьшена возможная задержка между обработкой строк пользователя

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


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

Как я понимаю, библиотека стоит на синхронных сокетах, лучше сделай на асинхронных, функция receive все портит своим бесконечным ожиданием.

А если к мосту ты не подключился, а receive уже вызвал, тогда он будет вечно ждать сообщение, от не подключеного сервера.

Можно сделать таймер который будет проверять сокет на сообщение, если там что-то есть он пушит сигнал, который уже может обрабатываться программой.

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

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


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

Работает на ура,даже сделал чат в одну сторону(как у тебя,но покороче)

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


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

Как я понимаю, библиотека стоит на синхронных сокетах, лучше сделай на асинхронных, функция receive все портит своим бесконечным ожиданием.

А если к мосту ты не подключился, а receive уже вызвал, тогда он будет вечно ждать сообщение, от не подключеного сервера.

Можно сделать таймер который будет проверять сокет на сообщение, если там что-то есть он пушит сигнал, который уже может обрабатываться программой.

А ты думаешь, Рид так не пробовал? Он рассказывал на сервере уже, что вызов этой функции блокирует комп. Хоть она в потоке запущена, хоть нет. Тем более, что запустить receive(), если не подключён к мосту, не получится, смотри код внимательнее. Ивенты не присылаются от данных с сокета, а самому повесить пушер не получится, так как чтение, как уже сказал, блокирует напрочь комп.

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


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

Я переделал буферизированную реализацию сокетов по своему, так что receive() НЕ БЛОКИРУЕТ программу так что можно сказать - она на асинхронных сокетах. Если есть данные - она их считывает, иначе возвращает "" если нет сообщений для юзера, но сообщения для самой библы могут быть, однако они не должны касаться юзера

 

В примере описано все очень просто.

Библиотека основана на проходной логике, то есть необходимо иметь цикл, который постоянно крутится, лучше всего для этого подходит главный цикл.

Где нибудь в конце цикла можно поставить br.receive() который сначала вернет nil - мы не подсоединены к мосту, так что

if msg == nil then

   br.init("КЛЮЧ")

Соединит нас с мостом, этот проход цикла можно считать холостым. На следующем проходе цикла, msg будет иметь скорее всего или "" пустой стринг или какое нибудь сообщение, которое можно обработать в вашей проге. Второй аргумент ретурна - это переменная со значениями true/false - Она показывает подключен ли андроид к ОС через мост. При значении false не советую кидать сообщения через мост, это может спровоцировать невидимый спам

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


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

Изменил библиотеку, адаптировал к новым алгоритмам работы моста. Исправил несколько серьезных багов.

Мост работает по адресу bridge.computercraft.ru .Система уже доступна для полноценного использования, допиливаю лишь детали в андроид приложении

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


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

Изменил библиотеку, адаптировал к новым алгоритмам работы моста. Исправил несколько серьезных багов.

Мост работает по адресу bridge.computercraft.ru .Система уже доступна для полноценного использования, допиливаю лишь детали в андроид приложении

Хм, почему то у меня крашится приложение при попытке что-либо отправить (в приложении "rc" произошла ошибка). Android 4.1.1

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


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

Хм, почему то у меня крашится приложение при попытке что-либо отправить (в приложении "rc" произошла ошибка). Android 4.1.1

Приложение больше не соответствует методам работы моста. Допиливаю новое приложение ТЫК

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


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

Приложение больше не соответствует методам работы моста. Допиливаю новое приложение ТЫК

Хм, теперь странно.

Нажимаю на connect -> сообщение "Connecting..." и все ничего не происходит.

Ключи везде одинаковые стоят.

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


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

Хм, теперь странно.

Нажимаю на connect -> сообщение "Connecting..." и все ничего не происходит.

Ключи везде одинаковые стоят.

Я еще не разобрался с тонкостями фрагментных UI и автоматической прокрутки пока нет. После нажатия на connect или done на клавиатуре в поле ввода ключа - пролистай справа налево, увидишь консоль, в которой все пишется

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


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

Я еще не разобрался с тонкостями фрагментных UI и автоматической прокрутки пока нет. После нажатия на connect или done на клавиатуре в поле ввода ключа - пролистай справа налево, увидишь консоль, в которой все пишется

Да спасибо Рид. Теперь понял как работает оно.

Ты кстати писал в чате что тебе нужны тестеры. Тестеры чего?

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


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

Изменен алгоритм обработки сообщений, старая версия больше не актуальна

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


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

А сейчас работает?У меня не коннектится...

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


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

А возможно ли соединить не андроид - игровой компьютер, а игровой компьютер - игровой компьютер? Если да, можете привести пример составления программы.

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


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

А возможно ли соединить не андроид - игровой компьютер, а игровой компьютер - игровой компьютер? Если да, можете привести пример составления программы.

Возможно. Даже андроид - андроид можно соединять

Ничем не отличается.

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

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


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

Добавил возможность следить за работой моста через веб браузер

http://bridge.computercraft.ru:1112

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


Ссылка на сообщение
Поделиться на других сайтах
Добавил возможность следить за работой моста через веб браузер

http://bridge.computercraft.ru:1112

Можно же сделать в два потока.

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


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

Можно же сделать в два потока.

Это общее число потоков, в которых работает мост в целом.

 

Поток serversocket

Поток админки

Поток вебинформации, которая так же работает по serversocket

Потоки соединений

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


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

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

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

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

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

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

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

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

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


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