Paigo应用层通信协议由TCP通信和UDP通信组成。
== TCP通信协议 ==
TCP 端口是 8088。所有的外界发给PAIGO机器的TCP指令中,第1、2两个字节是帧头;最后两个字节是帧尾。
=== 协议标注 ===
* 对于2个字节的数据类型,没有特殊说明的情况下,低位在前,高位在后。
* 对于1个字节的BOOL类型的数据,没有特殊说明的情况下,0表示false、否定、失败的意思;1表示true、肯定、成功的意思。
* 偶数的命令序号是APP发送给PAIGO,奇数的命令序号是PAIGO发送给APP。
* 客户端连接到PAIGO后,首先必须发送登录命令;登录成功后,后续的其它命令才有效,否则PAIGO直接断开连接。
* 客户端连接到PAIGO后,必须每隔1秒发送心跳命令到PAIGO;否则超过一段时间后,PAIGO断开连接。
* Camera是通过UDP点对对Sreaming的,端口是8090
=== TCP帧格式表 ===
一个合法的TCP帧的最小长度是17。
{| class="wikitable sortable"
|-
! 帧头 2 !! 帧长度 2 !! 数据位 n !! 校验位置 2 !! 帧尾 2
|-
| 0x5A,0x5B || 帧长度,包括帧头和帧尾整个数据帧长度 ||见《TCP帧数据位表》,变长 || 针对帧头到数据位进行CRC16校验,2个字节 || 0x5C,0x5D
|}
=== TCP帧数据位表 ===
{| class="wikitable sortable"
|-
! 帧序号 2 (第4-5位) !! 时间辍 4 (第6-9位) !! 数据命令以及数据内容 n
|-
| 两个字节, 每发送一次数据命令加1, 从1开始 || 4个字节, UNIX时间辍 || 见《TCP帧数据命令以及数据内容表》
|}
=== TCP帧数据命令以及数据内容表 ===
主动发起的命令,一般需要返回响应结果;响应命令中一般不需要返回。
{| class="wikitable sortable"
|-
! 命令序号 2 (第10-11位) !! 命令内容 (0-n), (第12位开始) !! 是否需要回复 1 !! (备注)
|-
| 0,APP登录 || 客户端类型长度1个字节,客户端版本长度1个字节,用户名长度1个字节,用户密码长度1个字节,客户端类型,客户端版本,用户名默认是paigo1,用户密码paigo1 || 需要返回 ||
|-
| 1,PAIGO响应登录 || 是否登录成功BOOL; 结果文本长度1, 结果文本n;
电池电压2; Paigo网络模式1:0x01 STA, 0x02 AP; OS版本长度1,STM32固件版本长度1, 主题名称长度1,序列号长度1,机器名称长度1,OS版本,STM32固件版本,主题名称,序列号,机器名称, 音量(1字节), 版本配置长度,版本配置字符串,硬件版本长度,硬件版本字符串 || ||
|-
| 2,APP心跳 || 心跳序号,2个字节,每次发送后,自加1,从1开始; || 1需要返回 || 帧长度19
|-
| 3,PAIGO响应心跳 || 同接收到的APP心跳序号(原样返回)2; 本次会话持续时间2,单位是秒; 电池电压,2个字节,单位豪伏;充电状态,一个字节;充电状态包括是否充满和充电器是否插上; 摄像头运行状态BOOL,一个字节 || 0不需要返回 || 帧长度21
|-
| 4,备用 || 备用 || 需要返回 ||
|-
| 5,备用 || 备用 || ||
|-
| 6,备用 || 备用 || 需要返回 ||
|-
| 7,备用 || 备用 || ||
|-
| 8,备用 || 备用 || 需要返回 ||
|-
| 9,备用 || 备用 || ||
|-
| 10,PAIGO指令集 || 见《控制指令集》 || 需要返回 ||
|-
| 11,PAIGO指令集 || 指令集ID,2个字节;是否成功BOOL; 结果文本长度1, 结果文本n || ||
|-
| 12,停止当前PAIGO指令集 || 指令集ID,2个字节 || 需要返回 ||
|-
| 13,返回停止PAIGO指令集的结果 || 指令集ID,2个字节;是否成功BOOL; 结果文本长度1, 结果文本n || ||
|-
| 14,设置左右轮子运动 || 左轮方向 (1),左轮速度 (1),左轮距离 (四个字节)
右轮方向 (1),右轮速度 (1),右轮距离 (四个字节)
是否需要急刹车,1个字节,1需要;
注:方向: 0停止,1前进,2后退;速度单位cm/S
需要运行里程。单位毫米,高位在前,低位在后。范围:0-73988291。如果要一直运行,可以用最大值
需要急刹车是指精准控制模式 || 需要返回 ||
|-
| 15,返回设置左右轮子运动结果 || 是否成功BOOL; 结果文本长度1, 结果文本n || ||
|-
| 16,设置转向 || 角度方向,一个字节;速度,一个字节,cm/s;角度值,2个字节; 0表示顺时针,1表示逆时针;角度值大于0,360度为一圈 || . ||
|-
| 17,返回设置转向结果 || 是否成功BOOL; 结果文本长度1, 结果文本n || ||
|-
| 18,设置手臂 || 左手臂的方向,一个字节;速度PWM,一个字节,角度,2个字节;右手臂的方向,一个字节;右速度PWM,一个字节,角度,2个字节 || 需要回复 ||
|-
| 19,返回手臂设置结果 || 是否成功BOOL; 结果文本长度1, 结果文本n || ||
|-
| 20,设置灯带状态 || 0开启,1关闭,2闪烁状态,3呼吸状态 || 需要返回 ||
|-
| 21,PAIGO返回设置灯带的结果 || 是否成功BOOL; 结果文本长度1, 结果文本n || ||
|-
| 22,获取灯带状态 || 获取动作,1个字节,这里默认写0x01 || 需要返回 ||
|-
| 23,PAIGO返回灯带状态 || 获取动作,1个字节;0开启,1关闭,2闪烁状态,3呼吸状态 || ||
|-
| 24,设置激光传感器避障模式 || 模式:0停止,1左传,2右转,3后退, 4不处理 || 需要返回 ||
|-
| 25,PAIGO返回激光传感器避障模式设置结果 || 是否成功BOOL; 结果文本长度1, 结果文本n || ||
|-
| 26, APP获取激光传感器避障模式 || 获取动作,1个字节,这里默认写0x01 || 需要返回 ||
|-
| 27, PAIGO返回激光传感器避障模式 || 获取动作,1个字节; 模式,一个字节 ||
|-
| 28,设置激光传感器避障距离 || 2个字节,单位毫米,范围150到500 || 需要返回 ||
|-
| 29,PAIGO返回设置激光传感器避障距离结果 || 是否成功BOOL; 结果文本长度1, 结果文本n || ||
|-
| 30,获取激光传感器避障距离 || 获取动作,1个字节,这里默认写0x01 || 需要返回 ||
|-
| 31,PAIGO返回激光传感器避障距离 || 获取动作,1个字节;单位毫米,2个字节; || ||
|-
| 32, 设置激光传感器开关 || 0表示关闭,1表示开启 || 需要返回 || 开启激光传感器后,会实时上传距离数据给APP,命令号413
|-
| 33, PAIGO返回设置激光传感器开关的结果 || 是否成功BOOL; 结果文本长度1, 结果文本n || ||
|-
| 34,获取激光传感器开关状态 || 获取动作,1个字节,这里默认写0x01 || 需要返回 ||
|-
| 35,PAIGO返回激光传感器开关状态 || 获取动作,1个字节;状态,1个字节,0表示关闭,1表示开启; || ||
|-
| 36, 设置巡线开关 || 0表示关闭,1表示开启, 巡线颜色 || 需要返回 ||
|-
| 37, 返回设置巡线开关的结果 || 是否成功BOOL; 结果文本长度1, 结果文本n || ||
|-
| 38, APP获取巡线开关的状态 || 获取动作,1个字节,这里默认写0x01 || 需要返回 ||
|-
| 39, PAIGO返回巡线开关的状态 || 获取动作,1个字节;状态BOOL,0表示关闭,1表示开启, 巡线颜色 || ||
|-
| 40, 设置听音辨向开关 || 0表示关闭,1表示开启 || 需要返回 ||
|-
| 41, 返回设置听音辨向开关的结果 || 是否成功BOOL; 结果文本长度1, 结果文本n || ||
|-
| 42, APP获听音辨向开关的状态 || 获取动作,1个字节,这里默认写0x01 || 需要返回 ||
|-
| 43, PAIGO返回听音辨向开关的状态 || 获取动作,1个字节;0表示关闭,1表示开启 || ||
|-
| 44, APP获取电池电压 || 获取动作,一个字节,这里填写0x01; || 需要回复 ||
|-
| 45, PAIGIO返回电池电压 || 获取动作1个字节; 电压值2个字节,单位毫伏 || || 电压值是过去1分钟内的平均值
|-
| 46, 设置听音辨向数据上传开关 || 0表示关闭上传,1表示开启数据上传 || 需要返回 ||
|-
| 47, PAIGO返回 || 是否成功BOOL; 结果文本长度1, 结果文本n || ||
|-
| 48, APP设置巡线传感器阈值 || 0xXXXX(左传感器阀值,低位在前,高位在后,下同),0xXXXX(中传感器阀值),0xXXXX(右传感器阀值)(每个阀值范围是0-4096,其他值无效),0xXX(0x01,表示高于阀值光电传感器在线,0x02,表示低于阀值光电传感器在线),一共7个字节 || 需要返回 ||
|-
| 49, PAIGO返回 || 是否成功BOOL; 结果文本长度1, 结果文本n || ||
|-
| 50, 设置巡线传感器数据上传开关 || 0表示关闭上传,1表示开启数据上传 || 需要返回 ||
|-
| 51, PAIGO返回 || 是否成功BOOL; 结果文本长度1, 结果文本n || ||
|-
| 52, PAIGO测试开关 || 动作,一个字节0x01; 0x00关闭测试,0x01开启测试 || ||
|-
| 53, PAIGO返回 || 动作,一个字节0x01; 是否成功BOOL; 结果文本长度1, 结果文本n || ||
|-
| 54, 重置胳膊角度 || 动作,一个字节0x01; || ||
|-
| 55, PAIGO返回 || 动作,一个字节0x01; 是否成功BOOL; 结果文本长度1, 结果文本n || ||
|-
| 56,设置手臂角度 || 左手臂的方向,一个字节;速度PWM,一个字节,角度,2个字节;右手臂的方向,一个字节;右速度PWM,一个字节,角度,2个字节
说明:此指令与18号指令不同,这个指令下,每个手臂角度的手臂位置是固定的 || 需要回复 ||
|-
| 57,返回手臂设置结果 || 是否成功BOOL; 结果文本长度1, 结果文本n || ||
|-
| 58, 设置摄像头和麦克风 || 动作,一个字节,0x01是关闭/开启摄像头,0x02是关闭/开启麦克风; 动作参数, 一个字节,0x00关闭, 0x01开启;参数2,一个字节,开启摄像头时,0表示320*240,1表示640*480,2表示800*600 || ||
|-
| 59, 返回摄像头开关结果 || 动作,一个字节, 同发起的命令; 是否成功BOOL; 结果文本长度1, 结果文本n; || || 当摄像头设备不存在时,结果返回失败, 结果文本是Camera device not found.
|-
| 60, 获取当前左右手臂角度 || 动作,一个字节,0x01; ||
|-
| 61, 返回当前左右手臂角度 || 动作,一个字节,0x01; 左手臂角度,2个字节;右手臂角度,2个字节 || ||
|-
| 62, 设置手臂角度(最小角度转动) || 左手臂PWM,一个字节,200为好;左手臂角度,两个字节,30-360;右手臂PWM,一个字节,200为好;右手臂角度,两个字节,0-330; || 需要回复 ||
|-
| 63, 返回设置结果 || 是否成功BOOL; 结果文本长度1, 结果文本n; || ||
|-
| 64, 不间断转动手臂 || 是否操作左手臂,BOOL; 左手臂方向;保留1字节; 是否操作右手臂,BOOL; 右手臂方向;保留1字节; || 需要回复 ||
|-
| 65, 返回设置结果 || 是否成功BOOL; || ||
|-
| 66, Siri功能设置 || 动作,一个字节,0x01表示Siri开关,0x02表示获取当前Siri是否开启;参数,一个字节,动作为0x01时,这里是BOOL,动作是0x02时,无 || 需要回复 ||
|-
| 67, 返回Siri功能设置结果 || 动作,一个字节; 动作为0x01时,结果文本长度1, 结果文本n;动作为0x02时,BOOL字节表示Siri是否开启 || ||
|-
| 68, 停止手臂转动 || 手臂类型,1个字节,0x00表示左手臂,0x01表示右手臂,,0x00表示左右手臂 || 需要回复 ||
|-
| 69, 返回停止手臂转动结果 || 结果BOOL;左手臂角度,2个字节;右手臂角度,2个字节 || ||
|-
| 70, 设置待机和休眠时间 || 类型,1个字节,0x00表示设置待机时间,0x01表示休眠时间; 时间,2个字节, 单位分钟,范围 >0, <= 300 || 需要回复 ||
|-
| 71, 返回结果 || 类型,1个字节; 是否成功BOOL; 结果文本长度1, 结果文本n; || ||
|-
| 72, 获取待机和休眠时间 || 类型,1个字节,0x00表示获取待机时间,0x01表示获取休眠时间; || 需要回复 ||
|-
| 73, 返回结果 || 类型,1个字节; 是否成功BOOL; 分钟数值,2个字节 || ||
|-
| 100, APP设置机器主题 || 主题名称长度,一个字节; 主题名称 || 需要回复 || 主题名称的长度大于0,小于100,英文字符,不能有特殊字符
|-
| 101, PAIGO响应设置机器主题 || 是否成功BOOL; 结果文本长度1, 结果文本n; || ||
|-
| 102, APP获取机器主题 || 获取动作,一个字节,这里填写0x01; || 需要回复 ||
|-
| 103, PAIGO响应获取机器主题 || 获取动作,一个字节,0x01;主题名称长度,一个字节; 主题名称 || ||
|-
| 104, 设置机器名称 || 机器名称长度,一个字节; 机器名称 || 需要回复 || 机器名称的长度大于0,小于100,英文字符,不能有特殊字符
|-
| 106, 获取机器名称 || 主题名称长度,一个字节; 主题名称 || 需要回复 ||
|-
| 108,设置Station SSID,密码 || SSID长度1, 密码长度1, SSID字符串, 密码字符串(长度大于等于0) || 需要返回 || 密码可为空
|-
| 109,设置Station SSID,密码返回结果 || 执行结果BOOL,结果文本长度1, 结果文本n || ||
|-
| 110, 获取Station 账号密码 || 动作,一个字节,目前填写默认获取动作0x01 || 需要返回 ||
|-
| 111,获取Station SSID,密码返回结果 || 执行结果BOOL,结果文本长度1, 结果文本n, 动作,SSID长度1, 密码长度1, SSID字符串, 密码字符串 || ||
|-
| 112, 设置AP名称,密码 || SSID长度1, 密码长度1, SSID字符串(长度大于0), 密码字符串(长度大于等于0) || 需要返回 ||
|-
| 113,设置AP名称,密码返回结果 || 执行结果BOOL,结果文本长度1, 结果文本n || ||
|-
| 114, 获取AP账号密码 || 动作,一个字节,目前填写默认获取动作0x01 || 需要返回 ||
|-
| 114, 获取AP账号密码返回结果 || 执行结果BOOL,结果文本长度1, 结果文本n, 动作,SSID长度1, 密码长度1, SSID字符串, 密码字符串 || ||
|-
| 116, 设置音量 || 音量类型 1,目前填写默认类型0x01, 音量值 1,范围从0到10 || 需要返回 ||
|-
| 117, PAIGO返回设置音量结果 || 执行结果BOOL,结果文本长度1, 结果文本n, 音量类型 1, 音量值 || ||
|-
| 118,读取音量 || 音量类型,一个字节,目前填写默认类型0x01 || 需要返回 ||
|-
| 119, PAIGO返回音量 || 执行结果BOOL,结果文本长度1, 结果文本n; 音量类型一个字节,目前是0x01; 音量值,一个字节 || ||
|-
| 120,设置家长服务器地址端口 || port 2, 服务器地址长度 1, 服务器地址 || 需要返回 ||
|-
| 121,PAIGO返回 || 执行结果BOOL,结果文本长度1, 结果文本n || ||
|-
| 122,获取家长服务器地址端口 || 动作,一个字节,目前填写默认获取动作0x01 || 需要返回 ||
|-
| 122,PAIGO返回 || 执行结果BOOL,结果文本长度1, 结果文本n, 动作,port 2, 服务器地址长度 1, 服务器地址 || ||
|-
| 124,设置默认图片 || . || . ||
|-
| 126,设置默认动画 || . || . ||
|-
| 126,APP查询PAIGO版本 || 动作,一个字节,目前填写默认获取动作0x01 || 需要返回 ||
|-
| 127,返回PAIGO版本 || 动作,一个字节,OS版本字符长度1,STM32版本字符长度1,KNOWLES版本字符长度1,OS版本,STM32版本,KNOWLES版本 || ||
|-
| 128,获取当前PAIGO主题数量 || 动作,一个字节, 目前0x01; || ||
|-
| 129,PAIGO返回PAIGO主题数量 || 动作,一个字节, 目前0x01; 主题数量,1个字节 || ||
|-
| 130,PAIGO日志接口 || 动作,一个字节, 0x01获取日志开启状态, 0x02设置日志开启状态; BOOL是否开启(动作0x02时需要) || ||
|-
| 131,PAIGO日志接口返回 || 动作,一个字节;BOOL(获取时,表示开户状态,设置时返回成功) || ||
|-
| 150,APP发送OS升级命令 || 动作,一个字节。动作有0x01, 表示请求升级OS;文件大小,4个字节;URL字符串长度,1个字节;URL字符串,n个字节 || 需要返回 ||
|-
| 151,PAIGO返回OS升级回应 || 动作,原样返回,和请求的动作一样,一个字节; 执行结果BOOL,结果文本长度1, 结果文本n。 || ||
|-
| 153,PAIGO升级过程中返回通知 || 消息类型,一个字节,见附件详细描述 || ||
|-
| 200,播放声音 || 音频ID 2 || 需要返回 ||
|-
| 201, PAIGO返回播放声音结果 || 执行结果BOOL,结果文本长度1, 结果文本n, 音频ID 2 || ||
|-
| 202,播放表情 || 表情ID 2 || . ||
|-
| 203, PAIGO返回播放表情结果 || 执行结果BOOL,结果文本长度1, 结果文本n,表情ID 2 || ||
|-
| 204,播放图片 || 图片ID,2个字节;显示模式,一个字节
显示模式有2种,0x00表示显示图片5秒后,返回默认显示状态;0x01表示一直显示设置的图片,不切换。 || 需要返回 ||
|-
| 205, PAIGO返回播放图片结果 || 执行结果BOOL,结果文本长度1, 结果文本n,图片ID 2 || ||
|-
| 206,显示文字 || 颜色RGB 3,字体大小 1(推荐设置30以下),文字长度 1,文字 || 需要返回 || 字体大小小于50,文字长度小于100
|-
| 207, PAIGO返回显示文字结果 || 执行结果BOOL,结果文本长度1, 结果文本n || ||
|-
| 208,显示 || . || . ||
|-
| 300,APP传输文件 || 文件数据块长度 2(这里预定为32768,最后一个文件块长度<=32768), 文件数据块序号 2个字节(从0开始), 文件类型 1, 文件号 2(必须大于4000), 文件长度 4, 数据块 n
0x01表示png格式的图片,0x02表示wav格式的音频,0x03表示zip格式的动画序列帧 || 需要返回 || 文件号必须大于4000
|-
| 301,PAIGO响应传输文件 || 文件块序号 2; 文件类型 1; 文件号2; 执行结果BOOL, 结果文本长度1, 结果文本n
成功时, 结果文本有Receiving(传输中), Finished(传输完成)
失败时,结果文本有File id invalid(文件号小于等于4000时) || ||
|-
| 400,APP进入界面通知 || PageID, 长度2个字节; WiFi信息100;开始界面200;选关界面300;遥控界面400;划线界面500;编程界面600;课程界面700;AR界面800 || 需要返回 ||
|-
| 401,PAIGO返回界面通知 || 结果BOOL, 结果文本长度1, 结果文本n, PageID, 长度2个字节 || ||
|-
| 403,音频播放完成通知 || 音频ID,两个字节 || 无需返回 ||
|-
| 405,左右轮子运动完成通知 || 帧序号,2个字节;子指令序号,2个字节; 0x0X(执行状态指令,0x00表示执行完毕,0x01表示执行遇到堵住,0x02表示前面有障碍物,进入刹车,0x03表示刹车完毕) || 无需返回 ||
|-
| 407,左右轮子转向完成通知 || 帧序号,2个字节; 子指令序号,2个字节;0x0X(执行状态指令,0x00表示执行完毕,0x01表示执行遇到堵住,0x02表示前面有障碍物,进入刹车,0x03表示刹车完毕) || 无需返回 ||
|-
| 409,左右手臂运动完成通知 || 帧序号,2个字节; 执行状态指令,BOOL, false轮子堵住;左右轮子,0x00左,0x01右; || 无需返回 ||
|-
| 411,指令完成通知 || 指令ID,两个字节; 子指令序号,2个字节; 0x0X(执行状态指令,0x00表示执行完毕,0x01表示执行遇到堵住,0x02表示前面有障碍物,进入刹车,0x03表示刹车完毕) || 无需返回 ||
|-
| 413,激光传感器上传距离 || 距离,2个字节,单位毫米 || 无需返回 || 可通过设置激光传感器开关来开启/关闭数据上传
|-
| 415,PAIGO工作状态切换通知 || 状态值,1个字节(0休眠状态,1待机状态,2正常状态,50低电量关机) || 无需返回 ||
|-
| 417,Knowles声音角度信号通知 || 角度值,2个字节,0到360 || 无需返回 ||
|-
| 419, 巡线传感器数据上传 || 0xXXXX(左传感器,低位在前,高位在后,下同),0xXXXX(中传感器),0xXXXX(右传感器)一共6个字节 || 无需返回 ||
|-
| 421, PAIGO实时状态数据上传 || || 无需返回 ||
|}
=== OTA升级消息类型 ===
OTA升级消息类型包括升级过程中的一系统步骤的进度提示。
{| class="wikitable sortable"
|-
! 消息类型 !! 消息分类 !! 消息描述 !! 消息内容
|-
| 153 || 5 || OS包下载完成 || 无
|-
| 153 || 6 || OS包下载失败 || 无
|-
| 153 || 7 || OS包错误,如解压失败、验证内容不通过等 || 无
|-
| 153 || 8 || OS包下载进度 || 进度值,int8, 2表示%2
|-
| 153 || 9 || OS即将重启系统进入升级安装模式 || 无
|-
| 153 || 11 || OS准备升级 || 无
|-
| 153 || 16|| 开始发送STM32固件 || 无
|-
| 153 || 17 || 开始发送Knowels固件 || 无
|-
| 153 || 18|| STM32固件发送进度 || 进度值,int8, 2表示%2
|-
| 153 || 19 || Knowels固件发送进度 || 进度值,int8, 2表示%2
|-
| 153 || 20 || STM32固件发送错误 || 无
|-
| 153 || 21 || Knoewls固件发送错误 || 无
|-
| 153 || 22 || STM32固件发送完成 || 无
|-
| 153 || 23 || Knowles固件发送完成 || 无
|-
| 153 || 24 || STM32升级成功 || 无
|-
| 153 || 25 || Knowles升级成功 || 无
|}
=== 控制指令集 ===
指令集由若干个指令组成,每个子指令包括左右轮子的运动控制,左右手臂,灯带,声音播放,表情播放,等待指令。
{| class="wikitable sortable"
|-
! 指令集ID !! 子指令序号 2 !! 控制内容 (30个字节) !! 子指令结符
|-
| 两个字节,从1开始 || 两个字节,从1开始 || 左轮方向 (1),左轮速度 (1),左轮距离 (4)
右轮方向 (1),右轮速度 (1),右轮距离 (4)
左手臂方向 (1) 左手臂速度 (1),角度 (2)
右手臂方向 (1)右手臂的速度 (1),角度 (2)
灯带状态,2个字节,目前只用第一个字节,第2个字节预留
声音播放 (2)
表情播放 (2)
图片播放 (2)
等待指令 (2),单位是秒 || 0xEF
|}
指令控制内容中,对于手臂的控制,如果6个字节都是0x00,表示没有手臂控制指令。对于灯带的控制,0xFF表示不对灯带进行操作;对于音频、表情、图片播放,0x00 0x00表示没有操作,表情和图片播放只能设置其中的一种。
== UDP通信协议 ==
=== PAIGO机器广播 ===
当外界与PAIGO机器未建立TCP连接时,PAIGO机器持续向 '''8089''' 端口广播发送机器信息,广播地址是 '''224.0.0.1''' 。在外界与PAIGO机器建立TCP连接后,停止发送此UDP广播。
5A 5B XX(paigo编号) XX(ip1) XX(ip2) XX(ip3) XX(ip4) XX(port高位) XX(port低位) XX(高低配信息) XX(是否连接,0x01表示已经连接,0x00表示未连接) XX(paigo名称长度) XX...(paigo名称) XX(固件版本长度,1个字节) XX(固件版本) XX(STM32版本长度,1个字节) XX(STM32版本) XX(设备ID长度,1个字节) XX(设备ID) XX(设备AP SSID长度,1个字节) XX(设备AP SSID) 5C 5D
高低配信息 高: 0x02 低: 0x01, 目前都是使用0x02这个值。
== STM32 与 TI 3352 通信协议 ==
==AM3352、STM32通讯协议==
====物理层协议====
*通过串口通讯,115200波特率,校验位无,数据位8位,停止位1位
=====帧格式表=====
{| class="wikitable sortable"
|-
! 起始位 !! 数据位 !! 校验位置 !! 结束位置
|-
|0xA5,一个字节长度||见数据位表,变长||CRC校验,2个字节长度,低位在前,高位在后||0x5A,一个字节长度
|}
=====数据位表=====
{| class="wikitable sortable"
|-
! 数据来源地址 !! 目的地址 !! 帧序号 !! 数据长度 (第5-6位) !! 数据命令以及数据内容
|-
|0x01表示第一块CPU板,0x02表示第二块CPU板,0x03表示第三块CPU板,'''目前只有一块335X CPU 板子,只用到0x01''';
0x81表示第一块STM32板,0x82表示第二块STM32电路板,0x83表示第二块STM32电路板,'''目前只有一块STM32板子,只用到0x81''',一个字节||0x01表示第一块CPU板,0x02表示第二块CPU板,0x03表示第三块CPU板'''目前只有一块335X CPU 板子,只用到0x01''';
0x81表示第一块STM32板,0x82表示第二块STM32电路板,0x83表示第二块STM32电路板,'''目前只有一块STM32板子,只用到0x81''';
0x80表示目的地址是广播给所有的CPU电路板,0xfe表示目的地址是所有的STM32电路板,0xff表示广播给系统中所有设备,其他地址备用,一个字节长度||主动发送数据设备没发送一次数据加一个,两个字节,低位在前,高位在后(大于0xffff,清零),接收需要返回数据同数据返回||数据命令以及数据内容部分数据长度,两个字节,低位在前,高位在后||见数据命令以及数据内容表,变长
|}
=====数据命令以及数据内容表=====
{| class="wikitable sortable"
|-
! 命令序号(定长,两个字节低位在前,高位在后),第7-8位 !! 命令内容(变长,0到n个字节),第9位开始 !! 是否需要回复(定长,1个字节)
|-
|1,335x下达初始化STM32命令||无||1表示需要返回
|-
|2,STM32应答||数据正常应答0x00,错误应答0x01,一个字节长度;STM32收到数据后关闭轮子,关闭胳膊,退出楼世以及STM32FW升级状态||0表示无需返回
|-
|3,335X读取STM32软件版本||无||1表示需要返回
|-
|4,STM32应答上传软件版本||例如,"PaigouS2.01",11个字节长度||0表示无需返回
|-
|5,335X读取STM32硬件版本||数据长度0|1表示需要返回
|-
|6,STM32应答上传邮件版本||例如,"PaigouH2.01",11个字节长度||0表示无需返回
|-
|7,335X提出升级STM32FW||无||0表示无需返回,1表示需要返回
|-
|8,STM32回复335X提出升级STM32FW||数据正常应答0x00,数据错误应答0x01,(STM32进入升级模式,自动将状态调整到IDEL模式,关闭轮子,灯带等)||0表示无需返回
|-
|9,STM32提出升级STM32 代码||无||0表示无需返回,1表示需要返回
|-
|10,335X回复STM32提出升级FW||数据正常应答0x00,数据错误应答0x01,(335X数据应答正常后,335X发送第11条指令))||0表示无需返回
|-
|11,335X发送代码数据长度给STM32||4个字节长度,低位在前,高位在后||0表示无需返回,1表示需要返回
|-
|12,STM32应答335X发送代码数据长度给STM32||数据正常应答0x00,错误应答0x01,SPI flash错误应答0x02,其他错误应答一个字节长度,一个字节长度||0表示无需返回
|-
|13,335X发送代码数据给STM32||见'''335X发送代码数据给STM32数据内容表'''||0表示无需返回,1表示需要返回
|-
|14,STM32应答335X发送代码数据给STM32||数据正常应答0x00,错误应答0x01||0表示无需返回
|-
|15,335X发送数据升级完毕||无||0表示无需返回,1表示需要返回
|-
|16,STM32应答335X发送数据升级完毕||数据正常应答0x00,错误应答0x01,一个字节长度。STM32应答完毕后,在5S左右会重启STM32设备,器件可能会断开335X电,335X需要注意||0表示无需返回
|-
|17,335X读取knowles软件版本||数据长度0|1表示需要返回
|-
|18,STM32应答上传软件版本||XXXXXXX,变长||0表示无需返回
|-
|19,335X提出升级knowles代码||无||0表示无需返回,1表示需要返回
|-
|20,STM32回复335X提出升级knowles代码||数据正常应答0x00,数据错误应答0x01。数据正常STM32进入升级knowles代码状态||0表示无需返回
|-
|21,335X发送knowles代码数据长度给STM32||4个字节长度,低位在前,高位在后||0表示无需返回,1表示需要返回
|-
|22,STM32应答335X发送knowles代码数据长度||数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回
|-
|23,335X发送knowles代码数据给STM32||与'''335X发送knowles代码数据给STM32数据内容表'''相同||0表示无需返回,1表示需要返回
|-
|24,STM32应答335X发送knowles代码数据给STM32||数据正常应答0x00,错误应答0x01||0表示无需返回
|-
|25,335X发送knowles数据升级完毕||无||0表示无需返回,1表示需要返回
|-
|26,STM32应答335X发送数据升级完毕||数据正常应答0x00,错误应答0x01,一个字节长度。STM32可以进入正常模式||0表示无需返回
|-
|27,STM32主动上传软件版本||例如,"PaigouS2.01",||1表示需要返回
|-
|28,335x应答||0表示正常,1表示错误||0表示无需返回
|-
|29,STM32主动上传硬件版本||例如,"PaigouH2.01",||1表示需要返回
|-
|30,335x应答||0表示正常,1表示错误||0表示无需返回
|-
|31,STM32主动上传knowles版本||长度不定||1表示需要返回
|-
|32,335x应答||0表示正常,1表示错误||0表示无需返回
|-
|33,335x发送关335电指令||0||1表示需要返回
|-
|34,STM32应答||0表示正常,1表示错误||0表示无需返回
|-
|35,STM32上传按键命令||一个字节,表示按键按下持续时间,1到255,单位秒||1表示需要返回
|-
|36,3352应答||0表示正常,1表示错误||0表示无需返回
|-
|37,335X发送paigou状态指令||0x00,表示paigo进入休眠状态;0x01表示paigo进入待机模式;0x02表示paigou进入工作状态||1表示需要返回
|-
|38,STM32应答||0表示正常,1表示错误。在收到paigo进入休眠命令,STM32关闭胳膊,轮子5V,马达驱动进入休眠状态,关闭声音辨向,过5S后关闭335X电源,并且STM32进入低功耗模式;
在收到paigo进入待机命令,STM32关闭胳膊,轮子5V,马达驱动进入休眠状态;
在收到paigo进入工作命令,STM32开启胳膊,轮子5V,马达驱动进入工作状态,开启声音辨向,打开335X电源,并且STM32进入正常工作模式;
||0表示无需返回
|-
|-
|39,335x发送开启STM32串口打印||0表示关闭STM32串口debug功能,1表示开启STM32debug功能,其他无效(一个字节长度,此功能只能通过335x命令行开启,不开放给手机APP)||1表示需要返回
|-
|40,3352应答||0表示正常,1表示错误||0表示无需返回
|-
|41,335X读取daughter硬件ID号||无||0表示无需返回,1表示需要返回
|-
|42,STM32应答||0xXX 1个字节, daughter 板子硬件ID号,0x00 (daughter A1,A2版本),0x01 (daughter A3版本),0x03 (daughter A4版本)||0表示无需返回
|-
|43,335X发送关闭335x电源命令||无||0表示无需返回,1表示需要返回
|-
|44,STM32应答||0表示OK,1表示出错,其他无效||0表示无需返回
|''' 1 - 50条指令用于系统类指令,与paigo 系统运动控制无关'''
|-
|51,335X主动发送模式控制给STM32||0x00,轮子进入IDLE模式(在IDLE模式下,关闭轮子5V),0x01表示实时遥控模式,0x02表示编程模式,0x03表示巡线模式(在设置巡线模式前,必须先用203指令先设置巡线参数,要不巡线模式设置不成功),其他无效,一个字节长度||0表示无需返回,1表示需要返回
|-
|52,STM32应答335X模式控制||数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回
|-
|53,335X获取轮子运动模式||无,0个字节||0表示无需返回,1表示需要返回
|-
|54,STM32应答335X获取运动模式||0x01表示实时遥控模式,0x02表示编程模式,0x03表示巡线模式,其他无效,一个字节长度||0表示无需返回
|-
|55,335x设置STM32运动过程中测距停止运动阀值||0xXXXX(两个字节,单位mm,150 - 500 有效)||1表示需要返回
|-
|56,STM32应答||数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回
|-
|59,STM32上报距离在59命令阀值内激光距离||两个字节(地位在前,单位mm)||1表示需要返回
|-
|60,335X应答||数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回
|-
|101,335X在实时遥控模式下控制指令||具体内容同 '''自由编程模式下控制指令表''''||0表示无需返回,1表示需要返回
|-
|102,STM32回复335X在实时遥控模式下控制指令||数据正常应答0x00,错误应答0x01,在STM32 非遥控模式下,应答错误。0x02表示STM32进入蔽障刹车状态(在蔽障刹车状态下不接收控制指令)一个字节长度。||0表示无需返回
|-
|103,STM32在实时遥控状态下上传命令执行完毕命令||0xXX 0xXX(335x控制指令 序列号),0x0X(在控制命令集中,第几条指令执行完毕),0x0X(执行状态指令,0x00表示执行完毕,0x01表示执行遇到堵住,0x02表示前面有障碍物,进入刹车,0x03表示刹车完毕)一共4个字节||0表示无需返回,1表示需要返回
|-
|104,335X回复STM32执行完毕应答||数据正常应答0x00,错误应答0x01,在STM32 非编程模式下,应答错误。一个字节长度。||0表示无需返回
|-
|105,实时遥控状态下上335x发送停止轮子指令||无||0表示无需返回,1表示需要返回
|-
|106,STM32应答||数据正常应答0x00,错误应答0x01,在STM32 非编程模式下,应答错误。一个字节长度。||0表示无需返回
|-
|151,335X在编程模式控制指令||见'''自由编程模式下控制指令表'''||0表示无需返回,1表示需要返回
|-
|152,STM32回复335X在自由编程模式下控制指令||数据正常应答0x00,错误应答0x01,在STM32 非模式下,应答错误。0x02表示STM32进入蔽障刹车状态(在蔽障刹车状态下不接收控制指令),一个字节长度。||0表示无需返回
|-
|153,STM32在编程状态下上传命令执行完毕命令||0xXX 0xXX(335x控制指令 序列号),0x0X(在控制命令集中,第几条指令执行完毕),0x0X(执行状态指令,0x00表示执行完毕,0x01表示执行遇到堵住,0x02表示前面有障碍物,进入刹车,0x03表示刹车完毕)一共4个字节||0表示无需返回,1表示需要返回
|-
|154,335X回复STM32执行完毕应答||数据正常应答0x00,错误应答0x01,在STM32 非编程模式下,应答错误。一个字节长度。||0表示无需返回
|-
|155,编程状态下上335x发送停止轮子指令||无||0表示无需返回,1表示需要返回
|-
|156,STM32应答||数据正常应答0x00,错误应答0x01,在STM32 非编程模式下,应答错误。一个字节长度。||0表示无需返回
|-
|201,335X在循迹模式控制指令||见'''循迹模式下控制指令表'''||0表示无需返回,1表示需要返回
|-
|202,STM32回复335X在循迹模式下控制指令||数据正常应答0x00,错误应答0x01,在STM32 非模式下,应答错误。一个字节长度。||0表示无需返回
|-
|203,设置循迹光电传感器门阀值||0xXXXX(右传感器阀值,低位在前,高位在后,下同),0xXXXX(中传感器阀值),0xXXXX(左传感器阀值)(每个阀值范围是0-4096,其他值无效),0xXX(0x01,表示高于阀值光电传感器在线,0x02,表示低于阀值光电传感器在线),一共7个字节||0表示无需返回,1表示需要返回
|-
|204,STM32应答||数据正常应答0x00,错误应答0x01。一个字节长度。||0表示无需返回
|-
|251,335X设置胳膊状态||0x00表示为不操作胳膊状态(关闭胳膊5V),0x01,可操作胳膊状态,一个字节||0表示无需返回,1表示需要返回
|-
|252,STM32回复335X胳膊状态设置||数据正常应答0x00,错误应答0x01,在STM32 非模式下,应答错误。一个字节长度。||0表示无需返回
|-
|253,335X获取STM32胳膊状态||无||0表示无需返回,1表示需要返回
|-
|254,STM32回复335X胳膊状态||0x00表示为不操作胳膊状态,0x01,可操作胳膊状态,'''左胳膊电压AD值,低位在前,高位在后;右胳膊电压AD值,低位在前,高位在后''',5个字节||0表示无需返回
|-
|255,335x设置左胳膊控制命令||见'''胳膊控制命令表'''||0表示无需返回,1表示需要返回
|-
|256,STM32回复335X左胳膊控制命令应答||数据正常应答0x00,错误应答0x01,在STM32 非模式下,应答错误。一个字节长度。||0表示无需返回
|-
|257,335x设置右胳膊控制命令||见'''胳膊控制命令表'''||0表示无需返回,1表示需要返回
|-
|258,STM32回复335X右胳膊控制命令应答||数据正常应答0x00,错误应答0x01,在STM32 非模式下,应答错误。一个字节长度。||0表示无需返回
|-
|259,STM32 上传胳膊控制命令执行完毕通知||0xXX 0xXX ,(控制命令序号),0x0X(0x00 表示执行完毕,0x01表示执行遇到阻碍,停止执行),'''左胳膊电压AD值,低位在前,高位在后;右胳膊电压AD值,低位在前,高位在后''',7个字节长度||0表示无需返回,1表示需要返回
|-
|260,335x回复STM32 胳膊执行完毕指令||数据正常应答0x00,错误应答0x01。一个字节长度。||0表示无需返回
|-
|261,335X 下达灯带控制指令||0表示LED关闭,1表示灯常量,2表示灯闪烁,3表示灯呼吸灯||0表示无需返回,1表示需要返回
|-
|262,STM32回复||数据正常应答0x00,错误应答0x01。一个字节长度。||0表示无需返回
|-
|263,335X下达关闭胳膊命令||0表示关闭左胳膊,1表示关闭右胳膊,2表示关闭左右胳膊(其他无效),1个字节||0表示无需返回,1表示需要返回
|-
|264,STM32回复||数据正常应答0x00,错误应答0x01,'''左胳膊电压AD值,低位在前,高位在后;右胳膊电压AD值,低位在前,高位在后''',5个字节长度。||0表示无需返回
|-
|265,335X灯带参数||0xXXXX(两个字节,常量状态下LED PWM,范围 0 - 1000,低字节在前),0xXXXX(两个字节,闪烁状态下LED亮时PWM,范围 0 - 1000),0xXXXX(两个字节,闪烁状态下闪烁时间,0-10000,单位ms)||0表示无需返回,1表示需要返回
|-
|266,STM32回复||数据正常应答0x00,错误应答0x01。一个字节长度。||0表示无需返回
|-
|501,STM32上传335x数据表||见'''STM32上传状态表'''||0表示无需返回
|-
|502,335x应答335x数据表||数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回
|-
|503,335x发送STTM32上传状态指令||0x01表示需要上传,0x00表示关闭上传状态||1表示需要返回
|-
|504,STM32应答||数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回
|-
|505,STM32上传语音方位||两位,低位在前,高位在后,0 - 360 有效,其他无效||1表示需要返回
|-
|506,STM32应答||数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回
|}
=====STM32上传状态表=====
{| class="wikitable sortable"
|-
! 状态数据!! 说明
|-
|0xXX 0xXX 2个字节, 第9-10||左胳膊电压AD值,低位在前,高位在后。对应电压的计算公式是:3.3* (H*256 + L)/4096,单位V,H 表示高位,L 表示低位
|-
|0xXX 0xXX 2个字节, 第11-12||电池电压AD值,低位在前,高位在后。电池电压计算公式为:4.389* (H*256 + L)/4096,单位V,H 表示高位,L 表示低位
|-
|0xXX 0xXX 2个字节, 第13-14||右循迹传感器电压AD值,低位在前,高位在后。对应电压的计算公式是:3.3* (H*256 + L)/4096,单位V,H 表示高位,L 表示低位
|-
|0xXX 0xXX 2个字节, 第15-16||中间循迹传感器电压AD值,低位在前,高位在后。对应电压的计算公式是:3.3* (H*256 + L)/4096,单位V,H 表示高位,L 表示低位
|-
|0xXX 0xXX 2个字节, 第17-18||左循迹传感器电压AD值,低位在前,高位在后。对应电压的计算公式是:3.3* (H*256 + L)/4096,单位V,H 表示高位,L 表示低位
|-
|0xXX 0xXX 2个字节, 第19-20||右轮电流AD值,低位在前,高位在后。对应电流的计算公式是:(3300*20*(float)(H*256 + L)/4096)/21;,单位mA,H 表示高位,L 表示低位
|-
|0xXX 0xXX 2个字节, 第21-22||打枪接收头电压AD值,低位在前,高位在后。对应电压的计算公式是:3.3* (H*256 + L)/4096,单位V,H 表示高位,L 表示低位
|-
|0xXX 0xXX 2个字节, 第23-24||右胳膊电压AD值,低位在前,高位在后。对应电压的计算公式是:3.3* (H*256 + L)/4096,单位V,H 表示高位,L 表示低位
|-
|0xXX 0xXX 2个字节, 第25-26||左轮电流AD值,低位在前,高位在后。对应电流的计算公式是:(3300*20*(float)(H*256 + L)/4096)/21;,单位mA,H 表示高位,L 表示低位
|-
|0xXX 0xXX 2个字节, 第27-28||激光探测距离,低位在前,高位在后
|-
|0xXX 1个字节, 第29||左轮当前方向,0停止,1前进,2后退,其他无效
|-
|0xXX 1个字节, 第30||左轮当前PWM,0- 250,其他无效,低位在前,高位在后。
|-
|0xXX 0xXX 2个字节, 第31-32||左轮当前速度,单位mm/S,低位在前,高位在后。
|-
|0xXX 0xXX 0xXX 0xXX 4个字节, 第33-36||当前指令下,左轮运行光栅累计,低位在前,高位在后。
|-
|0xXX 0xXX 0xXX 0xXX 4个字节, 第37-40||左轮光栅累计值,低位在前,高位在后。
|-
|0xXX 1个字节, 第41||右轮当前方向,0停止,1前进,2后退,其他无效
|-
|0xXX 1个字节, 第42||右轮当前PWM,0- 250,其他无效,低位在前,高位在后。
|-
|0xXX 0xXX 2个字节, 第43-44||右轮当前速度,单位mm/S,低位在前,高位在后。
|-
|0xXX 0xXX 0xXX 0xXX 4个字节, 第45-48||当前指令下,右轮运行光栅累计,低位在前,高位在后。
|-
|0xXX 0xXX 0xXX 0xXX 4个字节, 第49-52||右轮光栅累计值,低位在前,高位在后。
|-
|0xXX 1个字节, 第53||左手当前方向,0停止,1前进,2后退,其他无效
|-
|0xXX 1个字节, 第54||左手当前PWM,0- 250,其他无效。
|-
|0xXX 1个字节, 第55||右手当前方向,0停止,1前进,2后退,其他无效
|-
|0xXX 1个字节, 第56||右手当前PWM,0- 250,其他无效。
|-
|0xXX 1个字节,第57||BIT0:0:模组拔掉1:模组插上,BIT2-BIT1:00B:插上小夜灯模组01B:插上打枪模组10B:插上USB Camera模组;BIT3 0:TI休眠 1:TI未休眠I;BIT4:0:打枪未被打中,1:打枪被打中;BIT5:1:关机状态,0:开机状态;BIT6:1:充电器插入,0:充电器拔掉
BIT7:0:正在充电,1:供电结束
|}
=====335X 在 编程模式下发送给STM32控制指令=====
{| class="wikitable sortable"
|-
! 序号 !! 状态数据!! 说明
|-
|1||0xXX,一个字节||0x01,表示进入精确运动编程模式,0x02,表示进入自由遥控编程模式,其他无效
|-
|2||0xXX,一个字节||连续指令数,是指指令中需要STM32完成连续动作的数量,0x01 - 0x0A,表示指令中需要STM32连续完成指令动作数量,最小1个,最大20个,其他数据不处理。(左右轮方向有变化必须要做连续指令处理,方向没有变化的情况下,理论上是在画圆弧,直线理解成半径为无限大的圆弧)
|-
|3||0x01,一个字节||第一个指令标示
|-
|4||0xXX,一个字节||左轮设置方向,0停止,1前进,2后退,其他无效
|-
|5||0xXX ,1个字节||左轮速度设置,单位cm/S
|-
|6||0xXX,0xXX,0xXX,0xXX,4个字节||左轮需要运行光栅数。单位个,低位在前,高位在后。范围:0-2147483646。如果要一直运行,可以用最大值。运行距离与光栅转换公式为:S = (L /0.3445379 + 0.5),S为光栅数量,L为运行距离,单位CM
|-
|7||0xXX,一个字节||右轮设置方向,0停止,1前进,2后退,其他无效
|-
|8||0xXX ,1个字节||右轮速度设置,单位cm/S
|-
|9||0xXX,0xXX,0xXX,0xXX,4个字节||右轮需要运行光栅数。单位个,低位在前,高位在后。范围:0-2147483646。如果要一直运行,可以用最大值。运行距离与光栅转换公式为:S = (L /0.3445379 + 0.5),S为光栅数量,L为运行距离,单位CM
|}
=====335X 胳膊控制命令表(在左胳膊命令下,控制左胳膊,右胳膊同理)=====
{| class="wikitable sortable"
|-
! 序号 !! 状态数据!! 说明
|-
|1||0xXX,1个字节||胳膊方向设置,0停止,1前进,2后退,其他无效
|-
|2||0xXX ,1个字节||胳膊PWM设置(0 - 200)
|-
|3||0xXX 0xXX,2个字节||胳膊目标ADC值,低位在前,高位在后
|}
=====335X发送代码数据给STM32数据内容表=====
{| class="wikitable sortable"
|-
! 代码包序号 !! 代码数据
|-
|0x0001,两个字节,低位在前,表示第一包数据,依次递增||代码数据,256个字节,不够256字节补充0xff
|}
=====335X发送knowles代码数据给STM32数据内容表=====
{| class="wikitable sortable"
|-
! 代码包序号 !! 代码数据
|-
|0x0001,两个字节,低位在前,表示第一包数据,依次递增||代码数据,256个字节,'''注意:不够256字节不补充0xff,有多少发多少'''
|}
=====胳膊电角度计算公式=====
*daughter A1,A2,A3版本公式: (A / 330) = (R - 0.1319) / 9.419,R /(R + 4.87) = AD / 4096。AD为发送值,范围为:108 ~ 2700,A为角度值,范围为0°到330°,(330 - 360°不受控),R范围:0.1319 -9.419。如果需要一直转动,发送一个不可到达的AD值即可。
*daughter A4版本版本公式: (A / 330) = (R - 0.1319) / 9.419,R /9.419= AD / 4096。AD为发送值,范围为:108 ~ 4096,A为角度值,范围为0°到330°,(330 - 360°不受控),R范围:0.1319 -9.419。如果需要一直转动,发送一个不可到达的AD值即可。