基于MQTT阿里云服务器的物联网关灯项目--舵机

news2024/11/16 5:33:42

一、关灯神器

本文章由作者李建华所编写,用到的服务器是阿里云部署好的mqtt,链接如有失效,请联系作者微信:Likz777777

要求:不破坏原有功能、可以接入苹果、网页小程序均可控制

设备:香橙派、舵机

具体实现方法

  • 1.局域网控制:把香橙派作为服务器->客户端发标志位服务器->服务器收到匹配的标志位控制舵机开灯

  • 2.小程序控制:香橙派作为客户端,小程序作为客户端,用MQTT协议,连接阿里云服务器,进行消息分发

MQTT协议

MQTT是基于服务端/客户端订阅发布通信协议,建立在TCP/ip协议之上,最大的优点在于用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。

本编文章采用的是MQTT C库进行开发(第二套方案)

  • paho-mqtt库的下载地址:git clone GitHub - eclipse/paho.mqtt.c: An Eclipse Paho C client library for MQTT for Windows, Linux and MacOS. API documentation: https://eclipse.github.io/paho.mqtt.c/

  • 安装一些需要使用的库:sudo apt-get install libssl-dev build-essential libidn11-dev libidn11

  • 使用make进行编译,编译完成在build/outpu/可以看到动态库

  • paho-mqtt3a  : 一般实际开发中就是使用这个,a表示的是异步消息推送(asynchronous)。
    paho-mqtt3as : as表示的是 异步+加密(asynchronous+OpenSSL)。
    paho-mqtt3c  : c 表示的应该是同步(Synchronize),一般性能较差,是发送+等待模式。
    paho-mqtt3cs : cs表示的是同步+加密(asynchronous+OpenSSL)。

编写程序连接MQTT服务器

  • 创建客户端

  • 配置连接使用的结构体(主要参数:用户名,用户名密码)

  • 设置回调函数,连接后用于收发消息,及连接失败的信息

  • 连接服务器

  • 订阅主题(用于订阅发布者,就能收到发布者信息)

  • 发布主题(用于发布信息)

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "MQTTClient.h"
​
#define MQTT_Uri    "i66105e6.cn-hangzhou.emqx.cloud:15200"   // MQTT服务器的地址和端口号
#define ClientId    "lijianhua"                  // ClientId需要唯一
#define UserName    "用户名"                     // 用户名
#define PassWord    "对应密码"                   // 用户名对应的密码
#define Publish     "publish"                  //发布主题
#define Subscribe   "subscribe"                //订阅主题
​
 //1.定义一个MQTT客户端结构体指针
    MQTTClient client;
​
// 失去连接回调函数
void connect_lost(void *context, char *cause)
{
    printf("Connection lost,The reason: %s \n",cause);
}
​
// 收到主题信息回调函数
int message_arrived(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{
    //printf("Receive topic: %s, message data: \n", topicName);//打印订阅主题
   // printf("%.*s\n", message->payloadlen, (char*)message->payload);//接受到的消息
​
    if(!strcmp((char*)message->payload,"open"))//用于判断接收的消息
    {
            printf("OPEN LIGHT\n");
    }
    
     if(!strcmp((char*)message->payload,"close"))
    {
            printf("CLOSE LIGHT\n");
    }
    
    if(!strcmp((char*)message->payload,"closeClient"))
    {
          // 10、断开连接
          MQTTClient_disconnect(client, 10000);//1000:断开的超时时间
          printf("Close Client\n");
          MQTTClient_freeMessage(&message);
          MQTTClient_free(topicName);
   
           exit(0);
    }
​
    MQTTClient_freeMessage(&message);
    MQTTClient_free(topicName);
   
    return 1;
}
​
// 主题发布成功回调函数
void delivery_complete(void *context, MQTTClient_deliveryToken dt)
{
    printf("publish topic success,token = %d \n", dt);
}
​
int main(int argc, char* argv[])
{
    //2.创建一个MQTT客户端
    int rc;
    if ((rc = MQTTClient_create(&client, MQTT_Uri, ClientId, MQTTCLIENT_PERSISTENCE_NONE, NULL)) != MQTTCLIENT_SUCCESS)
    {
        printf("Failed to create client, return code %d\n", rc);
        exit(EXIT_FAILURE);
        return 0;
    }
​
    //3.创建一个MQTT连接配置结构体,并配置其参数
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
    conn_opts.username = UserName;          // 用户名 
    conn_opts.password = PassWord;          // 用户名对应的密码
    conn_opts.keepAliveInterval = 60;       // 心跳时间
    conn_opts.cleansession = 1;             // 清除会话
​
    //4.设置MQTT连接时的回调函数
    if ((rc = MQTTClient_setCallbacks(client, NULL, connect_lost, message_arrived, delivery_complete)) != MQTTCLIENT_SUCCESS)
    {
        printf("设置回调函数失败, return code %d\n", rc);
        rc = EXIT_FAILURE;
        MQTTClient_destroy(&client);//销毁
​
    }
    //5.开始连接到MQTT服务器
    if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
    {
        printf("连接失败, return code %d\n", rc);
        exit(EXIT_FAILURE);
        MQTTClient_destroy(&client);//销毁
​
    }
    else
    {
            printf("连接成功\n");
    }
​
    //6.定义一个主题消息存储结构体
    MQTTClient_message pubmsg = MQTTClient_message_initializer;
​
    char mag_data[256];
  //pubmsg.payload = mag_data;
  //pubmsg.payloadlen = (int)sizeof(mag_data);
    pubmsg.qos = 1;                 // qos等级为1 
    pubmsg.retained = 0;            // 服务器不保留消息
    MQTTClient_deliveryToken token; // 标记MQTT消息的值,用来检查消息是否发送成功
   
    while(1)
    {
​
       /*这里我只需要订阅主题,就放在while里面了,如果你的代码需要同时发布订阅,可以写创建一个进程
         我推荐创建两个线程,节约不少资源       
       */
       
        /*memset(mag_data,'\0',sizeof(mag_data));  
        printf("请发送你要的数据:");    
        gets(mag_data);
        pubmsg.payload = mag_data;//设置发送消息
        pubmsg.payloadlen = (int)strlen(mag_data);//发送的长度
​
    //7.发布主题信息
         if ((rc = MQTTClient_publishMessage(client, Publish &pubmsg, &token)) != MQTTCLIENT_SUCCESS)
        {
                //printf("Failed to publish message, return code %d\n", rc);
                printf("%s\n",mag_data);
                exit(EXIT_FAILURE);
        }*/
​
    //8.订阅主题
         if ((rc = MQTTClient_subscribe(client, Subscribe, 1)) != MQTTCLIENT_SUCCESS)
        {
                printf("订阅主题失败, return code %d\n", rc);
                rc = EXIT_FAILURE;
        }else
         {
                printf("订阅主题成功!\n");
         }
​
    }
​
/* //9.等待输入'Q'或'q'退出
    printf("Press Q or q + <Enter> to quit\n\n");
    int ch;
    do
    {
            ch = getchar();
    } while (ch!='Q' && ch != 'q');
​
    if ((rc = MQTTClient_unsubscribe(client, Subscribe)) != MQTTCLIENT_SUCCESS)//取消订阅
    {
            printf("Failed to unsubscribe, return code %d\n", rc);
            rc = EXIT_FAILURE;
    }*/
​
}

 

编写小程序连接MQTT服务器

微信小程序用的是JavaScript写的,我不擅长这方面代码,借鉴的:使用微信小程序连接到部署 | EMQX Cloud 文档

这写的太全了,我只需要小程序发布,就改了一下,可以到这里下载:百度网盘 请输入提取码 密码:mqtt

  • 小程序用的是websocket,所以要用对应的服务器端口号,wss报错,用wxs

  • 在微信公众平台->开发管理添加服务器的域名,用wss://

  • 上传代码提交审核

设备端详细代码

请到这里下载:百度网盘 请输入提取码 密码:mqtt

香橙派设置自启动

  • sudo nano /etc/systemd/system/my_program.service

  • 在Unit文件中,添加以下内容

    [Unit]
    Description=My Program
    After=multi-user.target
    ​
    [Service]
    ExecStart=/home/pi/my_program //这里是你可执行程序的绝对地址
    Restart=always
    User=root //我用的root
    ​
    [Install]
    WantedBy=multi-user.target
  • 运行以下命令以重新加载Systemd管理的服务列表:sudo systemctl daemon-reload

  • 启用并启动您的服务,使其在引导时自动启动:

  • sudo systemctl enable my_program //使能
    sudo systemctl start  my_program  //启动
    sudo systemctl stop   my_program   //停止
    sudo systemctl disable my_program //不在自启动,会禁用服务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/800948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PHP在线相册--【白嫖项目】

强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 文章目录 本系列校训本项目使用技术 上效果图phpStudy 设置导数据库项目目录如图&#xff1a;代码部分&#xff1a;主页 配套资源作业&#xff1a; 本系列校训 用免费公开视频&#xff0c;卷飞培训班哈人&…

LeetCode算法心得——合并后数组中的最大元素

大家好&#xff0c;我是晴天学长&#xff0c;这是一道动态规划的逆向思维题&#xff0c;此题甚是神奇&#xff01;&#x1f4aa;&#x1f4aa;&#x1f4aa; 1 &#xff09;合并后数组中的最大元素 2) .算法思路 只能选择旁边的&#xff0c;而且还是比自己等大或者比自己小的…

码银送书第四期《Python之光》

作为一种极其流行的编程语言&#xff0c;Python已经成为了当今最为重要的生产力工具之一。无论小学生还是各行各业的从业人员&#xff0c;都开始学习Python编程。这种编程语言在许多领域中都有广泛的应用&#xff0c;因此Python编程已经成为了许多职业的必备能力或者加分项。 …

【云边有个小卖部】上新《探秘Linux》第二章 Linux权限管理

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1C初阶C进阶数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我…

mac下安装vue cli脚手架并搭建一个简易项目

目录 1、确定本电脑下node和npm版本是否为项目所需版本。 2、下载vue脚手架 3、创建项目 1、下载node。 如果有node&#xff0c;打开终端&#xff0c;输入node -v和npm -v , 确保node和npm的版本&#xff0c;(这里可以根据自己的需求去选择&#xff0c;如果对最新版本的内容有…

JVM | 类加载是怎么工作的

类加载是怎么工作的 引言类加载器工作原理 | 城市建设过程1. 类加载器加载类前过程JVM进程启动 | 建筑工程立项Bootstrap类加载器创建扩展和应用类加载器 | 高级工程师的两位得力助手 2. 类加载器加载类后过程应用类加载器加载Building链接过程&#xff08;验证&#xff0c;准备…

Huge and Efficient! 一文了解大规模预训练模型高效训练技术

本文分为三部分介绍了大模型高效训练所需要的主要技术&#xff0c;并展示当前较为流行的训练加速库的统计。文章也同步发布在AI Box知乎专栏&#xff08;知乎搜索 AI Box专栏&#xff09;&#xff0c;欢迎大家在知乎专栏的文章下方评论留言&#xff0c;交流探讨&#xff01; 引…

计算机图形学十四路径追踪与渲染方程

路径追踪&#xff08;Path Tracing&#xff09;与渲染方程&#xff08;Render Equation&#xff09; 简介 利用路径追踪我们可以实现比whitted-style ray tracing更好的全局光照&#xff08;GI&#xff09;效果。它的理论基础是渲染方程&#xff0c;最开始由吉姆卡吉亚&#…

066、故障处理之热点问题

为什么要解决热点 分布式架构中各个组件的理想状态&#xff1a;资源利用率相对均衡 形成写热点的原因 高频访问的小表SQL执行计划不合理具有顺序增长属性的索引扫描 数据组织模型 例如数据是序列递增&#xff0c;则有可能数据全部都集中一个region上 &#xff0c;或者集中…

什么是等保定级?

TOC 一、等保评测介绍 1.1 等保定级目的 网络安全等级保护介绍&#xff1a;目的就是涉及民生问题的信息系统&#xff0c;要按照影响&#xff0c;提前划定等级 实施网络安全保护 信息系统&#xff1a;就是保护的系统&#xff0c;比如 魔幻的 健康码系统安全产品&#xff1a;健…

【lesson5】linux常见权限问题

文章目录 目录权限umask粘滞位 目录权限 先来思考一个问题: 进入一个目录需要什么权限呢&#xff1f; 由上图我们可以得知&#xff0c;进入目录需要x权限&#xff0c;那么没有r和w权限是什么情况呢&#xff1f; 从图中我们可以得知没有r权限不能查看目录里面的内容&#xff…

基于STM32设计的智能教室管理系统

前言 本文介绍了一个智慧教室的设计,该设计由电器设备控制系统、环境检测系统和考勤系统三大模块构成。通过使用STM32微处理器和物联网电器设备控制中心,实现对教室内风扇、照明灯和窗帘等电器设备的智能化统一控制与运行。同时,环境检测系统可以实时监测环境光强、温度、湿…

模型调参及优化

调参 调权重参数&#xff0c;偏置参数 训练数据集用来训练参数w&#xff0c;b 调超参数 验证数据集用来选择超参数学习率lr&#xff0c;隐藏层大小等 如何调参 当泛化误差和训练误差都没有降下去说明欠拟合&#xff1b;当训练误差降下去&#xff0c;但泛化误差出现上升形式&…

33. 本地记事本

本地记事本 html部分 <button class"add"><i class"iconfont icon-jiahao"></i> </button>css部分 *{margin: 0;padding: 0; } body{background-color: #7bdaf3;display: flex;padding-top: 3rem;flex-wrap: wrap; } .add{pos…

Vue2基础一、快速入门

零、文章目录 Vue2基础一、快速入门 1、Vue 概念 &#xff08;1&#xff09;为什么学 前端必备技能 岗位多&#xff0c;绝大互联网公司都在使用Vue 提高开发效率 高薪必备技能&#xff08;Vue2Vue3&#xff09; &#xff08;2&#xff09;Vue是什么 **概念&#xff1a;…

第二届“鼎信杯”榜单发布,麒麟信安荣获“优秀技术支撑奖”

由中国电子信息产业发展研究院、北京市海淀区人民政府主办&#xff0c;中国软件评测中心&#xff08;工业和信息化部软件与集成电路促进中心&#xff09;、中关村科学城管委会和北京市国际技术贸易协会承办的“2023 鼎信杯信息技术发展论坛”日前在北京举办。麒麟信安受邀参加主…

和鲸 ModelWhale 与麒麟系统适配认证,打造自主安全、性能可靠的信创 AI 基础软件

发展信创&#xff0c;解决核心技术的自主可控问题&#xff0c;是我国产业升级和数字经济发展过程中的重要命题。信创产业链主要由基础硬件、基础软件、应用软件、信息安全及云计算平台等几部分组成&#xff0c;拥抱信创国产化需要各厂商聚力共创生态&#xff0c;增强自身产品的…

JSONPath提取器案例详解

jsonpath语法 $ 表示根节点&#xff0c;也是所有jsonpath表达式的开始 . 表示获取子节点 .. 表示获取所有符合条件的内容 * 代表所有的元素节点 [] 表示迭代器的标示&#xff08;可以用于处理下标等情况&#xff09; [,] 表示多个结果的选择 ?() 表示过滤操作 表示当前节点一…

【QT】Day1

1. 收到实现登录框 要求&#xff1a; 1、登录窗口更改标题、图标 2、设置固定尺寸、并给定一定的透明度 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug> //信息调试类&#xff0c;用于打印输出的 #include <QIcon>…

windows命令行

参考:https://blog.csdn.net/u014419722/article/details/130427423 1、 创建文件夹&#xff08;mkdir或md&#xff09; 创建单个文件&#xff1a;mkdir cmd_test 创建二级文件&#xff1a;mkdir cmd_test\456\123 创建多个文件&#xff1a;mkdir cmd_test\000 cmd_test\111 2…