meiyao 发表于 2024-4-6 22:25

【安信可BW16-Kit】+MQTT_Basic

<p>安信可BW16-Kit是一款针对BW16模组设计的核心开发板,其特性主要体现在硬件配置和网络通讯方面。</p>

<p>BW16模组基于RTL8720DN开发,支持双频(2.4GHz或5GHz)WLAN和低功耗蓝牙5.0,这使得BW16-Kit开发板能够同时处理无线局域网和蓝牙通讯,为物联网设备提供了强大的连接能力。此外,BW16还集成了高性能和低功耗的MCU(微控制器),以及WLAN、MAC、蓝牙基带和RF基带,为开发者提供了丰富的硬件资源。</p>

<p>在软件方面,BW16-Kit开发板集成了内部存储器,支持简单的应用程序开发,可实现完整的Wi-Fi和BLE 5.0协议功能。这使得开发者能够轻松地为物联网设备添加网络通讯功能,实现设备之间的数据交换和远程控制。</p>

<p>平台:Arduino</p>

<p>软件:MQTT-Explorer-Setup-0.4.0-beta1</p>

<p> &nbsp;</p>

<p>软件下载地址:</p>

<p><a href="https://mqtt-explorer.com" target="_blank">https://mqtt-explorer.com</a>/</p>

<p> &nbsp;</p>

<p>代码:</p>

<pre>
<code>// 引入WiFi库和PubSubClient库
#include &lt;WiFi.h&gt;
#include &lt;PubSubClient.h&gt;

// 定义Wi-Fi网络的SSID和密码
char ssid[] = "mldesk";   // 你的网络SSID(名称)
char pass[] = "12345671";// 你的网络密码

// 定义MQTT服务器的地址和客户端ID,以及发布和订阅的主题
char mqttServer[]   = "test.mosquitto.org";
char clientId[]       = "amebaClient";
char publishTopic[]   = "outTopic";
char subscribeTopic[] = "inTopic";

// 创建WiFi客户端对象和PubSubClient对象
WiFiClient wifiClient;
PubSubClient client(wifiClient);

// 回调函数,当收到MQTT消息时触发
void callback(char* topic, byte* payload, unsigned int length) {
    // 定义LED控制消息的字符串
    char payload_r_on[]="LED_R_ON";
    char payload_g_on[]="LED_G_ON";
    char payload_b_on[]="LED_B_ON";
    char payload_all_off[]="LED_OFF";

    // 打印接收到的消息主题和内容
    Serial.print("Message arrived [");
    Serial.print(topic);
    Serial.print("] ");
    for (unsigned int i = 0; i &lt; length; i++) {
      Serial.print((char)(payload));
    }
    Serial.println();

    // 打印接收到的消息长度
    Serial.print("payload len:");
    Serial.println(length);

    // 检查接收到的消息主题是否为我们订阅的主题
    if(strcmp(topic,subscribeTopic)==0) {
      Serial.println("Receive subscribe.");

      // 检查接收到的消息内容,并根据内容控制LED的亮灭
      if(memcmp((char *)payload,payload_r_on,strlen(payload_r_on))==0) {
            Serial.println("Light the Led Red");
            digitalWrite(LED_R, HIGH);// 点亮红色LED
            digitalWrite(LED_G, LOW);   // 熄灭绿色LED
            digitalWrite(LED_B, LOW);   // 熄灭蓝色LED
            client.publish(publishTopic,payload_r_on); // 发布消息到MQTT服务器,表示红色LED已点亮
      }

      if(memcmp((char *)payload,payload_g_on,strlen(payload_g_on))==0) {
            Serial.println("Light the Led Green");
            digitalWrite(LED_R, LOW);   // 熄灭红色LED
            digitalWrite(LED_G, HIGH);// 点亮绿色LED
            digitalWrite(LED_B, LOW);   // 熄灭蓝色LED
            client.publish(publishTopic,payload_g_on); // 发布消息到MQTT服务器,表示绿色LED已点亮
      }

      if(memcmp((char *)payload,payload_b_on,strlen(payload_b_on))==0) {
            Serial.println("Light the Led Blue");
            digitalWrite(LED_R, LOW);   // 熄灭红色LED
            digitalWrite(LED_G, LOW);   // 熄灭绿色LED
            digitalWrite(LED_B, HIGH);// 点亮蓝色LED
            client.publish(publishTopic,payload_b_on); // 发布消息到MQTT服务器,表示蓝色LED已点亮
      }
    }
}
// 定义一个函数用于MQTT客户端重连
void reconnect() {
    // 循环直到我们重新连接
    while (!(client.connected())) {
      Serial.print("\r\n尝试MQTT连接...");
      // 尝试连接
      if (client.connect(clientId)) {
            Serial.println("连接成功");
            // 连接成功后,发布一个通知消息并重新订阅主题
            // client.publish(publishTopic, publishPayload);
            client.subscribe(subscribeTopic);
      } else {
            Serial.println("连接失败, rc=");
            Serial.print(client.state());
            Serial.println(" 5秒后重试");
            // 等待5秒后再重试
            delay(5000);
      }
    }
}

// setup() 函数用于初始化设置
void setup() {
    // 初始化三种颜色LED的GPIO引脚为输出
    pinMode(LED_R, OUTPUT);
    pinMode(LED_G, OUTPUT);
    pinMode(LED_B, OUTPUT);

    // 初始状态下,所有LED关闭
    digitalWrite(LED_R, LOW);
    digitalWrite(LED_G, LOW);
    digitalWrite(LED_B, LOW);

    // 初始化串口通信,并等待串口打开
    Serial.begin(115200);
    // 等待串口连接
    while (!Serial) {
      ;
    }
    Serial.println("串口初始化成功");

    // 尝试连接到Wi-Fi网络
    while (status != WL_CONNECTED) {
      Serial.print("\r\n尝试连接到SSID: ");
      Serial.println(ssid);
      // 连接到WPA/WPA2网络。如果使用开放或WEP网络,请修改此行代码
      status = WiFi.begin(ssid, pass);

      // 等待10秒以进行连接
      delay(10000);
    }
    Serial.println("Wi-Fi连接成功");

    // 设置MQTT服务器地址和端口号
    client.setServer(mqttServer, 1883);
    // 设置MQTT回调函数
    client.setCallback(callback);

    // 允许硬件自我调整
    delay(1500);

    // 尝试连接MQTT服务器
    reconnect();
}

// loop() 函数用于处理循环中的任务
void loop() {
    // 检查客户端是否连接
    if (!client.connected()) {
      reconnect();
    }
    client.loop();
    // 这里可以添加其他任务,比如周期性发布消息等
}
void loop() {
    if (!(client.connected())) {
      reconnect();
    }
    client.loop();
}
</code></pre>

<p>使用MQTT:</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>串口输出结果:</p>

<p> &nbsp;</p>

<p>注意:</p>

<ol>
        <li>LED_R,&nbsp;LED_G,&nbsp;LED_B&nbsp;需要在代码顶部定义,它们应该是连接到相应LED的GPIO引脚号。</li>
        <li>setup()&nbsp;函数在Arduino环境中自动在启动时调用一次,用于初始化硬件和设置。</li>
        <li>loop()&nbsp;函数是Arduino程序的主体,它在程序运行时不断循环执行。</li>
        <li>reconnect()&nbsp;函数用于在MQTT连接断开时尝试重新连接。</li>
        <li>代码中使用了&nbsp;delay()&nbsp;函数来等待一段时间,但在实际的产品开发中,通常建议使用更高效的定时或中断方式,因为&nbsp;delay()&nbsp;会阻塞整个程序运行。</li>
</ol>

<p>视频:</p>

<p>87046194f91fee8c15a490c4a0c21317<br />
&nbsp;</p>

damiaa 发表于 2024-4-7 09:21

<p>文章很好,赞一个!这模块据说还蛮便宜!</p>

meiyao 发表于 2024-4-7 23:09

damiaa 发表于 2024-4-7 09:21
文章很好,赞一个!这模块据说还蛮便宜!

<p>这个是还可以哟</p>
页: [1]
查看完整版本: 【安信可BW16-Kit】+MQTT_Basic