基于 iAP2 协议 的指令协议,用于对安防设备的 MCU 进行操作
协议设计目标
1. 安全性:通过 iAP2 协议与 MCU 设备进行安全通信。
2. 通用性:支持对安防设备的常见功能进行操作,如状态查询、设备控制、参数配置等。
3. 高效性:数据结构简洁清晰,易于解析和扩展。
4. 扩展性:支持新指令和功能的快速集成。
协议框架设计
协议结构划分为以下几部分:
• 固定消息头:用于标识合法数据包。
• 协议版本号:支持版本管理。
• 设备标识:用于区分多个设备。
• 指令类型:分门别类标识操作。
• 指令编号:具体功能指令。
• 数据区长度:标识数据区大小。
• 数据区(可变):实际的指令参数。
• 校验字段:用于验证数据完整性。
- 数据包结构
- 指令类型和指令编号
指令类型(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-10)
0x02 设置工作模式 模式值(0:关闭,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
- 数据校验
为了确保数据完整性,使用校验字段进行校验。可以采用 简单的 XOR 校验 或 CRC 校验。
校验码计算:
func calculateChecksum(for data: [UInt8]) -> UInt8 {
return data.reduce(0) { $0 ^ $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 的安防设备控制,确保通信可靠性和扩展性。