微信小程序 阿里云服务器 非物联网平台自建MQTT代理服务器控制树莓派LED

本人大三,临近毕业季,日后希望从事物联网和嵌入式相关工作,所以自己构想了一个项目来练手,之前做大创的时候学了一点微信小程序,大二的时候玩过一段时间的树莓派,寒假的时候买没顶住阿里云服务器的学生优惠买了一年的阿里云的服务器。之前的大创也是一个物联网的相关项目,当时使用的是中国移动的OneNet的物联网平台。

所以我灵机一动,就想到了自己搭建MQTT的代理通过微信小程序来控制树莓派的IO口的项目( •̀ ω •́ )✧

前排提示:我也是个萌新,可能走了很多弯路,如果有迷惑操作欢迎指正相互学习哦(~ ̄▽ ̄)~

前期准备

1.硬件准备

首先说一下完成这个项目我们所需要的硬件

1. 手机一台(IOS/Android皆可)
2. 树莓派(我用的4B 4G版,理论上其他型号也无所谓)
3. LED灯、杜邦线若干

我的成品如图

2.软件准备

下载微信开发者工具

直接下载对应版本微信开发者工具

给树莓派安装系统

树莓派官网系统
我使用的是树莓派官方系统(之前用Ubuntu20.04 64位碰了很多壁⊙﹏⊙∥),这个地方萌新推荐安装Raspberry Pi OS (32-bit) with desktop and recommended software这个带推荐软件的版本,虽然大但啥都装好了对萌新友好

给树莓派安装MQTT库

本来我是直接尝试建立TCP协议后直接给服务器发报文的,但是我不知道错在了哪里报文倒是能发送过去,但是一直连不上服务器,于是我又在网上搜了一圈发现了MQTT在Linux下有一个C库,于是我准备直接用这个库(其实是在EMQX官网翻文档的时候找到的,官方文档真是个好东西!)
点开官网:Paho C库
怎么安装官网写的很详细,这里不再赘述,有问题自行百度或留言
注意:安装paho需要openssl请先自行安装openssl

EMQX官网有一个例程代码:paho例程
如果你包含头文件 #include “MQTTClient.h” 没有报错恭喜你成功安装!

购买阿里云服务器

云服务器ECS
点开买就行了,这个不用我来教吧

我买的1核2G

系统装Ubuntu 18.04 64位

安装MQTT的代理

这个地方很多人用的代理是mosquitto,网上的教程也基本是mosquitto的,但是由于mosquitto与微信的对接我搞了很久都没成功,所以我找了另一个代理EMQ,这是国内一个公司搞得,虽然网上没找到搭建代理的教程,它有API方便和小程序对接,结合官方文档还是大概能折腾出来

按照自己的系统对应下载:
代理下载

我选的Ubuntu18.04,至于安装官网文档写的很清楚:安装文档


能看上面这句话恭喜你成功了!

给服务器安装图形界面

这一步主要是方便萌新操作(对,就是我),大佬请直接命令行

控制台的实例菜单里面点远程连接

点击立即登录输入密码,登录!

依次输入如下命令

apt-get update
apt-get upgrade
apt-get install ubuntu-desktop
reboot

重启之后还是在控制台点远程连接,不过这次我们选VNC连接

注意!:在VNC连接之前请先用刚刚的命令行新建立一个新的用户,因为阿里云的VNC连接是无法登录root用户的,所以你需要一个新的用户,同时注意将这个新建的用户加入root权限组,不然之后的操作寸步难行!

sudo adduser username



输入密码,确认密码(注意这个地方密码不会显示出来),填信息(可填可不填)一路Enter,完成

接下来把我们刚刚新建的这个用户加入管理员用户组

sudo adduser username sudo


注意这个username是可以任意取的
现在可以vnc连接

成功的话如图

打开浏览器输入127.0.0.1:18083如果你的EMQX正确运行了那么应该能看到控制台,默认用户admin
密码public
,输入登录,成功后如下图

恭喜你完成了服务器这边的搭建!

配置安全组

搭建完了代理,我们需要打开我们用到的端口
打开阿里云控制台,实例>更多>网络和安全>安全组配置

点击配置规则>添加安全组,加入18838081两个端口,他们分别是MQTT的监听端口,和API监听端口

至此服务器端设置完成

代码实现

树莓派部分

因为这个项目涉及到控制树莓派硬件所以请先安装树莓派的IO控制库wiringPI
这个教程太多了我就不赘述了,如果你装的我推荐的系统,wiringpi默认装好了,但如果你和我一样用的4B那么你需要更新wiringpi
更新方法

cd /tmp
wget https://project-downloads.drogon.net/wiringpi-latest.deb
sudo dpkg -i wiringpi-latest.deb

完成后
终端输入

gpio -v
sudo gpio readall

出现下图说明你更新成功


以下为树莓派LED的控制代码

#include <wiringPi.h>int IO_init()
{wiringPiSetup () ; // 初始化 这个必须写在最前面pinMode (0, OUTPUT) ; // 设置GPIO.0 为输出return 1;
}void light_on()
{digitalWrite (0, HIGH);  // GPIO.0 输出高
}void light_off()
{digitalWrite (0, LOW); // GPIO.0 输出低
}

以下为树莓派订阅MQTT服务器的代码
Paho的例程修改而来

因为默认支持匿名访问,所以这个地方的CLIENTID可以不用改
需要更改请自行参照EMQX官网的配置文件修改,不赘述
函数具体解释请参看文档
已加入LED控制

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTClient.h"
#include "led.h"#define ADDRESS     "tcp://你的服务器IP:1883"
#define CLIENTID    "ExampleClientSub"
#define TOPIC       "test"
#define PAYLOAD     "Hello World!"
#define QOS         0
#define TIMEOUT     10000Lvolatile MQTTClient_deliveryToken deliveredtoken;
int light_flag=0;void delivered(void *context, MQTTClient_deliveryToken dt)
{printf("Message with token value %d delivery confirmed\n", dt);deliveredtoken = dt;
}int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{// printf("Message arrived\n");// printf("     topic: %s\n", topicName);// printf("   message: %.*s\n", message->payloadlen, (char*)message->payload);if(strcmp((char*)message->payload, "LIGHT") == 0)//微信小程序发送一个LIGHT字符串{light_flag=!light_flag;//每次收到信号时LED标志位反转printf("ok\n");//接收到命令打印okif(light_flag==1){light_on();//灯亮}else{light_off();//灯灭}}    MQTTClient_freeMessage(&message);MQTTClient_free(topicName);return 1;
}void connlost(void *context, char *cause)
{printf("\nConnection lost\n");printf("     cause: %s\n", cause);
}int main(int argc, char* argv[])
{MQTTClient client;MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;int rc;IO_init();if ((rc = MQTTClient_create(&client, ADDRESS, CLIENTID,MQTTCLIENT_PERSISTENCE_NONE, NULL)) != MQTTCLIENT_SUCCESS){printf("Failed to create client, return code %d\n", rc);rc = EXIT_FAILURE;goto exit;}if ((rc = MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, delivered)) != MQTTCLIENT_SUCCESS){printf("Failed to set callbacks, return code %d\n", rc);rc = EXIT_FAILURE;goto destroy_exit;}conn_opts.keepAliveInterval = 20;conn_opts.cleansession = 1;if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS){printf("Failed to connect, return code %d\n", rc);rc = EXIT_FAILURE;goto destroy_exit;}printf("Subscribing to topic %s\nfor client %s using QoS%d\n\n""Press Q<Enter> to quit\n\n", TOPIC, CLIENTID, QOS);if ((rc = MQTTClient_subscribe(client, TOPIC, QOS)) != MQTTCLIENT_SUCCESS){printf("Failed to subscribe, return code %d\n", rc);rc = EXIT_FAILURE;}else{int ch;do{ch = getchar();} while (ch!='Q' && ch != 'q');if ((rc = MQTTClient_unsubscribe(client, TOPIC)) != MQTTCLIENT_SUCCESS){printf("Failed to unsubscribe, return code %d\n", rc);rc = EXIT_FAILURE;}}if ((rc = MQTTClient_disconnect(client, 10000)) != MQTTCLIENT_SUCCESS){printf("Failed to disconnect, return code %d\n", rc);rc = EXIT_FAILURE;}destroy_exit:MQTTClient_destroy(&client);
exit:return rc;
}

更多的例程可以在paho的文件夹下面的Sample文件夹找到,如果有需要可以在这个文件架下面找到更多的例程

引入一个led.h文件在主函数里声明需要用到的函数

#include <wiringPi.h>int IO_init(void);
void light_on(void);
void light_off(void);

为了方便同时也是为了学习,这里采用make编译因此在当前文件夹下我又现学先买写了一个Makefile文件

Raspi_IOT:raspi_subscribe.o led.ogcc -Wall raspi_subscribe.o led.o -o Raspi_IOT -lpaho-mqtt3c -lwiringPiraspi_subscribe.o:raspi_subscribe.cgcc -Wall -c raspi_subscribe.c -o raspi_subscribe.oled.o:led.cgcc -Wall -c led.c -o led.o
clean:rm -rf *.o

第一次写Makefile文件,如果有什么错误和不合理的地方欢迎留言指正的(。^▽^)

在当前目录下直接执行make命令,生成一个名为Raspi_IOT的可执行文件
./Raspi_IOT直接执行

如果你的执行效果如上图,未出现报错信息的话,恭喜你成功了!

微信小程序部分

微信小程序部分因为有API可以用,所以总体来说还是比较简单的
打开微信开发者工具新建一个项目

AppID用测试号,选一个你心仪的位置创建工程

创建好以后点击右上角详情,本地设置勾选不校验域名

微信小程序需要用到html CSS JavaScript的知识,这个请自行学习

因为要用EMQX的API所以我们先翻看他的API手册,在写程序之前,我们先用API调试工具进行测试,这里我使用的是Postman,因为EMQX的API需要通过Basic认证所以我们在postman的认证栏里写上认证信息默认用户密码如图
注意:官网文档这个地方用户名拼写错误,请注意不要直接复制粘贴

连接成功后会返回Status Code:200

官网还有很多API有兴趣可以自己拿调试工具试着玩,这里我们主要使用发送报文的API,我们可以通过另一个工具查看推送是否成功串口网络调试工具

我们向test主题推送一条信息

在调试助手中可以收到消息

调试成功以后我们就可以开始写程序了

以下为微信小程序代码

Page({changeLED: function(){wx.request({//通过get方式访问服务器url: 'http://你的服务器IP:8081/api/v4/mqtt/publish',method:'POST',header:{'Authorization': 'Basic YWRtaW46cHVibGlj'},data: {'topic':'test','payload':'LIGHT'//向服务器发送LIGHT字符串},success(res){console.log(res)},})}
})

最终测试

我们运行树莓派端的程序,同时打开微信开发者工具,点击真机调试手机扫码,不要点预览,预览需要在后台设置允许访问的域名,点击按钮可以看见控制台打印“ok”,同时树莓派接的灯也开始亮灭翻转

项目Github地址

最后附上整个工程的github地址
https://github.com/DevilAC/Raspi_IOT/tree/master

完结撒花!

微信小程序 阿里云服务器 非物联网平台自建MQTT代理服务器控制树莓派LED相关推荐

  1. 微信小程序阿里云服务器https搭建

    已更新 2018-11-20 1.什么是https? HTTPS(全称:安全套接字层上的超文本传输​​协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版.即HTTP下加入SSL层,HTTP ...

  2. 微信小程序+阿里云+stm32f407的一个项目

    ** 微信小程序+阿里云+stm32f407的一个项目## 小程序参考了大神半颗心脏的博客和资料, 小程序多个页面推送数据 因为自己做小程序是类似商城的一个demo, 其中数据需要与单片机进行交互,而 ...

  3. 最详细的【微信小程序+阿里云Web服务】开发部署指引(八):开发小程序卡片类型呈现功能

    文章目录 前言 一.功能说明 二.代码实现 1.创建主界面Page 2.WXML 2.JS 3.WXSS 4.合法域名校验 5.图片缓存刷新问题的解决 小结 专题文章链接 前言 本篇文章,将对照专题案 ...

  4. 最详细的【微信小程序+阿里云Web服务】开发部署指引(一):准备开始

    文章目录 前言 案例说明 专题文章链接 前言 作为一个程序开发的老鸟,有时候想使用微信小程序,开发实现一些实用的小功能.由于小程序往往需要有后台数据的支持,所以一般还需要搭建一个Server服务器,来 ...

  5. 最详细的【微信小程序+阿里云Web服务】开发部署指引(十一):开发小程序设置功能

    文章目录 前言 一.功能说明 二.设置界面代码实现 1.创建界面Page 2.WXML 3.JS 4.WXSS 三.参数控制逻辑代码实现 1.自动跳转卡片 2.自动播放声音 专题文章链接 前言 案例的 ...

  6. 最详细的【微信小程序+阿里云Web服务】开发部署指引(四):搭建服务端数据库

    文章目录 前言 一.连接主机数据库 二.创建数据表结构 三.准备测试数据 专题文章链接 前言 做完了前面的注册申请工作,今天我们开始进行程序的开发. 这篇文章,我们要完成的是服务端数据库表的创建. 一 ...

  7. 最详细的【微信小程序+阿里云Web服务】开发部署指引(十二):开发小程序用户反馈功能

    文章目录 前言 一.功能说明 二.代码实现 1.创建界面Page 2.WXML 3.JS 4.WXSS 专题文章链接 前言 案例的运行效果,可以扫码观看: 本篇文章,我们将实现应用的用户反馈功能. 一 ...

  8. 记录一次微信小程序+阿里云oss的配置步骤和方法

    网上的文档搜索了无数,结果还是得靠自己摸索,都讲不到重点,折腾了两天,现在公布出来. 网站防盗链,如果使用了微信小程序的话记得加入防盗链白名单servicewechat.com,宝塔面板直接防盗链设置 ...

  9. 微信小程序绑定云服务器文档,微信小程序云开发搭建一个管理小程序.pdf

    微微信信小小程程序序云云开开发发 搭搭建建一一个个管管理理小小程程序序 概概述述 : 开发者可以使用云开发开发微信小程序.小游戏,无需搭建服务器,即可使用云 能力. 云开发为开发者提供完整的云 支持, ...

最新文章

  1. 字符串匹配算法 -- AC自动机 基于Trie树的高效的敏感词过滤算法
  2. 八城联动丨神策 2020 数据驱动用户大会「成都站」邀您面基!
  3. 【CentOS】磁盘管理与vim编译器
  4. service 层注入不同的数据源_.NET 理论基础+实战控制台程序实现AutoFac注入
  5. linux 下php多版本安装
  6. [转载]理解OAuth 2.0
  7. JAVA安装报1620错误_java安装错误1620
  8. 解决Mac装上Jetbrain系列软件(Pycharm/Idea)破解包无效导致软件启动报错
  9. 缓存MEMCACHE 使用原子性操作add,实现并发锁
  10. raw转bmp程序c语言,求指导,如何用c语言实现读取*.raw格式图像
  11. webgl渲染Yuv420P图像
  12. 分享自己喜欢的无损高音质音乐给大家
  13. php 覆盖静态方法吗,覆盖PHP中的静态方法
  14. 这样能收录,原理是用的凤凰新闻采集工具
  15. jsonp请求响应成功,但进入到error函数
  16. 全球及中国雾化铜和铜合金粉末行业产销需求及发展动态分析报告2022-2028年
  17. html怎么设置一个表格的宽度一样吗,html表格单元格大小 怎样在html中设置所有表格大小一样...
  18. 蓝桥杯 ADV-201 VIP试题 我们的征途是星辰大海(试题解析)
  19. 「多语言图像描述」最强评估基准XM3600来了!涵盖36种语言
  20. Adobe Flash Player 官方离线最新版下载地址

热门文章

  1. Kubuntu一行命令重启音频引擎,解决声卡的小问题
  2. 双冒号::在python索引中的含义
  3. Java一个汉字占几个字节(详解与原理)
  4. Silverlight 中的利萨茹动画
  5. MySQL MVCC底层原理详解
  6. 推荐系统之Feed流 - Blog4
  7. 【CG物理模拟系列】弹性体模拟--Position-based法之Shape Matching(代码实现)
  8. java计算机毕业设计网上鲜花店系统源程序+mysql+系统+lw文档+远程调试
  9. 【fiddler+burp+雷神模拟器联动抓包】
  10. 如何优雅、机智地和新公司谈薪水?