这段时间在整理树莓派的资料,正巧前段时间学习了串口和MQTT协议的知识,于是就整理了一段程序,将这两者结合起来。
最终实现的效果是,树莓派开发板作为MQTT发送方,发送的数据来源为树莓派连接的电脑,通过串口线将数据先传送给树莓派,再由树莓派发送至接收端。
过程比较繁琐而且怪没必要的哈哈哈,不过作为学习也蛮有意义的。
·PC
·树莓派4b
·网线,电源线
·USB转TTL模块
·烧录好的raspbian系统(其他树莓派系统也可)
·树莓派端安装mosquitto(具体可参见有关博客或登录官网下载http://mosquitto.org/)
·MQTT.fx(安装在PC端)
·串口调试助手(安装在PC端)
首先将USB转TTL模块与树莓派进行连接。需要连接的有三根引脚,其中:
模块的RX端接树莓派的TX端;
模块的TX端接树莓派的RX端;
模块的GND端接树莓派的GND端;
注意RX和TX端的接法不要搞混,在串口中接收的一端(RX)对应连接发送的一端(TX)
为了方便大家接线在这里放一张树莓派4b的管脚图:
之后将模块的USB一端接在电脑上:
在树莓派系统中编辑C语言代码,文件名称为comm_GPIO.c,主要有以下几点参数,可根据自己的需要灵活修改:
·IP地址为自己的IP地址,博主的IP地址假设为127.0.0.1
·端口号为1883
·订阅的主题名为GPIO_message
·串口地址为/dev/ttyAMA0
·波特率为9600
·每隔两秒发送一次消息
接下来放代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define HOST "127.0.0.1"
#define PORT 1883
#define KEEP_ALIVE 60
#define session true
int pinNumber = 1;
int running = 1;
char buff[64];
int fd;
struct mosquitto *mosq = NULL;
void Sig_Handle(int sig)
{
if(sig == SIGINT)
running = 0;
}
int Service_Start()
{
signal(SIGINT, Sig_Handle);
if(wiringPiSetup() < 0)
{
printf("wiringPi setup failed.\n");
return 1;
}
int baudrate = 9600;
if((fd = serialOpen("/dev/ttyAMA0",baudrate)) < 0)
{
printf("serial open failed.\n");
return 1;
}
mosquitto_lib_init();
return 0;
}
int Comm_Gpio(struct mosquitto *mosq, int *mid, const char *topic, int payloadlen, const void *payload, int qos, bool retain)
{
int sz = serialDataAvail(fd);
if(sz > 0)
{
printf("Receiving gpio data...\n");
char *buff =(char*)malloc(sz);
for(int i = 0; i < sz; i++)
{
int c = serialGetchar(fd);
buff[i] = c;
}
mosquitto_publish(mosq,NULL,"GPIO_message",strlen(buff),buff,0,0);
free(buff);
}
else
{
usleep(50000);
}
return 0;
}
int main()
{
mosq = mosquitto_new(NULL,session,NULL);
Service_Start();
if(mosquitto_connect(mosq, HOST, PORT, KEEP_ALIVE)){
fprintf(stderr, "Unable to connect.\n");
return 1;
}
int loop = mosquitto_loop_start(mosq);
if(loop != MOSQ_ERR_SUCCESS){
printf("mosquitto loop error\n");
return 1;
}
while(Service_Start() != 1)
{
Comm_Gpio(mosq,NULL,"GPIO_message",strlen(buff),buff,0,0);
memset(buff,0,sizeof(buff));
sleep(2);
}
mosquitto_loop_stop(mosq,false);
mosquitto_destroy(mosq);
mosquitto_lib_cleanup();
return 0;
}
打开终端输入编译命令,记得在指令后加上-lmosquitto与-lwiringPi选项,完成第三方库的链接:
gcc comm_GPIO.c -o comm_GPIO -lmosquitto -lwiringPi
之后在电脑上打开串口调试助手与MQTT.fx,绑定IP地址,订阅GPIO_message的主题
完成以上步骤后在树莓派终端输入指令运行代码:
./comm_GPIO