(转)利用libcurl和国内著名的两个物联网云端通讯的例程, ubuntu和openwrt下调试成功(四)
1. libcurl 的参考文档如下
CURLOPT_HEADERFUNCTION
Pass a pointer to a function that matches the following prototype: size_t function( void *ptr, size_t size, size_t nmemb, void *userdata);. This function gets called by libcurl as soon as it has received header data. The header callback will be called once for each header and only complete header lines are passed on to the callback. Parsing headers is very easy using this. The size of the data pointed to by ptr is sizemultiplied with nmemb. Do not assume that the header line is zero terminated! The pointer named userdata is the one you set with the CURLOPT_WRITEHEADER option. The callback function must return the number of bytes actually taken care of. If that amount differs from the amount passed to your function, it'll signal an error to the library. This will abort the transfer and return CURL_WRITE_ERROR.
A complete HTTP header that is passed to this function can be up to CURL_MAX_HTTP_HEADER (100K) bytes.
If this option is not set, or if it is set to NULL, but CURLOPT_HEADERDATA (CURLOPT_WRITEHEADER) is set to anything but NULL, the function used to accept response data will be used instead. That is, it will be the function specified with CURLOPT_WRITEFUNCTION, or if it is not specified or NULL - the default, stream-writing function.
It's important to note that the callback will be invoked for the headers of all responses received after initiating a request and not just the final response. This includes all responses which occur during authentication negotiation. If you need to operate on only the headers from the final response, you will need to collect headers in the callback yourself and use HTTP status lines, for example, to delimit response boundaries.
When a server sends a chunked encoded transfer, it may contain a trailer. That trailer is identical to a HTTP header and if such a trailer is received it is passed to the application using this callback as well. There are several ways to detect it being a trailer and not an ordinary header: 1) it comes after the response-body. 2) it comes after the final header line (CR LF) 3) a Trailer: header among the regular response-headers mention what header(s) to expect in the trailer.
For non-HTTP protocols like FTP, POP3, IMAP and SMTP this function will get called with the server responses to the commands that libcurl sends.
CURLOPT_WRITEHEADER
(This option is also known as CURLOPT_HEADERDATA) Pass a pointer to be used to write the header part of the received data to. If you don't use CURLOPT_WRITEFUNCTION or CURLOPT_HEADERFUNCTIONto take care of the writing, this must be a valid FILE * as the internal default will then be a plain fwrite(). See also the CURLOPT_HEADERFUNCTION option above on how to set a custom get-all-headers callback.
2. 完整code如下
点击(此处)折叠或打开
- /*------------------------------------------------------------------------------------------
- 名称: http_cloud_curl_callbak.c
- 利用libcurl的API的回调机制实现云端通讯. http://curl.haxx.se/libcurl/c/curl_easy_setopt.html
- CURLOPT_HEADERFUNCTION, CURLOPT_HEADERDATA: 只处理HTTP头部数据,处理与下载数据回调的处理相同.
- sina的股票接口因为无HTTP头部返回因此不能应用此.
- -------------------------------------------------------------------------------------------*/
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <curl/curl.h>
- #include <assert.h>
- #include "../http_cloud.h"
- #define CURL_HEADER (1) //0=利用 CURLOPT_WRITEFUNCTION, 1=利用 CURLOPT_HEADERFUNCTION
- #define DBG printf
- #define CURL_DBG (0) //1=开启curl的调试
- //-----------------------------------------------------------------------------------------
- static void get_local_time(char *pc_str)
- {
- time_t now;
- struct tm *timenow;
- assert(pc_str != NULL);
- time(&now);
- timenow = localtime(&now);
- sprintf(pc_str, "%04d-%02d-%02dT%02d:%02d:%02d", timenow->tm_year+1900, timenow->tm_mon+1, timenow->tm_mday,
- timenow->tm_hour, timenow->tm_min, timenow->tm_sec);
- }
- size_t callback_get_head(void *ptr, size_t size, size_t nmemb, void *userp)
- {
- DBG("ptr = %s, userp = %s\n", ptr, userp);
- strcat(userp, ptr);
- return size * nmemb; //必须返回这个大小, 否则只回调一次
- }
- static char connect_cloud(char *pc_ret, const char *host_addr, const int portno,
- const char *pc_method, struct curl_slist *http_headers)
- {
- CURL *curl;
- CURLcode res = CURLE_GOT_NOTHING;
- assert((pc_ret != NULL) && (host_addr != NULL) && (http_headers != NULL) && (pc_method != NULL));
- //curl_global_init(CURL_GLOBAL_DEFAULT);
- curl = curl_easy_init();
- if (!curl) {
- fprintf(stderr, "--- curl init Error!\n");
- return 0;
- }
- curl_easy_setopt(curl, CURLOPT_URL, host_addr);
- curl_easy_setopt(curl, CURL_HTTP_VERSION_1_1, 1L); //HTTP 1.1
- curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3); //设置超时, 单位为秒
- //curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); //屏蔽其它信号, makes libcurl NOT ask the system to ignore SIGPIPE signals
- #if (CURL_DBG == 1)
- curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); //调试用: 显示交互明细,
- //curl_easy_setopt(curl, CURLOPT_HEADER, 1L); //调试用: 只显示头行的返回
- #endif
- #if 1
- curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, pc_method);
- #if (CURL_HEADER == 0)
- curl_easy_setopt(curl, CURLOPT_HEADER, 1); //下载数据包括HTTP头部, The default value for this parameter is 0.
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback_get_head); //下载数据的回调函数
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, pc_ret); //下载数据的指针
- #else
- curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, callback_get_head); //头部数据的回调函数
- curl_easy_setopt(curl, CURLOPT_HEADERDATA, pc_ret); //头部数据的指针
- #endif
- curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_headers); //多行的HTTP头部
- #endif
- res = curl_easy_perform(curl);
- if(res != CURLE_OK)
- fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
- curl_easy_cleanup(curl);
- return 1;
- }
- #if (YEELINK == 1)
- int yeelink_create_data(const int device_id, const int sensor_id, const float device_value)
- {
- char pc_ret[500], request[1024], pc_json[100], pc_time[30], pc_host_file[100], pc_header[100], pc_url[200], ret;
- int len;
- sprintf(pc_host_file, "v1.0/device/%d/sensor/%d/datapoints", device_id, sensor_id);
- sprintf(pc_header, "U-ApiKey: %s", YEELINK_API_KEY);
- get_local_time(pc_time);
- sprintf(pc_json, "{\"timestamp\":\"%s\",\"value\":%.2f}", pc_time, device_value);
- len = strlen(pc_json);
- //sprintf(request, "POST /%s HTTP/1.1\r\nHost: %s\r\nAccept: */*\r\n%s\r\nContent-Length: %d\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: Close\r\n\r\n%s\r\n",
- // pc_host_file, YEELINK_HOST, pc_header, len, pc_json);
- //DBG("request = %s\n", request);
- //组织请求头部, 自动末尾添加'\r\n'
- struct curl_slist *http_headers = NULL;
- //sprintf(request, "POST /%s HTTP/1.1", pc_host_file);
- //http_headers = curl_slist_append(http_headers, request); //此部分在url中体现
- sprintf(request, "Host: %s", YEELINK_HOST);
- http_headers = curl_slist_append(http_headers, request);
- sprintf(request, "%s", pc_header);
- http_headers = curl_slist_append(http_headers, request);
- sprintf(request, "%s", "Accept: */*");
- http_headers = curl_slist_append(http_headers, request);
- sprintf(request, "Content-Length: %d", len);
- http_headers = curl_slist_append(http_headers, request);
- sprintf(request, "%s", "Content-Type: application/x-www-form-urlencoded");
- http_headers = curl_slist_append(http_headers, request);
- sprintf(request, "%s", "Connection: Close");
- http_headers = curl_slist_append(http_headers, request);
- sprintf(request, "\r\n%s", pc_json);
- http_headers = curl_slist_append(http_headers, request);
- #if 0
- struct curl_slist *tmp = http_headers;
- printf("HTTP request = ");
- while(tmp) {
- printf("%s\n", tmp->data);
- tmp = tmp->next;
- }
- #endif
- //发送请求, 再判断返回值
- //url = api.yeelink.net/v1.0/device/391/sensor/497/datapoints
- sprintf(pc_url, "%s/%s", YEELINK_HOST, pc_host_file);
- ret = connect_cloud(pc_ret, pc_url, YEELINK_PORT, HTTP_POST, http_headers);
- //释放 http_headers资源
- curl_slist_free_all(http_headers);
- DBG("yeelini ret = %s\n", pc_ret);
- return(ret);
- }
- #endif
- #if (LEWEI50 == 1)
- //curl --request POST http://www.lewei50.com/api/V1/Gateway/UpdateSensors/01 --data "[{\"Name\":\"T1\",\"Value\":\"23.08\"}]" --header "userkey:36be8ff22f794f1e8a0bee3336eef237"
- int lewei50_create_data(const char *device_id, const float device_value)
- {
- char pc_ret[500], request[1024], pc_json[100], pc_header[100], pc_url[200], *pc_data, ret;
- int len;
- assert(device_id != NULL);
- sprintf(pc_header, "userkey: %s", LEWEI50_USER_KEY);
- sprintf(pc_json, "[{\"Name\":\"%s\",\"Value\":\"%.2f\"}]", device_id, device_value);
- len = strlen(pc_json);
- //sprintf(request, "POST /%s HTTP/1.1\r\nHost: %s\r\nAccept: */*\r\n%s\r\nContent-Length: %d\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: Close\r\n\r\n%s\r\n",
- // LEWEI50_HOST_FILE, LEWEI50_HOST, pc_header, len, pc_json);
- //DBG("request = %s\n", request);
- //组织请求头部, 自动末尾添加'\r\n'
- struct curl_slist *http_headers = NULL;
- //sprintf(request, "POST /%s HTTP/1.1", pc_host_file);
- //http_headers = curl_slist_append(http_headers, request); //此部分在url中体现
- sprintf(request, "Host: %s", LEWEI50_HOST);
- http_headers = curl_slist_append(http_headers, request);
- sprintf(request, "%s", pc_header);
- http_headers = curl_slist_append(http_headers, request);
- sprintf(request, "%s", "Accept: */*");
- http_headers = curl_slist_append(http_headers, request);
- sprintf(request, "Content-Length: %d", len);
- http_headers = curl_slist_append(http_headers, request);
- sprintf(request, "%s", "Content-Type: application/x-www-form-urlencoded");
- http_headers = curl_slist_append(http_headers, request);
- sprintf(request, "%s", "Connection: Close");
- http_headers = curl_slist_append(http_headers, request);
- sprintf(request, "\r\n%s", pc_json);
- http_headers = curl_slist_append(http_headers, request);
- //发送请求, 再判断返回值
- //url = www.lewei50.com/api/V1/gateway/UpdateSensors/01
- sprintf(pc_url, "%s/%s", LEWEI50_HOST, LEWEI50_HOST_FILE);
- ret = connect_cloud(pc_ret, pc_url, LEWEI50_PORT, HTTP_POST, http_headers);
- //释放 http_headers资源
- curl_slist_free_all(http_headers);
- //{"Successful":true,"Message":"Successful. "}, 模式不同此返回数据的位置也不同.
- DBG("lewei50 ret = %s\n", pc_ret);
- ret = 0;
- pc_data = strstr(pc_ret, HTTP_RET_OK);
- if (pc_data) {
- pc_data += strlen(HTTP_RET_OK);
- //只返回最后的 json数据
- pc_data = strstr(pc_data, "\r\n\r\n");
- if (pc_data) {
- pc_data += 4;
- ret = 1;
- DBG("lewei50 data = %s\n", pc_data);
- }
- }
- return(ret);
- }
- #endif
- //-------------------------------------------------------------------
- int main(void)
- {
- float f_value = 15.02;
- int i_tmp;
- time_t t;
- srand((unsigned)time(&t)); //初始化随机种子, 否则随机数不随机
- i_tmp = rand();
- i_tmp -= (i_tmp >> 4 << 4);
- f_value += i_tmp;
- #if (YEELINK == 1)
- yeelink_create_data(YEELINK_DEVICE_ID, YEELINK_SENSOR_ID, f_value);
- #endif
- #if (LEWEI50 == 1)
- lewei50_create_data(LEWEI50_DEVICE_ID, f_value);
- #endif
- return 1;
- }
3. Makefile如下
点击(此处)折叠或打开
- OPENWRT = 1
- ifeq ($(OPENWRT), 1)
- CC = ~/OpenWrt-SDK-ar71xx-for-linux-i486-gcc-4.6-linaro_uClibc-0.9.33.2/staging_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-gcc
- CFLAGS += -I ~/openwrt-lib/include -L ~/openwrt-lib/lib
- LFLAGS += -lcurl -lcrypto -lz -lssl
- else
- CC = gcc
- LFLAGS += -lcurl
- endif
- CFLAGS += -Wall -O2
- #CFLAGS += -g
- #可执行文件名和相关的obj文件
- APP_BINARY = http_cloud
- SRCS += http_cloud_curl_callback.c
- OBJS = $(SRCS:.c=.o)
- all: APP_FILE
- APP_FILE: $(OBJS)
- $(CC) $(CFLAGS) $(OBJS) -o $(APP_BINARY) $(LFLAGS)
- .PHONY: clean
- clean:
- @echo "cleanning project"
- $(RM) *.a $(OBJS) *~ *.so *.lo $(APP_BINARY)
- @echo "clean completed"
4. 运行结果如下
xxg@xxg-desktop:~/1-wire/http_cloud/libcurl$ ./http_cloud
ptr = HTTP/1.1 200 OK
, userp =
ptr = Server: nginx/1.1.19
, userp = HTTP/1.1 200 OK
ptr = Date: Mon, 25 Nov 2013 01:29:37 GMT
, userp = HTTP/1.1 200 OK
Server: nginx/1.1.19
ptr = Content-Type: text/html
, userp = HTTP/1.1 200 OK
Server: nginx/1.1.19
Date: Mon, 25 Nov 2013 01:29:37 GMT
ptr = Transfer-Encoding: chunked
, userp = HTTP/1.1 200 OK
Server: nginx/1.1.19
Date: Mon, 25 Nov 2013 01:29:37 GMT
Content-Type: text/html
ptr = Connection: close
, userp = HTTP/1.1 200 OK
Server: nginx/1.1.19
Date: Mon, 25 Nov 2013 01:29:37 GMT
Content-Type: text/html
Transfer-Encoding: chunked
ptr = X-Powered-By: PHP/5.3.10-1ubuntu3.6
, userp = HTTP/1.1 200 OK
Server: nginx/1.1.19
Date: Mon, 25 Nov 2013 01:29:37 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
ptr = Set-Cookie: CAKEPHP=kgqv6b4rnbbtn1h1ndda514936; expires=Tue, 03-Dec-2013 09:29:37 GMT; path=/
, userp = HTTP/1.1 200 OK
Server: nginx/1.1.19
Date: Mon, 25 Nov 2013 01:29:37 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
X-Powered-By: PHP/5.3.10-1ubuntu3.6
ptr = P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
, userp = HTTP/1.1 200 OK
Server: nginx/1.1.19
Date: Mon, 25 Nov 2013 01:29:37 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
X-Powered-By: PHP/5.3.10-1ubuntu3.6
Set-Cookie: CAKEPHP=kgqv6b4rnbbtn1h1ndda514936; expires=Tue, 03-Dec-2013 09:29:37 GMT; path=/
ptr =
, userp = HTTP/1.1 200 OK
Server: nginx/1.1.19
Date: Mon, 25 Nov 2013 01:29:37 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
X-Powered-By: PHP/5.3.10-1ubuntu3.6
Set-Cookie: CAKEPHP=kgqv6b4rnbbtn1h1ndda514936; expires=Tue, 03-Dec-2013 09:29:37 GMT; path=/
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
yeelini ret = HTTP/1.1 200 OK
Server: nginx/1.1.19
Date: Mon, 25 Nov 2013 01:29:37 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
X-Powered-By: PHP/5.3.10-1ubuntu3.6
Set-Cookie: CAKEPHP=kgqv6b4rnbbtn1h1ndda514936; expires=Tue, 03-Dec-2013 09:29:37 GMT; path=/
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
ptr = HTTP/1.1 200 OK
, userp = onnection: close
X-Powered-By: PHP/5.3.10-1ubuntu3.6
Set-Cookie: CAKEPHP=kgqv6b4rnbbtn1h1ndda514936; expires=Tue, 03-Dec-2013 09:29:37 GMT; path=/
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
ptr = Date: Mon, 25 Nov 2013 01:29:37 GMT
, userp = onnection: close
X-Powered-By: PHP/5.3.10-1ubuntu3.6
Set-Cookie: CAKEPHP=kgqv6b4rnbbtn1h1ndda514936; expires=Tue, 03-Dec-2013 09:29:37 GMT; path=/
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
HTTP/1.1 200 OK
ptr = Content-Type: application/json; charset=utf-8
, userp = onnection: close
X-Powered-By: PHP/5.3.10-1ubuntu3.6
Set-Cookie: CAKEPHP=kgqv6b4rnbbtn1h1ndda514936; expires=Tue, 03-Dec-2013 09:29:37 GMT; path=/
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
HTTP/1.1 200 OK
Date: Mon, 25 Nov 2013 01:29:37 GMT
ptr = Content-Length: 44
, userp = onnection: close
X-Powered-By: PHP/5.3.10-1ubuntu3.6
Set-Cookie: CAKEPHP=kgqv6b4rnbbtn1h1ndda514936; expires=Tue, 03-Dec-2013 09:29:37 GMT; path=/
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
HTTP/1.1 200 OK
Date: Mon, 25 Nov 2013 01:29:37 GMT
Content-Type: application/json; charset=utf-8
ptr = Connection: close
, userp = onnection: close
X-Powered-By: PHP/5.3.10-1ubuntu3.6
Set-Cookie: CAKEPHP=kgqv6b4rnbbtn1h1ndda514936; expires=Tue, 03-Dec-2013 09:29:37 GMT; path=/
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
HTTP/1.1 200 OK
Date: Mon, 25 Nov 2013 01:29:37 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 44
ptr = Cache-Control: private
, userp = onnection: close
X-Powered-By: PHP/5.3.10-1ubuntu3.6
Set-Cookie: CAKEPHP=kgqv6b4rnbbtn1h1ndda514936; expires=Tue, 03-Dec-2013 09:29:37 GMT; path=/
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
HTTP/1.1 200 OK
Date: Mon, 25 Nov 2013 01:29:37 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 44
Connection: close
ptr = Set-Cookie: SERVERID=a4a5b2bbca16d8c8b2ba6d5b6e55f36e|1385342977|1385342977;Path=/
, userp = onnection: close
X-Powered-By: PHP/5.3.10-1ubuntu3.6
Set-Cookie: CAKEPHP=kgqv6b4rnbbtn1h1ndda514936; expires=Tue, 03-Dec-2013 09:29:37 GMT; path=/
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
HTTP/1.1 200 OK
Date: Mon, 25 Nov 2013 01:29:37 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 44
Connection: close
Cache-Control: private
ptr =
, userp = onnection: close
X-Powered-By: PHP/5.3.10-1ubuntu3.6
Set-Cookie: CAKEPHP=kgqv6b4rnbbtn1h1ndda514936; expires=Tue, 03-Dec-2013 09:29:37 GMT; path=/
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
HTTP/1.1 200 OK
Date: Mon, 25 Nov 2013 01:29:37 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 44
Connection: close
Cache-Control: private
Set-Cookie: SERVERID=a4a5b2bbca16d8c8b2ba6d5b6e55f36e|1385342977|1385342977;Path=/
{"Successful":true,"Message":"Successful. "}lewei50 ret = onnection: close
X-Powered-By: PHP/5.3.10-1ubuntu3.6
Set-Cookie: CAKEPHP=kgqv6b4rnbbtn1h1ndda514936; expires=Tue, 03-Dec-2013 09:29:37 GMT; path=/
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
HTTP/1.1 200 OK
Date: Mon, 25 Nov 2013 01:29:37 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 44
Connection: close
Cache-Control: private
Set-Cookie: SERVERID=a4a5b2bbca16d8c8b2ba6d5b6e55f36e|1385342977|1385342977;Path=/
lewei50 data =
xxg@xxg-desktop:~/1-wire/http_cloud/libcurl$

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
IBM Bluemix云计算大会见闻
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zergskj/article/details/47623655 经IBM多次邀请,今天终于抽出时间去学习了一下,想不到人非常多,看来大家都挺关心IBM的技术。 总体而言IBM的Bluemix实际上是针对大数据的一整套开源的解决方案,Bluemix就是一个开源大杂烩。 虽然整个上午IBM用了大量的时间展示了自己的技术优势,虽然开源免费对开发者来说是重大福利,但是依然没有打消我的疑虑: 要想服务国内的创客,IBM作为一家海外云服务商,必须很好的解决如下两个问题: 1. 传输速度的问题:国内的设备数据传输到海外服务器,数据传输肯定要比在国内机房的本土云服务商要差,这点IBM一直没有给出解决方案; 2. 数据安全的问题:系统接入到Bluemix,就必须将数据暴露到Bluemix云端,这对于本国数据安全还是值得推敲的?尤其是涉及到国家安全层面,这是技术无法逾越的问题了(极限追踪团队,你们使用Bluemix,军方真的愿意和你们合作吗?) 只是基于这两点,Bluemix,想说爱你就不容易!更何况还有很...
- 下一篇
极路由安全设计架构分析
0×00 前言 现代智能路由器是目前物联网发展链条上一个不可或缺的重要组成部分,搞清楚其架构设计对将来设计物联网有深远的影响,当然为更安全的设计物联网架构起到关键作用。本文将针对智能路由器的代表“极路由”的安全设计架构进行详细的分析。 现代智能路由器代表:极路由 HiWiFi OS,说它智能主要表现在可以通过手机App远程管理家中的路由器。 根据公开资料,可以大致了解HiWiFi 整个系统架构。 那么,我们需要分析目标: 由于连接公有云和手机App的都是HiWiFi路由器,所以对其固件的分析是非常有必要的。当然服务器端的OpenAPI&SDK也是研究的重点。 1. HiWiFi 路由固件ROM分析 2. HiWiFi OpenAPI &SDK服务器端分析 3. HiWiFi Android App 分析 (下期分解) 0×01 分析思路及实践 1. HiWiFi 路由固件ROM分析(Reverse Engineering ROM) 解压极路由固件 测试环境:Kali Linux binwalk、squashfs-tools 由于极路由固件是通过SSL直接推送给用户购买的...
相关文章
文章评论
共有0条评论来说两句吧...