更新时间: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 模组射频性能测试,也是最常用的整机产测指令。
指令使用介绍: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 成功。
|
校验和 | 1 | 从帧头开始,按字节求和,得出的结果对 256 求余 |
示例:
55 aa 00 0e 00 02 01 28 38
55 aa 00 0e 00 02 00 00 0f
该指令对应的是连接指定路由产测功能,此模式产测路由器须有联网能力,且由于路由承载能力有限,同一时间产测设备不宜过多。需要注意的是由于产测没有经过客户端 App 提供配网标志码,设备无法实际连接到涂鸦 IoT 开发平台,但会进行云端连接测试,产测结果更加可靠。
指令使用介绍:需等待上电初始化完成,建议至少上电 5 秒以后调用该产测指令,且需要在未配网状态下才能完成测试。MCU 通过 0x2c
命令字将产测路由的 SSID 和密码传给模组,模组连接路由器并返回云端通讯状态,MCU 根据返回的网络状态判定产测是否成功。
MCU 发送
字段 | 字节数 | 说明 |
---|---|---|
帧头 | 2 | 0x55aa |
版本 | 1 | 0x03 |
命令字 | 1 | 0x2C |
数据长度 | 2 | n |
数据 | n | {"ssid":"xxx", "password":"xxxxxxxx"}
|
校验和 | 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]:
|
校验和 | 1 | 从帧头开始,按字节求和,得出的结果对 256 求余 |
示例:55 aa 00 2c 00 01 01 2d
(产测成功)
模组在连接到路由网络的情况下,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 |
|
校验和 | 1 | 从帧头开始,按字节求和,得出的结果对 256 求余 |
示例:55 aa 00 24 00 01 D5 F9
(RSSI:-43)
模组返回的信号强度为 16 进制(补码),如果信号强度低于 -70 dB,存在设备离线风险,需关注网络环境和设备天线性能。
蓝牙产测功能是指 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 成功。
|
|
校验和 | 1 | 从帧头开始,按字节求和,得出的结果对 256 求余 |
示例:55 aa 00 35 00 03 01 01 14 4d
Wi-Fi 功能测试反馈函数 wifi_test_result()
定义在 protocol.c
文件中,用于接收测试结果,并做下一步处理。
应用步骤:
打开 WIFI_TEST_ENABLE
宏定义,开启 Wi-Fi 产测功能。
#define WIFI_TEST_ENABLE //开启 Wi-Fi 产测功能(扫描指定路由)
在串口接收数据处理函数 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
......
}
wifi_test_result
在 protocol.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 信号最强
}
}
调试助手示意图如下:
连接指定路由产测函数 mcu_start_connect_wifitest()
定义在 mcu_api.c
文件中,用于 MCU 上报指定路由名称及密码,发起连接指定路由产测。
应用步骤:
打开 WIFI_CONNECT_TEST_ENABLE
宏定义,开启连接指定路由产测功能。
#define WIFI_CONNECT_TEST_ENABLE //开启 Wi-Fi 产测功能(连接指定路由)
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
......
}
在串口接收数据处理函数 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);
}
wifi_connect_test_result
在 protocol.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 工作状态
}
}
调试助手示意图如下:
蓝牙产测函数 mcu_start_BLE_test()
定义在 mcu_api.c
文件中,用于 MCU 发起蓝牙功能性测试。
应用步骤:
打开 BLE_RELATED_FUNCTION_ENABLE
宏定义,开启蓝牙相关功能。
#define BLE_RELATED_FUNCTION_ENABLE //开启蓝牙相关功能
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);
}
在串口接收数据处理函数 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
......
}
BLE_test_result
在 protocol.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 信号最强
}
}
调试助手示意图如下:
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈