传屏协议
# 1. 协议基础
## 1.1. 主体
- TCP/IP的Socket通信(通过手动输入IP时连接端口为6688)
## 1.2. 内存字节序
- 高位编址
## 1.3. 名词与缩写
|名词|解释|缩写|
|----|----|----|
|客户端||`C`|
|服务端||`S`|
|分割符||`\`|
# 2. 帧
## 2.1. 帧格式
|名称|类型|长度|描述|
|----|----|----|----|
|帧长度|字节|4|例:`0x00 00 00 01`(一个字长度)|
|帧内容|字节|N|见帧内容定义|
## 2.2. 帧内容
|名称|类型|长度|描述|
|----|----|----|----|
|帧类型|字节|1|见帧类型定义|
|实际内容|字节|n|不定长|
# 3.指令帧类型
## 3.1 客户端---->服务器
|名称|定义|具体内容|
|-|-|-|
|请求连接|0x00|类型(0x00安卓,0x01windows,0x02 IOS)+验证码字节长(int)+验证码+名称字节长(int)+名称|
|请求投屏|0x01|类型(视频0x00,图片0x01,投屏0x02,音频0x03,文件传输0x04,触摸板0x05,屏幕同步0x06,直播0x07,屏幕拓展(windows)0x08),0xff(取消当前请求(例如:屏幕同步..等有取消的操作))|
|名称修改|0xfd|名称字节长(int)+名称|
|指令回应|0xfe|要求投屏0x01:0x01同意投屏;0xff拒绝投屏</br>屏幕同步0x02+宽(int)+高(int)|
|断开连接|0xff|0x00(主连接);0x01(投屏连接);断开触摸板0x02;断开屏幕同步0x03;|
|管理员回应|0xFA|0x01请求列表</br>0x02请求消息:请求状态(允许0x00,拒绝0xff)+GUID字节长(int)+GUID</br>0x03屏幕查看:(0x00关闭,0x01打开)+GUID字节长(int)+GUID</br>0x04踢人:GUID字节长(int)+GUID</br>0x05全部锁定:0x00锁定,0x01解锁</br>0x06屏幕广播:0x00关闭,0x01打开|
## 3.2服务器---->客户端
|名称|定义|具体内容|
|-|-|-|
|广播UDP,二维码信息(端口8866)||端口号+"/"+IP+"/"+连接码|
|要求投屏|0x01|端口号(int)|
|屏幕锁定(对管理员无效)|0x02|锁定0x00,解锁0x01|
|广播锁定(全员生效)|0x12|锁定0x00,解锁0x01|
|名称修改|0xfd|名称字节长(int)+名称|
|指令回应|0xfe|连接回应0x00:0x01连接成功+guid长度(int)+GUID(string)+设备名称长度(int)+设备名称(string)+类型(0x00安卓,0x01windows,0x02 IOS);0xff拒绝+原因字长度(int)+拒绝原因<br>投屏回应0x01:0x00可以投屏+类型(参照请求投屏)+端口号(int);0xff拒绝投屏+类型(参照请求投屏)+原因字长度(int)+拒绝原因(string)|
|断开连接|0xff|0x00(主连接)+断开原因的长度(int)+断开原因;</br>0x01(投屏连接)+类型(参照请求投屏)+断开原因的长度(int)+断开原因;</br>0x02断开触摸板+断开原因的长度(int)+断开原因;</br>0x03断开屏幕同步+断开原因的长度(int)+断开原因;|
|通知管理员|0xFA|0x00管理员设置:0x00取消,0x01设置;</br>0x01设备列表:(是否锁定:0x00是,0x01否,+ 是否投屏广播:0x00是,0x01否)+设备状态(无请求0x00,请求中0x01,投屏中0x02)+请求类型(参照请求投屏)+类型(0x00安卓,0x01windows,0x02 IOS)+名称字节长(int)+名称+GUID字节长(int)+GUID+...;</br>0x02请求消息:请求状态(请求中0x00,请求已处理0xff)+请求类型(参照请求投屏)+类型(0x00安卓,0x01windows,0x02 IOS)+名称字节长(int)+名称+GUID字节长(int)+GUID;</br>0x03屏幕查看:(0x00关闭,0x01打开,)+GUID字节长(int)+GUID</br>0x04踢人(断开连接):GUID字节长(int)+GUID</br>0x05全部锁定:0x00锁定,0x01解锁</br>0x06屏幕广播:0x00关闭,0x01打开</br>0x07设备添加:设备状态(无请求0x00,请求中0x01,投屏中0x02)+请求类型(参照请求投屏)+类型(0x00安卓,0x01windows,0x02 IOS)+名称字节长(int)+名称+GUID字节长(int)+GUID</br>0x08名称修改:名称字节长(int)+名称+GUID字节长(int)+GUID</br>|
# 4.视频流帧类型(独立的一个SOKCET连接)
## 4.1视频
### 4.1.1 客户端---->服务端(投屏广播)
| 代码 | 定义 | 具体内容 |
| ---- | -------- | -------- |
| 0xAA | 开始投屏 |安卓:0x00,windows:0x01,0x02 IOS,+宽(int)+高(int)|
| 0xAB | 切换编码模式(安卓)|编码:0x00,图片:0x01|
| 0xAC | 切换清晰度(安卓)|流畅:0x00,清晰:0x01,高清:0x02|
| 0xAD | 投屏数据|数据(data)|
| 0xA9 | 扩展屏数据(Window)|数据(data)|
| 0xAE | 投屏操作 |横屏0x02,竖屏0x03|
### 4.1.2 服务端---->客户端(投屏广播)
| 代码 | 定义 | 具体内容 |
| ---- | -------- | -------- |
| 0xAA | 开始投屏 |安卓:0x00,windows:0x01,0x02 IOS,+宽(int)+高(int)|
| 0xAB | 切换编码模式(安卓)|编码:0x00,图片:0x01|
| 0xAC | 切换清晰度|流畅:0x00,清晰:0x01,高清:0x02|
| 0xAD | 投屏数据|数据(data)|
| 0xAE | 投屏操作 |暂停:0x00,开始:0x01|
### 4.1.3 安卓---->windows
| 代码 | 定义 | 具体内容 |
| ---- | -------- | -------- |
| 0x10 | 触摸命令(屏幕同步) |X(int)+Y(int)+</br>类型((通用)0x00:左down,0x01:左up,0x04:双击</br>安卓: 0x02:右击,</br>windows:0x03:滚轮+(0x00上,0x01下) 0x05:移动,0x06:右down,0x07:右up)|
| 0x20 | 触摸命令(触摸板) | 移动:0x00 + X(int)+Y(int),左键down:0x01,左键up:0x04,右键:0x02,0x03:滚轮+(0x00上,0x01下)|
| 0x30 | 键盘文本输入| |
### 4.1.4 windows---->windows
| 代码 | 定义 | 具体内容 |
| ---- | -------- | -------- |
| 0x40 | windows键盘输入同步|(0x00:down,0x01:up )+键值(int)|
## 4.2 音视频图片操作命令
### 4.2.1 (PC->ANDROID OR ANDROID->PC)
| 代码 | 定义 | 具体内容 |
| ---- | -------- | -------- |
| 0x0A | 音视频操作 | 进度:0x00+时间(秒int)开始:0x01 暂停:0x02 |
| 0x0B | 声音大小 | 0~100 (int) |
| 0x0C | 图片切换 | 0~8(int) |
## 4.3 文件传输
### 4.3.1 发送端(PC->ANDROID OR ANDROID->PC)
| 代码 | 定义 | 具体内容 |
| ---- | -------------------------- | ------------------------------------------------------------- |
| 0x01 | 请求发送文件 |废弃,可以不发 |
| 0x02 | 所有文件发送开始 | 所有文件大小(long)+所有文件的文件名(文件路径之间以`"*"`分割) |
| 0x03 | 文件信息(单个文件发送开始) | 当前文件大小(long)+文件路径字节长度(int)+文件路径(string)+文件名包含后缀(string) |
| 0x04 | 发送单个文件内容 | 文件路径字节长度(int)+文件路径(string)+文件数据(ByteArray) |
| 0x05 | 发送单个文件结束 | 当前文件大小(long)+文件路径(string) |
| 0x06 | 所有文件发送结束 | 打开定义[打开文件的具体内容](#openfile) |
| 0x07 | 当前分片发送完成,等待服务端响应 ||
### 4.3.2 接收端(PC->ANDROID OR ANDROID->PC)
| 代码 | 定义 | 具体内容 |
| ---- | -------- | -------- |
| 0x21 | 文件接收结果响应 |(成功0x10,失败0x11)+类型(参照请求投屏)|
| 0x22 | 单个文件接收结果响应 |(成功0x10,失败0x11)+类型(参照请求投屏)|
| 0x23 | 当前内容接收完成响应,请求继续 ||
# 5.互动课堂
## 5.1 客户端
|代码|定义|内容|
|-|-|-|
|0xA0|回答响应|0x01:选择+题目数(int)+(当前题目序号(int)+当前答案数量(int)+答案序号(无答:0x00,A:0x01,B:0x02,C:0x03...))+(...)</br>0x02:判断+题目数(int)+当前题目序号(int)+答案序号(无答:0x00,0x01True,0x02False)+(...)</br>0x03:打分+答案序号(无答:0x00,1:0x01,2:0x02,3:0x03...10:0x0A)</br>0x04:抢答|
## 5.1 服务端
|代码|定义|内容|
|-|-|-|
|0xA0|开始互动课堂|0x01:选择+题目数(int)+选项数(int)+(0x00:单选,0x01多选)</br>0x02:判断+题目数(int)</br>0x03:打分(0x00:最高五分,0x01最高十分)</br>0x04:抢答+(0x00:未抢到,0x01抢到,0xff抢答开始)</br>0x05:随机挑人+(0x00:未选中,0x01选中)|
|0xAF|关闭互动课堂||