Commit 1568ed46 authored by mingyu's avatar mingyu

241130

parent 848760a0
#include"mqttjson.h"
#include "ip.h" #include "ip.h"
#include "mqtt.h"
#include "serial.h"
struct mosquitto *mosq; int keepRunning = 1;
const int gmiddlepwm=0;
void Delay_Ms()
{ // 睡眠毫秒
void sleepms(){
struct timespec ts; struct timespec ts;
ts.tv_sec = 0; // 秒 ts.tv_sec = 0; // 秒
ts.tv_nsec = 100000000; // 1毫秒 = 1000000纳秒 ts.tv_nsec = 1000000; // 纳秒,0.5秒等于500,000,000纳秒
nanosleep(&ts,NULL); nanosleep(&ts, NULL);
}
}
void *serial_usart1(void *arg) void sleepmsv2(int val){
{ struct timespec ts;
ts.tv_sec = 0; // 秒
ts.tv_nsec = val*1000000; // 纳秒,0.5秒等于500,000,000纳秒
nanosleep(&ts, NULL);
serial_Receive(); }
void *left_function(void *arg)
{
printf("Thread speed is runing\n");
while(keepRunning){
sleepmsv2(1);
gLeftPwmCount++;
//printf("gLeftPwmCount:%d\n",gLeftPwmCount);
if (gLeftPwmCount>200){
//printf("mid:%d \n",gmiddlepwm);
pwmWrite(gLeftPwmPin,gmiddlepwm); //中间
// digitalWrite(Pin_left1,LOW);
// digitalWrite(Pin_left2,LOW);
gLeftPwmCount = 201;
} else{
int pwm1 = gLeftPwm*9;
//gLeftPwm(0-100)
pwmWrite(gLeftPwmPin,pwm1); //0-150-300
//printf("gLeftPwm:%d,pwm:%d\n",gLeftPwm,pwm1);
}
}
return NULL; return NULL;
} }
void *AppExit(void *arg) void *right_function(void *arg)
{ {
unsigned char bufpwm1[3]={0x01,0x01,0x00}; while(keepRunning){
unsigned char bufpwm2[3]={0x01,0x02,0x00}; sleepmsv2(1);
unsigned char bufpwm3[3]={0x01,0x03,0x00}; gRightPwmCount++;
while(1) if (gRightPwmCount>200){
{ pwmWrite(gRightPwmPin,gmiddlepwm); //中间
Delay_Ms(); gRightPwmCount=2001;
gPwmCount++; } else{
if(gPwmCount>20) int pwm2 = gRightPwm*9; //gLeftPwm(0-100)
{ pwmWrite(gRightPwmPin,pwm2); //0-150-300
gPwmCount=21;
serial_Write(bufpwm1);
serial_Write(bufpwm2);
serial_Write(bufpwm3);
} }
} }
return NULL; return NULL;
} }
int main(int argc, char *argv[]) {
//struct mosquitto *mosq;
int rc=0;
serial_Init();
int main(int argc, char *argv[]) {
struct mosquitto *mosq;
int rc,ret;
gStart=time(NULL); gStart=time(NULL);
// 初始化 mosquitto 库 // 初始化 mosquitto 库
mosquitto_lib_init(); mosquitto_lib_init();
...@@ -79,26 +96,41 @@ int main(int argc, char *argv[]) { ...@@ -79,26 +96,41 @@ int main(int argc, char *argv[]) {
} }
ipaddr(); ipaddr();
mosquitto_publish(mosq, NULL, TOPIC, strlen(ip_address), ip_address, 0, false);//将ip发送给mqtt //printf("%s\n",ip_address);
mosquitto_publish(mosq, NULL, "controlship/01", strlen(ip_address), ip_address, 0, false);//将ip发送给mqtt
if (wiringPiSetup()== -1) {
printf("pin set fail\n");
return 1;
}
setinit();
pinMode(gLeftPwmPin,PWM_OUTPUT);
pwmSetClock(gLeftPwmPin,328);//=19200*1000/(hz*2000)
pwmSetRange(gLeftPwmPin,1000);
pinMode(gRightPwmPin,PWM_OUTPUT);
pwmSetClock(gRightPwmPin,328);//=19200*1000/(hz*2000)
pwmSetRange(gRightPwmPin,1000);
pthread_t thread[2]; pthread_t thread[2];
if(pthread_create(&thread[0],NULL,serial_usart1,NULL)!=0) if(pthread_create(&thread[0],NULL,left_function,NULL)!=0)
{ {
perror("Failed to create thread 1"); perror("Failed to create thread 1");
return 1; return 1;
} }
if(pthread_create(&thread[1],NULL,AppExit,NULL)!=0) if(pthread_create(&thread[1],NULL,right_function,NULL)!=0)
{ {
perror("Failed to create thread 2"); perror("Failed to create thread 1");
return 1; return 1;
} }
// 开始循环,处理网络流量 // 开始循环,处理网络流量
//mosquitto_loop_start(mosq);//后台处理 mosquitto_loop_forever(mosq, -1, 1); // -1 表示无限等待,1 表示处理消息的最大数量
mosquitto_loop_forever(mosq, -1, 1000); // -1 表示无限等待,1 表示处理消息的最大数量
// 清理 // 清理
mosquitto_destroy(mosq); mosquitto_destroy(mosq);
......
#include "mqtt.h"
time_t gStart;
int gPwmCount = 0; // 计数
void on_connect(struct mosquitto *mosq, void *obj, int rc)
{
if (rc == 0)
{
printf("Connected to broker\n");
mosquitto_subscribe(mosq, NULL, TOPIC, 0);
time_t start=time(NULL);
}
else
{
fprintf(stderr, "Connection failed with code %d\n", rc);
}
}
void on_message(struct mosquitto *mosq, void *obj, const struct mosquitto_message *message) {
time_t end = time(NULL);
if(gStart+5>end)
{
printf("正在处理过期消息");
return;
}
// 确保消息有效
if (message->payload && message->payloadlen)
{
// 将消息内容转换为字符串
char *payload_str = (char *)malloc(message->payloadlen + 1);
if (payload_str)
{
memcpy(payload_str, message->payload, message->payloadlen);
payload_str[message->payloadlen] = '\0';
// 解析 JSON
cJSON *json = cJSON_Parse(payload_str);
if (json == NULL)
{
fprintf(stderr, "Error before: [%s]\n", cJSON_GetErrorPtr());
}
else
{
// 提取 head 对象
cJSON *head = cJSON_GetObjectItem(json, "head");
if (!cJSON_IsObject(head))
{
return;
}
// 提取 message_type
cJSON *message_type = cJSON_GetObjectItem(head, "message_type");
if (!cJSON_IsNumber(message_type))
{
return;
}
cJSON *body = cJSON_GetObjectItem(json, "body");
if (!cJSON_IsObject(body))
{
return;
}
printf("message_type: %d\n", message_type->valueint);
if (message_type->valueint==3)
{ //pwm控制
// 提取 pin_ctrl_req 对象
cJSON *pwm_ctrl_req = cJSON_GetObjectItem(body, "p_ctrl_req");
if (!cJSON_IsObject(pwm_ctrl_req))
{
return;
}
// 提取 data 数组
cJSON *data = cJSON_GetObjectItem(pwm_ctrl_req, "data");
if (!cJSON_IsArray(data))
{
return;
}
// 遍历数组
for (int i = 0; i < cJSON_GetArraySize(data); ++i)
{
// 提取数组中的每个对象
cJSON *item = cJSON_GetArrayItem(data, i);
if (!cJSON_IsObject(item))
{
continue;
}
cJSON *mode = cJSON_GetObjectItem(item, "mode"); //mode=1 速度,mode=2 转向(unsigned char)
cJSON *type = cJSON_GetObjectItem(item, "type");
cJSON *val = cJSON_GetObjectItem(item, "val"); //val为pwm的值 0~100(unsigned char)(unsigned char)
unsigned char modeTmep= mode->valueint;
unsigned char typeTemp=type->valueint;
unsigned char valtemp= val->valueint;
unsigned char valt[4];
valt[0]=modeTmep;
valt[1]=typeTemp;
valt[2]=valtemp;
gPwmCount = 0;
printf("%d\n",valt[0]);
printf("%d\n",valt[1]);
printf("%d\n",valt[2]);
serial_Write(valt);
}
}
// 释放 payload 字符串
free(payload_str);
}
}
}
}
\ No newline at end of file
#ifndef __MQTT_H__
#define __MQTT_H__
#include <mosquitto.h>
#include <cjson/cJSON.h>
#include<time.h>
#include <pthread.h>
#include "ip.h"
#include "serial.h"
#define BROKER_ADDRESS "119.45.167.177"
#define BROKER_PORT 1883
#define CLIENT_ID "device1car/carerw5"
#define TOPIC "devices/controcar05"
#define USERNAME "admin" // 替换为你的用户名
#define PASSWORD "admin" // 替换为你的密码
extern time_t gStart;
extern int gPwmCount; // 计数
void on_connect(struct mosquitto *mosq, void *obj, int rc);
void on_message(struct mosquitto *mosq, void *obj, const struct mosquitto_message *message) ;
#endif
\ No newline at end of file
#include"mqttjson.h"
time_t gStart;
int gLeftPwmPin = 21;
int gLeftPwm = 0;
int gLeftPwmCount = 0; // 计数
int gRightPwmPin = 2;
int gRightPwm = 0;
int gRightPwmCount = 0; // 计数
void on_connect(struct mosquitto *mosq, void *obj, int rc)
{
if (rc == 0)
{
printf("Connected to broker\n");
mosquitto_subscribe(mosq, NULL, TOPIC, 0);
time_t start=time(NULL);
}
else
{
fprintf(stderr, "Connection failed with code %d\n", rc);
}
}
void on_message(struct mosquitto *mosq, void *obj, const struct mosquitto_message *message) {
time_t end = time(NULL);
if(gStart+5>end)
{
printf("正在处理过期消息");
return;
}
// 确保消息有效
if (message->payload && message->payloadlen) {
// 将消息内容转换为字符串
char *payload_str = (char *)malloc(message->payloadlen + 1);
if (payload_str) {
memcpy(payload_str, message->payload, message->payloadlen);
payload_str[message->payloadlen] = '\0';
// 解析 JSON
cJSON *json = cJSON_Parse(payload_str);
if (json == NULL) {
fprintf(stderr, "Error before: [%s]\n", cJSON_GetErrorPtr());
} else {
// 提取 head 对象
cJSON *head = cJSON_GetObjectItem(json, "head");
if (!cJSON_IsObject(head)) {
return;
}
// 提取 message_type
cJSON *message_type = cJSON_GetObjectItem(head, "message_type");
if (!cJSON_IsNumber(message_type)) {
return;
}
cJSON *body = cJSON_GetObjectItem(json, "body");
if (!cJSON_IsObject(body)) {
return;
}
printf("message_type: %d\n", message_type->valueint);
if (message_type->valueint==3){ //pwm控制
// 提取 pin_ctrl_req 对象
cJSON *pwm_ctrl_req = cJSON_GetObjectItem(body, "pwm_ctrl_req");
if (!cJSON_IsObject(pwm_ctrl_req)) {
return;
}
// 提取 data 数组
cJSON *data = cJSON_GetObjectItem(pwm_ctrl_req, "data");
if (!cJSON_IsArray(data)) {
return;
}
// 遍历数组
for (int i = 0; i < cJSON_GetArraySize(data); ++i) {
// 提取数组中的每个对象
cJSON *item = cJSON_GetArrayItem(data, i);
if (!cJSON_IsObject(item)) {
continue;
}
cJSON *mode = cJSON_GetObjectItem(item, "mode"); //mode=1 左前,mode=2 右前,3 左后,4 右后
//cJSON *pin = cJSON_GetObjectItem(item, "pin");
cJSON *val = cJSON_GetObjectItem(item, "val"); //val为pwm的值 0~100
int modeTemp = mode->valueint;
int valTemp = val->valueint;
printf("mode:%d,val:%d\n",modeTemp,valTemp);
if (modeTemp==1){
leftFront();
gLeftPwmCount = 0;
gLeftPwm = valTemp;
printf("gLeftPwmPin pin:%d ,gLeftPwm:%d\n",gLeftPwmPin,gLeftPwm);
}else if(modeTemp==2){
rightFront();
gRightPwmCount = 0;
gRightPwm = valTemp;
printf("gRightPwmPin pin:%d ,gRightPwm:%d\n",gRightPwmPin,gRightPwm);
}else if(modeTemp==3){
leftBack();
gLeftPwmCount = 0;
gLeftPwm = valTemp;
printf("gLeftPwmPin pin:%d ,gLeftPwm:%d\n",gLeftPwmPin,gLeftPwm);
}else if(modeTemp==4){
rightBack();
gRightPwmCount = 0;
gRightPwm = valTemp;
printf("gRightPwmPin pin:%d ,gRightPwm:%d\n",gRightPwmPin,gRightPwm);
}
}
}
else if (message_type->valueint==4){
// 提取 pin_ctrl_req 对象
cJSON *pin_ctrl_req = cJSON_GetObjectItem(body, "pin_ctrl_req");
if (!cJSON_IsObject(pin_ctrl_req)) {
return;
}
// 提取 data 数组
cJSON *data = cJSON_GetObjectItem(pin_ctrl_req, "data");
if (!cJSON_IsArray(data)) {
return;
}
// 遍历数组
for (int i = 0; i < cJSON_GetArraySize(data); ++i) {
// 提取数组中的每个对象
cJSON *item = cJSON_GetArrayItem(data, i);
if (!cJSON_IsObject(item)) {
continue;
}
// 提取 pin
cJSON *pin = cJSON_GetObjectItem(item, "pin");
cJSON *val = cJSON_GetObjectItem(item, "val");
int pinTemp = pin->valueint;
int valTemp = val->valueint;
//printf("12");
// 在这里控制IO口
pinvalue(pinTemp,valTemp);
}
}
}
// 释放 payload 字符串
free(payload_str);
}
}
}
#ifndef __MQTTJSON_H__
#define __MQTTJSON_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <mosquitto.h>
#include <cjson/cJSON.h>
#include<time.h>
#include "pin.h"
extern time_t gStart;
extern int gLeftPwmPin;
extern int gLeftPwm;
extern int gLeftPwmCount; // 计数
extern int gRightPwmPin;
extern int gRightPwm;
extern int gRightPwmCount; // 计数
#define BROKER_ADDRESS "119.45.167.177"
#define BROKER_PORT 1883
#define CLIENT_ID "device/tatalship"
#define TOPIC "controlship/01"
#define USERNAME "admin" // 替换为你的用户名
#define PASSWORD "admin" // 替换为你的密码
void on_connect(struct mosquitto *mosq, void *obj, int rc);
void on_message(struct mosquitto *mosq, void *obj, const struct mosquitto_message *message);
#endif
#include "pin.h"
int Pin_left2=24;
int Pin_left1=26;
int Pin_right1=5;
int Pin_right2=7;
void setinit()
{
int pin[5]={Pin_left2,Pin_left1,Pin_right1,Pin_right2};
for(int i=0;i<5;i++)
{
pinMode(pin[i],OUTPUT);
digitalWrite(pin[i],LOW);
}
printf("INIT OK!!\n");
}
void rightFront()
{
digitalWrite(Pin_right1,HIGH);
digitalWrite(Pin_right2,LOW);
}
void rightBack()
{
digitalWrite(Pin_right1,LOW);
digitalWrite(Pin_right2,HIGH);
}
void leftBack()
{
digitalWrite(Pin_left1,HIGH);
digitalWrite(Pin_left2,LOW);
}
int leftFront()
{
digitalWrite(Pin_left1,LOW);
digitalWrite(Pin_left2,HIGH);
}
void pinvalue(int pin,int val)
{
pinMode(pin,OUTPUT);
if(val==0)
{
printf("pin:%d 为低电平\n",pin);
digitalWrite(pin,LOW);
}
if(val==1)
{
printf("pin:%d 为高电平\n",pin);
digitalWrite(pin,HIGH);
}
}
#ifndef __PIN_H__
#define __PIN_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<softPwm.h>
#include<wiringPi.h>
extern int Pin_left2;
extern int Pin_left1;
extern int Pin_right1;
extern int Pin_right2;
void setinit();
void rightFront();
void rightBack();
void leftBack();
int leftFront();
void pinvalue(int pin,int val);
void pwmhzset();
#endif
\ No newline at end of file
#include "serial.h"
int fd;
int init_serial(const char *port, int baudrate) {
int fd = open(port, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
perror("open serial port");
return -1;
}
struct termios options;
tcgetattr(fd, &options);
// 设置波特率
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);
// 配置串口
options.c_cflag &= ~PARENB; // 无校验
options.c_cflag &= ~CSTOPB; // 1停止位
options.c_cflag &= ~CSIZE; // 清除数据位设置
options.c_cflag |= CS8; // 8数据位
options.c_cflag |= CLOCAL | CREAD; // 忽略调制解调器状态,开启接收器
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // 原始模式
options.c_iflag &= ~(IXON | IXOFF | IXANY); // 禁用流控
options.c_oflag &= ~OPOST; // 原始输出
tcsetattr(fd, TCSANOW, &options);
return fd;
}
void serial_Receive() {
char buffer[254]="\0";
while (1) {
int bytes_read = read(fd, buffer, sizeof(buffer)-1);
if (bytes_read > 0) {
//printf("Received chatdate: %s\n", buffer);
buffer[bytes_read] = '\0';
printf("Received chatdate:: %s\n", buffer);
//int receivedNumber = atoi(buffer);
//printf("Received intdate: %d\n", receivedNumber);
}
}
close(fd);
//free(buffer);
}
void serial_Write(unsigned char *buf)
{
unsigned char buffers[5];
buffers[0]=0xAA;
//write(fd, buffers[0], sizeof(buffers));
for(int i=1;i<4;i++)
{
buffers[i]=buf[i-1];
//write(fd, buffers[i], sizeof(buffers));
}
buffers[4]=0xFE;
write(fd, buffers, sizeof(buffers));
//printf("%d\n",buffers[0]);
//printf("%d\n",buffers[1]);
//printf("%d\n",buffers[2]);
//printf("%d\n",buffers[3]);
//printf("%d\n",buffers[4]);
}
int serial_Init()
{
fd = init_serial(SERIAL_PORT, 115200);
if (fd == -1) return -1;
printf("Serial communication started...\n");
}
#ifndef __SERIAL_H__
#define __SERIAL_H__
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#define SERIAL_PORT "/dev/ttyS3" // 根据实际设备修改
int serial_Init();
void serial_Receive();
void serial_Write(unsigned char *buf);
//extern int fd;
int init_serial(const char *port, int baudrate);
#endif
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment