可复制:121202538

中文社区:http://thingsboard.org.cn

TB的MQTT设备协议
TB官网: https://thingsboard.io/

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

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

BY Thingsboard team

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

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

演示视频:

https://cdn.iotschool.com/uploads/20200301/68d5024c86918948585ffe8068e392e3.mp4

CoAP

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

协议特点

  • CoAP协议网络传输层由TCP改为UDP。
  • 它基于REST,server的资源地址和互联网一样也有类似url的格式,客户端同样有POST,GET,PUT,DELETE方法来访问server,对HTTP做了简化。
  • COAP是二进制格式的,HTTP是文本格式的,COAP比HTTP更加紧凑。
  • 轻量化,COAP最小长度仅仅4B,一个HTTP的头都几十个B了。
  • 支持可靠传输,数据重传,块传输。 确保数据可靠到达。
  • 支持IP多播, 即可以同时向多个设备发送请求。
  • 非长连接通信,适用于低功耗物联网场景。

客户端库设置

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

npm install coap-cli -g

用法

Usage: coap [command] [options] urlCommands:get      performs a GET requestput      performs a PUT requestpost     performs a POST requestdelete   performs a DELETE requestOptions:-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行: CoapResource是resource的基本实现,扩展这个类来编写您自己的资源。通过向资源添加“v1”、”api”和超时时间的设置,则coap的基础url为:coap://localhost:port/api/v1/。
  • 第16-18行: Endpoint负责与网络进行通信, 如果没有一个Endpoint与CoapServer进行绑定,那就创建一个默认的Endpoint,默认就是ucp实现传输层。
  • 第19行,启动CoAP服务。

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

CoapTransportResource

此类负责处理请求

GET

   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

@Overridepublic 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协议有所了解了,感谢大家的阅读!

本文作者: 穆书伟

本文链接: https://blog.grozacloud.com/2019/07/25/物联网时代-跟着Thingsboard学IOT架构-CoAP设备协议

版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

Thingsboard 物联网平台 CoAP 协议介绍相关推荐

  1. 将Edgex网关接入Thingsboard物联网平台

    将Edgex网关接入Thingsboard物联网平台 [toc] 系统环境准备 Thingsboard物联网平台 平台概述 ​ 在众多的开源物联网平台项目中,Thingsboard在体系架构先进性.功 ...

  2. 【物联网】CoAP协议总结

    [物联网]CoAP协议总结 一.概述 二.CoAP报文结构 1.报头 2.可选字段 3.数据 参数详解 三.CoAP逻辑分层 四.CoAP传输模型 4.1 CoAP Message模型 1. CoAP ...

  3. 物联网协议Coap协议介绍

    COAP协议简介 Coap(Constrained Application Protocol)是一种在物联网世界的类web协议,它的详细规范定义在 RFC 7252.COAP名字翻译来就是" ...

  4. 物联网的coap协议

    1. CoAP协议的简单介绍 CoAP是一种面向网络的协议,采用了与HTTP类似的特征,核心内容为资源抽象.REST式交互以及可扩展的头选项等.这些关键特征使得因特网由简单的文档检索机制(World ...

  5. thingsboard物联网平台编译安装一步到位

    物联网平台thingsboard编译一步到位 物联网平台thingsboard编译一步到位 1.thingsboard简介 2.clone项目 3.前置准备 3.1 安装JDK11 3.2 安装Nod ...

  6. 基于阿里云物联网平台MQTT协议实现云端和mqttfx通讯

    本项目的目的,借助阿里云物联网平台实现ESP8266(IDE:Arduino)与小程序(作为客户端)的互相通信,并通过小程序控制以及获取esp8266上的灯状态. 准备材料以及要使用的IDE 阿里云账 ...

  7. 物联网平台 ThingsBoard 3.3 发布

    包含 2126 个提交和 1668 个更改文件的主要版本. 主要改进: 与 ThingsBoard Edge 进行配置和通信的接口: 固件和软件无线更新(FOTA 和 SOTA): 持久的 RPC 调 ...

  8. CoAP 协议解析说明(转)

    CoAP 协议全面分析 HTTP与COAP 请求与响应示例 HTTP请求(文本格式) POST https://getman.cn/echo HTTP/1.1 User-Agent: Fiddler ...

  9. 物联网平台如何切入智慧校园

    智慧校园是指以促进信息技术与教育教学深度有效融合.提高学与教的效果为目的. 可以简单理解为智慧校园=1个数据中心+智慧校园基础设施 +智慧校园应用系统+智慧性资源 去年3月份,教育部印发<教育信 ...

最新文章

  1. html5手机端的点击弹出侧边滑动菜单代码
  2. 设计模式 — 行为型模式 — 责任链模式
  3. Java注释 link_开源代码中注释中的那些a link p @ 是给什么编辑器用的????
  4. 面对不可避免的故障,我们造了一个“上帝视角”的控制台
  5. <马哲>劳动价值论的理论及实践意义
  6. bcb中使用pas文件
  7. mos 多路模拟电子开关_【原创】单火线智能开关技术介绍及分析
  8. 计算机内存的故障,计算机内存出现故障的解决方法
  9. 盘点80年前欧美最为匪夷所思的发明
  10. 什么是机器学习?有哪些分类?怎样上手开发?终于有人讲明白了
  11. boot客户管理系统源码_「计算机毕设」基于SpringBoot开发的仓库管理系统
  12. 大家都在发圣诞树,我偏偏要发一个圣诞小游戏给大家玩【内附源码】
  13. Unity3D基础5:摄像机与Game视图
  14. python链表逆序实例_python 单链表翻转的简单示例
  15. google hacking搜索语法总结
  16. 数据仓库与数据挖掘 5
  17. Android APK瘦身之Android Studio Lint (代码审查)
  18. 【小程序】报getUserProfile:fail can only be invoked by user TAP gesture.
  19. Docker基础介绍(二)
  20. Unity AzureKinect Ar贴纸

热门文章

  1. python图形用户界面page_Python+selenium使用PageObject实现UI自动化
  2. 史上首次!苹果谷歌高调合作,打通iOS和安卓,蓝牙匿名追踪新冠接触者,5月上线
  3. CAE软件安装包(百度网盘)
  4. 与世界对话丨预康可瘦品牌发布暨全国招商会隆重举行
  5. 小白也能轻松上手的Prometheus教程
  6. 计算机通电后 不能正常启动,我的电脑通电后不能马上启动?为什么啊?怎么办
  7. 码流 /码率 / 比特率
  8. 任天堂 Wii 模拟器 Dolphin 已原生支持苹果 M1 Mac 电脑
  9. xshell对mysql的备份与恢复_XShell5里面登陆了数据库,如何将数据库里面的表或者整个数据库备份导出来(和导入进去)...
  10. mysql导入数据库之后触发器没有权限_MYSQL设置触发器权限问题的解决方法