UDP协议在物联网中的实战

一、UDP协议介绍

UDP(User Datagram Protocol, 用户数据报协议),无连接的传输层协议,提供面向事务的简单不可靠信息传输服务。强调传输性能而不是传输完整性,多用于视频和多媒体应用。

2.1 报文格式

在这里插入图片描述

2.2 协议特点

  • 无连接
  • 不可靠传输:消息尽力传播,但不关注是否传输过去
  • 面向数据报:以数据报为传输的基本单位,不拆分、不合并、原样发送
  • 全双工:一条路径双向通信,既能读,也能写
  • 大小受限:UDP协议首部有2个字节,16位的长度内容,限制了UDP传输数据最大长度为64K(含UDP首部)
  • 缓冲区:UDP只有接收缓冲区,没有发送缓冲区

二、物联网中实战

不同物联网平台对协议中所承载的业务内容均有自己的规范,但原理基本一致,本文基于中国电信AIoT物联网平台进行实战。

2.1 在物联网平台创建产品设备

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

重点关注:

  • 创建产品时,通信协议选择UDP
  • 创建产品时,“是否透传”,选择透传或者物模型,将对应不同的上下行报文格式。透传:平台对报文不进行解析,将报文透传给应用或终端;物模型:按照在平台定义的服务与属性,对上下行报文进行解析。(https://img-blog.csdnimg.cn/direct/d73abe3f1bf04acbada68b35c964bd3f.jpeg)
    在这里插入图片描述

2.2 交互流程

设备登录

在这里插入图片描述

  1. 用户在通用组件服务添加设备,填写设备编号。通用组件服务生成device ID和特征串。device ID由产品ID和设备编号拼接生成。设备初始状态为:已注册。

  2. 设备携带deviceId、password(平台生成的特征串)登录到平台

  3. 平台对设备进行认证,并将认证结果返回给设备。认证成功后,设备状态为:已激活、在线。

心跳保活
在这里插入图片描述

  1. 平台默认心跳周期为5分钟,心跳超时之前,设备需要发送心跳报文到平台用于会话的延长。超时而没有发送心跳报文的,平台将删除会话。

数据上报
在这里插入图片描述

  1. 设备以0x04消息类型上报数据,平台解析后会以0x84回复响应结果。

下行指令
在这里插入图片描述

设备登出
在这里插入图片描述
3. 设备登出需要发送登出请求,携带deviceId,平台收到请求后删除会话,并向设备发送登出响应。设备状态更新为:下线。

2.3 报文格式(下文转自官方手册)

消息格式

应用层数据报文以1个字节的类型字段作为分割,平台支持登录、心跳、上下行业务数据、登出等消息类型。消息携带的参数必须包含两个字节的参数长度。

UDP报文Payload包含三部分内容:

消息类型(1 BYTE)消息ID(2 BYTE)、消息内容(n BYTE)。

消息类型

消息ID

消息内容

 

定义8种消息类型:

消息类型

类型描述

0x01

登录请求

0x02

心跳

0x03

登出请求

0x04

上行数据

0x05

下行数据

0x81

登录响应

0x82

心跳响应

0x83

登出响应

0x84

上行数据响应

0x85

下行数据响应

 

登录消息

类型描述

消息类型

消息ID

消息内容格式

备注

登录请求

0x01

设备生成,2个字节

[deviceId_length (2字节)]+[deviceId]

+[password_length(2字节)]+[password]

+[version_length(2字节)]+[version]

deviceId由产品Id和设备编号拼接而成的字符串;version默认填写为1.0

登录响应

0x81

与请求报文一致。

结果码(1字节)

登录结果:

0 成功

1 未知错误

2 设备不存在

3 设备认证失败

心跳消息

类型描述

消息类型

消息ID

消息内容格式

备注

心跳请求

0x02

设备生成,2个字节

[deviceId_length (2字节)]+[deviceId]

终端与平台心跳周期暂定5分钟;

心跳响应

0x82

与请求报文一致。

结果码(1字节)

心跳结果:

0 成功

1 设备id错误或设备不在线


业务数据

透传

类型描述

消息类型

消息ID

消息内容格式

备注

上行数据

0x04

设备生成,2个字节

[deviceId_length (2字节)] +[deviceId]

+[data_length (2字节)] +[data]

data_length字段不可为0

上行数据响应

0x84

与请求报文一致。

结果码(1字节)

上报结果:

0 成功

1 设备id错误或设备不在线

下行数据

0x05

平台生成,2个字节(taskId)

[data_length (2字节)]

+[data]


下行数据响应

0x85

与请求报文一致。(taskId)

结果码(1字节)+[data_length (2字节)]

+[data]

指令执行结果码:

0 成功

1 失败

data_length字段可设置为0

 

非透传

类型描述

消息类型

消息ID

消息内容格式

备注

上行数据

0x04

设备生成,2个字节

[deviceId_length (2字节)] +[deviceId]

+[data_length (2字节)] +[serviceId (2字节)] +[params]

data_length为serviceId字段与 params字段的总长度

上行数据响应

0x84

与请求报文一致。

结果码(1字节)

上报结果:

0 成功

1 设备id错误或设备不在线

下行数据

0x05

平台生成,2个字节(taskId)

[data_length (2字节)]

+[serviceId (2字节)] +[params]

data_length为serviceId字段与 params字段的总长度

下行数据响应

0x85

与请求报文一致。(taskId)

结果码(1字节)+[data_length (2字节)]

+[serviceId (2字节)] +[params]

指令执行结果码:

0 成功

1 失败

data_length字段可设置为0

data_length为serviceId字段与 params字段的总长度


1. 上行数据

物模型如下:

服务类型

服务标识

服务ID

属性顺序

属性标识符

属性类型

属性长度

数据上报

up

1

1

seq

无符号整型

2




2

data1

定长字符串

5




3

data2

变长字符串

/


2. 下行数据

物模型如下:

服务类型

服务标识

服务ID

参数顺序

参数标识符

参数类型

参数长度

指令下发

dn

8001

1

cmd

定长字符串

5

指令下发响应

rsp

9001

1

time

定长字符串

5

2.4 代码

2.4.1 代码总体框架

每一次进行业务交互,主要是对client.sendto(payload, server_address)payload部分和client.recvfrom(1024)的内容进行编辑与解析。

import socket

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

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

# 发送消息
# client.sendto(payload, server_address)

# 接收回应
# response, server_address = client.recvfrom(1024)
# print(f"Received response: {response}")

# 关闭socket
client_socket.close()

2.4.1 UDP透传设备

2.4.1.1. 登录

1.登录报文

消息格式:[deviceId_length (2字节)]+[deviceId]+[password_length(2字节)]+[password]+[version_length(2字节)]+[version]

注:字符串转十六进制可用在线工具:https://www.sojson.com/hexadecimal.html,也可以直接使用python中的bytes(data, "utf-8").hex()方式。


deviceId:200020722

password:7Sfv-b_HDbLDyJ_K-0SkWqRGd-GE-b3rZp-upOr1kSU

version:1.0

登录请求编码为(16进制):

• 登录报文消息类型:0x01

• 消息Id:0x0001

• deviceId_length:0x0009

• deviceId:0x323030303230373232

• password_length:0x002b

• password:0x382D45654D57466134364D5952566C4149683557393967714E35395A5571565A34487653634C7A50456259

• version_length:0x0003

• version:0x312e30

登录请求的完整报文为:01 0001 0009 323030303230373232 002B 382D45654D57466134364D5952566C4149683557393967714E35395A5571565A34487653634C7A50456259 0003 312E30

2. 登录代码全貌

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

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

# 发送消息
payload = "0100010009323030303230373232002B382D45654D57466134364D5952566C4149683557393967714E35395A5571565A34487653634C7A504562590003312E30"
client.sendto(binascii.unhexlify(payload), server_address)

# 接收回应

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

# 关闭socket
client.close()

根据平台定义的登录响应格式,TCP模拟器收到“050000”的报文,则登录成功,在物联网平台可查看设备状态也应该为在线。

2.4.1.2 数据上报

1.上报报文

消息格式:0x02 +数据长度(2字节) +业务数据

deviceId:200020722

1. 上行业务数据:"hello"

上行数据编码为(16进制):

• 上行数据消息类型:0x04

• 消息Id:0x0004

• deviceId_length:0x0009

• deviceId:0x323030303230373232

• data_length:0x0005

• data:0x68656c6c6f

上行数据的完整报文为:04 0004 0009 323030303230373232 0005 68656c6c6f

2. 上行代码全貌
根据业务规则,设备需先登录,才能进行数据上报。

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

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

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

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

# 发送上报消息
payload2 = "0400040009323030303230373232000568656c6c6f"
client.sendto(binascii.unhexlify(payload2), server_address)
# 接收回应
response2 = binascii.hexlify(client.recv(1024)).decode("utf-8")
print(f"Received response: {response2}")

# 关闭socket
client.close()

经过登录和上行报文的实战,有没有发现UDP协议在物联网领域中,实质是将业务数据封装在了UDP报文的data部分。data部分按照业务规则进行”拼接“即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LangChain开发【NL2SQL】应用(few-shot优化)

前言 之前发布的博客LangGraph开发Agent智能体应用【NL2SQL】-CSDN博客,留了一个问题,对于相对复杂的sql(leetcode中等难度的sql题),gpt4o就力不从心了。这篇文章来讲一下优化 什么是few-shot 使用这些少量的、调整…

MI-SegNet: 基于互信息的超越领域泛化的超声图像分割

文章目录 MI-SegNet: Mutual Information-Based US Segmentation for Unseen Domain Generalization摘要方法实验结果 MI-SegNet: Mutual Information-Based US Segmentation for Unseen Domain Generalization 摘要 针对医学图像分割在不同领域间泛化能力有限的问题,特别是针…

【uniapp】带圆角渐变边框实现

1. 效果图 2. 代码实现 <image class"item-left-img" :src"url" mode"aspectFill" />.item-left-img {width: 240rpx;height: 320rpx;border: 6rpx solid transparent;background-clip: padding-box, border-box;background-origin: padd…

Magnet pro for mac v2.14.0中文激活版:高效窗口管理工具

Magnet for Mac是一款专为Mac用户设计的窗口管理工具&#xff0c;旨在帮助用户更高效地管理和布局多个应用程序窗口&#xff0c;提升工作效率。 Magnet pro for mac v2.14.0中文激活版下载 这款软件拥有直观易用的界面和丰富的功能&#xff0c;支持用户将屏幕分割成多个区域&a…

浅浅写一个Word、PowerPoint、Excel文档转PDF工具

前言 最近在搞知识库&#xff0c;需要把各种 Word、PowerPoint、Excel 文件转换成 PDF 文件&#xff0c;不然 Word 中的表格中的文字提取会出现一些问题&#xff1b;使用 Office 或者 WPS 将大量文件转换成 PDF 需要频繁重复打开文件&#xff0c;点击保存为PDF&#xff0c;然后…

yg校园易购电商系统(Go+Vue)

校园易购二手平台系统 GitHub项目地址&#xff1a;https://github.com/xzhHas/yg 文章目录 校园易购二手平台系统一、技术栈简介二、快速开始1、安装本系统使用到的插件&#xff0c;这里推荐使用docker安装&#xff0c;此操作皆在ubuntu系统下操作&#xff0c;如果是其他系统只…

5. MySQL 运算符和函数

文章目录 【 1. 算术运算符 】【 2. 逻辑运算符 】2.1 逻辑非 (NOT 或者 !)2.2 逻辑与运算符 (AND 或者 &&)2.3 逻辑或 (OR 或者 ||)2.4 异或运算 (XOR) 【 3. 比较运算符 】3.1 等于 3.2 安全等于运算符 <>3.3 不等于运算符 (<> 或者 !)3.4 小于等于运算符…

NXdfefefef

prototype&#xff1a;原型 CORS(Cross-Origin Resource Sharing):跨资源共享 Interceptor&#xff1a;拦截器 BOM&#xff1a;Browser Object Module(浏览器对象模型) Ajax(Asynchronous Javascript And XML)&#xff1a;异步的JavaScript和XML&#xff0c;Ajax其实就是浏览器…

Next.js Tailwind CSS UI组件

摘要&#xff1a; 官网 今天公司使用到一个前端ui框架——Next.js Tailwind CSS UI组件&#xff01;这从头构建一个AI驱动的前端UI组件生成器&#xff0c;生成Next.js Tailwind CSS UI组件&#xff1a; 1、用Next.js、ts和Tailwind CSS构建UI组件生成器Web应用程序。 2、用Copi…

从云端到终端:青犀视频汇聚/融合平台的视频接入方式与场景应用

一、青犀视频汇聚/融合平台 由TSINGSEE青犀视频研发的EasyCVR智能融合/视频汇聚平台基于“云-边-端”一体化架构&#xff0c;支持视频汇聚、融合管理&#xff0c;兼容多协议&#xff08;GA/T1400/GB28181/Onvif/RTSP/RTMP/海康SDK/Ehome/大华SDK/宇视SDK等&#xff09;、多类型…

床上用品消费新趋势,沃尔玛跨境卖家应关注哪些要点?

在当前的市场环境下&#xff0c;床上用品消费呈现出了一系列新趋势&#xff0c;这对于美国沃尔玛跨境卖家而言&#xff0c;既是挑战也是机遇。床上用品消费的新趋势为美国沃尔玛跨境卖家带来了诸多启示。 从当前的市场动态中&#xff0c;我们可以提炼出以下几个关键的要点&…

鸿蒙轻内核M核源码分析系列十七(2) 异常钩子函数的注册操作

本文中所涉及的源码&#xff0c;以OpenHarmony LiteOS-M内核为例&#xff0c;均可以在开源站点https://gitee.com/openharmony/kernel_liteos_m 获取。鸿蒙轻内核异常钩子模块代码主要在components\exchook目录下。异常钩子函数的注册、解注册、异常钩子类型定义在utils\los_de…

PaddleSpeech MFA:阿米娅中文音色复刻计划

PaddleSpeech&#xff1a;阿米娅中文音色复刻计划 本篇项目是对iterhui大佬项目[PaddleSpeech 原神] 音色克隆之胡桃的复刻&#xff0c;使用的PaddleSpeech的版本较新&#xff0c;也针对新版本的PaddleSpeech做了许多配置之上的更新并加入了自己对语音的对齐、配置、训练其它任…

Javascript全解(基础篇)

语法与数据类型 语法 var\let\const var 声明一个变量&#xff0c;可选初始化一个值。 let 声明一个块作用域的局部变量&#xff0c;可选初始化一个值。 const 声明一个块作用域的只读常量。 用 var 或 let 语句声明的变量&#xff0c;如果没有赋初始值&#xff0c;则其值为 …

毫米波雷达深度学习技术-1.6目标识别1

1.6 目标识别 利用检测和跟踪在距离、多普勒和角度这两个维度中的任意一个进行精确的目标定位后&#xff0c;将检测到的目标分类到所需的类别中。与检测类似&#xff0c;提出了多种框架来同时使用图像和点云进行目标分类。使用图像进行目标分类的最常见方法是从检测到的目标特征…

k8s:优雅关闭pod的简单例子

先通过Dockerfile创建一个image vim Dockerfie <<<< 内容如下&#xff1a; FROM centosRUN sed -i -e "s|mirrorlist|#mirrorlist|g" /etc/yum.repos.d/CentOS-* RUN sed -i -e "s|#baseurlhttp://mirror.centos.org|baseurlhttp://vault.centos.o…

不要当网管,网管得会静态路由和路由表

1、路由表 路由表的组成 路由表由多个路由条目组成&#xff0c;每个条目通常包含以下信息&#xff1a; 目的地网络&#xff08;Destination Network&#xff09;&#xff1a; 这是数据包要到达的目标网络地址&#xff0c;通常以CIDR&#xff08;无类别域间路由&#xff09;格…

centos系统清理docker日志文件

centos系统清理docker日志文件 1.查看docker根目录位置2.清理日志 1.查看docker根目录位置 命令&#xff1a;docker info ,将Docker Root Dir 的值复制下来。如果目录中包含 等特殊符号的目录&#xff0c;需要转义 2.清理日志 创建文件&#xff1a;vim docker_logs_clean.…

Nvidia/算能 +FPGA+AI大算力边缘计算盒子:自动清理机器

总部位于硅谷的 ViaBot 正在为用于企业的机器人进行试行测试。 2016 年&#xff0c;Gregg Ratanaphanyarat 和 Dawei Ding从宾州州立大学辍学后&#xff0c;创办了一家户外清洁机器人初创公司。 如今&#xff0c;这场赌博似乎正在取得回报。二人的初创公司 ViaBot 正在与一家…

python免安装版本使用方法(win环境下)

文章目录 需求背景python下载下载免安装版本下载pip安装 参考文章&#xff1a;https://blog.csdn.net/u010835747/article/details/123731542 需求背景 在同一业务多种不同的单机需求中&#xff0c;存在业务地单一电脑运行多个不同开发人员制作的python脚本&#xff0c;但是由…