ESP-8266: отправка многих данных на брокер MQTT.

Решение простое, почему раньше не додумался — ума не приложу.

Исходная обстановка — делаем таблицу для отправки на брокер. Вариантов два:

data = {
    t = 25.0,
    hume = 45
}

Второй

data = {
    {"t", 25.0},
    {"hume", 45}
}

В чем смысл? Пишем обычную функцию отправки данных на брокер и вызываем в callback(е) рекурсивно саму себя. Данные из таблицы извлекаем путем удаления элементов:

tp = table.remove(topub) - Возвращает удаленный элемент.

Как это выглядит?

data = {
    {"t", 25.0},
    {"hume", 45}
}

-- Если доступен брокер
if mod.broker == true then
    -- Функция публикации
    local function punow()
        -- Если есть данные
        if #data ~= 0 then
            -- Забираем
            local tp = table.remove(data)
            -- Топик
            local top = tp[1].."/state"
            -- Содержание
            local dat = tp[2]
            -- Публикуем
            m:publish(top, dat, 0,0, function(cl) 
                -- В callback - новый вызов 
                punow()
            end)
        end
    end
    punow()
end

-- Или совсем коротко:
if mod.broker == true then
    local function punow()
        if #data ~= 0 then
            local tp = table.remove(data)
            m:publish(tp[1].."/state", tp[2], 0,0, function(cl) 
                punow()
            end)
        end
    end
    punow()
end

И еще вариант:

data = {
    t = 25.0,
    hume = 45
}

if mod.broker == true then
    local topub = {}
    for k,v in pairs(data) do
        table.insert(topub, {k,v})
    end

    local function punow()
        if #topub ~= 0 then
            local tp = table.remove(topub)
            m:publish(tp[1].."/state", tp[2], 0,0, function(cl) 
                punow()
            end)
        end
    end
    punow()
end
Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s