这在ERLANG中是什么类型的格式。看起来不像JSON吗?

这在ERLANG中是什么类型的格式。看起来不像JSON吗?,erlang,mqtt,erlang-shell,Erlang,Mqtt,Erlang Shell,我刚刚使用file:write转储了这个变量: file:write_file("/tmp/foo.txt", io_lib:fwrite("~p.\n", [Message])), 这是emqtt中插件代码的一部分。 我想解析这些内容,并在消息变量中获取部分sdfjksdf,在名为topic的变量中获取home/garden/fountain。如何做到这一点。我不认识二郎 {mqtt_message,<<0,5,101,163,106,150,123,212,110,126,0,

我刚刚使用
file:write
转储了这个变量:

file:write_file("/tmp/foo.txt", io_lib:fwrite("~p.\n", [Message])),
这是emqtt中插件代码的一部分。 我想解析这些内容,并在消息变量中获取部分sdfjksdf,在名为topic的变量中获取home/garden/fountain。如何做到这一点。我不认识二郎

{mqtt_message,<<0,5,101,163,106,150,123,212,110,126,0,0,76,244,0,3>>,
              undefined,
              {<<"1852fadb884d46c7a349f6a974846ce1">>,undefined},
              <<"home/garden/fountain">>,0,[],false,false,false,[],
              <<"sdfjksdf">>,
              {1519,127425,874902}}
在上面的代码中,我必须从Message对象中传递字符串“sdfjksdf”,并用send代替“msg”字符串。 我尝试了++元素(12,Message)++,但它不起作用

然后我尝试了++二进制列表(元素(12,消息))++这也不起作用


如何通过连接将消息对象中的字符串“sdfjksdf”作为JSON字符串中的参数传递到函数中

这是erlang中的一个元组。请参阅:。下面是一个元组,每个元素在单独的一行上:

{
    mqtt_message,
    <<0,5,101,163,106,150,123,212,110,126,0,0,76,244,0,3>>,
    undefined,
    {<<"1852fadb884d46c7a349f6a974846ce1">>,undefined},
    <<"home/garden/fountain">>,
    0,
    [],
    false,
    false,
    false,
    [],
    <<"sdfjksdf">>,
    {1519,127425,874902}
}
…因此命名为二进制列表

下面是一个将二进制文件转换为字符串的示例:

7> TopicBin = <<"home/garden/fountain">>.
<<"home/garden/fountain">>

8> TopicStr = binary_to_list(TopicBin).
"home/garden/fountain"
9> 
接下来,
++
操作符是一种快捷方式,它需要字符串参数,因此不能将
++
用于二进制文件

然后我尝试了
++binary-to-list(元素(12,Message))++
这也不起作用

这项工作:

2> Msg = "sdfjksdf".
"sdfjksdf"

3> Result = "hello " ++ Msg ++ " world".
"hello sdfjksdf world"
在前面,我们讨论了如何将二进制文件转换为字符串(列表)。因此,您可以这样做:

5> Bin = <<"sdfjksdf">>.
<<"sdfjksdf">>

6> Msg = binary_to_list(Bin).   
"sdfjksdf"

7> "hello " ++ Msg ++ " world".
在您的函数中:

-module(f).
-compile(export_all).

get_message() ->
{
    mqtt_message,
    <<0,5,101,163,106,150,123,212,110,126,0,0,76,244,0,3>>,
    undefined,
    {<<"1852fadb884d46c7a349f6a974846ce1">>,undefined},
    <<"home/garden/fountain">>,
    0,
    [],
    false,
    false,
    false,
    [],
    <<"sdfjksdf">>,
    {1519,127425,874902}
}.


on_message_publish(Message, _Env) ->
    %io:format("publish ~s~n", [emqttd_message:format(Message)]),
    %file:write_file("/tmp/foo.txt", io_lib:fwrite("~p.\n", [Message])),
    %inets:start(),
    DeviceIdBin = element(12, Message),
    DeviceIdStr = binary_to_list(DeviceIdBin),

    Method = post,
    URL = "http://xyz.in/api/v2/mysql/_table/device",
    Header = [{"Api-Key", "1234"}],
    Type = "application/json",
    Body = "{\"resource\":[{\"deviceid\":\"" ++ DeviceIdStr ++ "\"}]}",
    io:format("Body=~s~n", [Body]),
    %HTTPOptions = [],
    %Options = [],
    %R = httpc:request(Method, {URL, Header, Type, Body}, HTTPOptions, Options),
    {ok, Message}.


go() ->
    Message = get_message(),
    on_message_publish(Message, "hello").
-模块(f)。
-编译(全部导出)。
获取消息()->
{
mqtt_消息,
,
未定义,
{,未定义},
,
0,
[],
假,,
假,,
假,,
[],
,
{1519,127425,874902}
}.
关于消息发布(消息,环境)->
%io:format(“publish~s~n”,[emqttd_message:format(message)],
%文件:write_文件(“/tmp/foo.txt”,io_lib:fwrite(“~p.\n”,[Message]),
%inets:start(),
DeviceIdBin=元素(12,消息),
DeviceIdStr=二进制到二进制列表(DeviceIdBin),
方法=员额,
URL=”http://xyz.in/api/v2/mysql/_table/device",
Header=[{“Api密钥”,“1234”}],
Type=“application/json”,
Body=“{\'resource\”:[{\'deviceid\”:\”“++DeviceIdStr++“\”}],
io:format(“Body=~s~n”,[Body]),
%HTTPOptions=[],
%选项=[],
%R=httpc:request(方法,{URL,Header,Type,Body},HTTPOptions,Options),
{好的,留言}。
go()->
Message=获取消息(),
发布消息(消息“你好”)。
在erlang shell中:

5> c(f).  
f.erl:29: Warning: variable 'Method' is unused
f.erl:30: Warning: variable 'URL' is unused
f.erl:31: Warning: variable 'Header' is unused
f.erl:32: Warning: variable 'Type' is unused
{ok,f}

6> f:go().
Body={"resource":[{"deviceid":"sdfjksdf"}]}
{ok,{mqtt_message,<<0,5,101,163,106,150,123,212,110,126,0,
                    0,76,244,0,3>>,
                  undefined,
                  {<<"1852fadb884d46c7a349f6a974846ce1">>,undefined},
                  <<"home/garden/fountain">>,0,[],false,false,false,[],
                  <<"sdfjksdf">>,
                  {1519,127425,874902}}}
7> 
5>c(f)。
f、 erl:29:警告:未使用变量“Method”
f、 erl:30:警告:未使用变量“URL”
f、 erl:31:警告:未使用变量“Header”
f、 erl:32:警告:未使用变量“Type”
{好的,f}
6> f:go()。
正文={“资源”:[{“设备ID”:“sdfjksdf”}]}
{好,{mqtt_消息,,
未定义,
{,未定义},
,0,[],假,假,假,[],
,
{1519,127425,874902}}}
7> 

这是erlang中的元组。请参阅:。下面是一个元组,每个元素在单独的一行上:

{
    mqtt_message,
    <<0,5,101,163,106,150,123,212,110,126,0,0,76,244,0,3>>,
    undefined,
    {<<"1852fadb884d46c7a349f6a974846ce1">>,undefined},
    <<"home/garden/fountain">>,
    0,
    [],
    false,
    false,
    false,
    [],
    <<"sdfjksdf">>,
    {1519,127425,874902}
}
…因此命名为二进制列表

下面是一个将二进制文件转换为字符串的示例:

7> TopicBin = <<"home/garden/fountain">>.
<<"home/garden/fountain">>

8> TopicStr = binary_to_list(TopicBin).
"home/garden/fountain"
9> 
接下来,
++
操作符是一种快捷方式,它需要字符串参数,因此不能将
++
用于二进制文件

然后我尝试了
++binary-to-list(元素(12,Message))++
这也不起作用

这项工作:

2> Msg = "sdfjksdf".
"sdfjksdf"

3> Result = "hello " ++ Msg ++ " world".
"hello sdfjksdf world"
在前面,我们讨论了如何将二进制文件转换为字符串(列表)。因此,您可以这样做:

5> Bin = <<"sdfjksdf">>.
<<"sdfjksdf">>

6> Msg = binary_to_list(Bin).   
"sdfjksdf"

7> "hello " ++ Msg ++ " world".
在您的函数中:

-module(f).
-compile(export_all).

get_message() ->
{
    mqtt_message,
    <<0,5,101,163,106,150,123,212,110,126,0,0,76,244,0,3>>,
    undefined,
    {<<"1852fadb884d46c7a349f6a974846ce1">>,undefined},
    <<"home/garden/fountain">>,
    0,
    [],
    false,
    false,
    false,
    [],
    <<"sdfjksdf">>,
    {1519,127425,874902}
}.


on_message_publish(Message, _Env) ->
    %io:format("publish ~s~n", [emqttd_message:format(Message)]),
    %file:write_file("/tmp/foo.txt", io_lib:fwrite("~p.\n", [Message])),
    %inets:start(),
    DeviceIdBin = element(12, Message),
    DeviceIdStr = binary_to_list(DeviceIdBin),

    Method = post,
    URL = "http://xyz.in/api/v2/mysql/_table/device",
    Header = [{"Api-Key", "1234"}],
    Type = "application/json",
    Body = "{\"resource\":[{\"deviceid\":\"" ++ DeviceIdStr ++ "\"}]}",
    io:format("Body=~s~n", [Body]),
    %HTTPOptions = [],
    %Options = [],
    %R = httpc:request(Method, {URL, Header, Type, Body}, HTTPOptions, Options),
    {ok, Message}.


go() ->
    Message = get_message(),
    on_message_publish(Message, "hello").
-模块(f)。
-编译(全部导出)。
获取消息()->
{
mqtt_消息,
,
未定义,
{,未定义},
,
0,
[],
假,,
假,,
假,,
[],
,
{1519,127425,874902}
}.
关于消息发布(消息,环境)->
%io:format(“publish~s~n”,[emqttd_message:format(message)],
%文件:write_文件(“/tmp/foo.txt”,io_lib:fwrite(“~p.\n”,[Message]),
%inets:start(),
DeviceIdBin=元素(12,消息),
DeviceIdStr=二进制到二进制列表(DeviceIdBin),
方法=员额,
URL=”http://xyz.in/api/v2/mysql/_table/device",
Header=[{“Api密钥”,“1234”}],
Type=“application/json”,
Body=“{\'resource\”:[{\'deviceid\”:\”“++DeviceIdStr++“\”}],
io:format(“Body=~s~n”,[Body]),
%HTTPOptions=[],
%选项=[],
%R=httpc:request(方法,{URL,Header,Type,Body},HTTPOptions,Options),
{好的,留言}。
go()->
Message=获取消息(),
发布消息(消息“你好”)。
在erlang shell中:

5> c(f).  
f.erl:29: Warning: variable 'Method' is unused
f.erl:30: Warning: variable 'URL' is unused
f.erl:31: Warning: variable 'Header' is unused
f.erl:32: Warning: variable 'Type' is unused
{ok,f}

6> f:go().
Body={"resource":[{"deviceid":"sdfjksdf"}]}
{ok,{mqtt_message,<<0,5,101,163,106,150,123,212,110,126,0,
                    0,76,244,0,3>>,
                  undefined,
                  {<<"1852fadb884d46c7a349f6a974846ce1">>,undefined},
                  <<"home/garden/fountain">>,0,[],false,false,false,[],
                  <<"sdfjksdf">>,
                  {1519,127425,874902}}}
7> 
5>c(f)。
f、 erl:29:警告:未使用变量“Method”
f、 erl:30:警告:未使用变量“URL”
f、 erl:31:警告:未使用变量“Header”
f、 erl:32:警告:未使用变量“Type”
{好的,f}
6> f:go()。
正文={“资源”:[{“设备ID”:“sdfjksdf”}]}
{好,{mqtt_消息,,
未定义,
{,未定义},
,0,[],假,假,假,[],
,
{1519,127425,874902}}}
7> 

该类型称为
元组
,是一种Erlang数据类型。通常可以将其视为固定长度数组。Erlang元组是1索引的。有几种方法可以从元组中提取数据。如果您知道元组的大小,例如:

{_,_,_,_,Message,_,_,_,_,_,_,Topic,_} = {mqtt_message,<<0,5,101,163,106,150,123,212,110,126,0,0,76,244,0,3>>,
              undefined,
              {<<"1852fadb884d46c7a349f6a974846ce1">>,undefined},
              <<"home/garden/fountain">>,0,[],false,false,false,[],
              <<"sdfjksdf">>,
              {1519,127425,874902}}.
或:


您需要找到使用该语法将其附加到JSON正文中的正确方法。请记住,
++
操作对于大型列表无效。

该类型称为
元组,是Erlang数据类型。通常可以将其视为固定长度数组。Erlang元组是1索引的。有几种方法可以从元组中提取数据。如果您知道元组的大小,例如:

{_,_,_,_,Message,_,_,_,_,_,_,Topic,_} = {mqtt_message,<<0,5,101,163,106,150,123,212,110,126,0,0,76,244,0,3>>,
              undefined,
              {<<"1852fadb884d46c7a349f6a974846ce1">>,undefined},
              <<"home/garden/fountain">>,0,[],false,false,false,[],
              <<"sdfjksdf">>,
              {1519,127425,874902}}.
或:


您需要找到使用该语法将其附加到JSON正文中的正确方法。请记住,
++
操作对于大型列表无效。

非常感谢您的回答。我现在明白了。你能告诉我上面元组中的符号是什么意思吗。是空的Erlang二进制数据类型这可以有一些整数或上面的字符。谢谢,我
element(12, {mqtt_message,<<0,5,101,163,106,150,123,212,110,126,0,0,76,244,0,3>>,
              undefined,
              {<<"1852fadb884d46c7a349f6a974846ce1">>,undefined},
              <<"home/garden/fountain">>,0,[],false,false,false,[],
              <<"sdfjksdf">>,
              {1519,127425,874902}})
42> Msg = binary:bin_to_list(element(12,Message)).
"sdfjksdf"
43> "test: " ++ Msg.
"test: sdfjksdf"