HAL_Project/Project -APP-V1.0/Hardware/OTA/ota.c

258 lines
7.8 KiB
C
Raw Permalink Normal View History

2025-05-09 15:43:42 +08:00
#include "main.h"
IAP_Stuct IAPStuct;
//[INFO] <20><><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD>ν<EFBFBD><CEBD><EFBFBD>229<32>ֽڱ<D6BD><DAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(*4Gģ<47><C4A3>*)<29><>
//[INFO]
//+MSUB: "/iot/data/down/a284c67982b089f9",175 byte,{"id":"1471561db17870ef","header":"iot.ota.upgrade.post","body":{"crc16":"1f8c","ver":1,"url":"http://iot.futureny.cn/ota/pull/f46bf3544fe6ca73.bin","md5":"f46bf3544fe6ca73"}}
//[INFO] <20>յ<EFBFBD>OTA<54><41><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
//[INFO] <20><EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ:1,"url":"http://iot.futureny.cn/ota/pull/f46bf3544fe6ca73.bin","md5":"f46bf3544fe6ca73"}}
//[INFO] <20>µİ汾<C4B0><E6B1BE><EFBFBD><EFBFBD>1
//[INFO] id<69><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ:1471561db17870ef","header":"iot.ota.upgrade.post","body":{"crc16":"1f8c","ver":1,"url":"http://iot.futureny.cn/ota/pull/f46bf3544fe6ca73.bin","md5":"f46bf3544fe6ca73"}}
//[INFO] ErrFlag= 0
//[INFO] <20><><EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t checkId(uint8_t *data){
uint8_t i;
char *TempPointer; // <20><>ʱָ<CAB1><D6B8>
uint8_t ErrFlag = 0;
uint16_t Version = 0;
uint8_t Err = 0;
uint8_t verRepeti = 0;
TempPointer = strstr((char *)data, "\"ver\":");
TempPointer += 6;
log_info("<EFBFBD><EFBFBD>ź<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ:%s", TempPointer);
i = 0;
while ((TempPointer[i] >= '0') && (TempPointer[i] <= '9')){
Version = (Version * 10) + (TempPointer[i] - '0');
i++;
}
if (TempPointer[i] != ','){
log_info("<EFBFBD><EFBFBD>Ž<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
Err = 1;
}
if (Version == MqttInfoStr.iapVer){
log_info("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD>");
Err = 1;
verRepeti = 1;
}else{ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B1BE>
MqttInfoStr.iapVer = Version;
log_info("<EFBFBD>µİ汾<EFBFBD><EFBFBD><EFBFBD><EFBFBD>%d", MqttInfoStr.iapVer);
eepromWriteData(0, &MqttInfoStr, MQTT_STRUCT_LEN);//<2F><><EFBFBD><EFBFBD><E4BBAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>eeprom
}
TempPointer = strstr((char *)data, "\"id\":\"");
TempPointer += 6; // <20>ҵ<EFBFBD>id<69>ĵ<EFBFBD>һ<EFBFBD><D2BB>λ<EFBFBD><CEBB>
log_info("id<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ:%s", TempPointer);
if(verRepeti == 1){
log_info("****ERR <20><EFBFBD><E6B1BE><EFBFBD>ظ<EFBFBD>,<2C><><EFBFBD>ͳɹ<CDB3>ָ<EFBFBD><D6B8> ERR****");
CAT1_printf("AT+MPUB=\"/iot/data/up/%s\",0,0,\"{\\22header\\22:\\22iot.ota.progress.post\\22,\\22body\\22:{\\22id\\22:\\22%.16s\\22,\\22progress\\22:10}}\"\r\n",MqttInfoStr.ClientID,TempPointer);
return Err; // <20><EFBFBD><E6B1BE><EFBFBD>ظ<EFBFBD><D8B8>򽵼<EFBFBD><F2BDB5BC>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>
}
for(i = 0; i < 16; i++){
if (((TempPointer[i] >= '0') && (TempPointer[i] <= '9')) || ((TempPointer[i] >= 'a') && (TempPointer[i] <= 'z'))){ // <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ַ<EFBFBD>
if (MqttInfoStr.iapid[i] == TempPointer[i]){
ErrFlag++;
}
}
else{ // <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD>
ErrFlag = 16;
log_info("id[%d]<5D><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>,id=%d", i, TempPointer[i]);
break;
}
}
if (ErrFlag >= 16){ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD>ͬ<EFBFBD><CDAC>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Err = 1;
}
ErrFlag = 0;
if (Err == 0){ // <20><><EFBFBD><EFBFBD><><D7BC><EFBFBD>洢id
for (i = 0; i < 16; i++){ // <20>洢idֵ
MqttInfoStr.iapid[i] = TempPointer[i];
eepromWriteData(0, &MqttInfoStr, MQTT_STRUCT_LEN);//<2F><><EFBFBD><EFBFBD><E4BBAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>eeprom
}
}
return Err;
}
#if 0
void otaUpData(void){
uint8_t i;
char NetMessage[512]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (GetUpgradePara() == 1)
{
i = 0;
while ((Connce2TCP()) && (i < 200))
{
i++;
}
if (i < 200)
{
if (GetUpgradeFile() == 0)
{
Ping_flag = 0; // Ҫ<><D2AA><EFBFBD><EFBFBD>Ping_flag<61><67>־
Connect_flag = 0;
ConnectPack_flag = 0;
SubcribePack_flag = 0;
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD> ׼<><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\r\n");
memset(NetMessage, 0, 512 * sizeof(char)); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
sprintf(NetMessage, "AT+MSUB=\"/iot/data/up/%s\",0,0,0,\"{\\\"header\\\":\\\"iot.ota.result.post\\\",\\\"body\\\":{\\\"id\\\":\\\"%.16s\\\",\\\"success\\\":false}}\"\r\n", DEVICEID, IapFlashStuct.iapid); // <20><><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD>
TxDataBuf_Deal((u8 *)NetMessage, (strlen(NetMessage))); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
else
{
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>TCP 81<38>˿ڳ<CBBF>ʱ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>׼<EFBFBD><D7BC><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>Ź<EFBFBD><C5B9><EFBFBD>λ\r\n");
for (; i > 0; i--)
{
printf("%d", i);
delay_ms(1000);
}
}
}
else
{
Ping_flag = 0; // Ҫ<><D2AA><EFBFBD><EFBFBD>Ping_flag<61><67>־
Connect_flag = 0;
ConnectPack_flag = 0;
SubcribePack_flag = 0;
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܲ<EFBFBD><EFBFBD><EFBFBD>Bin<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD> ׼<><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\r\n");
memset(NetMessage, 0, 512 * sizeof(char)); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
sprintf(NetMessage, "AT+MSUB=\"/iot/data/up/%s\",0,0,0,\"{\\\"header\\\":\\\"iot.ota.result.post\\\",\\\"body\\\":{\\\"id\\\":\\\"%.16s\\\",\\\"success\\\":false}}\"\r\n", DEVICEID, IapFlashStuct.iapid); // <20><><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD>
TxDataBuf_Deal((u8 *)NetMessage, (strlen(NetMessage))); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
u8 GetUpgradeFile()
{
char TempStr[80];
uint8_t count = 0;
u16 i=0;
u8 UpdataOkFlag = 0;
log_info("׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\r\n"); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
while((count<30)&&(UpdataOkFlag == 0))
{
count ++;
IapStuct.GetBinFlag = 1;//<2F><>ȡBin<69>ļ<EFBFBD><C4BC><EFBFBD>־λ<D6BE><CEBB>1,<2C><>ʾ<EFBFBD><CABE><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD>жϷŴ<CFB7><C5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
IOT_RxCounter = 0;
sprintf(TempStr,"GET /ota/pull/%.20s HTTP/1.1\r\nHost: %s:81\r\n\r\n",IapStuct.iapUrl,ServerIP);
IOT_printf("%s",TempStr);
printf("<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD>%s\r\n",TempStr);
if(!WaitDownLoad(90000000))
{
IapStuct.bit2K_Pointer = 2048 - DMA_GetCurrDataCounter(DMA1_Channel6);
if(IapStuct.bit2K_Pointer != 0)
{
Crc = GetCRC(BIN_RX_BUF[IapStuct.bit2K_Select],IapStuct.bit2K_Pointer,Crc);//У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>CRC
for(i=0;i<IapStuct.bit2K_Pointer;i++)
{
printf("%.2X ",BIN_RX_BUF[IapStuct.bit2K_Select][i]);
}
printf("\r\n");
iap_write_appbin(IapStuct.BinWriteAdd,(u8 *)BIN_RX_BUF[IapStuct.bit2K_Select],IapStuct.bit2K_Pointer);//д<><D0B4>ʣ<EFBFBD>µĴ<C2B5><C4B4><EFBFBD>
}
if( IapStuct.binLength <= (Bin2KCount*2048+IapStuct.bit2K_Pointer))
{//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><E3B9BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Usart2_RxCounter = 0;
if(Crc == IapStuct.iapCrc)//CRCУ<43><D0A3>ͨ<EFBFBD><CDA8>
{
if(((*(vu32*)(FLASH_APP2_ADDR+4))&0xFF000000)==0x08000000)//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD>Ϊ0X08XXXXXX.
{
IapFlashStuct.iapCount++;//iap<61><70><EFBFBD><EFBFBD>ֵ++
IapFlashStuct.iapFlag = 1;//iap<61><70><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD>־λ<D6BE><CEBB>1
STMFLASH_Write(IAP_FLASH_ADDR,(u16*)&IapFlashStuct,((((sizeof(struct IAP_FLASH_Stuct))%2) == 0) ? ((sizeof(struct IAP_FLASH_Stuct))/2) : (((sizeof(struct IAP_FLASH_Stuct))/2)+1)));//д<><D0B4>Flash
UpdataOkFlag = 1;//<2F><><EFBFBD>Ǹ<EFBFBD><C7B8>³ɹ<C2B3>
TIM_Cmd(TIM4,ENABLE);//<2F>򿪶<EFBFBD>ʱ<EFBFBD><CAB1>4<EFBFBD><34><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ping<6E><67>ʱ<EFBFBD><CAB1>
printf("<EFBFBD>̼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!\r\n");
//printf("<22><>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>BootLoader<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BootLoader<65><72>ת<EFBFBD><D7AA><EFBFBD>ڶ<EFBFBD><DAB6>γ<EFBFBD><CEB3><EFBFBD>\r\n");
printf("<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>BootLoader<EFBFBD><EFBFBD><EFBFBD><EFBFBD>!!\r\n");
if(((*(vu32*)(FLASH_BASE_ADDR+4))&0xFF000000)==0x08000000)//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD>Ϊ0X08XXXXXX.
{
printf("<EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD><EFBFBD><EFBFBD>λϵͳ!!\r\n");
for(i=0;i<100;i++)//<2F><>ʱ100*800ms <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>Ź<EFBFBD><C5B9><EFBFBD>λ
{
delay_ms(800);
printf("%d ",i);
}
}
else
{
printf("<EFBFBD><EFBFBD>FLASHӦ<EFBFBD>ó<EFBFBD><EFBFBD><EFBFBD>,<2C>޷<EFBFBD>ִ<EFBFBD><D6B4>!\r\n");
}
}
else
{
printf("<EFBFBD>̼<EFBFBD>У<EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>\r\n");
Usart2_RxCounter = 0;
IapStuct.HttpHeadcount = 0;
IapStuct.bit2K_Pointer = 0;
IapStuct.bit2K_Select = 0;
IapStuct.HttpFlag = 0;
Bin2KCount = 0;
Crc = 0xFFFF;
IapStuct.BinWriteAdd = FLASH_APP2_ADDR;
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//ʹ<>ܽ<EFBFBD><DCBD><EFBFBD><EFBFBD>ж<EFBFBD>
memset(BIN_RX_BUF,0,2048*3);
}
}
else
{
printf("CRCУ<EFBFBD><EFBFBD>δͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><EFBFBD><EFBFBD>CRC<EFBFBD><EFBFBD>%x,<2C><>%d<>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CRCֵ<43><D6B5>%x\r\n",IapStuct.iapCrc,(Bin2KCount*2048+IapStuct.bit2K_Pointer),Crc);
Usart2_RxCounter = 0;
IapStuct.HttpHeadcount = 0;
IapStuct.bit2K_Pointer = 0;
IapStuct.bit2K_Select = 0;
IapStuct.HttpFlag = 0;
Bin2KCount = 0;
Crc = 0xFFFF;
IapStuct.BinWriteAdd = FLASH_APP2_ADDR;
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//ʹ<>ܽ<EFBFBD><DCBD><EFBFBD><EFBFBD>ж<EFBFBD>
memset(BIN_RX_BUF,0,2048*3);
}
}
else
{
printf("δ<EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>򳤶<EFBFBD>Ӧ<EFBFBD><D3A6>Ϊ%dbytes,ʵ<><CAB5><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>Ϊ%dytes\r\n",IapStuct.binLength,(Bin2KCount*2048+IapStuct.bit2K_Pointer));
Usart2_RxCounter = 0;
IapStuct.HttpHeadcount = 0;
IapStuct.bit2K_Pointer = 0;
IapStuct.bit2K_Select = 0;
IapStuct.HttpFlag = 0;
Bin2KCount = 0;
Crc = 0xFFFF;
IapStuct.BinWriteAdd = FLASH_APP2_ADDR;
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//ʹ<>ܽ<EFBFBD><DCBD><EFBFBD><EFBFBD>ж<EFBFBD>
memset(BIN_RX_BUF,0,2048*3);
}
}
else
{
printf("<EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\r\n");
}
}
return UpdataOkFlag;
}
#endif