#include "tt808.h" #include "usart.h" #include "key.h" #include #include #include #include #include "rtc.h" #include "database.h" //*整型 int rlt; uint16_t uploadtime=0; //上传时间 uint16_t hccd = 0;//ascii个数(*2) uint8_t header[12]; //处理头部 uint8_t index_2c = 0; uint8_t MIPurc[100]; //接收平台数据 uint8_t MIPurc1[100]; //接收平台数据 uint8_t MIPurcXXTCSJ[100];//平台下行透传数据 uint8_t speedBegin=0; uint8_t speedEnd=0; uint8_t speed[10]; //处理头部 uint8_t DTUurc[100]; //接收平台数据 uint8_t DTUurc1[15]; //接收平台数据 int pushpullcount = 0; double dSpeed=0; double dlatitude=0; double dlongitude=0; char cSpeed[10]; char clatitude[15]; char clongitude[15]; char csatellitesNum[5]; char MGNSSLOC[100]; //接收定位数据 char CSQ[12]; //接收定位数据 char MGNSSLOC_time[6]; //接收定位数据 uint32_t Stamp =0; uint8_t GNSSdata[40]={0}; //*结构体 TT808 tt808; extern TipsFlag tipsflag; extern Menu_table menu; extern bool refresh; //*布尔 bool authFlag = false; bool GnssFlag = false; bool Offline = false; bool Retrans = false; bool Online = false; bool reIME = false; /** 时间 纬度(北纬) 经度(东经) 水平精度因子 海拔高度 定位类型(1无,2 2d,3 3d) 运动角度 水平运动速度(KM/h) 水平运动速度(Knots) 日月年 卫星数量 差分定位标识(1单点,2差分) eg.+MGNSSLOC: 015032.301,3014.8605N,12001.9250E,1.8, 17.6, 3, 0.00, 3.6, 1.9, 080424, 12, 1 */ void reconn(void) { char TCPconnvalue[120]; TcpConn(TCPconnvalue, 1, JLPTIP, JLPTPORT,0); //cid=1 tcpConnmode=0 普通模式 if(sendCmd_4G(TCPconnvalue, "+MIPOPEN: 1,0", 1, 1)) //TCP连接 0普通模式 2缓存模式 1透传模式 { printf("重连成功\r\n"); } } uint8_t Messagetemp_length=0; uint8_t MessageHandleData[100]; //放入封装后数据 uint8_t tcppacket[100]; //消息数据 void MessageHandle(uint16_t MessageID) { Flash_ReadBytes((uint16_t*)&(tt808.LSH),tt808serialNum,1);//读取loc头部是否发生写入 if(tt808.LSH==0xFFFF) { tt808.LSH=0;//初始未写入 } uint16_t MessageAttributeData = Messagetemp_length; MessageAttributeData |= ( Messagetemp_length | (TCPJMFSNULL<<10)); // 将长度左移3位后和加密方式进行按位或操作(001 RSA ,000 无加密) header[0] = ((MessageID>>8)&0xff); header[1] = (MessageID&0xff); //消息ID header[2] = ((MessageAttributeData>>8)&0xff); header[3] = (MessageAttributeData&0xff); //消息属性 //*test phoneNumxy //*work phoneNum if(phonenull) { header[4] = 0x00; header[5] = 0x00; header[6] = 0x16; header[7] = 0x00; header[8] = 0x00; header[9] = 0x08; //“手机号” } else { header[4] = (phonenum[0]>>8)&0xff; header[5] = (phonenum[0])&0xff; header[6] = (phonenum[1]>>8)&0xff; header[7] = (phonenum[1])&0xff; header[8] = (phonenum[2]>>8)&0xff; header[9] = (phonenum[2])&0xff; //“手机号” } header[10] = ((tt808.LSH>>8)&0xff); header[11] = (tt808.LSH&0xff); int index = 0; tcppacket[index++] = TT808FLAG; // Set the headflag 0x7E for (int i = 0; i < 12; i++) { tcppacket[index++] = header[i]; } // Copy message body to packet for (size_t i = 0; i < Messagetemp_length; i++) { tcppacket[index++] = MessageHandleData[i]; } tcppacket[index++] = xorBytes(&tcppacket[1],12+Messagetemp_length);; // Set the checksum tcppacket[index++] = TT808FLAG; // Set the flag at the end for (int i = 0; i < index; i++) { printf("%02X ", tcppacket[i]); // 以十六进制格式打印每个元素 } printf("\r\n"); //#if open4G ==1 char TCPvalue[120]; char *ptr = TCPvalue; ptr += sprintf(ptr, "AT+MIPSEND=1,%d,\"",index); for (int i = 0; i < index; i++) { ptr += sprintf(ptr, "%02X", tcppacket[i]); } sprintf(ptr, "\"\r\n");//TCPvalue if(sendCmd_4G(TCPvalue, "+MIPSEND:", 1, 1))//发送 { printf("#等待回应\r\n"); } //#endif tt808.LSH+=1;//需做写入处理 Flash_WriteBytes((uint16_t*)&(tt808.LSH),tt808serialNum,1); } uint16_t swapBytes16(uint16_t value) { return (value >> 8) | (value << 8); } uint32_t swapBytes32(uint32_t value) { return ((value & 0xFF) << 24) | ((value & 0xFF00) << 8) | ((value >> 8) & 0xFF00) | ((value >> 24) & 0xFF); } /** * @breaf 消息体封装 * Message[] 消息数据; length 消息数据长度; outMessage[] 封装后消息数据; MessageID 消息ID */ uint8_t Message_bodydata(uint8_t *Message, uint8_t length, uint8_t outMessage[],uint16_t MessageID) { int index = 0; uint8_t temp_length = 0;//加首尾 25/23/crc if(MessageID==MessageID_authentication || MessageID==MessageID_heartbeat)//不加头尾(鉴权、心跳) { temp_length = length;//不加首尾 uint8_t temp_Message[temp_length]; for (int i = 0; i < length; i++) { temp_Message[index++] = Message[i]; // 将消息头拷贝到报文中 } temp_length = index; for(int i =0;i . { start_index = start; // 第start个逗号之后的字符 if (receiveStr[i] == '.') { comma_count++; } else if (comma_count == end) { end_index = i-1; // 第end个逗号之前的字符 break; } } else if(start==3 && end==4) { if (receiveStr[i] == '.') { comma_count++; if (comma_count == start) { start_index = i + 1; // 第start个逗号之后的字符 } } else if(receiveStr[i] == ':') { end_index = i; } } else if(start==4 && end==5) { if (receiveStr[i] == ':') { comma_count=4; if (comma_count == start) { start_index = i+1; // 第start个逗号之后的字符 } end_index = start_index+4; break; } } else { if (receiveStr[i] == '.') { comma_count++; if (comma_count == start) { start_index = i + 1; // 第start个逗号之后的字符 } else if (comma_count == end) { end_index = i; // 第end个逗号之前的字符 break; } } } } // 提取字符串并存储在result数组中 if (start_index != -1 && end_index != -1 && start_index < end_index) { strncpy(result, receiveStr + start_index, end_index - start_index); result[end_index - start_index] = '\0'; // 添加字符串结束符 } } double convertToDouble(char* str) { if(str == csatellitesNum) { uint8_t result; sscanf(str, "%hhu", &result); return result; } else { double result; sscanf(str, "%lf", &result); return result; } } char hex2asc(const char *hex) { char asc = 0; char a = (hex[0]>='A' && hex[0]<='F')?(hex[0]^32):hex[0]; char b = (hex[1]>='A' && hex[1]<='F')?(hex[1]^32):hex[1]; if ((a>='0' && a<='9' || a>='a' && a<='f') && (b>='0' && b<='9' || b>='a' && b<='f')){ asc = ((('a'<=a && a<='f')?(a-'a')+10:a-'0')<<4)|(('a'<=b && b<='f')?(b-'a')+10:b-'0'); } return asc; } uint8_t testHex2Asc(const char *hex) { char asc = hex2asc(hex); printf("Hex: %s\tASC: %d\n", hex, asc); return asc; } char *bin2hex(char *hex, const unsigned char *bin, int size) { size_t i; for(i=0; iheadinfo.loc_pushIndex=0; dblocptr->headinfo.loc_pullIndex=0; Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,4);//更新刻度 memset(U1_485recvBuff,0,BUFFER_SIZE); printf("更新定位刻度\r\n"); } else if(strncmp((char*)U1_485recvBuff, "DTU+JT808_IMEI=", strlen("DTU+JT808_IMEI="))==0)//修改IME号 { memcpy(DTUurc1,U1_485recvBuff+15,12); const char *hex = (const char *)DTUurc1; // 将 uint8_t * 转换为 const char * int size = strlen(hex) / 2; // 计算二进制数据的长度 unsigned char *bin = (unsigned char *)malloc(size); // 分配足够的内存用于存储二进制数据 rlt = hex2bin(bin, hex); // 调用hex2bin函数进行转换 memcpy(DTUurc, bin, rlt); // 将 bin 中的 rlt 个字节复制到 MIPurc1 中 接收到的数据放入MIPurc1中 free(bin); // 释放内存 //memset(DTUurc1,0,100); memset(U1_485recvBuff,0,BUFFER_SIZE); reIME = true; HAL_Delay(500); } else if(strncmp((char*)U1_485recvBuff, "DTU+JT808_SERVER=", strlen("DTU+JT808_SERVER="))==0) { memcpy(input_strings,U1_485recvBuff+17,20); extractStringPoint(input_strings,reIp0,0,1); extractStringPoint(input_strings,reIp1,1,2); extractStringPoint(input_strings,reIp2,2,3); extractStringPoint(input_strings,reIp3,3,4); extractStringPoint(input_strings,reIpP,4,5); ipaddr.IP0 = atoi(reIp0); ipaddr.IP1 = atoi(reIp1); ipaddr.IP2 = atoi(reIp2); ipaddr.IP3 = atoi(reIp3); ipaddr.IPp = atoi(reIpP); //printf("%d.%d.%d.%d:%d",ipaddr.IP0,ipaddr.IP1,ipaddr.IP2,ipaddr.IP3,ipaddr.IPp); HAL_StatusTypeDef writeSta = Flash_WriteBytes((uint16_t*)&(ipaddr.IP0),ReIPAddr,5); if(writeSta == HAL_OK) { char *ptr = Newip; ptr += sprintf(ptr, "%d.", ipaddr.IP0); ptr += sprintf(ptr, "%d.", ipaddr.IP1); ptr += sprintf(ptr, "%d.", ipaddr.IP2); ptr += sprintf(ptr, "%d", ipaddr.IP3); printf("更换IP成功!\r\n"); } //ptr += sprintf(ptr, ":%d", ipaddr.IPp); //printf("%s\r\n",Newip); memset(U1_485recvBuff,0,BUFFER_SIZE); HAL_Delay(500); printf("即将重启\r\n"); wdiFlag = true; } else if(strncmp((char*)U1_485recvBuff, "DTU+VER=?", strlen("DTU+VER=?"))==0) { printf("%s\r\n",version); memset(U1_485recvBuff,0,BUFFER_SIZE); } } //*工作命令 void ReMIPURC(void) { //*设备上线,发送成功 if(strncmp((char*)U4_4GrecvBuff, "+MIPOPEN: 1,0", strlen("+MIPOPEN: 1,0"))==0)//连接平台 { memset(U4_4GrecvBuff,0,BUFFER_SIZE); } ///*定位信息(MGNSS) else if(strncmp((char*)U4_4GrecvBuff, "+MGNSSURC: \"state\",1", strlen("+MGNSSURC: \"state\",1"))==0) { printf("@MGNSS设置成功\r\n"); memset(U4_4GrecvBuff,0,strlen("+MGNSSURC: \"state\",1")); } else if(strncmp((char*)U4_4GrecvBuff, "+MGNSSURC: \"state\",0", strlen("+MGNSSURC: \"state\",0"))==0)//断开平台 { printf("@主动取消GNSS\r\n"); memset(U4_4GrecvBuff,0,strlen("+MGNSSURC: \"state\",0")); } ///*定位信息(基站) else if(((strncmp((char*)U4_4GrecvBuff, "+MGNSSLOC", strlen("+MGNSSLOC"))==0) || (strncmp((char*)U4_4GrecvBuff, "OK", strlen("OK"))==0)) && MgnssFlag) //监测平台回复+MGNSSLOC OK4f4b { memcpy(MGNSSLOC,&U4_4GrecvBuff[11],75); GnssFlag=true; memset(U4_4GrecvBuff,0,BUFFER_SIZE); } ///*掉线 #if open4G ==1 else if(strncmp((char*)U4_4GrecvBuff, "+MIPURC: \"disconn\",1,1", strlen("+MIPURC: \"disconn\",1,1"))==0)//"disconn" 平台断连 { Offline=true; printf("@未发送成功,平台断开连接\r\n"); memset(U4_4GrecvBuff,0,BUFFER_SIZE); uploaweork = false; reconn();//重连 } else if((strncmp((char*)U4_4GrecvBuff, "+CPIN: SIM REMOVED", strlen("+CPIN: SIM REMOVED"))==0) || (strncmp((char*)U4_4GrecvBuff, "+CME ERROR: 10", strlen("+CME ERROR: 10"))==0) )//无SIM { //TODO printf("@SIM卡缺失\r\n"); Offline=true; signal = false; menu.current = 0xBB; tipsflag = NoSIM; refresh=true; memset(U4_4GrecvBuff,0,BUFFER_SIZE); uploaweork = false; reconn();//重连 } else if((strncmp((char*)U4_4GrecvBuff, "+MIPCALL: 1,0", strlen("+MIPCALL: 1,0"))==0))//意外断开平台连接!!!!//TCP未知错误 { //TODO Offline=true; signal = false; printf("@与平台断开连接\r\n"); memset(U4_4GrecvBuff,0,BUFFER_SIZE); uploaweork = false; reconn();//重连 } else if( (strncmp((char*)U4_4GrecvBuff, "+CME ERROR: 550", strlen("+CME ERROR: 550"))==0)) { Offline=true; signal = false; printf("@未发送成功->TCP/IP未知错误\r\n"); memset(U4_4GrecvBuff,0,BUFFER_SIZE); uploaweork = false; reconn();//重连 } else if((strncmp((char*)U4_4GrecvBuff, "+MIPOPEN: 1,571", strlen("+MIPOPEN: 1,571"))==0))//PDP激活失败 { //TODO Offline=true; printf("@未发送成功,PDP激活失败\r\n"); memset(U4_4GrecvBuff,0,BUFFER_SIZE); uploaweork = false; reconn();//重连 } #endif else if(U4_4GrecvBuff[1]== 0x43 && U4_4GrecvBuff[2]== 0x53 && U4_4GrecvBuff[3]== 0x51)//CSQ 信号 { memcpy(CSQ,U4_4GrecvBuff,U4_4GrecvLength); dblocptr->location.CSQ = (uint8_t)(CSQ[6]&0xf*10)+(CSQ[7]&0xf); memset(CSQ,0,12); memset(U4_4GrecvBuff,0,BUFFER_SIZE); } else if(strncmp((char*)U4_4GrecvBuff, "+MIPURC", strlen("+MIPURC"))==0) //监测平台回复+MIPURC: { uint8_t high_byte = (U4_4GrecvBuff[18]&0x0f) *10; uint8_t low_byte = U4_4GrecvBuff[19]&0x0f; hccd = high_byte + low_byte; memcpy(MIPurc1,&U4_4GrecvBuff[21],hccd*2); const char *hex = (const char *)MIPurc1; // 将 uint8_t * 转换为 const char * int size = strlen(hex) / 2; // 计算二进制数据的长度 unsigned char *bin = (unsigned char *)malloc(size); // 分配足够的内存用于存储二进制数据 rlt = hex2bin(bin, hex); // 调用hex2bin函数进行转换 memcpy(MIPurc, bin, rlt); // 将 bin 中的 rlt 个字节复制到 MIPurc1 中 接收到的数据放入MIPurc1中 free(bin); // 释放内存 memset(U4_4GrecvBuff,0,BUFFER_SIZE); memset(MIPurc1,0,100); } } void MIPURCHandle(void) { #if open4G == 1 if(MIPurc[0]==0x7E) { uint16_t PTXXID = MIPurc[1]<<8 | MIPurc[2]; //消息ID uint16_t xxtcLen = MIPurc[3]<<8 | MIPurc[4]; //数据长度 uint16_t xxRE = MIPurc[15]<<8 | MIPurc[16]; //回复ID uint8_t YESorNO = MIPurc[17]; //00 success ; 01 fail if(PTXXID==XXID_pttyyd) //收到平台通用应答0x8001 { if(xxRE == MessageID_authentication)//回复鉴权ID { if(YESorNO==YES) { printf("@鉴权应答yes\r\n"); authFlag = true; } else if(YESorNO==NO) { printf("@鉴权应答no\r\n"); } memset(MIPurc,0,rlt);//rlt下发长度 } else if(xxRE == MessageID_heartbeat)//回复鉴权ID { if(YESorNO==YES) { printf("@心跳应答yes\r\n"); Offline=false; //待判定假消息 Online = true; //待判定假消息 uploaweork=true; printf("@TCP连接成功!!\r\n"); } else if(YESorNO==NO) { printf("@心跳应答no\r\n"); } memset(MIPurc,0,rlt);//rlt下发长度 } else if(xxRE == MessageID_location)//回复鉴权ID { if(YESorNO==YES) { printf("@地址应答yes\r\n"); } else if(YESorNO==NO) { printf("@地址应答no\r\n"); } memset(MIPurc,0,rlt);//rlt下发长度 } } else if(PTXXID == XXID_ptxxtc) //收到平台消息透传 8900 { uint8_t tcsjLen = MIPurc[13]; memcpy(MIPurcXXTCSJ,&MIPurc[13],xxtcLen); printf("@得到透传数据,%d\r\n",tcsjLen); memset(MIPurc,0,rlt);//rlt下发长度 } } else if(authFlag) { authFlag = false; HAL_Delay(500); uint8_t test[] = {0x05}; //test心跳 tt808FsFunc(test,1,MessageID_heartbeat); //test心跳 } #endif else if(reIME) { reIME=false; phonenum[0] = DTUurc[0]<<8|DTUurc[1]; phonenum[1] = DTUurc[2]<<8|DTUurc[3]; phonenum[2] = DTUurc[4]<<8|DTUurc[5]; phonenull =false; Flash_WriteBytes(phonenum,phoneNumADDR,3);//更新ime //memset(DTUurc,0,100); printf("IME设置完成\r\n"); printf("即将重启\r\n"); wdiFlag = true; } } time_t timestamp ; void time_bj(void) { struct tm timeinfo; timeinfo.tm_year = tt808.Rtime[0]+2000-1900; timeinfo.tm_mon = tt808.Rtime[1]-1; timeinfo.tm_mday = tt808.Rtime[2]; timeinfo.tm_hour = tt808.Rtime[3]-8; timeinfo.tm_min = tt808.Rtime[4]; timeinfo.tm_sec = tt808.Rtime[5]; timestamp = mktime(&timeinfo); dblocptr->location.timeStamp = timestamp; } void ReU4Proces(void) { if(GnssFlag) { GnssFlag=false; RTCtime();//同步时间 // 调用函数提取字符串 extractString(MGNSSLOC, cSpeed,7 ,8);//采集 dSpeed = convertToDouble(cSpeed); //转换浮点数 dSpeed*=10; // 调用函数提取字符串 extractString(MGNSSLOC, clatitude,1 ,2);//采集 dlatitude = convertToDouble(clatitude); //转换浮点数 uint32_t latitudetemp=convertGPS(dlatitude); dblocptr->location.latitudeH = (latitudetemp>>16)&0xFFFF; dblocptr->location.latitudeH = swapBytes16(dblocptr->location.latitudeH);//转换H字节 dblocptr->location.latitudeL = (latitudetemp)&0xFFFF; dblocptr->location.latitudeL = swapBytes16(dblocptr->location.latitudeL);//转换L字节 extractString(MGNSSLOC, clongitude,2 ,3);//采集 dlongitude = convertToDouble(clongitude); //转换浮点数 uint32_t longitudetemp=convertGPS(dlongitude); dblocptr->location.longitudeH = (longitudetemp>>16)&0xFFFF; dblocptr->location.longitudeH = swapBytes16(dblocptr->location.longitudeH);//转换H字节 dblocptr->location.longitudeL = (longitudetemp)&0xFFFF; dblocptr->location.longitudeL = swapBytes16(dblocptr->location.longitudeL);//转换L字节 // printf("%d\r\n",dblocptr->location.latitude); // printf("%d\r\n",dblocptr->location.longitude); // printf("%08X\r\n",dblocptr->location.latitude); // printf("%08X\r\n",dblocptr->location.longitude); extractString(MGNSSLOC, csatellitesNum,10 ,11);//采集卫星个数 dblocptr->location.satellitesNum = convertToDouble(csatellitesNum); //转换浮点数 //printf("%d",tt808.satellitesNum); dblocptr->location.speed = (uint16_t)dSpeed; // if(dSpeed !=0 && dlongitude!=0 && dlatitude!=0) //有数据进行更新! // { // signal = true; // if(menu.current == 0xBB && tipsflag!= ConnOK) // { // //menu.current = 0; // refresh=true; // } // else if(tipsflag == Back && signal) // { // //menu.current = 0; // refresh=true; // } // } // else // { // if(signal && sys_mode[0]!=0xFFFF) // { // signal = false; // menu.current = 0xBB; // tipsflag = Nosignal; // refresh=true; // } // } memset(MGNSSLOC,0,100); } } //int countregular = 0; //void Regular_reporting_Loc(void) //{ // countregular+=1; // if(countregular==3 && !Offline )//在线状态10s更新状态,30s上传 (各种状态正常在线,直接上传信息) // { // countregular=0; // tt808FsFunc((uint8_t*)&(dblocptr->location.alarmFlagH), 34, MessageID_location); // } // //} //+MIPURC: "disconn",1,1 //*离线蓝牙锁