jazmy / laravel-skinnypi
SkinnyPi - 一个基于 Laravel、Raspberry Pi、FitBit 和 MQTT 的项目。当你减肥时,你的 Raspberry Pi 会播放音乐并闪烁灯光。
Requires
- php: >=5.6.4
- djchen/oauth2-fitbit: ^1.0
- doctrine/dbal: ^2.7
- laravel/framework: 5.6.*
- laravel/socialite: ^3.0
- laravel/tinker: ~1.0
- predis/predis: ^1.1
Requires (Dev)
- fzaninotto/faker: ~1.4
- mockery/mockery: 0.9.*
- phpunit/phpunit: ~5.7
This package is auto-updated.
Last update: 2024-09-30 01:17:17 UTC
README
SkinnyPi - 减肥派对
一个 Laravel、Raspberry Pi 和 FitBit 项目,用于减肥派对模式
查看我的网站: https://jazmy.com
我想设置一个 Raspberry Pi,每次我减肥时,它都会闪烁灯光和播放音乐。我把这称为“派对模式”或“快乐舞蹈”。这将成为积极的强化,也是一个有趣的方式开始我的早晨。我刚刚完成了一门研究生院的“物联网”课程,所以我基本了解通信协议。
要求
-
Fitbit 兼容的体重秤 任何允许您无线同步体重到 Fitbit 网站的体重秤。我使用的是 Fitbit Aria
-
带有 wifi 的 Raspberry Pi 我使用的是 Raspberry Pi 3 Model B
-
托管云服务器 我使用的是 Cloudways 它对 Laravel 很容易
-
托管 MQTT 服务器 我使用的是 CloudMQTT 的免费版本
工作原理 (简化版)
-
您站在 Fitbit Aria 体重秤上,并通过 wifi 同步到 fitbit 服务器
-
Fitbit API 触发新体重的添加,并向您的云服务器发出调用
-
您的云服务器存储新的体重并计算是否高于或低于以前的体重
-
如果体重降低,则向您的 MQTT 服务发送消息
-
您的 Raspberry Pi 订阅了 MQTT 服务,因此它接收消息并触发一个 Python 脚本。
-
Python 脚本播放音乐并闪烁灯光。
第 1 部分 - Raspberry Pi
要求
1.1 组装您的 Pi
我假设如果您正在阅读这篇文章,您知道如何组装 Raspberry Pi。
1.2 安装软件
1.2.1 从您的 PC 安装 Raspbian
-
您需要在 Raspberry Pi 上安装 Raspbian:https://www.raspberrypi.org/downloads/
-
要将 Raspbian 图像安装在您的 Raspberry Pi 上,您需要一个名为 win32 disk imager 的工具:https://sourceforge.net/projects/win32diskimager/
-
解压 raspbian 软件,它只是一个镜像文件。由于它是 2 GB,所以可能需要几分钟。
-
打开 Win32 disk,浏览到 raspbian 镜像。
-
选择“设备”,即您的 SD 卡所在的驱动器。在选择设备时,请确保选择正确的字母,因为它将删除该驱动器上的所有内容。人们经常意外删除他们可能还连接的 USB 备份驱动器,这是一个常见问题。
-
然后点击“写入”按钮。根据卡的速度,写入可能需要几分钟。
-
完成后,Windows可能会搞混,因为它不能再识别驱动器,它会要求您格式化SD卡。忽略这个错误。您的SD卡已安装完成,现在将其放入您的树莓派
1.2.2 第一次设置您的Pi
- 开启您的树莓派
- 使用默认凭据登录:用户名:pi,密码:raspberry
- 它将要求您更改这些凭据
- 它将进行更新
- 它将要求您连接到您的WiFi
- 打开终端窗口
- 输入“ifconfig”以查找您的IP地址 (另一个选项是输入:sudo /etc/rc.local)
- 单击树莓派图标以打开下拉菜单,然后选择“首选项”>“树莓派配置”
- 启用SSH
1.2.3 安装Mosquitto
有几个应用程序可以用于通过MQTT发送和接收,但在树莓派上最简单的可能是Mosquitto。我们首先在树莓派上安装这个程序
sudo apt-get install -y mosquitto mosquitto-clients
1.2.4 安装Paho MQTT
为了允许您的Pi订阅您的MQTT频道并监听消息,您需要安装Paho-mqtt。教程:https://tutorials-raspberrypi.com/raspberry-pi-mqtt-broker-client-wireless-communication/
安装python 2和3的版本。如果您使用Thonny测试代码,它会查找python3版本。如果您在终端运行代码,则默认使用python2。根据我的经验,安装两者会使生活更简单。
sudo pip install paho-mqtt sudo pip3 install paho-mqtt
1.2.5 安装Blinkt脚本
Blinkt是八种超亮RGB LED灯,您可以将其添加到树莓派并从Python脚本中控制。Blinkt!上的每个像素都可以单独控制并调节亮度,让您能够创建渐变、脉冲效果,或者像疯了一样闪烁。
为SkinnyPi提供的Blinkt Python脚本:https://github.com/jazmy/raspberrypi-skinnypi
Blinkt Python代码示例:https://github.com/pimoroni/blinkt/tree/master/examples
在“skinnypi”文件夹中创建一个文件夹 /home/pi/skinnypi/skinnypi.py
将WAV格式的音频文件放在该文件夹中。最好将音频文件命名为1.wav、2.wav、3.wav等...
确保音频设置为“模拟”。如果您通过HDMI将树莓派连接到显示器,则默认在HDMI上播放音频。要更改此设置,请右键单击树莓派OS右上角的音频图标。
执行文件
sudo python skinnypi/skinnypi.py
1.2.6 设置Blinkt脚本来在启动时自动运行
https://learn.sparkfun.com/tutorials/how-to-run-a-raspberry-pi-program-on-startup#method-1-rclocal
sudo nano /etc/rc.local
这有点棘手,但您需要确保在运行脚本之前等待10秒钟,以便给Pi足够的时间启动和连接到网络。如果存在问题,这将创建一个日志文件。
sudo bash -c '(sleep 10;/usr/bin/python3 /home/pi/skinnypi/skinnypi.py > /home/pi/skinnypi/skinnypi.log 2>&1)' &
第二部分 - 云服务器
如果您正在寻找一个管理型网络托管服务,可以轻松创建Laravel网站,那么我强烈推荐Cloudways。Cloudways可以在几分钟内设置Laravel网站和MySQL数据库。
2.1 Laravel应用程序
要求
-
Laravel 5.7
-
MySQL
-
Laravel认证 - php artisan make:auth
包含的依赖项
此项目包括适用于OAuth 2.0客户端的Fitbit Provider https://github.com/djchen/oauth2-fitbit
安装说明
此存储库是一个完整的Laravel网站,而不仅仅是一个包。安装需要几个步骤,但我将尽量使其尽可能简单。
composer require jazmy/laravel-skinnypi
注意:对于版本5.6及以上的包,该包将自动使用Laravel的包发现功能进行注册。这意味着您不需要更新config/app.php文件。
第三步
我们需要添加额外的数据库表,因此运行以下命令
bash php artisan migrate
2.2 配置Fitbit应用程序(客户端ID和客户端密钥)
Fitbit API文档:https://dev.fitbit.com/ 创建Laravel Fitbit应用程序非常棘手,但以下是基本步骤
- 用户授权应用程序
- Fitbit将用户返回到回调URL,并带有授权令牌
示例回调URL:https://your.domain.com/authorize 当您设置Fitbit应用程序时,您需要提供一个回调URL,以便它发送令牌。我们必须存储该授权令牌,以便我们可以在稍后代表用户进行后续请求。
- 我们使用存储的授权令牌的ID,在订阅端点为用户创建订阅。这意味着每次发生更改时,Fitbit都会触发您的回调页面。
示例端点订阅URL:https://your.domain.com[/callback]
-
订阅完成后,用户会在屏幕上看到一个消息,说明他们的订阅已创建,或者如果已经存在,则说明订阅已存在。
-
当用户的体重数据进入Fitbit时,Fitbit将通过调用订阅URL来通知我们的应用程序。 https://your.domain.com[/callback]
-
Fitbit只会通知我们用户体重数据已更改。它不会发送实际的体重。
-
在FitBitController中的getCallback方法中,我们必须快速保存发送给我们的通知数据,并返回一个204响应给Fitbit,以便Fitbit知道我们已经收到通知。
-
应用程序在回调中接收通知数据、从Fitbit获取通知详情、解析通知、获取受影响的用户、保存新的体重记录、进行体重比较检查、发送请求的MQTT消息,并在3秒内回复Fitbit所需的'HTTP 204 No Content'状态是不可能的。因此,您需要将其分解成几个步骤,以防止Fitbit禁止您的API访问。
-
解决方案是设置一个Laravel队列监听器,使其始终运行。当Fitbit触发回调时,您将任务添加到队列中。队列监听器应在收到回调推送后大约5秒内处理通知。
-
'Supervisor'是一个进程监控程序,它将监控队列监听器进程,并在进程崩溃时自动重启。
-
您创建的任务将执行以下操作
-
从Fitbit获取通知详情
-
解析通知
-
获取受影响的用户
-
保存新的体重记录
-
进行体重比较检查
-
发送请求的MQTT消息
-
然后我们将运行http://your.domain.com/notification-details路由,遍历我们保存的通知,并向Fitbit发送请求以获取每个通知的详细信息。我们将从Fitbit的响应中获取已更改的体重。
-
体重数据将被写入到storage/app/weight_logs文件夹中的文件中。
第三部分 - MQTT服务器
MQTT 是一种推送和订阅消息的方式,在物联网(IoT)设备如树莓派上表现良好。您可以将 Pi 设置为订阅 MQTT 通道,这样每当您的服务器向该 MQTT 通道推送消息时,MQTT 将自动将其推送到任何已订阅的设备。MQTT 介绍:[http://www.steves-internet-guide.com/mqtt/](http://www.steves-internet-guide.com/mqtt/)
如果用户减重了,应该将此 JSON 发送到 MQTT
$message = { "color": "1", "style": "1", "seconds": "10", "audio": "1"}
如果用户没有减重,应该将此 JSON 发送到 MQTT
$message = { "color": "2", "style": "2", "seconds": "10", "audio": "2"}