# 华为云YAT产品对接协议
华为平台的识别码为:0x05
版本 | 修订内容 | 修订者 |
0.1.0 | 1,添加鸿蒙的参数。 | |
0.0.9 | 1,添加2.1.5节设置配置表指令。 | |
0.0.8 | 1,配置表中添加适用与EMW3010的字段。 | |
0.0.7 | 1,增加设备OTA指令。 | |
0.0.6 | 1,增加TLV指令。 | |
0.0.5 | 1,添加5.1节。 | |
0.0.4 | 1,添加配置表生成说明。 2,修正配置文件下载地址。 | |
0.0.3 | 1,添加示例说明。 2,修改配置表中permissions的对象结构。 | |
0.0.2 | 1,在4.1.1中添加属性上报后的应答。 | |
0.0.1 | 1,初版。 |
#1. 配置表
模组中需要一张配置表,用来设置模块的一些基本设置、平台的产品注册信息、产品功能定义。整张表使用json格式。
{
"hilink": {
"ver": "1.0.0", // 配置表的版本信息。
"baud": 115200, // wifi模块与设备串口通讯的波特率。
"mode": 1, // 0=json模式,1=tlv模式。
"configType": 0, // 仅适用于EMW3010,0-上电不进入配网,1-上电自动进入配网。默认为1。
"nan": 1, // 仅适用于EMW3010,1-开启超短距离配网。0-不开启。
"distancePwr": -45, // 仅适用于EMW3010,开启超短距离配网后,配网的RF功率。
"surfacePwr": 8, // 仅适用于EMW3010,开启超短距离配网后,设备发现的RF功率。
"config": {
"product_id": "2ARR",
"product_key":"5d64a1742886456d9933de2573b0c7d0",
"product_series":"",
"brand":"mxchip",
"device_type": "029",
"device_model": "yat",
"manuafacturer": "01A",
"device_type_name": "Fan",
"manuafacturer_name": "MXCHIP",
"ac": "273E58605F593A30715F52783253254A304DBEAEC33C3F88BB15225EE55F249FDEA6674210DD9E7D8196254C9E0BF555",
"bi": "",
"hw_ver":"1.0.1"
},
"profile": [
{
"tag": 1,
"identifier": "switch",
"ServiceType": "switch",
"dataType": "struct",
"struct": [
{
"tag": 2,
"identifier": "on",
"dataType": "bool",
"permissions": {
"PUT": 1,
"GET": 1,
"REPORT": 1
}
}
]
},
{
"tag": 3,
"identifier": "mode",
"ServiceType": "mode",
"dataType": "struct",
"struct": [
{
"tag": 4,
"identifier": "mode",
"dataType": "enum",
"permissions": {
"PUT": 1,
"GET": 1,
"REPORT": 1
}
}
]
},
{
"tag": 5,
"identifier": "fan",
"ServiceType": "fan",
"dataType": "struct",
"struct": [
{
"tag": 6,
"identifier": "angle",
"dataType": "enum",
"permissions": {
"PUT": 1,
"GET": 1,
"REPORT": 1
}
},
{
"tag": 7,
"identifier": "speed",
"dataType": "int",
"permissions": {
"PUT": 1,
"GET": 1,
"REPORT": 1
}
}
]
},
{
"tag": 8,
"identifier": "onOffBeep",
"ServiceType": "switch",
"dataType": "struct",
"struct": [
{
"tag": 9,
"identifier": "on",
"dataType": "bool",
"permissions": {
"PUT": 1,
"GET": 1,
"REPORT": 1
}
}
]
},
{
"tag": 10,
"identifier": "battery",
"ServiceType": "battery",
"dataType": "struct",
"struct": [
{
"tag": 11,
"identifier": "level",
"dataType": "int",
"permissions": {
"PUT": 0,
"GET": 1,
"REPORT": 1
}
}
]
}
]
}
}
#1.1. 基本信息
基本设置主要包括:
ver | 配置表的版本信息。使用字符串形式。如"ver":"1.0.0"。 |
baud | 串口波特率。WiFi模块默认使用115200。 |
mode | 指定当前模块通讯协议用的是JSON还是TLV。0-JSON模式,1-TLV模式。 |
configType | 仅适用于EMW3010,0-上电不进入配网,1-上电自动进入配网。默认为1。 |
nan | 仅适用于EMW3010,1-开启超短距离配网。0-不开启。(暂停使用) |
distancePwr | 仅适用于EMW3010,开启超短距离配网后,配网的RF功率。(暂停使用) |
surfacePwr | 仅适用于EMW3010,开启超短距离配网后,设备发现的RF功率。(暂停使用) |
config | 产品的注册信息。 |
profile | 产品的功能定义信息。 |
#1.2. 产品注册信息
产品信息是在华为后台注册产品时,由华为后台生成的。主要根据后台的项目详情中的内容和固件检查与帮助中的内容,来填写配置表中的config部分。
项目详情如下图:
固件检查与帮助如下图:
根据详情的内容,填写配置表中的"config"。
product_id | 对应ProdID。 |
product_key | 对应ProdKey。(鸿蒙新增) |
brand | 对应品牌英文名(BrandEn,鸿蒙新增) |
device_type | 对应DeviceTypeID。 |
device_model | 对应产品型号。 |
manuafacturer | 对应ManufactureID。 |
device_type_name | 对应品类英文名。 |
manuafacturer_name | 对应账号基本资料中的“企业英文名简称”。 |
ac | 点击项目详情中的AC Key的下载连接。 "ac"的值需要字符串形式,而从华为后台拿到的原始值是hex形式。所以需要转成字符形式后放到配置表中。如0xA1,放到配置表中为"A1"。 |
bi | 点击项目详情中的BI Key的下载连接。 |
hw_ver | 对应hardwareVer。(鸿蒙新增) |
#1.3. 产品功能定义信息
产品的功能定义,是厂家在后台的功能定义页面中定义的产品功能属性。
下面表格是一个风扇的profile文件,从华为后台导出。profile文件中定义了风扇产品的产品功能定义。
下面表格中,"服务sid"中的第一服务是"switch",这个服务代表了风扇的开关。这个服务下面有一个属性"on",这个属性具体指示了风扇的开关状态。
每个属性都有一个操作权限。其中,"REPORT":代表在状态发生改变时,需要上报。"GET":代表这个属性,云端会进行查询。注意:云端进行查询时,下发是这些属性对应的服务,应答时,需要把这个服务下,所有带GET操作权限的属性放一起上报。"PUT":代表云端会下发对这个属性的控制。
当然,一个服务下面,可以有多个属性。如"fan"这个服务下,有两个属性,分别是"angle"和"speed"。各代表了送风的角度和风速。
根据profile表格来填写配置文件中的"profile"部分。
配置表中的"profile"是一个json数组。每个元素对应一个服务。每个元素下面嵌套一个或多个属性。
下面以"fan"这个服务来说明。
{
"tag": 5, // 服务和属性的唯一标识,配置表中不能出现相同的tag。
"identifier": "fan", // 服务sid。
"ServiceType": "fan", // 服务类型。
"dataType": "struct", // 说明服务中嵌套属性。
"struct": [
{
"tag": 6, // 服务和属性的唯一标识。
"identifier": "angle", // angle属性。
"dataType": "enum", // 属性的数据类型。
"permissions": { // 属性的操作权限。
"PUT": 1, // 云端会下发该属性。
"GET": 1, // 云端会查询该属性。
"REPORT": 1 // 需要上报云端该属性。
}
},
{
"tag": 7, // 服务和属性的唯一标识。
"identifier": "speed", // speed属性。
"dataType": "int", // 属性的数据类型。
"permissions": { // 属性的操作权限。
"PUT": 1, // 云端会下发该属性。
"GET": 1, // 云端会查询该属性。
"REPORT": 1 // 需要上报云端该属性。
}
}
]
}
"tag"的值是当前服务或属性的唯一标识,配置表中不能出现相同的tag。
"identifier"表示的是一个服务或属性的名称。
"ServiceType"表示的服务的类型。对于一些自定义的服务,没有指定服务类型,那这里可以填写对应的服务名称,即填写identifier值即可。
注意:现在鸿蒙后台导出的profile中,已经没有ServiceType,所以这里需要填写对应的服务名称。
"dataType"是当前服务或属性的数据类型。服务中可能有多个属性,所以数据类型默认为struct。而属性的数据类型,根据profile表中的数据类型来确定。
"permissions"是属性特有的。表示当前属性的操作权限。如temper服务中的current属性,可以执行GET和REPORT操作,但是没有PUT操作,即不能云端设置参数,而同一服务下的set属性,就可以进行设置。对于可执行的操作,赋值为1,没有的操作,赋值为0。
注意:update,netInfo,timer,delay这几个服务是集成在SDK中,所以不需要把这些服务及其服务中的属性定义到配置表中。
#1.4. 配置表转bin文件
配置表完成后,需要转成bin文件,然后再烧写到WiFi模块中。
#1.4.1. 配置文件生成工具
#1.4.2. 使用方法
<span class="ne-text">在华为的后台下载产品的product文件和profile文件。</span>
点击产品截图中的红圈位置,导出product_xxxx.json文件,其中xxxx是设备的product id。
点击详情页面按下图下载profile_xxxx.json文件。
把product_xxxx.json和profile_xxxx.json文件放到ohos_yat_confing.py相同的目录下,在命令行执行"Python3 ohos_yat_config.py", 则会提示选择对应产品的product id,输入串口波特率和选择json还是tlv等信息,最后在这个目录下生成Config_xxxx.bin文件。
配置表完成后,需要烧写到WiFi模块中,烧写地址为如下。
模块 | 配置表烧写起始地址 | Token地址 |
EMW3080,EMW5080 | 0x080E5000 | 不需要烧录Token |
EMW3010 | 0x001F0000 | 0x1E3000 |
EMC3090 | 0xA000 | 0x1F9000 |
#1.5. token的生成下载方法
#1.5.1.1. 申请激活码
激活码公钥生成方式:参考链接:生成私钥与公钥 (opens new window)
- 准备一台安装有OpenSSL的PC。Linux系统的PC通常自带OpenSSL,推荐使用。
- 在命令行窗口中,执行如下命令,生成私钥。
openssl genrsa -out rsa_private_key.pem 1024
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt >> privatekey.txt
<span class="ne-text" style="color: rgb(36, 39, 40); font-size: 16px">命令执行成功后,得到“rsa_private_key.pem”(标准格式)和“privatekey.txt”(pkcs8格式)两个私钥文件。前者用于生成公钥文件;后者用于解密激活码文件。</span>
- 继续执行如下命令,生成私钥对应的公钥。
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
<span class="ne-text" style="color: rgb(36, 39, 40); font-size: 16px">命令执行成功后,得到“rsa_public_key.pem”文件。用文件编辑器打开该文件,拷贝公钥信息(</span>**<span class="ne-text" style="color: rgb(36, 39, 40); font-size: 16px">不要拷贝第一行和最后一行</span>**<span class="ne-text" style="color: rgb(36, 39, 40); font-size: 16px">,亦即“BEGIN PUBLIC KEY”、“END PUBLIC KEY”所在的两行信息),以备后续</span>[<span class="ne-text">申请激活码</span>](https://developer.huawei.com/consumer/cn/doc/development/SmartDevicePartner-Guides/deviceauthorization-0000001134626077#ZH-CN_TOPIC_0000001134626077__section148301230122317)<span class="ne-text" style="color: rgb(36, 39, 40); font-size: 16px">使用。</span>
<span class="ne-text" style="color: rgb(36, 39, 40); font-size: 16px"></span>
#1.5.1.2. 激活码解密
<span class="ne-text">从华为官网下载下来的激活码文件是一个*.lic文件这个文件是加密的,需要通过工具解密。</span>[📎token_解密工具(Java版).rar](/attach/zh/token_解密工具(Java版).rar)
<span class="ne-text">运行如下命令解密</span>
java -jar decode.jar MXCHIP_TEST01_00120210611.lic authorized.zip privatekey.txt
<span class="ne-text">其中privatekey.txt就是上面产生public_key时创建的文件,decode.jar就是压缩包里面的文件,lic文件就是官网下载的授权的加密文件,authorized.zip就是产生的解密后的token文件,每一行代表一个token。</span>
<span class="ne-text"></span>
#1.5.1.3. 转换为token.bin文件
<span class="ne-text">解压token_parse.zip文件,解压出authorized.zip文件,在CMD执行命令:</span>
`token_parse.exe 00f778c3-0b22-41ea-9cf2-72693b74c3b2.txt`
<span class="ne-text">则会把txt里面的所有token产生成独立的bin文件,假设申请了100个token,则会产生100个bin文件。</span>
<span class="ne-text"></span>
#1.5.1.4. token烧录
<span class="ne-text">大批量生产请使用MXCHIP的BAT烧录系统。</span>
<span class="ne-text">研发人员可以通过原厂工具把上面生成的token.bin文件烧录。EMC3090请使用imagetool,烧录地址是0x1F9000. EMW3010请使用hiBurn,烧录地址0x1E3000。</span>
#2. 通用指令集
#2.1. 基础指令集
#2.1.1. 测试
见《通用通讯协议》
#2.1.2. 重启
见《通用通讯协议》
#2.1.3. 恢复出厂
见《通用通讯协议》
注:华为平台YAT只实现第一种情况:清除配网参数,并重启设备。
#2.1.4. 查询模组软件版本
见《通用通讯协议》
注:返回的是模块的SN。
#2.1.5. 设置产品属性配置表
属性配置表除了可以直接烧写到WiFi模块中,还可以通过指令写入WiFi模块。配置文件大于 512 Bytes 后需要分片传输。WiFi模块通过串口接收到配置表后,会与WiFi模块内部的配置表作对比,如果一致,WiFi模块继续运行;如果不一致,则会把配置文件存储到flash中,然后重启WiFi模块。
WiFi->MCU
IMC | 值 | 说明 | |
TYPE | 0x06 | 固定值 | |
PAYLOAD | File length | 2 Byte | 属性配置表长度 |
Start Addr | 2 Byte | 文件起始地址 | |
End Addr | 2 Byte | 文件截止地址 | |
Data | n Byte | 文件数据,n=1~512 | |
CRC8 |
WiFi->MCU
IMC | 值 | 说明 | |
Type | 0x06 | 固定值 | |
PAYLOAD | code | 1 Byte | 上报结果:0-成功;1-失败 |
CRC8 |
示例:
配置文件长度为 606 Bytes,文件大于 512 Bytes,需要分包传输。第一包发送512 Bytes 数据,第二包发送 94 Bytes 数据。
- MCU->WiFi : C0 06 5E 02 00 00 00 02 <省略512 Bytes>CRC8 D0
- WiFi->MCU : C0 06 00 00 D0
- MCU->WiFi : C0 06 5E 02 00 02 5E 02 <省略94 Bytes>CRC8 D0
- WiFi->MCU : C0 06 00 00 D0
#2.1.6. 低功耗指令
设备可以通过串口指令,让WiFi模块进入会退出低功耗模式。
注意:此功能目前只有EMW3010支持。EMW3010进入低功耗模式1后,功耗在12mA左右。在低功耗模式下,WiFi模块响应云端的指令会有一定的延迟。
WiFi->MCU
IMC | 值 | 说明 | |
TYPE | 0x08 | 固定值 | |
PAYLOAD | Mode | 1 Byte | 低功耗模式 0x00:退出低功耗 0x01:进入低功耗模式1 0x02:进入低功耗模式2(暂不支持) |
Time | 1 Byte | 如果当前模式处于: 低功耗模式1,这里是自动唤醒间隔,1~100。推荐10。单位为100ms。如果这里使用10,唤醒时间就是10*100ms=1s。 其他模式,固件为0。 | |
CRC8 |
WiFi->MCU
IMC | 值 | 说明 | |
Type | 0x08 | 固定值 | |
PAYLOAD | code | 1 Byte | 上报结果:0-成功;1-失败 |
CRC8 |
示例:
板卡发送开启低功耗模式1指令
START | Type | Mode | Time | crc8 | END |
c0 | 08 | 01 | 0A | 23 | d0 |
帧头 | 低功耗模式1 | 1秒 | 帧尾 |
WiFi模块应答
START | Type | code | crc8 | END |
c0 | 08 | 00 | 00 | d0 |
固定值 | 成功 | 固定值 |
#2.2. 网络指令集
#2.2.1. WiFi模组网络状态主动下发
见《通用通讯协议》
#2.2.2. 查询WiFi模组的网络状态
见《通用通讯协议》
#2.2.3. 配网指令
hilink配网方式:设备热点配网。
格式如下:
MCU->WiFi
IMC | 值 | 说明 | |
TYPE | 0x13 | 固定值 | |
PAYLOAD | Cloud Code | 0x05或0x00 | 华为平台的识别码为:0x05 |
Type | 0x00 | ||
TimeOut | 0x00 | 2 Byte。设备热点配网。TimeOut不能设置,默认填写0x00, 0x00。 | |
0x00 | |||
CRC8 |
WiFi->MCU
IMC | 值 | 说明 |
Type | 0x13 | 固定值 |
PAYLOAD | 0x00:设置成功 0x01:设置失败 | |
CRC8 |
示例:
MCU->WiFi : c0 13 05 00 00 00 4e d0 或 c0 13 00 00 00 00 00 d0
WiFi->MCU : c0 13 00 00 d0
#2.2.4. 扫描热点
见《通用通讯协议》
#2.2.5. 产测
见《通用通讯协议》
#2.3. 云平台指令集
#2.3.1. WiFi模组服务器状态主动下发
见《通用通讯协议》
#2.3.2. 查询WiFi模组的服务器连接状态
见《通用通讯协议》
#2.3.3. 解绑指令
见《通用通讯协议》
#2.3.4. 查询UTC指令
见《通用通讯协议》
#2.3.5. WiFi模块通知设备OTA
WiFi->MCU
IMC | 值 | 说明 | |
Type | 0x35 | 固定值 | |
PAYLOAD | 0x00 | WiFi模组开始OTA | |
0x01 | WiFi模组OTA下载成功,开始切换到新固件 | ||
0x02 | WiFi模组OTA失败 | ||
CRC8 |
MCU->WiFi
无
#3. 应用指令集
这一部分是用于上报设备状态或控制设备的指令集。
华为的指令有3种类型,分别是:
REPORT类型 - 当设备的状态有变化时,设备主动上报数据时,使用REPORT类型。
PUT类型 - APP控制设备后,云端会转发来之APP的控制指令,这个指令的类型时PUT。设备接收到这种指令后,只要去改变设备的状态就行,不需要去应答。云端在发送了PUT指令后,会发送GET指令来查询。
GET类型 - 云端在发送了PUT指令后,会发送GET指令来查询,这时,设备需要进行应答。
WiFi与设备之间的通讯编码方式,有两种方式,一种是JSON,另一种是TLV。
#3.1. JSON方式
如果WiFi模块与设备之间状态同步选用JSON格式,那对于WiFi模块来说等同于透传模式,不需要进行转换。接收到JSON后,直接转发。
#3.1.1. REPORT(属性上报)
在设备状态发生改变后,主动上报具有“REPORT”操作权限的属性。如果一个服务有多个“REPORT”属性,那上报时需要把这几个属性同时上报。
MCU->WiFi
IMC | 值 | 说明 | |
Type | 0x27 | 固定值 | |
PAYLOAD | CMD | 0x01 | report类型 |
sid_len | 服务实例字符串 | ||
sid | n Byte | 服务实例字符串 n取值范围1~255 | |
JSON | n Byte | JSON格式数据 n取值范围1~1023。一个服务器实例可能带多个属性。格式为{"key1":value1,"key2":value2} | |
CRC8 |
WiFi->MCU
IMC | 值 | 说明 | |
Type | 0x27 | 固定值 | |
PAYLOAD | CMD | 0x01 | report类型 |
sid_len | 服务实例字符串 | ||
sid | n Byte | 服务实例字符串 n取值范围1~255 | |
code | 1 Byte | 上报结果:0(0x00)-成功;-1(0xFF)-失败 | |
CRC8 |
示例:
板卡上报温度服务。温度服务中有两个属性,一个是设置值,另一个是当前值,需要放在一起上报。
START | Type | CMD | sid_len | sid | JSON | crc8 | END |
c0 | 27 | 01 | 06 | 74 65 6d 70 65 72 | 7b 22 73 65 74 22 3a 32 30 2c 22 63 75 72 72 65 6e 74 22 3a 32 33 7d | df | d0 |
帧头 | json格式 | report操作 | sid的长度 | "temper"的ASCII码 | "{"set":20, "current":23 }"的ASCII码 | 帧尾 |
WiFi模块应答
START | Type | CMD | sid_len | sid | code | crc8 | END |
c0 | 27 | 01 | 06 | 74 65 6d 70 65 72 | 00 | d6 | d0 |
固定值 | json格式 | report操作 | temper | 成功 | 固定值 |
#3.1.2. PUT(属性下发)
云端下发,通常只会设置一个属性,不会同时设置多个属性。
WiFi->MCU
IMC | 值 | 说明 | |
Type | 0x27 | 固定值 | |
PAYLOAD | CMD | 0x02 | put类型 |
sid_len | 服务实例字符串 | ||
sid | n Byte | 服务实例字符串 n取值范围1~255 | |
JSON | n Byte | JSON格式数据 n取值范围1~1023 | |
CRC8 |
MCU->WiFi
无
示例:
云端下发电源开启指令。
START | Type | CMD | sid_len | sid | JSON | crc8 | END |
c0 | 27 | 02 | 06 | 73 77 69 74 63 68 | 7b 22 6f 6e 22 3a 31 7d | d9 | d0 |
帧头 | json格式 | put操作 | sid的长度 | "switch"的ASCII码 | "{"on":1}"的ASCII码 | 帧尾 |
#3.1.3. GET(属性获取)
在WiFi模块连上云端后,会主动下发GET指令进行查询。如果一个服务有多个"GET"属性,那需要把这几个属性同时应答。
WiFi->MCU
IMC | 值 | 说明 | |
Type | 0x27 | 固定值 | |
PAYLOAD | CMD | 0x03 | get类型 |
sid_len | 服务实例字符串 | ||
sid | n Byte | 服务实例字符串 n取值范围1~255 | |
CRC8 |
MCU->WiFi
IMC | 值 | 说明 | |
Type | 0x27 | 固定值 | |
PAYLOAD | CMD | 0x03 | get类型 |
sid_len | 服务实例字符串 | ||
sid | n Byte | 服务实例字符串 n取值范围1~255 | |
JSON | n Byte | JSON格式数据 n取值范围1~1023 | |
CRC8 |
示例:
云端获取板卡当前开关的状态。
START | Type | CMD | sid_len | sid | crc8 | END |
c0 | 27 | 03 | 06 | 74 65 6d 70 65 72 | xx | d0 |
帧头 | json格式 | get操作 | "temper"的ASCII码 | 帧尾 |
板卡应答。
START | Type | CMD | sid_len | sid | JSON | crc8 | END |
c0 | 27 | 03 | 06 | 74 65 6d 70 65 72 | 7b 22 73 65 74 22 3a 32 30 2c 22 63 75 72 72 65 6e 74 22 3a 32 33 7d | d8 | d0 |
帧头 | json格式 | get操作 | temper | {"set":20, "current":23 } | 帧尾 |
#3.2. TLV格式
使用TLV格式,需要用到配置表中的tag标识。所以需要在指定配置表时,不能有相同的tag。
#3.2.1. REPORT(属性上报)
上报属性时,可以上报多个属性,但这些属性必须属于同一个服务。
应答时,WiFi模块回复的tag是这些属性对应的服务的tag。
MCU->WiFi
IMC | 值 | 说明 | ||
Type | 0x25 | 固定值 | ||
PAYLOAD | CMD | 0x01 | report类型 | |
Tag_1 | 属性对应的Tag | |||
Length_1 | 0~0xFF | Value的长度,1Bytes | ||
Value_1 | ||||
...... | ||||
Tag_n | 属性对应的Tag | |||
Length_n | 0~0xFF | Value的长度,1Bytes | ||
Value_n | ||||
CRC8 |
WiFi->MCU
IMC | 值 | 说明 | |
Type | 0x25 | 固定值 | |
PAYLOAD | CMD | 0x01 | report类型 |
Tag | 服务对应的Tag | ||
Length | 0x01 | ||
Value/Code | 上报结果:0(0x00)-成功;-1(0xFF)-失败 | ||
CRC8 |
示例:
设备主动上报设备送风服务的状态。送风服务(tag:0x05)包含两个属性,分别是送风角度(tag:0x06)和送风速度(0x07)。
START | Type | CMD | tag | len | val | tag | len | val | crc8 | END |
c0 | 25 | 01 | 06 | 01 | 1E | 07 | 04 | 64 00 00 00 | c2 | d0 |
帧头 | tlv格式 | report操作 | 送风角度属性 | enum型的长度 | 送风角度为30度 | 送风速度属性 | int型的长度 | 送风速度为100 | 帧尾 |
wifi模块应答,tag是送风服务的tag。
START | Type | CMD | tag | len | val | crc8 | END |
c0 | 25 | 01 | 05 | 01 | 00 | c3 | d0 |
帧头 | tlv格式 | report操作 | 送风服务 | 成功 | 帧尾 |
#3.2.2. PUT(属性下发)
WiFi->MCU
IMC | 值 | 说明 | ||
Type | 0x25 | 固定值 | ||
PAYLOAD | CMD | 0x02 | put类型 | |
Tag | 属性对应的Tag | |||
Length | 0~0xFF | Value的长度,1Bytes | ||
Value | ||||
CRC8 |
MCU->WiFi
无
示例:
云端下发关机指令。开关服务(tag:0x01)中有一个开关属性(tag:0x02)。下发指令中tag都是属性。
START | Type | CMD | tag | len | val | crc8 | END |
c0 | 25 | 02 | 02 | 01 | 00 | ef | d0 |
帧头 | tlv格式 | put操作 | 开关属性 | bool型的长度 | 关机 | 帧尾 |
#3.2.3. GET(属性获取)
wifi模块会下发一个带服务tag的指令。设备收到后,只要这个服务下属性的属性操作带有GET,那这些属性都需要上报,这些属性可以组成一条指令。
WiFi->MCU
IMC | 值 | 说明 | |
Type | 0x25 | 固定值 | |
PAYLOAD | CMD | 0x03 | get类型 |
Tag | 服务实例对应的Tag | ||
Length | 0x01 | Value的长度 | |
Value | 0 | 默认为0 | |
CRC8 |
MCU->WiFi
IMC | 值 | 说明 | ||
Type | 0x25 | 固定值 | ||
PAYLOAD | CMD | 0x03 | get类型 | |
Tag_1 | 属性对应的Tag | |||
Length_1 | 0~0xFF | Value的长度,1Bytes | ||
Value_1 | 属性值,Length Bytes | |||
...... | ||||
Tag_n | 属性对应的Tag | |||
Length_n | Value的长度,1Bytes | |||
Value_n | 属性值,Length Bytes | |||
CRC8 |
示例:
云端下发查询送风服务(tag:0x03)的状态。
START | Type | CMD | tag | len | val | crc8 | END |
c0 | 25 | 03 | 05 | 01 | 00 | ef | d0 |
帧头 | tlv格式 | get操作 | 温度服务 | 固定 | 固定 | 帧尾 |
送风服务下有两个属性,分别是送风角度(tag:0x06)和送风速度(0x07)。,而且这两个属性都有get操作权限,所以这两个属性都要上报。
START | Type | CMD | tag | len | val | tag | len | val | crc8 | END |
c0 | 25 | 03 | 06 | 01 | 1e | 07 | 04 | 64 00 00 00 | 12 | d0 |
帧头 | tlv格式 | get操作 | 设定温度 | enum型的长度 | 送风的角度为30度 | 实际温度 | int型的长度 | 送风的速度为100 | 帧尾 |
#3.2.4. Indicate(阻塞属性上报)
阻塞上报属性时,命令一定要等待服务器确认上报成功才返回,超时1秒。
应答时,WiFi模块回复的tag是这些属性对应的服务的tag。
MCU->WiFi
IMC | 值 | 说明 | ||
Type | 0x25 | 固定值 | ||
PAYLOAD | CMD | 0x04 | indicate类型 | |
Tag_1 | 属性对应的Tag | |||
Length_1 | 0~0xFF | Value的长度,1Bytes | ||
Value_1 | ||||
...... | ||||
Tag_n | 属性对应的Tag | |||
Length_n | 0~0xFF | Value的长度,1Bytes | ||
Value_n | ||||
CRC8 |
WiFi->MCU
IMC | 值 | 说明 | |
Type | 0x25 | 固定值 | |
PAYLOAD | CMD | 0x04 | report类型 |
Tag | 服务对应的Tag | ||
Length | 0x01 | ||
Value/Code | 上报结果:0(0x00)-成功;非0-失败 | ||
CRC8 |
#4. 设备固件OTA
对于华为平台,在可以实现WiFi模块固件OTA的同时,也可以实现设备中固件的OTA。
#4.1. OTA流程
1,WiFi模块上电后,连接到云端之前,wifi模块会查询设备的固件版本号(指令0x31)。设备需要上报版本号(0x32)。
2,云端有新的设备固件,APP会提示用户升级,用户点击确认。
3,云端下发升级提示,WiFi模块并通知设备WiFi模块中有新的固件(0x33),并等待设备响应(0x34)。如果5分钟内设备没有响应,则认为超时,OTA失败。
4,WiFi模块和设备之间使用Ymodem协议,把固件传递给设备。
5,WiFi模块会自动重启,WiFi模块重启后,会去查询一次设备的版本号。但这时,可能设备还在更新固件。所以设备在更新完固件之后,需要主动重启一下WiFi模块,这样WiFi模块就可以重新获取一次设备的版本号,并把最新的版本号上报云端。
#4.2. OTA指令集
#4.2.1. WiFi模块读取设备固件版本号
WiFi->MCU
IMC | 值 | 说明 | |
Type | 0x31 | 固定值 | |
PAYLOAD | 0x00 | 固定值 | |
CRC8 |
MCU->WiFi
无
#4.2.2. 上报MCU固件版本号
MCU->WiFi
IMC | 值 | 说明 | |
Type | 0x32 | 固定值 | |
PAYLOAD | n bytes | MCU固件版本号的字符串 如固件版本号:1.2 则payload:0x31 0x2E 0x32 | |
CRC8 |
WiFi->MCU
IMC | 值 | 说明 | |
Type | 0x32 | 固定值 | |
PAYLOAD | 0x00 | 上报成功 | |
0x01 | 上报失败 | ||
CRC8 |
#4.2.3. WiFi模块通知MCU开启固件升级
WiFi->MCU
IMC | 值 | 说明 | |
Type | 0x33 | 固定值 | |
PAYLOAD | 0x00 | ||
CRC8 |
MCU->WiFi
无
#4.2.4. MCU请求开始固件升级
MCU->WiFi
IMC | 值 | 说明 | |
Type | 0x34 | 固定值 | |
PAYLOAD | 0x00 | 进入MCU OTA模式,128字节 | |
0x01 | 进入MCU OTA模式,1024字节 | ||
CRC8 |
WiFi->MCU
IMC | 值 | 说明 | |
Type | 0x34 | 固定值 | |
PAYLOAD | 0x00 | WiFi模组进入Ymode模式成功 | |
0x01 | WiFi模组进入Ymode模式失败 | ||
CRC8 |
#5. 测试
下载华为Debug APP。
安装完成后,需要切换一下服务器和测试环境。如下图。设置完成后,最好去清一下这个应用的缓存。
如果是使用公版APP,服务器使用厂家认证云。
如果是定制开发APP,需要选择开发测试云。
设置完成后,触发设备配网,并点击APP上的“添加设备”,APP就会自动扫描处于配网的设备。扫描到后,就会显示出来。点击“连接”即可。