啥也不說,咱先上張圖,等等。。。還有個抓包截圖;
算了官方最大(卑微稱[qu]贊[fu]),看看我們是怎樣使用CoAP協議來連接EMQX的吧;
一、啓動coap插件並使用代碼測試;
1、 開啓emqx-coap插件;可以直接在dashboard上點擊啓用按鈕 ;(Win環境 推薦)
可以在PowerShell中使用命令開啓 ./emqx_ctl plugins load emqx_coap(Linux環境 推薦)
2、此時emqx就可以接受指定請求格式的CoAP協議數據啦。格式詳細請參考:https://github.com/emqx/emqx-coap
3、java連接emqx-coap,因爲只能使用PUT請求,代碼中註釋的部分,是另外兩種發送CoAP-PUT請求的例子,經測試都是可用的;
package com.daopin.project.CoapClient;
/**
* @Description: TODO(這裏用一句話描述這個類的作用)
* @Author daopinz
* @Date 2020/6/9 14:04
*/
import com.daopin.project.mqtt.PubMsg;
import org.eclipse.californium.core.CoapClient;
import org.eclipse.californium.core.CoapResponse;
import org.eclipse.californium.core.Utils;
import org.eclipse.californium.core.coap.Request;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.URI;
import java.util.Date;
import static org.eclipse.californium.core.coap.MediaTypeRegistry.*;
public class CoAPSender {
private static final Logger logger = LoggerFactory.getLogger(CoAPSender.class);
public static void main(String[] args) throws Exception {
//創建一個資源請求資源,注意默認端口爲5683
URI uri = new URI("coap://127.0.0.1:5683/mqtt/qdq02mzl6kvs/coap-server/uplinkMsg?c=coaps1&u=COAP&p=coap");
CoapClient client = new CoapClient(uri);
while (true) {
String payload = "hello, " + new Date().toString();
//設置PUT的內容和內容的類型TEXT_PLAIN
//CoapResponse response = client.put(payload, TEXT_PLAIN);
//client.useCONs();
//設置PUT的內容和內容的類型APPLICATION_OCTET_STREAM
//CoapResponse response = client.put(payload, APPLICATION_OCTET_STREAM);
Request request = Request.newPut();
request.setPayload("AAAA0000 "+new Date().toString());
CoapResponse response = client.advanced(request);
System.out.println(Utils.prettyPrint(response));
Thread.sleep(5000);
}
}
}
4、運行代碼,結果;
我們的sub端也收到了訂閱的數據;
抓包在前面已經貼出來了,可以參考看看。
二、總結:
1、正常CoAP協議請求數據應該是POST請求來註冊,後面還有一系列GET請求等等。。。這樣不知道是要修改emqx插件,還是怎樣,暫無頭緒
2、正常CoAP協議請求數據應該是payload在GET訂閱設備資源後,設備主動上報的NON/CON消息中攜帶,但emqx-coap插件需要在PUT請求中攜帶payload,訂閱端就能拿到這部分數據,這樣其實是跟目前國內的物聯網市場使用的華爲海思芯片是不兼容的,這樣理解不知是否正確,還請有這方面經驗的大佬,不吝賜教!