#include "CONFIG.h" #if EC800M /** ****************************************************************************** * 版 本 :V1.0.0 * 作 者 :liuyanbin * 版权所有,盗版必究。 * Copyright(C) All rights reserved ****************************************************************************** * 历史记录 * 序号 版本 变更内容 作者 日期 * 1 V0.0.1 实现4G注册 刘艳斌 2023/12/20 * 2 V0.0.2 实现NB注册 刘艳斌 2023/12/20 * 3 V0.0.3 整合4g和nb 刘艳斌 2024/1/24 * ****************************************************************************** */ #include "stm32f10x.h" #include "Regist.h" #include "ec800m.h" #include "INflash.h" #include #include #include #include #include "cJSON.h" #include "Delay.h" #include "mbedtls_util.h" #include "Log_Module.h" #include "At_Module.h" #include "Common_Util.h" #include "Tuoreniot.h" static uint8_t mcu_id[8]="8945809"; static uint16_t Version_data = 1032; static uint8_t regist_result =0; static uint8_t register_status;//注册成功,向flash存储标志 //unsigned char key[17]="tuorenzhinenghua"; static Coefficient_Data flashdata; static uint8_t tcpconnectID = 2; static char * REGIST_SERVER ="8337239yf4.yicp.fun" ; //注册服务器地址 static uint16_t REGIST_PORT=22155; //端口号 static char qcciddata[31]={0};// //char registData[100] = {0}; static char recvdata[512]={0};//和registData共用 //清空flash void clearflash(void){ flashdata.read_flag=0; memcpy(flashdata.deviceSecret,"0",40); memcpy(flashdata.productKey,"0",20); memcpy(flashdata.deviceName,"0",20); delay_ms(10); STMFLASH_Write(FLASH_SAVE_ADDR,(uint16_t*)&flashdata,sizeof(flashdata)); } void storedata(void){ flashdata.read_flag=1; Log_Printf_Debug("###########\r\n"); Log_Printf_Debug("deviceSecret:%s,productKey:%s,deviceName:%s,read_flag:%d\r\n",flashdata.deviceSecret,flashdata.productKey,flashdata.deviceName,flashdata.read_flag); Log_Printf_Debug("结构体大小: %d\r\n", sizeof(Coefficient_Data)); delay_ms(10); STMFLASH_Write(FLASH_SAVE_ADDR,(uint16_t*)&flashdata,sizeof(flashdata)); flashdata.read_flag=0; delay_ms(10); Log_Printf_Debug("写入数据完成\r\n"); STMFLASH_Read(FLASH_SAVE_ADDR,(uint16_t*)&flashdata,sizeof(flashdata)); Log_Printf_Debug("读取完成read_flag:%d,deviceSecret:%s,productKey:%s,deviceName:%s\r\n",flashdata.read_flag,flashdata.deviceSecret,flashdata.productKey,flashdata.deviceName); } ///** //* //*注册信息打包 //*/ //enum Result packRegistDataAnd(uint8_t *length){ // enum Result result = Result_None; // // //// int i=0; // int datalen = 0; // memset(qcciddata,'\0',sizeof(qcciddata)); // memset(recvdata,'\0', sizeof(recvdata)); // char* dataPtr = recvdata+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,%d\r\n",dataPtr,strlen(dataPtr));//串口打印 // Log_Printf_Debug("regist data:%s\r\n",recvdata+2); // datalen = utils_aes128_ECB_base64_enc_with_length((char *)key,(uint8_t *)dataPtr); // recvdata[0] = datalen>>8;//头2个字节赋值数据长度 // recvdata[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; unsigned char key[17]="tuorenzhinenghua"; uint16_t recvdata_length=0; cJSON *json = NULL,*json_productKey = NULL,*json_deviceName = NULL,*json_deviceSecret = NULL; memset(recvdata, '\0', sizeof(recvdata)); result =ec800m.recv_with_time_sync(tcpconnectID,(uint8_t *)recvdata,&recvdata_length,10000); if(result==Result_Failed) { return result; } Log_Printf_Debug("recvdata:%d",strlen(recvdata)); utils_aes128_ECB_base64_dec((char *)key,(unsigned char*)recvdata,recvdata_length); Log_Printf_Debug("解密数据recvdata:%s,%d,%d\r\n",recvdata,strlen(recvdata),recvdata_length); json = cJSON_Parse(recvdata); if(!json) { Log_Printf_Debug("json parse error,%s\r\n",cJSON_GetErrorPtr()); cJSON_Delete(json); 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); strcpy(flashdata.deviceSecret,json_deviceSecret->valuestring); strcpy(flashdata.productKey,json_productKey->valuestring); strcpy(flashdata.deviceName,json_deviceName->valuestring); memset(®ister_status, 1, sizeof(register_status)); cJSON_Delete(json); return Result_Success; } } //4G模块注册流程 uint8_t regist_Handle() { uint8_t stat,length=0; uint16_t lac,err=0; uint32_t ci=0; enum Result result = Result_None; ec800m.exit_sleep();//退出休眠 delay_ms(10); result=ec800m.set_sleep_sync(1);//设置休眠模式 if(result==Result_Success) { result=ec800m.set_cfun_sync(1);//设置全功能模式 } if(result==Result_Success) { result=ec800m.set_cgreg_sync(2);//设置网络状态 } if(result==Result_Success) { 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_Success&&stat==1) { //tcp连接流程 result=ec800m.open_socket_sync(tcpconnectID,"TCP",REGIST_SERVER,REGIST_PORT,1,&err);//连接tcp } if(result==Result_Success) { result=ec800m.query_qccid_sync(qcciddata); } if(result==Result_Success) { memset(qcciddata,'\0',sizeof(qcciddata)); memset(recvdata,'\0', sizeof(recvdata)); length = sizeof(mcu_id); result =(enum Result)packRegistDataAnd(&length,qcciddata,recvdata,mcu_id,Version_data);//数据打包 Log_Printf_Debug("data length=%d\r\n", length); Log_Printf_Debug("recvdata:%s\r\n", recvdata); } if(result==Result_Success) { result = ec800m.set_qisde_sync(0);//关闭回显 } if(result==Result_Success) { result =ec800m.send_sync(tcpconnectID,(uint8_t *)recvdata,length);//数据发送 } if(result==Result_Success) { result =analysis_recvdata(); } if(result==Result_Success) { result=ec800m.close_socket_sync(tcpconnectID);//断开tcp连接 } ec800m.set_cfun_sync(0);//设置最小功能模式 ec800m.enter_sleep();//进入休眠状态 if(result==Result_Success) { return 1; } else { return 0; } } uint8_t regist_device_sync(void) { flashdata.read_flag=0; uint8_t regist_flag=0; //读取flash Log_Printf_Debug("读取前read_flag:%d\r\n",flashdata.read_flag); STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)&flashdata,sizeof(flashdata));//读取flash delay_ms(10); //已经注册。读取flash成功 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); register_status=1; return 1; } //未注册开始注册流程 regist_flag=regist_Handle();//注册流程 if(regist_flag==0)//注册流程失败不储存flash { flashdata.read_flag=0; register_status=0; clearflash(); return 0; } //注册成功向flash储存 if(register_status==1){ storedata();//存储到flash return 1; } else { Log_Printf_Debug("注册失败。。。regist_flag:%d,register_status:%d\r\n",regist_flag,register_status); return 0; } } enum Regist_Result regist_get_result(void) { if(register_status){ return Regist_Result_Success; } else { return Regist_Result_Failure; } } char * regist_get_aliyun_productKey(void) { return flashdata.productKey; } char * regist_get_aliyun_deviceName(void) { return flashdata.deviceName; } char * regist_get_aliyun_deviceSecret(void) { return flashdata.deviceSecret; } #endif