您的位置 首页 新能源

STM32+W5500+MQTT+Android完成长途数据收集及操控

0前言最近在学习MQTT,发现MQTT还是挺好用的,于是花了点时间做了一个简单的应用示例,希望能给需要做这方面的人一些参考。相关背景知识

0 前语

最近在学习MQTT,发现MQTT仍是挺好用的,所以花了点时刻做了一个简略的运用示例,期望能给需要做这方面的人一些参阅。
相关布景常识:http://www.embed-net.com/thread-224-1-1.html
详细功能为:
1,STM32F405为主控芯片,它经过传感器收集环境数据,比方温度,湿度,光照度,大气压强等;
2,主控芯片经过W5500模块将丈量的数据经过MQTT协议方法发布到MQTT服务器(服务器域名和IP见固件程序);
3,主控订阅LED灯操控的音讯,当接收到对应的操控指令后点亮或许平息对应的LED灯;
4,安卓手机端订阅传感器数据的音讯,当接收到音讯后将传感器数据在界面显现;
5,安卓手机可发送点亮或许平息LED灯的指令到服务器,然后服务器会将该指令转发给STM32主控,然后STM32主控解析该指令并履行指令。

1 单片机端完成
MQTT协议是依据TCP的协议,所以咱们只需要在单片机端完成TCP客户端代码之后就很简略移植MQTT了,STM32F4+W5500完成TCP客户端的代码咱们曾经现已完成过,代码下载地址为:
http://www.embed-net.com/thread-87-1-1.html
当然,假如你想在代码里边直接运用服务器域名方法进行衔接,咱们还得在TCP客户端代码里边集成DNS的代码,当然在上面这个衔接里边也有相关的代码。
MQTT代码源码下载地址:
http://www.eclipse.org/paho/
在STM32这边咱们运用的是C/C++ MQTT Embedded clients代码。
硬件衔接如下图所示:

1.1 MQTT的移植
MQTT的移植十分简略,将C/C++ MQTT Embedded clients的代码添加到工程中,然后咱们只需要再次封装4个函数即可:

int transport_sendPacketBuffer(unsigned char* buf, int buflen);
int transport_getdata(unsigned char* buf, int count);
int transport_open(void);
int transport_close(void);

transport_sendPacketBuffer:经过网络以TCP的方法发送数据;
transport_getdata:TCP方法从服务器端读取数据,该函数现在归于堵塞函数;
transport_open:翻开一个网络接口,其实便是和服务器树立一个TCP衔接;
transport_close:封闭网络接口。
假如现已移植好了socket方法的TCP客户端的程序,那么这几个函数的封装也是十分简略的,程序代码如下所示:

int transport_sendPacketBuffer(unsigned char* buf, int buflen)
{
return send(SOCK_TCPS,buf,buflen);
}

int transport_getdata(unsigned char* buf, int count)
{
return recv(SOCK_TCPS,buf,count);
}

int transport_open(void)
{
int32_t ret;
//新建一个Socket并绑定本地端口5000
ret = socket(SOCK_TCPS,Sn_MR_TCP,5000,0×00);
if(ret != SOCK_TCPS){
printf(“%d:Socket Error”,SOCK_TCPS);
while(1);
}else{
printf(“%d:Opened”,SOCK_TCPS);
}

//衔接TCP服务器
ret = connect(SOCK_TCPS,domain_ip,1883);//端口有必要为1883
if(ret != SOCK_OK){
printf(“%d:Socket Connect Error”,SOCK_TCPS);
while(1);
}else{
printf(“%d:Connected”,SOCK_TCPS);
}
return 0;
}

int transport_close(void)
{
close(SOCK_TCPS);
return 0;
}

完成了这几个函数,然后咱们就可以依据官方供给的示例代码完成咱们自己的代码了,比方咱们向代理服务器发送一个音讯的代码如下所示:

int mqtt_publish(char *pTopic,char *pMessage)
{
int32_t len,rc;
MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
unsigned char buf[200];
MQTTString topicString = MQTTString_initializer;
int msglen = strlen(pMessage);
int buflen = sizeof(buf);

data.clientID.cstring = “me”;
data.keepAliveInterval = 5;
data.cleansession = 1;
len = MQTTSerialize_connect(buf, buflen, &data);

topicString.cstring = pTopic;
len += MQTTSerialize_publish(buf + len, buflen – len, 0, 0, 0, 0, topicString, (unsigned char*)pMessage, msglen);

len += MQTTSerialize_disconnect(buf + len, buflen – len);
transport_open();
rc = transport_sendPacketBuffer(buf,len);
transport_close();
if (rc == len)
printf(“Successfully published”);
else
printf(“Publish failed”);
return 0;
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/xinnengyuan/258705.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部