Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of Dealer_18feb17 by
Lora.cpp
- Committer:
- NarendraSingh
- Date:
- 2017-02-22
- Revision:
- 21:a5fb0ae94dc6
- Parent:
- 20:f812f85cf97e
- Child:
- 22:c2f034a13108
File content as of revision 21:a5fb0ae94dc6:
#include "Lora.h" #include "OBD.h" #include "Common_Defs.h" #include "Beacon.h" //Configure Lora Packet RawSerial LORA_Module_UART(PA_0, PA_1);//USART4_TX->PA_0,USART4_RX->PA_1 RawSerial pc2(PA_14, PA_15);//USART1_TX->PA_9,USART1_RX->PA_10 Serial pc_2(USBTX, USBRX); uint8 Packet_Type_To_Send = HEARTBEAT_TYPE_PACKET; //By Default Heart Beat PAckets should be sent uint8 OBD_Protocol_Version = 0x01; uint8 Vehicle_Identification_Number[17]; //Unique Vehicle_Identification_Number, Read using OBD uint8 Motion_Packet_Sent_Count=0; uint8 CheckIN_Packet_Sent_Count=0; uint8 Lora_Packet_To_Send[100]; uint8 Send_Lora_Packet_Flag = FALSE; int Lora_RxBuffer_Crnt_Pos,Lora_RxBuffer_End_Pos; // must be volatile or the compiler may over-optimise. int receivedDataCount = 0; char LORA_UART_RX_Buffer[LORA_UART_RX_Size]; int LORA_UART_RX_Crnt_Pos; uint8 Lora_Command_Rcvd[100]; uint8 Lora_Cmd_Length = 0; uint8 AT_Response_Receive_Status = FAILURE; //Create Object for Type of Lora Packet to send Heart_Beat_PacketType Heart_Beat_Lora_Packet; //Allocate Memory for HeartBeat Lora Packets CheckIN_PacketType CheckIN_Lora_Packet; //Allocate Memory for CheckIN Lora Packets CheckOUT_PacketType CheckOUT_Packet; //Allocate Memory for CheckOUT Lora Packets Motion_PacketType Motion_Lora_Packet; //Allocate Memory for Movement Lora Packets Vehicle_Status_PacketType Vehicle_Status_Lora_Packet; //Allocate Memory for Movement Lora Packets Near_Car_Beacon Near_Car_Beacon_Packet; Fixed_Beacon Fixed_Beacon_Packet; Misc_Packets Misc_Packet_Data; //Lora AT Commands list const char* Attention = {"AT\r"}; const char* Reset_Device = "ATZ\r"; const char* Reset_to_Factory_Defaults = "AT&F\r"; const char* Save_Configuration = "AT&W\r"; const char* Serial_Baud_Rate = "AT+IPR="; const char* Join_Network = "AT+JOIN\r"; const char* Join_Retries = "AT+JR="; const char* AES_Encryption = "AT+ENC="; const char* Send_Lora_Packet = "AT+SEND "; const char* Set_Frequency_Sub_Band = "AT+FSB="; const char* Set_Network_ID = "AT+NI="; const char* Set_Network_Key = "AT+NK="; const char* Network_Key = "010203123"; const char* Network_ID = "010203040"; const char* Network_Join_Retries = "AT+JR="; const char* Network_Join_Status = "AT+NJS="; const char* Lora_Device_ID = "AT+DI\r"; #define CHECK_IN_PACKET 0x00 #define CHECK_OUT_PACKET 0x01 uint8 Calculate_Lora_Frame_FCS(uint8* Packet_Data,uint8 Packet_Length); void Set_Up_Lora_Network_Configuration(void); void Get_Lora_Response(void); //Set Up lora network void Set_Up_Lora_Network_Configuration(void) { LORA_Module_UART.baud(115200); LORA_Module_UART.printf(Attention);//Send Attention command AT_Response_Receive_Status = FAILURE; pc2.printf("Nwk set up started"); while(AT_Response_Receive_Status) Get_Lora_Response(); pc2.printf("AT Response received"); LORA_Module_UART.printf("%s%d\r",Set_Frequency_Sub_Band,FREQUENCY_SUB_BAND_CHANNEL7);//set frequency sub band to 7 AT_Response_Receive_Status = FAILURE; while(AT_Response_Receive_Status) Get_Lora_Response(); pc2.printf("Frequency band response received"); LORA_Module_UART.printf("%s%d,%s\r",Set_Network_Key,STRING_PARAMETER,Network_Key); //set network key AT_Response_Receive_Status = FAILURE; while(AT_Response_Receive_Status) Get_Lora_Response(); pc2.printf("Network key Response received"); LORA_Module_UART.printf("%s%d,%s\r",Set_Network_ID,STRING_PARAMETER,Network_ID); //set network id AT_Response_Receive_Status = FAILURE; while(AT_Response_Receive_Status) Get_Lora_Response(); pc2.printf("Network Id response received"); LORA_Module_UART.printf("AT+TXDR=DR3\r"); AT_Response_Receive_Status = FAILURE; while(AT_Response_Receive_Status) Get_Lora_Response(); LORA_Module_UART.printf("AT+RXDR=10\r"); AT_Response_Receive_Status = FAILURE; while(AT_Response_Receive_Status) Get_Lora_Response(); LORA_Module_UART.printf("AT+ADR=0\r"); //Enable adaptive data rate AT_Response_Receive_Status = FAILURE; while(AT_Response_Receive_Status) Get_Lora_Response(); LORA_Module_UART.printf("%s",Save_Configuration); //save configuration AT_Response_Receive_Status = FAILURE; while(AT_Response_Receive_Status) Get_Lora_Response(); pc2.printf("Configuration saved"); LORA_Module_UART.printf("%s",Reset_Device); //reset device wait_ms(3500); LORA_Module_UART.printf(Attention); //Send Attention command AT_Response_Receive_Status = FAILURE; while(AT_Response_Receive_Status) Get_Lora_Response(); pc2.printf("AT Response received"); LORA_Module_UART.printf("%s",Join_Network); //join network with gateway AT_Response_Receive_Status = FAILURE; while(AT_Response_Receive_Status) Get_Lora_Response(); pc2.printf("Join Response received"); } void Initialize_lora_Packets() { uint8 i; /******* Initialize Lora packet for HeartBeat *****/ Misc_Packet_Data.Header = LORA_PACKET_HEADER; Misc_Packet_Data.Protocol_Version = OBD_Protocol_Version; Heart_Beat_Lora_Packet.Packet_Type = HEART_BEAT_PACKET_CMD; Misc_Packet_Data.OBD_Battery_Voltage = 350; //3.50V, dummy data Misc_Packet_Data.Car_Battery_Voltage = 1250; //12.50V, dummy data Misc_Packet_Data.OBD_Battery_Temperature = 95; //95'F, dummy data Misc_Packet_Data.Car_Ambient_Temperature = 104; //104'F, dummy data for(i=0;i<6;i++) Fixed_Beacon_Packet.Parking1_Beacon_ID[i] = (0x01+i); //MAC ID of 1st NearBy Beacon Device with Highest Signal Strength,dummy data Fixed_Beacon_Packet.Parking1_Beacon_Signal_Strength = 23; //Signal Strength of 3rd NearBy Beacon Device with Highest Signal Strength for(i=0;i<6;i++) Fixed_Beacon_Packet.Parking2_Beacon_ID[i] = (10+i); //MAC ID of 1st NearBy Beacon Device with Highest Signal Strength,dummy data Fixed_Beacon_Packet.Parking2_Beacon_Signal_Strength = 45; //Signal Strength of 3rd NearBy Beacon Device with Highest Signal Strength for(i=0;i<6;i++) Fixed_Beacon_Packet.Parking3_Beacon_ID[i] = (20+i); //MAC ID of 1st NearBy Beacon Device with Highest Signal Strength,dummy data Fixed_Beacon_Packet.Parking3_Beacon_Signal_Strength = 12; //Signal Strength of 3rd NearBy Beacon Device with Highest Signal Strength Heart_Beat_Lora_Packet.Sequence_No = 0x00; //Sent Packet Sequence Number Heart_Beat_Lora_Packet.FCS = 0x00; //FCS of all packets /******* Initialize Lora packet for Vehicle Status *****/ Misc_Packet_Data.Header = LORA_PACKET_HEADER; Misc_Packet_Data.Protocol_Version = OBD_Protocol_Version; Vehicle_Status_Lora_Packet.Packet_Type = STATUS_PACKET_CMD; for(i=0;i<17;i++) Misc_Packet_Data.VIN[i] = i;//Vehicle_Identification_Number[i]; for(i=0;i<3;i++) Misc_Packet_Data.ODO_METER_READING[i] = 0x05; //Dummyy data, To be read using OBD Vehicle_Status_Lora_Packet.Fuel_Level = 1050;//10.5 litre Misc_Packet_Data.OBD_Battery_Voltage = 350; Misc_Packet_Data.Car_Battery_Voltage = 1250; Misc_Packet_Data.OBD_Battery_Temperature = 95; Misc_Packet_Data.Car_Ambient_Temperature = 104; for(i=0;i<6;i++) Vehicle_Status_Lora_Packet.BLE_Adv_Beacon_ID[i] = BLE_Adv_Module_Beacon_ID[i]; //MAC ID of 1st NearBy Beacon Device with Highest Signal Strength,dummy data for(i=0;i<6;i++) Fixed_Beacon_Packet.Parking1_Beacon_ID[i] = i; //MAC ID of 1st NearBy Beacon Device with Highest Signal Strength,dummy data Fixed_Beacon_Packet.Parking1_Beacon_Signal_Strength = 0x07; //Signal Strength of 3rd NearBy Beacon Device with Highest Signal Strength for(i=0;i<6;i++) Fixed_Beacon_Packet.Parking2_Beacon_ID[i] = i; //MAC ID of 1st NearBy Beacon Device with Highest Signal Strength,dummy data Fixed_Beacon_Packet.Parking2_Beacon_Signal_Strength = 0x08; //Signal Strength of 3rd NearBy Beacon Device with Highest Signal Strength for(i=0;i<6;i++) Fixed_Beacon_Packet.Parking3_Beacon_ID[i] = i; //MAC ID of 1st NearBy Beacon Device with Highest Signal Strength,dummy data Fixed_Beacon_Packet.Parking3_Beacon_Signal_Strength = 0x09; //Signal Strength of 3rd NearBy Beacon Device with Highest Signal Strength for(i=0;i<6;i++) Near_Car_Beacon_Packet.Near_Car1_Beacon_ID[i] = i; //MAC ID of 1st NearBy Beacon Device with Highest Signal Strength,dummy data Near_Car_Beacon_Packet.Near_Car1_Beacon_Signal_Strength = 0x09; //Signal Strength of 3rd NearBy Beacon Device with Highest Signal Strength for(i=0;i<6;i++) Near_Car_Beacon_Packet.Near_Car2_Beacon_ID[i] = i; //MAC ID of 1st NearBy Beacon Device with Highest Signal Strength,dummy data Near_Car_Beacon_Packet.Near_Car2_Beacon_Signal_Strength = 0x09; //Signal Strength of 3rd NearBy Beacon Device with Highest Signal Strength for(i=0;i<6;i++) Near_Car_Beacon_Packet.Near_Car3_Beacon_ID[i] = i; //MAC ID of 1st NearBy Beacon Device with Highest Signal Strength,dummy data Near_Car_Beacon_Packet.Near_Car3_Beacon_Signal_Strength = 0x09; //Signal Strength of 3rd NearBy Beacon Device with Highest Signal Strength Vehicle_Status_Lora_Packet.Sequence_No = 0x00; //Sent Packet Sequence Number Vehicle_Status_Lora_Packet.FCS = 0x00; //FCS of all packets /******* Initialize Lora packet for CheckIn *****/ Misc_Packet_Data.Header = LORA_PACKET_HEADER; Misc_Packet_Data.Protocol_Version = OBD_Protocol_Version; CheckIN_Lora_Packet.Packet_Type = CHECKIN_PACKET_CMD; for(i=0;i<17;i++) Misc_Packet_Data.VIN[i] = Vehicle_Identification_Number[i]; for(i=0;i<3;i++) Misc_Packet_Data.ODO_METER_READING[i] = 0x00; //Dummyy data, To be read using OBD for(i=0;i<5;i++) CheckIN_Lora_Packet.DTC[i] = 0x00; //Get Beacon_ID of 1st nearby Beacon Device for(i=0;i<6;i++) Fixed_Beacon_Packet.Parking1_Beacon_ID[i] = 0x00; //MAC ID of 1st NearBy Beacon Device with Highest Signal Strength,dummy data Fixed_Beacon_Packet.Parking1_Beacon_Signal_Strength = 0x00; //Signal Strength of 3rd NearBy Beacon Device with Highest Signal Strength for(i=0;i<6;i++) Fixed_Beacon_Packet.Parking2_Beacon_ID[i] = 0x00; //MAC ID of 1st NearBy Beacon Device with Highest Signal Strength,dummy data Fixed_Beacon_Packet.Parking2_Beacon_Signal_Strength = 0x00; //Signal Strength of 3rd NearBy Beacon Device with Highest Signal Strength for(i=0;i<6;i++) Fixed_Beacon_Packet.Parking3_Beacon_ID[i] = 0x00; //MAC ID of 1st NearBy Beacon Device with Highest Signal Strength,dummy data Fixed_Beacon_Packet.Parking3_Beacon_Signal_Strength = 0x00; //Signal Strength of 3rd NearBy Beacon Device with Highest Signal Strength CheckIN_Lora_Packet.Sequence_No = 0x00; //Sent Packet Sequence Number CheckIN_Lora_Packet.FCS = 0x00; //FCS of all packets /******* Initialize Lora packet for CheckOUT *****/ Misc_Packet_Data.Header = LORA_PACKET_HEADER; Misc_Packet_Data.Protocol_Version = OBD_Protocol_Version; CheckOUT_Packet.Packet_Type = CHECKIN_PACKET_CMD; for(i=0;i<17;i++) Misc_Packet_Data.VIN[i] = Vehicle_Identification_Number[i]; for(i=0;i<3;i++) Misc_Packet_Data.ODO_METER_READING[i] = 0x00; //Dummyy data, To be read using OBD for(i=0;i<6;i++) Fixed_Beacon_Packet.Parking1_Beacon_ID[i] = 0x00; //MAC ID of 1st NearBy Beacon Device with Highest Signal Strength,dummy data Fixed_Beacon_Packet.Parking1_Beacon_Signal_Strength = 0x00; //Signal Strength of 3rd NearBy Beacon Device with Highest Signal Strength for(i=0;i<6;i++) Fixed_Beacon_Packet.Parking2_Beacon_ID[i] = 0x00; //MAC ID of 1st NearBy Beacon Device with Highest Signal Strength,dummy data Fixed_Beacon_Packet.Parking2_Beacon_Signal_Strength = 0x00; //Signal Strength of 3rd NearBy Beacon Device with Highest Signal Strength for(i=0;i<6;i++) Fixed_Beacon_Packet.Parking3_Beacon_ID[i] = 0x00; //MAC ID of 1st NearBy Beacon Device with Highest Signal Strength,dummy data Fixed_Beacon_Packet.Parking3_Beacon_Signal_Strength = 0x00; //Signal Strength of 3rd NearBy Beacon Device with Highest Signal Strength CheckOUT_Packet.Sequence_No = 0x00; //Sent Packet Sequence Number CheckOUT_Packet.FCS = 0x00; //FCS of all packets /******* Initialize Lora packet for Movement *****/ Misc_Packet_Data.Header = LORA_PACKET_HEADER; Misc_Packet_Data.Protocol_Version = OBD_Protocol_Version; Motion_Lora_Packet.Packet_Type = MOTION_PACKET_CMD; for(i=0;i<6;i++) Fixed_Beacon_Packet.Parking1_Beacon_ID[i] = 0x00; //MAC ID of 1st NearBy Beacon Device with Highest Signal Strength,dummy data Fixed_Beacon_Packet.Parking1_Beacon_Signal_Strength = 0x00; //Signal Strength of 1st NearBy Beacon Device with Highest Signal Strength for(i=0;i<6;i++) Fixed_Beacon_Packet.Parking2_Beacon_ID[i] = 0x00; //MAC ID of 2nd NearBy Beacon Device with Highest Signal Strength,dummy data Fixed_Beacon_Packet.Parking2_Beacon_Signal_Strength = 0x00; //Signal Strength of 2nd NearBy Beacon Device with Highest Signal Strength for(i=0;i<6;i++) Fixed_Beacon_Packet.Parking3_Beacon_ID[i] = 0x00; //MAC ID of 3rd NearBy Beacon Device with Highest Signal Strength,dummy data Fixed_Beacon_Packet.Parking3_Beacon_Signal_Strength = 0x00; //Signal Strength of 3rd NearBy Beacon Device with Highest Signal Strength Motion_Lora_Packet.Acceleration_Type = 0x00; //Type of acceleration, Vehicle Started/Vehicle Stopped/Sudden Vehicle Movement Motion_Lora_Packet.Sequence_No = 0x00; //Sent Packet Sequence Number Motion_Lora_Packet.FCS = 0x00; //FCS of all packets Lora_Packet_To_Send[0] = 0x41;//'A' Lora_Packet_To_Send[1] = 0x54;//'T' Lora_Packet_To_Send[2] = 0x2b;//'+' Lora_Packet_To_Send[3] = 0x53;//'S' Lora_Packet_To_Send[4] = 0x45;//'E' Lora_Packet_To_Send[5] = 0x4e;//'N' Lora_Packet_To_Send[6] = 0x44;//'D' Lora_Packet_To_Send[7] = 0x20;//' ' Blank Space Lora_Packet_To_Send[8] = Misc_Packet_Data.Header; //Header of Lora Packet,0xFE Lora_Packet_To_Send[9] = Misc_Packet_Data.Protocol_Version; } //HeartBeat Packet should be sent every 30sec void Send_HeartBeat_Packet(void) { //write code to read obd data,temperature,beacon data uint8 Pos = 10,i; Lora_Packet_To_Send[Pos++] = Heart_Beat_Lora_Packet.Packet_Type; //MSB of Motion Packet Type Lora_Packet_To_Send[Pos++] = (Misc_Packet_Data.OBD_Battery_Voltage >> 8); //Get OBD_Battery Voltage Lora_Packet_To_Send[Pos++] = (Misc_Packet_Data.OBD_Battery_Voltage & 0xFF); //Get OBD_Battery Voltage Lora_Packet_To_Send[Pos++] = (Misc_Packet_Data.Car_Battery_Voltage >> 8); //Get Vehicle_Battery Temperature Lora_Packet_To_Send[Pos++] = (Misc_Packet_Data.Car_Battery_Voltage & 0xFF); //Get Vehicle_Battery Temperature Lora_Packet_To_Send[Pos++] = Misc_Packet_Data.OBD_Battery_Temperature; //Get Battery Temperature Lora_Packet_To_Send[Pos++] = Misc_Packet_Data.Car_Ambient_Temperature; //Get Ambient Temperature for(i=0;i<6;i++) Lora_Packet_To_Send[Pos++] = Fixed_Beacon_Packet.Parking1_Beacon_ID[i]; //Get Beacon_ID of 1st nearby Beacon Device Lora_Packet_To_Send[Pos++] = Fixed_Beacon_Packet.Parking1_Beacon_Signal_Strength; //Get Signal Strength of 1st nearby Beacon Device for(i=0;i<6;i++) Lora_Packet_To_Send[Pos++] = Fixed_Beacon_Packet.Parking2_Beacon_ID[i]; //Get Beacon_ID of 2nd nearby Beacon Device Lora_Packet_To_Send[Pos++] = Fixed_Beacon_Packet.Parking2_Beacon_Signal_Strength; //Get Signal Strength of 2nd nearby Beacon Device for(i=0;i<6;i++) Lora_Packet_To_Send[Pos++] = Fixed_Beacon_Packet.Parking3_Beacon_ID[i]; //Get Beacon_ID of 3rd nearby Beacon Device Lora_Packet_To_Send[Pos++] = Fixed_Beacon_Packet.Parking3_Beacon_Signal_Strength; //Get Signal Strength of 3rd nearby Beacon Device Lora_Packet_To_Send[Pos++] = Heart_Beat_Lora_Packet.Sequence_No; //Packet Sequence number Lora_Packet_To_Send[Pos++] = Calculate_Lora_Frame_FCS(Lora_Packet_To_Send,Pos); //Calculate FCS of all bytes Lora_Packet_To_Send[Pos++] = 0xDE;//Calculate_Lora_Frame_FCS(Lora_Packet_To_Send,Pos); //Calculate FCS of all bytes Lora_Packet_To_Send[Pos++] = 0x0D;//Calculate_Lora_Frame_FCS(Lora_Packet_To_Send,Pos); //Calculate FCS of all bytes /*Lora_Packet_To_Send[Pos++] = 0xB1;//Calculate_Lora_Frame_FCS(Lora_Packet_To_Send,Pos); //Calculate FCS of all bytes Lora_Packet_To_Send[Pos++] = 0xB2;//Calculate_Lora_Frame_FCS(Lora_Packet_To_Send,Pos); //Calculate FCS of all bytes Lora_Packet_To_Send[Pos++] = 0xB3;//Calculate_Lora_Frame_FCS(Lora_Packet_To_Send,Pos); //Calculate FCS of all bytes Lora_Packet_To_Send[Pos++] = 0xB4;//Calculate_Lora_Frame_FCS(Lora_Packet_To_Send,Pos); //Calculate FCS of all bytes */Packet_Type_To_Send = HEARTBEAT_TYPE_PACKET; Send_Lora_Packet_To_Gateway(Lora_Packet_To_Send,Pos); if(Heart_Beat_Lora_Packet.Sequence_No < 0xFF) Heart_Beat_Lora_Packet.Sequence_No++; else Heart_Beat_Lora_Packet.Sequence_No = 0x00; pc2.printf("Heartbeat Packet Sequence Number %d",Heart_Beat_Lora_Packet.Sequence_No); } //CheckIN packets sending should be started when device is plugged in to the vehicle. It should be sent every 5sec for 2minutes and afterthat it should stop sending void Send_Vehicle_Status_Packet(void) { //write code to read OBD data,temperature,beacon data uint8 Pos = 10,i; Lora_Packet_To_Send[Pos++] = STATUS_PACKET_CMD; //MSB of Motion Packet Type for(i=0;i < 17;i++) Lora_Packet_To_Send[Pos++] = Misc_Packet_Data.VIN[i]; //Get OBD_ID for(i=0;i < 3;i++) Lora_Packet_To_Send[Pos++] = Misc_Packet_Data.ODO_METER_READING[i]; //Get OBD_ID Lora_Packet_To_Send[Pos++] = (Vehicle_Status_Lora_Packet.Fuel_Level >> 8); //Get OBD_Battery Voltage Lora_Packet_To_Send[Pos++] = (Vehicle_Status_Lora_Packet.Fuel_Level & 0xFF); //Get OBD_Battery Voltage Lora_Packet_To_Send[Pos++] = (Misc_Packet_Data.OBD_Battery_Voltage >> 8); //Get OBD_Battery Voltage Lora_Packet_To_Send[Pos++] = (Misc_Packet_Data.OBD_Battery_Voltage & 0xFF); //Get OBD_Battery Voltage Lora_Packet_To_Send[Pos++] = (Misc_Packet_Data.Car_Battery_Voltage >> 8); //Get Vehicle_Battery Temperature Lora_Packet_To_Send[Pos++] = (Misc_Packet_Data.Car_Battery_Voltage & 0xFF); //Get Vehicle_Battery Temperature Lora_Packet_To_Send[Pos++] = Misc_Packet_Data.OBD_Battery_Temperature; //Get Battery Temperature Lora_Packet_To_Send[Pos++] = Misc_Packet_Data.Car_Ambient_Temperature; //Get Ambient Temperature for(i=0;i<6;i++) Lora_Packet_To_Send[Pos++] = Vehicle_Status_Lora_Packet.BLE_Adv_Beacon_ID[i]; //Get Beacon_ID of 1st nearby Beacon Device for(i=0;i<6;i++) Lora_Packet_To_Send[Pos++] = Fixed_Beacon_Packet.Parking1_Beacon_ID[i]; //Get Beacon_ID of 1st nearby Beacon Device Lora_Packet_To_Send[Pos++] = Fixed_Beacon_Packet.Parking1_Beacon_Signal_Strength; //Get Signal Strength of 1st nearby Beacon Device for(i=0;i<6;i++) Lora_Packet_To_Send[Pos++] = Fixed_Beacon_Packet.Parking2_Beacon_ID[i]; //Get Beacon_ID of 2nd nearby Beacon Device Lora_Packet_To_Send[Pos++] = Fixed_Beacon_Packet.Parking2_Beacon_Signal_Strength; //Get Signal Strength of 2nd nearby Beacon Device for(i=0;i<6;i++) Lora_Packet_To_Send[Pos++] = Fixed_Beacon_Packet.Parking3_Beacon_ID[i]; //Get Beacon_ID of 3rd nearby Beacon Device Lora_Packet_To_Send[Pos++] = Fixed_Beacon_Packet.Parking3_Beacon_Signal_Strength; //Get Signal Strength of 3rd nearby Beacon Device for(i=0;i<6;i++) Lora_Packet_To_Send[Pos++] = Near_Car_Beacon_Packet.Near_Car1_Beacon_ID[i]; //Get Beacon_ID of 1st nearby Beacon Device Lora_Packet_To_Send[Pos++] = Near_Car_Beacon_Packet.Near_Car1_Beacon_Signal_Strength; //Get Signal Strength of 1st nearby Beacon Device for(i=0;i<6;i++) Lora_Packet_To_Send[Pos++] = Near_Car_Beacon_Packet.Near_Car2_Beacon_ID[i]; //Get Beacon_ID of 2nd nearby Beacon Device Lora_Packet_To_Send[Pos++] = Near_Car_Beacon_Packet.Near_Car2_Beacon_Signal_Strength; //Get Signal Strength of 2nd nearby Beacon Device for(i=0;i<6;i++) Lora_Packet_To_Send[Pos++] = Near_Car_Beacon_Packet.Near_Car3_Beacon_ID[i]; //Get Beacon_ID of 3rd nearby Beacon Device Lora_Packet_To_Send[Pos++] = 0x23;//Near_Car_Beacon_Packet.Near_Car3_Beacon_Signal_Strength; //Get Signal Strength of 3rd nearby Beacon Device Lora_Packet_To_Send[Pos++] = Vehicle_Status_Lora_Packet.Sequence_No; //Packet Sequence number Lora_Packet_To_Send[Pos++] = 0xEE;//Calculate_Lora_Frame_FCS(Lora_Packet_To_Send,Pos); //Calculate FCS of all bytes Lora_Packet_To_Send[Pos++] = 0x0D;//Calculate_Lora_Frame_FCS(Lora_Packet_To_Send,Pos); //Calculate FCS of all bytes /*Lora_Packet_To_Send[Pos++] = 0xA1;//Calculate_Lora_Frame_FCS(Lora_Packet_To_Send,Pos); //Calculate FCS of all bytes Lora_Packet_To_Send[Pos++] = 0xA2;//Calculate_Lora_Frame_FCS(Lora_Packet_To_Send,Pos); //Calculate FCS of all bytes Lora_Packet_To_Send[Pos++] = 0xA3;//Calculate_Lora_Frame_FCS(Lora_Packet_To_Send,Pos); //Calculate FCS of all bytes Lora_Packet_To_Send[Pos++] = 0xA4;//Calculate_Lora_Frame_FCS(Lora_Packet_To_Send,Pos); //Calculate FCS of all bytes */Send_Lora_Packet_To_Gateway(Lora_Packet_To_Send,Pos); if(Vehicle_Status_Lora_Packet.Sequence_No < 0xFF) Vehicle_Status_Lora_Packet.Sequence_No++; else Vehicle_Status_Lora_Packet.Sequence_No = 0x00; /*for(i=0; i < Pos; i++) { pc2.putc(Lora_Packet_To_Send[i]); //pc2.putc(Command_To_Send[i]); }*/ pc2.printf("Status Packet Sequence Number %d",Vehicle_Status_Lora_Packet.Sequence_No); } //CheckIN packets sending should be started when device is plugged in to the vehicle. It should be sent every 5sec for 2minutes and afterthat it should stop sending void Send_CheckIN_Packet(void) { //write code to read OBD data,temperature,beacon data uint8 Pos = 10,i; Lora_Packet_To_Send[Pos++] = CHECKIN_PACKET_CMD; //Check detected. Set packet type to Checkout type for(i=0;i < 17;i++) Lora_Packet_To_Send[Pos++] = Misc_Packet_Data.VIN[i]; //Get OBD_ID for(i=0;i < 3;i++) Lora_Packet_To_Send[Pos++] = Misc_Packet_Data.ODO_METER_READING[i]; //Get OBD_ID for(i=0;i<5;i++) Lora_Packet_To_Send[Pos++] = CheckIN_Lora_Packet.DTC[i]; //Get Beacon_ID of 1st nearby Beacon Device Lora_Packet_To_Send[Pos++] = (Misc_Packet_Data.OBD_Battery_Voltage >> 8); //Get OBD_Battery Voltage Lora_Packet_To_Send[Pos++] = (Misc_Packet_Data.OBD_Battery_Voltage & 0xFF); //Get OBD_Battery Voltage Lora_Packet_To_Send[Pos++] = (Misc_Packet_Data.Car_Battery_Voltage >> 8); //Get Vehicle_Battery Temperature Lora_Packet_To_Send[Pos++] = (Misc_Packet_Data.Car_Battery_Voltage & 0xFF); //Get Vehicle_Battery Temperature Lora_Packet_To_Send[Pos++] = Misc_Packet_Data.OBD_Battery_Temperature; //Get Battery Temperature Lora_Packet_To_Send[Pos++] = Misc_Packet_Data.Car_Ambient_Temperature; //Get Ambient Temperature for(i=0;i<6;i++) Lora_Packet_To_Send[Pos++] = Fixed_Beacon_Packet.Parking1_Beacon_ID[i]; //Get Beacon_ID of 1st nearby Beacon Device Lora_Packet_To_Send[Pos++] = Fixed_Beacon_Packet.Parking1_Beacon_Signal_Strength; //Get Signal Strength of 1st nearby Beacon Device for(i=0;i<6;i++) Lora_Packet_To_Send[Pos++] = Fixed_Beacon_Packet.Parking2_Beacon_ID[i]; //Get Beacon_ID of 2nd nearby Beacon Device Lora_Packet_To_Send[Pos++] = Fixed_Beacon_Packet.Parking2_Beacon_Signal_Strength; //Get Signal Strength of 2nd nearby Beacon Device for(i=0;i<6;i++) Lora_Packet_To_Send[Pos++] = Fixed_Beacon_Packet.Parking3_Beacon_ID[i]; //Get Beacon_ID of 3rd nearby Beacon Device Lora_Packet_To_Send[Pos++] = Fixed_Beacon_Packet.Parking3_Beacon_Signal_Strength; //Get Signal Strength of 3rd nearby Beacon Device Lora_Packet_To_Send[Pos++] = CheckIN_Lora_Packet.Sequence_No; //Packet Sequence number Lora_Packet_To_Send[Pos++] = Calculate_Lora_Frame_FCS(Lora_Packet_To_Send,Pos); //Calculate FCS of all bytes CheckIN_Packet_Sent_Count++; Send_Lora_Packet_To_Gateway(Lora_Packet_To_Send,Pos); for(i=0; i < Pos; i++) { pc2.putc(Lora_Packet_To_Send[i]); //pc2.putc(Command_To_Send[i]); } pc2.printf("CheckIN Packet Sent"); CheckIN_Lora_Packet.Sequence_No++; pc2.printf("Status Packet Sequence Number %d",CheckIN_Lora_Packet.Sequence_No); } //CheckIN packets sending should be started when device is plugged in to the vehicle. It should be sent every 5sec for 2minutes and afterthat it should stop sending void Send_CheckOUT_Packet(void) { //write code to read OBD data,temperature,beacon data uint8 Pos = 10,i; Lora_Packet_To_Send[Pos++] = CHECKOUT_PACKET_CMD; //Checkout detected. Set packet type to Checkout type for(i=0;i < 17;i++) Lora_Packet_To_Send[Pos++] = Misc_Packet_Data.VIN[i]; //Get OBD_ID for(i=0;i < 3;i++) Lora_Packet_To_Send[Pos++] = Misc_Packet_Data.ODO_METER_READING[i]; //Get OBD_ID Lora_Packet_To_Send[Pos++] = (Misc_Packet_Data.OBD_Battery_Voltage >> 8); //Get OBD_Battery Voltage Lora_Packet_To_Send[Pos++] = (Misc_Packet_Data.OBD_Battery_Voltage & 0xFF); //Get OBD_Battery Voltage Lora_Packet_To_Send[Pos++] = (Misc_Packet_Data.Car_Battery_Voltage >> 8); //Get Vehicle_Battery Temperature Lora_Packet_To_Send[Pos++] = (Misc_Packet_Data.Car_Battery_Voltage & 0xFF); //Get Vehicle_Battery Temperature Lora_Packet_To_Send[Pos++] = Misc_Packet_Data.OBD_Battery_Temperature; //Get Battery Temperature Lora_Packet_To_Send[Pos++] = Misc_Packet_Data.Car_Ambient_Temperature; //Get Ambient Temperature Lora_Packet_To_Send[Pos++] = CheckOUT_Packet.Sequence_No; //Packet Sequence number Lora_Packet_To_Send[Pos++] = Calculate_Lora_Frame_FCS(Lora_Packet_To_Send,Pos); //Calculate FCS of all bytes CheckIN_Packet_Sent_Count++; Send_Lora_Packet_To_Gateway(Lora_Packet_To_Send,Pos); for(i=0; i < Pos; i++) { pc2.putc(Lora_Packet_To_Send[i]); //pc2.putc(Command_To_Send[i]); }pc2.printf("CheckOUT Packet Sent"); CheckOUT_Packet.Sequence_No++; pc2.printf("Status Packet Sequence Number %d",CheckOUT_Packet.Sequence_No); } //Motion packets sending should be started when vehicle acceleration changes like when it starts moving,stops moving and gets sudden jurk in case of theft. // It should be sent every 30sec for 2minutes and afterthat it should stop sending void Send_Motion_Packet(void) { //write code to read accelerometer data,temperature,beacon data uint8 Pos = 10,i; Lora_Packet_To_Send[Pos++] = (Motion_Lora_Packet.Packet_Type & 0xFF); //LSB of Motion Packet Type for(i=0;i<6;i++) Lora_Packet_To_Send[Pos++] = Fixed_Beacon_Packet.Parking1_Beacon_ID[i]; //Get Beacon_ID of 1st nearby Beacon Device Lora_Packet_To_Send[Pos++] = Fixed_Beacon_Packet.Parking1_Beacon_Signal_Strength; //Get Signal Strength of 1st nearby Beacon Device for(i=0;i<6;i++) Lora_Packet_To_Send[Pos++] = Fixed_Beacon_Packet.Parking2_Beacon_ID[i]; //Get Beacon_ID of 2nd nearby Beacon Device Lora_Packet_To_Send[Pos++] = Fixed_Beacon_Packet.Parking2_Beacon_Signal_Strength; //Get Signal Strength of 2nd nearby Beacon Device for(i=0;i<6;i++) Lora_Packet_To_Send[Pos++] = Fixed_Beacon_Packet.Parking3_Beacon_ID[i]; //Get Beacon_ID of 3rd nearby Beacon Device Lora_Packet_To_Send[Pos++] = Fixed_Beacon_Packet.Parking3_Beacon_Signal_Strength; //Get Signal Strength of 3rd nearby Beacon Device for(i=0;i<6;i++) Lora_Packet_To_Send[Pos++] = Near_Car_Beacon_Packet.Near_Car1_Beacon_ID[i]; //Get Beacon_ID of 1st nearby Beacon Device Lora_Packet_To_Send[Pos++] = Near_Car_Beacon_Packet.Near_Car1_Beacon_Signal_Strength; //Get Signal Strength of 1st nearby Beacon Device for(i=0;i<6;i++) Lora_Packet_To_Send[Pos++] = Near_Car_Beacon_Packet.Near_Car2_Beacon_ID[i]; //Get Beacon_ID of 2nd nearby Beacon Device Lora_Packet_To_Send[Pos++] = Near_Car_Beacon_Packet.Near_Car2_Beacon_Signal_Strength; //Get Signal Strength of 2nd nearby Beacon Device for(i=0;i<6;i++) Lora_Packet_To_Send[Pos++] = Near_Car_Beacon_Packet.Near_Car3_Beacon_ID[i]; //Get Beacon_ID of 3rd nearby Beacon Device Lora_Packet_To_Send[Pos++] = Near_Car_Beacon_Packet.Near_Car3_Beacon_Signal_Strength; //Get Signal Strength of 3rd nearby Beacon Device Lora_Packet_To_Send[Pos++] = Motion_Lora_Packet.Acceleration_Type; //get Type of Acceleration for(i=0;i<6;i++) Lora_Packet_To_Send[Pos++] = Near_Car_Beacon_Packet.Near_Car1_Beacon_ID[i]; //Get Beacon_ID of 1st nearby Beacon Device Lora_Packet_To_Send[Pos++] = Near_Car_Beacon_Packet.Near_Car1_Beacon_Signal_Strength; //Get Signal Strength of 1st nearby Beacon Device for(i=0;i<6;i++) Lora_Packet_To_Send[Pos++] = Near_Car_Beacon_Packet.Near_Car2_Beacon_ID[i]; //Get Beacon_ID of 2nd nearby Beacon Device Lora_Packet_To_Send[Pos++] = Near_Car_Beacon_Packet.Near_Car2_Beacon_Signal_Strength; //Get Signal Strength of 2nd nearby Beacon Device for(i=0;i<6;i++) Lora_Packet_To_Send[Pos++] = Near_Car_Beacon_Packet.Near_Car3_Beacon_ID[i]; //Get Beacon_ID of 3rd nearby Beacon Device Lora_Packet_To_Send[Pos++] = Near_Car_Beacon_Packet.Near_Car3_Beacon_Signal_Strength; //Get Signal Strength of 3rd nearby Beacon Device Lora_Packet_To_Send[Pos++] = Motion_Lora_Packet.Sequence_No; //Packet Sequence number Lora_Packet_To_Send[Pos++] = Calculate_Lora_Frame_FCS(Lora_Packet_To_Send,Pos); //Calculate FCS of all bytes Motion_Packet_Sent_Count++; Send_Lora_Packet_To_Gateway(Lora_Packet_To_Send,Pos); for(i=0; i < Pos; i++) { pc2.putc(Lora_Packet_To_Send[i]); //pc2.putc(Command_To_Send[i]); }Motion_Lora_Packet.Sequence_No++; } void Get_Lora_Response(void) { static uint16 Temp_Pos1,Temp_pos2; static uint8 Lora_Response_Found = 0x00; static uint8 Response_Start_Pos[5]; Lora_Response_Found = 0; Temp_Pos1 = LORA_UART_RX_Crnt_Pos = 0; while(Temp_Pos1 < Lora_RxBuffer_End_Pos) { //check for end of AT response to calculate length if((LORA_UART_RX_Buffer[Temp_Pos1] != 0x0D) || (LORA_UART_RX_Buffer[Temp_Pos1+1] != 0x0A)) { //check for AT end response <cr><lf> (i.e. 0x0D,0x0A) Temp_Pos1++; } else { Temp_Pos1+=2; Response_Start_Pos[Lora_Response_Found++] = Temp_Pos1; /*pc2.printf("\nEcho data\n"); for(Temp_pos2 = LORA_UART_RX_Crnt_Pos;Temp_pos2<Temp_Pos1;Temp_pos2++) pc2.printf("0x%2x ",(LORA_UART_RX_Buffer[Temp_pos2]));*/ if(Lora_Response_Found >= 4) break; } } if(Lora_Response_Found >= 3) { if((Response_Start_Pos[1] - Response_Start_Pos[0]) > 0x02) //Response received without data { LORA_UART_RX_Crnt_Pos = (Response_Start_Pos[0]); Response_Start_Pos[1]-=2; //pc2.printf("\n Response packet\n"); for(Temp_Pos1=0; LORA_UART_RX_Crnt_Pos < Response_Start_Pos[1]; Temp_Pos1++) { Lora_Command_Rcvd[Temp_Pos1] = LORA_UART_RX_Buffer[LORA_UART_RX_Crnt_Pos++]; //pc2.printf("0x%2x ",(Lora_Command_Rcvd[Temp_Pos1])); //pc2.putc(Lora_Command_Rcvd[Temp_Pos1]); } //pc2.printf("\nTotal Reecived Bytes %d\n",LORA_UART_RX_Crnt_Pos); Lora_RxBuffer_End_Pos = 0; AT_Response_Receive_Status = SUCCESS; } else if((Response_Start_Pos[1] - Response_Start_Pos[0]) == 0x02) //Response received along with data { LORA_UART_RX_Crnt_Pos = (Response_Start_Pos[1]); Response_Start_Pos[2]-=2; //pc2.printf("\n Response packet\n"); for(Temp_Pos1=0; LORA_UART_RX_Crnt_Pos < Response_Start_Pos[2]; Temp_Pos1++) { Lora_Command_Rcvd[Temp_Pos1] = LORA_UART_RX_Buffer[LORA_UART_RX_Crnt_Pos++]; //pc2.putc(Lora_Command_Rcvd[Temp_Pos1]); } /*for(Temp_Pos1=0; Temp_Pos1 < Length; Temp_Pos1++) { pc2.printf("0x%2x ",(Lora_Command_Rcvd[Temp_Pos1])); }*/ //pc2.printf("\nTotal Reecived Bytes %d\n",LORA_UART_RX_Crnt_Pos); Lora_RxBuffer_End_Pos = 0; AT_Response_Receive_Status = SUCCESS; } } } //Function to send general Lora packets using "AT+SEND" Command void Send_Lora_Packet_To_Gateway(uint8* Command_To_Send,uint8 Length) { uint8 i=0; for(i=0; i < Length; i++) { LORA_Module_UART.putc(Command_To_Send[i]); //pc2.putc(Command_To_Send[i]); } //LORA_Module_UART.printf("\r"); pc2.printf("\n Sending packet\n"); for(i=0; i < Length; i++) { pc2.printf("0x%2x ",(Command_To_Send[i])); } // LORA_Module_UART.printf("%s",Command_To_Send); pc2.printf("\nTotal Bytes %d\n",Length); } /* //Function to send general Lora packets using "AT+SEND" Command void Send_Lora_Packet_To_Gateway(uint8* Command_To_Send,uint8 Length) { uint8 i=0; //pc2.printf("Sending data"); // LORA_Module_UART.printf("%s",Send_Lora_Packet);//write to serial port for sending through lora module /*for(i=0; i < 7; i++) { LORA_Module_UART.putc(Send_Lora_Packet[i]); } for(i=0; i < Length; i++) { LORA_Module_UART.putc(Command_To_Send[i]); pc2.putc(Command_To_Send[i]); } for(i=0; i < Length; i++) { pc2.putc(Command_To_Send[i]); } // LORA_Module_UART.printf("%s",Command_To_Send); LORA_Module_UART.printf("\r"); pc2.printf("Total Bytes %d",Length); }*/ unsigned char Calculate_Lora_Frame_FCS(unsigned char* Packet_Data,unsigned char Packet_Length) { uint8 i,FCS = 0x00; for(i=0; i < Packet_Length; i++) { FCS ^= (Packet_Data[i]); } return(FCS); }