1LB0truetrueLOCAL:[本地寄存器]:LB05942dc1f-588b-4485-88a4-8a07f240b2f891d6efce-90c6-44a8-98ca-3d5b301a78d5254truetruetruetruetrue4ConstantLB024LW0trueWordLOCAL:[本地寄存器]:LW05942dc1f-588b-4485-88a4-8a07f240b2f8b781c462-c60c-473f-8cbb-b7f90a273df265791truetruetruetrue1true4Constant2WordLB0truetrueLOCAL:[本地寄存器]:LB05942dc1f-588b-4485-88a4-8a07f240b2f8fe46d884-2838-4b27-b7fc-f07098631817254truetruetruetruetrue4ConstantLW038LW0trueWordLOCAL:[本地寄存器]:LW05942dc1f-588b-4485-88a4-8a07f240b2f867b03913-90d2-4405-ae7f-941a191446cd65791truetruetruetrue1true4Constant3WordLB0truetrueLOCAL:[本地寄存器]:LB05942dc1f-588b-4485-88a4-8a07f240b2f871515339-861e-4335-9744-b7cabb9ead0f254truetruetruetruetrue4ConstantRW06RW0trueWordLOCAL:[本地寄存器]:RW05942dc1f-588b-4485-88a4-8a07f240b2f896e581ea-bc9c-4cd1-b094-d6e621fbf3e365789truetruetruetrue1true4Constant4WordSRBR0truetrueLOCAL:[本地寄存器]:SRBR05942dc1f-588b-4485-88a4-8a07f240b2f873d53d96-5dd4-494d-8e98-ba41396bdcd0251truetruetruetruetrue4ConstantSRW01SRW0trueWordLOCAL:[本地寄存器]:SRW05942dc1f-588b-4485-88a4-8a07f240b2f8ad5c5ee5-f442-4058-8bae-78cbecc5e5b665792truetruetruetrue1true4ConstantTestTest.ctrue#include <macro.h>
#include <string.h>
#include <stdio.h>
// 定义常量
#define MAX_ROOMS 24
#define BUFFER_SIZE 4096
#define NAME_BUFFER_LEN 100
#define VALUE_BUFFER_LEN 20
int MacroMain()
{
//显示加载图片
//SetBit(@LB0@,5000,1);
// 数据缓冲区
unsigned char httpRequest[BUFFER_SIZE] = {0};
unsigned char recvBuffer[BUFFER_SIZE] = {0};
// 房间信息
unsigned char nameBuffers[MAX_ROOMS][NAME_BUFFER_LEN];
unsigned short nameBuffersUtf16[MAX_ROOMS][NAME_BUFFER_LEN];
unsigned char tempStr[MAX_ROOMS][VALUE_BUFFER_LEN]; // 改为字符串
unsigned char humidityStr[MAX_ROOMS][VALUE_BUFFER_LEN]; // 改为字符串
unsigned char statusStr[MAX_ROOMS][2];
unsigned char alarmStr[MAX_ROOMS][2];
unsigned char number[7][4] = {"一","二","三","四","五","六","七"};
unsigned int week = GetDWord(@SRW0@,7);
// 网络信息
unsigned char host[50] = {0};
unsigned short port = 0;
unsigned int floor = 0;
unsigned int NONO = 0;
unsigned int KK = 0, LL = 0;
int i = 0;
// 设置楼层
if (GetBit(@LB0@, 1)) {
floor = 1;
//信标总数
SetDWord(@LW0@,1999,10);
//基站总数
SetDWord(@LW0@,2000,8);
//基站在线数
SetDWord(@LW0@,2001,8);
//基站离线数
SetDWord(@LW0@,2002,0);
//断电监测在线数
SetDWord(@LW0@,2003,12);
//断电监测离线数
SetDWord(@LW0@,2004,0);
} else if (GetBit(@LB0@, 2)) {
floor = 2;
SetDWord(@LW0@,1999,18);
SetDWord(@LW0@,2000,4);
//基站在线数
SetDWord(@LW0@,2001,4);
//基站离线数
SetDWord(@LW0@,2002,0);
//断电监测在线数
SetDWord(@LW0@,2003,17);
//断电监测离线数
SetDWord(@LW0@,2004,0);
} else if (GetBit(@LB0@, 3)) {
floor = 3;
SetDWord(@LW0@,1999,16);
SetDWord(@LW0@,2000,4);
//基站在线数
SetDWord(@LW0@,2001,4);
//基站离线数
SetDWord(@LW0@,2002,0);
//断电监测在线数
SetDWord(@LW0@,2003,10);
//断电监测离线数
SetDWord(@LW0@,2004,0);
} else if (GetBit(@LB0@, 4)) {
floor = 4;
SetDWord(@LW0@,1999,19);
SetDWord(@LW0@,2000,4);
//基站在线数
SetDWord(@LW0@,2001,4);
//基站离线数
SetDWord(@LW0@,2002,0);
//断电监测在线数
SetDWord(@LW0@,2003,8);
//断电监测离线数
SetDWord(@LW0@,2004,0);
}
// 初始化寄存器数据
SetWord(@LW0@, 0, 0);
SetWord(@LW0@, 1, 0);
SetWord(@LW0@, 2, 0);
// 初始化服务器地址和端口
if (GetDWord(@RW0@, 100) == 0) {
const unsigned char YS1[] = "124.221.147.225";
SetMem(YS1, @RW0@, 100, strlen(YS1));
SetWord(@RW0@, 120, 58888);
SetDWord(@RW0@, 122, floor);
}
// 获取服务器地址和端口
GetMem(host, @RW0@, 100, 40);
port = GetWord(@RW0@, 120);
// 构建 HTTP 请求
snprintf(httpRequest, sizeof(httpRequest),
"GET /coldchain/hmi/roomMonitor?floor=%d&createOrg=1947099553009520642 HTTP/1.1\r\n"
"Accept: application/json, text/plain, */*\r\n"
"Accept-Language: zh-CN,zh;q=0.9\r\n"
"User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20100101 Firefox/22.0\r\n"
"Accept-Encoding: gzip, deflate, br, zstd\r\n"
"Host: 124.221.147.225:58888\r\n"
"Token: SZrN75oijJZLCgXg3K98zW4fbXT2soio\r\n"
"Connection: Keep-Alive\r\n"
"\r\n",
floor);
// 建立连接并发送请求
NONO = OpenSocket(host, port, 1);
SetWord(@LW0@, 0, NONO); // 保存句柄
if (NONO >= 1000) {
Debug(0, "socket opened\n");
KK = SendSocket(NONO, httpRequest, strlen(httpRequest));
SetWord(@LW0@, 1, KK); // 发送字节数
Delay(500);
LL = RecvSocket(NONO, recvBuffer, sizeof(recvBuffer), 2000);
SetWord(@LW0@, 20, LL); // 接收字节数
Debug(0, "Request: %s", httpRequest);
Debug(0, "Response: %s", recvBuffer);
for(i=0;i<MAX_ROOMS;i++){
strcpy(nameBuffers[i]," ");
strcpy(tempStr[i]," ");
strcpy(humidityStr[i]," ");
}
// 解析 JSON 数据
int index = 0;
unsigned char *pos = recvBuffer;
while (index < MAX_ROOMS && (pos = strstr(pos, "\"monitorName\":\"")) != NULL) {
int offset = pos - recvBuffer + strlen("\"monitorName\":\"");
int j = 0;
unsigned char nameBuffer[NAME_BUFFER_LEN];
// 提取 roomName
while (recvBuffer[offset + j] != '"' && j < NAME_BUFFER_LEN - 1) {
nameBuffer[j] = recvBuffer[offset + j];
j++;
}
nameBuffer[j] = '\0';
strncpy(nameBuffers[index], nameBuffer, NAME_BUFFER_LEN - 1);
nameBuffers[index][NAME_BUFFER_LEN - 1] = '\0';
// 转换为 UTF-16
//Utf8Str2Utf16Str(nameBuffers[index], nameBuffersUtf16[index]);
// 提取 temp
unsigned char *tempPos = strstr(pos, "\"temp\":");
if (tempPos) {
int k = 0;
int start = tempPos - recvBuffer + strlen("\"temp\":\"");
while (recvBuffer[start + k] != '"'&&recvBuffer[start + k] != ',' && recvBuffer[start + k] != '}' && k < VALUE_BUFFER_LEN - 1) {
tempStr[index][k] = recvBuffer[start + k];
k++;
}
tempStr[index][k] = '\0';
} else {
strcpy(tempStr[index], "0");
}
// 提取 humidity
unsigned char *humidPos = strstr(pos, "\"humidity\":");
if (humidPos) {
int k = 0;
int start = humidPos - recvBuffer + strlen("\"humidity\":\"");
while (recvBuffer[start + k] != '"'&&recvBuffer[start + k] != ',' && recvBuffer[start + k] != '}' && k < VALUE_BUFFER_LEN - 1) {
humidityStr[index][k] = recvBuffer[start + k];
k++;
}
humidityStr[index][k] = '\0';
} else {
strcpy(humidityStr[index], "0");
}
// 提取 status
unsigned char *statusPos = strstr(pos, "\"status\":");
if (statusPos) {
int k = 0;
int start = statusPos - recvBuffer + strlen("\"status\":");
while (recvBuffer[start + k] != ',' && recvBuffer[start + k] != '}' && k < VALUE_BUFFER_LEN - 1) {
statusStr[index][k] = recvBuffer[start + k];
k++;
}
statusStr[index][k] = '\0';
} else {
strcpy(statusStr[index], "1");
}
// 提取 alarm
unsigned char *alarmPos = strstr(pos, "\"alarm\":");
if (alarmPos) {
int k = 0;
int start = alarmPos - recvBuffer + strlen("\"alarm\":");
while (recvBuffer[start + k] != ',' && recvBuffer[start + k] != '}' && k < VALUE_BUFFER_LEN - 1) {
alarmStr[index][k] = recvBuffer[start + k];
k++;
}
alarmStr[index][k] = '\0';
} else {
strcpy(alarmStr[index], "0");
}
index++;
// 移动 pos 到当前字段结束位置,继续查找下一个 "monitorName"
pos = pos + strlen("\"monitorName\":\"") + j + 1; // +1 是跳过结尾的引号
}
if(index>12){
SetBit(@LB0@,2222,1);
}else{
SetBit(@LB0@,2222,0);
}
// 写入寄存器
for (i = 0; i < 12; i++) {
// 转换为 UTF-16
if(GetBit(@LB0@,10)&&index>12){
if(i+12<index){
SetBit(@LB0@,100 + i*100 + 75,1);
SetBit(@LB0@,100 + i*100 + 85,1);
}else{
SetBit(@LB0@,100 + i*100 + 75,0);
SetBit(@LB0@,100 + i*100 + 85,0);
}
Utf8Str2Utf16Str(nameBuffers[i+12], nameBuffersUtf16[i+12]);
SetMem(nameBuffersUtf16[i+12], @LW0@, 100 + i * 100, NAME_BUFFER_LEN / 2);
SetMem(tempStr[i+12], @LW0@, 100 + i * 100 + 30, strlen(tempStr[i+12]) + 7);
SetMem(humidityStr[i+12], @LW0@, 100 + i * 100 + 50, strlen(humidityStr[i+12]) + 7);
if(strcmp(statusStr[i+12],"1") == 0){
SetBit(@LB0@,100 + i*100 + 70,0);
}else{
SetBit(@LB0@,100 + i*100 + 70,1);
}
if(strcmp(alarmStr[i+12],"0") == 0){
SetBit(@LB0@,100 + i*100 + 80,0);
}else{
SetBit(@LB0@,100 + i*100 + 80,1);
}
}else{
if(i<index){
SetBit(@LB0@,100 + i*100 + 75,1);
SetBit(@LB0@,100 + i*100 + 85,1);
}else{
SetBit(@LB0@,100 + i*100 + 75,0);
SetBit(@LB0@,100 + i*100 + 85,0);
}
Utf8Str2Utf16Str(nameBuffers[i], nameBuffersUtf16[i]);
SetMem(nameBuffersUtf16[i], @LW0@, 100 + i * 100, NAME_BUFFER_LEN / 2);
SetMem(tempStr[i], @LW0@, 100 + i * 100 + 30, strlen(tempStr[i]) + 7);
SetMem(humidityStr[i], @LW0@, 100 + i * 100 + 50, strlen(humidityStr[i]) + 7);
if(strcmp(statusStr[i],"1") == 0){
SetBit(@LB0@,100 + i*100 + 70,0);
}else{
SetBit(@LB0@,100 + i*100 + 70,1);
}
if(strcmp(alarmStr[i],"0") == 0){
SetBit(@LB0@,100 + i*100 + 80,0);
}else{
SetBit(@LB0@,100 + i*100 + 80,1);
}
}
}
}
SetString(@LW0@,12,UNICODE,number[floor-1]);
SetString(@LW0@,7,UNICODE,number[week-1]);
//关闭加载图片
SetBit(@LB0@,5000,0);
// 关闭连接(建议取消注释)
if (NONO >= 1000) CloseSocket(NONO);
return 0;
}dac4c744-389f-4d60-a8b6-9530018c86441