Coap协议在物联网中的实战

news2024/11/8 11:46:38

1. 前言

  1. 提到CoAP不能不提MQTT协议,MQTT协议可以保持长链接,具有一定的实时性,云端向客户端发送消息,设备端可以在最短的时间内接收并作出响应,所以MQTT更适合于实时控制场景,需要保持长连接,不停发送心跳报文,这就不会省电,不适用于低功耗场景。
  2. CoAP (Constrained Application Protocol)是受限制的应用协议的代名词,特点是低功耗,数据发完就可以休眠,所以CoAP更适合于数据采集的场合,由UDP承载,满足受限环境下M2M(Machine-to-Machine)的需求的协议。

在这里插入图片描述

2. CoAP协议报文

在这里插入图片描述
在这里插入图片描述

(1) Ver(Version) :协议版本号,占2个Bit
(2)T(Type) :报文数据类型,占2个Bit,CoAP协议有4种类型

  • ①CON可确定报文(值为0)
    接收端必须回复对应的ACK报文,来通知是否准确拿到该消息。

  • ②NON不确定报文(值为1)
    不需要接收方返回ACK报文

  • ③ACK响应报文(值为2)
    ACK对应着上面的可确定报文

  • ④Reset报文(值3)
    在CoAP协议中,如果客户端每次协议发送都是不合格的,服务端认为该设备出现了不可描述的错误,可以通过Reset报文让其复位。

(3) TKL(Token Length):Token的长度,占4Bit,其作用喝消息ID是一致的,识别消息时使用,不适用该位置写0即可。
(4) Code(功能响应码):占1个字节,值为小数,前三位代表证书,后5位表示小数,包含4种类型,Get(0.01)、Post(0.02)、 Put(0.03)、DELETE(0.04),不涉及这个数位置,在使用过程中直接负责即可,0.01为0x01,0.02为0x02。
(5) Message ID(消息ID):消息ID可有自己指定,如果传输数据出现错误,服务器会返回错误的消息ID供你进一步处理。
(6)Token:如果TKL不为0,根据器长度,填写token值。
(7) Options(选配): 主要包含delta(增量)、length、和value三个部分选择,

  • delta对应下面第二张图第一列的No.的增量
  • length为数据长度,小于13(0xD)则直接填写,大于13则开启扩展一个字节,最多扩展2个字节(D扩充一个字节,E扩充2个字节),扩展之后,要减去13进行填写。
  • value为数据的值。
    在这里插入图片描述
    在这里插入图片描述

(8) 0xFF:分割符
(9) pyaload:报文

2. 报文实战

本文基于中国电信天翼物联网AIoT平台进行实战

2.1 在物联网平台创建CoAP协议的产品与设备

具体操作流程可见平台操作手册

重点关注:

  • 创建产品时,通信协议选择CoAP
  • 创建产品时,“是否透传”,选择透传或者物模型,将对应不同的上下行报文格式。透传:平台对报文不进行解析,将报文透传给应用或终端;物模型:按照在平台定义的服务与属性,对上下行报文进行解析。

在这里插入图片描述
在这里插入图片描述

2.2 交互流程

在这里插入图片描述
在这里插入图片描述

2.3 报文内容提取

#结合创建的产品和交互流程,提取以下信息
POST
Host: 10401093.nb.ctwing.cn   # ${租户ID}.nb.ctwing.cn
Port: 5682
Accept: application/octet-stream
Content-Format: application/octet-stream
payload: 空   # 登录为空,数据上报需要根据具体业务填写。
imei:234512345432123  # 创建设备时填写。

根据上述内容,

  • 前四个字节帧格式为:0x40 02 00 01,分别代表,ver:1;Type:0(有ack);TKL:0;Code:0.02(post);消息ID:1

  • TKL为0,即Token为空

  • option:

    注:根据平台交互接口说明,AIoT平台,并未将Uri-Host放入option中
    (1)Uri_Path : 字节帧为0xB1740172,B代表Uri_Path的序号为11,1代表一个字节,74代表t的ASCII,01代表一个字节,72代表r的ASCII码
    (2)Content_Format:字节帧为0x112A,第一个1代表基于Uri_Path,Content_Format的序号12的增量为1,第二个1代表一个字节,2A代表十进制42,代表Media Type:application/octet-stream,具体可见下面说明。
    (3)Uri_Query:ep={endpointname},ep=234512345432123,字节帧为0x3D0565703d323334353132333435343332313233,3代表Uri_Query的增量为3,D代表扩展一个字节,05扩充一个字节后剩余长度为05(0x05+0xD=0x12)

    最后,将字节帧,拼接起来为:0x40020001B1740172112A3D0565703d323334353132333435343332313233
    在这里插入图片描述
    通过UDP通信协议发送出去

import socket
import binascii
# 创建UDP socket
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 服务器地址
# 获取服务端主机与端口,可在设备管理->产品->产品概况中查看,如果是域名,可在本地ping一下获得IP
host = "180.109.255.252"
# 设置端口与服务器端一致
port = 5683
server_address = (host, port)

# 发送登录消息
payload = "40020001B1740172112A3D0565703d323334353132333435343332313233"
client.sendto(binascii.unhexlify(payload), server_address)

# 接收回应
response = binascii.hexlify(client.recv(1024)).decode("utf-8")
print(f"Received response: {response}")

# 关闭socket
client.close()

注:如有上报数据,则需要将报文转换成十六进制,作为payload进行上报。

参考文献:https://www.yuque.com/zhaotuantuan/wukixo/bqtm84

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

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

相关文章

WDF驱动开发-I/O请求的处理(三)

创建框架请求对象 框架请求对象表示 I/O 管理器已发送到驱动程序的 I/O 请求。 基于框架的驱动程序通过调用 框架请求对象方法来处理每个 I/O 请求。 每个 I/O 请求都包含一个 WDM I/O 请求数据包 (IRP 结构) ,但基于框架的驱动程序通常不需要访问 IRP 结构。 大…

【AI大模型】Transformers大模型库(八):大模型微调之LoraConfig

目录 一、引言 二、LoraConfig配置参数 2.1 概述 2.2 LoraConfig参数说明 2.3 代码示例 三、总结 一、引言 这里的Transformers指的是huggingface开发的大模型库,为huggingface上数以万计的预训练大模型提供预测、训练等服务。 🤗 Transformers …

3.2 窗口滚动条

本节讲述窗口滚动条的简单使用方法。如果窗口客户区的内容太多,为了方便浏览窗口客户区的所有内容,就需要在创建窗口时添加窗口垂直或水平滚动条样式。窗口过程处理WM_CREATE消息时初始化滚动条的位置和滚动范围。窗口过程处理WM_VSCROLL或WM_HSCROLL消息…

讲透计算机网络知识(实战篇)01——计算机网络和协议

一、计算机网络和协议 1、网络和互联网络 1.1 网络、互联网、Internet 用交换机、集线器连接在一起的计算机构成一个网络。 用路由器连接多个网络,形成互联网。 全球最大的互联网:Internet。 1.2 网络举例 家庭互联网 图中的无线拨号路由器既是路由…

281 基于matlab的路径规划GUI交互

基于matlab的路径规划GUI交互。包括蚁量系统、蚁周系统、蚁密系统、蚁群系统、免疫混合算法。11种路径规划数据,最多225个规划点。蚁群和免疫算法的参数可进行设置,使得效果最佳。动态显示可视化规划结果。程序已调通,可直接运行。

防止Selenium被检测 Google Chrome 125

背景 最近在使用selenium自动播放学习课程,相信大家也有一些类似的使用场景。 能自动化的事情,绝不自己干。 为防止被检测是机器人做题,刷视频,需要做一些小调整。 先来看作为服务方维护者,是如何检测是Selenium打…

8.transformers量化

Transformers 核心设计Auto Classes Transformers Auto Classes 设计:统一接口、自动检索 AutoClasses 旨在通过全局统一的接口 from_pretrained() ,实现基于名称(路径)自动检索预训练权重(模 型)、配置文件、词汇表等所有与模型相关的抽象。 灵活扩展的配置AutoConfig…

uniapp地图自定义文字和图标

这是我的结构&#xff1a; <map classmap id"map" :latitude"latitude" :longitude"longitude" markertap"handleMarkerClick" :show-location"true" :markers"covers" /> 记住别忘了在data中定义变量…

pip 配置缓存路径

在windows操作平台&#xff0c;默认情况&#xff0c;pip下使用的系统目录 C:\Users\用名名称\AppData\Local\pip C盘是系统盘&#xff0c;如果常常使用pip安装会占用大量的空间很快就满&#xff0c;这时候就有必要变更一下缓存保存路径了。 pip 配置缓存路径&#xff1a; Win…

【NoSQL数据库】Redis Cluster集群(含redis集群扩容脚本)

Redis Cluster集群 Redis ClusterRedis 分布式扩展之 Redis Cluster 方案功能数据如何进行存储 redis 集群架构集群伸缩向集群中添加一个新的master节点&#xff0c;并向其中存储 num10 .脚本对redis集群扩容缩容&#xff0c;脚本参数为redis集群&#xff0c;固定从6001移动200…

创建第一个Springboot项目HelloWorld

目录 一、准备工作 一、创建springboot项目 三、使用git上传到代码仓库gitee 四、git使用过程问题总结 一、准备工作 安装jdk&#xff1a;8u201&#xff08;可以使用高一点的版本&#xff09; jdk所有版本下载&#xff1a;Java Archive | Oracle 安装maven&#xff1a;不用…

Kafka生产者消息发送流程原理及源码分析

Kafka是一个分布式流处理平台,它能够以极高的吞吐量处理数据。在Kafka中,生产者负责将消息发送到Kafka集群,而消费者则负责从Kafka集群中读取消息。本文将探讨Kafka生产者消息发送流程的细节,包括消息的序列化、分区分配、记录提交等关键步骤。 先看一个生产者发送消息的代…

【五】Linux软件仓库Yum源--SSH远程控制--SCP远程传输

RPM&#xff08;红帽软件包管理器&#xff09; RPM建立统一的数据库文件&#xff0c;记录软件信息并分析依赖关系。目前RPM的优势已经被公众所认可&#xff0c;使用范围也已不局限在红帽系统中了。常见RPM命令如下&#xff1a; 安装软件 rpm -ivh file…

数据结构(DS)学习笔记(二):数据类型与抽象数据类型

参考教材&#xff1a;数据结构C语言版&#xff08;严蔚敏&#xff0c;杨伟民编著&#xff09; 工具&#xff1a;XMind、幕布、公式编译器 正在备考&#xff0c;结合自身空闲时间&#xff0c;不定时更新&#xff0c;会在里面加入一些真题帮助理解数据结构 目录 1.1数据…

【DevOps】 什么是容器 - 一种全新的软件部署方式

目录 引言 一、什么是容器 二、容器的工作原理 三、容器的主要特性 四、容器技术带来的变革 五、容器技术的主要应用场景 六、容器技术的主要挑战 七、容器技术的发展趋势 引言 在过去的几十年里,软件行业经历了飞速的发展。从最初的大型机时代,到后来的个人电脑时代,…

neo4j 3.5.5版本创建新的数据库

neo4j 3.5.5版本创建新的数据库 1.找到neo4j的conf文件 点进去 2.点击neo4j.conf 选择记事本打开 3.把graph.db换成自己想要创建的数据库名称 4.打开neo4j服务 出现新的数据库

信息系统项目管理师0151:输出(9项目范围管理—9.4收集需求—9.4.3输出)

点击查看专栏目录 文章目录 9.4.3 输出9.4.3 输出 需求文件 需求文件描述各种单一需求将如何满足项目相关的业务需求。一开始可能只有高层级的需求,然后随着有关需求信息的增加而逐步细化。只有明确的(可测量和可测试的)、可跟踪的、完整的、相互协调的,且主要干系人愿意认…

FreeRTOS学习笔记-基于stm32(14)内存管理

一、FreeRTOS 内存管理简介 FreeRTOS有两种方法来创建任务&#xff0c;队列&#xff0c;信号量等&#xff0c;一种动态一种静态。静态方法需要手动定义任务堆栈。使用动态内存管理的时候 FreeRTOS 内核在创建任务、队列、信号量的时候会动态的申请 RAM。 我们在移植FreeRTOS时可…

采用java+springboot+vue+uniapp自主研发的智慧城管源码,城管综合执法平台源代码

智慧城管执法平台源码&#xff0c;PCAPP端全套源码&#xff0c;城管综合执法系统源码。 智慧城管系统拥有自主版权&#xff0c;项目落地案例&#xff0c;有演示&#xff0c;适合二次开发项目使用。 智慧城管执法系统旨在提高城市管理效率&#xff0c;涵盖了城市管理中的很多业务…

RabbitMQ从入门到入土

同步与异步 同步调用 优势&#xff1a; 时效性强&#xff0c;等到结果后就返回 问题&#xff1a; 扩展性差 性能下降 级联失败问题 异步调用 优势&#xff1a; 耦合度低&#xff0c;扩展性强 无需等待&#xff0c;性能好 故障隔离&#xff0c;下游服务故障不影响上游 缓…