#include "eth-board.h" #include "usart.h" #include "proto-sl651.h" #include // 尝试创建Socket const char void EthMqttTick (void) { if (s_tx_timeout > 1) s_tx_timeout--; if (s_run_timer > 1) s_run_timer--; if (s_lost_timer > 1) s_lost_timer--; } //void EthMqttReboot(void) //{ // DelayMs(500); // HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET); //} static enum { DeviceReboot, DeviceConfig, DeviceGetPara, DeviceSetPara, DeviceReset, DeviceLink, DeviceIdle, } DeviceState = DeviceReboot ; static enum { FistIn, Runing, End, JumpUp } s_run = FistIn; // NetFunc.Init = EthMqttInit; // NetFunc.IsConnected = EthMqttIsConnect; // NetFunc.IsReady = EthMqttIsReady; // NetFunc.ReadData = EthMqttReadData; // NetFunc.WriteData = EthMqttWriteData; // NetFunc.IsIdle = EthMqttIsIdle; // NetFunc.ReSubTopic = EthMqttReSubTopic; // NetFunc.Task = EthMqttTask; void EthMqttInit (void) { // char str[128]; // char addr_str[10]; // GPIO_InitTypeDef GPIO_InitStruct; // GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // GPIO_InitStruct.Pull = GPIO_PULLUP; // GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; // GPIO_InitStruct.Pin = GPIO_PIN_1; // HAL_GPIO_Init (GPIOB, &GPIO_InitStruct); // HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET); // GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // GPIO_InitStruct.Pull = GPIO_PULLUP; // GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; // // 状态 // GPIO_InitStruct.Pin = GPIO_PIN_4; // HAL_GPIO_Init (GPIOC, &GPIO_InitStruct); // memset(addr_str,0,10); // hexbyte_to_hex_str((char *)SysInfo.Addr,addr_str,4); // UartInfoInit(uEth); // 初始化以太网接口 // memset(sub_topic,0,64); // sprintf(sub_topic,"device/sluice/tx/22000073%s",addr_str); // memset(pub_topic,0,64); // sprintf(pub_topic,"device/sluice/rx/22000073%s",addr_str); // s_tx_timeout = 1; } // // 上线 // void EthMqttConnectd (void) // { // s_isconnect = 1; // //DisWriteNetSte (1, QUEUE); // s_lost_timer = 60000; // dbg_printf("Eth Device Isconnected \r\n"); // } // 掉线 void EthMqttDisConnectd (void) { s_lost_timer = 0; DisWriteNetSte (2, QUEUE); DeviceState = DeviceReboot; dbg_printf ("Eth Device IsDisconnected \r\n"); } int EthMqttReadData (char * buf, int length) { int k = 0; if (UartInfoRxIsReady (uEth) == 1) { k = UartInfoReadData (uEth, (char *) buf, length); dbg_printf ("<<<<<<<<<<<<%d\r\n", k); s_lost_timer = 60000; DisWriteNetSte (1, QUEUE); } return k; } int EthMqttIsReady (void) { if (DeviceState != DeviceIdle) { return 0; } else { return UartInfoRxIsReady (uEth); } } void EthMqttWriteData (char * data, int length) { UartInfoWriteData (uEth, data, length); } int EthMqttIsIdle (void) { if (EthMqttIsConnect() == 0) { return 0; } if (DeviceState == DeviceIdle) return 1; return 0; } int EthMqttIsConnect (void) { if (HAL_GPIO_ReadPin (GPIOC, GPIO_PIN_4) == GPIO_PIN_SET) return 1; else return 0; //return s_isconnect; } void EthMqttTask (void) { int rx_size; char str[128]; //static pst_Work_Pragma pstWork_Pragma; switch (DeviceState) { case DeviceReboot: { if (s_run == FistIn) { dbg_printf ("EthDeviceReboot\r\n"); HAL_GPIO_WritePin (GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); s_run_timer = 500; s_run = Runing; } else if (s_run == Runing) { if (s_run_timer == 1) { s_run_timer = 0; s_run = End; HAL_GPIO_WritePin (GPIOB, GPIO_PIN_1, GPIO_PIN_SET); dbg_printf ("Reboot Finsh\r\n"); s_run_timer = 5000; } } else if (s_run == End) { if (s_run_timer == 1) { //dbg_printf("Reboot Finsh\r\n"); s_run = JumpUp; s_run_timer = 0; } } else { s_run = FistIn ; DeviceState = DeviceConfig; } break; } // 这里要等待3s case DeviceConfig: // 进入配置模式 { if (s_run == FistIn) { dbg_printf ("DeviceConfig\r\n"); UartInfoClearData (uEth) ; UartInfoWriteData (uEth, "++++++++++", 10); s_run_timer = 50; s_run = Runing; } else if (s_run == Runing) { if (s_run_timer == 1) { s_run_timer = 0; UartInfoWriteData (uEth, "{\"Command\":\"config\"}", strlen ("{\"Command\":\"config\"}")); dbg_printf ("Command\r\n"); s_run = End; s_run_timer = 3000; } // 获取发送的数据 } else if (s_run == End) { if (s_run_timer == 1) { s_run = JumpUp; s_run_timer = 0; } } else { s_run = FistIn; DeviceState = DeviceGetPara; } break; } case DeviceGetPara: { if (UartInfoRxIsReady (uEth) == 1) { dbg_printf ("DeviceGetPara\r\n"); rx_size = UartInfoReadData (uEth, (char *) s_buffer, 1024); dbg_printf ("(%d)[%d]\r\n", rx_size, s_buffer[0]) ; DeviceState = DeviceSetPara; } break; } case DeviceSetPara: { if (s_run == FistIn) { memset (s_buffer, 0, 1024); //dbg_printf("subtopic:%s\r\n",(char *)pstWork_Pragma->stExternPragma.stMQTTClient.SubTopic); sprintf (s_buffer, "{\"%s\":\"%s\",\"%s\":\"%s\",\"%s\":%d,\"%s\":\"%s\",\"%s\":\"%s\",\"%s\":\"%s\",\"%s\":\"%s\",\"%s\":\"%s\"}", "Command", "config", "RemoteHost", SysInfo.remoteAddr, "RemotePort", SysInfo.remotePort, "WorkMode", "MQTT", "UserName", SysInfo.remoteuser, "Password", SysInfo.remotepass, "PubTopic", pub_topic, "SubTopic", sub_topic ); //SetParametersToData(pstWork_Pragma,(char *)s_buffer,1024); dbg_printf ("%s\r\n", s_buffer); UartInfoWriteData (uEth, s_buffer, strlen (s_buffer)); s_run_timer = 1000; s_run = Runing; } else if (s_run == Runing) { if (s_run_timer == 1) { s_run_timer = 0; UartInfoWriteData (uEth, "{\"Command\":\"exit\"}", strlen ("{\"Command\":\"exit\"}")); dbg_printf ("Command\r\n"); s_run = End; s_run_timer = 50; } // 获取发送的数据 } else if (s_run == End) { if (s_run_timer == 1) { s_run = JumpUp; s_run_timer = 0; } } else { s_run = FistIn; DeviceState = DeviceReset; } break; } case DeviceReset: { if (s_run == FistIn) { HAL_GPIO_WritePin (GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); s_run_timer = 500; s_run = Runing; } else if (s_run == Runing) { if (s_run_timer == 1) { s_run_timer = 0; s_run = End; HAL_GPIO_WritePin (GPIOB, GPIO_PIN_1, GPIO_PIN_SET); dbg_printf ("Reboot Finsh\r\n"); s_run_timer = 3000; } } else if (s_run == End) { if (s_run_timer == 1) { dbg_printf ("Reboot Finsh\r\n"); UartInfoClearData (uEth) ; s_run = JumpUp; s_run_timer = 0; } } else { s_run = FistIn ; DeviceState = DeviceIdle; } break; } case DeviceLink:// 检查上线 { s_isconnect = 1; DeviceState = DeviceIdle; break; } case DeviceIdle: { if (s_lost_timer == 0) { if (EthMqttIsConnect()) { EthMqttConnectd(); s_lost_timer = 60000; } // 第一次上线 } break; } } if (s_lost_timer == 1) { EthMqttDisConnectd(); s_run = FistIn ; } } int EthMqttReSubTopic (char * topic) { char addr_str[10]; memset (addr_str, 0, 10); hexbyte_to_hex_str ( (char *) SysInfo.Addr, addr_str, 4); memset (sub_topic, 0, 64); sprintf (sub_topic, "device/%s/tx/22000073%s", topic, addr_str); memset (pub_topic, 0, 64); sprintf (pub_topic, "device/%s/rx/22000073%s", topic, addr_str); dbg_printf ("EthMqttReSubTopic\r\n"); // memset(sub_topic,0,64); // sprintf(sub_topic,"device/%s/tx/22000000%08x",topic,SysInfo.Addr); // memset(pub_topic,0,64); // sprintf(pub_topic,"device/%s/rx/22000000%08x",topic,SysInfo.Addr); EthMqttDisConnectd(); }