基于MQTT+WebSocket的物联网实践

整体概述

本项目基于“物联网技术与应用”课程的学期大作业。

esp8266收集dht11的温湿度数据通过mqtt发布,并订阅web端发送的数据打印到SSD1306的OLED显示屏上,web端通过echarts来显示收到的数据,并可以发布数据给esp8266端。

MQTT服务器搭建

这里使用阿里云服务器,所以要事先购买一个阿里云服务器。

下载EMQ X Broker的安装包到阿里云服务器上。

可以去emq的官网下载对应版本的EMQ X Broker

官网地址:https://www.emqx.io/cn/

这里下载v4.0-rc.3的版本

EMQ X Broker版本

下载好后可以通过Xshell将安装包上传到阿里云(具体的上传过程就不写了,网上有很多教程)

上传成功后可以在阿里云上看到之前下载的安装包

最下面的就是上传的安装包

输入下面的命令来安装emq x

sudo rpm -ivh emqx-centos7-v4.0-rc.3.x86_64.rpm

安装成功后输入以下命令启动

emqx start

启动成功后还没完,还要去安全组打开相应的端口。

去阿里云的安全组打开相应端口,分别为8083、1883、18083这三个端口


安全组

点击配置规则打开安全组规则配置的界面

点击配置规则

添加三个安全组规则,其中端口范围就是上述的三个端口,授权对象可以填你允许或拒绝访问的对象,0.0.0.0/0表示所有对象


添加安全组规则

添加完后再重启服务器,mqtt服务器就搭建好了(当初因为没有重启服务器,测试了好久都不成功)

IoT端实现

我使用的库是simpleDHT11.h、PubSubClient.h和SSD1306Wire.h

int pinDHT11 = 5;//dht11的pin脚

SimpleDHT11 dht11(pinDHT11);

const char* ssid = "******";//wifi账号

const char* password = "*****";//wifi密码

const char* mqtt_server = "*****"; // MQTT服务器

const char* TOPIC = "*****"; // 订阅信息主题

const char* client_id = "*****";  // 标识当前设备的客户端编号

int linePx = 11;//规定打印的行

WiFiClient espClient;  // 定义wifiClient实例

PubSubClient client(espClient);  // 定义PubSubClient的实例

SSD1306Wire display(0x3c, D4, D5);//设置OLED屏相关数据

setup函数

void setup() {

  display.init();初始化OLED屏

  Serial.begin(115200);

  setup_wifi();//连接wifi

  client.setServer(mqtt_server, 1883); //设定MQTT服务器与使用的端口,1883是默认的MQTT端口

  client.setCallback(callback);  //设定回调方式,当ESP8266收到订阅的消息时会调用此方法

}

loop函数

void loop() {

  display.drawString(0, 0, "Broker Message:");

  display.display();

  if (!client.connected()) {

    reconnect();

  }

  client.loop();

  // read without samples.

  byte temperature = 0;

  byte humidity = 0;

  int err = SimpleDHTErrSuccess;

  if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {

    Serial.print("Read DHT11 failed, err=");

    Serial.println(err);

    delay(1000);

    return;

  }//读取DHT11上的温湿度数据

  int temp = (int)temperature;

  int hum = (int)humidity;

  char json[100];

  sprintf(json,"%s%d%s%d%s","{\"temp\":\"",temp,"\",\"hum\":\"",hum,"\"}");//以json的格式发布消息

  Serial.print("Send Message:");

  Serial.print(json);

  Serial.print("\n");

  client.publish("******",json);//以自定义的主题发布消息

  //DHT11 sampling rate is 1HZ

  delay(2000);

}

连接mqtt服务器函数

void reconnect() {

  while (!client.connected()) {

    Serial.print("Attempting MQTT connection...");

    // Attempt to connect

    if (client.connect(client_id)) {

      Serial.println("connected");

      // 连接成功时订阅主题TOPIC

      client.subscribe(TOPIC);

    } else {

      Serial.print("failed, rc=");

      Serial.print(client.state());

      Serial.println(" try again in 5 seconds");

      // Wait 5 seconds before retrying

      delay(5000);

    }

  }

}

回调函数callback

void callback(char* topic, byte* payload, unsigned int length) {

  Serial.print("Message arrived [");

  Serial.print(topic);

  Serial.print("] ");

  String a="";

//接受订阅主题的消息

  for (int i = 0; i < length; i++) {

    a = a+(char)payload[i];

    Serial.print((char)payload[i]);

  }

  Serial.println();

  if(linePx<45){

    display.drawString(0, linePx, a);

    linePx += 11;

  }else{

    display.drawString(0, 50, "Too many Messages");

  }

  Serial.println(linePx);

  display.display();//每打印一行,为了避免后面与前面打印的重叠,需要增加打印所在的行数linePx

  if ((char)payload[0] == '1') {

    digitalWrite(BUILTIN_LED, LOW);  // Turn the LED on (Note that LOW is the voltage level

  } else {

    digitalWrite(BUILTIN_LED, HIGH);  // Turn the LED off by making the voltage HIGH

  }

}

Web端实现

web端采用了websocke和echarts的js文件来实现

echarts的js文件名

echarts.min.js

websocket的js文件名

mqttws31.min.js

其中echarts的js文件可以去官网https://www.echartsjs.com/zh/index.html直接下载

websocket方面代码

连接服务器

client = new Paho.MQTT.Client("服务器地址", Number(8083), "客户端ID");//建立客户端实例

client.connect({onSuccess:onConnect});//连接服务器并注册连接成功处理事件

function onConnect() {

    client.subscribe("******");//订阅主题

}

client.onConnectionLost = onConnectionLost;//注册连接断开处理事件

client.onMessageArrived = onMessageArrived;//注册消息接收处理事件

function onConnectionLost(responseObject) {

    if (responseObject.errorCode !== 0) {

          console.log("onConnectionLost:"+responseObject.errorMessage);

           alert("连接断开");

      }

}


接受并解析json数据

function onMessageArrived(message) {

  var obj = JSON.parse(message.payloadString);//将收到的json消息解析

  humData = obj.hum;

  tempData = obj.temp;//json格式:{"temp":"tempData","hum":"humData"}

}

发布主题消息函数

function SendMessage(){

message = new Paho.MQTT.Message(document.getElementById("sendMessage").value);

message.destinationName = "******"; //发布的主题

client.send(message);

}

关闭websocke连接

function disConnect(){

client.disconnect();

alert("WebSocket连接已关闭!");

}

echarts方面看看官方手册就足够了,需要说明的是,要做到实时刷新的话,新建两个温度湿度的数组,大小自己定,每次有新数据进来时,push后去掉第一个数据即可

Time.push(now);//往时间中添加数据

Temp.push(tempData);//往温度中添加数据

Hum.push(humData);//往湿度中添加数据

if(Time.length>10){

Time.shift();//去掉时间数组中第一个数据

Temp.shift();//去掉温度数组中第一个数据

Hum.shift();//去掉湿度数组中第一个数据

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容

  • 站在站台上,看着她离去的背影,有些什么东西也跟着离去了。 一道栏杆,却仿若将两个人隔到了天涯海...
    梅子青时好入酒阅读 366评论 1 1
  • 柳絮飞雪三月天,红消香断有谁怜? 繁叶风中隐雀鸣,百合雨后清露含。 遍野春色卷画轴,一池碧水羞荷尖。 纵是多情黯自...
    雪夜花开阅读 342评论 0 3
  • 不知道你们有没有玩过聚会时的一些小游戏。比如猜几匹马、猜ABCD是什么和猜开关的游戏。说实话,我第一次玩的时候,是...
    要事者阅读 388评论 0 1
  • 大概也是很长很长时间没有这样的慵懒了,有理由的慵懒。反正就是,一切都可以慢下来,让时间延长十倍的那种感觉。中午一个...
    阿树阿舒阅读 241评论 0 0
  • 今天是《种子发芽实验》的第二节课,我检查孩子们在家做绿豆发芽的实验情况,孩子们实验做的很认真,所以汇报进行...
    宗梅柳叶阅读 168评论 0 7