/** * * title 实现http注册 */ #include "stm32f10x.h" #include "Regist.h" #include "AT.h" #include "4GAES.h" #include "ec800m.h" #include "INflash.h" #include "sys.h" #include #include #include #include #include "cJSON.h" extern valid_data_t valid_data; uint8_t mcu_id[8]="78945678"; uint16_t Version_data = 1032; uint8_t regist_result =0; char registData[100] = {0}; //uint8_t registlen=0; extern struct AT_Struct AT; unsigned char key[17]="tuorenzhinenghua"; unsigned char expansionkey[15 * 16]; extern Coefficient_Data flashdata; extern uint8_t register_success; //static uint8_t tcpcontextID = 1; static uint8_t tcpconnectID = 2; static char * REGIST_SERVER ="8337239yf4.yicp.fun" ; //注册服务器地址 static uint16_t REGIST_PORT=22155; //端口号 /** * *注册信息打包 */ enum Result packRegistDataAnd(uint8_t *length){ enum Result result = Result_None; // int i=0; int datalen = 0; char qcciddata[31]={0};// memset(registData,0, sizeof(registData)); char* dataPtr = registData+2; //dataPtr指针指向registData第三个字节 //复制muid,并转化为16进制 byteToHexStr(mcu_id, dataPtr, sizeof(mcu_id)); memcpy(dataPtr+strlen(dataPtr),"&",1); //获取qccid AT_Clear(); //get_qccid_flag=get_qccid(qcciddata); result=ec800m.query_qccid_sync(qcciddata); if(result==Result_Failed) { return result; } //获取复制qccid memcpy(dataPtr+strlen(dataPtr),qcciddata,31); //复制版本号 snprintf(dataPtr+strlen(dataPtr),10,"&%d.%03d",Version_data/1000,Version_data%1000); Log_Printf_Debug("device data:%s\r\n",dataPtr);//串口打印 Log_Printf_Debug("regist data:%s\r\n",registData+2); ScheduleKey(key, expansionkey, 4, 10);//生成密钥 datalen = ECBAesEncrypt((unsigned char*)dataPtr, expansionkey, 10); //2、AES 加密 registData[0] = datalen>>8;//头2个字节赋值数据长度 registData[1] = datalen; Log_Printf_Debug("strlendata:%d,datalen=%d\r\n",strlen(dataPtr),datalen); *length=datalen+2; return Result_Success; } /** * *注册数据解密 */ enum Result analysis_recvdata() { enum Result result = Result_None; uint8_t recvdata[512]={0}; uint16_t recvdata_length=0; cJSON *json = NULL,*json_productKey = NULL,*json_deviceName = NULL,*json_deviceSecret = NULL; result =ec800m.recv_with_time_sync(tcpconnectID,recvdata,&recvdata_length,10000); if(result==Result_Failed) { return result; } memset(valid_data.buf, 0, sizeof(valid_data.buf)); memcpy(valid_data.buf,recvdata,recvdata_length); ScheduleKey(key, expansionkey, 4, 10); valid_data.len=recvdata_length; ECBAesDecrypt((unsigned char*)valid_data.buf,valid_data.len, expansionkey, 10);//AES 解密 json = cJSON_Parse(valid_data.buf); if(!json) { Log_Printf_Debug("json parse error,%s\r\n",cJSON_GetErrorPtr()); cJSON_Delete(json); cJSON_Delete(json_productKey); cJSON_Delete(json_deviceName);//json_deviceSecret cJSON_Delete(json_deviceSecret); return Result_Failed; }else{ json_deviceSecret = cJSON_GetObjectItem(json,"deviceSecret"); json_productKey = cJSON_GetObjectItem(json,"productKey"); json_deviceName = cJSON_GetObjectItem(json,"deviceName"); Log_Printf_Debug("获取数据成功deviceSecret:%s,json_productKey:%s,deviceName:%s\r\n",json_deviceSecret->valuestring,json_productKey->valuestring,json_deviceName->valuestring); memcpy(flashdata.deviceSecret,json_deviceSecret->valuestring,Secretsize); memcpy(flashdata.productKey,json_productKey->valuestring,productsize); memcpy(flashdata.deviceName,json_deviceName->valuestring,productsize); memset(®ister_success, 1, sizeof(register_success)); cJSON_Delete(json); cJSON_Delete(json_productKey); cJSON_Delete(json_deviceName);//json_deviceSecret cJSON_Delete(json_deviceSecret); return Result_Success; } } uint8_t regist_Handle() { uint8_t stat,length=0; uint16_t lac,err=0; uint32_t ci=0; enum Result result = Result_None; ec800m.enter_sleep();//退出休眠 result=ec800m.set_sleep_sync(1);//设置休眠模式 if(result==Result_Failed) { return 0; } result=ec800m.set_cfun_sync(1);//设置全功能模式 if(result==Result_Failed) { return 0; } result=ec800m.set_cgreg_sync(2);//设置网络状态 if(result==Result_Failed) { return 0; } for(int i=0;i<20;i++){ delay_ms(400); result=ec800m.query_cgreg_sync(®ist_result,&stat,&lac,&ci);//循环查询网络状态最多20次 if(stat==1) {i=20; } } if(result==Result_Failed) { return 0; } if(stat==0) { Log_Printf_Debug(" stat=%d\r\n", stat); return 0; } //tcp连接流程 result=ec800m.open_socket_sync(tcpconnectID,"TCP",REGIST_SERVER,REGIST_PORT,1,&err);//连接tcp if(result==Result_Failed) { Log_Printf_Debug(" result=%d\r\n", result); return 0; } if(result==Result_Failed) { return 0; } result =(enum Result)packRegistDataAnd(&length);//数据打包 Log_Printf_Debug("data length=%d\r\n", length); if(result==Result_Failed) { return 0; } result =ec800m.send_sync(tcpconnectID,(uint8_t *)registData,length);//数据发送 if(result==Result_Failed) { return 0; } result =analysis_recvdata(); if(result==Result_Failed) { return 0; } result=ec800m.close_socket_sync(tcpconnectID);//断开tcp连接 if(result==Result_Failed) { return 0; } result=ec800m.set_cfun_sync(0);//设置最小功能模式 if(result==Result_Failed) { return 0; } ec800m.enter_sleep();//进入休眠状态 return 1; } uint8_t regist_device(void) { flashdata.read_flag=0; uint8_t regist_flag=0; Log_Printf_Debug("读取前read_flag:%d\r\n",flashdata.read_flag); STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)&flashdata,sizeof(flashdata));//读取flash delay_ms(10); if(flashdata.read_flag==1) { Log_Printf_Debug("读取flash成功read_flag:%d,\ndeviceSecret:%s,\n productKey:%s,\ndeviceName:%s\r\n",flashdata.read_flag,flashdata.deviceSecret,flashdata.productKey,flashdata.deviceName); return 1; } regist_flag=regist_Handle();//注册流程 if(regist_flag==0)//注册流程失败不储存flash { return 0; } store();//存储到flash return 1; }