• 微信硬件平台(八)7 综合合并版本


     

    #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);
       
    }
    

      

  • 相关阅读:
    奇异值分解 SVD 的数学解释
    [实现] 利用 Seq2Seq 预测句子后续字词 (Pytorch)2
    [实现] 利用 Seq2Seq 预测句子后续字词 (Pytorch)
    pycharm debug后会出现 step over /step into/step into my code /force step into /step out 分别表示
    单步调试 step into/step out/step over 区别
    终端(terminal)、tty、shell、控制台(console)、bash之间的区别与联系
    pytorch: Variable detach 与 detach_
    RNN,LSTM,GRU基本原理的个人理解
    FMDB官方使用文档-GCD的使用-提高性能(翻译)
    CocoaPods一个Objective-C第三方库的管理利器
  • 原文地址:https://www.cnblogs.com/kekeoutlook/p/10468625.html
Copyright © 2020-2023  润新知