Перейти к содержимому
  • 0
Flays

Как работать с модемом?

Вопрос

Драсте, решил тут написать две программки. И мне нужно чтоб один пк отправлял другому пк таблицу, но как это сделать я так и не разобрался. Подскажите кто ни будь пожалуйста. Заранее спасибо)

 

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


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

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

32 минуты назад, Flays сказал:

Драсте, решил тут написать две программки. И мне нужно чтоб один пк отправлял другому пк таблицу, но как это сделать я так и не разобрался. Подскажите кто ни будь пожалуйста. Заранее спасибо)

 

Какой мод?

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


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Flays сказал:

Драсте, решил тут написать две программки. И мне нужно чтоб один пк отправлял другому пк таблицу, но как это сделать я так и не разобрался. Подскажите кто ни будь пожалуйста. Заранее спасибо)

 

Все написанное ниже относится к OpenComputers

 

Модемы не умеют передавать таблицы, но для транспортировки таблицы можно сериализовать (таблица => строка), а при получении десериализовать (строка => таблица).

 

Описание функций модема: https://ocdoc.cil.li/component:modem

 

Описание функций сериализации: https://ocdoc.cil.li/api:serialization

 

Пример передающей части

local modem = require("component").modem -- получаем модем
local serialize = require("serialization").serialize -- получаем метод, для сериализации данных (таблица => строка)

local port = 123 -- порт, по которому будет производиться передача данных
local my_table = {} -- какая-то таблица, которую мы будем передавать

-- сералиализуем таблицу (приводим из таблицы в строку)
local ser_table = serialize(my_table)

-- открываем порт
modem.open(port)

-- сералиализуем таблицу (приводим из таблицы в строку)
local message = serialize(my_table)

-- отправляем таблицу (использовать только 1 из этих функций)
modem.send(RECEIVER_ADDR, port, message) -- от 1 устройства к 1 устройству, где RECEIVER_ADDR - это адрес модема получателя
-- или
modem.broadcast(port, message) -- от 1 устройства к множеству устройств

 

Пример принимающей части

local modem = require("component").modem -- получаем модем
local event = require("event")
local unserialize = require("serialization").unserialize -- получаем метод, для десериализации данных (строка => таблица)

local port = 123 -- порт, по которому будет производиться прием данных

-- открываем порт
modem.open(port)

local _, _, _, port, _, message = event.pull("modem_message") -- ожидаем сообщения от другого устройства
local my_table = unserialize(message) -- десериализуем полученные данные (приводим из строки в таблицу)

-- Теперь тут мы можем что-нибудь делать с этой таблицей (my_table)

 

Изменено пользователем Mihis
Опечатка

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


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

@Mihis Спасибо большое, а можно ли будет как-то обойти ожидание запроса сообщение или нет? 

 

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


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

Ну получается пока программа не получит ответ, то дальше ничего не будет работать. Не? 

 

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


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

Ну как бы да. Если надо импульсно работало чтоб

while true do
  mess = {event.pull("modem_message", 1)}
  if mess[1] then
    --серилизация и обработка таблицы
  else
    --делаем другие действия
  end
end

 

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


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

@Asior Хмм, не понял как это работает. Но так же ожидает запрос 

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


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

Запрос теперь будет ожидать 1 сек, потом выполнять действия которые надо, затем опять ожидать запрос. Попробуй отслеживать все через print(). Хотя честно говоря я так и не понял до конца чего ты хочешь ...

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


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

@Asior Пробовал отслеживать через принт, всё равно не хухры. На вики чекнул что там сначала цифра, а потом что нужно. А я хотел изначально чтоб всегда была проверка на есть ли какой-то сигнал, если нету то выводить на экран что его нету и ждать. 

 

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


Ссылка на сообщение
Поделиться на других сайтах
12 часа назад, Flays сказал:

@Asior Пробовал отслеживать через принт, всё равно не хухры. На вики чекнул что там сначала цифра, а потом что нужно. А я хотел изначально чтоб всегда была проверка на есть ли какой-то сигнал, если нету то выводить на экран что его нету и ждать.

 

12 часа назад, Flays сказал:

а можно ли будет как-то обойти ожидание запроса сообщение или нет?

 

Так что именно требуется? Ждать или не ждать?

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


Ссылка на сообщение
Поделиться на других сайтах
14 часа назад, Flays сказал:

@Mihis Спасибо большое, а можно ли будет как-то обойти ожидание запроса сообщение или нет? 

 

 

Можно использовать event.listen, которая регистрирует обработчик события в фоне. Но тогда нужно после завершения программы отменять его (event.cancel), иначе после завершения программы обработчик продолжит свою работу.

 

Описание функций event: https://ocdoc.cil.li/api:event

 

Пример:

local event = require("event")

-- Функция, которая будет выполнена при получении события
local function handleEvent(event_name, _, _, port, _, message)
  if (event_name) then -- иногда event_name может иметь значение nil, если долго не было события
    -- десериализируем табличку (message)
  end
end

local listener_id = event.listen("modem_message", handleEvent)
  
if (listener_id) == false then
  -- выполняется, если неудалось зарегистрировать обработчик
  
  print("failed to register listener")
  return -- завершаем программу
end

-- Что-нибудь делаем
print("Hello! How are you")

-- Завершаем программу: отменяем обработчик
event.cancel(listener_id)

 

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


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

@eu_tomat То и то. Чтоб программа ожидала запрос, но и в этот же момент всё равно работала. А не только ожидала запрос и пока его не будет, сама программа не будет фукционировать. 

 

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


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

@Mihis  А что означают подчёркивание? 

event_name, _, _, port, _, message

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


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, Flays сказал:

@Mihis  А что означают подчёркивание? 

event_name, _, _, port, _, message

эти аргументы будут проигнорированы (чтобы лишние переменные не объявлять)


Если их убрать, то там будут совмем другие данные

 

 

 

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

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


Ссылка на сообщение
Поделиться на других сайтах
42 минуты назад, Flays сказал:

@eu_tomat То и то. Чтоб программа ожидала запрос, но и в этот же момент всё равно работала. А не только ожидала запрос и пока его не будет, сама программа не будет фукционировать. 

Программа не может ждать и не ждать одновременно. Но, например, может пытаться получить очередную запись из очереди событий с некоторой периодичностью, если указать нулевое время ожидания: event.pull("modem_message", 0).

 

Даже если назначить обработчик событий через event.listen(...), для его функционирования потребуется периодически вызывать os.sleep(). То есть, в этом случае ожидание тоже не постоянное, его размер и периодичность также задаётся программистом.

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


Ссылка на сообщение
Поделиться на других сайтах
3 минуты назад, eu_tomat сказал:

Даже если назначить обработчик событий через event.listen(...), для его функционирования потребуется периодически вызывать os.sleep().

Не знал. Я это запомню.

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


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

А кто тут жив? А подскажите как можно передать сообщение через миры?

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


Ссылка на сообщение
Поделиться на других сайтах
45 минут назад, Flays сказал:

как можно передать сообщение через миры?

используй связанную плату

 

@Flays  Если не секрет что за проект делаешь ?

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

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


Ссылка на сообщение
Поделиться на других сайтах
4 часа назад, serafim сказал:

используй связанную плату

 

@Flays  Если не секрет что за проект делаешь ?

Похоже, что этот

 

 

Изменено пользователем Mihis
Помог форуму превратить ссылку в превью

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


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

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

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

Гость
Ответить на вопрос...

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

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

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

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

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


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