## 智慧拍 socket 命令说明
### Socket 连接信息
    * 本地： ws://10.56.42.176:7074/ws
    * 打包后： ws://127.0.0.1:7074/ws
#### 统一响应示例说明
* code：为0时代表成功操作
* msg:为接口执行命令时的提示信息
* status:-1连接失败  0未连接 1连接中  2链接成功  3端口占用
* msg_type:mcu为设备控制，blue_tooth为蓝牙控制,blue_tooth_scan 为蓝牙扫码时发送的消息数据
* data:为返回的数据信息，无实际交互需求时，前端可忽略
```python
{
    "code": 0,
    "msg": "开始识别接口：COM8",
    "status": 1,
    "data": {
        "_type": "show_info",
        "plugins_mode": "auto_select_com",
        "data": {
            "text": "开始识别接口：COM8"
        }
    },
    "msg_type": "mcu"
}
```
### 设备连接
*  type 
    * 值为connect_mcu时，为连接mcu设备操作
    * 值为connect_bluetooth时，为连接蓝牙遥控器
* data:可以忽略为null
#### 请求示例
```python
{"data":null,"type":"connect_mcu"}
```
_<mark>以下操作前必须保证设备已连接!!!<mark>_
### 初始化mcu设备
_<mark>目前连接设备后，后端会自动进行设备初始化操作，如无特殊需求可忽略<mark>_
*  type 固定为 init_mcu
* data:可以忽略为null
#### 请求示例
```python
{"data":null,"type":"init_mcu"}
```
### 单独控制设备得某一个功能运行命令
_(该命令用于单独自定义配置中某一项的单独调整测试，不进行任何存储操作)_

* type 为control_mcu时，为设备得单独控制 
* data中的 device_name释义：
  *  camera_high_motor：相机高度;步长1；最小0；最大400
  *  camera_steering：相机倾角;步长0.1，最小-40；最大40
  *  camera_steering：相机倾角
  * turntable_steering:转盘角度;步长1；最小-720；最大720
  * turntable_position_motor:转盘位置;步长1，最小0；最大800
  * overturn_steering:翻转,当device_name为当前类型时，value可以忽略或传递任意值，后端不做任何处理
  * take_picture:拍照测试;当device_name为当前类型时，value为0或者大于0的数值；提交对焦次数参数
  * laser_position:激光开关;当device_name为当前类型时，value为0或者1；0为关   1为开
* value为设备得控制值，参考上述的最大最小值进行处理
#### 请求示例
```python
{
    "data": {
        "device_name": "camera_high_motor",
        "value": 200
    },
    "type": "control_mcu"
}
```


### 执行拍摄任务
* type 为run_mcu时，为设备拍照动作连贯执行
* data中的 action参数释义：
    * 执行左脚程序 : 为用户配置【执行左脚程序】，其状态必须至少有一条为true,否则不会运行并且报错无可用参数
    * 执行右脚程序 : 为用户配置【执行右脚程序】，其状态必须至少有一条为true,否则不会运行并且报错无可用参数
* data中的 goods_art_no参数释义：
    * 商品货号，必须存在且为字符串形式传递
#### 请求示例
```python
{
    "data": {
        "action": "执行左脚程序",
        "goods_art_no": "1234556"
    },
    "type": "run_mcu"
}
```
### 执行拍摄任务命令发送完成后-服务端响应消息
* msg_type 为image_process时，代表上述命令已发送给设备执行任务
* data参数释义：
    * image_counts : 执行拍照任务的数量，可理解为照片张数
    * goods_art_no : 货号
    * action_names : 执行的动作名称
    * current_time : 当前时间
* msg 消息提示
#### 响应示例
```python
{
    "msg":"MCU 命令已发送完成",
    "data": {
        "image_counts": 4,
        "goods_art_no": "1234556",
        "action_names": [
            "俯视",
            "侧视",
            "后跟",
            "鞋底",
            "内里"
        ],
        "current_time": "年月日时分秒"
    },
    "msg_type":"image_process"
}
```
### 单张照片拍照完成后-服务端响应消息
* msg_type：
    * 为photo_take时，代表拍照已完成
    * 为photo_take_finish时，代表所有拍照任务已完成
* data参数释义：
    * image_counts : 执行拍照任务的数量，可理解为照片张数
    * goods_art_no : 货号
    * current_time : 当前时间
* msg 消息提示
#### 响应示例-单个任务拍照成功(前端需要刷新列表)
```python
{
    "code": 0,
    "msg": "拍鞋底 执行完成~",
    "status": 2,
    "data": null,
    "msg_type":"photo_take"
}
```
#### 响应示例-单个任务拍照失败
```python
{
    "code": 1,
    "msg": "拍鞋底 执行失败~",
    "status": 2,
    "data": null,
    "msg_type":"photo_take"
}
```
### 响应示例-整体任务拍照完成
```python
{
    "code": 1,
    "msg": "执行左脚程序 执行成功~",
    "status": 2,
    "data": null,
    "msg_type":"photo_take_finish"
}
```
### 接收遥控器扫码货号动作处理
#### 消息示例
* data中的子data参数释义：
    * action：【执行左脚程序】或【执行右脚程序】
    * goods_art_no :扫描到的货号，当货号为空时代表用户未扫码，直接按遥控器的左右操作，需要前端判断用户是否在前端页面填写了货号，或者提醒用户填写货号
* msg_type：当该字段为blue_tooth_scan时,前端可直接解析得到data数据包，将数据直接发送给socket服务端即可【执行拍摄任务】
```python
{
    "code": 0,
    "msg": "准备执行[左脚程序]",
    "status": 2,
    "data": {
            "data": {
                    "action": "执行左脚程序",
                    "goods_art_no": "货号信息",
                    },
                    "type": "run_mcu",
    },
    "msg_type": "blue_tooth_scan"
}
```
### 接收遥控器点击拍照事件处理
<mark>遥控器得拍照命令需要由后端转发到前端，再由前端将消息转发给后端对应得拍照命令<mark>
当蓝牙遥控器点击拍照后，后端消息响应如下:
* data中参数释义：
    * type：handler_take_picture 为后端单拍任务得类型
    * data :忽略
* msg_type：当该字段为handler_take_picture时,前端可直接解析得到data数据包，将数据直接发送给socket服务端即可【执行单任务】
#### 消息示例
```python
{
    "code": 0,
    "msg": "处理单拍消息",
    "status": -1,
    "data": {
        "type": "handler_take_picture",
        "data": null
    },
    "msg_type": "handler_take_picture"
}
```
<mark>注：在多次按下拍照按钮时，前端需要在命令发送给后端时且拍照未完成之前处理拦截操作，否则会出现拍照任务在不断执行<mark>

### 单拍任务命令
#### 发送-消息示例
```python
{
        "type": "handler_take_picture",
        "data": null
}
```
#### 响应-消息示例
<mark>注意：当前响应可能会出现失败得情况，如：用户清空了所有货号数据；用户未打开拍照软件等其他错误消息响应；前端需要判断code是否为0；去释放拦截<mark>
* data中参数释义：
    * msg: 消息文本内容
    * data :
        * goods_art_no:货号,便于前端查询详情数据
* msg_type：当该字段为photo_take时,代表照片已拍摄完成
```python
{
    "code": 0,
    "msg": "执行左脚程序 执行完成~",
    "status": 2,
    "data": {"goods_art_no": "执行货号"},
    "msg_type": "photo_take"
}
```

#### 修改配置-独立操作MCU
* data中参数释义：
    * msg: 消息文本内容
    * data :
        * camera_height:相机高度
        * after_delay:拍照后延迟
        * camera_angle:相机角度
        * led_switch:led开关；true:开；false:关
        * number_focus:对焦次数;这里因为后端不控制拍照，所以无效
        * id:固定0
        * take_picture:固定false;这里因为后端不控制拍照，所以无效
        * mode_type:模式类型；如：执行左脚程序
        * turntable_position:转盘位置
        * action_name:动作名称；如：侧视图
        * turntable_angle:转盘角度
        * shoe_upturn:是否翻转；true:翻转；false:不翻转
        * action_index:固定1
        * pre_delay:1;拍照后延迟;这里因为后端不控制拍照，所以无效
* type：当该字段为run_mcu_single时,代表独立执行MCU设备
##### 请求示例
```python
{
    "data": {
        "camera_height": 300,
        "after_delay": 1,
        "camera_angle": 20,
        "led_switch": true,
        "number_focus": 1,
        "id": 0,
        "take_picture": false,
        "mode_type": "执行左脚程序",
        "turntable_position": 200,
        "action_name": "侧视图",
        "turntable_angle": 300,
        "shoe_upturn": false,
        "action_index": 1,
        "pre_delay": 1
    },
    "type": "run_mcu_single"
}
```
##### 响应示例
###### 当 msg_type 为run_mcu_single时,代表独立执行MCU设备完成,前端将此命令作为完成依据
```python
{
    "code": 0,
    "msg": "执行完成",
    "status": 2,
    "data": null,
    "msg_type": "run_mcu_single_finish"
}
```
#### 设备调平-获取
<mark>以下操作需要连接设备且初始化<mark>
* data：空对象或忽略，任何值无意义
* type：当该字段为get_deviation时,代表获取调平设备信息
##### 请求示例
```python
{
    "data": {
    },
    "type": "get_deviation"
}
```
##### 响应示例
* data：
    * camera_high_motor_deviation：相机高度偏移 mm
    * camera_steering_deviation: 相机角度偏移 度
    * turntable_steering_deviation: 转盘角度偏移 度
    * overturn_steering_middle: 翻转舵机-中位角度
    * overturn_steering_high: 翻转舵机-最位角度
    * overturn_steering_up_speed: 翻转舵机-上升速度
    * overturn_steering_down_speed: 翻转舵机-下降速度
    * turntable_front_end_deviation: 转盘前后电机偏移度
* type：当该字段为get_deviation_data时,代表成功获取到调平设备信息
```python
{
    "code": 0,
    "msg": "接收偏移量信息",
    "status": 2,
    "data": {
        "camera_high_motor_deviation": 10,
        "camera_steering_deviation": 0.0,
        "turntable_steering_deviation": 0.0,
        "overturn_steering_middle": 109.0,
        "overturn_steering_high": 150.0,
        "overturn_steering_up_speed": 2,
        "overturn_steering_down_speed": 4,
        "turntable_front_end_deviation":300
    },
    "msg_type": "get_deviation_data"
}
```


#### 设备调平-设置
<mark>以下操作需要连接设备且初始化<mark>
* data：
    * value: 偏移量值,最好传递浮点型
    * action_name:
        * "相机电机",  # min 0 max 400,步长1
        * "相机舵机",  # min -40 max 40,步长0.1
        * "转盘舵机",  # min -720 max 720,步长1
        * "转盘前后电机",  # min 0 max 950,步长1
        * "翻板舵机中位",  # min 0 max 180,步长0.5
        * "翻板舵机高位",  # min 0 max 180,步长0.5
        * "翻板舵机上升速度",  # min 1 max 10,步长1
        * "翻板舵机下降速度",  # min 1 max 10,步长1
    * type: 
        * "move" 为移动
        * "set" 为设置
* type：
    * 当该字段为set_deviation时,代表设置调平设备信息
    * 当该字段为move_deviation时,代表移动调平设备偏移
##### 请求示例
```python
{
    "data": {
        "value": 10,
        "action_name":"相机电机",
        "type":"move"
    },
    "type": "set_deviation"
}
```
##### 响应示例
* data：忽略
* type：
    * 当该字段为set_deviation时,代表响应调平设备设置
    * 当该字段为move_deviation时,代表响应调平设备移动
###### 成功状态
```python
{
    "code": 0,
    "msg": "相机电机 设置成功",
    "status": 2,
    "data": {},
    "msg_type": "set_deviation"
}
```
###### 失败状态
```python
{
    "code": 1,
    "msg": "设置参数有误，请检查",
    "status": 0,
    "data": {},
    "msg_type": "set_deviation"
}
```



#### 获取MCU其他设置信息
<mark>以下操作需要连接设备且初始化<mark>
* data：为null或其他值  后端忽略
* type：
    * 当该字段为get_mcu_other_info时,代表获取MCU其他设置信息
##### 请求示例
```python
{
    "data":null,
    "type": "get_mcu_other_info"
}
```
##### 响应示例
* data：忽略
* type：
    * 当该字段为get_other_mcu_info,代表成功获取MCU其他设置信息
<mark>以下数据包作为写入设备时对应得字段名称<mark>
###### 成功状态
```python
{
    "code": 0,
    "msg": "获取mcu其他配置信息",
    "status": 2,
    "data": {
        "is_auto_send_base_info": 0,
        "is_move_retry": 0,
        "is_data_response": 0,
        "low_speed": 300,
        "is_test": 0,
        "to_init_mode": 1,
        "turntable_move_to_init_mode": 0,
        "led_count": 20,
        "turntable_steering_angle_ratio": 356,
        "is_manual_check": 1,
        "camera_steering_angle_ratio": 50174,
        "is_auto_motor_to_disable": 1,
        "diff_dir": 0,
        "is_auto_send_pos_info": 0,
        "is_dog": 0,
        "has_been_set_motor_config": 1
    },
    "msg_type": "get_other_mcu_info"
}
```



#### 设置MCU其他设置信息
<mark>以下操作需要连接设备且初始化<mark>
* data：设置得数据包
* type：
    * 当该字段为set_mcu_other_info时,代表设置MCU其他设置信息
##### 请求示例
```python
{
    "data":{
        "is_auto_send_base_info": 0,
        "is_move_retry": 0,
        "is_data_response": 0,
        "low_speed": 300,
        "is_test": 0,
        "to_init_mode": 1,
        "turntable_move_to_init_mode": 0,
        "led_count": 20,
        "turntable_steering_angle_ratio": 356,
        "is_manual_check": 1,
        "camera_steering_angle_ratio": 50174,
        "is_auto_motor_to_disable": 1,
        "diff_dir": 0,
        "is_auto_send_pos_info": 0,
        "is_dog": 0,
        "has_been_set_motor_config": 1
    },
    "type": "set_mcu_other_info"
}
```
##### 响应示例
* data：忽略
* type：
    * 当该字段为get_other_mcu_info,代表成功获取MCU其他设置信息
<mark>以下数据包作为写入设备时对应得字段名称<mark>
###### 成功状态
```python
{
    "code": 0,
    "msg": "设置mcu其他配置信息成功",
    "status": 2,
    "data": null,
    "msg_type": "set_mcu_other_info"
}
```


#### 通过命令行发送设备指令
<mark>以下操作需要连接设备且初始化<mark>
* data：
    * command：命令行指令,字符串“0x01 0x42 0x6C 0x6b”为前端默认展示得字符串值，写死即可
* type：
    * 当该字段为send_command时,代表设置通过命令行发送指令
##### 请求示例
```python
{
    "data": {
        "command": "0x01 0x42 0x6C 0x6b"
    },
    "type": "send_command"
}
```
##### 响应示例
* data：
    * command：收到的指令
    * type：
        * 为input时代表输入指令被转换成功，前端需要填充到发送命令得输入框中覆盖用户输入值；
        * 为output时代表收到指令回复，前端需要填充到回复得文本展示框中；
* type：
    * 当该字段为send_command,代表成功获取到指令回复
<mark>以下数据包作为写入设备时对应得字段名称<mark>
###### 发送后指令转换
```python
{
    "code": 0,
    "msg": "命令发送完成",
    "status": 2,
    "data": {
        "command": "0x01 0x42 0x6C 0x6B",
        "type": "input"
    },
    "msg_type": "send_command"
}
```
###### 接收到指令回复
```python
{
    "code": 0,
    "msg": "命令发送完成",
    "status": 2,
    "data": {
        "command": "0xa8 0x12 0x4 0x14 0x14 0x24 0x24 0x4 0x4 0x15 0x14 0x14 0x64 0x4 0xc5 0x4 0xb6 0x84 0x1b 0x42 0x0 0x7 0x0 0x1 0x0 0x1 0x0 0x8 0x4 0x4c 0x4 0xb0 0x0 0x3 0x6b",
        "type": "output"
    },
    "msg_type": "send_command"
}
```
#### 执行重拍操作
<mark>以下操作需要连接设备且初始化<mark>
* data：
    * record_id：原记录id
* type：
    * 当该字段为re_take_picture时,代表进行重拍操作
<mark>注：后续得拍照动作参考消息回复为的type均为：re_take_picture,照片拍摄完成的消息依旧为photo_take<mark>
##### 请求示例
```python
{
    "data":{"record_id":1},
    "type": "re_take_picture"
}
```
#### 停止拍摄
<mark>以下操作需要连接设备且初始化<mark>
* data：null
* type：
    * 当该字段为stop_action时,代表停止拍摄
##### 请求示例
```python
{
    "data":null,
    "type": "stop_action"
}
```
<mark>当通过物理遥控器按键停止拍摄时，会收到以下消息，前端需要把上方的【停止拍摄】消息转发给后端即可<mark>
```
{
    "code": 0,
    "msg": "停止执行组合动作",
    "status": -1,
    "data": {
        "type": "stop_action",
        "data": null
    },
    "msg_type": "stop_action"
}
```
##### 未完待续.....