一拖八RPC接口说明
一拖八烧写器远程过程调用(RPC)接口使用说明
杰理科技
2022年01月10 日
目录
第 1章 介绍....................................................................................................................................... 3
第2章 RPC服务................................................................................................................................4
2.1 启动RPC服务........................................................................................................................... 4
2.2 停止RPC服务........................................................................................................................... 4
第3章 RPC接口............................................................................................................................... 5
3.1 枚举在线的烧写器................................................................................................................... 5
3.2 部署烧录文件到烧写器........................................................................................................... 6
3.3 复位烧写器............................................................................................................................... 7
3.4 发送命令到烧写器端口........................................................................................................... 8
3.4. 1.查询烧写器端口是否有设备.....................................................................................8
3.4.2.发送烧写命令到烧写器端口.....................................................................................9
3.4.3.查询烧写结果........................................................................................................... 10
3.4.4.查询烧写状态........................................................................................................... 12
3.4.5.复位烧写器端口上连接的设备............................................................................... 14
3.4.6.打开烧写器端口供电............................................................................................... 15
3.4.7.关闭烧写器端口供电............................................................................................... 16
第4章 烧写控制流程.....................................................................................................................18
第5章 对比烧写文件和烧写器中烧写文件校验码.................................................................... 19
5.1 获取烧写文件校验码............................................................................................................. 19
5.2 获取烧写器中烧写文件校验码............................................................................................. 19
第6章 Python示例代码................................................................................................................20
第7章 附录..................................................................................................................................... 30
7.1 命令列表1.............................................................................................................................. 30
7.2 命令列表2.............................................................................................................................. 30
7.3 错误号列表............................................................................................................................. 30
7.4 烧写选项................................................................................................................................. 31
7.4. 1.公共选项...................................................................................................................31
7.4.2. AC62N 烧写选项.......................................................................................................31
7.4.3. AC635N 烧写选项.....................................................................................................31
7.4.4. AC695X烧写选项..................................................................................................... 32
第1章 介绍
为支持工厂更好的管控生产过程,此版本烧写器以 HTTP服务方式提供RPC接口,用于支持和第三方管理软件对接。
第2章 RPC服务
烧写器以HTTP服务方式提供RPC接口。本地默认URL地址为“http://127.0.0.1:17117/1TO8”。
2.1 启动RPC服务
需要启动一拖八烧写器RPC服务,以守护进程方式启动烧写器盘符中的burner.exe 即可。以批处理命令方式启动RPC服务,请执行烧写器CDROM设备中的start_daemon. bat。
start_daemon. bat文件内容如下:
burner.exe--daemon--port 17117
只需要启动一个守护进程就可以支持控制多个烧写器。可以通过参数--port指定RPC服务的端口。
2.2 停止RPC服务
需要停止一拖八烧写器RPC服务时,中止burner.exe 即可。以批处理命令方式结束RPC服务,请执行烧写器CDROM设备中的stop_daemon. bat。
stop_daemon. bat文件内容如下:
taskkill /f /im burner.exe
更新烧写器固件,请务必关闭上一个版本的RPC服务进程。
第3章 RPC接口
所有RPC请求都以 POST方式发送JSON格式命令到烧写器的 HTTP服务。更多详细信息请阅读Python示例代码章节。
3.1 枚举在线的烧写器
参数说明:
| 请求参数 | 参数类型 | 说明 |
|---|---|---|
| COMMAND | String | 固定值“LIST” |
返回说明:
| 返回参数 | 参数类型 | 说明 |
|---|---|---|
| COMMNAD | String | 固定值“LIST” |
| RESULT | String | 成功返回 “SUCCESS”,错误返回其他值 |
| DEVICES | Array | 返回所有在线的烧写器 |
| ERROR_CODE | Int | 错误号,详细信息请查看错误号列表 |
| ERROR_MESSAGE | String | 错误信息描述 |
| RESULT | Bool | 命令是否执行成功 |
烧写器信息:
| 参数 | 参数类型 | 说明 |
|---|---|---|
| NAME | String | 烧写器名字 |
| VERSION | String | 烧写器版本,如“UHD2-1T08-0895” |
| BURN_INFO | String | 烧写器当前烧写文件信息和烧写选项信息 |
请求示例:
{
"COMMAND" :"LIST"}
返回示例:
{
"COMMAND" : "LIST",
"DEVICES" : [
{
"BURN_INFO" : "","NAME" : "UHD2-1T08-0895","VERSION" : "4.1.1 "
},
{
"BURN_INFO" : "","NAME" : "UHD2-1T08-0896","VERSION" : "4.1.1,
}
],
"ERROR_CODE" :0,
"ERROR_MESSAGE" :"SUCCESS","RESULT" :true
}
3.2 部署烧录文件到烧写器
部署文件为同步操作, RPC返回需要一定时间,具体时间跟烧写文件大小有关。
参数说明:
| 请求参数 | 参数类型 | 说明 |
|---|---|---|
| COMMAND | String | 固定值“DEPLOY” |
| BURNER | String | 枚举烧写器接口返回的 NAME,如“UHD2-1T08-0895” |
| CHIP | String | 烧录的芯片型号,如“AC695X” |
| FILE | String | 烧录文件的文件名,如 “MY_AC695X[已授权] .fw” |
| DATA | String | Base64格式的烧录文件内容 |
| OPTIONS | Object | 烧写选项,如 { "ERASE_FLASH":True, "LVD":"2.3v" } 详细选项查看附录章节的烧写选项 |
返回说明:
| 返回参数 | 参数类型 | 说明 |
|---|---|---|
| COMMNAD | String | 固定值“DEPLOY” |
| ERROR_CODE | Int | 错误号,详细信息请查看错误号列表 |
| ERROR_MESSAGE | String | 错误信息描述 |
| RESULT | Bool | 命令是否执行成功 |
请求示例:
{
"BURNER" :"UHD2-1T08-0895","CHIP" :"AC632N",
"COMMAND" :"DEPLOY","DATA" :"<Base64烧写文件数据>","FILE" :"AC632N_ [已授权].fw",
"OPTIONS" : {"CHECK_TRIM" :true,"ERASE_FLASH" :true,"LNA_BIAS" :true,"LRC_TRIM" :false,"LVD" :"2.60v",
"OPERATION_TIME" : 1000,"USB_PORT_CURRENT" : 100,"USB_PORT_VOLTAGE" :"4.8 "
}
}
返回示例:
{
"BURNER" :"UHD2-1T08-0895","CHIP" :"AC632N",
"COMMAND" :"DEPLOY","DATA" :"<Base64烧写文件数据>","ERROR_CODE" :0,"ERROR_MESSAGE" :"SUCCESS","FILE" :"AC632N_ [[已授权]].fw",
"OPTIONS" : {"CHECK_TRIM" :true,"ERASE_FLASH" :true,"LNA_BIAS" :true,"LRC_TRIM" :false,"LVD" :"2.60v",
"OPERATION_TIME" : 1000,"USB_PORT_CURRENT" : 100,"USB_PORT_VOLTAGE" :"4.8 "
},
"RESULT" :true}
3.3 复位烧写器
复位烧写器命令用于部署烧写文件后,使烧写文件生效。复位烧写器后,需要使用枚举命令查询烧写文件是否生效。
参数说明:
| 请求参数 | 参数类型 | 说明 |
|---|---|---|
| COMMAND | String | 固定值“REBOOT” |
| BURNER | String | 枚举烧写器接口返回的 NAME,如“UHD2-1T08-0895” |
返回说明:
| 返回参数 | 参数类型 | 说明 |
|---|---|---|
| COMMNAD | String | 固定值“REBOOT” |
| ERROR_CODE | Int | 错误号,详细信息请查看错误号列表 |
|---|---|---|
| ERROR_MESSAGE | String | 错误信息描述 |
| RESULT | Bool | 命令是否执行成功 |
请求示例:
{
"BURNER" :"UHD2-1T08-0895","COMMAND" :"REBOOT"
}
返回示例:
{
"BURNER" :"UHD2-1T08-0895","COMMAND" :"REBOOT","ERROR_CODE" :0,"ERROR_MESSAGE" :"SUCCESS","RESULT" :true
}
3.4 发送命令到烧写器端口
通过发送命令到烧写器端口,可以控制每个烧写器端口的具体操作。控制每个烧写器端口的操作通过RPC命令的BURNER参数和PORT参数控制。具体信息请看本章以下部分。
3.4.1.查询烧写器端口是否有设备
此命令用于对指定的烧写器端口重新上电,检测是否有设备接入。
参数说明:
| 请求参数 | 参数类型 | 说明 |
|---|---|---|
| COMMAND | String | 固定值“DEVICE_QUERY” |
| BURNER | String | 枚举烧写器接口返回的 NAME,如“UHD2-1T08-0895” |
| PORT | Int | 烧写器端口编号,范围0~7 |
返回说明:
| 返回参数 | 参数类型 | 说明 |
|---|---|---|
| COMMNAD | String | 固定值“DEVICE_QUERY” |
| BURNER | String | 请求参数中的 BURNER值 |
| PORT | Int | 请求参数中的端口编号 |
| DEVICE_STATUS | String | 设备进入烧写状态,返回“ONLINE”,其他情况返回“OFFLINE” |
| ERROR_CODE | Int | 错误号,详细信息请查看错误号列表 |
|---|---|---|
| ERROR_MESSAGE | String | 错误信息描述 |
| RESULT | Bool | 命令是否执行成功 |
请求示例:
{
"BURNER" :"UHD2-1T08-0895","COMMAND" :"DEVICE_QUERY","PORT" :7
}
返回示例:
{
"BURNER" :"UHD2-1T08-0895","COMMAND" :"DEVICE_QUERY","DEVICE_STATUS" :"ONLINE","ERROR_CODE" :0,"ERROR_MESSAGE" :"SUCCESS","PORT" :7,
"RESULT" :true}
3.4.2.发送烧写命令到烧写器端口
此命令用于启动指定烧写器端口的烧写程序,对芯片进行烧写。
参数说明:
| 请求参数 | 参数类型 | 说明 |
|---|---|---|
| COMMAND | String | 固定值“BURN” |
| BURNER | String | 枚举烧写器接口返回的 NAME,如“UHD2-1T08-0895” |
| PORT | Int | 烧写器端口编号,范围0~7 |
| ASYNC | Bool | 是否异步, 为true 时,命令直接返回成功,需要通过QUERY_COMMAND_RESULT查询实际烧写结果。 为false时,命令会等待烧写结果再返回。 |
| TIMEOUT | Int | 命令等待超时时间。 当命令为同步模式时有效(即“ASYNC”=false),默认值为10000毫秒。 |
| MAC | String | 可选参数,烧写固件的同时是否烧写蓝牙地址。蓝牙地址格式为HEX字符串。长度固定为12。例如:"MAC":"010203040506" |
| AUTH_CODE | String | 可选参数,烧写固件的同时烧写认证码等第三方数据。 比如三元组,序列号…… 认证码格式为HEX字符串。最长为250。 |
| 例如:"AUTH_CODE":"ABCDEF0123456789" |
|---|
返回说明:
| 返回参数 | 参数类型 | 说明 |
|---|---|---|
| COMMNAD | String | 固定值“DEVICE_QUERY” |
| BURNER | String | 请求参数中的 BURNER值 |
| PORT | Int | 请求参数中的端口编号 |
| ERROR_CODE | Int | 错误号,详细信息请查看错误号列表 |
| ERROR_MESSAGE | String | 错误信息描述 |
| RESULT | Bool | 命令是否执行成功 |
请求示例:
{
"ASYNC" :true,"BURNER" :"UHD2-1T08-0895","COMMAND" :"BURN",
"PORT" :7}
返回示例:
{
"ASYNC" :true,"BURNER" :"UHD2-1T08-0895","COMMAND" :"BURN",
"ERROR_CODE" :0,"ERROR_MESSAGE" :"SUCCESS","PORT" :7,
"RESULT" :true}
3.4.3.查询烧写结果
此命令用于查询指定烧写器端口的烧写结果。可以反复查询多次。
参数说明:
| 请求参数 | 参数类型 | 说明 |
|---|---|---|
| COMMAND | String | 固定值“QUERY_COMMAND_RESULT” |
| BURNER | String | 枚举烧写器接口返回的 NAME,如“UHD2-1T08-0895” |
| PORT | Int | 烧写器端口编号,范围0~7 |
返回说明:
| 返回参数 | 参数类型 | 说明 |
|---|
| COMMNAD | String | 固定值“QUERY_COMMAND_RESULT” |
|---|---|---|
| BURNER | String | 请求参数中的 BURNER值 |
| PORT | Int | 请求参数中的端口编号 |
| COMMAND_RESULT | Object | 如果烧写正在进行中,则返回一个空的JSON Object。如果烧写结果,则返回实际烧写结果。 烧写结果信息如下表。 |
| ERROR_CODE | Int | 错误号,详细信息请查看错误号列表 |
| ERROR_MESSAGE | String | 错误信息描述 |
| RESULT | Bool | 命令是否执行成功 |
烧写结果信息:
| 参数 | 参数类型 | 说明 |
|---|---|---|
| EXPEND_TIME | Int | 烧写使用时间 |
| RESULT | String | 成功返回 “SUCCESS”,错误返回其他值 |
| BURN_FILE_CRC16 | Int | 烧写固件的 16bit校验码 |
| BURN_FILE_CRC32 | Int | 烧写固件的32bit校验码 |
| CRC | String | 烧写固件的校验码 |
| 其他值同返回参数 |
请求示例:
{
"BURNER" :"UHD2-1T08-0895","COMMAND" :"QUERY_COMMAND_RESULT","PORT" :7
}
返回示例:
{
"BURNER" :"UHD2-1T08-0895","COMMAND" :"QUERY_COMMAND_RESULT","COMMAND_RESULT" : {
"ASYNC" :true,"BURNER" :"UHD2-1T08-0895","BURN_FILE_CRC16" :55146,"BURN_FILE_CRC32" :-704842446,"COMMAND" :"BURN","CRC" :"D76A-D5FCF532","ERROR_CODE" :0,"ERROR_MESSAGE" :"SUCCESS","EXPEND_TIME" : 1809,
"PORT" :7
"RESULT" :false },"ERROR_CODE" :0,
"ERROR_MESSAGE" :"SUCCESS","PORT" :7,
"RESULT" :true}
3.4.4.查询烧写状态
此命令用于返回烧写器各个端口当前的烧写状态信息。
参数说明:
| 请求参数 | 参数类型 | 说明 |
|---|---|---|
| COMMAND | String | 固定值“QUERY_BURN_STATUS” |
| BURNER | String | 枚举烧写器接口返回的 NAME,如“UHD2-1T08-0895” |
返回说明:
| 返回参数 | 参数类型 | 说明 |
|---|---|---|
| COMMNAD | String | 固定值“QUERY_BURN_STATUS” |
| BURNER | String | 请求参数中的 BURNER值 |
| STATUS | Array | 每个烧写端口的烧写状态。烧写状态信息如下表。 |
| ERROR_CODE | Int | 错误号,详细信息请查看错误号列表 |
| ERROR_MESSAGE | String | 错误信息描述 |
| RESULT | Bool | 命令是否执行成功 |
烧写状态信息:
| 参数 | 参数类型 | 说明 |
|---|---|---|
| MESSAGE | String | 烧写状态文字 |
| PORT | Int | 烧写器烧写端口号,范围:0~7 |
| PROGRESS | Int | 烧写器端口烧写进度,范围0~ 100 |
请求示例:
{
"BURNER" :"UHD2-1T08-0895",
"COMMAND" :"QUERY_BURN_STATUS"}
返回示例:
{
"BURNER" :"UHD2-1T08-0895","COMMAND" :"QUERY_BURN_STATUS","ERROR_CODE" :0,"ERROR_MESSAGE" :"SUCCESS","RESULT" :true,
"STATUS" : [
{
"MESSAGE" :"等待设备 ","PORT" :0,
"PROGRESS" :0
},
{
"MESSAGE" :"等待设备 ","PORT" : 1,
"PROGRESS" :0
},
{
"MESSAGE" :"等待设备 ","PORT" :2,
"PROGRESS" :0
},
{
"MESSAGE" :"等待设备 ","PORT" :3,
"PROGRESS" :0
},
{
"MESSAGE" :"等待设备 ","PORT" :4,
"PROGRESS" :0
},
{
"MESSAGE" :"等待设备 ","PORT" :5,
"PROGRESS" :0
},
{
3.4.5.复位烧写器端口上连接的设备
此命令后用于复位烧写器端口上的设备。调用此命令后会关闭 USB DP/ DM 口(高阻状态),仅对烧写器端口上的设备进行供电。仅对已经进入烧写模式的设备有效。
参数说明:
| 请求参数 | 参数类型 | 说明 |
|---|---|---|
| COMMAND | String | 固定值“DEVICE_RESET” |
| BURNER | String | 枚举烧写器接口返回的 NAME,如“UHD2-1T08-0895” |
| PORT | Int | 烧写器端口编号,范围0~7 |
返回说明:
| 返回参数 | 参数类型 | 说明 |
|---|---|---|
| COMMNAD | String | 固定值“DEVICE_RESET” |
| BURNER | String | 请求参数中的 BURNER值 |
| PORT | Int | 请求参数中的端口编号 |
| ERROR_CODE | Int | 错误号,详细信息请查看错误号列表 |
| ERROR_MESSAGE | String | 错误信息描述 |
| RESULT | Bool | 命令是否执行成功 |
请求示例:
{
"BURNER" :"UHD2-1T08-0895","COMMAND" :"DEVICE_RESET","PORT" :7
}
返回示例:
{
"BURNER" :"UHD2-1T08-0895","COMMAND" :"DEVICE_RESET","ERROR_CODE" :0,"ERROR_MESSAGE" :"SUCCESS","PORT" :7,
"RESULT" :true}
3.4.6.打开烧写器端口供电
此命令用于打开烧写指定端口的供电。此命令不会使设备进入烧写模式,仅对烧写器端口上的设备进行供电。
参数说明:
| 请求参数 | 参数类型 | 说明 |
|---|---|---|
| COMMAND | String | 固定值“POWER_ON” |
| BURNER | String | 枚举烧写器接口返回的 NAME,如“UHD2-1T08-0895” |
| PORT | Int | 烧写器端口编号,范围0~7 |
返回说明:
| 返回参数 | 参数类型 | 说明 |
|---|---|---|
| COMMNAD | String | 固定值“POWER_ON” |
| BURNER | String | 请求参数中的 BURNER值 |
| PORT | Int | 请求参数中的端口编号 |
| ERROR_CODE | Int | 错误号,详细信息请查看错误号列表 |
| ERROR_MESSAGE | String | 错误信息描述 |
| RESULT | Bool | 命令是否执行成功 |
请求示例:
{
"BURNER" :"UHD2-1T08-0895","COMMAND" :"POWER_ON","PORT" :7
}
返回示例:
{
"BURNER" :"UHD2-1T08-0895","COMMAND" :"POWER_ON","ERROR_CODE" :0,"ERROR_MESSAGE" :"SUCCESS","PORT" :7,
"RESULT" :true}
3.4.7.关闭烧写器端口供电
此命令用于关闭烧写指定端口的供电。
参数说明:
| 请求参数 | 参数类型 | 说明 |
|---|---|---|
| COMMAND | String | 固定值“POWER_OFF” |
| BURNER | String | 枚举烧写器接口返回的 NAME,如“UHD2-1T08-0895” |
| PORT | Int | 烧写器端口编号,范围0~7 |
返回说明:
| 返回参数 | 参数类型 | 说明 |
|---|---|---|
| COMMNAD | String | 固定值“POWER_OFF” |
| BURNER | String | 请求参数中的 BURNER值 |
| PORT | Int | 请求参数中的端口编号 |
| ERROR_CODE | Int | 错误号,详细信息请查看错误号列表 |
| ERROR_MESSAGE | String | 错误信息描述 |
| RESULT | Bool | 命令是否执行成功 |
请求示例:
{
"BURNER" :"UHD2-1T08-0895","COMMAND" :"POWER_OFF","PORT" :7
}
返回示例:
{
"BURNER" :"UHD2-1T08-0895","COMMAND" :"POWER_OFF","ERROR_CODE" :0,"ERROR_MESSAGE" :"SUCCESS",
"PORT" :7,
"RESULT" :true}
第4章 烧写控制流程
a. 所有烧写器升级到支持RPC模式的版本后,连接到电脑上。
b. 通过烧写器盘符中的 burner.exe启动烧写器RPC服务。 多台烧写器仅需启动一个RPC 服务。启动RPC服务方法请查看启动RPC服务章节。
c. 获取所有连接到电脑的烧写器。命令格式请查看枚举在线的烧写器章节。
d. 部署烧写文件、设置烧写选项到所有烧写器。命令格式请查看部署烧录文件到烧写器章节。
e. 复位所有烧写器。命令格式请查看复位烧写器章节。
f. 循环查看所有烧写器的所有端口是否有设备已连接成功。命令格式请查看查询烧写器端口是否有设备章节。
g. 发现某烧写器某端口有设备已经连接成功后,发送烧写命令到某烧写器的某端口。命令格式请查看发送烧写命令到烧写器端口章节。
h. 如需要查询烧写进度。命令格式请查看查询烧写状态章节。
i. 获取某烧写器的某端口的烧写结果。命令格式请查看查询烧写结果章节。
j. 如烧写成功后需要复位烧写设备,进行其他操作。可以发送复位命令到烧写器端口。命令格式请查看复位烧写器端口上连接的设备章节。
第5章 对比烧写文件和烧写器中烧写文件校验码
为避免重复部署烧写文件,可以通过获取烧写文件校验码和烧写器中烧写文件校验码来进行对比,判读是否需要部署烧写文件。
5.1 获取烧写文件校验码
通过 “校验码命令行查看工具_2.1.7.exe”工具可以查看烧写文件校验码。命令参数和校验码信息如下图所示。
5.2 获取烧写器中烧写文件校验码
如烧写器中部署了烧写文件。枚举在线的烧写器的时候,RPC命令会返回烧写器中的烧写文件信息。如下图所示。
第6章 Python示例代码
#!/usr/bin/python3
#
# 此脚本仅用于演示一拖八RPC接口调用#
import
import
import
import
import
import
sys
json requests base64
time os
# http
url = "http://127.0.0.1:17117/1TO8"
headers = {'Content-Type' : 'application/json' }
# 在线的烧写器 g_online1_to8_devies = []
#枚举所有烧写器 def list ( show=True ) :
print ( "正在枚举烧写器") ;
command = {}
command ["COMMAND"] = "LIST"
try :
[r = requests.post](r = requests.post) (url, data=json.dumps(command), headers=headers)
except Exception :
print ( "网络错误")
return False
if 200 != r.status_code :
print ( "枚举烧写器失败")
print (r.status_code)
return False
reply_text = r.text ;
reply = json.loads (reply_text)
print ( "发送")
print (json.dumps (command, sort_keys=True, indent=4, separators=(',', ' 😂)) print ( "接收")
print (json.dumps (reply, sort_keys=True, indent=4, separators=(',', ' 😂))
if 0 != reply [ "ERROR_CODE"] :
print ( "枚举烧写器失败")
print (reply ["ERROR_MESSAGE"])
return False
if True == show :
print (reply)
global g_online1_to8_devies
g_online1_to8_devies = reply [ "DEVICES"]
count = len (g_online1_to8_devies)
if 0 == count :
if True == show :
print ( "没有发现烧写器")
return False if True == show :
print ( "在线烧写器个数: {0}".format(count))
for device in g_online1_to8_devies :
print ( "************ 烧 写 器 : {name} 版 本 ={ver }
".format (name=device [ "NAME"],ver=device ["VERSION"]))
print (device [ "BURN_INFO"].strip ())
print ( "***************************************")
return True
#部署烧写文件到烧写器, 此命令暂时是同步的 def deploy (chip, file, burner) :
try :
fhandle = open (file, "rb")
[data = fhandle.read](data = fhandle.read) ()
fhandle.close ()
except Exception :
print ( "文件不存在或者读取文件失败: 文件={0}".format(file))
return False
# 获取烧写文件校验码
res_lines = os.popen ( " 校 验 码 命 令 行 查 看 工 具 _2.1.7.exe {file}".format (file=file)).readlines ()
file_crc = ""
for line in res_lines :
line = line.strip ()
if 0 == line.find ( "Firmware Checksum 😊 :
file_crc = line [-13 :].lower ()
break
if 0 == line.find ( "固件校验码:") :
file_crc = line [-13 :].lower ()
break
# 获取烧写器当前烧写文件校验码 burn_file_crc = ""
burn_infos = burner [ "BURN_INFO"].splitlines () ;
for info in burn_infos :
info = info.strip ()
if 0 == info.find ( "CRC:") :
burn_file_crc = info [-13 :].lower ()
break
print ( "要部署的烧写文件校验码 : {0}".format(file_crc))
print ( "烧写器中的烧写文件校验码: {0}".format(burn_file_crc))
# 比较校验码是否一致
if burn_file_crc == file_crc :
print ( "烧写文件一致,不需要重新部署")
return True
base64_data = base64.b64encode (data)
# 组装命令 command = {}
command ["COMMAND"] = "DEPLOY"
command ["BURNER"] = burner [ "NAME"]
command ["CHIP"] = chip
command ["FILE"] = file
command ["DATA"] = str (base64_data,"utf-8")
#烧写选项
options = json.loads (' {}')
#options [ "BATTERY_SUPPLY"] = False options ["CHECK_TRIM"] = True options ["ERASE_FLASH"] = True options ["LNA_BIAS"] = True
#options [ "LONG_RESET_EN"] = False options ["LRC_TRIM"] = False
#options [ "LVD"] = "Disable"options ["LVD"] = "2.60v"options ["OPERATION_TIME"] = 1000
#options [ "SFC_CHECK"] = "Soundbox"
#options [ "SHORT_RESET_EN"] = False
#options [ "USB_ISP"] = True options ["USB_PORT_CURRENT"] = 100
options ["USB_PORT_VOLTAGE"] = "4.8"
command ["OPTIONS"] = options
try :
[r = requests.post](r = requests.post) (url, data=json.dumps(command), headers=headers)
except Exception :
print ( "网络错误")
return False reply_text = r.text ;
reply = json.loads (reply_text)
command ["DATA"] = "<Base64烧写文件数据>"
reply [ "DATA"] = "<Base64烧写文件数据>"
print ( "发送")
print (json.dumps (command, sort_keys=True, indent=4, separators=(',', ' 😂))
print ( "接收")
print (json.dumps (reply, sort_keys=True, indent=4, separators=(',', ' 😂))
if 0 != reply [ "ERROR_CODE"] :
print ( " 部 署 烧 写 文 件 失 败 , 文 件 ={file}, 错 误
={error }".format (file=file, error=reply [ "RESULT"]))
return False print ( "部署烧写文件成功,文件={0}".format(file)) return True
# 发送命令到烧写器
def command ( burner, command_text ) :
command = {}
command ["COMMAND"] = command_text
command ["BURNER"] = burner
try :
[r = requests.post](r = requests.post) (url, data=json.dumps(command), headers=headers)
except Exception :
print ( "网络错误")
return False reply_text = r.text ;
reply = json.loads (reply_text)
print ( "发送")
print (json.dumps (command, sort_keys=True, indent=4, separators=(',', ' 😂))
print ( "接收")
print (json.dumps (reply, sort_keys=True, indent=4, separators=(',', ' 😂))
if 0 != reply [ "ERROR_CODE"] :
return False return True
# 发送命令到烧写器端口
def command_to_port ( burner, port, command_text ) :
command = {}
command ["COMMAND"] = command_text
command ["BURNER"] = burner
command ["PORT"] = port
try :
[r = requests.post](r = requests.post) (url, data=json.dumps(command), headers=headers)
except Exception :
print ( "网络错误")
return False reply_text = r.text ;
reply = json.loads (reply_text)
print ( "发送")
print (json.dumps (command, sort_keys=True, indent=4, separators=(',', ' 😂))
print ( "接收")
print (json.dumps (reply, sort_keys=True, indent=4, separators=(',', ' 😂))
if 0 != reply [ "ERROR_CODE"] :
return False return True
# 复位烧写器, 复位后如发现有ADC错误,请手动给烧写器重新上电 def reboot ( burner ) :
command = {}
command ["COMMAND"] = "REBOOT"
command ["BURNER"] = burner
try :
[r = requests.post](r = requests.post) (url, data=json.dumps(command), headers=headers)
except Exception :
print ( "网络错误")
return False reply_text = r.text ;
reply = json.loads (reply_text)
print ( "发送")
print (json.dumps (command, sort_keys=True, indent=4, separators=(',', ' 😂))
print ( "接收")
print (json.dumps (reply, sort_keys=True, indent=4, separators=(',', ' 😂))
if 0 != reply [ "ERROR_CODE"] :
print ( "复位烧写器失败, 烧写器={0},错误信息={1}".format(burner, reply [ "RESULT"]))
return False print ( "复位烧写器成功,烧写器={0}".format(burner))
time.sleep (5)
return True
# 查询烧写器端口是否有设备
def device_query (burner, port) :
command = {}
command ["BURNER"] = burner
command ["PORT"] = port
command ["COMMAND"] = "DEVICE_QUERY"
try :
[r = requests.post](r = requests.post) (url, data=json.dumps(command), headers=headers)
except Exception :
print ( "网络错误")
return False reply_text = r.text ;
reply = json.loads (reply_text)
print ( "发送")
print (json.dumps (command, sort_keys=True, indent=4, separators=(',', ' 😂))
print ( "接收")
print (json.dumps (reply, sort_keys=True, indent=4, separators=(',', ' 😂))
if 0 != reply [ "ERROR_CODE"] :
return False
if "ONLINE" != reply [ "DEVICE_STATUS"] :
return False return True
# 复位设备
def device_reset (burner, port) :
command = {}
command ["BURNER"] = burner
command ["PORT"] = port
command ["COMMAND"] = "DEVICE_RESET"
try :
[r = requests.post](r = requests.post) (url, data=json.dumps(command), headers=headers)
except Exception :
print ( "网络错误")
return False reply_text = r.text ;
reply = json.loads (reply_text)
print ( "发送")
print (json.dumps (command, sort_keys=True, indent=4, separators=(',', ' 😂))
print ( "接收")
print (json.dumps (reply, sort_keys=True, indent=4, separators=(',', ' 😂))
if 0 != reply [ "ERROR_CODE"] :
return False return True
# 发送烧写命令
def burn (burner, port, ASYNC=True) : # ASYNC=True 是否异步
command = {}
command ["BURNER"] = burner
command ["PORT"] = port
command ["COMMAND"] = "BURN"
command ["ASYNC"] = ASYNC
command ["MAC"] = "010203040506"
command ["AUTH_CODE"] = "ABCDEF0123456789"
try :
[r = requests.post](r = requests.post) (url, data=json.dumps(command), headers=headers)
except Exception :
print ( "网络错误")
return False reply_text = r.text ;
reply = json.loads (reply_text)
print ( "发送")
print (json.dumps (command, sort_keys=True, indent=4, separators=(',', ' 😂))
print ( "接收")
print (json.dumps (reply, sort_keys=True, indent=4, separators=(',', ' 😂))
if 0 != reply [ "ERROR_CODE"] :
return False return True
# 查询进度信息
def query_burn_status (burner) :
command = {}
command ["BURNER"] = burner
command ["COMMAND"] = "QUERY_BURN_STATUS"
try :
[r = requests.post](r = requests.post) (url, data=json.dumps(command), headers=headers)
except Exception :
print ( "网络错误")
return False reply_text = r.text ;
reply = json.loads (reply_text)
print ( "发送")
print (json.dumps (command, sort_keys=True, indent=4, separators=(',', ' 😂))
print ( "接收")
print (json.dumps (reply, sort_keys=True, indent=4, separators=(',', ' 😂))
if 0 != reply [ "ERROR_CODE"] :
return False return True
# 查询指定端口烧写结果
def query_burn_result (burner,port) :
command = {}
command ["BURNER"] = burner
command ["PORT"] = port
command ["COMMAND"] = "QUERY_COMMAND_RESULT"
try :
[r = requests.post](r = requests.post) (url, data=json.dumps(command), headers=headers)
except Exception :
print ( "网络错误")
return False reply_text = r.text ;
reply = json.loads (reply_text)
print ( "发送")
print (json.dumps (command, sort_keys=True, indent=4, separators=(',', ' 😂))
print ( "接收")
print (json.dumps (reply, sort_keys=True, indent=4, separators=(',', ' 😂))
if 0 != reply [ "ERROR_CODE"] :
return False
if reply [ "COMMAND_RESULT"] == json.loads (' {}') :
return False return True
def port_offline_check ( burner, port ) :
command = {}
command ["COMMAND"] = "DEVICE_CHECK"
command ["BURNER"] = burner
command ["PORT"] = port
try :
[r = requests.post](r = requests.post) (url, data=json.dumps(command), headers=headers)
except Exception :
print ( "网络错误")
return False reply_text = r.text ;
reply = json.loads (reply_text)
print ( "发送")
print (json.dumps (command, sort_keys=True, indent=4, separators=(',', ' 😂))
print ( "接收")
print (json.dumps (reply, sort_keys=True, indent=4, separators=(',', ' 😂))
if "DEVICE OFFLINE" != reply [ "RESULT"] :
return False return True
def device_remove ( burner, port ) :
command = {}
command ["COMMAND"] = "DEVICE_REMOVE"
command ["BURNER"] = burner
command ["PORT"] = port
try :
[r = requests.post](r = requests.post) (url, data=json.dumps(command), headers=headers)
except Exception :
print ( "网络错误")
return False reply_text = r.text ;
reply = json.loads (reply_text)
print ( "发送")
print (json.dumps (command, sort_keys=True, indent=4, separators=(',', ' 😂))
print ( "接收")
print (json.dumps (reply, sort_keys=True, indent=4, separators=(',', ' 😂))
if "DEVICE OFFLINE" != reply [ "RESULT"] :
return False return True
def device_power_on ( burner, port ) :
command = {}
command ["COMMAND"] = "POWER_ON"
command ["BURNER"] = burner
command ["PORT"] = port
print (command)
try :
[r = requests.post](r = requests.post) (url, data=json.dumps(command), headers=headers)
except Exception :
print ( "网络错误")
return False reply_text = r.text ;
reply = json.loads (reply_text)
print ( "发送")
print (json.dumps (command, sort_keys=True, indent=4, separators=(',', ' 😂))
print ( "接收")
print (json.dumps (reply, sort_keys=True, indent=4, separators=(',', ' 😂))
if "DEVICE OFFLINE" != reply [ "RESULT"] :
return False return True
def device_power_off ( burner, port ) :
command = {}
command ["COMMAND"] = "POWER_OFF"
command ["BURNER"] = burner
command ["PORT"] = port
print (command)
try :
[r = requests.post](r = requests.post) (url, data=json.dumps(command), headers=headers)
except Exception :
print ( "网络错误")
return False reply_text = r.text ;
reply = json.loads (reply_text)
print ( "发送")
print (json.dumps (command, sort_keys=True, indent=4, separators=(',', ' 😂))
print ( "接收")
print (json.dumps (reply, sort_keys=True, indent=4, separators=(',', ' 😂))
if "DEVICE OFFLINE" != reply [ "RESULT"] :
return False return True
第7章 附录
7.1 命令列表1
此命令列表命令为烧写器支持的命令
| 命令 | 说明 |
|---|---|
| LIST | 枚举烧写器 |
| DEPLOY | 部署烧写文件到烧写器 |
| REBOOT | 复位烧写器 |
7.2 命令列表2
此命令列表命令为烧写器端口支持的命令
| 命令 | 说明 |
|---|---|
| BURN | 发送 |
| DEVICE_QUERY | 查询端口是否有设备在线 |
| DEVICE_RESET | 复位端口上的设备 |
| QUERY_BURN_STATUS | 发送异步烧写命令后,通过此命令查询烧写进度 |
| QUERY_COMMAND_RESULT | 发送异步烧写命令后,通过此命令查询烧写结果 |
7.3 错误号列表
| 错误号 | 说明 |
|---|---|
| 0 | 成功,没有错误 |
| 1 | 烧写器不在线 |
| 2 | 命令超时 |
| 3 | 无效的命令 |
| 4 | 无效的参数 |
| 5 | 无效的烧写文件数据 |
| 6 | 无效的文件类型 |
| 7 | 不支持的芯片型号 |
| 8 | 部署烧写文件失败 |
| 9 | 烧写器模式错误,烧写器拨码开关不正确 |
| 10 | 启动烧写设备失败, USB链接不稳定或者芯片有问题 |
| 11 | 烧写设备离线,无法执行指定命令 |
| 12 | 烧写设备失败 |
7.4 烧写选项
7.4.1.公共选项
| 选项 | 参数类型 | 默认值 | 范围 | 对应GUI烧写选项 |
|---|---|---|---|---|
| OPERATION_TIME | Int | 1000 | 0 ~ 10000 | 换板时间(毫秒) |
| USB_PORT_CURRENT | Int | 100 | 0 ~ 300 | 端口电流允许上限(毫安) |
| USB_PORT_VOLTAGE | String | "4.8" | "3.2 " ~ "6.7 " (最小间隔"0.1 ") | USB端口电压(V) |
7.4.2. AC62N烧写选项
| 选项 | 参数类型 | 默认值 | 范围 | 对应GUI烧写选项 |
|---|---|---|---|---|
| ERASE_FLASH | Bool | true | true,false | 烧写前擦除整个FLASH |
| CHECK_TRIM | Bool | true | true,false | 校准查询 |
| LRC_TRIM | Bool | false | true,false | 免晶振方案 |
| LNA_BIAS | Bool | true | true,false | LNA_BIAS |
| SHORT_RESET_EN | Bool | true | true,false | 使能PB2短按复位功能 |
| LONG_RESET_EN | Bool | true | true,false | 使能PA9长按复位功能 |
| LVD | String | " 1.55v" | " 1.55v", " 1.70v", " 1.85v", "2.00v", "2. 15v", "2.30v", "2.45v", "2.60v", "Disable" | LVD 电压 |
7.4.3. AC635N烧写选项
| 选项 | 参数类型 | 默认值 | 范围 | 对应GUI烧写选项 |
|---|---|---|---|---|
| ERASE_FLASH | Bool | true | true, false | 烧写前擦除整个FLASH |
| CHECK_TRIM | Bool | true | true, false | 校准查询 |
| LRC_TRIM | Bool | false | true, false | 免晶振方案 |
| USB_ISP | Bool | true | true, false | USB/ ISP |
| IQ_TRIM | Bool | true | true, false | IQ_TRIM |
| LVD | String | "2.3v" | " 1.9v", "2.0v", "2. 1v", "2. 2v", "2.3v", "2.4v", | LVD 电压 |
| "2.5v", "2.6v" | ||||
|---|---|---|---|---|
| SFC_CHECK | String | "Soundbox" | “Other,”“Soundbox” | SFC校验(其他方案,音箱方案) |
7.4.4. AC695X烧写选项
| 选项 | 参数类型 | 默认值 | 范围 | 对应GUI烧写选项 |
|---|---|---|---|---|
| ERASE_FLASH | Bool | true | true, false | 烧写前擦除整个FLASH |
| CHECK_TRIM | Bool | true | true, false | 校准查询 |
| LRC_TRIM | Bool | false | true, false | 免晶振方案 |
| USB_ISP | Bool | true | true, false | USB/ ISP |
| IQ_TRIM | Bool | true | true, false | IQ_TRIM |
| BATTERY_SUPPLY | Bool | false | true, false | 设备带电池 |
| LVD | String | "2. 6v" | " 1.9v", "2.0v", "2. 1v", "2. 2v", "2.3v", "2.4v", "2.5v", "2.6v" | LVD 电压 |
| SFC_CHECK | String | "Soundbox" | “Other,”“Soundbox” | SFC校验(其他方案,音箱方案) |