物联网学习资料
《arduino程序设计基础》陈吕洲 北京航空航天大学出版社
半颗心脏博客导航一站式搜索(所有博客的汇总帖)
Ai-Thinker 安信可科技 github
半颗心脏 | 徐宏
蓝牙技术
蓝牙网关【【智能家居】入门攻略二!啥是网关?蓝牙、zigbee协议详解,原来区别这么大!-哔哩哔哩】
esp
8266有两种工作模式,分别是station模式以及ap模式,简单来说,station模式是连你家无线路由器的,ap模式是8266作为热点由手机去连接它(或者无线路由器)。如无意外,在家里使用都会用station模式
ESP8266串口wifi简介,通过http网页实现控制引脚
esp初学必看,简单示例
ESP8266型号对比
ESP8266 型号原理图汇总
ESP8266型号、下载、接线、烧录等怕忘总结
ESP8266和nodemcu是一种什么关系,ESP8266是什么
nodemcu上面用了一个ESP8266而已,其实质就是在ESP8266上面跑了一个LUA的解释器,ESP8266本身就支持二次开发的
esp8266是一个模块,modemcu是一个包含8266的控制模块
esp8266是芯片
esp8266芯片加上4MB spi flash变成esp-12模块
esp-12模块加上底板,加上USB转串口变成NodMCU
esp8266是一类wifi模块,包括esp-01,esp-01s,esp-12f等等
esp 的 mdns
在网络世界中,很难记住每个网站和计算机的IP地址,解决这个问题域名系统(DNS)用于制作人类可理解的名称。在ESP8266中使用ESP作为Web服务器时,很难记住ESP8266的IP地址,并且在DHCP模式下很难识别ESP的IP地址
。即WiFi路由器为ESP8266分配IP地址
。大多数ESP8266应用程序没有显示界面,并且不容易访问以了解其IP地址。为了克服这个问题,使用mDNS。
mDNS 是一种组播 UDP 服务,用来提供本地网络服务和主机发现。
mdns 即多播dns(Multicast DNS),mDNS主要实现了在没有传统DNS服务器的
情况下使局域网内的主机实现相互发现和通信,使用的端口为5353,遵从dns协议,
使用现有的DNS信息结构、名语法和资源记录类型。
工作原理举例:
比如,A 主机进入局域网,开启了 mDNS 服务
,并向A主机的 mDNS 服务注册以下信息:我提供 FTP 服务,我的 IP 是192.168.1.101,端口是 21
。当 B 主机进入局域网
,并向 B 主机的 mDNS 服务请求,我要找局域网内 FTP 服务器
,B主机的 mDNS 就会去局域网内向其他主机的 mDNS 询问(即多播)
,并且最终告诉你,有一个IP地址为 192.168.1.101,端口号是 21 的主机
,也就是 A 主机提供 FTP 服务,所以 B 主机就知道了 A 主机的 IP 地址和端口号了
。
一种用于在本地网络 (LAN) 内解析域名的协议。
它可以用来代替传统的 DNS 服务器,以解析设备在局域网内的主机名与 IP 地址的对应关系。
mDNS 可以使用设备与设备之间的通讯更加方便和便捷,尤其在智能家居、物联网等应用中。
ESP32入门基础之mDNS服务
目的
通过 域名 而不是 ip 地址访问 esp
访问到 esp 之后,esp 就相当于一个终端,可以发送接口,查询baidu等网络功能
可以通过 webserver 重置网络配置
if (MDNS.begin("esp8266")) {
Serial.println("");
Serial.println("mDNS启动");
}
MDNS.addService("http", "tcp", 80);
Serial.print("IP 地址: " + WiFi.localIP()); //假设WiFi.localIP()为192.168.52.60
Serial.println("http://esp8266");
Serial.println("测试互联网通信!");
String buf = gethttp_API("网易云热评接口", 80);
if (buf != "") {
Serial.println("网易云接口返回:" + buf);
}
可以通过 http://esp8266 访问esp
或者 192.168.52.60 访问esp
没有配置wifi之前,mdns无效,配置好wifi,esp 被分配了 ip 地址
mdns 才有效,才能代替 ip 地址访问
同一个局域网内的其他设备,可以通过 ip 或者 mdns 设置的 hostname 访问 esp
mqtt
零基础入门学用物联网 – MQTT基础篇
2-1 QoS 服务质量等级
接收端连接服务端时cleanSession设置为false
接收端订阅主题时QoS=1
发布端发布消息时QoS=1
esp设置订阅 qos=1 时,mqtt 发送消息
mqtt 端 qos=2,qos=1,qos=0,esp都可以收到
qos esp断电了,重新上电 esp esp是否可以收到断电前发送的的消息
qos=0 否
qos=1 是
qos=2 是
如果esp断电了,重新上电 esp,esp可以收到断电前发送的 qos=1/0 的消息
应用
接收到用户信息,小车没电了,重新上电,之前的操作应该失效
2-3 保留消息
向一个topic发送一个保留消息,只要有设备订阅这个topic,就可以马上收到这个保留消息
设备断电后重新上电,相当于重新订阅了topic,会收到保留消息
应用
设备启动,友好的提示
最新的消息以保留消息的形式发送,设备启动/设备订阅,立即收到最新的消息
保留消息只会收到一条
,多余显示的是 MQTT.fx 的缓存
2-6 MQTT遗嘱
首先在客户端设置遗嘱相关设置,连接服务端
订阅了遗嘱主题的客户端会在客户端意外断线时,收到服务端发布的遗嘱消息。
应用
意外断电,提示消息
设备在线状态发布
2-8 MQTT连接服务器用户密码认证
自己搭建的服务器,不希望任何人都能连接,设置用户名密码
esp在连接时间设置用户名密码才能连接到服务端
应用
自己搭建的服务器,不希望任何人都能连接,设置用户名密码
给不同的用户分配不同的用户名密码,识别不同的客户端和人
用户名为 test-user
,则注意 发布消息 和 订阅消息
的主题都要有前缀 test-user/topic-name
Arduino
附加开发板管理器网址: http://wechat.doit.am/package_esp8266com_index.json 或者 http://arduino.esp8266.com/stable/package_esp8266com_index.json http://arduino.esp8266.com/versions/2.4.1/package_esp8266com_index.json (ok)
想做什么模块就下载什么库,想做超声波模块就搜Arduino超声波类库,下载sr40类库,github Arduino社区
vsocde
vscode 配置 Arduino 环境
vscode 插件 PlatFormIO IDE
PlatformIO入门
vscode 配置 Arduino 环境
platformio 上传文件到文件系统
ESP8266 NodeMCU with VS Code and PlatformIO:上传文件到文件系统(LittleFS)
在项目文件夹中创建一个名为data的文件夹。这可以在 VS Code 上完成。
用鼠标选择您正在处理的项目文件夹。单击“新建文件夹”图标以创建一个新文件夹。
注意
建议先上传HTML再上传代码文件。
因为在ESP上运行的代码需要调用HTML文件中的资源,
如果HTML文件还没有上传,代码会找不到资源,导致无法正常运行。
因此,为了避免这种情况,应该先将HTML上传,再上传代码文件
然后,选择新创建的数据文件夹并通过单击“新建文件”图标创建要上传的文件
上传文件系统映像
注意
必须要在 platformio.ini 中加入
board_build.filesystem = littlefs
否则上传失败
重要提示:要成功上传文件系统映像,您必须关闭
与主板的所有串行连接(串行监视器)。
LittleFS 对比 SPIFFS
ESP32搭建WEB服务器八(使用更有效率的LittleFS文件系统)
vscode 快捷键
主题切换 ctrl+k+t
emqx
基于EMQX从零开始在阿里云ECS搭建MQTT服务器
Linux安装EMQX服务的过程
emqx官网方式
用的emqx是比较新的版本,openssl版本依赖包必须是大于1.1.1版本及以上的
注意cenos 7 安装时选下面的选项。
设置环境变量
[root@xxxx emqx]# vim /etc/profile
#EMQX Enviroment
EMQ_HOME=/root/program/emqx
PATH=$EMQ_HOME/bin:$PATH
CLASSPATH=$EMQ_HOME/lib:$CLASSPATH
export EMQ_HOME PATH CLASSPATH
[root@xxx emqx]# source /etc/profile
官网emqx常见错误
emqx5.x无法启动
emqx4.x卸载后安装emqx5.x无法启动
软件
烧录工具:flash_download_tools_v3.6.8.exe
MQTT客户端软件–MQTTfx
公用mqtt服务器
串口调试助手:AiThinker Serial Tool V1.2.3
Arduino 一键配置 8266 环境:8266_package_3.1.0_arduinome.exe
问题
需要开发工具,库文件,模块,先在群里找
软件问题
一直 Connecting 不过
如果引用了第三方库,即使第三方库中引用了 #include <Arduino.h>
如果 main.cpp 中只引用了第三方库,没有引用 #include <Arduino.h> 可能会导致一直 connect
尝试在 main.cpp 中添加 #include <Arduino.h>
platformIO串口监视器一直改不过来
如果在 platformInfo.ini
中设置了下面代码,重新上电,重新打开串口监视器,监听的波特率还不对,可以尝试重新创建 platformIO 项目,把之前的代码复制过来,重新烧录程序
monitor_speed = 115200
注意区分编码
platformio 添加自定义库
PlatformIO添加库文件方法
添加外部库
①准备好所需要的库文件(不能为压缩包)
② 将文库文件夹放到下面的目录中
C:\Users\{username}\.platformio\packages\framework-arduinoespressif8266\libraries
platformio.ini添加配置后需要保存,否则不生效
platformio.ini添加配置后需要保存,否则不生效
例如下面添加了 PubSubClient.h,如果不保存,代码中的 include 还是会爆红
代码问题
用arduino编译esp8266代码报错No such file or directory
ch340 + esp8266 + arduino 编译和下载程序
选择 nodemcu 12e
而不是 generic 8266
在 platformio 中可以选择 esp01s,或其他基础板
用VScode+PlatformIO玩8266的函数定义顺序
记得函数要放在loop前面,不然编译报错,因为C++的函数必须先声明,后调用
设置vscode代码格式化c++时大括号不换行
1. 文件–首选项–设置,或者左下角齿轮–设置
2. 搜索框搜索format ,点击在扩展c/c++
BUILTIN_LED = LED_BUILTIN = 2
在 esp 8266 中BUILTIN_LED = LED_BUILTIN = 2
设置波特率
monitor_speed = 115200
上面只对当前工程生效,如需修改系统默认波特率,看下面
修改PlatformIO串口监视器的默认波特率
Serial.println()
是先输出括号中内容,再输出空行
Serial.println("ClientId:");
输出
ClientId:
空行
if 和 #if
if 和 #if
头文件定义覆盖
c++引用的头文件中定义了 #define DEFPORT 80,如何覆盖头文件中DEFPORT 的值
在 C++ 中,可以通过下面几种方法覆盖头文件中的宏定义:
定义在头文件之后的宏定义
:如果在头文件之后定义一个新的宏定义
,则该宏定义将覆盖之前定义的宏定义
。
#include <header.h>
#undef DEFPORT
#define DEFPORT 9000
定义在头文件之前的宏定义
:如果在头文件之前定义宏定义,则该宏定义将在整个文件中有效。
#define DEFPORT 9000
#include <header.h>
使用 #undef 宏:您可以使用 #undef 宏在包含头文件之前撤消头文件中的宏定义
。
#undef DEFPORT
#define DEFPORT 9000
#include <header.h>
请注意,选择正确的方法取决于您的需求和代码结构。这些方法仅提供了一种覆盖头文件中的宏定义的可能性。
根据 #define 开启配置
场景
EspWiFiPW.h 引用了 SELFDEF.h
SELFDEF.h中有
#define DEFPORT 30606
EspWiFiPW.h中有
#ifdef DEFAULT
#undef DEFPORT
#define DEFPORT 80
#endif
想要通过 #define DEAULT
更改DEFPORT
注意先要使用 #define,然后再引入EspWiFiPW.h,否则不生效
#define eeshow
#include <EspWiFiPW.h>
WiFi.mode(WIFI_STA) 模式下连接 wifi
注意 while (WiFi.status() != WL_CONNECTED)
内部的 delay(time)
时间不能设置太小,否则WiFi.status
尝试时间太短会导致连不上 wifi
void EspWiFiPW::ConnectBySTA(String ssid, String pwd) {
WiFi.disconnect();
WiFi.mode(WIFI_STA);
WiFi.begin(ssid.c_str(), pwd.c_str());
Serial.println("begin connect WiFi: " + SSID);
int i = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(2500); //这里设置太小 WiFi.status 尝试时间太短会导致连不上
Serial(".");
i++;
if (i > Timeout - 1) {
Serial.println();
Serial.println("wifi connect time out, please retry...");
break;
}
}
if (WiFi.isConnected()) {
Serial.println();
Serial.println("connect suceess, WiFi: " + SSID);
Serial.println("local device IP: " + WiFi.localIP().toString();
}
Serial.println();
}
其它问题
烧录时提示等待上电同步
ESP8266使用MQTT固件,AT指令配网
ch340 + esp 烧录固件和程序
连接
ch340 esp8266
vcc(电源) 3v3
tx(串口发送) rx
rx(串口接收) tx
gnd gnd
烧录固件,arduino下载程序时都需要短接
esp的 gnd 和 Io0
使用 esp8266模块 + 340husb转换器时,esp8266 download tools 烧录固件时需要短接esp的 GND 和 IO0
烧录/下载程序完成后,就可以把短接线去除了
运行程序时不需要短接
短接 -> 复位/重新上电/重插电脑 -> 烧录/下载程序
不关闭串口监视器下载程序可能会下载报错
ESP8266 基础篇:启动时 rst cause 和 boot mode
ESP8266 基础篇:启动时 rst cause 和 boot mode
ESP8266/ESP32启动运行问题汇总(持续更新中…)
ESP8266/ESP32启动运行问题汇总(持续更新中…)