ESP通过乐为物联控制灯,微信发送数值,ESP上传传感器数据
暂时放个程序
//ME->>{“method”: “update”,“gatewayNo”: “01”,“userkey”: “2b64c489d5f94237bcf2e23151bb7d01”}&^!
//Ser->>{“f”:“message”,“p1”:“ok”}&^!
//ME->>{“method”: “upload”,“data”:[{“Name”:“A1C”,“Value”:“96.2”}]}&^!
//Ser->>{“f”:“message”,“p1”:“ok”}&^!
//Ser->>进入控制设备
//Ser->>{“method”:“send”,“gatewayNo”:“01”,“userkey”:“2b64c489d5f94237bcf2e23151bb7d01”,“f”:“getAllSensors”}&^!
//ME->>{“method”:“response”,“result”:{“successful”:true,“message”:“ok!”,“data”:[{“id”:“A1O”,“value”:“10”},{“id”:“A2O”,“value”:“1”}]}}&^!
//Ser->>点击开关,设定数值
//Ser->>{“method”:“send”,“gatewayNo”:“01”,“userkey”:“2b64c489d5f94237bcf2e23151bb7d01”,“f”:“updateSensor”,“p1”:“A2O”,“p2”:“0”}&^!
//ME->>{“method”:“response”,“result”:{“successful”:true,“message”:“ok!”,“data”:[{“id”:“A1O”,“value”:“10”},{“id”:“A2O”,“value”:“1”}]}}&^!
//或
//ME->>{“method”:“response”,“result”:{“successful”:true,“message”:“Write cmd successful !”}}&^!
#include "Arduino.h"
#include "WiFi.h"const char *ssid = "CMCC-9eUG";const char *password = "apzwqk4u";
// const char *ssid = "X";
// const char *password = "123456789";
//const char *ssid = "HUAWEI P30";
//const char *password = "0000000000";//const IPAddress serverIP(192,168,137,1); //目标地址
//const char *serverIP="17854231380.qicp.vip";
//uint16_t serverPort = 23460; //目标服务器端口号const char *serverIP="tcp.lewei50.com";
uint16_t serverPort = 9960; //目标服务器端口号#define USERKEY "2b64c489d5f94237bcf2e23151bb7d01"
//const char *server_Line="{\"method\": \"update\",\"gatewayNo\": \"01\",\"userkey\": \"2b64c489d5f94237bcf2e23151bb7d01\"}&^!";WiFiClient client; //声明一个客户端对象,用于与服务器进行连接
int A1C_num=0;
int tim1_IRQ_count = 0;
hw_timer_t *tim1 = NULL;
#define LED_PIN 35
#define LED_ON HIGH
#define LED_OFF LOW
#define Botton_PIN 0
#define Botton_ON LOW
#define Botton_OFF HIGHint LED_Sta=LED_OFF;
double A1O_Num=0;
void LED_Set(int Sta)
{if(Sta==0){LED_Sta=0;digitalWrite(LED_PIN,LED_OFF);}else{LED_Sta=1;digitalWrite(LED_PIN,LED_ON);}
}
//上线
String server_Line(String Decive_num)
{String m_String_01="{\"method\": \"update\",\"gatewayNo\": \"";String m_String_02="\",\"userkey\": \"2b64c489d5f94237bcf2e23151bb7d01\"}&^!";String m_String=m_String_01+Decive_num+m_String_02;return m_String;
}
//上传传感器数据
String Data_Upload(String sensor_Num,int sensor_Data)
{char Num[10]={};String sensor_String_01="{\"method\": \"upload\",\"data\":[{\"Name\":\"";String sensor_String_02="\",\"Value\":\"";String sensor_String_03="\"}]}&^!";String sensor_String=sensor_String_01+sensor_Num+sensor_String_02+String(sensor_Data)+sensor_String_03;return sensor_String;
}
String getAllSensors(String Sensors1_Name,int Sensors1_Num,String Sensors2_Name,int Sensors2_Num)
{String String1="{\"method\":\"response\",\"result\":{\"successful\":true,\"message\":\"ok!\",\"data\":[{\"id\":\"";String String2="\",\"value\":\"";String String3="\"},{\"id\":\"";String String4="\",\"value\":\"";String String5="\"}]}}&^!\"";String String_Dis=String1+Sensors1_Name+String2+String(Sensors1_Num)+String3+Sensors2_Name+String4+String(Sensors2_Num)+String5;return String_Dis;
}
String getAllSensors(String Sensors1_Name,double Sensors1_Num,String Sensors2_Name,int Sensors2_Num)
{String String1="{\"method\":\"response\",\"result\":{\"successful\":true,\"message\":\"ok!\",\"data\":[{\"id\":\"";String String2="\",\"value\":\"";String String3="\"},{\"id\":\"";String String4="\",\"value\":\"";String String5="\"}]}}&^!\"";String String_Dis=String1+Sensors1_Name+String2+String(Sensors1_Num)+String3+Sensors2_Name+String4+String(Sensors2_Num)+String5;return String_Dis;
}String Set_CMD(void)
{String Data="{\"method\":\"response\",\"result\":{\"successful\":true,\"message\":\"Write cmd successful !\"}}&^!";return Data;
}
void setup()
{delay(1000);//IO InitpinMode(LED_PIN,OUTPUT);pinMode(Botton_PIN,INPUT); //INPUT_PULLUP上拉输入Serial.begin(115200);//80Mhz时钟 分频为1Mhztim1 = timerBegin(0, 80, true); //初始化定时器 timerBegin num : 定时器编号 divider:分频数 countUp: 是否是累加模式 timerAttachInterrupt(tim1, tim1Interrupt, true); //配置定时器中断 timerAttachInterrupt *timer:目标定时器(计时器结构体指针 hw_timer_t*) void (*fn)(void) : 中断函数入口地址 是否边沿触发//100mstimerAlarmWrite(tim1, 100000, true); //定时器设置timerAlarmWrite *timer:目标定时器 ( 计时器结构体指针 hw_timer_t * ) alarm_value : 计数上限值 autoreload : 是否重装载.timerAlarmEnable(tim1); //使能定时器 timerAlarmEnable Serial.println();WiFi.mode(WIFI_STA); //站点模式WiFi.setSleep(false); //关闭STA模式下wifi休眠,提高响应速度WiFi.begin(ssid, password);Serial.println("wait Wifi");while (WiFi.status() != WL_CONNECTED){delay(2500);Serial.print(".");//WiFi.begin(ssid, password);}Serial.println("connected");Serial.print("location IP:");Serial.println(WiFi.localIP());
}
bool Server_Online,WIFI_Online,Server_T_Online;
int WIFI_Test_Time;
char Server_Sta=0;
int Heart_Time=0;
void loop()
{LED_Set(LED_Sta);if (tim1_IRQ_count > 10){tim1_IRQ_count=0;WIFI_Test_Time++;//检测WIFI连接if(WiFi.status() == WL_CONNECTED){WIFI_Online=true;}else{WIFI_Online=false;Server_Online=false;WiFi.begin(ssid, password);Serial.println("WIFI begin");while (WiFi.status() != WL_CONNECTED){delay(2500);Serial.print(".");Serial.print(WiFi.status());WiFi.begin(ssid, password);}WIFI_Online=true;Serial.println("WiFi connected");Serial.print("location IP:");Serial.println(WiFi.localIP());}//检测服务器连接if(client.connected()){Server_Online=true;Server_Sta=1;//Serial.println("server Online");}else{if(client.connect(serverIP, serverPort)){Server_Online=true;Server_Sta=1;Server_T_Online=true;Serial.println("server connect ok");}else{Server_Online=false;Server_Sta=-1;Serial.println("server connect fail");}}if(Server_Online){Heart_Time++;if(Heart_Time>=23){Heart_Time=0;//Serial.println(Data_Upload("A1C",random()%100));Serial.println("Heart A1C");client.print(Data_Upload("A1C",random()%100));}}}if(Server_Online){if(Server_T_Online){Server_T_Online=false;//Serial.println(server_Line("01"));Serial.println("Link server");client.print(server_Line("01"));Server_Sta=2;}if(client.available()){if (client.available()) //如果有数据可读取{String line = client.readStringUntil('\n'); //读取数据到换行符Serial.print("read>>");Serial.println(line); //服务器返回数据解析if(line.indexOf("\"f\":\"message\",\"p1\":\"ok\"")!=-1) //上线或上传传感器数值{if(Server_Sta==2) //上线成功{Server_Sta=3;//Serial.println(Data_Upload("A1C",random()%100));Serial.println("A1C Data");client.print(Data_Upload("A1C",random()%100));}else{if(Server_Sta==3)//上传传感器数值成功{}else{//Serial.print("\"f\":\"message\",\"p1\":\"ok\" Server_Sta"); Serial.println(Server_Sta);}}} if(line.indexOf("\"method\":\"send\",\"gatewayNo\"")!=-1) //切换到控制器界面或开关指令下发{ if(line.indexOf("\"f\":\"getAllSensors\"")!=-1) //切换到界面{Serial.print("getAllSensors : ");Serial.print("A1O");Serial.print(A1O_Num);Serial.print("A2O");Serial.println(LED_Sta);//Serial.println(getAllSensors("A1O",A1O_Num,"A2O",LED_Sta));client.println(getAllSensors("A1O",A1O_Num,"A2O",LED_Sta));}else{if(line.indexOf("\"f\":\"updateSensor\"")!=-1) //指令下发{Serial.print("updateSensor>>");if(line.indexOf("\"p1\":\"A2O\"")!=-1){line.remove(0,line.indexOf("A2O")); //裁切为 A2O","p2":"1"}&^!line.remove(0,11); //裁切为 1"}&^!line.remove(line.indexOf("\"}&^!"),5);//裁切为 1LED_Set(line.toInt());Serial.print("A2O");Serial.println(LED_Sta);//Serial.println(getAllSensors("A1O",A1O_Num,"A2O",LED_Sta));//client.print(getAllSensors("A1O",A1O_Num,"A2O",LED_Sta));//Serial.println(Set_CMD());client.print(Set_CMD());}else{if(line.indexOf("\"p1\":\"A1O\"")!=-1){Serial.println("A1O");line.remove(0,line.indexOf("A1O")); //裁切为 A1O","p2":"1"}&^!line.remove(0,11); //裁切为 1"}&^!line.remove(line.indexOf("\"}&^!"),5);//裁切为 1A1O_Num=line.toDouble();Serial.print("A1O");Serial.println(A1O_Num);//Serial.println(getAllSensors("A1O",A1O_Num,"A2O",LED_Sta));//client.print(getAllSensors("A1O",A1O_Num,"A2O",LED_Sta));//Serial.println(Set_CMD());client.print(Set_CMD());}else{Serial.println("Unkown");}}}}}line="";}}}}//ME->>{"method": "update","gatewayNo": "01","userkey": "2b64c489d5f94237bcf2e23151bb7d01"}&^!
//Ser->>{"f":"message","p1":"ok"}&^!
//ME->>{"method": "upload","data":[{"Name":"A1C","Value":"96.2"}]}&^!
//Ser->>{"f":"message","p1":"ok"}&^!
//Ser->>进入控制设备
//Ser->>{"method":"send","gatewayNo":"01","userkey":"2b64c489d5f94237bcf2e23151bb7d01","f":"getAllSensors"}&^!
//ME->>{"method":"response","result":{"successful":true,"message":"ok!","data":[{"id":"A1O","value":"10"},{"id":"A2O","value":"1"}]}}&^!
//Ser->>点击开关,设定数值
//Ser->>{"method":"send","gatewayNo":"01","userkey":"2b64c489d5f94237bcf2e23151bb7d01","f":"updateSensor","p1":"A2O","p2":"0"}&^!
//ME->>{"method":"response","result":{"successful":true,"message":"ok!","data":[{"id":"A1O","value":"10"},{"id":"A2O","value":"1"}]}}&^!
//或
//ME->>{"method":"response","result":{"successful":true,"message":"Write cmd successful !"}}&^!/*定时器中断服务函数*/
void tim1Interrupt()
{tim1_IRQ_count++;
}
相关文章:

ESP通过乐为物联控制灯,微信发送数值,ESP上传传感器数据
暂时放个程序 //ME->>{“method”: “update”,“gatewayNo”: “01”,“userkey”: “2b64c489d5f94237bcf2e23151bb7d01”}&^! //Ser->>{“f”:“message”,“p1”:“ok”}&^! //ME->>{“method”: “upload”,“data”:[{“Name”:“A1C”,“Val…...

Linux:共享内存api使用
代码: #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> #include <arpa/inet.h> #include <sys/un.h> #include <sys/ipc.h…...

android9.0 java静态库操作JNI实例 动态注册
一、java层 源码 目录:/Demo/java/com/android/simpleini/SimpleJNI.java package com.example.simplejni;import android.app.Activity; import android.os.Bundle; import android.widget.TextView;public class SimpleJNI {private IpoManagerService(Context …...

自定义复杂图片水印
我的社交能力还不如5岁儿童和狗。 文章目录前言一、主要工具类总结前言 之前写过一些简单的图片压缩和图片加水印:JAVA实现图片质量压缩和加水印 本次主要是针对图片加水印进行一个升级,图片水印自定义,自适应大小。 来,先看几…...

文章读后感——《人间清醒,内容为王》
观后感 人间清醒,内容为王 - 技术er究竟该如何写博客?1024上海嘉年华之敖丙演讲观后感。 致敬愿意带领后生的前辈——哈哥 哈哥,《人间清醒,内容为王》这篇,我的鱼获, 是里面传递出来写技术博客的思维与想法…...

51单片机入门 - 驱动多位数码管
我使用的是普中51单片机开发板A2套件(2022),驱动数码管可能需要参考电路原理图。开发环境的搭建教程在本专栏的 51单片机开发环境搭建 - VS Code 从编写到烧录 有过介绍。 关于我的软硬件环境信息: Windows 10STC89C52RCSDCC &am…...

Java进击框架:Spring(一)
Java进击框架:Spring(一)前言创建Spring项目Spring IoC容器和Beans介绍Bean的概述Spring IoC配置元数据实例化Bean依赖注入循环依赖详细配置生命周期回调Bean定义继承基于注解的容器配置Component和进一步的原型注解自动检测类和注册Bean定义…...

Java笔记(18)
目录 什么是mvc? 什么是SpringMVC Spring MVC的特点: 原理: 什么是Thymeleaf? thymeleaf依赖包:...

【免费教程】地下水环境监测技术规范HJ/T164-2020解读使用教程
地下水环境监测技术规范依据《中华人民共和国环境保护法》第十一条“国务院环境保护行政主管部门建立监测制度、制订监测规范”和《中华人民共和国水污染防治法》的要求,积极开展地下水环境监测,掌握地下水环境质量,保护地下水水质࿰…...

Html 代码学习
场景:在页面中插入音频 代码 常见属性: src 音频的路径 controls 显示播放的控件 autoplay 自动播放 loop 循环播放 场景:在页面中插入视频 代码 常见属性: src 路径 controls 显示播放的控件 autoplay 自动播放 要配合muted 例如 autoplay muted loop 循环播放 链接 /…...

如何通过IP找到地址?
在我们印象中,我们都知道可以通过 IP 地址找到某个人。但当我们细想一下,我们会发现其实 IP 地址与地理位置并不是直接相关的。那我们到底是如何通过 IP 地址找到地址的呢?答案是:通过自治系统(Autonomous System&…...

业务单据堆积如山?如何提升会计做账效率?
某集团以“创建现代能源体系、提高人民生活品质”为使命,形成了贯通下游分销、中游贸易储运、上游生产的清洁能源产业链和涵盖健康、文化、旅游、置业的生命健康产品链。目前,某集团在全国21个省,为超过2681万个家庭用户、21万家企业提供能源…...

华为OD机试题,用 Java 解【VLAN 资源池】问题
最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…...

面试加分项:JVM 锁优化和逃逸分析详解
1 锁优化JVM 在加锁的过程中,会采用自旋、自适应、锁消除、锁粗化等优化手段来提升代码执行效率。1.1 自旋锁和自适应自旋现在大多的处理器都是多核处理器 ,如果在多核心处理器,有让两个或者以上的线程并行执行,我们可以让一个等待…...

C++继承、构造函数和析构函数
构造函数 与 析构函数 构造函数代表一个对象的生成,主要作用是初始化类的成员变量,可以被重载 如果没有显式构造函数,则实例化对象时,系统会自动生成一个无参的构造函数 构造函数的名称与类名相同 析构函数代表的是一个对象的销…...

Python如何实现异步并发之async(1)
前言 本文是该专栏的第14篇,后面会持续分享python的各种干货知识,值得关注。 在python中使用async方式,实现异步并发,而本文笔者提到的代码案例仅支持python3.7及以上版本,这主要在于不同的版本之间都更新了异步的使用方法,这点暂时不详述了。 而所谓的异步,通常就是程…...

震撼!阿里首次开源 Java 10万字题库,Github仅一天星标就超60K
程序员面试 现在是程序员找工作、跳槽最重要的月份。随着行业的发展程序员面试也越来越难,面试中都是7分的能力,再加上3分的技巧; 对于应聘者,重中之重的就是简历,面试前一定要将最拿手和最能吸引面试官的技能在简历…...

十三、RESTful API
RESTful API 什么是RESTful REST一词,是Roy Thomas Fielding在他2000年的博士论文中提出的。 Fielding是一个非常重要的人,他是HTTP协议(1.0版和1.1版)的主要设计者、Apache服务器软件的作者之一、Apache基金会的第一任主席。所…...

路由器防火墙配置(14)
实验目的 通过本实验,理解路由器的防火墙工作原理,掌握路由器的防火墙功能配置方法,主要包括网络地址转换功能和数据包过滤功能的配置。 培养根据具体环境与实际需求进行网络地址转换及数据包过滤的能力。 预备知识网络地址转换 网络地址转…...

灰狼算法优化VMD对时序信号分析python
VMD算法变分模态分解(VMD)算法是一种根据变分方程计算,将信号分析过程转换成求解变分方程的过程,具体分析过程可见前面写的另外一篇博客VMD,这里不多介绍。 VMD算法在进行信号分析时,将一段时序信号分解成不同频段的几个子信号,但其分解效果的好坏由其两个参数影响较大—…...

微服务架构中的多级缓存设计还有人不懂?
今天我们来聊聊缓存这个话题,看看在微服务环境下如何设计有效的多级缓存架构。主要涉及三方面内容: Web 应用的客户端缓存;应用层静态资源缓存;服务层多级缓存。 首先,咱们先讲解微服务架构的多级缓存设计。 微服务…...

【图神经网络 医学/药物/目标/分子/(结构/相互作用)预测】用于药物-目标相互作用预测的元集合(Metapath)异构图神经网络(MHGNN)
May the immensity of the universe, guide us to meet again. 我个人觉得这篇Paper很好。哈哈! 本次学习的Paper于2023年1月15日索引于 Web of Science,是比较新的。 作者:中国天津,南开大学计算机科学学院。 本篇Paper的研究方向(类别/分类):生物化学 & 分子生物学…...

《Java核心技术》笔记——第六章
文章目录CH6.接口、lambda表达式与内部类1.接口基本2.常用接口3.lambda表达式4.内部类5.服务加载器与代理前章: 第三章~第五章的学习笔记CH6.接口、lambda表达式与内部类 1.接口基本 接口基本——interface声明,方法无需指明public(默认都是…...

假设检验的基本思想
假设检验 首先了解参数估计,比如有服从正态分布的数据集X∼N(μ,σ2)X\sim N(\mu,\sigma^{2})X∼N(μ,σ2),我们希望根据样本x1,...xnx_{1},...x_{n}x1,...xn估计出参数μ,σ\mu,\sigmaμ,σ,这些参数可以是一个具体值,也可以…...

c语言机试练习
1.打印日期 给出年分m和一年中的第n天,算出第n天是几月几号。 输入描述: 输入包括两个整数y(1<y<3000),n(1<n<366)。 输出描述: 可能有多组测试数据,对于每组数据, 按 yyyy-mm-dd的格式将输入中…...

Python的PyQt框架的使用-资源文件夹的使用
Python的PyQt框架的使用-资源文件夹的使用一、前言二、Qt Designer加载资源文件三、资源文件的转换一、前言 个人主页: ζ小菜鸡大家好我是ζ小菜鸡,小伙伴们,让我们一起来学习Python的PyQt框架的使用。如果文章对你有帮助、欢迎关注、点赞、收藏(一键三…...

如何遍历HashMap
文章目录1.Iterator EntrySet2.Iterator keySet3.forEach EntrySet4.forEach keySet5.lambda6.Streams API单线程7.Streams API 多线程1.Iterator EntrySet Iterator<Map.Entry<Integer,String>> iteratormap.entrySet().iterator; while(iterator.hasNext()){Map…...

11技术太卷我学APEX-数据加载
11技术太卷我学APEX-数据加载 0 所谓的数据加载 就是导入数据到数据库表中,本示例就采用Excel导入数据到《技术太卷我学APEX》的apex_learn表。表结构大概是这样的 CREATE TABLE "APEX_LEARN" ( "P_ID" NUMBER(17,0) NOT NULL ENABLE, &quo…...

JVM记录
一、JVM体系结构: 类装载器ClassLoader:用来装载.class文件执行引擎:执行字节码,或者执行本地方法运行时数据区:方法区、堆、Java栈、程序计数器、本地方法栈1、方法区: 也称“永久代”,“非堆”…...

盘点机器学习实战中最频繁使用的AutoML工具库
在日常的Kaggle比赛和工作中,经常会遇到AutoML工具。本文总结了常见的AutoML库,可供大家选择。 LightAutoML 项目链接:https://github.com/sberbank-ai-lab/LightAutoML 推荐指数:⭐⭐⭐ LightAutoML是基于Python环境下的结构…...