#include "tt808.h" #include "usart.h" #include #include "rtc.h" #include //BYTE uint8_t //WORD uint16_t //DWORD uint32_t TT808 tt808; TCPCenterD tcpd; TCPClientD tcpc; bool XTflag = false; RTC_DateTypeDef GetData; //获取日期结构体 RTC_TimeTypeDef GetTime; //获取时间结构体 void newpacket(uint8_t *head,uint8_t *body,uint8_t outarr[]); void packageData(uint8_t flag, uint8_t *head, uint8_t *body, size_t bodylength, uint8_t *escaped_data, size_t *new_length); void tt808test(uint8_t* Bodyxxt, size_t bodylength, uint8_t XXLSH); // 发送一包内容为0x30 0x7e 0x08 0x7d 0x55的数据包,则经过封装如下:0x7e 0x30 0x7d 0x02 0x08 0x7d 0x01 0x55 0x7e extern RTC_HandleTypeDef hrtc; extern Time time; void RTCtime(void) { HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN); /* Get the RTC current Date */ HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN); time.tt[0] = GetData.Year; time.tt[1] = GetData.Month; time.tt[2] = GetData.Date; time.tt[3] = GetTime.Hours; time.tt[4] = GetTime.Minutes; time.tt[5] = GetTime.Seconds; } /**消息结构 * 标识位 消息头 消息体 校验码 标识位 * 0x7e 11BYTE MORE 1BYTE 0x7e * */ /**消息头 * * 消息ID(WORD) 消息体属性(WORD) 终端ID(BCD[6]) 消息流水号(WORD) * (0 1) (2 3) (4 5 6 7 8 9) (10 11) */ /**消息体属性 * * 消息体长度 数据加密方式 分包 保留 * (0 1 2 3 4 5 6 7 8 9) (10 11 12) 13 (14 15) */ // 校验码指从消息头开始,同后一字节异或,直到校验码前一个字节,占用一个字节。 void printBinary(uint16_t num) { for (int i = 15; i >= 0; i--) { if (num & (1u << i)) { printf("1"); } else { printf("0"); } } printf("\n"); } typedef struct Node { uint8_t data; struct Node* next; } Node; Node* createNode(uint8_t value) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = value; newNode->next = NULL; return newNode; } void insertAfter(Node* prevNode, uint8_t value) { Node* newNode = createNode(value); newNode->next = prevNode->next; prevNode->next = newNode; } uint8_t escaped_data[100]; // 定义足够大的数组存储转义后的数据 void escape_data(uint8_t* input, int length, uint8_t* escaped_data, size_t* new_length) { *new_length = 0; Node* head = createNode(input[0]); // 创建链表头节点 Node* current = head; escaped_data[(*new_length)++] = input[0]; // 将第一个数据直接存入 for (int i = 1; i < length; i++) { if (input[i] == 0x7E && (i != length - 1)) { escaped_data[(*new_length)++] = 0x7D; escaped_data[(*new_length)++] = 0x02; } else if (input[i] == 0x7D) { escaped_data[(*new_length)++] = 0x7D; escaped_data[(*new_length)++] = 0x01; } else { escaped_data[(*new_length)++] = input[i]; } } // 释放链表内存 current = head; Node* temp; while (current != NULL) { temp = current; current = current->next; free(temp); } } //uint8_t escaped_data[100]; // 假设足够大来存储转义后的数据 size_t new_length = 0; // 数据封装函数 void packageData(uint8_t flag, uint8_t *head, uint8_t *body, size_t bodylength, uint8_t *escaped_data, size_t *new_length) { // Calculate total length uint8_t len = 1 + 12 + bodylength + 1 + 1; // 1 byte for flag + 10 bytes for header + body length + 1 byte for checksum + 1 byte for flag uint8_t checksum = 0; // Initialize checksum // Calculate checksum from message header for (int i = 0; i < 12; i++) { checksum ^= head[i]; } for (int i = 0; i < bodylength; i++) { checksum ^= body[i]; } // Start building the packet uint8_t packet[len]; int index = 0; packet[index++] = flag; // Set the flag // Copy message header to packet for (int i = 0; i < 12; i++) { packet[index++] = head[i]; } // Copy message body to packet for (size_t i = 0; i < bodylength; i++) { packet[index++] = body[i]; } packet[index++] = checksum; // Set the checksum packet[index++] = flag; // Set the flag at the end int packetlength = (sizeof(packet)/sizeof(packet[0])); // 执行转义处理 escape_data(packet, packetlength, escaped_data, new_length); // 输出转义后的数据 // for (int i = 0; i < *new_length; i++) { // printf("%02X ", escaped_data[i]); // } // printf("\n"); // char TCPvalue[128]; // char *ptr = TCPvalue; // ptr += sprintf(ptr, "AT+MIPSEND=1,%d,\"",sizeof(escaped_data)); // for (int i = 0; i < sizeof(escaped_data); i++) { // ptr += sprintf(ptr, "%02X", escaped_data[i]); // } // sprintf(ptr, "\"\r\n");//TCPvalue // if(sendCmd_4G(TCPvalue, "+MIPSEND:", 1, 3))//发送11BYTE MAX1460 // //if(sendCmd_4G("AT+MIPSEND=1,11,\"12345678900\"\r\n", "+MIPSEND:", 1, 3))//发送11BYTE MAX1460 // { // printf("#发送完成\r\n"); // } // memset(cmd_replyArray,0,sizeof(cmd_replyArray)); // memcpy(cmd_replyArray,escaped_data,*new_length); } void reCenter(void); uint16_t xxid =0 ; uint8_t BusinessData[256] = {0}; // 定义业务数据数组 uint8_t TCPCenterCrc=0; /** * @breaf 目前监测 U1485标志位 0x7E 0x2A 0x23 0x7E */ bool U4re =false; bool newmac=false; bool genghaunmac =false; uint8_t BDmacNum =0; extern Menu_table menu; void newMacchange(uint8_t MIPurc1[]) { //conn AT+CONN=101000000010\r\n //connected +CONNECTED:0,101000000010 //dis +DISCONN:0,101000000010 //snnum 0010 BDmacNum = MIPurc1[17];//绑定的L1 uint16_t mac = (MIPurc1[20] << 8) | MIPurc1[21]; //eg 0010 // char SNconn[25]; // char *ptr = SNconn; // ptr += sprintf(ptr, "AT+CONN=1010"); // for (int i = 18; i < 22; i++) { // ptr += sprintf(ptr, "%02X", MIPurc1[i]); // } // sprintf(ptr, "\r\n");//TCPvalue // // char SNF[25]; // char *ptr1 = SNF; // ptr1 += sprintf(ptr1, "+CONNECTED:0,1010"); // for (int i = 18; i < 22; i++) { // ptr1 += sprintf(ptr1, "%02X", MIPurc1[i]); // } // //sprintf(ptr, "\r\n");//TCPvalue // // // char SNname[2]; // char *ptr2 = SNname; // for (int i = 20; i < 22; i++) { // ptr2 += sprintf(ptr2, "%02X", MIPurc1[i]); // } // //sprintf(ptr, "\r\n");//TCPvalue // // char SND[25]; // char *ptr3 = SND; // ptr3 += sprintf(ptr3, "+DISCONN:0,1010"); // for (int i = 18; i < 22; i++) { // ptr3 += sprintf(ptr3, "%02X", MIPurc1[i]); // } if(BDmacNum==0x01)//M1 { //xxid=0; menu.SN1name=NULL; menu.SN1=NULL; menu.SN1F=NULL; menu.SN1D=NULL; erase_flash(Sn1StatusAddr); erase_flash(Sn1Addr); erase_flash(serialNum1Addr); // menu.SN1 = SNconn;//AT+CONN=*********\r\n // menu.SN1F = SNF;//+CONNECTED:0,101000000010 // menu.SN1name = SNname; // menu.SN1D = SND; Write_Information(Sn1Addr, mac); menu.home &= 0x0FFF; } else if(BDmacNum==0x02)//M2 { menu.SN2name=NULL; menu.SN2=NULL; menu.SN2F=NULL; menu.SN2D=NULL; erase_flash(Sn2StatusAddr); erase_flash(Sn2Addr); erase_flash(serialNum2Addr); // menu.SN2 = SNconn;//AT+CONN=*********\r\n // menu.SN2F = SNF;//+CONNECTED:0,101000000010 // menu.SN2name = SNname; // menu.SN2D = SND; Write_Information(Sn2Addr, mac); menu.home &= 0xF0FF; } else if(BDmacNum==0x03)//M3 { menu.SN3name=NULL; menu.SN3=NULL; menu.SN3F=NULL; menu.SN3D=NULL; erase_flash(Sn3StatusAddr); erase_flash(Sn3Addr); erase_flash(serialNum3Addr); // menu.SN3 = SNconn;//AT+CONN=*********\r\n // menu.SN3F = SNF;//+CONNECTED:0,101000000010 // menu.SN3name = SNname; // menu.SN3D = SND; Write_Information(Sn3Addr, mac); menu.home &= 0xFF0F; } else if(BDmacNum==0x04)//M4 { menu.SN4name=NULL; menu.SN4=NULL; menu.SN4F=NULL; menu.SN4D=NULL; erase_flash(Sn4StatusAddr); erase_flash(Sn4Addr); erase_flash(serialNum4Addr); // menu.SN4 = SNconn;//AT+CONN=*********\r\n // menu.SN4F = SNF;//+CONNECTED:0,101000000010 // menu.SN4name = SNname; // menu.SN4D = SND; Write_Information(Sn4Addr, mac); menu.home &= 0xFFF0; } readLockStatusinit(); // scanMac(); } uint8_t hext[100]={0}; uint8_t cmd_replyArray[] = {0}; uint32_t DTUID=0x64747531; uint16_t length; void wsj(uint8_t flag); void tcphuifu(void); int tcpdataLength = 0; void wjwd(void); uint8_t MIPurc[100]; uint8_t MIPurc1[100]; uint8_t MIPurcXXTCSJ[100];//平台下行透传数据 bool MIPurcReFlag = false; uint16_t hccd = 0; char high[]={0}; bool chuliSJ = false; 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; } char *bin2hex(char *hex, const unsigned char *bin, int size) { size_t i; for(i=0; i>8)&0xff); header[1] = (XXID&0xff); header[2] = ((XXTSXdata>>8)&0xff); header[3] = (XXTSXdata&0xff); header[4] = 0x00; header[5] = 0x00; header[6] = 0x16; header[7] = 0x00; header[8] = 0x00; header[9] = 0x08; header[10] = ((tt808.LSH>>8)&0xff);; header[11] = (tt808.LSH&0xff);; int index = 0; tcppacket[index++] = TT808FLAG; // Set the flag for (int i = 0; i < 12; i++) { tcppacket[index++] = header[i]; } // Copy message body to packet for (size_t i = 0; i < xxtnewlength; i++) { tcppacket[index++] = xxtfz[i]; } tcppacket[index++] = xorBytes(&tcppacket[1],12+xxtnewlength);; // Set the checksum tcppacket[index++] = TT808FLAG; // Set the flag at the end // for (int i = 0; i < index; i++) { // printf("%02X ", tcppacket[i]); // 以十六进制格式打印每个元素 // } char TCPvalue[100]; 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))//发送11BYTE MAX1460 { printf("#发送完成\r\n"); } tt808.LSH+=1; } /*需要传入消息体长度sizeof(xxt)/sizeof(xxt[0]);*/ void tt808FsFunc(uint8_t xxt[], uint8_t xxtlength, uint16_t XXID) { xxtnewlength = xxtFZ(xxt, xxtlength, xxtfz, XXID); chuli(XXID); } void ReMLBSLOC(void) { if(g_ML307A_8buf_Down[1]==0x4D && g_ML307A_8buf_Down[2]==0x4C && g_ML307A_8buf_Down[3]==0x42 \ && g_ML307A_8buf_Down[4]==0x53 && g_ML307A_8buf_Down[5]==0x4C && g_ML307A_8buf_Down[6]==0x4F \ && g_ML307A_8buf_Down[7]==0x43 && g_ML307A_8buf_Down[8]==0x3A)//检测MLBSLOC:定位 { memcpy(JD_str, &g_ML307A_8buf_Down[14], 12); memcpy(WD_str, &g_ML307A_8buf_Down[27], 11); double num; double num1; num = atof(JD_str); num1 = atof(WD_str); num = num* 1000000; num1= num1* 1000000; JD_dw = (uint32_t)num; WD_dw = (uint32_t)num1; } } void ReMIPURC(void) { //4D 49 50 55 52 43 if(g_ML307A_8buf_Down[1]==0x4D && g_ML307A_8buf_Down[2]==0x49 && g_ML307A_8buf_Down[3]==0x50 \ && g_ML307A_8buf_Down[4]==0x55 && g_ML307A_8buf_Down[5]==0x52 && g_ML307A_8buf_Down[6]==0x43 ) //监测平台回复 { uint8_t high_byte = (g_ML307A_8buf_Down[18]&0x0f) *10; uint8_t low_byte = g_ML307A_8buf_Down[19]&0x0f; hccd = high_byte + low_byte; memcpy(MIPurc,&g_ML307A_8buf_Down[21],hccd*2); const char *hex = (const char *)MIPurc; // 将 uint8_t * 转换为 const char * int size = strlen(hex) / 2; // 计算二进制数据的长度 unsigned char *bin = (unsigned char *)malloc(size); // 分配足够的内存用于存储二进制数据 rlt = hex2bin(bin, hex); // 调用hex2bin函数进行转换 memcpy(MIPurc1, bin, rlt); // 将 bin 中的 rlt 个字节复制到 MIPurc1 中 接收到的数据放入MIPurc1中 free(bin); // 释放内存 memset(g_ML307A_8buf_Down,0,u4length); } } uint16_t nowMac1; uint16_t nowMac2; uint16_t nowMac3; uint16_t nowMac4; extern BtFrame btframe; extern void close_lock(BtFrame btframe); extern void open_lock(BtFrame btframe); uint8_t WbscLength =0;//数据长度 uint8_t WbscCmd = 0;//指令代码 0x32 uint16_t WbscHmac = 0;//高位mac uint16_t WbscLmac = 0;//低位mac bool Ptsjf = false; extern bool locDw; bool Timetb=false; bool JQflag = false; uint8_t sjfNowStatus = 0; void MIPURCHandle(void) { if(MIPurc1[0]==0x7E) { uint16_t PTXXID = MIPurc1[1]<<8 | MIPurc1[2]; //消息ID uint16_t xxtcLen = MIPurc1[3]<<8 | MIPurc1[4]; //数据长度 uint16_t xxRE = MIPurc1[15]<<8 | MIPurc1[16]; //回复ID uint8_t YESorNO = MIPurc1[17]; //00 success ; 01 fail if(PTXXID==XXIDpttyyd) //收到平台通用应答0x8001 { if(xxRE == XXIDzdjq)//回复鉴权ID { if(YESorNO==YES) { //printf("@鉴权应答yes\r\n"); JQflag = true; } else if(YESorNO==NO) { //printf("@鉴权应答no\r\n"); } memset(MIPurc1,0,rlt);//rlt下发长度 } else if(xxRE==XXIDzdxt)//回复心跳ID { if(YESorNO==YES) { //printf("@心跳应答yes\r\n"); XTflag = true; if(!Timetb) { wsj(0); } locDw = true; } else if(YESorNO==NO) { //printf("@心跳应答no\r\n"); } memset(MIPurc1,0,rlt);//rlt下发长度 } else if(xxRE==XXIDzddz)//回复地址ID { if(YESorNO==YES) { //printf("@地址应答yes\r\n"); } else if(YESorNO==NO) { //printf("@地址应答no\r\n"); } memset(MIPurc1,0,rlt);//rlt下发长度 } else if(xxRE==XXIDwbsc) //收到平台施解封命令0x0300 { if(YESorNO==YES) { //printf("@文本上传回复yes\r\n"); } else if(YESorNO==NO) { //printf("@文本上传回复no\r\n");; } memset(MIPurc1,0,rlt);//rlt下发长度 } } else if(PTXXID == XXIDptxxtc) //收到平台消息透传 8900 { uint8_t tcsjLen = MIPurc1[13]; memcpy(MIPurcXXTCSJ,&MIPurc1[13],xxtcLen); printf("@得到透传数据,%d\r\n",tcsjLen); JQflag = true; // time.tt[0] = MIPurcXXTCSJ[22]; // time.tt[1] = MIPurcXXTCSJ[23]; // time.tt[2] = MIPurcXXTCSJ[24]; // time.tt[3] = MIPurcXXTCSJ[25]; // time.tt[4] = MIPurcXXTCSJ[26]; // time.tt[5] = MIPurcXXTCSJ[27]; // // // tongbushijian(time.tt[0], time.tt[1], time.tt[2], time.tt[3], time.tt[4], time.tt[5]); //Timetb=true; memset(MIPurc1,0,rlt);//rlt下发长度 // memset(MIPurcXXTCSJ,0,xxtcLen);//rlt下发长度 } // 标头 消息ID 消息体属性 电话号 流水号 长度+2A 操作+CMD MAC号 gate1b+bill8b+linecode2b+key6b+vaildtime1b+备用4b+时间6b 23+流水号2b+校验 else if(PTXXID==XXIDwbsc) //收到平台文本上传 eg.+MIPURC: "rtcp",1,50,7E 0300 0046 000016000008 2890 282A 1532 00000010 00 0000000000000000 0000 000000000000 00 00000000 230001220000 23 0001 99 7E { //printf("@得到平台施解封数据\r\n"); nowMac1 = locksnu8.L1snT8[0]<<8 | locksnu8.L1snT8[1];//L1绑定的低字节&0xff nowMac2 = locksnu8.L2snT8[0]<<8 | locksnu8.L2snT8[1];//L2绑定的低字节&0xff nowMac3 = locksnu8.L3snT8[0]<<8 | locksnu8.L3snT8[1];//L3绑定的低字节&0xff nowMac4 = locksnu8.L4snT8[0]<<8 | locksnu8.L4snT8[1];//L4绑定的低字节&0xff WbscLength = MIPurc1[13];//数据长度 WbscCmd = MIPurc1[16];//指令代码 0x32 WbscHmac = MIPurc1[17] << 8 | MIPurc1[18];//高位mac WbscLmac = MIPurc1[19] << 8 | MIPurc1[20];//低位mac if(WbscCmd==0x32)//1532 { SET_MENU_STATUS(0,0,0,0); HAL_Delay(400); enterInterface_time = HAL_GetTick(); printf("@得到平台施封数据,ID:%04x\r\n",WbscLmac); XTflag = false; locDw = false; if(nowMac1 == WbscLmac && L1bd)//施封L1 { printf("@施封L1,ID:%04x,%04x\r\n",WbscLmac,nowMac1); {//施封具体 if(sendCmd_BT(menu.SN1,"ERROR",1,1)) { SET_MENU_STATUS(4,1,0,3); HAL_Delay(400); } else if(sendCmd_BT(menu.SN1,menu.SN1F,1,2)) { SET_MENU_STATUS(4,1,0,3); HAL_Delay(400); } } sjfNowStatus = tt808.L1Lockstatus; } else if(nowMac2 == WbscLmac && L2bd)//施封L2 { printf("@施封L2,ID:%04x,%04x\r\n",WbscLmac,nowMac2); {//施封具体 if(sendCmd_BT(menu.SN2,"ERROR",1,1)) { SET_MENU_STATUS(5,1,0,3); HAL_Delay(400); } else if(sendCmd_BT(menu.SN2,menu.SN2F,1,2)) { SET_MENU_STATUS(5,1,0,3); HAL_Delay(400); } } sjfNowStatus = tt808.L2Lockstatus; } else if(nowMac3 == WbscLmac && L3bd)//施封L3 { printf("@施封L3,ID:%04x,%04x\r\n",WbscLmac,nowMac3); {//施封具体 if(sendCmd_BT(menu.SN3,"ERROR",1,1)) { SET_MENU_STATUS(6,1,0,3); HAL_Delay(400); } else if(sendCmd_BT(menu.SN3,menu.SN3F,1,2)) { SET_MENU_STATUS(6,1,0,3); HAL_Delay(400); } } sjfNowStatus = tt808.L3Lockstatus; } else if(nowMac4 == WbscLmac && L4bd)//施封L4 { printf("@施封L4,ID:%04x,%04x\r\n",WbscLmac,nowMac4); {//施封具体 if(sendCmd_BT(menu.SN4,"ERROR",1,1)) { SET_MENU_STATUS(7,1,0,3); HAL_Delay(400); } else if(sendCmd_BT(menu.SN4,menu.SN4F,1,2)) { SET_MENU_STATUS(7,1,0,3); HAL_Delay(400); } } sjfNowStatus = tt808.L4Lockstatus; } else { printf("@未绑定此MAC\r\n"); } Ptsjf = true; memset(MIPurc1,0,rlt);//rlt下发长度 } else if(WbscCmd==0x38)//1538 { SET_MENU_STATUS(0,0,0,0); HAL_Delay(400); enterInterface_time = HAL_GetTick(); printf("@得到平台解封数据,ID:%04x\r\n",WbscLmac); XTflag = false; locDw = false; if(nowMac1 == WbscLmac && L1bd)//解锁L1 { printf("@解封L1,ID:%04x,%04x\r\n",WbscLmac,nowMac1); {//解封具体 if(sendCmd_BT(menu.SN1,"ERROR",1,2)) { HAL_Delay(400); SET_MENU_STATUS(4,0,0,3); } else if(sendCmd_BT(menu.SN1,menu.SN1F,2,2)) { HAL_Delay(400); SET_MENU_STATUS(4,0,0,3); } } sjfNowStatus = tt808.L1Lockstatus; } else if(nowMac2 == WbscLmac && L2bd)//解锁L2 { printf("@解封L2,ID:%04x,%04x\r\n",WbscLmac,nowMac2); {//解封具体 if(sendCmd_BT(menu.SN2,"ERROR",1,2)) { HAL_Delay(400); SET_MENU_STATUS(5,0,0,3); } else if(sendCmd_BT(menu.SN2,menu.SN2F,2,2)) { HAL_Delay(400); SET_MENU_STATUS(5,0,0,3); } } sjfNowStatus = tt808.L2Lockstatus; } else if(nowMac3 == WbscLmac && L3bd)//解锁L3 { printf("@解封L3,ID:%04x,%04x\r\n",WbscLmac,nowMac3); {//解封具体 if(sendCmd_BT(menu.SN3,"ERROR",1,2)) { HAL_Delay(400); SET_MENU_STATUS(6,0,0,3); } else if(sendCmd_BT(menu.SN3,menu.SN3F,2,2)) { HAL_Delay(400); SET_MENU_STATUS(6,0,0,3); } } sjfNowStatus = tt808.L3Lockstatus; } else if(nowMac4 == WbscLmac && L4bd)//解锁L4 { printf("@解封L4,ID:%04x,%04x\r\n",WbscLmac,nowMac4); {//解封具体 if(sendCmd_BT(menu.SN4,"ERROR",1,2)) { HAL_Delay(400); SET_MENU_STATUS(7,0,0,3); } else if(sendCmd_BT(menu.SN4,menu.SN4F,2,2)) { HAL_Delay(400); SET_MENU_STATUS(7,0,0,3); } } sjfNowStatus = tt808.L4Lockstatus; } else { printf("@未绑定此MAC\r\n"); } Ptsjf = true; memset(MIPurc1,0,rlt);//rlt下发长度 } else if(WbscCmd==0x02)//1202 eg.+MIPURC: "rtcp",1,22,7E030000140000160000082890132A1202010000000301240401123456230001997E { SET_MENU_STATUS(0,0,0,0); HAL_Delay(400); enterInterface_time = HAL_GetTick(); printf("@得到平台绑定MAC数据\r\n"); genghaunmac=true; locDw =false; XTflag = false; } } } } /* 0-3报警标志 4-7状态 8-11纬度 12-15经度 16-17高程 18-19速度 20-21方向 22-27时间 */ /** "报警标志对象": { "[bit31]非法开门报警": "0", "[bit30]侧翻预警": "0", "[bit29]碰撞预警": "0", "[bit28]车辆非法位移": "0", "[bit27]车辆非法点火": "0", "[bit26]车辆被盗(通过车辆防盗器)": "0", "[bit25]车辆油量异常": "0", "[bit24]车辆VSS故障": "0", "[bit23]路线偏离报警": "0", "[bit22]路段行驶时间不足/过长": "0", "[bit21]进出路线": "0", "[bit20]进出区域": "0", "[bit19]超时停车": "0", "[bit18]当天累计驾驶超时": "0", "[bit15~bit17]保留": "000", "[bit14]疲劳驾驶预警": "0", "[bit13]超速预警": "0", "[bit12]道路运输证IC卡模块故障": "0", "[bit11]摄像头故障": "0", "[bit10]TTS模块故障": "0", "[bit9]终端LCD或显示器故障": "0", "[bit8]终端主电源掉电": "0", "[bit7]终端主电源欠压": "0", "[bit6]GNSS天线短路": "0", "[bit5]GNSS天线未接或被剪断": "0", "[bit4]GNSS模块发生故障": "0", "[bit3]危险预警": "0", "[bit2]疲劳驾驶": "0", "[bit1]超速报警": "0", "[bit0]紧急报警,触动报警开关后触发": "0" "状态标志对象": { "[bit22~bit31]保留": "0000000000", "[0]bit21": "未使用Galileo卫星进行定位", "[0]bit20": "未使用GLONASS卫星进行定位", "[0]bit19": "未使用北斗卫星进行定位", "[0]bit18": "未使用GPS卫星进行定位", "[0]bit17": "门5关", "[0]bit16": "门4关", "[0]bit15": "门3关", "[0]bit14": "门2关", "[0]bit13": "门1关", "[0]bit12": "车门解锁", "[0]bit11": "车辆电路正常", "[0]bit10": "车辆油路正常", "[00]bit8~bit9": "空车", "[bit6~bit7]保留": "00", "[0]bit5": "经纬度未经保密插件加密", "[0]bit4": "运营状态", "[0]bit3": "东经", "[0]bit2": "北纬", "[0]bit1": "未定位", "[0]bit0": "ACC关" "[01CD81D6]纬度": 30245334, "[0727A76F]经度": 120039279, "[0000]高程": 0, "[0000]速度": 0, "[0000]方向": 0, "[180323093105]定位时间": "2018-03-23 09:31:05", */ LBSset lbsset; uint8_t LBSdata[28]; uint8_t LockStatusData[21]; void Lbsprocess(void) { wsj(1); //问时间 LBSdata[0] = (lbsset.bjbz>>24)&0xff; LBSdata[1] = (lbsset.bjbz>>16)&0xff; LBSdata[2] = (lbsset.bjbz>>8)&0xff; LBSdata[3] = lbsset.bjbz&0xff; LBSdata[4] = (lbsset.zt>>24)&0xff; LBSdata[5] = (lbsset.zt>>16)&0xff; LBSdata[6] = (lbsset.zt>>8)&0xff; LBSdata[7] = lbsset.zt&0xff; LBSdata[8] = (WD_dw>>24)&0xff; LBSdata[9] = (WD_dw>>16)&0xff; LBSdata[10] =(WD_dw>>8)&0xff; LBSdata[11] = WD_dw&0xff; LBSdata[12] = (JD_dw>>24)&0xff; LBSdata[13] = (JD_dw>>16)&0xff; LBSdata[14] = (JD_dw>>8)&0xff; LBSdata[15] = JD_dw&0xff; LBSdata[16] = (lbsset.gaocheng>>8)&0xff; LBSdata[17] = lbsset.gaocheng&0xff; LBSdata[18] = (lbsset.sudu>>8)&0xff; LBSdata[19] = lbsset.sudu&0xff; LBSdata[20] = (lbsset.fangxiang>>8)&0xff; LBSdata[21] = lbsset.fangxiang&0xff; LBSdata[22] = time.tt[0]; LBSdata[23] = time.tt[1]; LBSdata[24] = time.tt[2]; LBSdata[25] = time.tt[3]+DongbaquTime;//加东八区 LBSdata[26] = time.tt[4]; LBSdata[27] = time.tt[5]; } /** 操作指令(1B,上行0x01,)+SubCmd(1B)+LockID(4B)+Gate(1B)+ Voltage(1B)+LockStatus(1B)+ MotoStatus (1B)+ 备用 (4B)+Ver (1B)+绝对时间(6B) */ void LockStatusUpload(LockSNu8 locksnu8, uint8_t Locknum) { wsj(1); //问时间 LockStatusData[0] = 0x01;//操作上行 LockStatusData[1] = 0x01;//01锁信息上传 02旋钮破坏 03锁体破坏报警 04锁杆剪断报警 05锁杆打开报警 F2申请动态密码/申请开锁 LockStatusData[2] = 0x00;//默认ID LockStatusData[3] = 0x00; if(Locknum==0x1) { LockStatusData[4] = locksnu8.L1snT8[0];//L1绑定的低字节>>4&0xff LockStatusData[5] = locksnu8.L1snT8[1];//L1绑定的低字节&0xff LockStatusData[8] = tt808.L1Lockstatus;//LockStatus } else if(Locknum==0x2) { LockStatusData[4] = locksnu8.L2snT8[0]; LockStatusData[5] = locksnu8.L2snT8[1]; LockStatusData[8] = tt808.L2Lockstatus;//LockStatus } else if(Locknum==0x3) { LockStatusData[4] = locksnu8.L3snT8[0]; LockStatusData[5] = locksnu8.L3snT8[1]; LockStatusData[8] = tt808.L3Lockstatus;//LockStatus } else if(Locknum==0x4) { LockStatusData[4] = locksnu8.L4snT8[0]; LockStatusData[5] = locksnu8.L4snT8[1]; LockStatusData[8] = tt808.L4Lockstatus;//LockStatus } LockStatusData[6] = 0x00;//Gate LockStatusData[7] = 0x00;//Voltage LockStatusData[9] = 0x00;//MotoStatus LockStatusData[10] = 0x00;//备用 LockStatusData[11] = 0x00;//备用 LockStatusData[12] = 0x00;//备用 LockStatusData[13] = 0x00;//备用 LockStatusData[14] = 0x00;//VER LockStatusData[15] = time.tt[0];//year LockStatusData[16] = time.tt[1];//month LockStatusData[17] = time.tt[2];//day LockStatusData[18] = time.tt[3]+DongbaquTime;//hour LockStatusData[19] = time.tt[4];//minute LockStatusData[20] = time.tt[5];//second tt808FsFunc(LockStatusData,21,XXIDwbsc); } uint32_t uploadtime = 0; void gettimeupload_Normal(void) { if(HAL_GetTick() - uploadtime >= 40000)//60000=1min { uploadtime = HAL_GetTick(); Lbsprocess(); //test地址 tt808FsFunc(LBSdata,28,XXIDzddz); //test地址 if(L1bd) { LockStatusUpload(locksnu8,1); HAL_Delay(50); } if(L2bd) { LockStatusUpload(locksnu8,2); HAL_Delay(50); } if(L3bd) { LockStatusUpload(locksnu8,3); HAL_Delay(50); } if(L4bd) { LockStatusUpload(locksnu8,4); HAL_Delay(50); } } } void gettimeupload_Emergency(void) { Lbsprocess(); //test地址 tt808FsFunc(LBSdata,28,XXIDzddz); //test地址 if(L1bd && menu.current==4) { LockStatusUpload(locksnu8,1); } if(L2bd && menu.current==5) { LockStatusUpload(locksnu8,2); } if(L3bd && menu.current==6) { LockStatusUpload(locksnu8,3); } if(L4bd && menu.current==7) { LockStatusUpload(locksnu8,4); } refresh=true; }