文章目录
- 一:前言;
- 二:认识C语言的编程,编译器最后到底把我们的文件弄成啥了?
- 三:回到正题,为何需要 封装底层逻辑 ?
- 四:开始你的表演!
- 五:其他!
一:前言;
今天是2019年1月26号了,相信还在坚持看我博文笔记的你,应该放假了把。●︿● 。在这条esp8266 SDK
编程开发道路渐行渐远了,不知道这一年的笔记竟然可以帮助那么多的朋友,感到欣慰!!
当初写博客仅仅为了记录职业发展,回头看看那些年的进步!这个要看到一些去年做乐鑫开发板的淘宝商家,开始开源了教程在GitHub
,很好,哈哈!
即使在这个嵌入式开发路上走了那么远,我依然不忘初衷,继续笔记,开源代码。并非商业用途,并非组织编写。小徐学到一些好的东西知识干货,依然会分享给大家。我并不会停顿在某个领域或某个阶段,做无谓的事情,时间是珍贵的,若干年后,三十而立,要有所作为!
二:认识C语言的编程,编译器最后到底把我们的文件弄成啥了?
从大学学了C语言、Java语言,毕业一年就学了web前端编程以及服务器php
开发,c语言很大都不同的是:C语言是面对过程的编程!编译之后,就是二进制的bin
文件,或者我们51
熟悉的hex
文件,这些文件不能再一次被分解了。
而学过javaWeb
,或者安卓的朋友,像是对apk
反编译都知道,最后是一个个的class
文件,而最后的虚拟机会对这些文件进一步编译成二进制或者其他文件给手机linux
跑起来。总的来说,java
是把我们编程中的对象,变成一个class
!不同的class
名字不一样,所以我们也就是有:面向对象编程。
举个靶子,我们的c语言有个关键字extern
,而在面向对象编程,是没有这个存在的!extern
关键字意思是让当前的c
文件去其他c
文件找这个变量;更可怕的,如果2个文件或者多个文件定义一样的变量的名字,编译过程提示变量重复。。What?
我明明放在2个文件啊,为啥还提示重复??原理就是编译过程其实就是把所有文件整理成一个不可分解文件!
三:回到正题,为何需要 封装底层逻辑 ?
封装
,何谓封装?就是一些细节隐藏起来,目的是不让其他开发者看到我的实现过程,或者是为了禁止他人修改。就像一个工厂,实现封闭式管理,不让他人看到里面的操作流程,或者不想泄露商业机密!客户仅需按照合同来提供金钱,那么工厂就会操作并且 提供货源给你。
(并非追随乐鑫,而是学习到这种封装精神!)
去年时候,我接到公司给的一个利用某较为出名的物联网平台提供的SDK
,集成在esp8266
,实现连接其平台,实现控制下发流程。刹那感觉这公司的嵌入式开发人那么牛逼啊。竟然可以封装esp8266
的底层逻辑给第三方使用!
现在想起来,也不是难!可能是我已经掌握了吧?是的,我已经学会了如何做自己的sdk
静态库文件,并且提供给第三方用!现在我们开始通过认识乐鑫提供的文件,了解一下一个完整的SDK包应该是怎么样的?
四:开始你的表演!
- 下面拿上篇文章的说的
MD5
加密算法封装适配esp8266
封装起来。 - 我这里准备一台集成
esp8266
开发环境的linux
系统的虚拟机,可以跑起来一个完整的工程,我把我要封装的文件单独放在一个独立文件夹,叫做driver
,下面只有一个头文件和源文件,以及一个Makefile
文件! - 注意事项:
- 1、注意
driver
文件夹要被工程编译,别问怎么做。。这个是esp8266
编程基本功了! - 2、务必要在
linux
下编译,windows
我还没发现有什么方法可以编译成库文件。 - 3、 我们把所有的业务和实现过程在源文件实现,只提供头文件给他人用。
- 待我们编译成功之后:
- 其下面文件夹有个
libxxx.a
文件。没错,他就是这个文件夹编译出来的。这个就是我们要的库文件,是不是很简单轻松拿到呀?
- 那我们怎么验证这个是否真的是我们要的呢?很简单检验!我这里不再累赘了,参考我的上几个月写的文章:esp8266的工程如何添加第三方静态库文件以及如何自定义文件夹
- 这个其实对于个人学习如何封装是很好的体现,下面给大家提供我封装的
MD5
在esp8266
的封装库文件以及源文件: - 提供的接口很简单:
#ifndef __MZX_CLOUDS_H__
#define __MZX_CLOUDS_H__
#include "esp_common.h"
#include "c_types.h"
#define XH_MD5_16 16
#define XH_MD5_32 32
/**
* @description: HMAC_MD5加密
* @param {strContent} 要加密的字符串
* @param {iLength} 要加密的字符串的长度
* @param {typeMd5Bit} 十六位还是三十二位加密?
* @param {outBuffer} 输出字符串
* @return:
*/
void XH_MD5StartDigest(void const *strContent, u16 iLength, u8 typeMd5Bit, u8 *outBuffer);
/**
* @description: HMAC_MD5加密
* @param {inBuffer} 要加密的字符串
* @param {len} 要加密的字符串的长度
* @param {ky} 密钥
* @param {pUserOut} 输出字符串
* @return:
*/
void HMAC_XH_MD5(u8 *inBuffer, u16 len, u8 *ky, u8 *pUserOut);
#endif
如何使用?
void user_init(void)
{
char context[20] = {"xuhong2019"}; //要加密的字符串
char getEntry[20]; //加密后的内容
XH_MD5StartDigest(context, strlen(context), XH_MD5_16, getEntry); //十六位加密
printf("xuhong2019 16Bit: %s \n", getEntry);
}
五:其他!
- 运行截图: