# UPBot 通信协议：

## 一、消息定义

|              | 消息头 | 消息体     | 校验 |
| ------------ | ------ | ---------- | ---- |
| 大小（字节） | 3      | N（0-255） | 1    |

#### 消息头定义

```c
struct head
{
    unsigned char flag;// 头部标记,固定帧头:0X5b
    unsigned char msg_id;// 消息ID,表示消息具体作用,决定消息体具体格式
    unsigned char length;// 消息体长度
}
```

|      | 帧头 | id               | 消息体长度 | 消息体   | 校验 |
| ---- | ---- | ---------------- | ---------- | -------- | ---- |
| 内容 | 0x5b | 0x01（命令类）   | 2字节      | 0-0xffff |      |
|      | 0x5b | 0x02  （配置类） |            |          |      |
|      |      |                  |            |          |      |

#### 二、命令类消息体含义

| 消息体数值 | 含义                 |
| ---------- | -------------------- |
| 0x00       | **启动机器人**       |
| 0x01       | 启动导航定位         |
| 0x02       | **启动全覆盖客户端** |
| 0x03       | 启动全覆盖服务端     |
| 0x04       | 启动摄像头和超声波   |
| 0x05       | 手持标签划定边界     |
| 0x06       | 手动控制机器人       |
| 0x07       | **返回充电**         |
| 0x08       | 停止割草             |
| 0x09       | 暂停割草             |
| 0x10       | **基站初始化**       |

启动机器人：0x5b,0x01,0x02,0x00,校验和

#### 三、配置类消息体含义

#### 3.1 基站配置类

| 配置类型 | 配置类型标识符 |
| -------- | -------------- |
| 坐标配置 | 0x00           |
| 频率配置 | 0x01           |
| 电源配置 | 0x02           |

###### 坐标配置类的数据格式如下：

**0x5b | 0x02 | xx | 0x00 | base_num(1 byte) | (float，float,float)  x base_num) | 校验位(1 byte)**

0x5b: 坐标配置类的特定标识符

0x02: 固定值，表示开始

xx: 消息体长度（动态计算）

0x00: 配置类型标识符

base_num: 基站数量，表示后续有多少组坐标数据

float: 每组基站的x, y, z坐标，分别为三个浮点数

校验位: 数据校验和

###### 频率配置类数据格式如下：

**0x5b | 0x02 | xx | 0x01 |float 频率 | 校验位(1 byte)**

###### 电源配置类数据格式如下：

**0x5b | 0x02 | xx | 0x02 |电源状态 0x00关闭 0x01开启 | 校验位(1 byte)**

#### 3.2 地图配置类

| 配置类型     | 配置类型标识符 |
| ------------ | -------------- |
| 地图编号配置 | 0x03           |
| 地图校准配置 | 0x04           |
| 虚拟墙配置   | 0x05           |

###### 地图编号配置：

**0x5b | 0x02 | xx | 0x03|消息体内容 | 校验位(1 byte)**

###### 地图校准配置：

**0x5b | 0x02 | xx | 0x04 |校准参数| 校验位(1 byte)**

校准参数：X轴偏移量（float）、Y轴偏移量(float)、旋转角度(float)

###### 虚拟墙配置：用户在地图上设置虚拟墙 ，限制割草机的移动范围，避免进入不想割草的区域。

**0x5b | 0x02 | xx | 0x05 |虚拟墙数量| 虚拟墙数据|校验位(1 byte)**

虚拟墙数据：每个虚拟墙包含起点和终点坐标，表示虚拟墙在地图上的位置和形状。

```python
# 通过socket获得数据
data = socket.get_data()

frame_head = data[0]

# 校验数据头
if(frame_head != 0x5b):
    print("frame error")
    return

data_id = data[1]

swtich data_id:
    case UPBOT_COMMAND:
        # 解析命令类的数据，并执行对应的功能
        upbot_parse_cmd(data)
    case UPBOT_CONFIG:
        upbot_prase_config(data)
    default:
        break;
        
def upbot_parse_cmd(data):
    cmd_type = data[4]
    
    switch_case:
        UPBOT_LAUNCH_ROS:  # 这个全大写的就是0x00
            subprocess.run(ros_core)
            ...

```

