阿里云飞燕平台本地定时和倒计时JSON解析处理

项目使用的是STM32+ ESP8266(AT固件)VS2019调试。编译出现报错时,在项目/属性/(C/C++)/预处理器/预处理器定义/编辑/  添加 _CRT_SECURE_NO_WARNINGS

86d1656e39884814ab50528ebbef8a5f.png

串口接收的数据:

+MQTTSUBRECV:0,"/sys/a15e2EhA***/BP***/thing/service/property/set",263,{"method":"thing.service.property.set","id":"782857171","params":{"LocalTimer":[{"Timer":"47 20 * * 1,2,3,4,5,6,7","Enable":1,"FoodVol":20,"TimezoneOffset":28800,"IsValid":1},{"Timer":"","Enable":0,"FoodVol":0,"TimezoneOffset":-1,"IsValid":0}]},"version":"1.0.0"}

除去+MQTTSUBRECV:0,"/sys/a15e2EhA***/BP***/thing/service/property/set",263;JSON格式化后

{
    "method": "thing.service.property.set",
    "id": "782857171",
    "params": {
        "LocalTimer": [{
            "Timer": "47 20 * * 1,2,3,4,5,6,7",
            "Enable": 1,
            "FoodVol": 20,
            "TimezoneOffset": 28800,
            "IsValid": 1
        }, {
            "Timer": "",
            "Enable": 0,
            "FoodVol": 0,
            "TimezoneOffset": -1,
            "IsValid": 0
        }]
    },
    "version": "1.0.0"
}

主要提取params,LocalTimer,Timer,FoodVol,TimezoneOffset对象的数据。

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include "cJSON.h"
#include <stdlib.h>

#define DEF_params "params"
#define DEF_FoodSwitch "FoodSwitch"
#define DEF_FoodVol "FoodVol"
#define DEF_version "version"
#define DEF_Timer "Timer"
#define DEF_Enable "Enable"
#define DEF_TimezoneOffset "TimezoneOffset" // 时区偏移
#define DEF_IsValid "IsValid"				//	有效值
#define DEF_LocalTimer "LocalTimer"			//	本地定时

static void CountDown_Analysis(char *str) // 倒计时解析
{
	// char str[] = "FoodSwitch-1-0-600-1709651086202,UV-1-1-500-1709650954839";

	char *str1 = strtok(str, ",");
	char *str2 = strtok(NULL, "");
	char *token1;
	printf("7:%s\n", str1);
	if (str1)
	{
		token1 = strtok(str1, "-");
		printf("1:%s\n", token1); // FoodSwitch
	FoodSwitch:
		if (strstr(token1, DEF_FoodSwitch))
		{
			token1 = strtok(NULL, "-");
			printf("2:%s\n", token1);
			printf("2-1:%d\n", atoi(token1));
			token1 = strtok(NULL, "-");
			printf("3:%s\n", token1);
			printf("3-1:%d\n", atoi(token1));
			int data1_int = atoi(strtok(NULL, "-"));		 // 提取600
			long long data1_long = atoll(strtok(NULL, "-")); // 提取1709651086202
			printf("Data from str1: %d, %lld\n", data1_int, data1_long);
		}
		else
			goto UV;
	}
	printf("8:%s\n", str2);
	if (str2)
	{
		// 提取字符串中的数据
		token1 = strtok(str2, "-");
		printf("4:%s\n", token1); // UV
	UV:
		if (strstr(token1, "UV"))
		{
			token1 = strtok(NULL, "-");
			printf("5:%s\n", token1);
			printf("5-1:%d\n", atoi(token1));
			token1 = strtok(NULL, "-");
			printf("6:%s\n", token1);
			printf("6-1:%d\n", atoi(token1));
			int data2_int = atoi(strtok(NULL, "-"));		 // 提取500
			long long data2_long = atoll(strtok(NULL, "-")); // 提取1709650954839
			printf("Data from str2: %d, %lld\n", data2_int, data2_long);
		}
		else
			goto FoodSwitch;
	}
}
static void WeekGet(char *str, char *re) // scanf 有空格检测失败的,可以用gets(str);代替scanf("%s", str);
{
	// char str[] = "35 15 * * 1,2,3,4,5,6,7";
	// char str[] = "33 15 * * *";
	char i = 0;
	unsigned char Timer = 0;
	char *token1;
	char *str1 = strtok(str, " ");
	printf("7:%s\n", str1); // 35	s
	if (str1)
	{
		printf("7-1:%d\n", atoi(str1)); // 35	d
	}
	str1 = strtok(NULL, " ");
	printf("8:%s\n", str1); // 15	s
	if (str1)
	{
		printf("8-1:%d\n", atoi(str1)); // 15	d
		str1 = strtok(NULL, " ");
		printf("8-1:%s\n", str1); //*
		str1 = strtok(NULL, " ");
		printf("8-2:%s\n", str1); //*
	}
	do
	{
		token1 = strtok(NULL, ",");
		if (token1)
		{
			i++;
			switch ((int)atoi(token1))
			{
			case 1:
				Timer |= 0x02;
				break;
			case 2:
				Timer |= 0x04;
				break;
			case 3:
				Timer |= 0x08;
				break;
			case 4:
				Timer |= 0x10;
				break;
			case 5:
				Timer |= 0x20;
				break;
			case 6:
				Timer |= 0x40;
				break;
			case 7:
				Timer |= 0x80;
				break;
			default:
				Timer |= 0x01;
			}
			char k = atoi(token1);
		j:
			i++;
			if (i == k)
			{
				printf("周%d 开\n", k);
			}
			else if (i <= 7)
			{
				printf("周%d 关\n", i);
			}
			else if (Timer == 1)
			{
				printf("执行一次 开\n");
			}
			else
			{
				printf("执行一次 关\n");
			}
		}
		else
			goto j;
	} while (token1 || i <= 7);
	printf("Timer=%d\n", Timer);
	*re = Timer;
}
static void test1(char *str) // scanf 有空格检测失败的,可以用gets(str);代替scanf("%s", str);
{
	// char* str = (char*)malloc(200 * sizeof(int));

	// scanf("%s", str);
    // gets(str);
	//  提取JSON数据
	char *json_start = strchr(str, '{');

	char *json_end = strrchr(str, '}');

	if (json_start && json_end && json_end > json_start)
	{
		// if (json_start && json_end ) {

		// 计算JSON数据长度
		int json_len = json_end - json_start + 1;
		bool json_outbool;
		int json_outint = 0;
		float json_outfloat = 0;
		char *json_outstr;
		// 创建缓冲区,并拷贝JSON数据
		char *json_str = (char *)malloc(json_len + 1);
		// char* json_str = (char*)malloc(400);
		strncpy(json_str, json_start, json_len);
		json_str[json_len] = '\0';

		// 解析JSON数据
		cJSON* json = cJSON_Parse(json_str);
		// cJSON *json = cJSON_Parse(json_start);
		printf("json :%s\n", json);
		if (json)
		{
			// 解析params元素
			cJSON *params = cJSON_GetObjectItem(json, DEF_params);
			if (params)
			{
				cJSON *LocalTimer = cJSON_GetObjectItem(params, DEF_LocalTimer); // 本地定时
				if (LocalTimer)
				{
					int i;
					unsigned char get = 0;
					for (i = 0; i < cJSON_GetArraySize(LocalTimer); i++)
					{
						cJSON *timer_object = cJSON_GetArrayItem(LocalTimer, i);
						printf("LocalTimer %d:\n", i + 1);
						printf("Timer: %s\n", cJSON_GetObjectItem(timer_object, DEF_Timer)->valuestring);
						printf("Enable: %d\n", cJSON_GetObjectItem(timer_object, DEF_Enable)->valueint);
						printf("FoodVol: %d\n", cJSON_GetObjectItem(timer_object, DEF_FoodVol)->valueint);
						printf("TimezoneOffset: %d\n", cJSON_GetObjectItem(timer_object, DEF_TimezoneOffset)->valueint);
						printf("IsValid: %d\n", cJSON_GetObjectItem(timer_object, DEF_IsValid)->valueint);
						if (i == 0)
						{
							WeekGet(cJSON_GetObjectItem(timer_object, DEF_Timer)->valuestring, &get);
							printf("get=%d\n", get);
						}
					}
				}
				if (cJSON_GetObjectItem(json, DEF_version))
				{
					json_outstr = cJSON_GetObjectItem(json, DEF_version)->valuestring;
					printf("%s: %s\n", DEF_version, json_outstr);
				}
			}
			else
			{
				printf("未找到params元素\n");
			}
			// 释放内存

			free(json_str);
			cJSON_Delete(json);
		}
		else
		{
			printf("解析JSON数据失败\n");
		}
	}
	else
	{
		printf("未在字符串中找到JSON数据\n");
	}
}

int main()
{
	unsigned char get = 0;
	// char str[] = "35 15 * * 1,2,3,5,6,7";
	// char str[] = "33 15 * * *";
	// char *str = (char *)malloc(1000);
	// scanf("%s", str);
    // gets(str);
	const char *str = "+MQTTSUBRECV:0,\"/sys/a15e2EhA**/BP**/thing/service/property/set\",263,{\"method\":\"thing.service.property.set\",\"id\":\"782857171\",\"params\":{\"LocalTimer\":[{\"Timer\":\"47 20 * * 1,2,3,4,5,6,7\",\"Enable\":1,\"FoodVol\":20,\"TimezoneOffset\":28800,\"IsValid\":1},{\"Timer\":\"\",\"Enable\":0,\"FoodVol\":0,\"TimezoneOffset\":-1,\"IsValid\":0}]},\"version\":\"1.0.0\"}";
	char str1[] = "FoodSwitch-1-0-600-1709651086202,UV-1-1-500-1709650954839";

	CountDown_Analysis(str1);
	test1(str);
	// WeekGet(str, &get);
	// printf("get=%d", get);
	// free(str);

	return 0;
}

输出的结果

+MQTTSUBRECV:0,"/sys/a15e2EhA***/BP**/thing/service/property/set",263,{"method":"thing.service.property.set","id":"782857171","params":{"LocalTimer":[{"Timer":"47 20 * * 1,2,3,7","Enable":1,"FoodVol":20,"TimezoneOffset":28800,"IsValid":1},{"Timer":"","Enable":0,"FoodVol":0,"TimezoneOffset":-1,"IsValid":0}]},"version":"1.0.0"}

7:FoodSwitch-1-0-600-1709651086202
1:FoodSwitch
2:1
2-1:1
3:0
3-1:0
Data from str1: 600, 1709651086202
8:UV-1-1-500-1709650954839
4:UV
5:1
5-1:1
6:1
6-1:1
Data from str2: 500, 1709650954839
json :
LocalTimer 1:
Timer: 47 20 * * 1,2,3,7
Enable: 1
FoodVol: 20
TimezoneOffset: 28800
IsValid: 1
7:47
7-1:47
8:20
8-1:20
8-1:*
8-2:*
周1 开
周2 开
周3 开
周4 关
周5 关
周6 关
周7 开
执行一次 关
Timer=142
get=142
LocalTimer 2:
Timer:
Enable: 0
FoodVol: 0
TimezoneOffset: -1
IsValid: 0
version: 1.0.0

F:\VS2019\Project1.exe (进程 32456)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

程序链接:https://pan.baidu.com/s/1U72omwRUL6iJPLmeWvipZA?pwd=BPBP 
提取码:BPBP

 

 

 

 

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: stm32是一种微控制器,可以通过wifi模块与阿里云进行数据通信。以下是使用stm32与阿里云进行数据发送的步骤: 1.准备工作:首先需要在阿里云IoT平台上创建一个设备,然后获取到设备的密钥和证书。还需要选择一种合适的wifi模块,并将其连接到stm32微控制器上。 2.连接wifi:利用wifi模块与stm32建立无线网络连接,以便与网络进行通信。 3.创建MQTT客户端:使用MQTT协议作为通信协议,创建一个MQTT客户端,并将其连接到阿里云IoT平台上。在连接成功后,客户端会接收与发送数据,并在需要时订阅和取消订阅某些主题。 4.发送数据:在连接成功后,可以通过MQTT客户端向阿里云IoT平台发送数据。数据格式可以根据不同的需求进行定制,例如JSON格式、XML格式等。可以在云平台上进行数据分析和可视化展示。 总之,stm32接入云平台,可以实现更加灵活和高效的数据采集、处理和管理。这样,用户可以更加便捷地进行物联网数据分析和控制,提高了物联网应用的智能化水平。 ### 回答2: STM32是一种嵌入式微控制器,它可以通过使用Wi-Fi模块来连接云端,此时可选择阿里云进行数据的发送。需要先在阿里云创建一个设备,然后使用该设备的认证信息来连接STM32。接着在STM32上设置Wi-Fi模块并通过TCP连接发送数据到阿里云。 在STM32上建立TCP连接时,需要先设置Wi-Fi连接,然后将连接信息提供给阿里云。在创建TCP连接时,必须提供设备的认证信息以进行验证。一旦认证成功,就可以将数据从STM32发送到阿里云平台。 阿里云提供了丰富的API以支持数据接收和处理。可以将接收到的数据发送到其他应用程序或通过阿里云的Web界面直接查看。同时,阿里云还提供了报警功能,可以根据预设的规则自动触发,提供更好的监管。 总之,STM32结合Wi-Fi模块可以实现连接阿里云平台进行数据发送。需在阿里云上先创建设备,然后在STM32上建立TCP连接发送数据。阿里云提供了各种API以方便接收和处理数据。 ### 回答3: STM32是一款非常流行的微控制器,可以用于许多嵌入式系统中。其中,WiFi和云服务成为业界最热门的技术,因为它们能够极大地提高嵌入式系统的交互性和可用性。 阿里云是中国领先的云服务提供商之一,它提供强大的云计算、数据库、存储、物联网等服务,可以让开发者轻松地拥有一个高效、可靠的云平台。 在STM32和阿里云的结合下,我们可以轻松地实现数据的发送。首先,需要在STM32上加入WiFi模块,将WiFi模块与STM32连接起来。然后,我们需要在阿里云上创建一个设备,设备的唯一标识符是设备名称。 接下来,我们需要开发一个STM32的固件,这个固件需要实现WiFi连接、数据的读取、数据的加密和数据的发送,以及断网重连等功能。例如,我们可以使用tls协议对数据进行加密,然后使用MQTT协议将数据发送到阿里云的指定Topic中。 最后,我们需要在阿里云上开发一个数据接收程序,这个程序需要订阅设备的Topic,然后将数据解密并处理。例如,我们可以将数据存储到数据库中,或者触发其他的业务逻辑。 总之,STM32和阿里云的结合,可以让我们开发高效、可靠的嵌入式系统,在物联网等领域发挥重要作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值