基于Alios的后台API接口任务

基于Alios的后台API接口任务

月初论文已经提交外审了,前两天接到一个任务是将之前开发的基于Alios的门禁系统接入到公司的新服务器中,后台程序由我来写,这对于我来说还是一个新的挑战。

周一

周一主要开始整理思路,由于以前没有做过类似项目,没有搞清谁是客户端,谁是服务器,之前一段时间都是用门禁系统作为服务器接收网页的信息,我以为这次还是一样用postman向门禁系统发送信息,结果想错了,是用postman向公司的服务器发送post请求,然后获取回复,总的来说就是用门禁系统向服务器发送请求,然后获得回复进行下一步处理,代替postman的作用。

周二

主要参考: https://zhuanlan.zhihu.com/p/72616216

学习HTTP的相关知识,http是一个应用层协议,HTTP协议是超文本传输协议的缩写,英文是Hyper Text Transfer Protocol。它是从WEB服务器传输超文本标记语言(HTML)到本地浏览器的传送协议。Http的主要特点如下:
1、http协议支持客户端/服务端模式,也是一种请求/响应模式的协议。
2、简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。
3、灵活:HTTP允许传输任意类型的数据对象。传输的类型由Content-Type加以标记。
4、无连接:限制每次连接只处理一个请求。服务器处理完请求,并收到客户的应答后,即断开连接,但是却不利于客户端与服务器保持会话连接,为了弥补这种不足,产生了两项记录http状态的技术,一个叫做Cookie,一个叫做Session。
5、无状态:无状态是指协议对于事务处理没有记忆,后续处理需要前面的信息,则必须重传。

请求报文构成

请求行:包括请求方法、URL、协议/版本
请求头(Request Header)
请求正文
在这里插入图片描述

post和get的区别:

都包含请求头请求行,post多了请求body。
get多用来查询,请求参数放在url中,不会对服务器上的内容产生作用。post用来提交,如把账号密码放入body中。
GET是直接添加到URL后面的,直接就可以在URL中看到内容,而POST是放在报文内部的,用户无法直接看到。
GET提交的数据长度是有限制的,因为URL长度有限制,具体的长度限制视浏览器而定。而POST没有。

常见状态码:

200 OK - 客户端请求成功
301 - 资源(网页等)被永久转移到其它URL
302 - 临时跳转
400 Bad Request - 客户端请求有语法错误,不能被服务器所理解
401 Unauthorized - 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
404 - 请求资源不存在,可能是输入了错误的URL
500 - 服务器内部发生了不可预期的错误
503 Server Unavailable - 服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

周三

由于门禁系统用的是Alios系统,Alios系统内置的有HTTP组件,并给出的有API的说明,https://help.aliyun.com/document_detail/161089.html?spm=a2c4g.11186623.6.607.f94a7c74wrgmUU#title-tm9-5om-hnk
在写的时候调用这个模块就可以了,先创建JSON,然后用cJSON_Print把json打印成json字符串。

/*隐私部分用XX代替*/
int device_pullface(void)
{
    int ret;
    char * customer_header = "Accept: text/xml,text/javascript,text/html,application/json\r\n";
    char * req_body_str;
    char HTTP_360_SERVER_IP[64] = {0};
    int HTTP_360_SERVER_PORT = 8083;
    int tmp_len = 8192;
    char *tmp = aos_zalloc(tmp_len);
    cJSON *jsonstr = cJSON_CreateObject();
    cJSON *json_ret = NULL;
    sprintf(HTTP_360_SERVER_IP, "%s", "xxxxxx");

    
    
    cJSON_AddItemToObject(jsonstr, "algorithm",  cJSON_CreateString("xxx"));
    cJSON_AddItemToObject(jsonstr, "deviceName", cJSON_CreateString("xx"));
    cJSON_AddItemToObject(jsonstr, "productType",  cJSON_CreateString("xx"));
    cJSON_AddItemToObject(jsonstr, "timestamp",  cJSON_CreateString("xx"));

    
	req_body_str = cJSON_Print(jsonstr);
    printf("%s\r\n",req_body_str);

    ret = xixi_http_post(0, 0, HTTP_360_SERVER_IP, HTTP_360_SERVER_PORT, "/appreg/device/pullFace", NULL, NULL, req_body_str, strlen(req_body_str), tmp, tmp_len);
    printf("hello_sun!!!!!!!\r\n");

    return ret;
}

周四

写完程序后把这个API绑定到命令行中用串口进行操作,发现没有成功,开始DEBUG
在debug的过程中重要用了两个工具wiresharkgdb断点调试

wireshark是一个抓包工具,我们平常使用的wireshark软件来抓包,都是在抓和自己电脑(运行着wireshark)的某个端口有关系的包,而如果想抓MCU和终端之间通信数据包就抓不了了。

如果在路由器上做个镜像或者使用hub来抓包,就可以在我的电脑上抓取经过hub传输的所有通信包,不论这个包是否跟我的电脑有通信。

抓取的场景是:mcu、终端、电脑都连接到同一个hub上,然后电脑上运行起来wireshark,wireshark中不需要做任何过滤直接抓取,只要mcu和终端有通信数据传输,在电脑上的wireshark都会抓取到这些数据包。

在这里插入图片描述

周五

在用GDB断点调试时是可以随时打印出变量的值的用print可以打印出来,非常方便,调试完成过后发现是服务器的问题,不是代码的问题,一个后台API已经完成了,其他的仿照这个写就可以了,接入公司服务器这个任务完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值