thingsboard官网: https://thingsboard.io/

thingsboard GitHub: https://github.com/thingsboard/thingsboard

thingsboard提供的体验地址: http://demo.thingsboard.io/

BY Thingsboard team

以下内容是在原文基础上演绎的译文。除非另行注明,页面上所有内容采用知识共享-署名(CC BY 2.5 AU)协议共享。

原文地址: ThingsBoard API参考:CoAP设备API


CoAP

协议介绍

CoAP是一种在物联网世界的类web协议,它的详细规范定义在RFC 7252。COAP名字翻译来就是“受限应用协议”,顾名思义,使用在资源受限的物联网设备上。物联网设备的ram,rom都通常非常小,运行TCP和HTTP是不可以接受的。

协议特点

  1. CoAP协议网络传输层由TCP改为UDP。

  2. 它基于REST,server的资源地址和互联网一样也有类似url的格式,客户端同样有POST,GET,PUT,DELETE方法来访问server,对HTTP做了简化。

  3. COAP是二进制格式的,HTTP是文本格式的,COAP比HTTP更加紧凑。

  4. 轻量化,COAP最小长度仅仅4B,一个HTTP的头都几十个B了。

  5. 支持可靠传输,数据重传,块传输。 确保数据可靠到达。

  6. 支持IP多播, 即可以同时向多个设备发送请求。

  7. 非长连接通信,适用于低功耗物联网场景。

客户端库设置

安装

安装node.js,然后执行以下命令:

 npm install coap-cli -g

用法

 Usage: coap [command] [options] url


Commands:

get performs a GET request
put performs a PUT request
post performs a POST request
delete performs a DELETE request

Options:

-h, --help output usage information
-V, --version output the version number
-o, --observe Observe the given resource
-n, --no-new-line No new line at the end of the stream
-p, --payload <payload> The payload for POST and PUT requests
-b, --block2 <option> set the block2 size option
-q, --quiet Do not print status codes of received packets
-c, --non-confirmable non-confirmable
-t, --timeout <seconds> The maximum send time in seconds
-T, --show-timing Print request time, handy for simple performance tests
-O, --coap-option <key,value> Add COAP-Option to the request (repeatable)

PUT和POST

PUT和POST请求如下例所示

 echo -n 'hello world' | coap post coap://localhost/message

Thingsboard的CoAP传输协议架构

因为Thingsboard最新release,是基于微服务架构,不利用单独理解代码。

Thingsboard CoAP设备传输协议源代码:https://github.com/thingsboard/thingsboard/tree/release-2.0/transport/coap

本文基于上面源代码后,剔除相关的安全验证和处理之后搭建简易的讲解项目:

https://github.com/sanshengshui/IOT-Technical-Guide/tree/master/IOT-Guide-Coap


CoAP框架

Thingsboard的CoAP设备传输协议是基于Californium。Californium 是一款基于Java实现的Coap技术框架,该项目实现了Coap协议的各种请求响应定义,支持CON/NON不同的可靠性传输模式。 Californium 基于分层设计且高度可扩展,其内部模块设计及接口定义存在许多学习之处;

值得一提的是,在同类型的 Coap技术实现中,Californium的性能表现是比较突出的,如下图:

更多的数据可以参考Californium-可扩展云服务白皮书 本文以框架的源码分析为主,其他内容不做展开。

项目结构

 .
└── main
└── java
├── com
│ └── sanshengshui
│ └── coap
│ ├── adaptors
│ │ └── JsonCoapAdaptor.java
│ ├── CoapTransportResource.java
│ ├── common
│ │ └── FeatureType.java
│ └── session
│ └── SessionMsgType.java
└── IOTCoapServer.java

代码讲解

IOTCoapServer

  public class IOTCoapServer {

private static final String V1 = "v1";
private static final String API = "api";


private static String host = "127.0.0.1";
private static Integer port = 5683;
private static long timeout = 10000;

public static void main(String[] args) throws UnknownHostException {
CoapServer coapServer = new CoapServer();
CoapResource api = new CoapResource(API);
api.add(new CoapTransportResource(V1,timeout));
coapServer.add(api);
InetAddress addr = InetAddress.getByName(host);
InetSocketAddress sockAddr = new InetSocketAddress(addr, port);
coapServer.addEndpoint(new CoapEndpoint(sockAddr));
coapServer.start();

}

}
  • 第12行代码: CoapServer用作创建服务端。

  • 第12-15行: CoapResourceresource的基本实现,扩展这个类来编写您自己的资源。通过向资源添加“v1”、"api"和超时时间的设置,则coap的基础url为:coap://localhost:port/api/v1/

  • 第16-18行: Endpoint负责与网络进行通信, 如果没有一个Endpoint与CoapServer进行绑定,那就创建一个默认的Endpoint,默认就是ucp实现传输层。

  • 第19行,启动CoAP服务。

以下图片展示服务端的基础架构:


CoapTransportResource

此类负责处理请求

GET
 
 @Override
public void handleGET(CoapExchange exchange) {
Optional<FeatureType> featureType = getFeatureType(exchange.advanced().getRequest());
if (!featureType.isPresent()) {
} else if (featureType.get() == FeatureType.TELEMETRY) {
exchange.respond(CoAP.ResponseCode.BAD_REQUEST);
} else if (featureType.get() == FeatureType.ATTRIBUTES) {
processRequest(exchange, SessionMsgType.GET_ATTRIBUTES_REQUEST);
} else {
exchange.respond(CoAP.ResponseCode.BAD_REQUEST);
}
}
  • 如果我们客户端发起的是GET请求,那么将会进入到handleGET(CoapExchange exchange)方法。

  • getFeatureType(Request request)判断coap协议长度是否大于3。当大于等于3,获取/api/v1/${param}param元素。

 public static final int FEATURE_TYPE_POSITION = 3;

private Optional<FeatureType> getFeatureType(Request request) {
List<String> uriPath = request.getOptions().getUriPath();
try {
if (uriPath.size() >= FEATURE_TYPE_POSITION) {
return Optional.of(FeatureType.valueOf(uriPath.get(FEATURE_TYPE_POSITION - 1).toUpperCase()));
}
} catch (RuntimeException e) {
}
return Optional.empty();
}
  • 通过判断param是否是temperature还是attributes进行相关的逻辑操作。

  • 当不是上述类型,回复状态为BAD_REQUEST的状态码。

POST
 
@Override
public void handlePOST(CoapExchange exchange) {
Optional<FeatureType> featureType = getFeatureType(exchange.advanced().getRequest());
if (!featureType.isPresent()) {
exchange.respond(CoAP.ResponseCode.BAD_REQUEST);
} else {
switch (featureType.get()) {
case ATTRIBUTES:
processRequest(exchange, SessionMsgType.POST_ATTRIBUTES_REQUEST);
break;
case TELEMETRY:
processRequest(exchange, SessionMsgType.POST_TELEMETRY_REQUEST);
break;
}
}
}
  • 如果我们客户端发起的是POST请求,那么将会进入到handlePOST(CoapExchange exchange)方法。

  • 对获取的uri的类型是temperature还是attributes来做相关的逻辑操作。

逻辑处理
 
private void processRequest(CoapExchange exchange, SessionMsgType type) {
exchange.accept();
Exchange advanced = exchange.advanced();
Request request = advanced.getRequest();

try {
switch (type) {
case GET_ATTRIBUTES_REQUEST:
case POST_TELEMETRY_REQUEST:
case POST_ATTRIBUTES_REQUEST:
//这个类在之前的物模型博文中有所讲解,大家可以翻看!
JsonCoapAdaptor.convertToMsg(type,request);
break;
default:
throw new IllegalArgumentException("Unsupported msg type: " + type);
}
exchange.respond("Data has been received");
} catch (AdaptorException e){
exchange.respond(CoAP.ResponseCode.BAD_REQUEST, e.getMessage());
} catch (IllegalArgumentException e) {
exchange.respond(CoAP.ResponseCode.INTERNAL_SERVER_ERROR, e.getMessage());
}
}

项目演示

遥测上传API

要将遥测数据发布到服务器节点,请将POST请求发送到以下URL:

 
coap://host/api/v1/telemetry

最简单的支持数据格式是:

 
{"key1":"value1", "key2":"value2"}

要么

 
[{"key1":"value1"}, {"key2":"value2"}]

请注意,在这种情况下,服务器端时间戳将分配给上传的数据!

如果您的设备能够获取客户端时间戳,您可以使用以下格式:

 {"ts":1451649600512, "values":{"key1":"value1", "key2":"value2"}}

在上面的示例中,我们假设“1451649600512”是具有毫秒精度的unix时间戳。例如,值'1451649600512'对应于'Fri,2016年1月1日12:00:00.512 GMT'

例子:

 echo -n '{"size":21,"type":"device"}' | coap post coap://demo.thingsboard.io/api/v1/telemetry
结果:
 key= 1564105084015
属性名=size 属性值=21
属性名=type 属性值=device

属性API

属性API允许设备

  • 将客户端设备属性上载到服务器。

  • 从服务器请求客户端和共享设备属性。

将属性更新发布到服务器

要将客户端设备属性发布到ThingsBoard服务器节点,请将POST请求发送到以下URL:

 coap://host/api/v1/attributes

例子:

 echo -n '{"size":21,"type":"device","status":true}' | coap post coap://localhost:5683/api/v1/attributes

结果:

 
key= 1564105158573
属性名=size 属性值=21
属性名=type 属性值=device
属性名=status 属性值=true
 
从服务器请求属性值

要向ThingsBoard服务器节点请求客户端或共享设备属性,请将GET请求发送到以下URL:

 
coap://host/api/v1/attributes?clientKeys=attribute1,attribute2&sharedKeys=shared1,shared2
 

例子:

 coap get coap://localhost:5683/api/v1/attributes?clientKeys=attribute1,attribute2&sharedKeys=shared1,shared2

结果:

 (2.05)  Data has been received

到此,物联网时代,相信大家对IOT架构下的CoAP协议有所了解了,感谢大家的阅读!

物联网时代 跟着Thingsboard学IOT架构-CoAP设备协议的更多相关文章

  1. 物联网时代-跟着Thingsboard学IOT架构-MQTT设备协议

    Thingsboard的MQTT设备协议 thingsboard官网: https://thingsboard.io/ thingsboard GitHub: https://github.com/t ...

  2. 物联网时代-跟着Thingsboard学IOT架构-HTTP设备协议及API相关限制

    thingsboard官网: https://thingsboard.io/ thingsboard GitHub: https://github.com/thingsboard/thingsboar ...

  3. 物联网时代-新基建-ThingsBoard调试环境搭建

    前言 2020开年之际,科比不幸离世.疫情当道.经济受到了严重的损失.人们都不幸的感慨: 2020年真是太不真实的一年,可以重新来过就好了!国家和政府出台了拯救经济和加速建设的利好消息.3月份最热的词 ...

  4. 基于Azure IoT开发.NET物联网应用系列-全新的Azure IoT架构

    物联网技术已经火了很多年了,业界各大厂商都有各自成熟的解决方案.我们公司主要搞新能源汽车充电,充电桩就是物联网技术的最大应用,车联网.物联网.互联网三网合一.2017年的时候重点研究过Azure Io ...

  5. 开源的物联网技术平台(Thingsboard)

    1   总体说明 1.1   产品概述 1.1.1 Thingsboard作用 1.置备并控制设备. 2.采集设备数据并进行数据可视化. 3.分析设备数据,触发告警. 4.将数据传输到另一个系统. 5 ...

  6. [零基础学IoT Pwn] 环境搭建

    [零基础学IoT Pwn] 环境搭建 0x00 前言 这里指的零基础其实是我们在实战中遇到一些基础问题,再相应的去补充学习理论知识,这样起码不会枯燥. 本系列主要是利用网上已知的IoT设备(路由器)漏 ...

  7. 【跟着stackoverflow学Pandas】 - Adding new column to existing DataFrame in Python pandas - Pandas 添加列

    最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...

  8. 【跟着stackoverflow学Pandas】 -Get list from pandas DataFrame column headers - Pandas 获取列名

    最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...

  9. 【跟着stackoverflow学Pandas】add one row in a pandas.DataFrame -DataFrame添加行

    最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...

随机推荐

  1. c++类运算符重载遇到的函数形参问题

    class A { public: A(int arg1, int arg2); ~A(); A &operator = ( A &other); A operator + ( A & ...

  2. 容器化之Docker小知识普及

    Docker确实是个好东西,相当于一个小型虚拟机,里面环境隔离只要有对应的镜像就能运行业务应用.运行基础应用.能跑数据库等等,还能跑linux等等. Docker 从狭义上来讲就是一个进程,从广义上来 ...

  3. Swagger API文档集中化注册管理

    接口文档是前后端开发对接时很重要的一个组件.手动编写接口文档既费时,又存在文档不能随代码及时更新的问题,因此产生了像swagger这样的自动生成接口文档的框架.swagger文档一般是随项目代码生成与 ...

  4. thinkphp5ajax分頁&&搜索後分頁

    //控制器層 //分頁 public function list_january_table(){ //設置當前頁 $page = input("post.page") ? inp ...

  5. a元素变成块状元素点击之后删除出现背景

    a { text-decoration: none; background: none; -webkit-tap-highlight-color: transparent; } a:hover { - ...

  6. SpringBoot(十九)_404返回统一异常处理结果

    之前写过一篇统一异常处理的文章,今天测试了下如果访问一个不存在的接口,也想返回统一的错误信息,应该怎么做 1.修改application.properties文件 # 自定义404 #出现错误时, 直 ...

  7. TCP/IP 第四、五章

    1, 2, 整个arp请求的过程. 3,arp -a 获取arp高速缓存.一般arp高速缓存存活时间20分钟,不完整的表项设置为3分钟.因为机器的ip地址可能发生改变. 4, 5,arp一般是操作系统 ...

  8. vSphere 5.5.0 U1配置问题:主机的快速统计信息不是最新的(转载)

    最近公司新购置了几台DELL服务器用来上桌面虚拟化,前期搭建测试环境进行功能验证,底层自然而然的选择VMware ESXi,当前最新版本为ESXi 5.5.0 U1,单独数据库安装,相对5.1来说,5 ...

  9. Python的函数, 返回值, 参数

    1. 函数 函数是对功能的封装 语法: def 函数名(形参): 函数体(代码块,return) 调用: 函数名(实参) 2. 返回值 return:在函数执行的时候, 遇到return 就直接返回, ...

  10. 开源框架Autofac使用入门

    目录导航 1.Autofac是什么 1.1什么是DI和IOC 1.2DI和IOC在项目中起到什么作用 2.Autofac如何使用 2.1下载 2.2代码Demo 2.3Demo分析 3总结 1.Aut ...