当前位置:网站首页>C语言练习:ESP32 BLE低功耗蓝牙服务端数据打包和客户端数据解析

C语言练习:ESP32 BLE低功耗蓝牙服务端数据打包和客户端数据解析

2022-06-12 00:06:00 Naiva

问题描述:

BLE 低功耗蓝牙由服务端和客户端组成,现有服务端获取PWM数据、电源ADC数据通过数据打包后由蓝牙传输到客户端进行数据解析,最后将解析过后的pwm和adc数据转换成int类型做处理,并且将信息显示在客户端的屏幕上。

为什么需要打包数据

因为低功耗BLE蓝牙一个服务有多个标签,也叫特征值,一个标签可以(读、写、通知等等 ) 串行通信传输到客户端设备,节省蓝牙传输通道的资源。

解析字符型数据

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


/** * @brief 解析字符型数据 :从一段字符串中解析期望的字符串 解 * @param pBuff: 要解析的字符串地址 * @param pLeft: 目标字符串左边的字符串 * @param pRight: 目标字符串右边的字符串 * @param pRes: 接收字符数据的地址 * @retval 0:成功 -1:失败 */

int DataParsingChar(const char *pBuff, const char *pLeft, const char *pRight,char *pRes)
{
    
    char *pBegin = NULL;
    char *pEnd = NULL;
    pBegin = strstr(pBuff, pLeft);
    pEnd = strstr(pBegin + strlen(pLeft), pRight);
    if (pEnd == NULL || pBegin == NULL || pBegin > pEnd) {
    
        return -1;
    } else {
    
        pBegin += strlen(pLeft);
        memcpy(pRes, pBegin, pEnd - pBegin);
        return 0;
    }
}

int main(int argc, char **argv)
{
    
    /* 原始数据 */
    char *name = "LiHua";
    int age = 20;
    int number = 10086;

    char buff[100] = {
    0};
    char re_name[10] = {
    0};
    char re_age[10] = {
    0};
    char re_number[10] = {
    0};

    /* 数据打包 */
    sprintf(buff,"name:%s, age:%d, number:%d.",name, age, number);
    
    /* 数据解析 */
    DataParsingChar(buff, "name:", ",", re_name);
    DataParsingChar(buff, "age:", ",", re_age);
    DataParsingChar(buff, "number:", ".", re_number);

    printf("buff : %s\n", buff);
    printf("re_name : %s\n", re_name);
    printf("re_age : %s\n", re_age);
    printf("re_number : %s\n", re_number);

    return 0; 
}

执行结果如下:

在这里插入图片描述


解析整型数据

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/** * @brief 从一段字符串中提取出整型数据 * @param pBuff: 要解析的字符串地址 * @param pLeft: 目标数据左边的字符串 * @param pRight: 目标数据右边的字符串 * @param pRes: 接收整型数据的地址 * @retval 0:成功 -1:失败 */

int DataParsingInt(const char *pBuff, const char *pLeft, const char *pRight, int *pRes)
{
    
    char *pBegin = NULL;
    char *pEnd = NULL;
    char *pTemp = NULL;
    pBegin = strstr(pBuff, pLeft); // 字符串 pBuff中查找第一次出现字符串 pLeft的位置,不包含终止符 '\0'
    pEnd = strstr(pBegin + strlen(pLeft), pRight); // 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符
    if (pEnd == NULL || pBegin == NULL || pBegin > pEnd) {
    
        return -1;
    } else {
    
        pBegin += strlen(pLeft);
        pTemp = (char *)malloc(pEnd - pBegin); // malloc 动态分配内存 (不清楚传输的字符串长度)
        memcpy(pTemp, pBegin, pEnd - pBegin); // 从存储区 pBegin复制 pEnd - pBegin 个字节到存储区 pTemp
        *pRes = atoi(pTemp);                 // 字符串转换为整型变量 int类型
        free(pTemp);
        return 0;
    }
}

int main(int argc, char **argv)
{
    
    /* 原始数据 */
    int left = 123;
    int right = 456;

    char buff[100] = {
    0};
    int re_left = 0;
    int re_right = 0;

    /* 数据打包 */
    sprintf(buff, "[%d,%d]", left, right);
    
    /* 数据解析 */
    DataParsingInt(buff, "[", ",", &re_left);
    DataParsingInt(buff, ",", "]", &re_right);

    printf("buff : %s\n", buff);
    printf("re_left : %d\n", re_left);
    printf("re_right : %d\n", re_right);
    printf("re_right - re_left = %d\n", re_right - re_left);

    return 0; 
}


在这里插入图片描述


参考资料:

原网站

版权声明
本文为[Naiva]所创,转载请带上原文链接,感谢
https://naiva.blog.csdn.net/article/details/124967957