8.5 プッシュプラットフォーム

IoTBoXはクラウドプラットフォームへのカスタムプッシュプロトコルをサポートします

8.5.1 組み込み変数

  • g: グローバルテーブル、任意の関数内で呼び出しと変更が可能
  • publisher: 現在のプッシュプラットフォーム、タイプはPublisher

8.5.2 基本アーキテクチャ

最小コードは以下の通り

--@return number 初始化返回 固定为0
---@description プログラムが初めて起動するときに呼び出されます
---@usage プッシュに必要な内容を初期化するために使用されます。プッシュプロトコル、プロトコル設定などが含まれます
function Init()
    return 0
end

---@return number 推送状态 0为OK,非零为推送失败
---@description 内部でループ呼び出しされ、データをプッシュするために使用されます
---@usage Format後のデータをプッシュします
function Push()
    return 0
end

---@return number 格式化返回 固定返回0
---@description 内部でループ呼び出しされ、データフォーマットに使用されます
---@usage システムはデータをプッシュする前にこの関数を呼び出してデータをフォーマットします
function Format()
    return 0
end

---@return number 连接状态 0表示连接成功,其他值表示未连接
---@description システムは接続に失敗したときに接続関数を呼び出します
---@usage この関数は自動的に呼び出されます
function Connect()
    return 0
end

---@return number 连接状态 0表示连接成功,其他值表示未连接
---@description 内部でループ呼び出しされ、MQTT接続状態をチェックします
---@usage MQTT接続を確保する必要があるシナリオで、この関数を繰り返し呼び出して接続状態を監視します
function CheckConnect()
    return 0
end
  1. IoTBoXは初期化時にInit関数を呼び出し、プッシュプラットフォームの初期化を完了します
  2. 初期化後、Connect関数が呼び出され、クラウドプラットフォームに接続します。接続が成功した場合は0を返し、失敗した場合は0以外を返します
  3. IoTBoXは内部でCheckConnect関数をループで呼び出します。0以外を返す場合、Connect関数を呼び出して再接続します
  4. IoTBoXは各プッシュサイクルでFormat関数を実行し、収集されたデータをフォーマットし、0を返します
  5. フォーマット後、Push関数が呼び出され、データがクラウドプラットフォームにプッシュされます。プッシュが成功した場合は0を返し、失敗した場合は0以外を返します

8.5.3 MQTTプラットフォーム接続の例

function on_connect()
    -- 接続後の処理
    box.log("info","mqtt服务器已连接")
    g.mqtt:Subscribe(g.control_topic,0)
    init={};
    init["device_id"] = publisher.gateway_id;
    init["device_type"] = "gateway";
    init["online"] = true;
    g.mqtt:PushMessage(cjson.encode(init), g.data_topic,0,0);
end

function on_disconnect()
    -- 切断後の処理
    box.log("warn","mqtt服务器离线")
end

function on_message(topic,message)
    -- 受信後のデータ処理
    box.log("debug",topic,message)
end

function Init()
    -- プッシュの初期化
    g.control_topic="control_topic"
    g.data_topic="data_topic"
    g.mqtt=MqttClient()
    g.mqtt.address=config.address;
    if config.username ~=nil and #config.username~=0 then
        g.mqtt.username=config.username
    end
    if config.password ~=nil and #config.password~=0 then
        g.mqtt.password=config.password
    end
    g.mqtt.client_id=box.fingerprint;
    g.mqtt.on_connect=on_connect
    g.mqtt.on_disconnect=on_disconnect
    g.mqtt.on_message=on_message
    will={}
    will["device_id"] = publisher.gateway_id
    will["device_type"] = "gateway";
    will["online"] = false;
    g.mqtt.will_msg=cjson.encode(will)
    g.mqtt.will_topic=g.data_topic
    return 0
end

function Push()
    box.log("debug","aaaaa  push")
    return g.mqtt:PushMessage(cjson.encode(publisher:GetMessage()),g.data_topic,0,0)
end


function Format()
    box.log("debug","aaaaa  format")
    local origin_messages=publisher:GetOriginMessage()
    local result_messages={}
    for i, origin_message in ipairs(origin_messages) do
        local one_message={}
        one_message.device_id=origin_message.device_id
        one_message.device_name=origin_message.device_name
        one_message.device_state=origin_message.device_state
        one_message.device_type=origin_message.device_type
        one_message.ts=origin_message.ts
        one_message.values={}
        local index=1
        for name, value in pairs(origin_message.values) do
            value.name = name;
            value.id = nil;
            one_message.values[index]=value
            index=index+1
        end
        result_messages[i]=one_message
    end
    publisher:SetMessage(result_messages)
    return 0
end
--- 2
function Connect()
    return g.mqtt:Connect()
end
function CheckConnect()
    local r= g.mqtt:CheckConnect()
    return r
end