写点什么

Linux 开发 _curl 调用网络接口

作者:DS小龙哥
  • 2022 年 6 月 22 日
  • 本文字数:4522 字

    阅读完需:约 15 分钟

介绍 Linux 下 curl 命令、wget 命令常见用法,使用 curl 获取一些常见的 HTTP 接口返回的数据,再利用 CJSON 库进行解析。最后的一个小节介绍了 Linux 下摄像头的简单操作流程并编译了mjpg-streamer-r63库,运行网页监控项目,

任务 1:使用的网络服务器接口

C 语言:面向过程 、 面向对象


【1】车牌号识别


【2】二维码生成


【3】获取北京时间


获取接口的网址:http://www.k780.com/


curl 命令的常见用法总结--部分参考网络:


linux下curl如何发送get & post 带参数的请求curl -v http://ip:port/service/name/op?param1=1\&param2=0\&param3="\[\{\"value\":1,\"value\":1\}\]"     能正常发送,但服务器端接收不到参数,原因大概是service只接受post请求curl -v --globoff http://ip:port/service/name/op?param1=1\&param2=0\&param3="[{\"value\":1,\"value\":1}]"     同上,与上面的请求的区别是加了globoff,参数里面的括号不用转义

尝试用post方式发送:
curl http://ip:port/service/name/op -X POST -H "Content-type:application/json" -d '{"param1":"16","param2":"0","param3":"[{\"value\":1,\"num\":1}]"}' 能正常发送,但服务器仍然接收不到参数
curl http://ip:port/service/name/op -X POST -d 'param1=16&param2=0&param3=[{"value":1,"value":1}]' 能正常发送,服务器端能正常获取参数

1. curl与wget 命令的区别相似之处:wget 和 cURL 都可以下载内容,都可以向互联网发送请求并返回请求项,也可以进行 HTTP POST 请求,它们都是命令行工具,可以设计成可脚本化应用到bash脚本中。
wget特点:简单直接、可直接下载程序、支持递归下载、使用方便。
curl特点:多功能工具、支持多种网络协议、安全、支持 gzip 压缩技术。

选择使用 curl还是使用 wget?
根据实际情况而定。如果想快速下载并且没有担心参数标识的需求,使用轻便有效的 wget。如果你想做一些更复杂的使用,直觉告诉你,你应该选择 curl。
curl可以理解为命令行网页浏览器,能处理好多事情,并且支持多种网络协议,可交互访问在线内容。不同的是curlL 不会渲染接收到的相应信息。
这里主要说明下curl命令发送带参数的get和post请求如何使用。
2. curl命令Get请求语法:curl命令 + 请求接口的地址
# curl http://baidu.com如果需要,可根据情况进行重定向 curl http://baidu.com > page.hrml
注意:问题:如果请求的URL含有&转义字符,会提示参数不对,报错?
# crul http://172.16.134.9:1153/mp_mcss/vcn-image.do?mode=2&fileUuid=92dc1c25980d4a1c9b59d928a092e478 > 2.jpg原因:由于URL中&不转义,curl请求时会分开访问。
解决办法:1) URL连接上加上双引号 # crul "http://172.16.134.9:1153/mp_mcss/vcn-image.do?mode=2&fileUuid=92dc1c25980d4a1c9b59d928a092e478" > 2.jpg


2) URL连接&前加\ 就可以取消转义 可参考这篇博客
3. curl命令Post请求举例:带header和body的POST请求
# curl -v -XPOST -H "Content-Type:application/json" http://172.24.7.63:36963/VIID/MotorVehicles -d ' {"DataType" : "Face"} '
说明:-v 详细的请求信息-XPOST 指定请求凡是为POST请求-H 指定请求头部-d 指定传送数据为json格式


注意:1) 如果传送json数据过大,由于数据长度限制会出现curl失败?解决方案:将json写成文件形式报错,例如data.json# curl -v -XPOST -H "Content-Type:application/json" http://172.24.7.63:36963/VIID/MotorVehicles -d @data.json至于,DELETE和PUT请求可参考网上资源。


发送带参数的请求:curl "http://47.108.52.77:8083/carmonitorsys/errlog/upload.action?token=6899fa62-86b3-4fe3-925e-8afd31dd3370&devId=1126626497aaa88" -X POST -H "Content-type:application/json" -d '{"错误情况":"程序闪退,车载主机重启成功"}'
复制代码


(1)调用网络的接口的方式: (天气预报)


curl http://api.k780.com:88/?app=weather.future'&'weaid=南昌'&&'appkey=10003'&'sign=b59bc3ef6191eb9f747dd4e83c99f2a4'&'format=json >123.txt
复制代码


注意: &是特殊的符号,需要使用单引号或者双引号括起来。


Curl: 命令行的浏览器。


(2)调用二维码生成的接口


curl http://api.k780.com:88/?app=qr.get'&'data=www.wanbangee.com'&'level=L'&'size=6 >123.png
复制代码


作业:


【1】天气预报查询


查询的格式: ./app <城市的中文名称>



【2】获取北京标准时间,显示出来



【3】查询手机号码归属地


【4】二维码生成创建 运行格式: ./app <生成的二维码内容>


生成之后直接显示在屏幕上。可以使用 eog 命令


【5】车牌号的识别


【6】调用百度地图 API 接口 ,模拟实现导航的效果。


(1) Eog 命令图片浏览器


(2) 闹钟信号一秒钟中断一次


(3) 实时改变经纬度的参数


【7】分析 cjson 源代码,参考 cjson 源码改进数据解析方式。


# gcc cJSON.c cJSON.h test.c -lm //编译的方式
复制代码


使用 cjson 提供的函数去解析天气预报、北京时间这些 json 格式的数据。


JSON 语法规则:


【1】大括号{}表示对象


【2】双引号表示的字符串


【3】冒号后面保存的是数据值,前面表示数据值的名称


【4】中括号[]表示数组


【5】数据之间使用逗号隔开


编译 cjson 库的方式: # gcc app.c cJSON.c -lm


Cjson 分析


//核心结构体typedef struct cJSON {struct cJSON *next,*prev;struct cJSON *child;int type; //保存的数据的类型char *valuestring; //字符串类型的值 if type==cJSON_Stringint valueint; //int类型的值 if type==cJSON_Numberdouble valuedouble;//浮点类型的值char *string; //字符串类型} cJSON;
void cJSON_Delete(cJSON *c); //释放空间int cJSON_GetArraySize(cJSON *array); //获取数组大小cJSON *cJSON_GetArrayItem(cJSON *array,int item); //获取数组每个下标内容extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string); //获取对象的节点数据cJSON *cJSON_Parse(const char *value); //载入源数据,获取根对象
复制代码


目前阶段和后面的学习阶段: 分析源码,看源码。


#define 预编译 typedef


【1】获取 QQ 头像,QQ 名称这些功能使用脚本去写代码。


获取 QQ 名称接口:http://r.pengyou.com/fcg-bin/cgi_get_portrait.fcg?uins=QQ号码 获取 QQ 头像接口:http://qlogo4.store.qq.com/qzone/1126626497/1126626497/100?1126626497


【2】获取百度地图的接口数据


http://api.map.baidu.com/staticimage/v2?ak=vvjkqKyqSFwLgnfg0I0sXzyCDDFWFykb&mcode=666666&center=110.403874,19.914888&width=300&height=200&zoom=11


【3】获取全景地图


http://api.map.baidu.com/panorama/v2?ak=vvjkqKyqSFwLgnfg0I0sXzyCDDFWFykb&width=512&height=256&location=116.313393,40.04778&fov=180


【4】获取高清静态地图


http://api.map.baidu.com/staticimage/v2?ak=vvjkqKyqSFwLgnfg0I0sXzyCDDFWFykb&mcode=666666&center=116.403874,39.914888&width=1024&height=512&zoom=18&scale=1


(5)出行线路规划



(6)字符串与其他格式数据之间转换


#include <stdlib.h>int atoi(const char *nptr); //字符串转整数#include <stdlib.h>double atof(const char *nptr); //字符串转浮点数#include <stdio.h>int sprintf(char *str, const char *format, ...); //整数转为字符串int sscanf(const char *str, const char *format, ...); //字符串转为整数
复制代码


示例 1:


#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>int main(int argc,char **argv){char buff[100];//整数转为字符串sprintf(buff,"%d",12345);printf("buff=%s\n",buff);//浮点数转为字符串sprintf(buff,"%f",12345.12345);printf("buff=%s\n",buff);//字符串拼接sprintf(buff,"%s加%s","123","456");printf("buff=%s\n",buff);return 0;}
复制代码


示例 2:


#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>int main(int argc,char **argv){//字符串转整数int data;sscanf("1234","%d",&data);printf("data=%d\n",data);//字符串转浮点数float dataf;sscanf("116.403874,39.914888","%f",&dataf);printf("dataf=%f\n",dataf);return 0;}
复制代码


wget 命令


wget 是一个从网络上自动下载文件的自由工具,支持通过 HTTP、HTTPS、FTP 三个最常见的 TCP/IP 协议下载,并可以使用 HTTP 代理。wget 名称的由来是“World Wide Web”与“get”的结合。


获取网页数据示例:# wget [www.baidu.com](http://www.baidu.com)


默认保存在当前目录下的:index.html.x 文件中。

任务 2:摄像头操作方式

Linux、windows 这些系统下很多摄像头都是免驱(UVC)。


v4l2 :免驱摄像头框架----一堆结构体。


Linux 下开发摄像头的不同角度问题:(嵌入式开发)


【1】上层软件系统开发(系统编程),控制驱动提供的接口使用摄像头。


【2】底层硬件系统开发(驱动编程),直接控制摄像头采集数据。


摄像头功能:将采集到的图像数据转为二进制数据返回。


驱动的代码集成在操作系统里。


在操作系统里使用摄像头步骤:学习接口函数的调用。


fread(); read();Linux下是一切设备皆文件: 摄像头、网卡、声卡、鼠标、键盘………………….Linux下设备文件存放的位置: /dev目录下。
复制代码


在虚拟机跑 Linux,使用外设设备都需要单独挂载才可以使用。


挂载摄像头:



查看摄像头的设备节点:


[root@wbyq /]# ls /dev/video* /dev/video0 /dev/video1


远程网页视频监控示例


libjpeg-turbo-1.2.1.tar.gz : 将图片数据可以压缩成jpeg数据流。Jpg图片。mjpg-streamer-r63.tar.gz : 采集摄像头的数据,进行处理。一张240*320的24位色bmp图片大小: 240*320*3        第一步:编译libjpeg-turbo
1. 解压:libjpeg-turbo-1.2.1.tar.gz
2. 生成Makefile(如果报错,就安装报错提示安装包):./configure
3. 编译安装:make && make install
4. 将生成lib和include目录下的文件拷贝到/usr目录下的对应文件夹
第二步:编译mjpg-streamer-r63
1.直接make进行编译
2.运行程序:./mjpg_streamer -i "/work/mjpeg/mjpg-streamer-r63/input_uvc.so -f 10 -r 800*480 -y" -o "/work/mjpeg/mjpg-streamer-r63/output_http.so -w www"
注意: 可以使用电脑自带的摄像头。在虚拟机的右下角进行将windows系统的摄像头挂载到Linux系统
3. 在浏览器里输入地址进行查看摄像头:
例如:192.168.11.123:8080
复制代码


作业:


【1】将远程摄像头监控的代码编译运行实现效果。


(1) 修改端口号。 8080不能作为公网的端口访问。(2) 修改线程数量。(3) 分析下线程的函数实现原理。(4) 使用花生壳软件实现公网监控
复制代码


【2】学习摄像头的使用


摄像头实现拍照源程序流程:(50%程序学过的)


1. 打开摄像头的设备文件 open(“/dev/xxx”);2. 获取摄像头参数。判断摄像头是否支持一些特有的操作。read3. 配置摄像头的参数。(1) 输出的源数据格式RGB888 (2) 输出的图像尺寸 RGB888:数字数据格式其他格式: YUV 模拟数据格式4. 判断摄像头的参数是否设置成功。5. 读取摄像头的数据。 队列的形式。6. 将读取的YUV格式数据转为RGB格式7. 将RGB格式数据编码为BMP格式的图片存放到电脑上
复制代码


发布于: 6 小时前阅读数: 5
用户头像

DS小龙哥

关注

之所以觉得累,是因为说的比做的多。 2022.01.06 加入

熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域

评论

发布
暂无评论
Linux开发_curl调用网络接口_6月月更_DS小龙哥_InfoQ写作社区