设备产测

更新时间:2024-04-08 08:18:04下载pdf

Wi-Fi 标准协议接入提供了 Wi-Fi 功能性产测(包括扫描指定路由和连接指定路由)、蓝牙功能性产测、获取当前连接网络的信号强度等功能。关于详细介绍,参考 生产测试

使用场景

设备完成基础功能的实现后,若需要对模组进行功能性测试,或者把模组产测结合到整机产测中,可使用模组的一个或多个产测功能,触发产测的方式可由 MCU 端自定义。

指令列表

设备产测功能涉及多个协议指令:

命令字 命令说明
0x0e Wi-Fi 功能性测试(扫描指定路由)
0x2c Wi-Fi 功能性测试(连接指定路由)
0x24 获取当前 Wi-Fi 信号强度
0x35(子命令 0x01) 蓝牙功能性产测(扫描指定蓝牙信标)

Wi-Fi 功能性测试—扫描指定路由(0x0e)

该指令对应的扫描产测路由产测功能,主要用于产品量产时的 Wi-Fi 模组射频性能测试,也是最常用的整机产测指令。

指令使用介绍:MCU 需等待上电初始化完成,建议至少上电 5 秒以后调用该产测指令。模组接收到 MCU 发送的 0x0e 命令字后,会自动扫描名称为 tuya_mdev_test 的 Wi-Fi 信号,并返回产测结果,产测成功结果为信号强度百分比(范围为 0-100,步进为 20)。MCU 根据信号强度,判定 Wi-Fi 模组射频性能是否符合要求。

信号强度

信号强度 对应接收功率(dBm)
0 -100
40 > -100,≤ -80
60 > -80,≤ -60
80 > -60,≤ -40
100 > -40
  • 请在模组初始化完成后发送测试指令,否则可能无效。详情请参考 Wi-Fi 模组初始化流程

  • 路由设置:产测过程需准备一台 2.4 GHz 信号的 Wi-Fi 路由器(可不连接外网),将该路由器 SSID 设置为 tuya_mdev_test,路由器密码不需要关注。

  • 测试说明:建议将路由器与设备距离控制在五米左右,信号强度大于等于 60% 为合格。可以根据产线和工厂环境自行调整,可多台设备同时进行测试。

MCU 发送

字段 字节数 说明
帧头 2 0x55aa
版本 1 0x03
命令字 1 0x0e
数据长度 2 0x0000
数据 0
校验和 1 从帧头开始,按字节求和,得出的结果对 256 求余

示例55 aa 03 0e 00 00 10

模组返回

字段 字节数 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x0e
数据长度 2 0x0002
数据 2 数据长度为 2 字节:Data[0]:0x00 失败,0x01 成功。
  • 当 Data[0] 为 0x01,即成功时,Data[1] 表示信号强度,范围 0-100,0 信号最差,100 信号最强。
  • 当 Data[0] 为 0x00,即失败时,Data[1] 为 0x00 表示未扫描到指定的 SSID,Data[1] 为 0x01 表示模组未烧录授权 key。
校验和 1 从帧头开始,按字节求和,得出的结果对 256 求余

示例:

  • 产测成功信号强度 40:55 aa 00 0e 00 02 01 28 38
  • 未扫描到指定的 SSID:55 aa 00 0e 00 02 00 00 0f

Wi-Fi 功能性测试—连接指定路由(0x2C)

该指令对应的是连接指定路由产测功能,此模式产测路由器须有联网能力,且由于路由承载能力有限,同一时间产测设备不宜过多。需要注意的是由于产测没有经过客户端 App 提供配网标志码,设备无法实际连接到涂鸦 IoT 开发平台,但会进行云端连接测试,产测结果更加可靠。

指令使用介绍:需等待上电初始化完成,建议至少上电 5 秒以后调用该产测指令,且需要在未配网状态下才能完成测试。MCU 通过 0x2c 命令字将产测路由的 SSID 和密码传给模组,模组连接路由器并返回云端通讯状态,MCU 根据返回的网络状态判定产测是否成功。

  • 产测前,必须回复模组的心跳包和产品查询包,并且模组完成初始化,才能进入连接路由的产测。
  • MCU 可根据收到 报告设备联网状态 中的(状态 4-Wi-Fi 已配置且连上路由器)判断是否连接上路由器。
  • MCU 可根据以下条件,判断连接指定路由 Wi-Fi 功能性测试失败:
    • MCU 收到返回失败状态。
    • MCU 超过十五秒没有收到连上路由的状态包。
  • 产测成功后,可以重新发送测试命令再次进入产测。如果没有收到连上路由器的状态包,表示模组正在产测中,需要重置模组或者重新上电后发送测试命令才有效。
  • 模组需要在处于未被配网的状态下才能完成连接测试。
  • 路由器名称字符串长度最大支持 32 字节,路由器密码字符串长度最大支持 64 字节。

MCU 发送

字段 字节数 说明
帧头 2 0x55aa
版本 1 0x03
命令字 1 0x2C
数据长度 2 n
数据 n {"ssid":"xxx", "password":"xxxxxxxx"}
  • ssid:路由名称
  • password:路由密码
校验和 1 从帧头开始,按字节求和,得出的结果对 256 求余

示例{"ssid":"xxx", "password":"12345678"}

55 aa 03 2c 00 24 7b 22 73 73 69 64 22 3a 22 78 78 78 22 2c 22 70 61 73 73 77 6f 72 64 22 3a 22 31 32 33 34 35 36 37 38 22 7d 2c

模组返回

字段 字节数 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x2C
数据长度 2 0x0001
数据 1 数据长度为 1 字节。
Data[0]:
  • 0x00:路由信息接收失败。检查发出的路由 JSON 包数据是否完整。
  • 0x01:路由信息接收成功。结果请注意 报告设备联网状态 的网络状态包。
校验和 1 从帧头开始,按字节求和,得出的结果对 256 求余

示例55 aa 00 2c 00 01 01 2d(产测成功)

获取当前 Wi-Fi 信号强度(0x24)

模组在连接到路由网络的情况下,MCU 可以发送该指令来获取当前连接网络的信号强度,用于判定当前网络连接是否稳定。

MCU 发送

字段 字节数 说明
帧头 2 0x55aa
版本 1 0x03
命令字 1 0x24
数据长度 2 0
数据 N
校验和 1 从帧头开始,按字节求和,得出的结果对 256 求余

示例55 aa 03 24 00 00 26

模组返回

字段 字节数 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x24
数据长度 2 0x0001
数据 Data
  • 0x00:表示失败
  • 小于 0:表示信号强度,例如 -60 dB
校验和 1 从帧头开始,按字节求和,得出的结果对 256 求余

示例55 aa 00 24 00 01 D5 F9(RSSI:-43)

模组返回的信号强度为 16 进制(补码),如果信号强度低于 -70 dB,存在设备离线风险,需关注网络环境和设备天线性能。

蓝牙功能性产测—扫描指定蓝牙信标(0x35+0x01)

蓝牙产测功能是指 MCU 发起产测,模组内部扫描指定的蓝牙信标 ty_mdev,返回扫描结果和信号强度百分比。信号强度说明,参考扫描指定路由产测指令。

指令使用介绍:准备一个蓝牙信标,释放信标信号 ty_mdev。测试时,建议将路由与设备距离控制在 5 米左右,信号强度大于等于 60% 为合格,也可以根据自己产线和工厂环境的情况自行调整。

MCU 发送

字段 长度 说明
帧头 2 0x55aa
版本 1 0x03
命令字 1 0x35
数据长度 2 0x0001
数据 1 0x01(子命令)
校验和 1 从帧头开始,按字节求和,得出的结果对 256 求余

示例55 aa 03 35 00 01 01 39

模组返回

字段 字节数 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x35
数据长度 2 0x0003
数据 1 0x01(子命令)
2 数据长度为 2 字节:Data[0]:0x00 失败,0x01 成功。
  • 当 Data[0] 为 0x01,即成功时,Data[1] 表示信号强度,范围 0-100,0 信号最差,100 信号最强。
  • 当 Data[0] 为 0x00,即失败时,Data[1] 为 0x00 表示未扫描到指定的蓝牙信标,Data[1] 为 0x01 表示模组未烧录授权 key。
校验和 1 从帧头开始,按字节求和,得出的结果对 256 求余

示例55 aa 00 35 00 03 01 01 14 4d

使用示例

扫描指定路由

Wi-Fi 功能测试反馈函数 wifi_test_result() 定义在 protocol.c 文件中,用于接收测试结果,并做下一步处理。

应用步骤

  1. 打开 WIFI_TEST_ENABLE 宏定义,开启 Wi-Fi 产测功能。

    #define         WIFI_TEST_ENABLE                //开启 Wi-Fi 产测功能(扫描指定路由)
    
  2. 在串口接收数据处理函数 data_handle() 中,当收到模组发来的产测结果时,MCU 主动调用 wifi_test_result() 接收并做处理。

    void data_handle(unsigned short offset)
    {
        ......
        #ifdef WIFI_TEST_ENABLE
            case WIFI_TEST_CMD:                              //Wi-Fi 功能测试(扫描指定路由指令)
                result = wifi_data_process_buf[offset + DATA_START];
                rssi = wifi_data_process_buf[offset + DATA_START + 1];
                wifi_test_result(result, rssi);
            break;
        #endif
        ......
    }
    
  3. wifi_test_resultprotocol.c 中实现,您需实现该函数

    /**
     * @brief Wi-Fi 功能测试反馈
     * @param[in] {result} Wi-Fi 功能测试结果
     * @ref       0:失败
     * @ref       1:成功
     * @param[in] {rssi} 测试成功表示 Wi-Fi 信号强度,测试失败表示错误类型
     * @return Null
     * @note   MCU 需要自行实现该功能
     */
    void wifi_test_result(unsigned char result,unsigned char rssi)
    {
        #error "请自行实现 Wi-Fi 功能测试成功/失败代码,完成后请删除该行"
        if(result == 0) {
            //测试失败
            if(rssi == 0x00) {
                //未扫描到名称为 tuya_mdev_test 路由器,请检查
            }else if(rssi == 0x01) {
                //模块未授权
            }
        }else {
            //测试成功
            //rssi 为信号强度,范围 0-100,0 信号最差,100 信号最强
        }
    }
    
  4. 调试助手示意图如下:

    设备产测

连接指定路由

连接指定路由产测函数 mcu_start_connect_wifitest() 定义在 mcu_api.c 文件中,用于 MCU 上报指定路由名称及密码,发起连接指定路由产测。

应用步骤

  1. 打开 WIFI_CONNECT_TEST_ENABLE 宏定义,开启连接指定路由产测功能。

    #define         WIFI_CONNECT_TEST_ENABLE                //开启 Wi-Fi 产测功能(连接指定路由)
    
  2. MCU 自行调用 mcu_start_connect_wifitest() 函数,上报测试连接的路由名称及密码,打开产测功能。

    void data_handle(unsigned short offset)
    {
        ......
        #ifdef WIFI_CONNECT_TEST_ENABLE
            case WIFI_CONNECT_TEST_CMD:               //Wi-Fi 功能测试(连接指定路由)
                result = wifi_data_process_buf[offset + DATA_START];
                wifi_connect_test_result(result);
            break;
        #endif
        ......
        }
    
  3. 在串口接收数据处理函数 data_handle() 中,当收到模组发来的产测结果时,MCU 主动调用 wifi_connect_test_result() 接收测试结果并做处理。

    /**
    * @brief MCU 发起 Wi-Fi 功能测试(连接指定路由)
    * @param[in] {ssid_buf} 存放路由器名称字符串数据的地址(ssid 长度最大支持 32 个字节)
    * @param[in] {passwd_buffer} 存放路由器名称字符串数据的地址(passwd 长度最大支持 64 个字节)
    * @return Null
    * @note   MCU 需要自行调用该功能
    */
    void mcu_start_connect_wifitest(unsigned char *ssid_buf,unsigned char *passwd_buffer)
    {
        unsigned short send_len = 0;
    
        if( my_strlen(ssid_buf) > 32 | | my_strlen(passwd_buffer) > 64) {
            //printf("ssid_buf or passwd_buffer is too long!");
            return;
        }
    
        send_len = set_wifi_uart_buffer(send_len, "{\"ssid\":\"", my_strlen("{\"ssid\":\""));
        send_len = set_wifi_uart_buffer(send_len,ssid_buf,my_strlen(ssid_buf));
        send_len = set_wifi_uart_buffer(send_len, "\",\"password\":\"", my_strlen("\",\"password\":\""));
        send_len = set_wifi_uart_buffer(send_len,passwd_buffer,my_strlen(passwd_buffer));
        send_len = set_wifi_uart_buffer(send_len, "\"}", my_strlen("\"}"));
    
        wifi_uart_write_frame(WIFI_CONNECT_TEST_CMD, MCU_TX_VER, send_len);
    }
    
  4. wifi_connect_test_resultprotocol.c 中实现,您需实现该函数

    /**
    * @brief 路由信息接收结果通知
    * @param[in] {result} 模块是否成功接收到正确的路由信息
    * @ref       0x00:失败
    * @ref       0x01:成功
    * @return Null
    * @note   MCU 需要自行实现该功能
    */
    void wifi_connect_test_result(unsigned char result)
    {
        #error "请自行实现 Wi-Fi 功能测试成功/失败代码,完成后请删除该行"
        if(result == 0) {
            //路由信息接收失败,请检查发出的路由信息包是否是完整的 JSON 数据包
        }else {
            //路由信息接收成功,产测结果请注意 WIFI_STATE_CMD 指令的 Wi-Fi 工作状态
        }
    }
    
  5. 调试助手示意图如下:

    设备产测

蓝牙产测

蓝牙产测函数 mcu_start_BLE_test() 定义在 mcu_api.c 文件中,用于 MCU 发起蓝牙功能性测试。

应用步骤

  1. 打开 BLE_RELATED_FUNCTION_ENABLE 宏定义,开启蓝牙相关功能。

    #define         BLE_RELATED_FUNCTION_ENABLE            //开启蓝牙相关功能
    
  2. MCU 自行调用 mcu_start_BLE_test() 函数,打开扫描指定蓝牙信标产测功能。

    /**
    * @brief mcu 发起蓝牙功能性测试(扫描指定蓝牙信标)
    * @param Null
    * @return Null
    * @note   MCU 需要自行调用该功能
    */
    void mcu_start_BLE_test(void)
    {
        unsigned short send_len = 0;
        send_len = set_wifi_uart_byte(send_len, 0x01);
        wifi_uart_write_frame(BLE_TEST_CMD, MCU_TX_VER, send_len);
    }
    
  3. 在串口接收数据处理函数 data_handle() 中,当收到模组发来的产测结果时,MCU 主动调用 BLE_test_result() 接收测试结果并做处理。

    void data_handle(unsigned short offset)
    {
        ......
        #ifdef BLE_RELATED_FUNCTION_ENABLE
            case BLE_TEST_CMD:                             //蓝牙功能性测试(扫描指定蓝牙信标)
                total_len = (wifi_data_process_buf[offset + LENGTH_HIGH] << 8) | wifi_data_process_buf[offset + LENGTH_LOW];
                BLE_test_result((unsigned char *)(wifi_data_process_buf + offset + DATA_START), total_len);
            break;
        #endif
        ......
        }
    
  4. BLE_test_resultprotocol.c 中实现,您需实现该函数

    /**
    * @brief 蓝牙功能性测试结果
    * @param[in] {value} 数据缓冲区
    * @param[in] {length} 数据长度
    * @return Null
    * @note   MCU 需要自行实现该功能
    */
    void BLE_test_result(const unsigned char value[], unsigned short length)
    {
        #error "请自行实现蓝牙功能性测试结果代码,完成后请删除该行"
    unsigned char sub_cmd = value[0];
    
        if(0x03 != length) {
            //数据长度错误
            return;
        }
        if(0x01 != sub_cmd) {
            //子命令错误
            return;
        }
        unsigned char result = value[1];
        unsigned char rssi = value[2];
        if(result == 0) {
            //测试失败
            if(rssi == 0x00) {
                //未扫描到名称为 ty_mdev 蓝牙信标,请检查
            }else if(rssi == 0x01) {
                //模组未授权
            }
        }else if(result == 0x01) {
            //测试成功
            //rssi 为信号强度,范围 0-100,0 信号最差,100 信号最强
        }
    }
    
  5. 调试助手示意图如下:

    设备产测