物联网协议Coap之Core和NetWork简介

这篇具有很好参考价值的文章主要介绍了物联网协议Coap之Core和NetWork简介。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

一、Coap的Core包

1、Coap对象

2、Message对象

3、Request对象

4、Response对象

二、Coap的NetWork调试

1、UDP运行模式

 2、Network消息接收

3、Sender线程发送数据 

三、总结


前言

        在之前的博文中,对Californium中Coap的实现进行了简要的介绍,分别从Server和Client两端进行了基础介绍。对于面向连接的连接协议,一定是离不开网络层。本次将重点介绍Coap的Core核心实现以及网络层定义,虽然在Californium协议中,已经全面的实现了Coap协议。

        本文将以Core包和NetWork包为主线,对Coap协议中,关于Californium框架的具体实现方式和代码编写进行讲解,希望对想了解Coap的实现朋友对其有更深入的了解。

一、Coap的Core包

        Coap的核心包定义了Coap适配的协议,请求协议头、响应对象等。主要包含Coap、Message、Option、Request、Response等几个对象。

1、Coap对象

        首先来看一下Coap对象的类图,如下图所示:

物联网协议Coap之Core和NetWork简介,工作拾遗,Californium,物联网CoAP

         从上图可以看出,Coap类主要是一个常量类,其中包含了消息类型、请求类型编码、响应码、消息格式类型等。请注意这里是采用枚举属性的方式进行定义。比如消息类型的定义,部分代码已精简:

/**
	 * CoAP defines four types of messages:
	 * Confirmable, Non-confirmable, Acknowledgment, Reset.
	 */
	public enum Type {

		/** The Confirmable. */
		CON(0),

		/** The Non-confirmable. */
		NON(1),

		/** The Acknowledgment. */
		ACK(2),

		/** The Reject. */
		RST(3);

		/** The integer value of a message type. */
		public final int value;
	}

以上四种消息类型表示如下:

序号 类型 说明
1 CON 需要被确认的请求,如果CON请求被发送,那么对方必须做出响应。这有点像TCP,对方必须给确认收到消息,用以可靠消息传输。
2 NON 不需要被确认的请求,如果NON请求被发送,那么对方不必做出回应。这适用于消息会重复频繁的发送,丢包不影响正常操作。这个和UDP很像。用以不可靠消息传输。
3 ACK  应答消息,对应的是CON消息的应答。
4 RST 复位消息,可靠传输时候接收的消息不认识或错误时,不能回ACK消息,必须回RST消息。

        请求方法枚举,这里主要定义了Coap请求方法编码,比如GET、POST、PUT等。关键代码如下:

/**
	 * The enumeration of request codes: GET, POST, PUT and DELETE.
	 */
	public enum Code {

		/** The GET code. */
		GET(1),

		/** The POST code. */
		POST(2),

		/** The PUT code. */
		PUT(3),

		/** The DELETE code. */
		DELETE(4);

		/** The code value. */
		public final int value;
	}

2、Message对象

        在通讯建立后,依赖于网络传输对象,Server端和Client端都会进行消息的传递。这是实际数据传递时所依赖的对象。这里重点介绍Message对象,大家可以重点查看Californium的源码来着重了解。首先来看一下Message对象的类图。

物联网协议Coap之Core和NetWork简介,工作拾遗,Californium,物联网CoAP

         在message对象中,定义了消息类型、mid、token、payload等信息。

消息头(HEAD)

第一行是消息头,必须有,固定4个byte。Ver : 2bit, 版本信息,当前是必须写0x01。T: 2bit, 消息类型,包括 CON, NON. ACK, RST这4种。TKL: 4bit,token长度, 当前支持0~8B长度,其他长度保留将来扩展用。

Code:8bit,分成前3bit(0~7)和后5bit(0~31),前3bit代表类型。 0代表空消息或者请求码, 2开头代表响应码,取值如下:

1 0.00 Indicates an Empty message

2 0.01-0.31 Indicates a request.

3 1.00-1.31 Reserved

4 2.00-5.31 Indicates a response.

5 6.00-7.31 Reserved

Message ID:16bit, 代表消息MID,每个消息都有一个ID ,重发的消息MID不变。token(可选)用于将响应与请求匹配。 token值为0到8字节的序列。 ( 每条消息必须带有一个标记, 即使它的长度为零)。 每个请求都带有一个客户端生成的token, 服务器在任何结果响应中都必须对其进行回应。token类似消息ID,用以标记消息的唯一性。token还是消息安全性的一个设置,使用全8字节的随机数,使伪造的报文无法获得验证通过。

option

请求消息与回应消息都可以0~多个options。 主要用于描述请求或者响应对应的各个属性,类似参数或者特征描述,比如是否用到代理服务器,目的主机的端口等。

payload

实际携带数据内容,若有,前面加payload标识符“0xFF”,如果没有payload标识符,那么就代表这是一个0长度的payload。如果存在payload标识符但其后跟随的是0长度的payload,那么必须当作消息格式错误处理。

物联网协议Coap之Core和NetWork简介,工作拾遗,Californium,物联网CoAP

/** The Constant NONE in case no MID has been set. */
	public static final int NONE = -1;
	/**
	 * The largest message ID allowed by CoAP.
	 * <p>
	 * The value of this constant is 2^16 - 1.
	 */
	public static final int MAX_MID = (1 << 16) - 1;

	/** The type. One of {CON, NON, ACK or RST}. */
	private CoAP.Type type;

	/** The 16-bit Message Identification. */
	private volatile int mid = NONE; // Message ID

	/**
	 * The token, a 0-8 byte array.
	 * <p>
	 * This field is initialized to {@code null} so that client code can
	 * determine whether the message already has a token assigned or not. An
	 * empty array would not work here because it is already a valid token
	 * according to the CoAP spec.
	 */
	private volatile Token token = null;

	/** The set of options of this message. */
	private OptionSet options;

	/** The payload of this message. */
	private byte[] payload;

	/**
	 * Destination endpoint context. Used for outgoing messages.
	 */
	private volatile EndpointContext destinationContext;

	/**
	 * Source endpoint context. Used for incoming messages.
	 */
	private volatile EndpointContext sourceContext;

	/** Indicates if the message has sent. */
	private volatile boolean sent;

	/** Indicates if the message has been acknowledged. */
	private volatile boolean acknowledged;

	/** Indicates if the message has been rejected. */
	private volatile boolean rejected;

	/** Indicates if the message has been canceled. */
	private volatile boolean canceled;

	/** Indicates if the message has timed out */
	private volatile boolean timedOut; // Important for CONs

	/** Indicates if the message is a duplicate. */
	private volatile boolean duplicate;

	/** Indicates if sending the message caused an error. */
	private volatile Throwable sendError;

	/** The serialized message as byte array. */
	private volatile byte[] bytes;

3、Request对象

        与Http协议类似,Coap中,伴随着每一次的请求发送,势必也会有一个request对象。在request中进行信息的传递。因此,Requet也是继承自Message,其类图如下:

物联网协议Coap之Core和NetWork简介,工作拾遗,Californium,物联网CoAP

        可以看到,在Reques对象中,针对Get、Put、Post、Delete等不同的方法也进行了定义。

/**
	 * Convenience factory method to construct a POST request and equivalent to
	 * <code>new Request(Code.POST);</code>
	 * 
	 * @return a new POST request
	 */
	public static Request newPost() {
		return new Request(Code.POST);
	}

	/**
	 * Convenience factory method to construct a PUT request and equivalent to
	 * <code>new Request(Code.PUT);</code>
	 * 
	 * @return a new PUT request
	 */
	public static Request newPut() {
		return new Request(Code.PUT);
	}

	/**
	 * Convenience factory method to construct a DELETE request and equivalent
	 * to <code>new Request(Code.DELETE);</code>
	 * 
	 * @return a new DELETE request
	 */
	public static Request newDelete() {
		return new Request(Code.DELETE);
	}

4、Response对象

        response对象与http也是类似的,跟B/S模式是一样的。有Client的请求对象,一定会对应有Server的Response对象。与Request一样,Response也是Message类的子类。

物联网协议Coap之Core和NetWork简介,工作拾遗,Californium,物联网CoAP

         Reponse的方法相对比较简单,主要是将相应的信息放置到响应对象中,然后返回给前端。其主要的方法如下:

/**
	 * Creates a response to the provided received request with the specified
	 * response code. The destination endpoint context of the response will be
	 * the source endpoint context of the request. Type and MID are usually set
	 * automatically by the {@link ReliabilityLayer}. The token is set
	 * automatically by the {@link Matcher}.
	 *
	 * @param receivedRequest the request
	 * @param code the code
	 * @return the response
	 * @throws IllegalArgumentException if request has no source endpoint
	 *             context.
	 */
	public static Response createResponse(Request receivedRequest, ResponseCode code) {
		if (receivedRequest.getSourceContext() == null) {
			throw new IllegalArgumentException("received request must contain a source context.");
		}
		Response response = new Response(code);
		response.setDestinationContext(receivedRequest.getSourceContext());
		return response;
	}

        由于篇幅有限,关于Core包的相关类介绍先到此,感兴趣的朋友可以下载源码后自己研究,以上将core包中比较重要的四个类进行讲解。下一步在讲解消息构造和方法运行时会更一步的涉及到这些类。因此着重介绍一下,以免不了解的读者不清楚具体的定义。

二、Coap的NetWork调试

        关于Coap的NetWork中的使用,准备结合动态运行过程进行讲解,主要结合Debug的方式,以类图这种分析方法不能完全的展示其调用过程和初始化步骤。比如,为什么说Coap默认是运行在UDP协议之下的,在系统运行时,其协议转换又是怎么工作的。下面将揭开这个面纱。

1、UDP运行模式

        众所周知,Coap默认试运行在UCP协议下的,我们来看一下其具体的定义。在CoapServer中创建CoapEndpoint时,可以看到以下的设置过程。

物联网协议Coap之Core和NetWork简介,工作拾遗,Californium,物联网CoAP

 在CoapEndpoint.java 中1285行,很清楚的看到这创建了UDPConnector连接器。

物联网协议Coap之Core和NetWork简介,工作拾遗,Californium,物联网CoAP

物联网协议Coap之Core和NetWork简介,工作拾遗,Californium,物联网CoAP

物联网协议Coap之Core和NetWork简介,工作拾遗,Californium,物联网CoAP

 2、Network消息接收

        在进行以上的对象定义之后,Coap基本就可以依赖于网络进行请求的运行了。启动方法

物联网协议Coap之Core和NetWork简介,工作拾遗,Californium,物联网CoAP

         在这里,分别定义了发送线程集合和接收线程集合,用来保存接收和发送对象。receiverCount默认是16.

物联网协议Coap之Core和NetWork简介,工作拾遗,Californium,物联网CoAP

3、Sender线程发送数据 

物联网协议Coap之Core和NetWork简介,工作拾遗,Californium,物联网CoAP

 在这里可以看到要发送的数据包信息,

物联网协议Coap之Core和NetWork简介,工作拾遗,Californium,物联网CoAP

4、Receiver接收响应

物联网协议Coap之Core和NetWork简介,工作拾遗,Californium,物联网CoAP

protected void work() throws IOException {
			datagram.setLength(size);
			socket.receive(datagram);
			LOGGER.debug("UDPConnector ({}) received {} bytes from {}:{}",
					new Object[]{socket.getLocalSocketAddress(), datagram.getLength(),
						datagram.getAddress(), datagram.getPort()});
			byte[] bytes = Arrays.copyOfRange(datagram.getData(), datagram.getOffset(), datagram.getLength());
			RawData msg = RawData.inbound(bytes, new AddressEndpointContext(datagram.getAddress(), datagram.getPort()), false);

			receiver.receiveData(msg);
		}

在work方法中进行信息的转换,获取响应报文。通过转换后就可以获取以下报文体:

2.05
{"Content-Format":"text/plain"}
Hello CoAP!This is from Java coap server

Advanced

==[ CoAP Response ]============================================
MID    : 26037
Token  : [6243fee1521b9e40]
Type   : ACK
Status : 2.05
Options: {"Content-Format":"text/plain"}
RTT    : 43333 ms
Payload: 40 Bytes
---------------------------------------------------------------
Hello CoAP!This is from Java coap server
===============================================================

三、总结

        以上就是本文的主要内容,本文将以Core包和NetWork包为主线,对Coap协议中,关于Californium框架的具体实现方式和代码编写进行讲解,希望对想了解Coap的实现朋友对其有更深入的了解。行文仓促,如有不当之处,请留言批评指正。文章来源地址https://www.toymoban.com/news/detail-811103.html

到了这里,关于物联网协议Coap之Core和NetWork简介的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 物联网协议NB-IoT,LORA,wifi,蓝牙,zigbee,MQTT,COAP之间的关系

    NB-IoT,LORA,WIFI,蓝牙,zigbee,4G都是物理层的,这几个都需要芯片模组支持(硬件支持) 而MQTT,COAP,HTTP都是应用层协议,这些需要开发服务器,或者对接云平台厂商(软件支持) 所以(MQTT,COAP,HTTP)是居于(NB-IoT,LORA,WIFI,蓝牙,zigbee,4G)的上层协议 不需要网关:

    2024年02月15日
    浏览(57)
  • Mainflux IoT:Go语言轻量级开源物联网平台,支持HTTP、MQTT、WebSocket、CoAP协议

    Mainflux是一个由法国的创业公司开发并维护的 安全、可扩展 的开源物联网平台,使用 Go语言开发、采用微服务的框架。Mainflux支持多种接入设备,包括设备、用户、APP;支持多种协议,包括HTTP、MQTT、WebSocket、CoAP,并支持他们之间的协议互转。 Mainflux的南向接口连接设备,北

    2024年02月01日
    浏览(115)
  • 【001_IoT/物联网通信协议基础: HTTP、Websocket、MQTT、AMQP、COAP、LWM2M一文搞懂】

    学历代表过去、能力代表现在、学习力代表将来。 一个良好的学习方法是通过输出来倒逼自己输入。写博客既是对过去零散知识点的总结和复盘,也是参加了 零声教育 写博客活动。 零声教育体验课:https://xxetb.xetslk.com/s/3fbO81 本文是开发过程中的知识点总结,供大家学习交

    2024年04月22日
    浏览(39)
  • 了解CoAP协议

    物联网产品开发中,我们常常听到各种协议名称,如CoAP,MQTT等,但这些协议究竟如何去传输数据,如何下发指令呢? 物联网的初衷之一就是通过大数据的采集分析去颠覆交通、运输、物流、能源等生产生活的每个方面。一般而言,物联网遇到的最大问题就是环境的不稳定性

    2023年04月08日
    浏览(27)
  • 【Hello Network】协议

    作者:@小萌新 专栏:@网络 作者简介:大二学生 希望能和大家一起进步 本篇博客简介:简单介绍下协议并且设计一个简单的网络服务器 协议 网络协议的简称 网络协议是通信计算机双方必须共同遵从的一组约定 比如怎么建立连接、怎么互相识别等 就像我们在之前的博客 网

    2023年04月27日
    浏览(46)
  • 【网络协议】NTP(Network Time Protocol)协议详解

    NTP(Network Time Protocol)是一种用于在分布式网络中的不同设备之间保持精确时间同步的互联网协议。 它允许一台机器与其他机器或权威的时间源建立联系,并根据这些联系来调整自己的时间,以确保整个网络中的所有设备共享一致的时间基准。 NTP通过精确测量时间偏差、补

    2024年02月04日
    浏览(41)
  • 【Hello Network】TCP协议

    作者:@小萌新 专栏:@网络 作者简介:大二学生 希望能和大家一起进步 本篇博客简介:较为详细的介绍TCP协议 TCP全称为“传输控制协议(Transmission Control Protocol)” TCP协议是当今互联网当中使用最为广泛的传输层协议 TCP协议被广泛应用 其根本原因就是提供了详尽的可靠性

    2024年02月03日
    浏览(44)
  • 【Hello Network】UDP协议

    作者:@小萌新 专栏:@网络 作者简介:大二学生 希望能和大家一起进步 本篇博客简介:简单介绍传输层和UDP协议 我们使用的TCP/IP协议中可以简单的把网络划分为四个部分 自顶向下分别是应用层 传输层 网络层和数据链路层 其中我们的HTTP协议就是应用层的协议 它是基于传输

    2024年02月02日
    浏览(35)
  • 【Hello Network】HTTP协议

    作者:@小萌新 专栏:@网络 作者简介:大二学生 希望能和大家一起进步 本篇博客简介:较为详细的介绍HTTP协议 HTTP(Hyper Text Transfer Protocol)协议又叫做超文本传输协议 是一个简单的请求-响应协议 HTTP通常运行在TCP之上 在编写网络通信代码时 我们可以自己进行协议的定制

    2024年02月03日
    浏览(39)
  • VQGAN(Vector Quantized Generative Adversarial Network)模型简介

    论文:Taming Transformers for High-Resolution Image Synthesis VQGAN (Vector Quantized Generative Adversarial Network) 是一种基于 GAN 的生成模型,可以将图像或文本转换为高质量的图像。该模型是由 OpenAI 研究团队在 2021 年发布的。 VQGAN 模型使用了两个核心部分:Vector Quantization (VQ) 和 GAN。其中 VQ 是

    2024年02月08日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包