Files

183 lines
4.7 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h> // gettimeofday
#include <sys/stat.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <errno.h>
#include <pthread.h>
#include "serial.h"
#include "uartinf.h"
#include <stdbool.h>
#include "parase.h"
char _rx_data[200];
unsigned char tx_jingdu[] = {0x01, 0x03, 0x00, 0xcf, 0x00, 0x03,0x35,0xf4};
unsigned char tx_weidu[] = {0x01, 0x03, 0x00, 0xd2, 0x00, 0x03,0xa5,0xf2};
unsigned char tx_state[] = {0x01, 0x03, 0x00, 0xc8, 0x00, 0x01,0x05,0xf4};
static int socket_descriptor;
static struct sockaddr_in address;
//bool first = false;
int socket_descriptor_recv;
struct sockaddr_in address_recv;
pthread_attr_t attr;
pthread_t pkts_thread;
// 定义数据发送格式结构体
typedef struct {
char header[2]; // 帧头 0xAA 0x55
uint16_t dingwei_state;
uint32_t longitude; // 经度
uint32_t latitude; // 纬度
char footer; // 帧尾 0xFF
} LocationData;
// 互斥锁保护经纬度数据访问
pthread_mutex_t loc_mutex = PTHREAD_MUTEX_INITIALIZER;
uint32_t lon_val;
uint32_t lat_val;
uint16_t state_val;
int udp_init(char *ip, int port){
bzero(&address,sizeof(address));
address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr(ip);
address.sin_port=htons(port);
socket_descriptor=socket(AF_INET,SOCK_DGRAM,0);//IPV4
return 0;
}
int send_specified_bytes(UART_INTF uart_type,unsigned char *data) {
int ret = uart_write_len(uart_type, (char*)data, 8);
if (ret < 0) {
printf("发送失败,返回值: %d\n", ret);
}
return ret;
}
uint32_t parse_tude(unsigned char *data, int start_idx){
return ((uint32_t)data[start_idx + 3] << 24 |
(uint32_t)data[start_idx + 2] << 16 |
(uint32_t)data[start_idx + 1] << 8 |
(uint32_t)data[start_idx ]);
}
// 发送经纬度数据
void send_location_data() {
LocationData loc_data;
pthread_mutex_lock(&loc_mutex);
// 初始化数据包
loc_data.header[0] = 0xAA;
loc_data.header[1] = 0x55;
loc_data.dingwei_state = state_val;
loc_data.longitude = lon_val;
loc_data.latitude = lat_val;
loc_data.footer = 0xFF;
pthread_mutex_unlock(&loc_mutex);
// 发送数据
int send_len = sendto(socket_descriptor, &loc_data, sizeof(LocationData),
0, (struct sockaddr *)&address, sizeof(address));
if (send_len < 0) {
perror("发送经纬度失败");
} else {
//printf("成功发送经纬度数据,长度: %d 字节\n", send_len);
}
}
// 经纬度发送线程函数
void *send_location_thread(void *arg) {
while (1) {
send_location_data();
// 1秒发送一次
sleep(1);
}
return NULL;
}
#if 1
int pthread_init()
{
int ret;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
ret = pthread_create(&pkts_thread, &attr, send_location_thread, NULL);
pthread_attr_destroy(&attr);
if(ret){
printf("create pthread1 error\n");
return 1;
}
}
#endif
int main (int argc, char *argv[])
{
int n_read;
n_read = uart_init(ROUTE_UART, "/dev/ttyAMA4", 9600, 'N');
if(n_read <=0 ) {
printf("open /dev/ttyAMA4 failed\n");
return -1;
}
udp_init(argv[1], atoi(argv[2]));
pthread_init();
while(1){
send_specified_bytes(ROUTE_UART,tx_state);
n_read = uart_read(ROUTE_UART, _rx_data);
if(n_read >0 && _rx_data[2]==0x02 ){
pthread_mutex_lock(&loc_mutex);
state_val=(uint16_t)_rx_data[3] |(uint16_t)_rx_data[4]<<8;
pthread_mutex_unlock(&loc_mutex);
//printf("%x \n",state_val);
}
usleep(100000);
send_specified_bytes(ROUTE_UART,tx_jingdu);
n_read = uart_read(ROUTE_UART, _rx_data);
if(n_read >0 &&(_rx_data[4]==0x45||_rx_data[4]==0x57)){
pthread_mutex_lock(&loc_mutex);
lon_val = parse_tude(_rx_data, 5);
//current_longitude = parse_longitude(_rx_data);
pthread_mutex_unlock(&loc_mutex);
//printf("经度: %x°\n", lon_val);
}
usleep(100000);
send_specified_bytes(ROUTE_UART,tx_weidu);
n_read = uart_read(ROUTE_UART, _rx_data);
if(n_read >0 &&(_rx_data[4]==0x4E || _rx_data[4]==0x53)){
pthread_mutex_lock(&loc_mutex);
lat_val = parse_tude(_rx_data, 5);
//current_latitude = parse_latitude(_rx_data);
pthread_mutex_unlock(&loc_mutex);
//printf("纬度: %x°\n", lat_val);
}
usleep(500000);
}
}