VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1422|回复: 5

[已解决]求教!如何利用https协议与设备通信

[复制链接]
89_avatar_middle
最佳答案
0 
在线会员 发表于 2022-9-16 15:58:29 | 显示全部楼层 |阅读模式
约束:需使用 https 协议、json 数据格式、UTF-8编码
请求说明:
http 请求方式:POST
https://168.0.0.253/api/rest/login.do?secret=212a743894a0e4a801fc3
请求参数

属性
类型 约束 说明
secreatstring 必选 API 认证密码
采用 MD5 方式传送
返回:{
"retCode”: “0”,
"accessToken": "12345678",
"expires":
}
属性 类型 约束 说明
retCode string 必选 错误码
accessToken string 必选 令牌
expires string 必选 超时时间


最佳答案
84_avatar_small
2022-9-19 09:42:35
curl 库可以试下




上一篇:灰色按钮激活专家问题
下一篇:找不到stdafx.h
89_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2022-9-20 09:54:13 | 显示全部楼层
我采用的是curl库代码如下:
  1. #include <iostream>
  2. #include <curl/curl.h>
  3. #include <string>
  4. #include <map>

  5. using namespace std;

  6. //回调函数  得到响应内容
  7. int write_data(char* buffer, size_t size, size_t nmemb, void* userp) {
  8.         std::string* str = dynamic_cast<std::string*>((std::string*)userp);
  9.         str->append((char*)buffer, size * nmemb);
  10.         return nmemb;
  11. }

  12. int posts(string url, string& body, string* response);
  13. int get(string url, string* response);
  14. //{
  15. //        "retCode":      "0",
  16. //        "accessToken" : "b768e0faac9d0d04631af690d7d4130c",
  17. //        "expires" : "360"
  18. //}
  19. string ReadFromJson(string jsonString, string findWord)
  20. {
  21.         string returnValue = "";
  22.         if (jsonString.size() == 0||findWord.size()==0)return "";
  23.         int seqStart = jsonString.find(findWord)+findWord.size()+4;
  24.         int len = jsonString.find(""", seqStart)-seqStart;
  25.         if (seqStart<jsonString.size())
  26.         {
  27.                  returnValue = jsonString.substr(seqStart, len);
  28.         }
  29.         return returnValue;
  30. }

  31. int main(int argc, char** argv) {
  32.         std::map<std::string, std::string> data;
  33.         std::string body;

  34.         std::string response;
  35.         //int status_code = get("http://www.baidu.com", &response);
  36.         //if (status_code != CURLcode::CURLE_OK) {
  37.         //        return -1;
  38.         //}
  39.         //cout << response << endl;
  40.         //cout  << endl;
  41.         //cout  << endl;
  42.         //cout  << endl;
  43.         //cout  << endl;
  44.         //cout  << endl;
  45.         //cout  << endl;
  46.         //cout  << endl;
  47.         //cout  << endl;
  48.         //cout <<"                                                                                                              " << endl;

  49.         int status_code = posts("https://192.168.1.180/api/rest/login.do?secret=21232f297a57a5a743894a0e4a801fc3", body, &response);
  50.         if (status_code != CURLcode::CURLE_OK) {
  51.                 return -1;
  52.         }
  53.         cout << response << endl;
  54.         string pass = ReadFromJson(response, "accessToken");
  55.         string banmo_ann_url = "https://192.168.1.180/api/rest/startAnnounce.do?accessToken=" + pass + "&tone=2009&playTimes=1";
  56.         posts(banmo_ann_url, body ,&response);
  57.         cout << response << endl;
  58.         return 0;
  59. }

  60. int get(string url, string* response)
  61. {
  62.         CURL* curl;
  63.         CURLcode ret;
  64.         struct curl_slist* headers = NULL;
  65.         headers = curl_slist_append(headers, "Accept: Agent-007");
  66.         curl = curl_easy_init();    // 初始化

  67.         if (curl)
  68.         {
  69.                 curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);        //改协议头
  70.                 curl_easy_setopt(curl, CURLOPT_URL, (char*)url.c_str());   // 指定url
  71.                 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
  72.                 curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)response);
  73.                 int status_code = curl_easy_perform(curl);   // 执行


  74.                 ret = curl_easy_perform(curl);                          //执行请求
  75.                 if (ret == 0) {
  76.                         curl_slist_free_all(headers);
  77.                         curl_easy_cleanup(curl);
  78.                         return status_code;
  79.                 }
  80.                 else {
  81.                         return ret;
  82.                 }
  83.         }
  84.         else {
  85.                 return -1;
  86.         }
  87. }
  88. //POST 处理x-www-form-urlencoded格式数据 如下
  89. //{id: 'SEA2HHHH',
  90. //  time: '2018-12-27T21:43:41.604Z',
  91. //  image: 'haha' }
  92. //则    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body.c_str());           //指定post内容中
  93. //body内容为:
  94. //id=SEA2HHHH&image='haha&time=2019-01-02+14:22:41

  95. int posts(string url, string& body, string* response)
  96. {
  97.         CURL* curl;
  98.         CURLcode ret;
  99.         curl = curl_easy_init();
  100.         long response_code = 0;
  101.         if (curl)
  102.         {
  103.                 curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body.c_str());           //指定post内容
  104.                 curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, body.size());         //指定post长度
  105.                 curl_easy_setopt(curl, CURLOPT_HEADER, 0);                          //设置协议头
  106.                 // curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
  107.                 curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
  108.                 curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);                                //忽略ssl检查
  109.                 curl_easy_setopt(curl, CURLOPT_URL, (char*)url.c_str());           //指定url
  110.                 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);          //绑定相应
  111.                 curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)response);        //绑定响应内容的地址
  112.                 ret = curl_easy_perform(curl);                          //执行请求
  113.                 if (ret == 0) {
  114.                         curl_easy_cleanup(curl);
  115.                         curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);//获取http 状态码
  116.                         return 0;
  117.                 }
  118.                 else {
  119.                         curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);//获取http 状态码
  120.                         return ret;
  121.                 }
  122.         }
  123.         else {
  124.                 return -1;
  125.         }
  126. }



  127. //***************put for c(180727) 下列code未验证***************//
  128. //put 函数用于上传数据
  129. size_t read_data(char* buffer, size_t size, size_t nitems, void* instream) {
  130.         size_t sizes = fread(buffer, size, nitems, (FILE*)instream);
  131.         return nitems;
  132. }
  133. //put 文件, 即 raw bin 类型数据在node中接受需要使用 res.on('data')方式,在json编码数据可以使用req.body
  134. int put(char* url, FILE* fd, int fsize, char* response)//put 地址,put 文件句柄, 文件大小, 接受响应存储位置
  135. {
  136.         CURL* curl;
  137.         CURLcode ret;
  138.         curl = curl_easy_init();
  139.         struct curl_slist* headers = NULL;
  140.         headers = curl_slist_append(headers, "expect: "); //将值置为空,可以屏蔽该头
  141.         //headers = curl_slist_append(headers, "content-length: ");//put 不能省略这个头content-length
  142.         headers = curl_slist_append(headers, "test: put");//设置put http header头
  143.         // printf("\n%s %d\n", body, fsize);
  144.         if (curl)
  145.         {
  146.                 curl_easy_setopt(curl, CURLOPT_URL, url);//配置url
  147.                 curl_easy_setopt(curl, CURLOPT_UPLOAD, 1);//设置为上传模式 PUT
  148.                 curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);//改协议头
  149.                 curl_easy_setopt(curl, CURLOPT_READFUNCTION, &read_data);//配置上传内容函数处理
  150.                 curl_easy_setopt(curl, CURLOPT_READDATA, fd);//向处理函数传递 文件指针
  151.                 curl_easy_setopt(curl, CURLOPT_INFILE, fd); //定位作为上传的输入文件
  152.                 curl_easy_setopt(curl, CURLOPT_INFILESIZE, fsize);//上传文件字节数
  153.                 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);//用于接受响应回调函数
  154.                 curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)response);//传递接受响应内容的存储地址
  155.                 ret = curl_easy_perform(curl);                          //执行请求
  156.                 if (ret == 0) {
  157.                         curl_easy_cleanup(curl);
  158.                         return 0;
  159.                 }
  160.                 else {
  161.                         return ret;
  162.                 }
  163.         }
  164.         else {
  165.                 return -1;
  166.         }
  167. }

  168. //***************post(180920) 下列code未验证 普通post ****************//
  169. int post(string url, string& body, string* response)
  170. {
  171.         CURL* curl;
  172.         curl = curl_easy_init();

  173.         if (curl)
  174.         {
  175.                 curl_easy_setopt(curl, CURLOPT_POSTFIELDS, (char*)body.c_str());    // 指定post内容
  176.                 curl_easy_setopt(curl, CURLOPT_URL, (char*)url.c_str());   // 指定url
  177.                 curl_easy_perform(curl);
  178.                 curl_easy_cleanup(curl);
  179.         }
  180.         else {
  181.                 // cout << "error" << endl;
  182.         }

  183.         return 0;
  184. }

  185. //***************(180920) 下列code未验证 post body请求参数构造****************//
  186. void makeUrlencodedForm(map<string, string> const& params, string* content)
  187. {
  188.         content->clear();
  189.         map<string, string>::const_iterator it;
  190.         for (it = params.begin(); it != params.end(); it++)
  191.         {
  192.                 char* key = curl_escape(it->first.c_str(), (int)it->first.size());
  193.                 char* value = curl_escape(it->second.c_str(), (int)it->second.size());
  194.                 *content += key;
  195.                 *content += '=';
  196.                 *content += value;
  197.                 *content += '&';
  198.                 curl_free(key);
  199.                 curl_free(value);
  200.         }
  201. }
  202. //***************post中 boy参数得到sample****************//
  203.         //string body;
  204.         // map<string, string> data;
  205.         // data["file"] = "file bin";
  206.         // data["group_id"] = "deviceinfo";
  207.         // makeUrlencodedForm(data, &body);
  208. //************************************************************//
复制代码
59_avatar_middle
最佳答案
0 
在线会员 发表于 2022-9-17 06:57:30 | 显示全部楼层
用OpenSSL-Win32,可以解决
84_avatar_middle
最佳答案
8 
在线会员 发表于 2022-9-19 09:42:35 | 显示全部楼层    本楼为最佳答案   
bestAnswer
curl 库可以试下
85_avatar_middle
最佳答案
1 
在线会员 发表于 2022-9-20 09:52:22 | 显示全部楼层
WinHttp 相关的API了解一下
10_avatar_middle
最佳答案
0 
在线会员 发表于 2023-1-17 22:30:46 | 显示全部楼层
#在这里快速回复#窗口句柄查询工具附带详细注释
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2024-4-21 04:11

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表