12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208 |
- #include "tt808.h"
- #include "usart.h"
- #include <stdint.h>
- #include "rtc.h"
- #include <stdlib.h>
- //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<size; i++)
- {
- sprintf(hex+i*2, "%02x", bin[i]);
- }
- hex[i+i] = 0;
- return hex;
- }
- int hex2bin(unsigned char *bin, const char *hex)
- {
- const char *h = hex;
- unsigned char *b = bin;
- int rlt = 0;
- while(*h){
- *b++ = hex2asc(h);
- h = h + 2;
- rlt++;
- }
- return rlt;//长度
- }
- int rlt;
- char year_str[3];
- char month_str[3];
- char day_str[3];
- char hour_str[3];
- char minute_str[3];
- char second_str[3];
- void ZHSJ(uint8_t outTt[],char in[])//转换数据
- {
- const char *hex = (const char *)in; // 将 uint8_t * 转换为 const char *
- int size = strlen(hex) / 2; // 计算二进制数据的长度
- unsigned char *bin = (unsigned char *)malloc(size); // 分配足够的内存用于存储二进制数据
- hex2bin(bin, hex); // 调用hex2bin函数进行转换
- memcpy(outTt, bin, 1); // 将 bin 中的 rlt 个字节复制到 MIPurc1 中 接收到的数据放入MIPurc1中
- free(bin); // 释放内存
- }
- void ZHSN(uint8_t outTt[],char in[])//转换SN
- {
- const char *hex = (const char *)in; // 将 uint8_t * 转换为 const char *
- int size = strlen(hex) / 2; // 计算二进制数据的长度
- unsigned char *bin = (unsigned char *)malloc(size); // 分配足够的内存用于存储二进制数据
- hex2bin(bin, hex); // 调用hex2bin函数进行转换
- memcpy(outTt, bin, 2); // 将 bin 中的 rlt 个字节复制到 MIPurc1 中 接收到的数据放入MIPurc1中
- free(bin); // 释放内存
- }
- void wsj(uint8_t flag )
- {
- if(flag==0)
- {
- if (sendCmd_4G("AT+CCLK?\r\n", "OK", 1, 1))
- {
-
- memcpy(year_str, &g_ML307A_8buf_Down[8], 2); // 复制两个字符
- memcpy(month_str, &g_ML307A_8buf_Down[11], 2);
- memcpy(day_str, &g_ML307A_8buf_Down[14], 2);
- memcpy(hour_str, &g_ML307A_8buf_Down[17], 2);
- memcpy(minute_str, &g_ML307A_8buf_Down[20], 2);
- memcpy(second_str, &g_ML307A_8buf_Down[23], 2);
-
- year_str[2] = '\0'; // 添加空字符结束符
- month_str[2] = '\0';
- day_str[2] = '\0';
- hour_str[2] = '\0';
- minute_str[2] = '\0';
- second_str[2] = '\0';
-
- // time.year = (uint8_t)atoi(year_str); // 使用atoi函数将字符转换为数字并赋值给time.year转16
- // time.month = (uint8_t)atoi(month_str);
- // time.day = (uint8_t)atoi(day_str);
- // time.hour = (uint8_t)atoi(hour_str)+8;
- // time.minute = (uint8_t)atoi(minute_str);
- // time.second = (uint8_t)atoi(second_str);
- ZHSJ(&time.tt[0],year_str);
- ZHSJ(&time.tt[1],month_str);
- ZHSJ(&time.tt[2],day_str);
- ZHSJ(&time.tt[3],hour_str);
- ZHSJ(&time.tt[4],minute_str);
- ZHSJ(&time.tt[5],second_str);
- tongbushijian(time.tt[0], time.tt[1], time.tt[2], time.tt[3], time.tt[4], time.tt[5]);
-
- }
- }
- else
- {
- /* 上面通过AT指令问 */
- RTCtime();//上电同步时间
- }
- }
- uint8_t xxtnewlength=0;
- uint8_t xxtfz[100];
- uint8_t tcppacket[100];
- uint8_t xxtFZ(uint8_t xxt[], uint8_t xxtlength, uint8_t outXxt[],uint16_t XXID)
- {
- int index = 0;
- uint8_t newlength = xxtlength+3;
- uint8_t newXxt[newlength];
-
- if(XXID==XXIDzdjq || XXID==XXIDzdxt || XXID==XXIDzddz)//不加头尾(鉴权、心跳、地址)
- {
- for (int i = 0; i < xxtlength; i++) {
- newXxt[index++] = xxt[i]; // 将消息头拷贝到报文中
- }
-
- newlength = index;
-
- for(int i =0;i<newlength;i++)
- {
- outXxt[i]=newXxt[i];
- }
- }
- else
- {
- newXxt[index++]=newlength;
- newXxt[index++]=0x2A;
- for (int i = 0; i < xxtlength; i++) {
- newXxt[index++] = xxt[i]; // 将消息头拷贝到报文中
- }
- newXxt[index++]=0x23;
- newXxt[index++]=xorBytes(&newXxt[1],newlength-1);
- newlength = index;
-
- for(int i =0;i<newlength;i++)
- {
- outXxt[i]=newXxt[i];
- }
- }
-
- //test
- // for (int i = 0; i < newlength; i++) {
- // printf("%02X ", newXxt[i]); // 以十六进制格式打印每个元素
- // }
- return newlength;
- }
- uint8_t header[12];
- void chuli(uint16_t XXID)
- {
- uint16_t XXTSXdata = xxtnewlength;
- XXTSXdata |= ( xxtnewlength | (TCPJMFSNULL<<10)); // 将长度左移3位后和加密方式进行按位或操作(001 RSA ,000 无加密)
-
- header[0] = ((XXID>>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;
- }
|