物联网协议之COAP简介及Java实践

目录

前言

一、COAP简介

1、关于COAP

 2、COAP特点

3、基于COAP的NB-IoT接入流程

二、CoAP协议JAVA实践

1、californium介绍

2、Java集成 

3、Maven 资源引入

4、定义Server端

5、Client调用

6、运行测试

总结


前言

        今天平安夜,祝大家圣诞快乐,平平安安。最近几年,随着物联网的兴起,很多设备都已经可以实现互联互通。相信很多从事安防、智慧城市、智能家居、智慧农业、应急消防、自然资源行业的朋友们,物联网已经是很成熟的技术了。很多的摄像头、传感器、计量水表、电表、燃气表、湿度传感器等等设备不仅可以支持实时的上传数据,还可以跟物联网平台进行互联互通,接收服务端的指令并进行执行相应操作。

        在实现物联网设备和互联网连接的过程中,除了基础的网络通信保障,还有一个重要的基础设施,就是物联网协议。相信大家对协议都不陌生,从TCP/IP、UDP,从HTTP、MQTT、COAP,很多的协议在我们日常的工作当中,当然更多使用的是HTTP协议。关于协议,很多书籍都已经讲解得非常详细。

        本文将围绕物联网的COAP协议,首先对其进行简单介绍,然后基于JAVA语言来进行COAP协议通讯编程实战,帮助大家对COAP有一个简单的认知,经过编程实践掌握协议的通信机制。

一、COAP简介

        为了让不熟悉COAP协议的读者在读这篇博文时,不至于不知道COAP是什么?因为还是在此对COAP进行一个简单的介绍,让每个读者都有一个直观的认识。如果对COAP非常熟悉的朋友,可以略过,直接进入后面的编程实战环节。

1、关于COAP

        CoAP(Constrained Application Protocol,受限应用协议)是一种专为物联网(IoT)设备和资源受限网络设计的应用层协议。它的诞生也是由于物联网设备大多都是资源限制型的,比如 CPU、RAM、Flash、网络宽带等;对于这类设备来说,想要直接使用现有网络的TCP和HTTP来实现设备信息交换是不现实的,为了让这部分设备能够顺利接入网络,CoAP 协议因此诞生。

 2、COAP特点

序号特点说明
1轻量级CoAP协议非常简单,头部和选项字段较少,占用网络带宽和资源较少。
2基于UDP基于UDP运行,使得更适用于无连接、低延迟和高效率的通信,通过CoAP的CON(Confirmable)和ACK(Acknowledgment)消息实现可靠性传输。
3类Restful架构采用类RESTful架构风格,支持GET、POST、PUT和DELETE等常用的HTTP方法(有所区分),以进行资源的读取、创建、更新和删除。
4低能耗、低带宽对资源受限设备和网络进行优化,具有低能耗和低带宽消耗的特性。
5资源标识符使用统一资源标识符(URI)来标识资源
6IP多播允许一对多的通信,对物联网中的多个设备同时接收非常有用
7可扩展性允许在消息头中包含自定义选项,以满足特定应用的需求,可扩展性高。

3、基于COAP的NB-IoT接入流程

         上图是某云基于Coap的NB-IoT的数据接入框架,这也是当前很多物联网平台接入的架构(可供参考),是一种比较容易实现的方式。

序号描述
1在设备端NB-IoT模块中,集成物联网平台SDK。厂商在物联网平台控制台申请设备证书(ProductKey、DeviceName和DeviceSecret)并烧录到设备中。
2NB-IoT设备通过运营商的蜂窝网络进行入网。需要联系当地运营商,确保设备所属地区已经覆盖NB网络,并已具备NB-IoT入网能力。
3设备入网成功后,NB设备产生的流量数据及产生的费用数据,将由运营商的M2M平台管理。此部分平台能力由运营商提供。
4设备开发者可通过CoAP/UDP协议,将设备采集的实时数据上报到云物联网平台,借助物联网平台,实现海量亿级设备的安全连接和数据管理能力。并且,可通过规则引擎,将数据转发至大数据产品、云数据库、表格存储等服务中进行处理。
5物联网平台提供相关的数据开放接口和消息推送服务,可将数据转发到业务服务器中,实现设备资产与实际应用的快速集成。

二、CoAP协议JAVA实践

        协议一般与编程语言无关。因此,您可以使用熟悉的技术栈来进行实现即可,这里以作者熟悉的Java语言为例,简单的介绍适用Java进行CoAP的协议开发。采用Java实现的原因很简单,基于Java良好的生态,有一款基于Java开发的CoAP协议实现框架californium,基于这个框架可以快速实现CoAP的Server端和Client的开发,帮助我们快速实现物联网业务。

1、californium介绍

        Californium框架是一款基于Java实现的Coap技术框架,californium官网地址,该项目实现了Coap协议的各种请求响应定义,支持CON/NON不同的可靠性传输模式。Californium 基于分层设计且高度可扩展。Californium三层架构如下:

        1 网络层:负责处理端口监听,网络数据收发;

        2 协议层:负责Coap协议数据包解析及封装,实现消息的路由、可靠性传输、Token处理、观察者模型;

        3 逻辑层:负责 Resource定义和映射,一个Resource 对应一个URL,可独立实现Coap 请求处理。可以将resource是一个controller。

2、Java集成 

        实现申明,在这里,我们使用californium的版本是2.0.x版本,使用2.0版本是因为在3的版本中座了优化和调整,导致有一些配置需要重写。为了保证最简单的实现,我们用2.0作为示例例子,下次可以说明一下在更高级的版本中如何使用。

        Java开发环境软件说明:

        Eclipse、Jdk1.8、Maven3.3.9、californium 2.0.0-M7

3、Maven 资源引入

        首先新建一个Maven工程,在Pom.xml中引入所需要的资源jar包。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.yelangking</groupId><artifactId>californium-client-demo</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><dependency><groupId>org.eclipse.californium</groupId><artifactId>californium-core</artifactId><version>2.0.0-M7</version></dependency><dependency><groupId>org.eclipse.californium</groupId><artifactId>element-connector</artifactId><version>2.0.0-M7</version></dependency><dependency><groupId>org.eclipse.californium</groupId><artifactId>scandium</artifactId><version>2.0.0-M7</version></dependency>
</dependencies>
</project>

4、定义Server端

        基于californium的server端开发,其实非常简单。关键代码如下:

package com.yelagking;import java.text.SimpleDateFormat;
import java.util.Date;import org.eclipse.californium.core.CoapResource;
import org.eclipse.californium.core.CoapServer;
import org.eclipse.californium.core.coap.CoAP.ResponseCode;
import org.eclipse.californium.core.server.resources.CoapExchange;public class HelloCoAPServer {public static void main(String[] args) {CoapServer server = new CoapServer();// 主机为localhost 端口为默认端口5683server.add(new CoapResource("hello") {// 创建一个资源为hello 请求格式为 主机:端口\hello@Overridepublic void handleGET(CoapExchange exchange) { // 重写处理GET请求的方法exchange.respond(ResponseCode.CONTENT, "Hello CoAP!This is from Java coap server");}});server.add(new CoapResource("time") { // 创建一个资源为time 请求格式为 主机:端口\time@Overridepublic void handleGET(CoapExchange exchange) {Date date = new Date();exchange.respond(ResponseCode.CONTENT, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date));}});server.start();}
}

        在上面的代码中,相当与定义了两个controller,分别为hello和time,在类里面,开放了一个get访问接口(相当于是restful的get)。在实际业务中,我们可以在get里面做业务逻辑了,比如把接收到的数据进行入库,或者把执行命令一起推送给下游的设备端。

server.add(new CoapResource("hello") {// 创建一个资源为hello 请求格式为 主机:端口\hello@Overridepublic void handleGET(CoapExchange exchange) { // 重写处理GET请求的方法exchange.respond(ResponseCode.CONTENT, "Hello CoAP!This is from Java coap server");}});

5、Client调用

        有了服务端之后,我们再进行客户端的开发。由于是示例,并未做分离部署,及客户端和服务端在一台机器上,实际情况下肯定是需要分开的。关键代码如下:

package com.yelangking;import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;import org.eclipse.californium.core.CoapClient;
import org.eclipse.californium.core.CoapResponse;
import org.eclipse.californium.core.Utils;
import org.eclipse.californium.core.coap.MediaTypeRegistry;public class ClientTest {public static void main(String[] args) throws URISyntaxException, IOException {URI uri = null;uri = new URI("coap://localhost:5683/hello"); // 创建一个资源请求hello资源,注意默认端口为5683//uri = new URI("coap://127.0.0.1:5683/core/time?type=1");CoapClient client = new CoapClient(uri);CoapResponse response = client.get();if (response != null) {System.out.println(response.getCode()); // 打印请求状态码System.out.println(response.getOptions()); // 选项参数System.out.println(response.getResponseText()); // 获取内容文本信息System.out.println("\nAdvanced\n"); //System.out.println(Utils.prettyPrint(response)); // 打印格式良好的输出}}}

6、运行测试

        在编写完server端和client端代码后,我们分别来测试一下是否可用,以及通过client调用server,是否有请求报文。首先将Server端启动起来。

        然后再启动client,同时访问hello接口,测试能否从接口中获取数据。运行main函数后,发现控制台有以下输出:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
2.05
{"Content-Format":"text/plain"}
Hello CoAP!This is from Java coap serverAdvanced==[ CoAP Response ]============================================
MID    : 59202
Token  : [d845e70ed6398b48]
Type   : ACK
Status : 2.05
Options: {"Content-Format":"text/plain"}
RTT    : 51 ms
Payload: 40 Bytes
---------------------------------------------------------------
Hello CoAP!This is from Java coap server
===============================================================

        可以看到,client成功发起了一个get请求,server端正常接收请求,并返回了相应。一次CoAP的协议调用过程实例就成功了。

总结

        以上就是本文的主要内容,本文将围绕物联网的COAP协议,首先对其进行简单介绍,然后基于JAVA语言来进行COAP协议通讯编程实战,帮助大家对COAP有一个简单的认知,经过编程实践掌握协议的通信机制。

本文部分插图参考网络资源,原文地址:

1、Coap协议和Californium框架使用示例。

2、CoAP连接通信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340429.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

遗传算法可用什么算法代替_获取可用密码算法的列表

遗传算法可用什么算法代替您如何了解可用的密码算法&#xff1f; Java规范列出了几种必需的密码&#xff0c;摘要等&#xff0c;但是提供程序通常提供的不止这些。 幸运的是&#xff0c;这很容易了解我们系统上的可用内容。 public class ListAlgorithms {public static void…

bp配置 sap_SAP转储订单之 STO without delivery

在《SAP转储订单STO小结》一文中&#xff0c;介绍了存转储订单(STO)的几种方式&#xff0c;在SAP Library中有相应的描述&#xff1a;1 Stock Transfer Between Plants in One Step2 Stock Transfer Between Plants in TwoSteps3 Stock Transport Order Without Delivery4 Stoc…

高效的企业测试–测试框架(5/6)

本系列文章的这一部分将介绍测试框架以及我在何时以及是否应用它们方面的想法和经验。 关于测试框架的思考 我对大多数测试框架不太满意的原因是&#xff0c;按照我的观点&#xff0c;它们大多增加了一些语法上的便利性和便利性&#xff0c;但本质上并不能解决拥有可维护的测…

linux 源码 目录,Linux系统主要目录及kernel源代码目录

1.在安装Linux后&#xff0c;先要了解清楚系统主要目录到底是干什么用的&#xff0c;避免以后再操作上的失误等。下面&#xff0c;就对Linux主要目录做一下简要说明&#xff1a;/boot&#xff1a;系统启动相关的文件&#xff0c;如内核、initrd&#xff0c;以及grub(bootloader…

[MEGA DEAL] 2020年完整的Java Master Class Bundle(96%)

通过超过62个小时的培训来掌握最流行的编程语言&#xff0c;从而树立良好的开发生涯 嘿&#xff0c;怪胎&#xff0c; 这一周&#xff0c;我们JCG促销专区 &#xff0c;我们有另一个极端的报价 。我们正在提供一个巨大的96&#xff05;off的完整2020 Python编程认证捆绑 。 立…

linux nc命令测试端口,Linux和Windows下的NC(Netcat)命令测试端口连通性

1、Linux OS 环境下(以Centos为例)&#xff0c;使用nc命令分别测试TCP和UDP端口连通性&#xff1a;css安装方法&#xff1a;nginx在客户端和服务器端分别安装nc工具&#xff0c;安装命令以下&#xff1a;webyum install nc1. Linux OS下使用nc命令&#xff0c;实现TCP方式监听服…

javafx css颜色_JavaFX技巧7:使用CSS颜色常量/派生颜色

javafx css颜色在使用FlexCalendarFX时&#xff0c;我不得不定义一组颜色以可视化不同颜色的不同日历的控件。 每个日历不仅提供一种颜色&#xff0c;还提供几种&#xff1a;用于取消选择/选定/悬停状态的背景和文本颜色。 颜色曾在多个地方使用过&#xff0c;但为了简洁起见&…

rowspan不显示 wpf_wpf的datagrid绑定datatable列不自动更新解决方案

wpf的datagrid绑定datatable列不自动更新描述如下&#xff1a;想利用程序实现显示NORTHWND.MDF中的所有表。listbox显示数据库中的表清单&#xff0c;选中listbox里面的一项以后&#xff0c;在datagrid中显示表的内容。xaml如下&#xff1a;Grid.Column"1" ItemsSour…

linux 查看端口 程序,linux开发:Linux下查看端口占用

前段时间有学生问到&#xff0c;怎么查看linux系统中已经被占用的端口&#xff1f;下面就统一给大家解释一下。提到端口&#xff0c;那首先来回顾端口定义&#xff0c;为了区分一台主机接收到的数据包应该转交给哪个任务来进行处理&#xff0c;使用端口号来区别&#xff1b;我们…

十进制小数化为二进制小数的方法是什么_八进制转换成十进制,十进制转换成八进制...

先来看八进制如何转换成十进制。其方法与二进制转换成十进制差不多&#xff1a;按权相加法&#xff0c;即将八进制每位上的数乘以位权&#xff08;如8,64,512….&#xff09;&#xff0c;然后将得出来的数再加在一起。如将72.45转换为十进制。如图1所示来看看十进制转八进制&am…

我两个月来对Quarkus的了解

又一年&#xff0c;另一个来临&#xff0c;我很荣幸再次开启围绕Java&#xff0c;语言&#xff0c;生态系统和朋友的24篇精彩博客文章的统治&#xff0c;这些博客文章将我们所有人带入了今年最安静的假期。 这已经是第五年了&#xff08;我只错过了2016年&#xff09;&#xff…

c++从字符串中提取数字求和_【函数应用】单元格文本内提取数字并求和

本篇的主题是将单元格内一串文本&#xff0c;找出所有数字并求和&#xff0c;如下图。难度较高&#xff0c;新手建议仅了解下&#xff0c;先学会数组运用&#xff0c;再研究此知识点。废话少说&#xff0c;步入正题。重点说明&#xff1a;本篇只针对文本内整数的数字进行提取并…

linux 网络端口全连接扫描,Linux系统下的网络端口扫描工具Nmap

Linux端口扫描工具nmap and nwatchPort scan简介port Scan的方法介绍 portScan就是一种通过检测对方服务器的开放端口&#xff0c;侦测对方服务器服务的方法。一般可分为主动式和被动式两种。主动式就是通过向对方服务器的特定端口发送数据包&#xff0c;根据应答来判断。以nma…

iphone已停用怎么解锁_两种无密码解锁iPhone锁屏密码的方法

现在很多手机都配备指纹解锁功能&#xff0c;大家平时用惯了指纹解锁&#xff0c;有时候在需要输入锁屏密码的时候反倒记不清密码是什么了。像是手机重启后就需要输入密码解锁&#xff0c;iPhone锁屏密码忘了怎么办&#xff1f;多次输入错误密码还可能导致手机被停用&#xff0…

elisa数据处理过程图解_ELISA原理示意图详解.ppt

ELISA原理示意图详解.ppt免疫酶技术及其应用——ELISA 一、实验目的 了解和掌握免疫酶技术的测定原理。 掌握酶联免疫吸附测定技术的操作步骤&#xff0c;学会利用竞争ELISA的方法&#xff0c;定量测定抗体或抗原。 了解免疫酶技术在生物学和医学研究的重要意义及应用价值。 二…

linux查找postgre进程,postgresql数据库某一个进程占用大量CPU,问题排查详解

postgresql某一个进程占用大量CPU&#xff0c;问题排查&#xff0c;目前服务器cpu为4核&#xff0c;内存8G1.查下是不是我们的业务SQLSELECTprocpid,START,now() - START AS lap,current_queryFROM (SELECTbackendid,pg_stat_get_backend_pid(S.backendid) AS procp…

华硕z9pa u8 bios下载_教程:图文教学,华硕M8H M8R硬破解支持intel 9代处理器

听说2020年&#xff0c;Intel将要上10代U了&#xff0c;10代U Comet Lake-S的参数整理规格如下:赛扬G5900&#xff1a;2核心2线程&#xff0c;3.4GHz奔腾G6600&#xff1a;2核心4线程&#xff0c;4.2GHz酷睿i3-10100&#xff1a;4核心8线程&#xff0c;3.6-?GHz酷睿i3-10100T&…

64位 regsrv win10_Win10 64位安装个人版SQL2000图文教程

默认Win10上是不允许安装SQL2000的&#xff0c;毕竟SQL2000已经是10多年前的老软件了&#xff0c;但是因为它成熟稳定&#xff0c;相比SQL2005&#xff0c;SQL2008R2&#xff0c;SQL2012&#xff0c;SQL2014&#xff0c;体积要小的多&#xff0c;所以还是很希望能在Win10环境下…

Java 13:切换表达式的增强功能

您可能还记得我以前的文章&#xff0c;在Java 12中&#xff0c;传统的switch语句得到了增强&#xff0c;因此可以用作表达式。 在Java 13中&#xff0c;对该功能进行了进一步的更改 。 break语句不再可以返回值。 相反&#xff0c;您必须使用新的yield语句&#xff0c;如下所示…

linux 硬盘转换gpt分区格式化吗,Linux下使用gpt给磁盘分区、格式化、挂载

GPT(GUID)分区(推荐使用)sudo parted # 进入parted工具&#xff0c;输入help可查看帮助select /dev/sda # 选择你要操作的设备&#xff0c;一定要注意&#xff0c;不要把默认设备误操作了mklabel gpt # 设定使用的分区类型, 如果要用MBR分区&#xff0c;输入msdos即可。mkpart …