目錄
前言
一、COAP簡介
1、關(guān)于COAP
?2、COAP特點(diǎn)
3、基于COAP的NB-IoT接入流程
二、CoAP協(xié)議JAVA實(shí)踐
1、californium介紹
2、Java集成?
3、Maven 資源引入
4、定義Server端
5、Client調(diào)用
6、運(yùn)行測試
總結(jié)
前言
? ? ? ? 今天平安夜,祝大家圣誕快樂,平平安安。最近幾年,隨著物聯(lián)網(wǎng)的興起,很多設(shè)備都已經(jīng)可以實(shí)現(xiàn)互聯(lián)互通。相信很多從事安防、智慧城市、智能家居、智慧農(nóng)業(yè)、應(yīng)急消防、自然資源行業(yè)的朋友們,物聯(lián)網(wǎng)已經(jīng)是很成熟的技術(shù)了。很多的攝像頭、傳感器、計(jì)量水表、電表、燃?xì)獗?、濕度傳感器等等設(shè)備不僅可以支持實(shí)時(shí)的上傳數(shù)據(jù),還可以跟物聯(lián)網(wǎng)平臺(tái)進(jìn)行互聯(lián)互通,接收服務(wù)端的指令并進(jìn)行執(zhí)行相應(yīng)操作。
????????在實(shí)現(xiàn)物聯(lián)網(wǎng)設(shè)備和互聯(lián)網(wǎng)連接的過程中,除了基礎(chǔ)的網(wǎng)絡(luò)通信保障,還有一個(gè)重要的基礎(chǔ)設(shè)施,就是物聯(lián)網(wǎng)協(xié)議。相信大家對(duì)協(xié)議都不陌生,從TCP/IP、UDP,從HTTP、MQTT、COAP,很多的協(xié)議在我們?nèi)粘5墓ぷ鳟?dāng)中,當(dāng)然更多使用的是HTTP協(xié)議。關(guān)于協(xié)議,很多書籍都已經(jīng)講解得非常詳細(xì)。
????????本文將圍繞物聯(lián)網(wǎng)的COAP協(xié)議,首先對(duì)其進(jìn)行簡單介紹,然后基于JAVA語言來進(jìn)行COAP協(xié)議通訊編程實(shí)戰(zhàn),幫助大家對(duì)COAP有一個(gè)簡單的認(rèn)知,經(jīng)過編程實(shí)踐掌握協(xié)議的通信機(jī)制。
一、COAP簡介
????????為了讓不熟悉COAP協(xié)議的讀者在讀這篇博文時(shí),不至于不知道COAP是什么?因?yàn)檫€是在此對(duì)COAP進(jìn)行一個(gè)簡單的介紹,讓每個(gè)讀者都有一個(gè)直觀的認(rèn)識(shí)。如果對(duì)COAP非常熟悉的朋友,可以略過,直接進(jìn)入后面的編程實(shí)戰(zhàn)環(huán)節(jié)。
1、關(guān)于COAP
????????CoAP(Constrained Application Protocol,受限應(yīng)用協(xié)議)是一種專為物聯(lián)網(wǎng)(IoT)設(shè)備和資源受限網(wǎng)絡(luò)設(shè)計(jì)的應(yīng)用層協(xié)議。它的誕生也是由于物聯(lián)網(wǎng)設(shè)備大多都是資源限制型的,比如 CPU、RAM、Flash、網(wǎng)絡(luò)寬帶等;對(duì)于這類設(shè)備來說,想要直接使用現(xiàn)有網(wǎng)絡(luò)的TCP和HTTP來實(shí)現(xiàn)設(shè)備信息交換是不現(xiàn)實(shí)的,為了讓這部分設(shè)備能夠順利接入網(wǎng)絡(luò),CoAP 協(xié)議因此誕生。
?2、COAP特點(diǎn)
序號(hào) | 特點(diǎn) | 說明 |
1 | 輕量級(jí) | CoAP協(xié)議非常簡單,頭部和選項(xiàng)字段較少,占用網(wǎng)絡(luò)帶寬和資源較少。 |
2 | 基于UDP | 基于UDP運(yùn)行,使得更適用于無連接、低延遲和高效率的通信,通過CoAP的CON(Confirmable)和ACK(Acknowledgment)消息實(shí)現(xiàn)可靠性傳輸。 |
3 | 類Restful架構(gòu) | 采用類RESTful架構(gòu)風(fēng)格,支持GET、POST、PUT和DELETE等常用的HTTP方法(有所區(qū)分),以進(jìn)行資源的讀取、創(chuàng)建、更新和刪除。 |
4 | 低能耗、低帶寬 | 對(duì)資源受限設(shè)備和網(wǎng)絡(luò)進(jìn)行優(yōu)化,具有低能耗和低帶寬消耗的特性。 |
5 | 資源標(biāo)識(shí)符 | 使用統(tǒng)一資源標(biāo)識(shí)符(URI)來標(biāo)識(shí)資源 |
6 | IP多播 | 允許一對(duì)多的通信,對(duì)物聯(lián)網(wǎng)中的多個(gè)設(shè)備同時(shí)接收非常有用 |
7 | 可擴(kuò)展性 | 允許在消息頭中包含自定義選項(xiàng),以滿足特定應(yīng)用的需求,可擴(kuò)展性高。 |
3、基于COAP的NB-IoT接入流程
?????????上圖是某云基于Coap的NB-IoT的數(shù)據(jù)接入框架,這也是當(dāng)前很多物聯(lián)網(wǎng)平臺(tái)接入的架構(gòu)(可供參考),是一種比較容易實(shí)現(xiàn)的方式。
序號(hào) | 描述 |
---|---|
1 | 在設(shè)備端NB-IoT模塊中,集成物聯(lián)網(wǎng)平臺(tái)SDK。廠商在物聯(lián)網(wǎng)平臺(tái)控制臺(tái)申請(qǐng)?jiān)O(shè)備證書(ProductKey、DeviceName和DeviceSecret)并燒錄到設(shè)備中。 |
2 | NB-IoT設(shè)備通過運(yùn)營商的蜂窩網(wǎng)絡(luò)進(jìn)行入網(wǎng)。需要聯(lián)系當(dāng)?shù)剡\(yùn)營商,確保設(shè)備所屬地區(qū)已經(jīng)覆蓋NB網(wǎng)絡(luò),并已具備NB-IoT入網(wǎng)能力。 |
3 | 設(shè)備入網(wǎng)成功后,NB設(shè)備產(chǎn)生的流量數(shù)據(jù)及產(chǎn)生的費(fèi)用數(shù)據(jù),將由運(yùn)營商的M2M平臺(tái)管理。此部分平臺(tái)能力由運(yùn)營商提供。 |
4 | 設(shè)備開發(fā)者可通過CoAP/UDP協(xié)議,將設(shè)備采集的實(shí)時(shí)數(shù)據(jù)上報(bào)到云物聯(lián)網(wǎng)平臺(tái),借助物聯(lián)網(wǎng)平臺(tái),實(shí)現(xiàn)海量億級(jí)設(shè)備的安全連接和數(shù)據(jù)管理能力。并且,可通過規(guī)則引擎,將數(shù)據(jù)轉(zhuǎn)發(fā)至大數(shù)據(jù)產(chǎn)品、云數(shù)據(jù)庫、表格存儲(chǔ)等服務(wù)中進(jìn)行處理。 |
5 | 物聯(lián)網(wǎng)平臺(tái)提供相關(guān)的數(shù)據(jù)開放接口和消息推送服務(wù),可將數(shù)據(jù)轉(zhuǎn)發(fā)到業(yè)務(wù)服務(wù)器中,實(shí)現(xiàn)設(shè)備資產(chǎn)與實(shí)際應(yīng)用的快速集成。 |
二、CoAP協(xié)議JAVA實(shí)踐
????????協(xié)議一般與編程語言無關(guān)。因此,您可以使用熟悉的技術(shù)棧來進(jìn)行實(shí)現(xiàn)即可,這里以作者熟悉的Java語言為例,簡單的介紹適用Java進(jìn)行CoAP的協(xié)議開發(fā)。采用Java實(shí)現(xiàn)的原因很簡單,基于Java良好的生態(tài),有一款基于Java開發(fā)的CoAP協(xié)議實(shí)現(xiàn)框架californium,基于這個(gè)框架可以快速實(shí)現(xiàn)CoAP的Server端和Client的開發(fā),幫助我們快速實(shí)現(xiàn)物聯(lián)網(wǎng)業(yè)務(wù)。
1、californium介紹
????????Californium框架是一款基于Java實(shí)現(xiàn)的Coap技術(shù)框架,californium官網(wǎng)地址,該項(xiàng)目實(shí)現(xiàn)了Coap協(xié)議的各種請(qǐng)求響應(yīng)定義,支持CON/NON不同的可靠性傳輸模式。Californium 基于分層設(shè)計(jì)且高度可擴(kuò)展。Californium三層架構(gòu)如下:
????????1 網(wǎng)絡(luò)層:負(fù)責(zé)處理端口監(jiān)聽,網(wǎng)絡(luò)數(shù)據(jù)收發(fā);
????????2 協(xié)議層:負(fù)責(zé)Coap協(xié)議數(shù)據(jù)包解析及封裝,實(shí)現(xiàn)消息的路由、可靠性傳輸、Token處理、觀察者模型;
????????3 邏輯層:負(fù)責(zé) Resource定義和映射,一個(gè)Resource 對(duì)應(yīng)一個(gè)URL,可獨(dú)立實(shí)現(xiàn)Coap 請(qǐng)求處理??梢詫esource是一個(gè)controller。
2、Java集成?
????????實(shí)現(xiàn)申明,在這里,我們使用californium的版本是2.0.x版本,使用2.0版本是因?yàn)樵?的版本中座了優(yōu)化和調(diào)整,導(dǎo)致有一些配置需要重寫。為了保證最簡單的實(shí)現(xiàn),我們用2.0作為示例例子,下次可以說明一下在更高級(jí)的版本中如何使用。
????????Java開發(fā)環(huán)境軟件說明:
? ? ? ? Eclipse、Jdk1.8、Maven3.3.9、californium 2.0.0-M7
3、Maven 資源引入
????????首先新建一個(gè)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端開發(fā),其實(shí)非常簡單。關(guān)鍵代碼如下:
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();// 主機(jī)為localhost 端口為默認(rèn)端口5683
server.add(new CoapResource("hello") {// 創(chuàng)建一個(gè)資源為hello 請(qǐng)求格式為 主機(jī):端口\hello
@Override
public void handleGET(CoapExchange exchange) { // 重寫處理GET請(qǐng)求的方法
exchange.respond(ResponseCode.CONTENT, "Hello CoAP!This is from Java coap server");
}
});
server.add(new CoapResource("time") { // 創(chuàng)建一個(gè)資源為time 請(qǐng)求格式為 主機(jī):端口\time
@Override
public void handleGET(CoapExchange exchange) {
Date date = new Date();
exchange.respond(ResponseCode.CONTENT, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date));
}
});
server.start();
}
}
????????在上面的代碼中,相當(dāng)與定義了兩個(gè)controller,分別為hello和time,在類里面,開放了一個(gè)get訪問接口(相當(dāng)于是restful的get)。在實(shí)際業(yè)務(wù)中,我們可以在get里面做業(yè)務(wù)邏輯了,比如把接收到的數(shù)據(jù)進(jìn)行入庫,或者把執(zhí)行命令一起推送給下游的設(shè)備端。
server.add(new CoapResource("hello") {// 創(chuàng)建一個(gè)資源為hello 請(qǐng)求格式為 主機(jī):端口\hello
@Override
public void handleGET(CoapExchange exchange) { // 重寫處理GET請(qǐng)求的方法
exchange.respond(ResponseCode.CONTENT, "Hello CoAP!This is from Java coap server");
}
});
5、Client調(diào)用
????????有了服務(wù)端之后,我們?cè)龠M(jìn)行客戶端的開發(fā)。由于是示例,并未做分離部署,及客戶端和服務(wù)端在一臺(tái)機(jī)器上,實(shí)際情況下肯定是需要分開的。關(guān)鍵代碼如下:
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"); // 創(chuàng)建一個(gè)資源請(qǐng)求hello資源,注意默認(rèn)端口為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()); // 打印請(qǐng)求狀態(tài)碼
System.out.println(response.getOptions()); // 選項(xiàng)參數(shù)
System.out.println(response.getResponseText()); // 獲取內(nèi)容文本信息
System.out.println("\nAdvanced\n"); //
System.out.println(Utils.prettyPrint(response)); // 打印格式良好的輸出
}
}
}
6、運(yùn)行測試
????????在編寫完server端和client端代碼后,我們分別來測試一下是否可用,以及通過client調(diào)用server,是否有請(qǐng)求報(bào)文。首先將Server端啟動(dòng)起來。
????????然后再啟動(dòng)client,同時(shí)訪問hello接口,測試能否從接口中獲取數(shù)據(jù)。運(yùn)行main函數(shù)后,發(fā)現(xiàn)控制臺(tái)有以下輸出:
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 server
Advanced
==[ 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成功發(fā)起了一個(gè)get請(qǐng)求,server端正常接收請(qǐng)求,并返回了相應(yīng)。一次CoAP的協(xié)議調(diào)用過程實(shí)例就成功了。
總結(jié)
????????以上就是本文的主要內(nèi)容,本文將圍繞物聯(lián)網(wǎng)的COAP協(xié)議,首先對(duì)其進(jìn)行簡單介紹,然后基于JAVA語言來進(jìn)行COAP協(xié)議通訊編程實(shí)戰(zhàn),幫助大家對(duì)COAP有一個(gè)簡單的認(rèn)知,經(jīng)過編程實(shí)踐掌握協(xié)議的通信機(jī)制。
本文部分插圖參考網(wǎng)絡(luò)資源,原文地址:
1、Coap協(xié)議和Californium框架使用示例。文章來源:http://www.zghlxwxcb.cn/news/detail-765416.html
2、CoAP連接通信。文章來源地址http://www.zghlxwxcb.cn/news/detail-765416.html
到了這里,關(guān)于物聯(lián)網(wǎng)協(xié)議之COAP簡介及Java實(shí)踐的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!