簡體   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