现在部署项目都是使用CI/CD流水线,而触发流水线的方式有很多,如推送代码,创建Tag,定时触发,合并请求。今天这边文章就来介绍一种新颖的流水线触发方式,声控触发。 目标是当我对着一个麦克风说,“艾瑞莉娅,帮我部署博客项目”,项目的CI/CD流水线就会被触发,从而将最新的代码部署到环境中。
要实现这一目的,我们需要软硬结合。需要硬件来采集语音指令,然后这个硬件还需要具有联网功能,因为需要根据语音指令来发送一个HTTP请求。
要实现上面的目的,我们需要购买一个语音开发板,如果语音模块不支持联网,我们还需要一个能够联网的开发板,两者结合。然后使用GitLab 的Open API 来触发流水线。
语音模块通过USB连接电脑 ESP8266 通过USB连接电脑 然后语音模块的PC4引脚连接ESP8266的 D1引脚 最后语音模块的GND引脚连接ESP8266的GND引脚(一开始没有连接,ESP怎么都接收不到🥹,我以为两个板子独立供电,信号线一连就行了,查了资料才知道,还要连个地线。)
语音控制板在天问Block上编码,需要下载安装 ESP8266 是在Arduino IDE上编码 两者都需要连接串口,没有安装芯片驱动的新电脑也需要安装驱动。
唤醒词为艾希,当我们对麦克风说开始
时 语音开发板会将PA4引脚的电平翻转,并通过杜邦线传递给ESP8266。然后在ESP8266的开发板里我们写处理电平变化的逻辑。
首先要给板子连上WIFI,然后使用的是 GPIO 5 的引脚来通讯, 将语音开发板的引脚与 ESP8266的 GPIO5,也就是板子上的D1引脚使用杜邦线连接。 当GPIO5 的电平发生变化时,由高变低,或由低变高后,就会发送触发流水线的HTTP请求。需要在请求头部设置token。
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecure.h> // 引入支持SSL/TLS的客户端库
#define DEBUG_ESP_SSL
#define DEBUG_ESP_HTTP_CLIENT
#define DEBUG_ESP_WIFI
const char* ssid = "404";
const char* password = "wifi password";
const int pin = 5; // 示例使用GPIO 5
WiFiClientSecure wifiClient; // 使用WiFiClientSecure对象
int lastPinStatus = LOW; // 用于存储上一次的引脚状态
void setup() {
Serial.begin(115200);
pinMode(pin, INPUT_PULLUP); // Set the GPIO pin as input with pull-up resistor
wifiClient.setInsecure(); // 禁用证书验证
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected");
}
void loop() {
int currentPinStatus = digitalRead(pin);
Serial.println("currentPinStatus: " + String(currentPinStatus));
Serial.println("lastPinStatus: " + String(lastPinStatus));
if (currentPinStatus != lastPinStatus && WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(wifiClient, "https://gitlab.com/api/v4/projects/37423097/pipeline?ref=master");
http.addHeader("Content-Type", "application/json");
http.addHeader("PRIVATE-TOKEN", "Access Token");
int httpCode = http.POST("{}");
if (httpCode > 0) {
String payload = http.getString();
Serial.println("Response: " + payload);
} else {
Serial.println("HTTP POST failed, error: " + String(httpCode));
}
http.end();
} else {
Serial.println("Not connected to WiFi");
}
lastPinStatus = currentPinStatus;
delay(10000); // Delay 10 seconds before next loop iteration
}
ESP8266 发送HTTP请求时,由于是HTTPS协议,所有需要特别注意,首先是使用这个对象WiFiClientSecure,之前使用的是WiFiClient,报错。然后发送HTTPS请求时,需要忽略证书的验证。也就是这一步 wifiClient.setInsecure(); // 禁用证书验证
排查接口问题,可以尝试在终端发送请求,确保token和接口能正常触发流水线。
由于ESP8266 一直连接到Arduino IDE,我们可以打开串口控制台,看一些实时的信息,下图就是一个电平改变后,发送了HTTPS请求,Response就是接口返回的数据。
由于项目是公开的,大家也可以直接看到项目的流水线,流水线的触发者是创建token时填写名字,我写的是esp。 https://gitlab.com/PmcFizz/blog/-/pipelines
晚点再录一个视频给大家看,如果大家需要什么资料可以私聊我。 探索新的事物,我一直在路上。