首页 > 解决方案 > EMQTT - emq_plugin_template POST to API (SQL) 问题仅适用于网关客户端

问题描述

我已经按照 Ravi Pujar 的教程使用 EMQ 和 api 接口将 MQTT 消息传递给 SQL(他也从这里得到了一些帮助以使相关插件工作)。

我是 Erlang + EMQ 的新手,任何帮助解决为什么只有我的网关消息在从 EMQ 插件发布时没有保存的原因:</p>

SQL 表只有一个允许为空的字符串字段。网关消息示例(如果从邮递员发布到 api 或从 MQTTfx 在主题上发布,则保存良好):$GPRP,745HHBCC5FF,EC16CRH9FFC,-54,0201135644GG46E0082D8A80EFD6EAD1E9A1B132BE1,153656726

我正在使用“emq_plugin_template.erl”和“on_message_publish”来发送我的请求。插件编译无误,EMQ重启,板子启用插件,运行流畅。当然,我也订阅了网关上的正确主题。

on_message_publish(Message, _Env) ->
    io:format("publish ~s~n", [emqttd_message:format(Message)]),

MessageBin = element(12, Message),
MessageStr = binary_to_list(MessageBin),

inets:start(),
Method = post,
URL = "http://127.0.0.1/api/v2/GatewaySQL/1234",
Header = [{"X-DreamFactory-Api-Key", "1234"}],
Type = "application/json",
%%Body = MessageStr, %%just that didn't work with gateway
Body = "{\"resource\":[{\"TagRAW\":\"" ++ MessageStr ++ "\"}]}",
HTTPOptions = [],
Options = [],
R = httpc:request(Method, {URL, Header, Type, Body},HTTPOptions,Options),
    {ok, Message}.

检查 QOS:我已确认 QOS(QOS 0 消息)主题订阅是正确的,我应该在其他地方检查不匹配吗?来自 MQTTfx 的相同 QOS 很好地保存到 SQL 中,并在主题上发布。

在收到的消息中删除逗号:我只是为了以防万一尝试从消息中删除逗号(以及以下尝试之一中的 $ ,进行了更多尝试,但编译得很好,但代理可能会卡住):

%%lists:delete($$,MessageStr),
%%lists:flatten(MessageStr),            %%tried without flattening it as well
%%Segmented = string:tokens(MessageStr, ","),
%%lists:flatten(Segmented),

%%IOMessageStr = io_lib:format("~w",[MessageStr]),
%%Flattened = lists:flatten(IOMessageStr),

感谢您的时间 :)

标签: mysqljsonemq

解决方案


尝试更换

MessageBin = element(12, Message),

MessageBin = element(8, Message),

希望,这对你有用。


推荐阅读