〇、参考前必读

本篇文章将一步步的将如何建立树莓派与8266的连接方法告诉您

首先在参考本文之前,您需要准备一下材料

准备材料:

1、一块树莓派 +32GB以上内存卡(版本应该在3B以上,并准备好了系统并能正常进行连接)

2、一块ESP8266(我们将使用Arduino的IDE进行编辑)

3、在太极创客上获取或参考8266编写资料的能力,并注册一个然也物联个人服务器

4、平缓心情,一步步来捏,例如第三点如果不理解,后文也会详细叙述~( ̄▽ ̄)~*

一、关于个人物联网服务器注册

请您先打开然也平台,其他的百度、阿里云个人服务器也可以,此处仅作示范)

esp8266树莓派 树莓派 esp8266_esp8266树莓派

 

                                                                  图 1.1

注册完成后您就获得 

      自己的ID账号 、密码、八个设备名称,请您务必牢记(可能平台需要一两天才会批准您的审核)

二、关于树莓派系统的安装

首先我推荐您使用树莓派官方提供的镜像安装软件   Raspberry Pi Imager

esp8266树莓派 树莓派 esp8266_python_02

esp8266树莓派 树莓派 esp8266_数据库_03

                                                      图 2.1

 树莓派系统界面将如下图所示,请您按需选择您所需的系统,本次以这款系统为例进行操作

当您完成此步骤时,再仔细阅读下一个步骤哦!

三、连接上我的树莓派

如何连接树莓派,这是一个永远的难题hhh   

乐死自己,对于一名新手小白,我还是推荐购买一块小小的HDMI屏幕,这将无疑降低很多难度,多小的屏幕都好!!

如果您是无屏幕连接,我推荐您阅读其他的树莓派无屏幕连接的教程,此处不再赘述(虽然我很抱歉,但这篇文章初衷还是尽快让您连接您的8266与树莓派)

好了下面将讲解连上树莓派的第一件事

1、连接上一个WiFi热点、确保后续无屏幕时也能够进行远程桌面连接(VNC / PUTTY /微软自带)

2、注意了接下来将介绍一些Linux系统基本操作指令,这些指令类似于微软的CMD界面的指令

             指令1、  sudo 

sudo

   这个指令是获得一定的管理权限,命令树莓派做指令的事情

             指令2、

sudo nano

  sudo nano   这个指令是以文本编辑的形式打开某个文件

                             对于一个文本编辑来说 CTRL+O 然后按回车键是将当前所有文字写入这个文件

                                                                  CTRL+X 可以关闭当前nano编辑界面

3、下面我们将正式开始做树莓派的配置工作!

首先打开您的树莓派的命令提示符

依次按顺序输入以下代码,注意您的镜像源如果可以正常下载就无需更换下载源,如果异常请更换清华科大镜像源(可以理解为更换获取渠道!!)

好了下面开始代码块,注意,一句一句输入进去,success再下一句

1.sudo apt-get update

2.sudo apt-get install mosquitto

3.sudo apt-get install python-pip      #如果此处提醒安装失败可以看是不是提示改成 pip3   或者 
                                      python3 输入进去

4.sudo pip install paho-mqtt

5.sudo apt-get install mosquitto mosquitto-clients

6.sudo nano /etc/mosquitto/mosquitto.conf     这步是打开一个文件

7.将里面替换成

# Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example
 
pid_file /var/run/mosquitto.pid
persistence true
persistence_location /var/lib/mosquitto/
 
log_dest topic
 
log_type error
log_type warning
log_type notice
log_type information
 
connection_messages true
log_timestamp true
 
include_dir /etc/mosquitto/conf.d



---------------------------------------CTRL+X   回车 保存            而后CTRL+X 关闭




8.sudo /etc/init.d/mosquitto start

好了如果到此为止,都是成功的恭喜你又近了一步!!

四、开始互联8266与树莓派

这是python例程,注意有一些需要修改的地方例如设备id,WiFi账号及密码。请不要一股脑复制完事,需修改的地方当然我也会标出!!

注意!!这个例程可以嵌入您的视觉处理等代码内进行传输结果!!

Warning!!!!!

所有注释的地方请务必仔细阅读,否则您可能错失一个学习并且完成互联的机会!!

这个代码您可以进行修改,比如把内容单独def一个msg函数,从哪获取您需要发布的内容!!

#这是树莓派的代码    by MKDHXY

import paho.mqtt.client as mqtt

import os

import time



HOST = 'iot.ranye-iot.net'     #这里是然也平台地址,若您使用别的平台请进行更改,注意本地ip也可



PORT = 1883                    #这是您的端口号 默认1883



topic = "MKDHXY/test"          #这是您的树莓派作为发布者发布的主题设置,是发布的主题!!!看清

Subtopic="MKDHXY/Subtest      #这是您的树莓派作订阅者、订阅的主题设置,是订阅的主题!!!看清

client_id = 'MKDHXY_X_id'      #注意了这是您的设备id,您可以联网八个设备,id均需要不同











def on_connect(client, userdata, flags, rc):



    print("Connected with result code "+str(rc))



    client.subscribe(Subtopic)







def on_message(client, userdata, msg):



    print(msg.topic+" "+msg.payload.decode("utf-8"))



    # 消息处理



def publich():



        result = client.publish(topic, msg)



        # result: [0, 1]



        status = result[0]



        if status == 0:



            print("Send `{}` to topic `{}`".format(msg,topic))



        else:



            print("Failed to send message to topic {}".format(topic))







 # ClientId不能重复,也可不传入



client = mqtt.Client(client_id)   





client.username_pw_set("**账号****", "***密码****")  # 这里请替换成您的账号及密码!!!!!!




client.on_connect = on_connect



client.on_message = on_message



client.connect(HOST, PORT, 60)



 # 订阅一个主题并且发布一个主题



client.subscribe(Subtopic)                  #这里必须修改成为您所订阅的主题

client.publish(topic, "***内容****")       #这里需要修改成为您作为发布者发布的主题的内容

client.loop_forever()

五、ESP8266的代码

相信您已经安装要求下载了arduino ide 了,接下来我将参考太极创客的代码将告诉您如何按需修改

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266WebServer.h>
#include <FS.h>
#include <PubSubClient.h>
 
// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "*****WIFI名称******";
const char* password = "*****WIFI密码******";
const char* mqttServer = "iot.ranye-iot.net";

 
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
 
// ****************************************************
// 注意!以下需要用户根据然也物联平台信息进行修改!否则无法工作!
// ****************************************************
const char* mqttUserName = "*******";         // 服务端连接用户名(需要修改)
const char* mqttPassword = "*******";          // 服务端连接密码(需要修改)
const char* clientId = "MKDHXY_**_id";          // 客户端id (需要修改)
const char* subTopic = "MKDHXY/myT*****";        // 订阅主题(需要修改)
const char* pubTopic = "MKDHX********";        // 订阅主题(需要修改)
const char* willTopic = "MKDHXY/led_yz";   // 遗嘱主题名称  这是指,离线前最后一句话
// ****************************************************
 
//遗嘱相关信息
const char* willMsg = "esp8266 offline";        // 遗嘱主题信息
const int willQos = 0;                          // 遗嘱QoS
const int willRetain = false;                   // 遗嘱保留
 
const int subQoS = 1;           
const bool cleanSession = false; 
 
bool ledStatus = HIGH;
 
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);          
  digitalWrite(LED_BUILTIN, ledStatus);  
  Serial.begin(9600);                   
  
  //设置ESP8266工作模式为无线终端模式
  WiFi.mode(WIFI_STA);
  
  // 连接WiFi
  connectWifi();
  
  // 设置MQTT服务器和端口号
  mqttClient.setServer(mqttServer, 1883);
  mqttClient.setCallback(receiveCallback);
 
  // 连接MQTT服务器
  connectMQTTserver();
}
 
void loop() {
  // 如果开发板未能成功连接服务器,则尝试连接服务器
  if (!mqttClient.connected()) {
    connectMQTTserver();
  }
 
   // 处理信息以及心跳
   mqttClient.loop();
   
}
 
// 连接MQTT服务器并订阅信息
void connectMQTTserver(){
  // 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)
  
 
  /* 连接MQTT服务器
  boolean connect(const char* id, const char* user, 
                  const char* pass, const char* willTopic, 
                  uint8_t willQos, boolean willRetain, 
                  const char* willMessage, boolean cleanSession); 
  若让设备在离线时仍然能够让qos1工作,则connect时的cleanSession需要设置为false                
                  */
  if (mqttClient.connect(clientId, mqttUserName, 
                         mqttPassword, willTopic, 
                         willQos, willRetain, willMsg, cleanSession)) { 
    Serial.print("MQTT Server Connected. ClientId: ");
    Serial.println(clientId);
    Serial.print("MQTT Server: ");
    Serial.println(mqttServer);    
    
    subscribeTopic(); // 订阅指定主题
  } else {
    Serial.print("MQTT Server Connect Failed. Client State:");
    Serial.println(mqttClient.state());
    delay(5000);
  }   
}
 
// 收到信息后的回调函数
void receiveCallback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message Received [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println("");
  Serial.print("Message Length(Bytes) ");
  Serial.println(length);
 
  if ((char)payload[0] == '1') {     // 如果收到的信息以“1”为开始
    ledStatus = LOW;
    digitalWrite(BUILTIN_LED, ledStatus);  // 则点亮LED。
  } else {
    ledStatus = HIGH;                           
    digitalWrite(BUILTIN_LED, ledStatus); // 否则熄灭LED。
  }
 
  pubMQTTmsg();
}
 
// 订阅指定主题
void subscribeTopic(){
 
  

  if(mqttClient.subscribe(subTopic, subQoS)){
    Serial.print("Subscribed Topic: ");
    Serial.println(subTopic);
  } else {
    Serial.print("Subscribe Fail...");
  }  
}
 
// 发布信息
void pubMQTTmsg(){
  char* pubMessage;
  
  if (ledStatus == LOW){
    pubMessage = "LED ON";
  } else {
    pubMessage = "LED OFF";
  }
 
  // 实现ESP8266向主题发布信息
  if(mqttClient.publish(pubTopic, pubMessage)){
    Serial.println("Publish Topic:");Serial.println(pubTopic);
    Serial.println("Publish message:");Serial.println(pubMessage);    
  } else {
    Serial.println("Message Publish Failed."); 
  }
}
 
// ESP8266连接wifi
void connectWifi(){
 
  WiFi.begin(ssid, password);
 
  //等待WiFi连接,成功连接后输出成功信息
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi Connected!");  
  Serial.println(""); 
}

以上就完成了您的设置