小米路由器Mini挪用了网口的指示灯,41口用作GPIO口,现在用来抓取蜻蜓FM的网页,如果感兴趣的节目更新了,就点亮LED灯,实现提醒功能,及时收听节目 🐶🐶🐶🐶🐶
代码如下
package main
import (
"fmt"
"io/ioutil"
"os"
"strings"
"time"
"github.com/parnurzeal/gorequest"
"github.com/tidwall/gjson"
)
type GPIO struct{}
func (r GPIO) Pin(name string) GPIO_Pin {
pin := GPIO_Pin{name}
filename := pin.Filename()
if _, err := os.Stat(filename); os.IsNotExist(err) {
// export gpio pin
ioutil.WriteFile("/sys/class/gpio/export", []byte(pin.Name), 0666)
}
return pin
}
type GPIO_Pin struct {
Name string
}
func (r GPIO_Pin) Filename() string {
return "/sys/class/gpio/gpio" + r.Name
}
func (r GPIO_Pin) write(where, what string) GPIO_Pin {
filename := r.Filename() + "/" + where
ioutil.WriteFile(filename, []byte(what), 0666)
return r
}
func (r GPIO_Pin) read(where string) string {
filename := r.Filename() + "/" + where
b, _ := os.ReadFile(filename)
return strings.Trim(string(b), "\r\n ")
}
func (r GPIO_Pin) Output() GPIO_Pin {
return r.write("direction", "out")
}
func (r GPIO_Pin) Input() GPIO_Pin {
return r.write("direction", "in")
}
func (r GPIO_Pin) High() GPIO_Pin {
return r.write("value", "1")
}
func (r GPIO_Pin) Low() GPIO_Pin {
return r.write("value", "0")
}
func main() {
fmt.Println("QingTing FM Curl")
last_program := ""
gpio := GPIO{}
gpio.Pin("41").Output().High()
for {
_, body, _ := gorequest.New().Get("https://i.qingting.fm/capi/v3/channel/387255?user_id=null").End()
value := gjson.Get(body, "data.latest_program")
name := value.String()
fmt.Println(name)
if name != "" {
if last_program == "" {
last_program = name
}
// not enter if is active
if gpio.Pin("41").read("value") == "1" {
if last_program != name {
last_program = name
fmt.Print("Set low")
gpio.Pin("41").Output().Low()
} else {
fmt.Print("Set high")
gpio.Pin("41").Output().High()
}
}
}
// every 10min
time.Sleep(time.Second * 60 * 10)
}
}
上传到路由器运行,网口灯亮则节目更新,手动设置LED灭以后进入下一个提醒周期
路由器空间有限,优先上传到/tmp目录,或者是U盘目录运行
运行测试如下