繁体   English   中英

Concat 2字符串erlang并使用http发送

[英]Concat 2 strings erlang and send with http

我正在尝试合并2个变量Address和Payload。 之后,我想使用http将它们发送到服务器,但是有2个问题。 当我尝试用定界符';'连接2个变量时 它不起作用。 也无法发送有效载荷或地址数据。 这是我的代码:

handle_rx(Gateway, #link{devaddr=DevAddr}=Link, #rxdata{port=Port, data= RxData }, RxQ)->
    Data = base64:encode(RxData),
    Devaddr = base64:encode(DevAddr),
    TextAddr="Device address: ",
    TextPayload="Payload: ",
    Address = string:concat(TextAddr, Devaddr),
    Payload = string:concat(TextPayload, Data),
    Json=string:join([Address,Payload], "; "),
    file:write_file("/tmp/foo.txt", io_lib:fwrite("~s.\n", [Json] )),
    inets:start(),
    ssl:start(),
    httpc:request(post, {"http://192.168.0.121/apiv1/lorapacket/rx", [], "application/x-www-form-urlencoded", Address },[],[]),
    ok;
handle_rx(_Gateway, _Link, RxData, _RxQ) ->
    {error, {unexpected_data, RxData}}.

我没有错误可以告诉您。 当我分别将Address或Payload写入文件时,它可以工作,但是发送不起作用...

谢谢您的帮助!

当我尝试用定界符';'连接2个变量时 它不起作用。

5> string:join(["hello", <<"world">>], ";").
[104,101,108,108,111,59|<<"world">>]

6> string:join(["hello", "world"], ";").    
"hello;world"

base64:encode()返回二进制,而string:join()需要字符串参数。 你可以这样做:

7> string:join(["hello", binary_to_list(<<"world">>)], ";").
"hello;world"

对评论的回应

在erlang中,字符串"abc"等同于列表[97,98,99] 但是,二进制语法<<"abc">> 等于<<[97,98,99]>> ,而是二进制语法<<"abc">>是二进制<<97, 98, 99>>特殊缩写形式<<97, 98, 99>>

因此,如果您写:

Address = [97,98,99].

然后是代码:

Bin = <<Address>>.

在变量替换变成:

Bin = <<[97,98,99]>>.

那不是合法的二进制语法。

如果需要将包含在变量中的字符串/列表(例如Address)转换为二进制,请使用list_to_binary(Address) <<Address>>

在您的代码中:

Json = string:join([binary_to_list(<<Address>>),
                    binary_to_list(<<Pa‌​yload>>)], 
                    ";").

先前已为Address和Payload分配了返回值string:concat() ,该返回值返回一个字符串,因此没有理由(尝试)使用<<Address>>将Address转换为二进制,然后立即将二进制转换回一个带有binary_to_list()的字符串。 相反,您只需编写:

Json = string:join(Address, Payload, ";")

原始代码的问题在于,您调用string:concat() ,将字符串作为第一个参数,将二进制文件作为第二个参数,但string:concat()需要两个字符串参数。 您可以使用binary_to_list()将二进制文件转换为第二个参数所需的字符串。

抱歉,我是Erlang的新手

与任何语言一样,您必须先学习基础知识并编写大量玩具示例,然后才能开始编写实际上可以完成某些工作的代码。

您不必连接字符串。 它被称为iolist ,是Erlang中最好的东西之一:

1> RxData = "Hello World!", DevAddr = "Earth",
1> Data = base64:encode(RxData), Devaddr = base64:encode(DevAddr),
1> TextAddr="Device address", TextPayload="Payload",
1> Json=["{'", TextAddr, "': '", Devaddr, "', '", TextPayload, "': '", Data, "'}"].
["{'","Device address","': '",<<"RWFydGg=">>,"', '",
 "Payload","': '",<<"SGVsbG8gV29ybGQh">>,"'}"]
2> file:write_file("/tmp/foo.txt", Json).
ok
3> file:read_file("/tmp/foo.txt").
{ok,<<"{'Device address': 'RWFydGg=', 'Payload': 'SGVsbG8gV29ybGQh'}">>}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM