| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- <MacroInfo xmlns="http://schemas.flexem.com/fs/model/1" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><AddressCollection><MacroAddressInfo><AddressIndex>1</AddressIndex><BitAddress><Abbreviation>LB0</Abbreviation><AddressLabelIsVisible>true</AddressLabelIsVisible><DataTypeIsVisible>true</DataTypeIsVisible><DeviceAndAbbreviation>LOCAL:[本地寄存器]:LB0</DeviceAndAbbreviation><DeviceId>5942dc1f-588b-4485-88a4-8a07f240b2f8</DeviceId><Id>a868feeb-a779-4a71-b020-f5a889a07f33</Id><RegisterId>254</RegisterId><SpeedIsVisible>true</SpeedIsVisible><SysRegIsEnabled>true</SysRegIsEnabled><SysRegIsVisible>true</SysRegIsVisible><UseStationReferenceIsVisible>true</UseStationReferenceIsVisible><WordCountIsVisible>true</WordCountIsVisible><Version>4</Version><TagName/><NewSubAddressIndexType>Constant</NewSubAddressIndexType></BitAddress><Name>LB0</Name><WordAddress><Abbreviation>LW0</Abbreviation><AddressLabelIsVisible>true</AddressLabelIsVisible><AddressType>Word</AddressType><DeviceAndAbbreviation>LOCAL:[本地寄存器]:LW0</DeviceAndAbbreviation><DeviceId>5942dc1f-588b-4485-88a4-8a07f240b2f8</DeviceId><Id>578aa61d-ea7b-4a18-8ad0-c769ce4803d9</Id><RegisterId>65791</RegisterId><SpeedIsVisible>true</SpeedIsVisible><SysRegIsEnabled>true</SysRegIsEnabled><SysRegIsVisible>true</SysRegIsVisible><UseStationReferenceIsVisible>true</UseStationReferenceIsVisible><WordCount>1</WordCount><WordCountIsVisible>true</WordCountIsVisible><Version>4</Version><TagName/><NewSubAddressIndexType>Constant</NewSubAddressIndexType></WordAddress></MacroAddressInfo><MacroAddressInfo><AddressIndex>2</AddressIndex><AddressType>Word</AddressType><BitAddress><Abbreviation>LB0</Abbreviation><AddressLabelIsVisible>true</AddressLabelIsVisible><DataTypeIsVisible>true</DataTypeIsVisible><DeviceAndAbbreviation>LOCAL:[本地寄存器]:LB0</DeviceAndAbbreviation><DeviceId>5942dc1f-588b-4485-88a4-8a07f240b2f8</DeviceId><Id>9673b9b2-fbce-40e2-9af7-9de7e041384c</Id><RegisterId>254</RegisterId><SpeedIsVisible>true</SpeedIsVisible><SysRegIsEnabled>true</SysRegIsEnabled><SysRegIsVisible>true</SysRegIsVisible><UseStationReferenceIsVisible>true</UseStationReferenceIsVisible><WordCountIsVisible>true</WordCountIsVisible><Version>4</Version><TagName/><NewSubAddressIndexType>Constant</NewSubAddressIndexType></BitAddress><Name>LW0</Name><ReferenceCount>10</ReferenceCount><WordAddress><Abbreviation>LW0</Abbreviation><AddressLabelIsVisible>true</AddressLabelIsVisible><AddressType>Word</AddressType><DeviceAndAbbreviation>LOCAL:[本地寄存器]:LW0</DeviceAndAbbreviation><DeviceId>5942dc1f-588b-4485-88a4-8a07f240b2f8</DeviceId><Id>c80b002a-cc47-4c8c-a3c0-5a910945ecca</Id><RegisterId>65791</RegisterId><SpeedIsVisible>true</SpeedIsVisible><SysRegIsEnabled>true</SysRegIsEnabled><SysRegIsVisible>true</SysRegIsVisible><UseStationReferenceIsVisible>true</UseStationReferenceIsVisible><WordCount>1</WordCount><WordCountIsVisible>true</WordCountIsVisible><Version>4</Version><TagName/><NewSubAddressIndexType>Constant</NewSubAddressIndexType></WordAddress></MacroAddressInfo><MacroAddressInfo><AddressIndex>3</AddressIndex><AddressType>Word</AddressType><BitAddress><Abbreviation>LB0</Abbreviation><AddressLabelIsVisible>true</AddressLabelIsVisible><DataTypeIsVisible>true</DataTypeIsVisible><DeviceAndAbbreviation>LOCAL:[本地寄存器]:LB0</DeviceAndAbbreviation><DeviceId>5942dc1f-588b-4485-88a4-8a07f240b2f8</DeviceId><Id>472f1305-2b08-4198-8338-43e84a63d249</Id><RegisterId>254</RegisterId><SpeedIsVisible>true</SpeedIsVisible><SysRegIsEnabled>true</SysRegIsEnabled><SysRegIsVisible>true</SysRegIsVisible><UseStationReferenceIsVisible>true</UseStationReferenceIsVisible><WordCountIsVisible>true</WordCountIsVisible><Version>4</Version><TagName/><NewSubAddressIndexType>Constant</NewSubAddressIndexType></BitAddress><Name>RW0</Name><ReferenceCount>5</ReferenceCount><WordAddress><Abbreviation>RW0</Abbreviation><AddressLabelIsVisible>true</AddressLabelIsVisible><AddressType>Word</AddressType><DeviceAndAbbreviation>LOCAL:[本地寄存器]:RW0</DeviceAndAbbreviation><DeviceId>5942dc1f-588b-4485-88a4-8a07f240b2f8</DeviceId><Id>ab40f3a9-d838-419f-a8cb-b10b9297708c</Id><RegisterId>65789</RegisterId><SpeedIsVisible>true</SpeedIsVisible><SysRegIsEnabled>true</SysRegIsEnabled><SysRegIsVisible>true</SysRegIsVisible><UseStationReferenceIsVisible>true</UseStationReferenceIsVisible><WordCount>1</WordCount><WordCountIsVisible>true</WordCountIsVisible><Version>4</Version><TagName/><NewSubAddressIndexType>Constant</NewSubAddressIndexType></WordAddress></MacroAddressInfo><MacroAddressInfo><AddressIndex>4</AddressIndex><AddressType>Word</AddressType><BitAddress><Abbreviation>SRB0</Abbreviation><AddressLabelIsVisible>true</AddressLabelIsVisible><DataTypeIsVisible>true</DataTypeIsVisible><DeviceAndAbbreviation>LOCAL:[本地寄存器]:SRB0</DeviceAndAbbreviation><DeviceId>5942dc1f-588b-4485-88a4-8a07f240b2f8</DeviceId><Id>87454f50-b9a4-4693-ad8f-c4e78ad7f98c</Id><RegisterId>257</RegisterId><SpeedIsVisible>true</SpeedIsVisible><SysRegIsEnabled>true</SysRegIsEnabled><SysRegIsVisible>true</SysRegIsVisible><UseStationReferenceIsVisible>true</UseStationReferenceIsVisible><WordCountIsVisible>true</WordCountIsVisible><Version>4</Version><TagName/><NewSubAddressIndexType>Constant</NewSubAddressIndexType></BitAddress><Name>SRW0</Name><WordAddress><Abbreviation>SRW0</Abbreviation><AddressLabelIsVisible>true</AddressLabelIsVisible><AddressType>Word</AddressType><DeviceAndAbbreviation>LOCAL:[本地寄存器]:SRW0</DeviceAndAbbreviation><DeviceId>5942dc1f-588b-4485-88a4-8a07f240b2f8</DeviceId><Id>f3f05a1f-273a-4992-b0fa-ba3220120c85</Id><RegisterId>65792</RegisterId><SpeedIsVisible>true</SpeedIsVisible><SysRegIsEnabled>true</SysRegIsEnabled><SysRegIsVisible>true</SysRegIsVisible><UseStationReferenceIsVisible>true</UseStationReferenceIsVisible><WordCount>1</WordCount><WordCountIsVisible>true</WordCountIsVisible><Version>4</Version><TagName/><NewSubAddressIndexType>Constant</NewSubAddressIndexType></WordAddress></MacroAddressInfo></AddressCollection><Description>获取房间信息</Description><Name>Test2</Name><NameWithSuffix>Test2.c</NameWithSuffix><NeedRebuild>true</NeedRebuild><SourceCode>#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
- 
- // 字段最大长度
- #define FIELD_ATM_LEN 7
- #define FIELD_CH2O_LEN 4
- #define FIELD_LUX_LEN 10
- #define FIELD_TVOC_LEN 3
- #define FIELD_CO2_LEN 3
- #define FIELD_PM_LEN 3
- 
- void ParseJsonField(
- const unsigned char* json, // JSON 响应字符串
- const char* key, // 要查找的键名,如 "atm"
- unsigned char* value, // 输出缓冲区
- int max_len // 输出缓冲区最大长度
- ) {
- // 构造查找字符串: "\"key\":"
- unsigned char pattern[32] = {0};
- snprintf(pattern, sizeof(pattern), "\"%s\":", key);
- 
- unsigned char *pos = strstr(json, pattern);
- if (pos == NULL) {
- strcpy(value, "0");
- return;
- }
- 
- // 跳过 "\"key\":"
- pos += strlen(pattern);
- 
- // 跳过空白字符(空格、制表符等)
- while (*pos == ' ' || *pos == '\t' || *pos == '\n' || *pos == '\r') {
- pos++;
- }
- 
- int k = 0;
- 
- // 判断是否为字符串值(以引号开头)
- if (*pos == '"') {
- pos++; // 跳过开头的引号
- while (pos[k] != '"' && k < max_len - 1) {
- value[k] = pos[k];
- k++;
- }
- value[k] = '\0';
- }
- // 否则为数字或布尔值等(直接取有效字符)
- else {
- while (k < max_len - 1) {
- char c = pos[k];
- if (c == ',' || c == '}' || c == ' ' || c == '\t' || c == '\n' || c == '\r') {
- break; // 遇到分隔符结束
- }
- value[k] = c;
- k++;
- }
- value[k] = '\0';
- }
- 
- // 如果没提取到任何内容,设为 "0"
- if (k == 0) {
- strcpy(value, "0");
- }
- }
- int MacroMain()
- {
- // 数据缓冲区
- unsigned char httpRequest[BUFFER_SIZE] = {0};
- unsigned char recvBuffer[BUFFER_SIZE] = {0};
- 
- // 存储解析结果
- unsigned char atm[FIELD_ATM_LEN] = {0};
- unsigned char ch2o[FIELD_CH2O_LEN] = {0};
- unsigned char lux[FIELD_LUX_LEN] = {0};
- unsigned char tvoc[FIELD_TVOC_LEN] = {0};
- unsigned char co2[FIELD_CO2_LEN] = {0};
- unsigned char pm[FIELD_PM_LEN] = {0};
- 
- // 房间ID(字符串)
- char tId[20] = {0};
- 
- // 网络信息
- unsigned char host[50] = {0};
- unsigned short port = 0;
- int socketHandle = 0;
- int sentBytes = 0, recvBytes = 0;
- 
- // 初始化服务器地址和端口
- if (GetDWord(@RW0@, 100) == 0) {
- const unsigned char YS1[] = "124.221.147.225";
- SetMem(YS1, @RW0@, 100, strlen(YS1));
- SetWord(@RW0@, 120, 58888);
- }
- 
- // 获取服务器信息
- GetMem(host, @RW0@, 100, 40);
- port = GetWord(@RW0@, 120);
- 
- // 获取房间ID(字符串)
- GetMem(tId, @LW0@, 77777, 19); // 最多复制19字节
- 
- // 构建 HTTP 请求(使用动态 host 和 port)
- snprintf(httpRequest, sizeof(httpRequest),
- "GET /coldchain/hmi/getRoomInfoById?tId=%s HTTP/1.1\r\n"
- "Host: %s:%d\r\n"
- "Token: SZrN75oijJZLCgXg3K98zW4fbXT2soio\r\n"
- "Connection: Keep-Alive\r\n"
- "Accept: application/json, text/plain, */*\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"
- "\r\n",
- tId, host, port);
- 
- // 建立连接
- socketHandle = OpenSocket(host, port, 1);
- SetWord(@LW0@, 0, socketHandle);
- 
- if (socketHandle >= 1000) {
- Debug(0, "Socket opened: %d", socketHandle);
- sentBytes = SendSocket(socketHandle, httpRequest, strlen(httpRequest));
- SetWord(@LW0@, 1, sentBytes);
- Debug(0, "Sent %d bytes", sentBytes);
- 
- Delay(500);
- recvBytes = RecvSocket(socketHandle, recvBuffer, sizeof(recvBuffer) - 1, 2000);
- SetWord(@LW0@, 20, recvBytes);
- recvBuffer[recvBytes] = '\0'; // 确保字符串结束
- 
- Debug(0, "HTTP Response: %s", recvBuffer);
- // ================== 使用函数解析各个字段 ==================
- ParseJsonField(recvBuffer, "atm", atm, FIELD_ATM_LEN);
- ParseJsonField(recvBuffer, "ch2o", ch2o, FIELD_CH2O_LEN);
- ParseJsonField(recvBuffer, "lux", lux, FIELD_LUX_LEN);
- ParseJsonField(recvBuffer, "tvoc", tvoc, FIELD_TVOC_LEN);
- ParseJsonField(recvBuffer, "co2", co2, FIELD_CO2_LEN);
- ParseJsonField(recvBuffer, "pm", pm, FIELD_PM_LEN);
- 
- // ================== 调试输出所有结果 ==================
- Debug(0, "Parsed Data:");
- Debug(0, " atm : %s", atm);
- Debug(0, " ch2o : %s", ch2o);
- Debug(0, " lux : %s", lux);
- Debug(0, " tvoc : %s", tvoc);
- Debug(0, " co2 : %s", co2);
- Debug(0, " pm : %s", pm);
- 
- // ================== 可选:写入寄存器供 HMI 使用 ==================
- // 示例:将字符串写入内存区(根据您的系统调整)
- SetMem(atm, @LW0@, 101111, FIELD_ATM_LEN-1);
- SetMem(ch2o, @LW0@, 102222, FIELD_CH2O_LEN-1);
- SetMem(lux, @LW0@, 103333, FIELD_LUX_LEN-1);
- SetMem(tvoc, @LW0@, 104444, FIELD_TVOC_LEN-1);
- SetMem(co2, @LW0@, 105555, FIELD_CO2_LEN-1);
- SetMem(pm, @LW0@, 106666, FIELD_PM_LEN-1);
- 
- // 关闭连接
- CloseSocket(socketHandle);
- 
- } else {
- Debug(0, "Failed to open socket to %s:%d", host, port);
- }
- 
- return 0;
- }</SourceCode><UniqueId>78211b4f-31bd-4a4b-bc32-d651db7dc418</UniqueId><Version>1</Version></MacroInfo>
|