#include "includes.h" /* 文件描述 1、主要处理终端与DTU之间的授权功能所需要的通讯逻辑 2、终端在正确下载完APP后,如果未进行授权,会自动跳到授权的任务中,直到授权成功 3、授权码产生算法存在于本设备及服务器中 4、终端启动后会读取MCU内存中的授权码,并与使用MCU ID进行加密码得出的授权码进行比对,不一样则未授权 */ #define UNIQUE_ID_BYTES 12 #define TAKE_PRINT_FLAG 1 uint32_t auth_seg_addr,iap_temp_addr,app_seg_addr; uint16_t this_dev_page_size,this_dev_flash_size; unsigned char SlaveNum; unsigned char AuthIng; //获取唯一ID接口 typedef enum{ STM32F0,STM32F1,STM32F2,STM32F3,STM32F4,STM32F7, STM32L0,STM32L1,STM32L4, STM32H7, STM_END }STM32_MCU_DEF; unsigned int mcustartAddr[STM_END]= { 0x1FFFF7AC,/*STM32F0*/ 0x1FFFF7E8,/*STM32F1*/ 0x1FFF7A10,/*STM32F2*/ 0x1FFFF7AC,/*STM32F3*/ 0x1FFF7A10,/*STM32F4*/ 0x1FF0F420,/*STM32F7*/ 0x1FF80050,/*STM32L0*/ 0x1FF80050,/*STM32L1*/ 0x1FFF7590,/*STM32L4*/ 0x1FF0F420 /*STM32H7*/ }; void GetSTM32_McuID(unsigned char *id,STM32_MCU_DEF type) { unsigned char i; if(id==NULL) return; for(i=0;i>8; //4-5 sendbuf[i++]=liushui; for(k=0;kSlaveNum=*dataPtr; //write new auth authInfo->authCode=codeData; //make lier data for(i=0;inoUseStart);i++){ authInfo->noUseStart[i]=*dataPtr++^data[6]; if(dataPtr>=&data[len]) dataPtr=data; } for(i=0;inoUseEnd);i++){ authInfo->noUseEnd[i]=*dataPtr++^data[4]; if(dataPtr>=&data[len]) dataPtr=data; } // WritePageData(auth_seg_addr,(unsigned char *)authInfo,sizeof(AUTH_INFO)); WritePageData(AUTH_PARA_ADDR,(unsigned char *)authInfo,sizeof(AUTH_INFO)); printf("newAuthInfo:%08x,targetcode:%08x\r\n",codeData,targetcode); if(codeData == targetcode){//当激活码与本地算的一致时 return 0; }else return 4;//当激活码与本地算的不一致时 } //根据MCU的FLASH容量大小判断出page大小,然后得到激活段与升级临时段的起始地址 void GetStartAddrByFlashSize(void) { #if 1 auth_seg_addr=0x8000000+124*1024; #else this_dev_flash_size=*(uint16_t *)(0x1FFFF7E0);//获取FLASH容量 if(this_dev_flash_size <= 128) this_dev_page_size=2048; else this_dev_page_size=2048; //取得激活码段起始地址 auth_seg_addr=APP_CONFIG_ADDR+this_dev_page_size; //取得临时段起始地址 iap_temp_addr=auth_seg_addr+this_dev_page_size; //取得APP应用起始地址 app_seg_addr=iap_temp_addr+this_dev_page_size; if(app_seg_addr % 2048) app_seg_addr += 1024;//跳转地址需要是页大小的倍数 //printf("addr:%08x,%08x,%08x\r\n",auth_seg_addr,iap_temp_addr,app_seg_addr); #endif } //void reInitUart1(void) //{//关闭IDLE中断,打开NE中断 // USART_ITConfig(USART1, USART_IT_IDLE, DISABLE); // USART_DMACmd(USART1,USART_DMAReq_Rx,DISABLE); // USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // rx1_ct=0; // g_usUart1RecvLen=0; //} void authLink() { unsigned int i=0; AUTH_INFO authInfo; unsigned char id[UNIQUE_ID_BYTES]; //unsigned char id[UNIQUE_ID_BYTES]={1,2,3,4,5,6,7,8,9,1,1,2}; unsigned int encodeValue; unsigned char senddata[100]; unsigned int len; char ret; unsigned char j=0; unsigned char handshake=0; GetSTM32_McuID(id, STM32F0); #if(TAKE_PRINT_FLAG) printf("ID[%d]:",UNIQUE_ID_BYTES); for(i=0;i= 1000*3000) { if(!handshake)j++; i=0; } if(j>3)break; IWDG_ReloadCounter();//喂狗 ////// //os_dly_wait(100); if(m_usart1.g_usUartRecvLen==0) continue; ret=decodeAuthInfo(m_usart1.RxBuffer,m_usart1.g_usUartRecvLen,encodeValue,&authInfo); if(0==ret){ authSendCmd(PRO_AUTH_OK,id,UNIQUE_ID_BYTES); break; }else if(4==ret){//鉴权码不正确 authSendCmd(PRO_AUTH_FAI,id,UNIQUE_ID_BYTES); }else if(5==ret){//握手成功 handshake=1; }else if(6==ret){ //请求基本数据 authSendCmd(PRO_AUTH_REQ,senddata,UNIQUE_ID_BYTES+16+16); } m_usart1.g_usUartRecvLen=0; } //read encode in flash ReadFlashData(AUTH_PARA_ADDR,(unsigned char *)&authInfo,sizeof(AUTH_INFO)); if(authInfo.authCode == encodeValue) { SlaveNum=authInfo.SlaveNum; printf("SlaveNum===%d\r\n",SlaveNum); return; } while(1){ IWDG_ReloadCounter();//喂狗 ///// //os_dly_wait(100); if(++i >= 1000*3000){ i=0; printf("please try auth-------------------\r\n"); } } }