Skip to content

由 sujingliang 贡献,Ai-Thinker 进行整理

【Ai-WB2评测】巴法云MQTT

一、平台准备

**1、登录https://bemfa.com/注册个用户**

系统会分配个私钥

2、选择MQTT设备云

3、新建主题

主题名:AIWB2002,后3位002,表示设备为灯

后三位说明
001插座设备
002灯泡设备
003风扇设备
004传感器
005空调设备
006开关设备
009窗帘设备
010温控器
011热水器
012电视
013空气净化器

二、修改程序

以applications/protocols/mqtt/tcp为模板

1、main.c

📜 点击展开完整代码
java
#define ROUTER_SSID
"SSID"

#define ROUTER_PWD
"PWD"

修改WIFI登录SSID和密码

2、demo.c

📜 点击展开完整代码
java
void

mqtt_start
(
void
)

{
    pwm_led_init();
//pwm 初始化

axk_mqtt_client_config_t

mqtt_cfg

=
 {
        .uri =
"mqtt://bemfa.com"
,
//巴法云地址

        .port =
9501
,
//巴法云端口9501,不是1883

        .client_id =
"平台提供的私钥"
,
        .event_handle = event_cb,
//回调

    };

axk_mqtt_client_handle_t

client

=
 axk_mqtt_client_init(&mqtt_cfg);
    axk_mqtt_client_start(client);
}

event_cb函数

📜 点击展开完整代码
java
static
 axk_err_t
event_cb
(axk_mqtt_event_handle_t event)

{
...

case
 MQTT_EVENT_CONNECTED:
//MQTT建立连接事件

        blog_info(
"MQTT_EVENT_CONNECTED"
);

// 订阅主题(如 light001)

        axk_mqtt_client_subscribe(client,
"AIWB2002"
,
0
);
//订阅前面注册的AIWB2002主题

break
;

case
 MQTT_EVENT_DATA:
//MQTT接收数据事件

        blog_info(
"MQTT_EVENT_DATA"
);
        printf(
"TOPIC=%.*s\r\n"
, event->topic_len, event->topic);
        printf(
"DATA=%.*s\r\n"
, event->data_len, event->data);

// 判断指令并控制 GPIO

if
 (strncmp(event->data,
"on#"
,
3
) ==
0
) {
//收到on#44,设置LED亮度为44

// 2. 提取亮度值(如 "44")

char
 brightness_str[
4
] = {
0
};

int

brightness

=

0
;
            strncpy(brightness_str, event->data +
3
, event->data_len -
3
);
            brightness = atoi(brightness_str);
// 字符串转整数

// 3. 限制亮度范围(0~255)

if
 (brightness <
0
) brightness =
0
;

if
 (brightness >
255
) brightness =
255
;

            rgb_control(
255
,
255
,
255
,brightness);
        }
else

if
 (strncmp(event->data,
"on"
, event->data_len) ==
0
) {
//收到on,设置LED亮度为255

            blog_info(
"Turn ON LED"
);
            rgb_control(
255
,
255
,
255
,
255
);
        }
// 处理关闭指令(如 "off")

else

if
 (strncmp(event->data,
"off"
, event->data_len) ==
0
) {
//收到off,设置LED亮度为0

            rgb_control(
255
,
255
,
255
,
0
);
            blog_info(
"Turn OFF LED"
);
        }

break
;

...
}

pwmled.c

📜 点击展开完整代码
java
#include <FreeRTOS.h>
#include <task.h>
#include <blog.h>
#include <bl602.h>
#include <bl602_gpio.h>
#include <bl602_glb.h>
#include <bl_pwm.h>
#include
"pwmled.h"

#define
PWM_Get_Channel_Reg
(ch)
  (PWM_BASE+PWM_CHANNEL_OFFSET+(ch)*
0x20
)
#define
PWM_STOP_TIMEOUT_COUNT

(
160
*
1000
)

GLB_GPIO_Cfg_Type cfg[
3
] = {
    {
        .drive =
0
,
        .smtCtrl =
1
,
        .gpioMode = GPIO_MODE_OUTPUT,
        .pullType = GPIO_PULL_DOWN,
        .gpioPin =
14
,
/// red

        .gpioFun =
8
,
    },
    {
        .drive =
0
,
        .smtCtrl =
1
,
        .gpioMode = GPIO_MODE_OUTPUT,
        .pullType = GPIO_PULL_DOWN,
        .gpioPin =
17
,
/// green

        .gpioFun =
8
,
    },
    {
        .drive =
0
,
        .smtCtrl =
1
,
        .gpioMode = GPIO_MODE_OUTPUT,
        .pullType = GPIO_PULL_DOWN,
        .gpioPin =
3
,
/// blue

        .gpioFun =
8
,
    },
};

/// @brief Copy from PWM_Smart_Configure. Use Bus Clock instead of External Crystal Clock for PWM Timer

/// @param ch PWM Channel

/// @param clkDiv PWM clock divider

/// @param period PWM period

/// @param threshold2

/// @return

BL_Err_Type
PWM_Smart_Configure2
(PWM_CH_ID_Type ch, uint16_t clkDiv, uint16_t period,uint16_t threshold2)

{
    uint32_t tmpVal;

uint32_t

timeoutCnt

=
 PWM_STOP_TIMEOUT_COUNT;

/* Get channel register */

uint32_t

PWMx

=
 PWM_Get_Channel_Reg(ch);

    tmpVal = BL_RD_REG(PWMx, PWM_CONFIG);

// if(BL_GET_REG_BITS_VAL(tmpVal, PWM_REG_CLK_SEL) != PWM_CLK_XCLK){

if
(BL_GET_REG_BITS_VAL(tmpVal, PWM_REG_CLK_SEL) != PWM_CLK_BCLK){
        BL_WR_REG(PWMx, PWM_CONFIG, BL_SET_REG_BIT(tmpVal, PWM_STOP_EN));

while
(!BL_IS_REG_BIT_SET(BL_RD_REG(PWMx, PWM_CONFIG), PWM_STS_TOP)){
            timeoutCnt--;

if
(timeoutCnt ==
0
){

return
 TIMEOUT;
            }
        }

// tmpVal = BL_SET_REG_BITS_VAL(tmpVal, PWM_REG_CLK_SEL, PWM_CLK_XCLK);

        tmpVal = BL_SET_REG_BITS_VAL(tmpVal, PWM_REG_CLK_SEL, PWM_CLK_BCLK);
    }
    tmpVal = BL_SET_REG_BITS_VAL(tmpVal, PWM_OUT_INV, PWM_POL_NORMAL);
    tmpVal = BL_SET_REG_BITS_VAL(tmpVal, PWM_STOP_MODE, PWM_STOP_GRACEFUL);
    BL_WR_REG(PWMx, PWM_CONFIG, tmpVal);

/* Config pwm division */

    BL_WR_REG(PWMx, PWM_CLKDIV, clkDiv);

/* Config pwm period and duty */

    BL_WR_REG(PWMx, PWM_PERIOD, period);
    BL_WR_REG(PWMx, PWM_THRE1,
0
);
    BL_WR_REG(PWMx, PWM_THRE2, threshold2);

return
 SUCCESS;
}

void

pwm_led_init
(
void
)

{

for
 (
int

i

=

0
; i <
3
; i++) {
        GLB_GPIO_Init(cfg + i);

PWM_CH_ID_Type

ch

=
 cfg[i].gpioPin % PWM_CH_MAX;
        PWM_Channel_Disable(ch);
    }
}

void

pwm_led_set
(uint8_t red,uint8_t green,uint8_t blue)

{
    PWM_Smart_Configure2(
2
,
80
,
255
, green);
    PWM_Channel_Enable(
2
);

    PWM_Smart_Configure2(
3
,
80
,
255
, blue);
    PWM_Channel_Enable(
3
);

    PWM_Smart_Configure2(
4
,
80
,
255
, red);
    PWM_Channel_Enable(
4
);

}

void

rgb_control
(uint8_t red, uint8_t green, uint8_t blue,  uint8_t alpha)

{
    uint8_t t_red,t_green,t_blue;

// 应用透明度/亮度

    t_red = red*alpha/
255
;
    t_green = green*alpha/
255
;
    t_blue = blue*alpha/
255
;

    pwm_led_set(t_red,t_green,t_blue);
}

三、运行

巴法云小程序

MQTTX调试

四、小度音箱+巴法

下面配图顺序乱了,就是手机小度APP->我的->去我家->+添加设备->搜索“巴法”->点击已建立的设备”灯“

就可以用小度音箱语音控制灯了。

比如:"小度小度,开灯。"

Released under the MIT License. Build Time 2026-09-11 14:52:23