#include "update_protocol.h" #include "string.h" #include "public.h" static struct { update_send_t pfnSend; }g_update_protoc; static uint8_t s_DevMac[6] = {0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01}; void update_set_devmac(uint8_t *DevMac) { if(DevMac != NULL) memcpy(s_DevMac, DevMac, 6); } void update_send_cmd(uint8_t Cmd, uint16_t Indx, int PageNum) { uint8_t sData[24]={0}; uint8_t sLen =0; uint16_t crc16; update_protocol_hd_t *Frame = (update_protocol_hd_t*)sData; Frame->Header = 0x7d; memcpy(Frame->DevMac, s_DevMac, 6); Frame->Cmd = Cmd; if (Cmd == 0x01) { Frame->PayloadLen = 1; sData[sizeof(update_protocol_hd_t)] = Indx; } else if (Cmd == 0x02) { Frame->PayloadLen = 4; update_protocol_get_t *GDData = (update_protocol_get_t*)&sData[sizeof(update_protocol_hd_t)]; GDData->PackageIndex = Indx; GDData->PackageNum = PageNum; } sLen = sizeof(update_protocol_hd_t) + Frame->PayloadLen; crc16 = CRC_Modbus(CRC16_BASE, sData, sLen); sData[sLen++] = crc16; sData[sLen++] = (crc16 >> 8) & 0x00ff; g_update_protoc.pfnSend(sData, sLen); } void update_init(update_send_t pCbs) { g_update_protoc.pfnSend =pCbs; } int update_unpack(uint8_t* rxData, int rLen,uint8_t *cmd, uint8_t* dev_addr, void *pload, int *pLen){ uint16_t crc16; uint16_t check; check = CRC_Modbus(CRC16_BASE, rxData, rLen - 2); crc16 = (rxData[rLen - 1] << 8) | rxData[rLen - 2]; if (check != crc16 || rxData[0] !=0x7d || pload ==0) { return -1; } update_protocol_hd_t *Frame = (update_protocol_hd_t*)rxData; /*仅精确匹配网关MAC*/ if(memcmp(Frame->DevMac, s_DevMac, 6) != 0) { return -1; } if(dev_addr != NULL) memcpy(dev_addr, Frame->DevMac, 6); *cmd = Frame->Cmd; if (Frame->Cmd == 0x81){ //update_protocol_req_t *UpData = (update_protocol_req_t*)&rxData[sizeof(update_protocol_hd_t)]; pload = 0; *pLen = 0; }else if (Frame->Cmd == 0x82){ update_protocol_rsp_t *DownData = (update_protocol_rsp_t *)&rxData[sizeof(update_protocol_hd_t)]; memcpy(pload , &rxData[sizeof(update_protocol_hd_t) + sizeof(update_protocol_rsp_t)],DownData->DataLen); *pLen = DownData->DataLen; }else{ return -2; } return 0; }