目录

一、搭建环境

1、esp8266NodeMcu(cp2102)驱动安装

2、为esp8266NodeMcu搭建Arduino开发环境

3、安装PubSubClient库

二、编写代码


上一篇文章微信小程序+esp8266NodeMcu(cp2102)+onenet物联平台(一)介绍了onenet平台注册及设备连接,接下来介绍,如何使用Arduino IDE编写代码,控制esp8266,使用MQTT协议与onenet平台进行数据交互。关于MQTT协议,可参考太极创客的教程,非常详细。零基础入门学用物联网 – MQTT基础篇 – 目录 – 太极创客

一、搭建环境

1、esp8266NodeMcu(cp2102)驱动安装

下载地址:CP210x USB 至 UART 桥 VCP 驱动器 - 芯科科技

解压缩后安装驱动,根据自己电脑系统选择安装文件,我安装的是64位驱动。

安装后,使用usb数据线连接8266,然后打开设备管理器,查看端口(我的端口为com5)。

 2、为esp8266NodeMcu搭建Arduino开发环境

Arduino IDE下载地址:国外官网   或者 太极创客百度网盘 请输入提取码0ig4

打开“文件”-“首选项”

在Arduino IDE的“首选项”对话框中找到“附加开发板管理网址”,复制网址:

http://arduino.esp8266.com/stable/package_esp8266com_index.json

然后点击“好”

打开Arduino IDE的“开发板管理器”

安装时间比较长,也可以取消安装,然后去网盘下载: https://pan.baidu.com/s/1b0vs8SG5pCAji7MrsE3Aiw?pwd=ag4s 提取码: ag4s

安装完毕后,在Arduino IDE的开发板菜单中选中“NodeMCU开发板”

设置Arduino IDE的NodeMCU开发板端口

3、安装PubSubClient库

PubSubClient库是一个MQTT库,进行主题的发布与订阅,

打开Arduino,按下图安装,或前往1-6 ESP8266发布MQTT消息 – 太极创客下载。

二、编写代码

15年前学过c语言,不过,早都忘光了,调试过程中废了很大劲,勉强可以用。

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Ticker.h>// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "wifi名称";//wifi名称
const char* password = "wifi密码";//wifi密码
//MQTT连接设置
const char* mqttServer = "mqtts.heclouds.com";//onenet 的 域名
//const char *mqtt_server = "183.230.40.96"; //onenet 的 IP地址
const int mqtt_port = 1883;//onenet 的 端口
#define mqtt_devName "d1"//设备名
#define mqtt_pubid "558037"//产品ID
//鉴权信息,即onenet生成的设备连接token
#define mqtt_authorization "version=2018-10-31&res=products%2F558....."WiFiClient wifiClient;//创建一个WIFI连接客户端
PubSubClient mqttClient(wifiClient);// 创建一个PubSub客户端, 传入创建的WIFI客户端
Ticker tim1; //定时器,用来循环上传数据void setup() {// put your setup code here, to run once:pinMode(LED_BUILTIN, OUTPUT);     // 设置板上LED引脚为输出模式digitalWrite(LED_BUILTIN, HIGH);  // 启动后关闭板上LEDSerial.begin(9600);//设置ESP8266工作模式为无线终端模式WiFi.mode(WIFI_STA);// 连接WiFiconnectWifi();// 设置MQTT服务器和端口号mqttClient.setServer(mqttServer, mqtt_port);// 设置MQTT订阅回调函数mqttClient.setCallback(receiveCallback);// 连接MQTT服务器connectMQTTServer();//定时 每隔10秒发送一次温度数据点tim1.attach(10, sendDpData);
}void loop() {// put your main code here, to run repeatedly:if (mqttClient.connected()) { // 如果开发板成功连接服务器// 保持心跳mqttClient.loop();} else {                  // 如果开发板未能成功连接服务器connectMQTTServer();    // 则尝试连接服务器}
}

连接wifi

// ESP8266连接wifi
void connectWifi() {WiFi.begin(ssid, password);//等待WiFi连接,成功连接后输出成功信息while (WiFi.status() != WL_CONNECTED) {delay(1000);Serial.print(".");}Serial.println("");Serial.println("WiFi Connected!");Serial.println("");
}

连接MQTT服务器

//连接MQTT
void connectMQTTServer() {if (mqttClient.connect(mqtt_devName, mqtt_pubid, mqtt_authorization)) {Serial.println("MQTT Server Connected.");Serial.println("Server Address: ");Serial.println(mqttServer);//订阅主题subscribeTopic();} else {Serial.print("MQTT Server Connect Failed. Client State:");Serial.println(mqttClient.state());delay(3000);}
}

发布数据,向数据流temperatrue发送数据

//发送数据 向主题发送数据流,即设备数据点上传
void sendDpData() {//  payload,需要发送的数据格式//  {//    "id": 123,//    "dp": {//        "temperatrue": [{//            "v": 30,//        }]//    }//  }//将payload转为字符串,传递的参数格式化为浮点数,保留2位小数char dataTemplate[] = "{\"id\":123,\"dp\":{\"temperatrue\":[{\"v\":%.2f,}]}}";//生成1-100的随机数,作为温度值srand((unsigned int)time(NULL));int temp = rand() % 100 + 1;//  Serial.println("随机数");//  Serial.println(temp);//发送信息缓冲区char msgJson[56];//将temp放入dataTemplate,复制给msgJsonsnprintf(msgJson, 56, dataTemplate, (float)temp);//设置发布主题String topicString = "$sys/558037/d1/dp/post/json";char publishTopic[topicString.length() + 1];strcpy(publishTopic, topicString.c_str());//将字符串转为字符数组// 实现ESP8266向主题发布信息if (mqttClient.publish(publishTopic, msgJson)) {Serial.println("发布数据点主题:"); Serial.println(publishTopic);Serial.println("发布信息:"); Serial.println(msgJson);} else {Serial.println("Message Publish Failed.");}
}

订阅用户发送命令主题

//订阅命令主题
void subscribeTopic() {// 建立主题String topicString = "$sys/558037/d1/cmd/request/+";char subTopic[topicString.length() + 1];strcpy(subTopic, topicString.c_str());// 通过串口监视器输出是否成功订阅主题以及订阅的主题名称if (mqttClient.subscribe(subTopic)) {Serial.println("订阅的主题为:");Serial.println(subTopic);} else {Serial.print("Subscribe Fail...");}
}

MQTT订阅回调函数,根据用户发送的命令,执行开关灯,及调节灯的亮度

/*订阅回调函数,参数固定当用户端发送cmd命令后,esp8266进行的回调处理
*/
void receiveCallback(char* topic, byte* payload, unsigned int length) {Serial.print("收到的cmd主题 [");Serial.print(topic);Serial.println("] ");//获取主题topic//$sys/558037/d1/cmd/request/b790bdca-5528-4469-8639-7439046bf39a 中的 cmdid 90977789-5c61-4bb9-9387-ba9a676ff9f5char cmdStr[strlen(topic) - 27];//声明cmdStr,保存cmdidstrcpy(cmdStr, topic + 27);//从topic字符串第27个位置开始向后取值//输出payload内容Serial.print("收到的数据:");char payload_char[length + 1];memset(payload_char, 0, sizeof(payload_char));for (int i = 0; i < length; i++) {Serial.print((char)payload[i]);payload_char[i] = (char)payload[i];}Serial.println();Serial.println("--------------");/*判断收到的命令类型led 开关灯,led:0关灯,led:1开灯bright 调节灯亮度,bright:数字,数字为PWD调节灯的亮度,范围0-1023*/char *dataPtr = NULL;//传递的数据char numBuf[10];int num = 0;dataPtr = strchr((char *)payload_char, ':');//查找冒号if (dataPtr != NULL)         //如果找到了{dataPtr++;//后移一位,指向数据while (*dataPtr >= '0' && *dataPtr <= '9')   //循环取出数据{numBuf[num++] = *dataPtr++;}//numBuf[num] = 0;num = atoi((const char *)numBuf);       //转为数值if (strstr((char *)payload_char, "led"))   //搜索"led"{Serial.println("控制类型led");Serial.print("数值:");Serial.println(num);if (num == 1)               //控制数据如果为1,代表开{digitalWrite(BUILTIN_LED, LOW);  // 则点亮LED。Serial.println("LED ON");}else if (num == 0)            //控制数据如果为0,代表关{digitalWrite(BUILTIN_LED, HIGH); // 否则熄灭LED。Serial.println("LED OFF");}}if (strstr((char *)payload_char, "bright"))   //搜索"bright"{Serial.println("控制类型bright");Serial.print("数值:");Serial.println(num);analogWrite(4, num); //GPIO4接Led灯,pwm输出}}//向服务器返回信息,即已收到命令sendCmdResponse(cmdStr);}

向服务器发送确认信息,通知服务器已收到cmd命令信息。

//接受到cmd命令后,返回的数据信息
void sendCmdResponse(char* cmdStr) {//返回OKchar responseData[] = "ok";//设置主题的模板字符串char topicString[] = "$sys/558037/d1/cmd/response/%s";//计算发布主题publicTopic需要的字符空间,topicString长度 + cmdStr长度int slength = strlen(topicString) + strlen(cmdStr);//定义发布主题char publicTopic[slength];//将topicString和cmdStr进行拼接snprintf(publicTopic, slength, topicString, cmdStr);// 实现ESP8266向主题发布信息if (mqttClient.publish(publicTopic, responseData)) {Serial.println("发布命令回复主题:"); Serial.println(publicTopic);Serial.println("主题信息:"); Serial.println(responseData);} else {Serial.println("Message Publish Failed.");}
}

微信小程序+esp8266NodeMcu(cp2102)+onenet物联平台(二)相关推荐

  1. 微信小程序+esp8266NodeMcu(cp2102)+onenet物联平台(一)

    使用esp8266NodeMcu(cp2102)开发板,连接onenet物联平台,然后使用微信小程序控制esp8266开发板上的led灯,同时在开发板中模拟温度值,小程序通过onenet物联平台,读取 ...

  2. 微信小程序+阿里物联平台+合宙Air724UG搭建无服务器物联系统(三)---微信小程序直连阿里物联平台AliIoT

    前一段时间集中设计系统整体方案,物联网平台搭建.小程序编写,硬件电路设计.SOC单片机程序开发,自己挖的坑太大了,填起来真是费劲啊!整个年假都用来填坑了,也没有时间编写博文,今天忙里偷闲集中整理一下开 ...

  3. 微信小程序开发的app---礼物说APP

    http://bbs.larkapp.com/thread-10801-1-1.html 微信小程序开发的app---礼物说APP 再根目录 80端口 起服务 获取mock数据   本帖隐藏的内容   ...

  4. 微信小程序 阿里云服务器 非物联网平台自建MQTT代理服务器控制树莓派LED

    微信小程序 阿里云服务器 非物联网平台自建MQTT代理服务器控制树莓派LED 本人大三,临近毕业季,日后希望从事物联网和嵌入式相关工作,所以自己构想了一个项目来练手,之前做大创的时候学了一点微信小程序 ...

  5. java微信小程序的校园外卖点餐平台 uniapp

    美食是人类永恒的话题,无论是在古代还是现代人们对美食都有一种非常的热爱在里面,但是随着时代的发展,人们可能没有更多的时间去研究美食,很多时候人们在下班或者放学之后更希望通过网络来进行订餐,为此我开发了 ...

  6. 基于腾讯云开发微信小程序(新闻发布及共享平台)上

    基于腾讯云开发微信小程序(新闻发布及共享平台)上 文章目录 传统的微信小程序开发 一.云开发是什么? 二.使用步骤 1.创建云环境 2.云数据库的创建 3.云储存 4.云函数 总结 传统的小程序开发 ...

  7. 计算机毕业设计Python+uniapp基于微信小程序的校园快递代取平台(小程序+源码+LW)

    计算机毕业设计Python+uniapp基于微信小程序的校园快递代取平台(小程序+源码+LW) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行 环境配置: Pychram社区 ...

  8. 微信小程序多维数组筛选(以二维数组为例)

    微信小程序多维数组筛选(以二维数组为例) 我们在遇到微信小程序进行筛选的时候,一般会使用到filter函数来进行筛选,但是有时候遇到多维数组怎么办呢? //例如这是我们的数组 arr: [{id: 1 ...

  9. 第三方(微信小程序)连接OneNET平台

    前言 一方面是个课设,另一方面项目组有点需求,顺便就把提高部分做了.主要用的微信小程序来作为展示界面以及控制界面,以及使用了OneNET平台连接硬件. 因为硬件部分不是我擅长的,所以这边就直接烧了例程 ...

最新文章

  1. MLPerf Inference 0.7应用
  2. Java学习笔记(43)——Java泛型
  3. 096_JavaScript事件
  4. 点击率预估的几个经典模型简介
  5. 关于Apache虚拟主机的设置
  6. 成功抓取豆瓣读书的所有书籍
  7. fat32 linux 打包工具_11款最棒的Linux数据恢复工具发布啦!
  8. 训练神经网络时如何确定batch size?
  9. Quartz定时调度CronTrigger时间配置格式说明与实例
  10. 查看Ubuntu中的ip地址
  11. python裁剪图片box并保存_python实现图像随机裁剪
  12. oracle 如何查看一个表属于哪一个数据文件,如何查看某一表空间的数据文件都分布了哪些数据对象...
  13. C# 线程手册 第三章 使用线程 Monitor.Wait() 和 Monitor.Pulse()
  14. 本科学经济还是学数学和计算机,如果考研想往经管类方向,学习数学类,还是数学与应用数学, 这两个专业有什么不同...
  15. python实现动态地图_使用Python、Geopandas和Matplotlib制作gif动态地图
  16. nand2tetris 布尔函数和和门逻辑路线图
  17. Android 获取世界时区
  18. 我学习从事项目经理第二个课
  19. chain.doFilter
  20. python读取20万数据Excel文件+拆分数据

热门文章

  1. 数据结构笔记(期末复习,持续更新)
  2. Android 平板、手机: 忘记密码处理及刷机处理技术贴(以三星为例)
  3. 年度考核如何实现排名?
  4. 调试GPRS模块--排查问题过程
  5. 手推车轮 trolley wheel
  6. 网御星云防火墙端口映射配置
  7. js符号输入不可用_js控制文本框禁止输入特殊字符详解
  8. 优课在线C语言作业3,2018春C语言程序设计(苏小红)
  9. 【读过的书】《杠杆阅读术》
  10. 企业微信怎么分享名片给用户?如何统计名片添加好友的效果?