Skip to content

Instantly share code, notes, and snippets.

@doorbash
Last active November 26, 2019 14:51
Show Gist options
  • Save doorbash/f6c854f987f9416e7a24b93230a77ddf to your computer and use it in GitHub Desktop.
Save doorbash/f6c854f987f9416e7a24b93230a77ddf to your computer and use it in GitHub Desktop.
package main
import (
"github.com/tarm/serial"
"log"
"strings"
"time"
)
var phoneNumers = map[string]bool{
"+989XXXXXXXXX": true,
"+989YYYYYYYYY": true,
"+989ZZZZZZZZZ": true,
}
var port *serial.Port
func main() {
var err error
port, err = serial.OpenPort(&serial.Config{Name: "COM3", Baud: 9600})
if err != nil {
log.Fatal(err)
}
buf := make([]byte, 128)
line := ""
for {
n, err := port.Read(buf)
if err != nil {
log.Println(err)
}
startIndex := 0
for i := range buf[:n] {
r := buf[i]
//log.Printf(">> " + strconv.Itoa(int(r)))
if r == '\n' {
if i > startIndex {
line += string(buf[startIndex:i])
}
handleMessage(line)
line = ""
startIndex = i + 1
}
}
if startIndex < n {
line += string(buf[startIndex:n])
}
}
}
func handleMessage(msg string) {
log.Println(msg)
if strings.HasPrefix(msg, "+CMGR:") {
s := strings.Split(msg, "\"")
if s[1] != "REC UNREAD" {
log.Println("message is not unread")
return
}
if _, ok := phoneNumers[s[3]]; !ok {
log.Println("phone number is not in the list")
return
}
zone, _ := time.Now().Zone()
log.Println(s[5][:17] + zone)
messageTime, _ := time.Parse("06/01/02,15:04:05-0700", s[5][:17]+zone)
currentTime := time.Now()
log.Println(messageTime)
log.Println(currentTime)
diff := currentTime.Sub(messageTime).Milliseconds()
log.Printf("diff is %v\n", diff)
if diff >= 0 && diff <= 10000 {
time.Sleep(time.Second)
log.Println("let's open the door")
_, err := port.Write([]byte("OPEN\n"))
if err != nil {
log.Println(err)
}
} else {
log.Println("message is old.. ignore it")
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment