原UShare协议
UShare连接Windows通信协议
=======================
|版本号|修改人|修改日期|备注|
|----|----|----|----|
|V1.0.0.0|陈熙|2018年8月21日|批注功能待补完|
# 1. 协议基础
## 1.1. 主体
- TCP/IP的Socket通信
## 1.2. 内存字节序
- 高位编址
## 1.3. 名词与缩写
|名词|解释|缩写|
|----|----|----|
|客户端||`C`|
|服务端||`S`|
|分割符||`\`|
# 2. 帧
## 2.1. 帧格式
|名称|类型|长度|描述|
|----|----|----|----|
|帧长度|字节|4|例:`0x00 00 00 01`(一个字长度)|
|帧内容|字节|N|见帧内容定义|
## 2.2. 帧内容
|名称|类型|长度|描述|
|----|----|----|----|
|帧类型|字节|1|见帧类型定义|
|实际内容|字节|n|不定长|
# 3. 帧类型
## 3.1 功能帧(0x0*)
|名称|定义|具体内容|
|----|----|----|
|0x01|基本信息帧|设备名+ip+port|
## 3.2 屏幕同步(0x1*)(独立一个Socket连接)
### 3.2.1 android同步到pc
- android:
|名称|定义|具体内容|
|----|----|----|
|0x10|请求传屏到pc||
|0x11|android端主动结束传屏||
- pc:
|名称|定义|具体内容|
|----|----|----|
|0x1D|pc端主动结束接收传屏||
|0x1E|允许android传屏到pc|ip+port(pc端接收传屏的端口)|
|0x1F|拒绝android传屏到pc||
### 3.2.2 pc同步到android
- android:
|名称|定义|具体内容|
|----|----|----|
|0x12|请求pc传屏到android|android端渲染view的高度int(4个Byte)|
|0x13|android端主动结束接收传屏||
- pc:
|名称|定义|具体内容|
|----|----|----|
|0x1A|pc端主动结束传屏||
|0x1B|允许传屏到android|ip+port(pc端发送传屏的服务器的端口)|
|0x1C|拒绝传屏到android||
### 3.2.3 视频帧内容
|名称|定义|具体内容|
|----|----|----|
|0x18|视频帧内容|帧类型(Byte)+H.264编码的视频帧数据|
## 3.3 文件上传与下载(0x2*)(独立一个Socket连接)
### 3.3.1 发送端
|名称|定义|具体内容|
|----|----|----|
|0x20|请求发送文件||
|0x21|所有文件发送开始|所有文件的文件路径(文件路径之间以`"\"`分割)|
|0x22|文件信息(单个文件发送开始)|文件路径(string)+`"\"`+文件字节数(string)|
|0x23|发送单个文件内容|文件路径字节长度+文件路径(string)+文件数据(ByteArray)|
|0x24|发送单个文件结束|文件路径(string)|
|0x25|所有文件发送结束||
### 3.3.2 接收端
|名称|定义|具体内容|
|----|----|----|
|0x2E|允许发送文件|ip(string)+port(string)|
|0x2F|拒绝发送文件||
### 3.3.3 打开文件
- 使用原有指令连接发送,若为图片则使用自定义的图片浏览器打开
|名称|定义|具体内容|
|----|----|----|
|0x26|打开指定文件|具体内容见3.3.3.1|
#### 3.3.3.1
|定义|首个字节|后续内容|
|----|----|----|
|打开图片|0x01|图片在已发送的图片列表中的index(int 4个字节)|
|打开其他类型文件|0x00|文件在已发送的文件列表中的index(int 4个字节)|
## 3.4 触控板(0x3*)(键盘相关待补完)
|名称|定义|具体内容|
|----|----|----|
|0x30|按钮点击|左键(0x01)或中键(0x02)或右键(0x03)+down(0x01)或release(0x02)|
|0x31|指针移动|指针x轴偏移量dx(4个Byte)+指针y轴偏移量dy(4个Byte)|
|0x32|button2(滚轮)滚动|滚轮滚动偏移量dy(4个Byte)|
|0x33|快捷键|切换当前窗口(0x01)关闭当前窗口(0x02)显示桌面(0x03)|
## 3.5 图片浏览器(0x4*)
- 1、开启批注后发送批注view的宽高给接收端
- 2、批注的坐标定位使用view的中心点偏移量(防止由于发送端接收端view的尺寸不一致引起批注位置偏移)
- 3、接收端收到批注的坐标后需要根据发送端的view的搞度与接收端view的高度对坐标进行换算
- 4、第3步中换算得出批注点在接收端相对view中心的点偏移量,还原出接收端批注点在接收端的实际坐标进行绘制
- 5、聚光灯的坐标也与批注点坐标进行相同的换算
### 3.5.1 批注相关
|名称|定义|具体内容|
|----|----|----|
|0x40|批注开关|0x01:开启,0x02:关闭|
|0x41|切换批注笔类型|0x01:普通笔 0x02:激光笔 0x03:橡皮擦|
|0x42|切换批注普通笔颜色|0x00蓝色 0x01黄色 0x02红色|
|0x43|修改批注普通笔宽度|0x00小 0x01中 0x02大|
|0x44|单点批注事件(包括普通笔(移动事件0x45),激光笔,橡皮擦)|见3.5.1.1|
|0x45|普通笔多点移动事件|见3.5.1.2|
|0x46|批注操作|清屏(0x01)或撤销(0x02)或恢复(0x03)|
#### 3.5.1.1 单点事件
- 依次有 Flag,Mode,EventType,TouchId,x,y 六个参数
|名称|定义|具体内容|
|----|----|----|
|Flag|声明这是批注事件|0x44|
|Mode|批注类型|0x01:普通笔 0x02:激光笔 0x03:橡皮擦|
|EventType|批注事件类型|0x01:`ACTION_DOWN`, 0x02:`ACTION_POINTER_DOWN`, 0x03:`ACTION_MOVE`, 0x04:`ACTION_POINTER_UP`, 0x05:`ACTION_UP`|
|TouchId|当前事件的touchId|Int值(4个Byte)|
|x|事件的x轴坐标点|Int值(4个Byte)|
|y|事件的y轴坐标点|Int值(4个Byte)|
#### 3.5.1.2 普通笔移动事件
- 依次有 Flag,Mode,EventType,MovePoints 四个参数
|名称|定义|具体内容|
|----|----|----|
|Flag|声明这是批注普通笔多点移动事件|0x45|
|Mode|批注类型|0x01:普通笔|
|EventType|事件类型|0x03:`ACTION_MOVE`|
|MovePoints|移动的点|每个点有事件id,x坐标,y坐标各4个字节共12个字节,每多1个点就增加12个字节(见3.5.1.3)|
#### 3.5.1.3 普通笔移动事件点
- 依次有 id,x,y 三个参数
|名称|定义|具体内容|
|----|----|----|
|id|对应的事件id|Int值(4个Byte)|
|x|事件x轴坐标|Int值(4个Byte)|
|y|事件y轴坐标|Int值(4个Byte)|
### 3.5.2 聚光灯相关
|名称|定义|具体内容|
|----|----|----|
|0x48|聚光灯开关|0x01:打开,0x02:关闭|
|0x49|更新聚光灯顶点坐标|index(1个Byte,左上0x00,右上0x01,左下0x02,右下0x03,整体0x05),坐标dx,dy(各4个Byte)|
### 3.5.3 图片旋转缩放事件
|名称|定义|具体内容|
|----|----|----|
|0x4C|图片缩放事件|缩放比例float(4个Byte) 缩放中心点x坐标与view的中心点x坐标偏差值float(4个Byte) 缩放中心点y坐标与view的中心点y坐标偏差值float(4个Byte)|
|0x4D|图片位移|x轴上的偏差值float(4个Byte) y轴上的偏差值float(4个Byte)|
|0x4E|图片旋转|旋转角度float(4个Byte) 旋转中心点为图片的中心点|
|0x4F|重置图片旋转与缩放||
### 3.5.4 图片浏览器退出,切换页指令
|名称|定义|具体内容|
|----|----|----|
|0x61|关闭图片浏览器||
|0x62|切换图片|目标图片在图片列表中的index(int 4个Byte)|
## 3.6 PPT演示(0x5*)
- android->pc
|名称|定义|具体内容|
|----|----|----|
|0x50|请求演示ppt||
|0x51|翻页|页码||
|0x52|点击下一步||
|0x53|请求批注||
|0x54|切换批注笔类型|0x01:普通笔 0x02:激光笔 0x03聚光灯|
|0x55|切换普通笔颜色|颜色hex值(string)|
|0x56|批注事件发送|事件类型(down:0x01,move:0x02,up:0x03),事件坐标点(xy各4个Byte)|
|0x57|聚光灯顶点坐标|左上角顶点坐标(xy各4个Byte),右下角顶点坐标(xy各4个Byte)|
|0x58|退出聚光灯||
|0x5C|退出演示||
- pc->android
|名称|定义|具体内容|
|----|----|----|
|0x5D|pc端退出演示||
|0x5E|当前有ppt启动,允许演示|ip(string)+port(string)用于android连接下载预览图片|
|0x5F|当没有ppt启动,拒绝演示||
## 3.7 PC传屏android的操作事件定义
### 3.7.1 鼠标事件
|名称|定义|具体内容|
|----|----|----|
|0x70|按钮点击|左键(0x01)或中键(0x02)或右键(0x03)+down(0x01)或release(0x02)|
|0x71|指针移动|指针x轴偏移量dx(4个Byte)+指针y轴偏移量dy(4个Byte)|
# 4. UDP广播
- pc端作为client发送广播,android作为server接收广播
- 广播内容为格式如下的String:“UBoardShare\设备名称\ip\port\连接密码”
- 未设置连接密码时内容为:“UBoardShare\设备名称\ip\port”