利用MQTT协议实现Arduino与onenet测温湿度
一、代码
根据实际情况,对WIFI的名称,密码进行修改,onenet的端口号与IP地址不必修改,设备id,产品id,鉴权信息通过onenet平台获取
#include <WiFi.h>
#include "DHT.h"
#include "PubSubClient.h"
#include "Ticker.h"
#define DHTPIN 21
//`#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHT11);
int god=0;
const int led =15; //灯的接口
const char *ssid = "ABCD"; //wifi名称
const char *password = "12345678";//wifi密码
const char *mqtt_server = "183.230.40.96"; //onenet 的 IP地址
const int port = 6002; //端口号
#define mqtt_devid "960321553" //设备ID
#define mqtt_pubid "529638" //产品ID
//鉴权信息
#define mqtt_password "test12" //鉴权信息
WiFiClient espClient; //创建一个WIFI连接客户端
PubSubClient client(espClient); // 创建一个PubSub客户端, 传入创建的WIFI客户端
char msg_buf[200]; //发送信息缓冲区
char msgJson[75]; //要发送的json格式的数据
unsigned short json_len = 0; //json长度
//信息模板
char dataTemplate[] = "{\"temp\":%.2f,\"humi\":%.2f,\"led\":%d}"; // temp humi要与onenet相对应
Ticker tim1; //定时器,用来循环上传数据void setupWifi(){WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print("正在连接中----\n");}Serial.print("WIFI已连接\n");Serial.print(WiFi.localIP());
}
void setup() {Serial.begin(115200);pinMode(led,OUTPUT);//输出setupWifi(); //调用函数连接WIFISerial.print(F("DHT11 test!"));dht.begin(); client.setServer(mqtt_server, port); //设置客户端连接的服务器,连接Onenet服务器, 使用6002端口client.connect(mqtt_devid, mqtt_pubid, mqtt_password); //客户端连接到指定的产品的指定设备.同时输入鉴权信息if (client.connected()){Serial.print("OneNet is connected!");//判断以下是不是连好了.}//client.setCallback(callback); //设置好客户端收到信息是的回调client.setCallback(callback); //订阅命令下发主题tim1.attach(5, sendTempAndHumi); //定时每5秒调用一次发送数据函数sendTempAndHumi}void loop() {
delay(5000);
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);if (isnan(h) || isnan(t) || isnan(f)) {Serial.println(F("Failed to read from DHT sensor!\n"));return;}//可以让我们通过串口查看数据Serial.print(F("Humidity: ")); Serial.print(h);Serial.print(F("% Temperature: "));Serial.print(t);Serial.print(F("℃ \n "));if (!WiFi.isConnected()) //先看WIFI是否还在连接{setupWifi();}if (!client.connected()) //如果客户端没连接ONENET, 重新连接{clientReconnect();delay(100);}client.loop(); //客户端循环检测}void sendTempAndHumi()
{if (client.connected()){//dht.readHumidity()snprintf(msgJson,75,dataTemplate,dht.readTemperature(),dht.readHumidity(),god); json_len = strlen(msgJson); //msgJson的长度msg_buf[0] = char(0x03); //要发送的数据必须按照ONENET的要求发送, 根据要求,数据第一位是3msg_buf[1] = char(json_len >> 8); //数据第二位是要发送的数据长度的高八位msg_buf[2] = char(json_len & 0xff); //数据第三位是要发送数据的长度的低八位memcpy(msg_buf + 3, msgJson, strlen(msgJson)); //从msg_buf的第四位开始,放入要传的数据msgJsonmsg_buf[3 + strlen(msgJson)] = 0; //添加一个0作为最后一位, 这样要发送的msg_buf准备好了Serial.print("public the data:");Serial.print(msgJson);client.publish("$dp", (uint8_t *)msg_buf, 3+strlen(msgJson));//发送数据到主题delay(500);}
}//收到主题下发的回调, 注意这个回调要实现三个形参 1:topic 主题, 2: payload: 传递过来的信息 3: length: 长度
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();if ((char)payload[0] == '0') {digitalWrite(led, LOW); // god=0;} if ((char)payload[0] == '1') {digitalWrite(led, HIGH); // god=1;}else{}}void clientReconnect()
{while (!client.connected()) //再重连客户端{Serial.print("reconnect MQTT...");if (client.connect(mqtt_devid, mqtt_pubid, mqtt_password)){Serial.print("connected");}else{Serial.print("failed");Serial.print(client.state());Serial.print("try again in 5 sec");delay(5000);}}
}
二、onenet平台
1.登录onenet平台。点击切换至旧版
2.点全部产品,选择多协议接入
3.点击添加产品,产品名称设置是英文,其他可自由选择,但设备接入协议必须选择MQTT
4.添加完产品后,添加设备,设备名称设置是英文,鉴权信息自己设定,(这个是代码中需要的)
5.添加完设备后,点击数据流模板,添加数据流
此处的temp与humi分别表示温湿度的数据流名称
6.设备列表中,点击设备详情 ,可查看设备的相关数据
三、结果
利用MQTT协议实现Arduino与onenet测温湿度相关推荐
- 手机控制的esp8266利用mqtt协议接入百度云智能插座
手机控制的esp8266利用mqtt协议接入百度云智能插座 19年的春节,相信大家和我一样都待在家里,利用在家的时间现学现卖,制作了一款手机控制的智能插座,网上资料很多,我在查询资料中发现,esp82 ...
- 利用MQTT协议与阿里云数据交互的python程序
利用MQTT协议与阿里云数据交互的python程序 设计目的 功能要求和关键问题 环境配置问题 本地程序如何连接云上设备 云上的数据交互问题 界面设计问题 阿里云相关操作 本地程序 设计目的 设计开发 ...
- 在VUE中利用MQTT协议实现即时通讯
前言 建议先阅读: 在Node.js下运用MQTT协议实现即时通讯及离线推送 以前尝试在vue中用上mqtt,了解到mqtt实质上是基于websocket进行数据通信,所以上文中在node下实现的服务 ...
- STM32+果云GA6-GPRS/GSM模块+MQTT+HTTP协议连接中移OneNet上传GPS数据定位
一.环境介绍 MCU: STM32F103C8T6 GSM模块: GA6--果云 开发软件: Keil5 完整源码下载: https://download.csdn.net/download/xi ...
- 一文带你了解 MQTT 协议(连接 ONE-NET平台)
MQTT 协议连接 ONE-NET 详解 写在前面 本文采用 网络调试助手 发送MQTT协议报文(16进制) 连接 ONE-NET 平台,采用的 为 MQTT v3.1.1 标准协议.带你直接 ...
- stm32利用mqtt与小程序通信
stm32利用mqtt与小程序通信 stm32连接服务器端 小程序连接服务器 本项目实现的功能如下:通过stm32连接esp8266,然后利用mqtt协议连接到服务器,同时小程序端也连接到服务器,通过 ...
- (过程超详细)适合新手的ATK-ESP8266+STM32F103系列单片机通过MQTT协议直连阿里云的教程
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.所用到的硬件设备 二.调试步骤 1.固件的烧录 2.创造阿里云的产品 3.代码修改 4.最终的硬件连接及效果图 总 ...
- 微信小程序获取OneNet数据显示温湿度
微信小程序获取OneNet数据显示温湿度 一.OneNet平台 1.我这里的设备是通过MQTT协议连接到OneNet平台的 2.微信小程序获取OneNet数据需要得到产品的api-key.设备 ...
- micropython mqtt_MicroPython使用MQTT协议接入OneNET云平台
MicroPython使用MQTT协议接入OneNET云平台 [复制链接] 本帖最后由 hanyeguxingwo 于 2016-11-22 11:33 编辑 之前使用Arduino+ESP8266使 ...
最新文章
- 【原创 HadoopSpark 动手实践 1】Hadoop2.7.3 安装部署实践
- addr2line命令
- 直播实时转播软件_多群转播神器——转播小助手
- java里包含怎么算_java中怎么判断一个字符串中包含某个字符或字符串
- Eclipse中快速使代码对齐?1张图搞定!
- MySQL的Binlog与Redolog
- 2.Node.js access_token的获取、存储及更新
- Atitit cache缓存之道 attilax 艾提拉总结 1. 使用缓存的目的(使用缓存)	1 1.1. 1、实现目标减少数据库的负担	1 1.2. 加快查询的速度	2 2. 缓存的常见参数 过
- wxWindows入门
- 后缀为.vep文件转换成.mp4文件
- 敏捷培训: 如何使培训产生共鸣?
- python中util是哪个包_使用Python的package机制如何简化utils包设计详解
- MATLA 如何让保存的文件名随着参数的改变而改变
- 2022最新软件测试面试题(含答案)
- vmlinux 反汇编_看vmlinux的符号信息
- 多说最近访客通用代码使用方法
- 如何解决httpclient调用https请求报错
- 谷歌浏览器audio标签自动播放音乐问题解决
- OpenLayers 3自定义地图工具条(一)
- 【爬虫】小说筛选爬取模板