[英]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(<<Payload>>)],
";").
先前已為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.