树莓派4B使用-2
九、小项目:MQTT
树莓派系列(十四) 树莓派4B安装 docker并配置为 MQTT服务器
MQTT保留消息
1、首先在公网服务器,部署服务
1 2 3 4 5 6 7
| sudo docker run -d --name emqx \ -p 1883:1883 -p 8081:8081 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 \ --restart=always \ emqx/emqx:4.3-rc.5
# 访问:43.142.73.10:18083
|
EMQX Cloud 概览
EMQX Cloud 工作台
GitHub,emqx/MQTTX
iOS客户端连接,novastone-media/MQTT-Client-Framework
1、首先在控制台部署。
2、然后通过客户端连接
a、下面这个是macOS的客户端连接。

b、python连接
使用 Python SDK 连接
树莓派系列(十四) 树莓派4B安装 docker并配置为 MQTT服务器
emqx/emqx-tutorial
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| pip install paho-mqtt
from paho.mqtt import client as mqtt_client import random import time
broker = 'b21b2da1.ala.cn-hangzhou.emqxsl.cn' port = 8883 topic = 'python/mqtt' client_id = f'python-mqtt-{random.randint(0, 1000)}'
username = 'dinosaur' password = '971707'
def connect_mqtt(): def on_connect(client, userdata, flags, rc): if rc == 0: print("Connected to MQTT Broker!") else: print("Failed to connect, return code %d\n", rc) client = mqtt_client.Client(client_id) client.username_pw_set(username, password) client.on_connect = on_connect client.connect(broker, port) return client
def publish(client): msg_count = 0 while True: time.sleep(1) msg = f"messages: {msg_count}" result = client.publish(topic, msg) status = result[0] if status == 0: print(f"Send `{msg}` to topic `{topic}`") else: print(f"Failed to send message to topic {topic}") msg_count += 1
def subscribe(client: mqtt_client): def on_message(client, userdata, msg): print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic") client.subscribe(topic) client.on_message = on_message
def run(): client = connect_mqtt() client.loop_start()
""" def run(): client = connect_mqtt() subscribe(client) client.loop_forever() """
if __name__ == '__main__': run()
|
3、Swift连接
emqx/MQTT-Client-Examples
The broker supports the following protocols:
- Broker: broker.emqx.io
- TCP Port: 1883
- WebSocket Port: 8083
- SSL/TLS Port: 8883
- WebSocket Secure Port: 8084
首先安装CocoPods
Mac(含M1)安装CocoaPods
1 2 3 4 5 6 7 8 9 10 11
| brew install ruby # 更新ruby echo 'export PATH="/opt/homebrew/opt/ruby/bin:$PATH"' >> ~/.zshrc source ~/.zshrc
gem sources --remove https://rubygems.org/ gem sources --add https://gems.ruby-china.com/ sudo gem update --system sudo gem install -n /usr/local/bin cocoapods # 这样就把命令放进去了,能直接pod使用 pod setup
|
4、Java连接
使用 Eclipse Paho Java 连接到部署
MQTT-Client-Examples/mqtt-client-Java/src/main/java
真正解决方案:java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter
1 2 3 4 5
| <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> </dependency>
|
十、小项目:搭建AirPlay2
docker,mikebrady/shairport-sync
mikebrady/shairport-sync
为树莓派换上AirPlay 2
1 2 3
| sudo docker run -d --restart unless-stopped \ --net host --device /dev/snd \ mikebrady/shairport-sync
|
然后可以播放声音的时候选择,也可以在家庭app中添加该该扬声器。
十一、小项目:python朗读文本
使用python
首先换源
有用的树莓派 Raspberry Pi 更换国内源pip源
1 2 3 4 5 6 7 8 9 10 11 12
| sudo nano /etc/pip.conf
# 以下是内容 [global]
index-url=https://pypi.tuna.tsinghua.edu.cn/simple/ extra-index-url= https://mirrors.aliyun.com/pypi/simple/
[install] trusted-host= pypi.tuna.tsinghua.edu.cn mirrors.aliyun.com
|
然后创建虚拟环境
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| # # 树莓派3b ① ssh -p 10001 dinosaur@43.142.73.10 ,nps内网穿透 ② ssh dinosaur@dinosaur-pi3b1.local ,内网 ③ ssh dinosaur@192.168.3.115 ,连接外面的网的时候。但是得挂上vpn,挂上vpn了之后也可以进入路由器管理界面查看一下当前的连接设备。注意用vpn的时候,貌似访问不了 dinosaur-pi3b1.local 。
# 本身树莓派呦python3.9.2 # 所以我只需要创建虚拟环境即可 pip install virtualenv python -m venv /home/dinosaur/HomeProject1 source /home/dinosaur/HomeProject1/bin/activate deactivate
# # 树莓派4b ssh -p 10010 dinosaur@43.142.73.10 ssh dinosaur@dinosaur-pi4b1.local
|
使用ppttsx包
注意,使用oyttsx3的时候,需要几个依赖
1 2 3
| sudo apt install espeak sudo apt install libespeak-dev sudo apt install libespeak-ng-libespeak-dev
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| source /home/dinosaur/HomeProject1/bin/activate
pip install pyttsx3
# 语音播报模块 import pyttsx3 # 模块初始化 engine = pyttsx3.init() # 这段代码会把系统里的可用语音包的信息print出来 voices = engine.getProperty('voices') for voice in voices: print("Voice:") print(" - ID: %s" % voice.id) print(" - Name: %s" % voice.name) print(" - Languages: %s" % voice.languages) print(" - Gender: %s" % voice.gender) print(" - Age: %s" % voice.age)
# zh_voice_id = "Mandarin" # 用语音包ID来配置engine # engine.setProperty('voice', zh_voice_id)
engine.setProperty('voice', 'zh') #开启支持中文
# 设置发音速率,默认值为200 rate = engine.getProperty('rate') engine.setProperty('rate', rate - 50) # 设置发音大小,范围为0.0-1.0 volume = engine.getProperty('volume') engine.setProperty('volume', 0.6)
print('准备开始语音播报...') engine.say("准备开始语音播报...") # 等待语音播报完毕 engine.runAndWait()
|
使用Java
使用阿里云语音合成。
阿里云语音合成,Java SDK
然后 使用语音播报代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import java.io.File;
public class BoFangAudio { public void play(File file) { try{
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);
Clip clip = AudioSystem.getClip(); clip.open(audioInputStream); clip.start(); } catch(Exception ex) { System.out.println(ex.getLocalizedMessage()); } } }
|
十二、小项目:安装Java
1 2 3
| apt search jdk sudo apt install openjdk-17-jdk java --version
|
然后导出jar包,scp到树莓派。
IDEA导出jar包步骤
如何在IDEA中导出jar包
注意,需要选择from modules with dependencies,而不是empty。
注意,指定META-INF的时候一定要指定META-INF所在的父目录,一般放在resources下面。
注意,选择extract to the target jar,第一个。
1 2 3 4 5 6
| # 尝试在本地电脑运行。 java -jar /Users/dinosaur/jcwang/MyHomeProject/HomeProject/out/artifacts/HomeProject_jar/HomeProject.jar
# 注意端口的位置,然后P大写 scp -P 10001 /Users/dinosaur/jcwang/MyHomeProject/HomeProject/out/artifacts/HomeProject_jar/HomeProject.jar dinosaur@43.142.73.10:/home/dinosaur scp /Users/dinosaur/jcwang/MyHomeProject/HomeProject/out/artifacts/HomeProject_jar/HomeProject.jar dinosaur@dinosaur-pi3b1.local:/home/dinosaur
|
然后树莓派运行。
1 2 3 4 5 6
| ssh -p 10001 dinosaur@43.142.73.10 ssh dinosaur@dinosaur-pi3b1.local
nohup java -jar /home/dinosaur/HomeProject.jar >/home/dinosaur/HomeProject_temp.txt &
ps -ef | grep java
|
制作开机启动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| mkdir /home/dinosaur/my_auto_start_script
# sudo nano /home/dinosaur/my_auto_start_script/my_mqtt_listener.sh # 下面是写在文档里面的 #!/bin/bash nohup java -jar /home/dinosaur/HomeProject.jar >/home/dinosaur/HomeProject_temp.txt & #
sudo nano /usr/lib/systemd/system/my_mqtt_listener.service # 下面是写在文档里面的,下面的ExecStartPre=/bin/sleep 20一定要加,否则会No Such Device。 [Unit] Description=My MQTT Listener [Service] # Type=oneshot # Type=Simple Type=forking ExecStartPre=/bin/sleep 20 # ExecStart=/home/dinosaur/my_auto_start_script/my_mqtt_listener.sh ExecStart=java -jar /home/dinosaur/HomeProject.jar >/home/dinosaur/HomeProject_temp.txt 2>&1 & Restart=on-failure [Install] WantedBy=multi-user.target
# 增加权限 sudo chmod 777 /home/dinosaur/my_auto_start_script/my_mqtt_listener.sh # 查看权限 ls -l /home/dinosaur/my_auto_start_script/my_mqtt_listener.sh
sudo systemctl start my_mqtt_listener.service
# 设置开机自动启动 sudo systemctl enable my_mqtt_listener.service # 查看状态 systemctl status my_mqtt_listener.service # 查看启动日志,-n查看最后几行 journalctl -u my_mqtt_listener.service -n 10
|