物联网协议之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,一经查实,立即删除!

相关文章

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…

[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;但为了简洁起见&…

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

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

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

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

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

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

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

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

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&…

苹果mp3软件_flac、WAV、m4a等音频格式转成MP3 ,一键搞定!

在工作生活中&#xff0c;有时我们需要处理各种音频格式转换&#xff0c;有些系统或者是软件不支持特殊的音频格式添加。比如说苹果手机录音格式是M4A的&#xff0c;flac、WAV无损音质格式或者au格式&#xff0c;这些都怎么转成常用的MP3格式呢&#xff1f;有一种快捷的方法就是…

linux6.2 网络yum,配置RHEL6.2的YUM源

服务器端&#xff1a;1、 由于yum安装支持三种协议&#xff1a;file://、ftp://和http://&#xff0c;因此如果是使用本地文件作为源&#xff0c;则可直接使用file:\\协议&#xff0c;否则需要先准备好ftp或者http服务。这次测试的是ftp源&#xff0c;因此需要配置好ftp服务…

iphone换机数据迁移_苹果手机换华为、小米怎么同步数据?来了!

将「雷科技Lite」收藏为我的小程序&#xff0c;不再错过精彩内容雷科技数码3C组编辑 | MoFirLee苹果、安卓手机之间同步数据其实不算太难&#xff0c;难的是没有找对方法。当然&#xff0c;游戏数据无法互通&#xff0c;这里面的问题就复杂了&#xff0c;也是不同平台手机转换数…

spyder pyecharts不显示_165Hz+1ms仅需千元左右 优派VX2771HDPRO显示器

VX2771-HD-PRO应该是前些时间比较受欢迎的电竞显示器之一&#xff0c;不足千元的售价(最近价格又涨回千元以上了)就可以拥有一台165Hz的1080P显示器&#xff0c;性价比还真的蛮高的。国庆在家&#xff0c;而且最近游戏大作不断&#xff0c;赶紧入手一台玩一玩。一、外观赏析开箱…

与安装应用签名不同怎么解决_TCL电视下载软件后不能安装怎么办?一招教你解决...

最近,不少TCL用户都遇到了在当贝市场下载软件后不能安装的问题,那么遇到这种问题该怎么解决呢?首先我们先分析下为什么会出现这种情况!原因:这种情况大多数是因为安装包没有下载完毕或安装包破损导致的,也可能是安装包不适合在你的系统版本中安装,需要最新版本的系统。解决方法…

linux 递归创建线程,[linux]二叉树的建立及其递归遍历(C语言实现)

#二叉树的特点&#xff1a;每一个节点最多有两棵子树&#xff0c;所以二叉树中不存在度大于2的节点&#xff0c;注意&#xff0c;是最多有两棵&#xff0c;没有也是可以的 左子树和右子树是有顺序的&#xff0c;次序不能颠倒&#xff0c;这点可以在哈夫曼编码中体现&#xff0c…

delphi image 编辑器_照片拼图编辑器app下载-照片拼图编辑器下载 v1.0.0 安卓版

照片拼图编辑器是一个专业的照片编辑的app&#xff0c;app里面有很多的拼图工具&#xff0c;模板、水印、滤镜、贴图等等随便你用&#xff0c;可以将图片拼接成多种样式&#xff0c;满足你的各种需求。你想要什么样的效果都可以&#xff0c;赶紧来下载吧&#xff01;应用介绍&a…

非核心版本的计算机上_哪个版本的Microsoft Office最好使用、来占用最少的资源...

使用过多个版本的Microsoft Office和WPS Office。让我推荐几个版本&#xff1a;Microsoft Office 2003和Microsoft Office 2007是两个资源最密集的版本(不考虑旧版本的Office)&#xff0c;除非它们是特别旧的计算机&#xff0c;否则不建议安装。对于十年前的旧计算机&#xff0…

是vans_硬核复刻,就服VANS棋盘格

近几年复刻已成为 Sneaker 圈的新趋势&#xff0c;各大品牌纷纷将自家经典且具有年代感的鞋款复刻再造。而这其中最硬核的还要属 VANS &#xff0c;在今年三月释出 VANS X FAST TIMES 鞋款&#xff0c;标志性的棋盘格元素加上醒目亮眼的红字 Logo &#xff0c;为穿着者带来不一…

Java并发编程实战_阿里P9整理分享的亿级流量Java高并发与网络编程实战PDF

前言为了帮助初级开发者快速掌握高并发、网络编程、微服务、海量数据的处理这些实用技术&#xff0c;本文以“理论范例”的形式对各个知识点进行了详细的讲解&#xff0c;力争让读者在实践中快速掌握相关知识。为了让有java、数据库和web基础的学生&#xff0c;初、中级java开发…