Android、ESP32、ESP8266的mqtt通信

13 篇文章 2 订阅
10 篇文章 0 订阅

Android

activity_main
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <TextView
        android:id="@+id/recvTxt"
        android:layout_width="match_parent"
        android:layout_height="600dp"
        android:text=""
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/onBtn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="开灯" />

    <Button
        android:id="@+id/offBtn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="关灯" />

</LinearLayout>
AndroidManifest
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
MainActivity
package com.example.myapplication;
/*
* https://repo.eclipse.org/content/repositories/paho-releases/org/eclipse/paho/
* https://repo.eclipse.org/content/repositories/paho-releases/org/eclipse/paho/org.eclipse.paho.client.mqttv3/1.2.5/
* 下载org.eclipse.paho.client.mqttv3-1.2.5.jar文件
* 将下载的jar包复制至项目libs目录下,并右击mqtt jar包 ADD As Libray.. ,将mqtt jar包导入库文件中。
* */
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

public class MainActivity extends AppCompatActivity {
    private String host = "tcp://broker.emqx.io:1883";
    private String userName = "dsx_phone";
    private String passWord = "dsx_phone_pwd";
    private String mqtt_id ="dsx_phone_001";
    private MqttClient client;
    private String subTopic = "dsx_phone"; //订阅的主题  接收内容
    private String sendTopic = "dsx_esp8266";//发送的主题
    private MqttConnectOptions options;
    private TextView recvTxt;
    private Button onBtn,offBtn;
    MyHandler myHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recvTxt = findViewById(R.id.recvTxt);
        onBtn = findViewById(R.id.onBtn);
        offBtn = findViewById(R.id.offBtn);
        myHandler = new MyHandler();
        connectServer();
        onBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                publishMsg(sendTopic,"on");
            }
        });
        offBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                publishMsg(sendTopic,"off");
            }
        });

    }
    private void connectServer(){
        try {
            client = new MqttClient(host, mqtt_id, new MemoryPersistence());
            options = new MqttConnectOptions();
            options.setCleanSession(true);
            options.setUserName(userName);
            options.setPassword(passWord.toCharArray());
            options.setConnectionTimeout(10);
            options.setKeepAliveInterval(20);
            client.setCallback(new MqttCallback() {
                @Override
                public void connectionLost(Throwable throwable) {
                    //重新连接
                }

                @Override
                public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
                    //收到消息
                    Message msg = new Message();
                    msg.what = 2;
                    msg.obj = s + "------" + mqttMessage.toString();
                    myHandler.sendMessage(msg);
                }

                @Override
                public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
                    //发送完成后执行到这里
                    Message msg = new Message();
                    msg.what = 4;
                    msg.obj = "Publish OK".toString();
                    myHandler.sendMessage(msg);
                }
            });
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        if(!(client.isConnected())){
                            client.connect(options);
                            Message msg = new Message();
                            msg.what = 1;
                            msg.obj = "Connect Server Success".toString();
                            myHandler.sendMessage(msg);
                            publishMsg(sendTopic,"我是来自手机端的消息!");
                        }
                    }catch (Exception e){
                        e.printStackTrace();
                        Message msg = new Message();
                        msg.what = 3;
                        msg.obj = "Connect Server Fail".toString();
                        myHandler.sendMessage(msg);
                    }
                }
            }).start();
        } catch (MqttException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    private void publishMsg(String send_topic,String msg){
        if(client == null || !(client.isConnected())){
            return;
        }
        MqttMessage mqtt_msg = new MqttMessage();
        mqtt_msg.setPayload(msg.getBytes());
        try {
            client.publish(send_topic,mqtt_msg);
        } catch (MqttException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    class MyHandler extends Handler{
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case 1:
                    recvTxt.setText(msg.obj.toString());
                    Toast.makeText(MainActivity.this,msg.obj.toString(),Toast.LENGTH_LONG).show();
                    try {
                        client.subscribe(subTopic);
                    } catch (MqttException e) {
                        e.printStackTrace();
                        throw new RuntimeException(e);
                    }
                    break;
                case 2:
                    recvTxt.setText(msg.obj.toString());
                    Toast.makeText(MainActivity.this,"Recv Data",Toast.LENGTH_LONG).show();
                    break;
                case 3:
                    recvTxt.setText(msg.obj.toString());
                    Toast.makeText(MainActivity.this,msg.obj.toString(),Toast.LENGTH_LONG).show();
                    break;
                case 4:
                    recvTxt.setText(msg.obj.toString());
                    Toast.makeText(MainActivity.this,msg.obj.toString(),Toast.LENGTH_LONG).show();
                    break;
                case 5:
                    Toast.makeText(MainActivity.this,"5",Toast.LENGTH_LONG).show();
                    break;
                default:
                    Toast.makeText(MainActivity.this,"default",Toast.LENGTH_LONG).show();
                    break;
            }
        }
    }
}

ESP32

/*
//wifi连接
#include <WiFi.h>
const char* id="TP-LINK_8F3882";   //定义两个字符串指针常量
const char* psw="123456789";
void setup() {
  Serial.begin(115200);
  WiFi.begin(id,psw);
  while(WiFi.status() != WL_CONNECTED){			//未连接上
    delay(500);
    Serial.println("wifi connecting...");
  }
  Serial.println("wifi connect ok!");				//连接上
}
void loop(){							//空循环

}

*/
/*
  Broker:
broker.emqx.io
TCP 端口:
1883
WebSocket 端口:
8083
SSL/TLS 端口:
8883
WebSocket Secure 端口:
8084
QUIC 端口:
14567
CA 证书文件:
broker.emqx.io-ca.crt
*/
 
#include <WiFi.h>
#include <PubSubClient.h>
 
// const char* ssid     = "Netcore_dsx";
// const char* password = "dsx54254";
 
const char* ssid="TP-LINK_8F3882";   //定义两个字符串指针常量
const char* password="123456789";
 
//led
#define JDQ 2
 
const char* MQTT_SERVER  = "broker.emqx.io";
const int   MQTT_PORT    = 1883;
const char* MQTT_USRNAME = "admin";
const char* MQTT_PASSWD  = "adminadmin";
const char* TOPIC = "dsx_esp8266";     //订阅的主题  接收这个主题的消息
const char* CLIENT_ID    = "dsx_esp32_01";  //当前设备的clientid标志
 
WiFiClient espClient;
PubSubClient  client(espClient);
 
String send_msg="I am esp32";
String send_topic = "dsx_phone";   //往这个主题发送消息
void setup()
{
  Serial.begin(115200);
  delay(5000);
 
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(2500);
    Serial.print(".");
  }
 
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
 
  pinMode(JDQ, OUTPUT);
  client.setServer(MQTT_SERVER, MQTT_PORT); //设定MQTT服务器与使用的端口,1883是默认的MQTT端口
  client.setCallback(callback);        //设定回调方式,当ESP8266收到订阅消息时会调用此方法
}
 
void reconnect() {
  while (!client.connected()) {
    Serial.println("Attempting MQTT connection...");
    if (client.connect(CLIENT_ID,MQTT_USRNAME,MQTT_PASSWD)) {
      Serial.println("Mqtt server connected success");
      // 连接成功时订阅主题
      client.subscribe(TOPIC);
      Serial.println("Topic  dsx_esp32  subscribe success");
      pubmsg(send_topic,send_msg);
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}
 
void callback(char* topic, byte* payload, unsigned int length) {
    Serial.print("Message arrived in topic: ");
    Serial.println(topic);
    Serial.print("Message: ");
    String message;
    for (int i = 0; i < length; i++) {
        message += (char) payload[i];  // Convert *byte to string
    }
    Serial.print(message);
    if (message == "on") {
        digitalWrite(JDQ, HIGH);  // Turn on the LED
        pubmsg(send_topic, "LED ON");
    }
    if (message == "off") {
        digitalWrite(JDQ, LOW); // Turn off the LED
        pubmsg(send_topic, "LED OFF");
    }
    Serial.println();
    Serial.println("-----------------------");
}
 
 
// topicString   参数类似  "device/date" 
// messageString 参数类似  String realmsg="";
 
 
void pubmsg( const String &topicString, const  String &messageString){
  char publishTopic[topicString.length() + 1];  
  strcpy(publishTopic, topicString.c_str());
  char publishMsg[messageString.length() + 1];   
  strcpy(publishMsg, messageString.c_str());
  
  // 实现ESP8266向主题发布信息
  if(client.publish(publishTopic, publishMsg)){
    Serial.print("Publish Topic:");Serial.println(publishTopic);
    Serial.print("Publish message:");Serial.println(publishMsg);   
    Serial.println("Send Success"); 
  } else {
    Serial.println("Message Publish Failed."); 
  }
}
 
void loop()
{
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
}

ESP8266

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// 开发板上LED GPIO2 对应 D4  可以使用D4  也可以使用2    低电平点亮
#define LED 2

// WiFi
const char *ssid = "Netcore_dsx"; // Enter your WiFi name
const char *password = "dsx54254";  // Enter WiFi password

// MQTT Broker
const char *mqtt_broker = "broker.emqx.io";
const char *topic = "dsx_esp8266";
const char *mqtt_username = "emqx_dsx_esp8266";
const char *mqtt_password = "public_dsx_esp8266";
const int mqtt_port = 1883;
const char *send_topic = "dsx_phone";
bool ledState = false;

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
    // Set software serial baud to 115200;
    Serial.begin(115200);
    delay(1000); // Delay for stability

    // Connecting to a WiFi network
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.println("Connecting to WiFi...");
    }
    Serial.println("Connected to the WiFi network");

    // Setting LED pin as output
    pinMode(LED, OUTPUT);
    digitalWrite(LED, HIGH);  // Turn off the LED initially

    // Connecting to an MQTT broker
    client.setServer(mqtt_broker, mqtt_port);
    client.setCallback(callback);
    while (!client.connected()) {
        String client_id = "esp8266-client-";
        client_id += String(WiFi.macAddress());
        Serial.printf("The client %s connects to the public MQTT broker\n", client_id.c_str());
        if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
            Serial.println("Public EMQX MQTT broker connected");
        } else {
            Serial.print("Failed with state ");
            Serial.print(client.state());
            delay(2000);
        }
    }

    // Publish and subscribe
    client.publish(send_topic, "hello phone");
    client.subscribe(topic);
}

void callback(char *topic, byte *payload, unsigned int length) {
    Serial.print("Message arrived in topic: ");
    Serial.println(topic);
    Serial.print("Message: ");
    String message;
    for (int i = 0; i < length; i++) {
        message += (char) payload[i];  // Convert *byte to string
    }
    Serial.print(message);
    if (message == "on" && !ledState) {
        digitalWrite(LED, LOW);  // Turn on the LED
        ledState = true;
        client.publish(send_topic, "LED ON");
    }
    if (message == "off" && ledState) {
        digitalWrite(LED, HIGH); // Turn off the LED
        ledState = false;
        client.publish(send_topic, "LED OFF");
    }
    Serial.println();
    Serial.println("-----------------------");
}

void loop() {
    client.loop();
    delay(100); // Delay for a short period in each loop iteration
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32和ESP8266都是目前比较流行的嵌入式开发板,而MQTT是一种轻量级的消息传输协议。将STM32和ESP8266通过MQTT协议进行通信可以实现很多有意义的应用,比如智能家居、物联网等。 首先,我们需要在STM32和ESP8266上分别搭建MQTT客户端。我们可以使用MQTT库,像是MQTT-SN或是Paho MQTT,来生成可执行应用程序的文件。 然后,我们需要将MQTT客户端与STM32和ESP8266进行相应的硬件连接。可以使用RJ45接口或者是WiFi模块实现连接。连接完成后,我们要通过代码实现消息传输,即STM32中的数据发送与ESP8266中的数据接收,或者是ESP8266中的数据发送与STM32中的数据接收。 在消息传输过程中,我们需要实现消息发布者和消息订阅者之间的消息通信。具体的流程是,STM32充当发布者时往MQTT服务器中发布消息 data,并设置相应的主题 topic,而ESP8266充当订阅者时从MQTT服务器中订阅主题 topic,并接收来自STM32的数据。 最后,很重要的是在代码中加入异常处理。由于通信过程中可能因为网络等原因出现异常,我们需要在程序中做好相应的判断和处理。比如,检查网络连接状况、出错时进行重连等操作。 综上所述,通过STM32和ESP8266MQTT通信,可以大大增强嵌入式系统的通信能力,实现更多智能化的应用。 ### 回答2: STM32是一款基于ARM Cortex-M处理器的微控制器,而ESP8266是一款WiFi模块。它们是一对通信的好搭档,可以将STM32的UART串口通信转换成WiFi模块的通信方式,实现无线通讯。MQTT是一种轻量级的消息传输协议,适用于物联网应用场景,允许传输不同类型的数据,以提供灵活性和可靠性。在STM32和ESP8266的通讯中,可以使用MQTT协议作为传输协议。 实现STM32和ESP8266之间的通讯,需要在STM32中先配置UART串口通讯,并将通讯数据转换成ESP8266可以处理的格式,然后在ESP8266中完成WiFi的连接和MQTT协议的配置,使其能够发送和接收MQTT消息。可以使用一些现成的库或者SDK,如MQTTClient-Library,提供方便的接口和功能,加速开发流程。 在实际应用中,可以在STM32中采集各种传感器的数据,并通过MQTT协议将其上报到云平台或其他设备。同时,也可以通过MQTT协议发送控制指令,控制STM32上的设备或执行某些操作,实现远程控制和管理。 总之,STM32和ESP8266的组合加上MQTT协议,可以实现低功耗、高效率、可靠的物联网通讯,将物联网应用场景落到实处,为人们生活带来更多的智能化体验。 ### 回答3: STM32和ESP8266是现在非常流行的微控制器和Wi-Fi模块,往往会被用于物联网设备的开发。MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息协议,可适用于各种设备之间的通信。STM32和ESP8266结合使用MQTT通信可以实现智能家居、物联网、车联网等方面的应用。 在使用STM32与ESP8266通信时,需要使用串口通信方式,将数据发送到ESP8266,然后通过ESP8266实现Wi-Fi通信,将数据发送到代理服务器,最终实现数据的接收与发送。MQTT协议可以通过特定的主题和话题(Topic)来发布和订阅消息,具有安全、可靠、稳定、低功耗等特点。 使用MQTT协议与ESP8266进行通信,可以使用ESP8266的SDK或者直接使用MQTT库,但需要注意要设置正确的IP地址和端口号,同时也要确保ESP8266MQTT代理服务器之间的连接是稳定的。 在项目开发时,需要进行良好的代码规划和设计,需要考虑到资源占用,代码可读性以及协议兼容性等方面的问题。同时,需要注意安全和隐私保护,在通信过程中进行加密和认证,保证数据的安全性。 总之,STM32与ESP8266相结合使用MQTT协议可以实现高效、稳定、标准化的物联网设备通信,为智能化生活和产业互联网等领域的发展提供了广阔的空间和可能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值