基于 iAP2 协议 的指令协议,用于对安防设备的 MCU 进行操作

news2025/2/26 14:46:30

协议设计目标
1. 安全性:通过 iAP2 协议与 MCU 设备进行安全通信。
2. 通用性:支持对安防设备的常见功能进行操作,如状态查询、设备控制、参数配置等。
3. 高效性:数据结构简洁清晰,易于解析和扩展。
4. 扩展性:支持新指令和功能的快速集成。

协议框架设计

协议结构划分为以下几部分:
• 固定消息头:用于标识合法数据包。
• 协议版本号:支持版本管理。
• 设备标识:用于区分多个设备。
• 指令类型:分门别类标识操作。
• 指令编号:具体功能指令。
• 数据区长度:标识数据区大小。
• 数据区(可变):实际的指令参数。
• 校验字段:用于验证数据完整性。

  1. 数据包结构

在这里插入图片描述

  1. 指令类型和指令编号

指令类型(commandType):

commandType	描述
0x01	系统指令(重启、查询状态)
0x02	网络配置(Wi-Fi 配置等)
0x03	设备控制(门禁、警报等)
0x04	参数配置(灵敏度、模式等)

指令编号(commandID):
每种指令类型下定义具体的功能指令。
• 系统指令(commandType = 0x01)

commandID	描述	数据区内容
0x01	查询设备状态	无数据区
0x02	重启设备	无数据区
•	网络配置(commandType = 0x02)
commandID	描述	数据区内容
0x01	配置 Wi-Fi	SSID + 密码
0x02	查询网络状态	无数据区
•	设备控制(commandType = 0x03)
commandID	描述	数据区内容
0x01	开启警报	无数据区
0x02	停止警报	无数据区
0x03	开门	门锁 ID
•	参数配置(commandType = 0x04)
commandID	描述	数据区内容
0x01	设置灵敏度	灵敏度值(1-100x02	设置工作模式	模式值(0:关闭,1:开启)
  1. 数据包示例

示例 1:查询设备状态
• 协议头:0xAA55AA55
• 协议版本:0x01
• 设备 ID:0x00000001
• 指令类型:0x01(系统指令)
• 指令编号:0x01(查询设备状态)
• 数据区长度:0x0000(无数据区)
• 校验码:计算所得

完整数据包

AA 55 AA 55 01 00 00 00 01 01 01 00 00 02

示例 2:配置 Wi-Fi
• 协议头:0xAA55AA55
• 协议版本:0x01
• 设备 ID:0x00000001
• 指令类型:0x02(网络配置)
• 指令编号:0x01(配置 Wi-Fi)
• 数据区长度:0x0016(22 字节)
• 数据区内容:
• SSID: MyWiFi -> 6D 79 57 69 46 69
• 密码: 12345678 -> 31 32 33 34 35 36 37 38
• 校验码:计算所得

完整数据包:

AA 55 AA 55 01 00 00 00 01 02 01 00 16 6D 79 57 69 46 69 31 32 33 34 35 36 37 38 A5

示例 3:开启警报
• 协议头:0xAA55AA55
• 协议版本:0x01
• 设备 ID:0x00000001
• 指令类型:0x03(设备控制)
• 指令编号:0x01(开启警报)
• 数据区长度:0x0000(无数据区)
• 校验码:计算所得

完整数据包:

AA 55 AA 55 01 00 00 00 01 03 01 00 00 A8
  1. 数据校验

为了确保数据完整性,使用校验字段进行校验。可以采用 简单的 XOR 校验 或 CRC 校验。

校验码计算:

func calculateChecksum(for data: [UInt8]) -> UInt8 {
    return data.reduce(0) { $0 ^ $1 }
}
  1. iAP2 数据传输

通过 iAP2 协议的 EASession,利用输入输出流进行数据传输。

数据发送:

func sendCommand(to session: EASession, commandData: Data) {
    guard let outputStream = session.outputStream else { return }
    outputStream.open()
    let bytesWritten = commandData.withUnsafeBytes {
        outputStream.write($0.bindMemory(to: UInt8.self).baseAddress!, maxLength: commandData.count)
    }
    print("Bytes written: \(bytesWritten)")
}

数据接收:


func receiveData(from session: EASession) -> Data? {
    guard let inputStream = session.inputStream else { return nil }
    inputStream.open()
    var buffer = [UInt8](repeating: 0, count: 1024)
    let bytesRead = inputStream.read(&buffer, maxLength: buffer.count)
    if bytesRead > 0 {
        return Data(buffer.prefix(bytesRead))
    }
    return nil
}

总结
1. 协议设计:
• 数据包包含 头部、指令类型、数据区 和 校验字段,易于解析和扩展。
2. 数据传输:
• 通过 EASession 的输入输出流,与 MCU 设备通信。
3. 灵活性:
• 协议支持 设备控制、网络配置 和 参数设置 等常见功能,可根据业务需求扩展。

这套协议适用于基于 iAP2 的安防设备控制,确保通信可靠性和扩展性。

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

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

相关文章

Type-C单口便携屏LDR6021

随着科技的飞速发展,便携式电子产品在我们的日常生活中扮演着越来越重要的角色。在这一背景下,Type-C单口便携显示器作为一种新兴的显示设备,凭借其独特的优势迅速崭露头角,成为市场的新宠。本文将深入探讨Type-C单口便携显示器的…

Ubuntu 20.04 卸载和安装 MySQL8.0

卸载 首先,检查一下系统安装的软件包有哪些,使用dpkg -l | grep mysql命令: 为了将MySQL卸载干净,这些文件都需要被删除。 在Ubuntu20.04系统下,卸载干净MySQL8.0以确保下一次安装不会出错,可以按照以下…

NOTEBOOK_11 汽车电子设备分享(工作经验)

汽车电子设备分享 摘要 本文主要列出汽车电子应用的一些实验设备和生产设备,部分会给予一定推荐。目录 摘要一、通用工具:二、测量与测试仪器2.1测量仪器2.2无线通讯测量仪器2.3元器件测试仪2.4安规测试仪2.5电源供应器2.6电磁兼容测试设备2.7可靠性环境…

黑马Java面试教程_P8_并发编程

系列博客目录 文章目录 系列博客目录前言1.线程的基础知识1.1 线程和进程的区别?难2频3面试文稿 1.2 并行和并发有什么区别? 难1频1面试文稿 1.3 创建线程的四种方式 难2频4面试文稿 1.4 runnable 和 callable 有什么区别 难2频3面试文稿 1.5 线程的 run…

【活动邀请·深圳】深圳COC社区 深圳 AWS UG 2024 re:Invent re:Cap

re:Invent 是全球云计算领域的顶级盛会,每年都会吸引来自世界各地的技术领袖、创新者和实践者汇聚一堂,分享最新的技术成果和创新实践,深圳 UG 作为亚马逊云科技技术社区的重要组成部分,将借助 re:Invent 的东风,举办此…

一起学Git【第二节:创建版本库】

创建库 这个库相当于一个目录,目录中的文件都被Git管理,会记录每个文件的修改删除和添加工作,便于之后随时跟踪历史记录还原到之前的某一版本。如何创建库呢?有两种方式,本地创建库和云端克隆一个库。 1.本地创建库 …

本地部署webrtc应用怎么把http协议改成https协议?

环境: WSL2 Ubuntu22.04 webrtc视频聊天应用 问题描述: 本地部署webrtc应用怎么把http协议改成https协议? http协议在安卓手机浏览器上用不了麦克风本,来地应用webrtc 本来是http协议,在安卓手机上浏览器不支持使…

web实操8-cookie

会话技术 会话: 一次会话中包含多次请求和响应。 客户端浏览器访问服务器的资源,只要客户端或者服务器端不关闭,这始终在一次会话范围内,这一次会话范围内可以包含多次请求并且收到多次相应。 一次会话:浏览器第一…

vue2 - Day03 - (生命周期、组件、组件通信)

文章目录 一、生命周期1. 创建阶段2. 挂载阶段3. 更新阶段4. 销毁阶段5. 错误捕获总结 二、组件2.1 注册1. 全局注册 - 公共的组件。2. 局部注册总结 2.2 三大重要的组成部分1. 模板 (Template)主要功能:说明: 2. 脚本 (Script)主要功能:说明…

java日常工作开发高并发问题

前言 本篇文章将是以工作中经常遇到的问题,和面试中经常遇到的java问题进行描写。内容包括微服架构,java并发编程以及相应的中间件的高级知识。本文所有的问题都在描述多线程编程的高级知识。 一. 面试题 1.Sychronized和ReentrantLock有哪些不同点? …

【Python】【数据分析】深入探索 Python 数据可视化:Matplotlib 绘图库完整教程

目录 引言一、什么是 Matplotlib?1.1 Matplotlib 的安装1.2 Matplotlib 的基本功能 二、Matplotlib 的基础绘图2.1 绘制折线图2.2 绘制柱状图2.3 绘制散点图2.4 绘制饼图 三、高级功能与定制3.1 设置图表样式3.2 使用子图3.3 保存图表 四、Matplotlib 流程图4.1 Mer…

【代码随想录|动态规划背包问题】

一、背包问题分类 01背包:n种物品,每种物品只有一个 完全背包:n种物品,每种物品有无限个 多重背包:n种物品,每种物品的个数各不相同 二、01背包问题三道题 卡码网46题.携带研究材料(二维背包…

第1章 命题逻辑

2024年12月22日 一稿 1.1 现代逻辑学的基本研究方法 1.2 命题及其表示法 1.2.1 命题的概念 定义1.1 命题是一个可以判断真假的陈述句。 1.2.2 联结词 非 与 或 蕴含 等价 1.3 命题公式与语句形式化 1.3.1 命题公式的定义 1.3.2 公式的层次 1.3.3 语句形式化 1…

Unity-Editor扩展GUI基本实现一个可拖拉放的格子列表

短短几百行代码,好吧,又是“参考”了国外的月亮 操作,还真地挺自然的。。。。。。国外的实现有点小牛 拖拉,增加+ 一个Element 鼠标左键长按,可以出提示 鼠标右键,清除Element, 有点小bug,不是很自然地完全清除, using System.Collections; using System.Collecti…

解决vscode ssh远程连接服务器一直卡在下载 vscode server问题

目录 方法1:使用科学上网 方法2:手动下载 方法3 在使用vscode使用ssh远程连接服务器时,一直卡在下载"vscode 服务器"阶段,但MobaXterm可以正常连接服务器,大概率是网络问题,解决方法如下: 方…

重拾设计模式--外观模式

文章目录 外观模式(Facade Pattern)概述定义 外观模式UML图作用 外观模式的结构C 代码示例1C代码示例2总结 外观模式(Facade Pattern)概述 定义 外观模式是一种结构型设计模式,它为子系统中的一组接口提供了一个统一…

jvm栈帧结构

JVM(Java虚拟机)中的虚拟机栈是线程私有的,用于支持Java虚拟机进行方法调用和方法执行。而栈帧(Stack Frame)则是虚拟机栈的基本元素,每一个方法从调用开始至执行结束的整个过程,都对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。栈帧的内部结构主要包括以下几个部分:…

2009 ~ 2019 年 408【计算机网络】大题解析

2009 年 路由算法(9’) 讲解视频推荐:【BOK408真题讲解-2009年(催更就退网版)】 某网络拓扑如下图所示,路由器 R1 通过接口 E1 、E2 分别连接局域网 1 、局域网 2 ,通过接口 L0 连接路由器 R2 &…

Flamingo论文介绍:把视觉特征向语言模型看齐

今天介绍一篇经典的多模态论文,来自NeurIPS 2022的《Flamingo: a Visual Language Model for Few-Shot Learning》 ,论文地址:https://arxiv.org/pdf/2103.00020 文章目录 一、Motivate二、Method三、模块细节:Perceiver Resampl…

【VSCode】常用插件汇总

1 Path Autocomplete(路径提示的插件) 步骤一:在vscode的扩展搜索中直接搜索Path Autocomplete,直接安装 步骤二:配置 配置 VS Code settings.json "path-autocomplete.pathMappings": {"": &q…