这是 erlang 中的一个元组。请参阅:http://erlang.org/doc/reference_manual/data_types.html。这是用单独的行上的每个元素组织的元组:
{
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}
}
元组中第一个元素的索引是 1。所以你可以这样做:
8> Data = f:get_data().
{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}}
9> Message = element(12, Data).
<<"sdfjksdf">>
10> Topic = element(5, Data).
<<"home/garden/fountain">>
对评论的回应:
请问上面的>符号是什么意思
元组
如果您搜索了我在上面发布的链接的页面,其中列出了所有 erlang 数据类型,您会发现这样的元素:
<<"sdfjksdf">>
被称为二进制。二进制文件就像字符串,但对于二进制文件,erlang 提供了一种语法,允许您将二进制文件分割成您想要的任何大小的位块。这对于读取通过网络发送的字符串非常有用,因为前 4 位可能代表整个消息的长度,接下来的 12 位代表一些信息,接下来的 3 位代表一些其他信息,等等。
但是由于二进制文件也比字符串更有效,即使您不需要将字符串分割成其组成位,您也可以将字符串转换为二进制文件并传递它们。 erlang 中的所有 I/O 工具都可以比字符串更有效地处理二进制文件。
但是,如果出于某种原因您需要将二进制文件作为字符串,您可以使用函数binary_to_list() 将二进制文件转换为字符串。在 erlang 中,字符串实际上是一个 list,其中包含整数字符代码:
9> [97,98,99].
"abc"
...因此命名为 binary_to_list。
这是一个将二进制转换为字符串的示例:
7> TopicBin = <<"home/garden/fountain">>.
<<"home/garden/fountain">>
8> TopicStr = binary_to_list(TopicBin).
"home/garden/fountain"
9>
对编辑的回应:
我试过++ element(12,Message) ++ 但它不起作用。
我们已经确定element(12, Message) 的返回值是二进制文件,但您应该检查以确保:
X = element(12, Message),
io:format("What is this: ~w~n", [X])
接下来,++ 运算符是 string:concat() 的快捷方式,它需要字符串参数,因此您不能将 ++ 与二进制文件一起使用。
然后我尝试了++ binary_to_list(element(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".
而且,最后一行相当于:
8> "hello " ++ binary_to_list(Bin) ++ " world".
"hello sdfjksdf 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").
在 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>