注意:本文是建立在自己初学物联网毕设开发的总结之上,只是希望可能能对未来即将进入物联网领域开发的小白做一个简单的概括,大神请绕道 ,我所说的可能与真理会有一丝不同(当然是我才疏学浅的原因),还请包涵。另:本文是自己搭建MQTT服务消息推送系统的,没有使用其他iot的服务 一、Arduino1.1 什么是Arduino哎,明明自己也不是很懂,也刚开始接触,还在这里一本正经的胡说八道,那我就用自己的语言说了,在我的眼里,他就是块单片机,不过就是相对于51单片机、STM32来说要简单好多好多好多,不过可能对于都学过的同学来讲,都是很简单的吧。
二、部署环境2.1 安装Arduino IDE购买好开发板之后,我们首先装个ArduinoIDE吧。 2.2 启动Arduino并安装ESP32开发板环境因为Arduino只是一个编译器,所以你要用什么开发板你就装什么环境就行,因为我买的是NodeMCU-32s,也就是ESP32,那直接装个ESP32环境就行了。 在这里填入: 2.3 学习例程安装了esp32开发板之后,他会给我们自带好多库,需要什么学什么就行。 三、通信协议既然要做的是物联网的东西,那么现在我们可以让开发板联网了,但是通信协议如何选取呢?原生的socket、http协议、MQTT协议,到底用哪个好点呢?
四、安装MQTT服务如果想做简单一点的,可以跳过第四、五步看第六步 4.1 安装MQTT服务器首先我们必须装个支持MQTT协议的消息中间件,我这里用了RabbitMQ作为我的MQTT服务器。RabbitMQ官网:RabbitMQ,稍后几天我会总结一篇使用RabbitMQ的博文。 4.2 给Arduino IDE安装MQTT库我们需要在Arduino安装个MQTT库,让开发板支持MQTT协议,然后直接连接我们的MQTT服务器。这样只要我们在写个MQTT客户端,就可以使用进行收发数据控制硬件了。这里我推荐使用:pubsubclient,使用起来非常简单。github地址:github-pubsubclient。你可以直接从github下载下来,然后拷贝到如下图的目录里,一般来讲,Arduino自定义安装的库都在这个文件夹下边。或者你也可以直接在Arduino找到库管理器 搜索mqtt,找到pubsubclient,直接安装就行了。 4.3 安装MQTT FX既然我们使用了MQTT服务,那么其中为了方便调试,我们安装个MQTT客户端即可。提供MQTT FX 下载地址:MQTTFX下载地址 五、编码测试Arduino端: #include <ESP8266WiFi.h>#include <PubSubClient.h>//要连接的WIFI名称const char* ssid = '........';//要连接的 WIFI密码const char* password = '........';// MQTT服务器地址const char* mqtt_server = 'broker.mqtt-dashboard.com';WiFiClient espClient;PubSubClient client(espClient);long lastMsg = 0;char msg[50];int value = 0;void setup_wifi() { delay(10); Serial.println(); Serial.print('Connecting to '); Serial.println(ssid); WiFi.begin(ssid, password); // 如果在连接中... while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print('.'); } // 产生一个随机种子 因为要生成MQTT 连接时提供ID randomSeed(micros()); Serial.println(''); Serial.println('WiFi connected'); Serial.println('IP address: '); Serial.println(WiFi.localIP());}//当MQTT推送来消息void callback(char* topic, byte* payload, unsigned int length) { Serial.print('Message arrived ['); Serial.print(topic); Serial.print('] '); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); // 如果第一个字节是1,那么关掉灯 if ((char)payload[0] == '1') { digitalWrite(BUILTIN_LED, LOW); } else { digitalWrite(BUILTIN_LED, HIGH); }}void reconnect() { // 等待连接MQTT服务器成功 while (!client.connected()) { Serial.print('Attempting MQTT connection...'); // 创建一个ID String clientId = 'ESP8266Client-'; clientId += String(random(0xffff), HEX); // 连接服务器 if (client.connect(clientId.c_str())) { Serial.println('connected'); // 发布消息 client.publish('outTopic', 'hello world'); // 订阅消息 client.subscribe('inTopic'); } else { Serial.print('failed, rc='); Serial.print(client.state()); Serial.println(' try again in 5 seconds'); // Wait 5 seconds before retrying delay(5000); } }}void setup() { pinMode(BUILTIN_LED, OUTPUT); Serial.begin(115200); setup_wifi(); client.setServer(mqtt_server, 1883); client.setCallback(callback);}void loop() { // 如果断开重新连接 if (!client.connected()) { reconnect(); } client.loop(); long now = millis(); if (now - lastMsg > 2000) { lastMsg = now; ++value; snprintf (msg, 50, 'hello world #%ld', value); Serial.print('Publish message: '); Serial.println(msg); client.publish('outTopic', msg); }}
MQTT 客户端: 5.1.1 读数据设置好之后,直接Connect,因为esp32烧录了如下代码, 5.1.2 写数据由于esp32已经监听了节点‘inTopic’,所以我使用MQTT向节点‘inTopic’发送了一条消息,而单片机的串口端也成功的输出了接收到的信息了。 六、HTTP服务器也可以直接让esp32作为web服务器端,然后访问esp32设备分配的ip地址即可。然后可以通过传入不同的HTTP参数,来控制硬件的状态,如果想要获得穿透内网的能力,即就是实现外网控制,那么我们只要使用内网穿透服务,这样子就实现了基于单片机的远程控制系统的开发入门了。
可以看到,我们 访问如下ip地址就可以控制小灯的状态了,并且网页也输出了相应的文字。以后方便的话我做完了会录个视频总结一下。 七 、总结回望最近一个多月,经历了多少坎坷,虽然知道是很简单的东西,但我就是能遇到各种问题,好像上帝就是专门要考验我一样,从刚开始使用esp-01s 烧录不进去程序的痛苦,我想了很久,到底是哪里有问题呢?到后来的妥协,因为真的没有时间耗了,所以就买了个nodeMCU,真的一下子方便了好多。感谢这些公司为我们提供的这些模块,才能我让我们再做一件东西的时候不再棘手。其实这个只是一个最最简单的入门博文了,如果有朋友能够看完此文,也一定能对物联网有个新的认识,然而我的毕设肯定没有这么简单,做这样,不然老师得瞪死我把。哎…
|
|