#include <ESP8266WiFi.h> String WEIXIN_TOKEN = "WeixinToken"; // 每次发送消息前从自己服务器上更新 #define PRODUCT_TYPE "gh_e93c1b3098b9" // 设备种类 #define PRODUCT_ID "gh_e93c1b3098b9_dae1c2072212185c" // 设备ID #define host "api.weixin.qq.com" //微信服务器 #define httpPort 80 //端口 #define host_token "www.dongvdong.top" //获取token的服务器 //#define ssid "HUAWEI-H3VBKZ" // WIFI名字 //#define password "13991320168" // WIFI密码 #define ssid "dongdong" #define password "dongdong" void setup() { Serial.begin(115200); delay(10); Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); //works! while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } /* 功能: 1从自己的服务器上txt获取微信token 输入: 无 输出: token */ String RequestWeixinToken(){ Serial.println("/**************************************************/"); Serial.println("1 request token! "); Serial.print("connecting to "); Serial.println(host_token); Serial.println(); WiFiClient client; if (!client.connect(host_token, httpPort)) { //works! Serial.println("connection failed"); return "fail"; } String str = "GET /WexinToken/token.txt "; // GET 请求网页服务器默认文件夹下的文件。 根据实际路径设置 client.print(str); delay(600); String token; if (client.available()) { token = client.readStringUntil(' '); // 读一行 Serial.println(token); //串口打印出来 } client.stop(); Serial.println(); Serial.println("closing connection "); if(token.length()>10){ return token;} else{ return "fail"; } } /* 功能:5 请求设备绑定的用户ID 输入: String UESRID 微信用户ID String CONTENT 要发送的内容 输出: 无 */ String RequestUserId(){ Serial.println("/**************************************************/"); Serial.println("5 request userID! "); Serial.print("connecting to "); Serial.println(host); // Use WiFiClient class to create TCP connections WiFiClient client; if (!client.connect(host, httpPort)) { //works! Serial.println("connection failed"); return "fail"; } // We now create a URI for the request String url = "/device/get_openid"; url += "?access_token="; url += WEIXIN_TOKEN; url += "&device_type="; url += PRODUCT_TYPE; url += "&device_id="; url += PRODUCT_ID; // This will send the request to the server client.print(String("GET ") + url + " HTTP/1.1 " + "Host: " + host + " " + "Connection: close "); delay(600); Serial.println(); //处理返回信息 String line = client.readStringUntil(' '); while (client.available() > 0) { line +=' '; line += client.readStringUntil(' '); } //Serial.println(line); client.stop(); if(line.indexOf("errcode")>0){ Serial.println(line); return "fail"; } if(line.indexOf("open_id")>0){ //{"open_id":["ognVI6JsmBGd7lxYTZY4GH29LcNg","ognVI6GpDeseo6Qe_S7hGPgwlt8E","ognVI6CC8_HsPH5zgydb-PZFmxqU","ognVI6FxhqhGVuGhsZbmDyutgsMQ"],"resp_msg":{"ret_code":0,"error_info":"ok"} int datebegin= line.indexOf("{"); // int dateend=line.length(); int dateend=line.lastIndexOf("}"); String datajson=line.substring(datebegin,dateend); Serial.println(datajson); return datajson; } else{ Serial.println("fail"); return "fail"; } Serial.println(); Serial.println("closing connection "); } /* 功能:5-1 对用户ID组进行解析拆分 输入: String json 用户ID组 "ognVI6JsmBGd7lxYTZY4GH29LcNg","ognVI6GpDeseo6Qe_S7hGPgwlt8E","ognVI6CC8_HsPH5zgydb-PZFmxqU","ognVI6FxhqhGVuGhsZbmDyutgsMQ", String json_ruselt[] 拆分存放的数组 int sizejson 拆分存放的数组大小 默认10 输出: 成功返回1 */ bool RequestUserId_json(String json,String json_ruselt[],int sizejson){ // if(json.length()<1){return 0;} // DynamicJsonDocument jsonBuffer(json.length()); // deserializeJson(jsonBuffer, json); // JsonObject root = jsonBuffer.as<JsonObject>(); // // String ueserid1 = root[String("open_id")][0]; // String ueserid2 = root[String("open_id")][1]; // String ueserid3 = root[String("open_id")][2]; // String ueserid4 = root[String("open_id")][3]; // Serial.println(); // Serial.println(ueserid1); // Serial.println(ueserid2); // Serial.println(ueserid3); // Serial.println(ueserid4); int datebegin= json.indexOf("[")+1; int dateend=json.indexOf("]"); String datajson=json.substring(datebegin,dateend); datajson= datajson+','; // Serial.println(datajson); /* ognVI6JsmBGd7lxYTZY4GH29LcNg dongdong ognVI6GpDeseo6Qe_S7hGPgwlt8E ognVI6CC8_HsPH5zgydb-PZFmxqU ognVI6FxhqhGVuGhsZbmDyutgsMQ */ int i=0; while(datajson.length()>0){ int idbegin=0; int idend=datajson.indexOf(","); String id=datajson.substring(idbegin,idend); id=id.substring(1,id.length()-1); if(i<sizejson){ json_ruselt[i]=id; i++;} // Serial.println(id); datajson=datajson.substring(idend+1,datajson.length()); } return 1; } /* 功能:6 给单独的用户推送消息 输入: String UESRID 微信用户ID String CONTENT 要发送的内容 输出: 无 */ void SendMsgToUser(String UESRID,String CONTENT){ Serial.println("/**************************************************/"); Serial.println("6 send msg to user! "); String data =(String) "{" + " "touser":""+UESRID+""," + " "msgtype":"text"," + ""text" :" + "{ "content":""+CONTENT+"", }" + "}" ; Serial.print("connecting to "); Serial.println(host); // Use WiFiClient class to create TCP connections WiFiClient client; if (!client.connect(host, httpPort)) { //works! Serial.println("connection failed"); return; } // We now create a URI for the request String url = "/cgi-bin/message/custom/send"; url += "?access_token="; url += WEIXIN_TOKEN; int length = data.length(); String postRequest =(String)("POST ") + url + " HTTP/1.1 " + "Content-Type: application/json;charset=utf-8 " + "Host: " + host + ":" + httpPort + " " + "Content-Length: " + length + " " + "Connection: Keep Alive " + +" " +data +" "; // Serial.println(postRequest); client.print(postRequest); delay(600); //处理返回信息 String line = client.readStringUntil(' '); while (client.available() > 0) { line +=' '; line += client.readStringUntil(' '); } Serial.println(line); client.stop(); Serial.println(); Serial.println("closing connection!"); } /* 功能:7 给所有用户用户推送消息 输入: String CONTENT 需要推送的消息内容 输出: 无 执行过程: 1 从自己的服务器txt文件里获取缓存的微信TOKEN 5 请求微信服务器,得到用户ID组 5-1用户ID组解析,逐一存放到数组json_user_id 6给用户逐个发送消息 */ void SendMsgToUserAll(String CONTENT){ WEIXIN_TOKEN= RequestWeixinToken(); //1 从自己的服务器txt文件里获取缓存的微信TOKEN if(WEIXIN_TOKEN=="fail")return; String json_alluser_id= RequestUserId(); // 5 请求微信服务器,得到用户ID组 if(json_alluser_id!="fail"){ String json_user_id[10]; // 5-1用户ID组解析,逐一存放到数组json_user_id RequestUserId_json(json_alluser_id,json_user_id,10); // 5-1用户ID组解析,逐一存放到数组json_user_id for(int i=0;i<10;i++){ if(json_user_id[i]!=""){ Serial.println(json_user_id[i]); // String UESRID="ognVI6JsmBGd7lxYTZY4GH29LcNg"; SendMsgToUser(json_user_id[i],CONTENT);// 6给用户逐个发送消息 } } } } int msgnum=0; void loop() { delay(10000); // 每10S执行一次 if(msgnum<100){ msgnum++;} else { msgnum=0; } String CONTENT=(String)"主人好! 这是来自ESP8266发送的第"+msgnum+"条消息: 电量统计: 98 空气质量: 89 连接地址:<a href=http://www.baidu.com >!"; SendMsgToUserAll(CONTENT); }