树莓派4B使用-2

树莓派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的客户端连接。

Screenshot2023-05-06at21.36.34

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



# 导入 Paho MQTT 客户端
from paho.mqtt import client as mqtt_client
import random
import time

# 设置 MQTT Broker 连接地址,端口以及 topic,同时我们调用 Python random.randint 函数随机生成 MQTT 客户端 id。
broker = 'b21b2da1.ala.cn-hangzhou.emqxsl.cn'
port = 8883
topic = 'python/mqtt'
client_id = f'python-mqtt-{random.randint(0, 1000)}'
# 如果 broker 需要鉴权,设置用户名密码
username = 'dinosaur'
password = '971707'

# 连接回调函数 on_connect,该函数将在客户端连接后被调用,在该函数中可以依据 rc 来判断客户端是否连接成功。
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)
# Set Connecting Client ID
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)
# result: [0, 1]
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

# 消息回调函数 on_message,该函数将在客户端从 MQTT Broker 收到消息后被调用,在该函数中我们将打印出订阅的 topic 名称以及接收到的消息内容。
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()
# publish(client)

"""
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{

// URL resource = this.getClass().getResource(path);
// AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(resource);
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

Author: Jcwang

Permalink: http://example.com/2023/05/04/%E6%A0%91%E8%8E%93%E6%B4%BE4B%E4%BD%BF%E7%94%A8-2/