# 华为云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_2ARR.xlsx](/attach/zh/Profile_2ARR.xlsx)

根据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模块中。

#配置文件生成工具

📎ohos_yat_config.py

#使用方法

<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

#token的生成下载方法

#申请激活码

激活码公钥生成方式:参考链接:生成私钥与公钥 (opens new window)

  1. 准备一台安装有OpenSSL的PC。Linux系统的PC通常自带OpenSSL,推荐使用。
  2. 在命令行窗口中,执行如下命令,生成私钥。

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>
  1. 继续执行如下命令,生成私钥对应的公钥。

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>

#激活码解密

<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>

#转换为token.bin文件

📎token_parse.zip

<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>

#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 数据。

  1. MCU->WiFi : C0 06 5E 02 00 00 00 02 <省略512 Bytes>CRC8 D0
  2. WiFi->MCU : C0 06 00 00 D0
  3. MCU->WiFi : C0 06 5E 02 00 02 5E 02 <省略94 Bytes>CRC8 D0
  4. 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,测试

#5.1,APP

下载华为Debug APP。

安装完成后,需要切换一下服务器和测试环境。如下图。设置完成后,最好去清一下这个应用的缓存。

如果是使用公版APP,服务器使用厂家认证云。

如果是定制开发APP,需要选择开发测试云。

设置完成后,触发设备配网,并点击APP上的“添加设备”,APP就会自动扫描处于配网的设备。扫描到后,就会显示出来。点击“连接”即可。

更新时间: 2023/7/12 14:10:31