169|0

5

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

【Follow me第2期】进阶任务 通过Wi-Fi,利用MQTT协议接入到开源的智能家居平台HA... [复制链接]

  本帖最后由 eew_HqZm7h 于 2024-10-9 12:59 编辑

Home Assistant简介

Home Assistant 是一款免费的开源家庭自动化软件,将可联网的设备接入到Home Assistant中,可以实现对它们远程控制,在手机上可以远程控制灯光、电气设备,监控室内温度并自动执行开空调等操作。也可以关联不同的设备,使它们流程化操作。

 

任务步骤:

1.单片机连接WIFI

2.部署Home Assistant

3.部署MQTT服务器

4.Home Assistant与MQTT服务器连接

5.单片机通过MQTT服务连接到Home Assistant中

 

1.单片机连接WIFI

使用arduino自带的样例连接WIFI

 

注意点:1.自己手动创建arduino_secrets.h头文件,设置SECRET_SSID(WIFI名称)和SECRET_PASS(WIFI密码)。或者在代码中直接对ssid和pass赋值。

2.单片机只能接受到2.4GHZ信号的WIFI,可以先用ScanNetworksAdvanced样例,扫描是否能接收到WIFI的信号。

/*
  This example connects to an unencrypted WiFi network.
  Then it prints the MAC address of the WiFi module,
  the IP address obtained, and other network details.

  created 13 July 2010
  by dlf (Metodo2 srl)
  modified 31 May 2012
  by Tom Igoe

  Find the full UNO R4 WiFi Network documentation here:
  https://docs.arduino.cc/tutorials/uno-r4-wifi/wifi-examples#connect-with-wpa
 */
#include <WiFiS3.h>

#include "arduino_secrets.h" 
///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = SECRET_SSID;        // your network SSID (name)
char pass[] = SECRET_PASS;    // your network password (use for WPA, or use as key for WEP)
int status = WL_IDLE_STATUS;     // the WiFi radio's status

void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // check for the WiFi module:
  if (WiFi.status() == WL_NO_MODULE) {
    Serial.println("Communication with WiFi module failed!");
    // don't continue
    while (true);
  }

  String fv = WiFi.firmwareVersion();
  if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
    Serial.println("Please upgrade the firmware");
  }

  // attempt to connect to WiFi network:
  while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to WPA SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network:
    status = WiFi.begin(ssid, pass);

    // wait 10 seconds for connection:
    delay(10000);
  }

  // you're connected now, so print out the data:
  Serial.print("You're connected to the network");
  printCurrentNet();
  printWifiData();

}

void loop() {
  // check the network connection once every 10 seconds:
  delay(10000);
  printCurrentNet();
}

void printWifiData() {
  // print your board's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  
  Serial.println(ip);

  // print your MAC address:
  byte mac[6];
  WiFi.macAddress(mac);
  Serial.print("MAC address: ");
  printMacAddress(mac);
}

void printCurrentNet() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print the MAC address of the router you're attached to:
  byte bssid[6];
  WiFi.BSSID(bssid);
  Serial.print("BSSID: ");
  printMacAddress(bssid);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.println(rssi);

  // print the encryption type:
  byte encryption = WiFi.encryptionType();
  Serial.print("Encryption Type:");
  Serial.println(encryption, HEX);
  Serial.println();
}

void printMacAddress(byte mac[]) {
  for (int i = 0; i < 6; i++) {
    if (i > 0) {
      Serial.print(":");
    }
    if (mac[i] < 16) {
      Serial.print("0");
    }
    Serial.print(mac[i], HEX);
  }
  Serial.println();
}

连接成功后会打印单片机的IP地址以及Mac地址

 

 

2.部署Home Assistant(Docker部署)

刚开始,我是直接下载Home Assistant镜像直接部署的,等了很久下载文件,但是最后还是失败了。

 

使用Docker部署Home Assistant

前提提要:将docker的拉取镜像的源换成国内源(如阿里云)

 

(1)拉取镜像(连接WIFI下载好多次都失败,换成流量下载试了两三次成功了)

docker pull homeassistant/home-assistant:latest //获取最新版的Home Assistant

也可以获取稳定版

docker pull homeassistant/home-assistant:stable

等待所有相关程序Pull complete就安装成功了。

 

(2)创建并运行容器

docker run -d --name="hass" -v /home/hass/config:/config -p 8123:8123 homeassistant/home-assistant:latest

(3)查看容器

docker ps -a

(4)使用自己的虚拟机IP+端口号8123在主机上访问Home Assistant

 

(5)创建账号并成功登录

 

3.部署MQTT服务器

(1)拉取EMQX镜像

docker pull emqx/emqx:5.8.0

(2)创建并启动EMQX容器

docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:5.8.0

(3)通过虚拟机IP+端口号18083访问EMQX(默认用户名:admin,密码:public)

 4.Home Assistant与MQTT服务器通信

(1)创建内置数据库(数据库用来记录连接的信息)(全部选默认的即可)

  (2)创建用户(Home Assistant通过创建的用户账号和密码连接到EMQX)

  (3)Home Assistant连接EMQX

在Home Assistant主页面点击设置--设备与服务--添加集成(右下角)--搜索MQTT--点击MQTT

注意点(这里的代理是EMQX节点的地址,不是EMQX服务器的地址)

 

连接成功后连接数变为1(注意图中的EMQX节点地址)

 

5.单片机通过MQTT服务连接到Home Assistant中

(1)下载ArduinoMqttClient库,使用WiFiSimpleSender样例(此样例会连接WIFI并连接MQTT服务器)

 

需要修改的地方:(注:MQTT服务器的账号和密码为注释项,如果自己的服务器设置账号和密码,需要自己取消注释并修改。)

 

 

 

连接成功后一直发送消息:

 

两个错误点:

(1) MQTT connection failed! Error code = -2

 

这个问题困扰了我很长时间。最后解决的方法:将虚拟机的网络和单片机的网络接入到同一个网段。

将虚拟机网络连接模式改为桥接模式,并在“编辑”中选择“虚拟网络编辑器”,指定桥接的网卡为无线网卡。并将单片机连接的热点和主机连接的热点一致。

之前 一直连接失败,是将虚拟机的连接模式设置为NAT模式,而且将单片机连接到了电脑的热点上。

  

(2)MQTT connection failed! Error code = 5

这是连接MQTT时认证失败,应该检查账号和密码,或者关闭MQTT服务器的内置数据库(起认证作用)。

 

点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表