EMQ X - EmqxBroker CoAP协议数据接入测试及疑问
啥也不说,咱先上张图,等等。。。还有个抓包截图;
算了官方最大(卑微称[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,订阅端就能拿到这部分数据,这样其实是跟目前国内的物联网市场使用的华为海思芯片是不兼容的,这样理解不知是否正确,还请有这方面经验的大佬,不吝赐教!