Commit 0dc240cf authored by 957dd's avatar 957dd

Merge branch 'master' of ship-controlserver

parents 32a66a1e a3944981
main
log/*
#include "ip.h"
struct ifaddrs *ifap, *ifa;
struct sockaddr_in *sa;
char ip_address[INET_ADDRSTRLEN];
int ipaddr() {
if (getifaddrs(&ifap) == -1) {
perror("getifaddrs() error");
return -1;
}
for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa->ifa_addr != NULL && ifa->ifa_addr->sa_family == AF_INET) {
sa = (struct sockaddr_in *) ifa->ifa_addr;
inet_ntop(AF_INET, &sa->sin_addr, ip_address, sizeof(ip_address));
//printf("%s: %s ", ifa->ifa_name, ip_address);
}
}
printf("ip:%s\n",ip_address);
freeifaddrs(ifap);
}
#ifndef __IP_H__
#define __IP_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <ifaddrs.h>
int ipaddr();
extern char ip_address[INET_ADDRSTRLEN];
#endif
#include"mqttjson.h"
#include "ip.h"
int keepRunning = 1;
const int gmiddlepwm=0;
// 睡眠毫秒
void sleepms(){
struct timespec ts;
ts.tv_sec = 0; // 秒
ts.tv_nsec = 1000000; // 纳秒,0.5秒等于500,000,000纳秒
nanosleep(&ts, NULL);
}
void sleepmsv2(int val){
struct timespec ts;
ts.tv_sec = 0; // 秒
ts.tv_nsec = val*1000000; // 纳秒,0.5秒等于500,000,000纳秒
nanosleep(&ts, NULL);
}
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;
}
void *right_function(void *arg)
{
while(keepRunning){
sleepmsv2(1);
gRightPwmCount++;
if (gRightPwmCount>200){
pwmWrite(gRightPwmPin,gmiddlepwm); //中间
gRightPwmCount=2001;
} else{
int pwm2 = gRightPwm*9; //gLeftPwm(0-100)
pwmWrite(gRightPwmPin,pwm2); //0-150-300
}
}
return NULL;
}
int main(int argc, char *argv[]) {
struct mosquitto *mosq;
int rc,ret;
gStart=time(NULL);
// 初始化 mosquitto 库
mosquitto_lib_init();
// 创建 mosquitto 客户端
mosq = mosquitto_new(CLIENT_ID, true, NULL);
if (!mosq) {
fprintf(stderr, "Failed to create mosquitto client\n");
return EXIT_FAILURE;
}
// 设置连接和消息回调
mosquitto_connect_callback_set(mosq, on_connect);
mosquitto_message_callback_set(mosq, on_message);
// 设置用户名和密码
mosquitto_username_pw_set(mosq, USERNAME, PASSWORD);
// 连接到 MQTT 代理
rc = mosquitto_connect(mosq, BROKER_ADDRESS, BROKER_PORT, 60);
if (rc != MOSQ_ERR_SUCCESS) {
fprintf(stderr, "Failed to connect to broker: %s\n", mosquitto_strerror(rc));
mosquitto_destroy(mosq);
return EXIT_FAILURE;
}
ipaddr();
//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];
if(pthread_create(&thread[0],NULL,left_function,NULL)!=0)
{
perror("Failed to create thread 1");
return 1;
}
if(pthread_create(&thread[1],NULL,right_function,NULL)!=0)
{
perror("Failed to create thread 1");
return 1;
}
// 开始循环,处理网络流量
mosquitto_loop_forever(mosq, -1, 1); // -1 表示无限等待,1 表示处理消息的最大数量
// 清理
mosquitto_destroy(mosq);
mosquitto_lib_cleanup();
// 等待线程1结束
pthread_join(thread[0], NULL);
// 等待线程2结束
pthread_join(thread[1], NULL);
return EXIT_SUCCESS;
}
\ 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
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