物联网学习资料

《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转串口变成NodMCUesp8266是一类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.60Serial.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=1esp设置订阅 qos=1 时,mqtt 发送消息mqtt 端 qos=2,qos=1,qos=0,esp都可以收到qosesp断电了,重新上电 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 EnviromentEMQ_HOME=/root/program/emqxPATH=$EMQ_HOME/bin:$PATHCLASSPATH=$EMQ_HOME/lib:$CLASSPATHexport 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 
#undef DEFPORT#define DEFPORT 9000

定义在头文件之前的宏定义:如果在头文件之前定义宏定义,则该宏定义将在整个文件中有效。

#define DEFPORT 9000#include 

使用 #undef 宏:您可以使用 #undef 宏在包含头文件之前撤消头文件中的宏定义

#undef DEFPORT#define DEFPORT 9000#include 

请注意,选择正确的方法取决于您的需求和代码结构。这些方法仅提供了一种覆盖头文件中的宏定义的可能性。

根据 #define 开启配置

场景

EspWiFiPW.h 引用了 SELFDEF.hSELFDEF.h中有#define DEFPORT 30606EspWiFiPW.h中有#ifdef DEFAULT#undef DEFPORT#define DEFPORT 80#endif

想要通过 #define DEAULT 更改DEFPORT

注意先要使用 #define,然后再引入EspWiFiPW.h,否则不生效#define eeshow#include 

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 烧录固件和程序

连接ch340esp8266vcc(电源) 3v3tx(串口发送) rxrx(串口接收) txgnd 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启动运行问题汇总(持续更新中…)