本文最后更新于 2024-03-21,文章内容可能已经过时。

需求背景

当前蓝牙连接没有做限制,任何人都可以通过蓝牙连接到设备并进行操控,为了加强安全性,提出要做蓝牙鉴权功能

编码思路

首先规定一串有规律的文字,例如"zhouri-年月日时分秒-设备id"这样的文字

连接方(小程序)在连接时拼接文字后发送计算得到的md5

接收方(设备)根据当前时间和当前设备名称拼接字符串之后计算md5并和收到的比对,一致则为通过,会更新token过期时间

具体代码

#include <openssl/md5.h>

void compute_md5(char *str, unsigned char digest[16]) {
    MD5_CTX context;
    MD5_Init(&context);
    MD5_Update(&context, str, strlen(str));
    MD5_Final(digest, &context);
}

int main(){
    unsigned char digest[16];
    char token[100];
    char mdString[33];

    // 拼接指定形式的字符串并计算md5
    sprintf(token, "zhouri-%s", current_time);
    compute_md5(token, digest);
    for(int i = 0; i < 16; i++){
        sprintf(&mdString[i*2], "%02x", (unsigned int)digest[i]);
    }
    // logger(6, LOG_SERVICE, "%s MD5 digest: %s\n", token, mdString);
    // printf("%s MD5 digest: %s\n", token, mdString);

    // buf是蓝牙接收的内容,由于
    size_t pos = strcspn(buf, " \t\n\0"); // 找到第一个空格、制表符或换行符的位置
    buf[pos] = '\0'; 
    logger(6, LOG_SERVICE, "change buf: %s\n", buf);
    printf("change buf: %s\n", buf);
}