151 lines
5.5 KiB
C
151 lines
5.5 KiB
C
#include "main.h"
|
||
|
||
|
||
|
||
//继电器引脚初始化
|
||
void relayInit(void) {
|
||
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||
|
||
GPIOB_RCC_ENABLE;
|
||
GPIOD_RCC_ENABLE;
|
||
|
||
GPIO_InitStruct.Pin = Realy1_Pin;
|
||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||
HAL_GPIO_Init(Realy1_GPIO_Port, &GPIO_InitStruct);
|
||
|
||
GPIO_InitStruct.Pin = Realy2_Pin;
|
||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||
HAL_GPIO_Init(Realy2_GPIO_Port, &GPIO_InitStruct);
|
||
|
||
GPIO_InitStruct.Pin = Realy3_Pin;
|
||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||
HAL_GPIO_Init(Realy3_GPIO_Port, &GPIO_InitStruct);
|
||
|
||
GPIO_InitStruct.Pin = Realy4_Pin;
|
||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||
HAL_GPIO_Init(Realy4_GPIO_Port, &GPIO_InitStruct);
|
||
|
||
//从存储器中恢复继电器状态
|
||
MqttInfoStr.Relay_State[1] ? Relay1_OFF : Relay1_ON;
|
||
MqttInfoStr.Relay_State[2] ? Relay2_OFF : Relay2_ON;
|
||
MqttInfoStr.Relay_State[3] ? Relay3_OFF : Relay3_ON;
|
||
MqttInfoStr.Relay_State[4] ? Relay4_OFF : Relay4_ON;
|
||
|
||
log_info("继电器1状态为:%s",MqttInfoStr.Relay_State[1] ? "开" : "关");
|
||
log_info("继电器2状态为:%s",MqttInfoStr.Relay_State[2] ? "开" : "关");
|
||
log_info("继电器3状态为:%s",MqttInfoStr.Relay_State[3] ? "开" : "关");
|
||
log_info("继电器4状态为:%s",MqttInfoStr.Relay_State[4] ? "开" : "关");
|
||
|
||
//读取存储器的继电器状态发送给云平台
|
||
CAT1_printf("AT+MPUB=\"/iot/data/up/%s\",0,0,\"{\\22header\\22:\\22iot.prop.post\\22,\\22body\\22:{\\22sw1\\22:%d,\\22sw2\\22:%d,\\22sw3\\22:%d,\\22sw4\\22:%d}}\"\r\n",
|
||
MqttInfoStr.ClientID,
|
||
MqttInfoStr.Relay_State[1]?1:0,
|
||
MqttInfoStr.Relay_State[2]?1:0,
|
||
MqttInfoStr.Relay_State[3]?1:0,
|
||
MqttInfoStr.Relay_State[4]?1:0);
|
||
|
||
}
|
||
|
||
|
||
// 继电器响应网络数据
|
||
//收到主机控制指令:+MSUB: "/iot/data/down/cfd6dba662690a5e",118 byte,{"id":"977013940154814794","header":"iot.prop.set","version":"1.0","body":{"sw1":{"time":1713104741005,"value":true}}}
|
||
void relayAction(uint8_t *data) {
|
||
uint8_t i = 0;
|
||
char *TempPointer; // 临时指针
|
||
char CmdId[18] = {0}; // 存贮id的数据,以响应服务器下发的数据
|
||
char IdFlag = 0; // id的计数标志位,用于判断ID中是否出现异常字符
|
||
if(strstr((char *)data,MqttInfoStr.Topic)) { //查找 /iot/data/down/ 出现的位置
|
||
TempPointer = strstr((char *)data,"\"id\":"); // 记录ID位置 {"id":"1117
|
||
TempPointer += 6; //除去"id": 5个字符 应该从第6个开始取
|
||
IdFlag = 0;
|
||
log_info("ID起始位置为%s", TempPointer); //打印结果:ID起始位置为977187088401715548","header":"iot.sub.prop.set","version":"1.0","body":{"sw2":{"time":1713146022764,"value":true}}}
|
||
for (i = 0; i < 18; i++) {
|
||
// 存储id(响应帧,必要参数)
|
||
if (((TempPointer[i] >= '0') && (TempPointer[i] <= '9')) || ((TempPointer[i] >= 'a') && (TempPointer[i] <= 'z')) || ((TempPointer[i] >= 'A') && (TempPointer[i] <= 'Z'))) {
|
||
CmdId[i] = TempPointer[i];
|
||
IdFlag++;
|
||
} else {
|
||
IdFlag = 0;
|
||
log_info("ID中混有非法字符,将不会发送反馈数据");
|
||
log_info("ID指针为%s", TempPointer); //此语句千万不能用printf 而是得用log_info 否则程序卡死 很难找到原因
|
||
}
|
||
}
|
||
if (IdFlag >= 18) { // ID为18位,当ID>=18时说明ID正常
|
||
log_info("ID中一切字符正常");
|
||
}
|
||
|
||
if(strstr((char *)data,"\"sw")) { //先判断收到的数据是不是开关量
|
||
TempPointer = strstr((char *)data,"\"sw"); // 记录sw位置
|
||
switch(TempPointer[3]) { // 判断操作哪个开关
|
||
case '1':
|
||
if (strstr((char *)data, "true")) {
|
||
log_info("开关1打开");
|
||
Relay1_ON;//
|
||
MqttInfoStr.Relay_State[1] = 1;
|
||
}
|
||
if (strstr((char *)data, "false")) {
|
||
log_info("开关1关闭");
|
||
MqttInfoStr.Relay_State[1] = 0;
|
||
Relay1_OFF;//
|
||
}
|
||
break;
|
||
case '2':
|
||
if (strstr((char *)data, "true")) {
|
||
log_info("开关2打开");
|
||
Relay2_ON;//
|
||
MqttInfoStr.Relay_State[2] = 1;
|
||
}
|
||
if (strstr((char *)data, "false")) {
|
||
log_info("开关2关闭");
|
||
Relay2_OFF;//
|
||
MqttInfoStr.Relay_State[2] = 0;
|
||
}
|
||
break;
|
||
case '3':
|
||
if (strstr((char *)data, "true")) {
|
||
log_info("开关3打开");
|
||
Relay3_ON;//
|
||
MqttInfoStr.Relay_State[3] = 1;
|
||
}
|
||
if (strstr((char *)data, "false")) {
|
||
log_info("开关3关闭");
|
||
Relay3_OFF;//
|
||
MqttInfoStr.Relay_State[3] = 0;
|
||
}
|
||
break;
|
||
case '4':
|
||
if (strstr((char *)data, "true")) {
|
||
log_info("开关4打开");
|
||
Relay4_ON;//
|
||
MqttInfoStr.Relay_State[4] = 1;
|
||
}
|
||
if (strstr((char *)data, "false")) {
|
||
log_info("开关4关闭");
|
||
Relay4_OFF;//
|
||
MqttInfoStr.Relay_State[4] = 0;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
eepromWriteData(0, &MqttInfoStr, MQTT_STRUCT_LEN);
|
||
CAT1_printf("AT+MPUB=\"/iot/data/up/%s\",0,0,\"{\\22header\\22:\\22iot.prop.post\\22,\\22body\\22:{\\22sw1\\22:%d,\\22sw2\\22:%d,\\22sw3\\22:%d,\\22sw4\\22:%d}}\"\r\n",
|
||
MqttInfoStr.ClientID,
|
||
MqttInfoStr.Relay_State[1]?1:0,
|
||
MqttInfoStr.Relay_State[2]?1:0,
|
||
MqttInfoStr.Relay_State[3]?1:0,
|
||
MqttInfoStr.Relay_State[4]?1:0);
|
||
HAL_Delay(50);//需要延时 可以很短
|
||
//推送回复消息 OK
|
||
CAT1_printf("AT+MPUB=\"/iot/data/up/%s\",0,0,\"{\\22id\\22:\\22%s\\22,\\22code\\22:0,\\22message\\22:\\22OK\\22}\"\r\n",MqttInfoStr.ClientID, CmdId);
|
||
}
|
||
}
|
||
|