Door/GPIO/GPIO.go
2020-04-22 14:16:17 +07:00

339 lines
8.0 KiB
Go

package main
import (
"beetai/file"
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"os"
"time"
mqtt "github.com/eclipse/paho.mqtt.golang"
"github.com/stianeikeland/go-rpio"
)
// var last_msg_time = time.Now().UnixNano() / 1000000
var Debug int = 1
//***********************************************//
const time_hold = 6 // Set time giu khoa cua
//***********************************************//
var AUTO_SERVER int = 1
//var path_log = "/home/pi/GPIO/log"
var Path_config = "/home/pi/GPIO/ClientDoor.json"
var mqtt_cms_bi mqtt.Client
var CMS_HOST_BI = ""
var CMS_ACCESS_TOKEN_BI = ""
var CMS_PASS_BI = ""
var CMS_TOPIC_IN = ""
var CMS_TOPIC_OUT = ""
// Counter number reconnect publish
var number_repub = 0
// Counter number reconnect subcriber
var number_resub = 0
// const CMS_HOST_BI = "tcp://broker.beetai.com:21883"
// const CMS_ACCESS_TOKEN_BI = "beeetai"
// const CMS_PASS_BI = "5ige8TdfTEHoTgJz"
// var CMS_TOPIC_IN = "gpio/devices/in/+"
// var CMS_TOPIC_OUT = "gpio/devices/out/1"
// var CMS_TOPIC_IN = "gpio/devices/ademax/in/+"
// var CMS_TOPIC_OUT = "gpio/devices/ademax/out/1"
// var CMS_TOPIC_IN = "gpio/devices/beetin/in/+"
// var CMS_TOPIC_OUT = "gpio/devices/beetin/out/+"
var time_now int = 0
var Name string = ""
var door_state bool
// Check mqtt connect
var stt_mqtt = false
var num_reconnect_pub = 0
var num_reconnect_sub = 0
var (
// Use mcu pin 10, corresponds to physical pin 19 on the pi
relay = rpio.Pin(9) // 6- raspberry pi 1 / 9 - raspberry 3B+
)
// {
// "server": [
// {
// "name":"MQTT local",
// "host":"tcp://localhost:1883",
// "user":"beetai",
// "pass":"Admin@123"
// }
// ],
// "client": [
// {
// "name": "Door 1",
// "topic": "device/gpio/1",
// "active": 1
// }
// ]
// }
var door Door
type Door struct {
Servers Server `json:"servers"`
Clients Client `json:"clients"`
}
type Server struct {
Name string `json:"name"`
Host string `json:"host"`
User string `json:"user"`
Pass string `json:"pass"`
}
type Client struct {
Name string `json:"name"`
Topic string `json:"topic"`
Active int `json:"active"`
}
var state_read_ecf = false
func LoadConfig(path string) {
//fmt.Println("---------------------------------- Function Load Config 123 ---------------------------")
fmt.Println(path)
payload := file.ReadFile(path)
fmt.Println(payload)
// err := json.Unmarshal([]byte(payload), &door)
// if err != nil {
// fmt.Println(err)
// }
// fmt.Println(door)
fmt.Println("----------------------------------------")
jsonFile, err := os.Open(path)
// if we os.Open returns an error then handle it
if err != nil {
fmt.Println(err)
}
fmt.Println(jsonFile)
fmt.Println("Successfully Opened engine.json")
fmt.Println("\n")
defer jsonFile.Close()
byteValue, _ := ioutil.ReadAll(jsonFile)
json.Unmarshal(byteValue, &door)
// // Convert Struct to Json
// e, err := json.Marshal(door)
// if err != nil {
// fmt.Println(err)
// }
// //file.Println(string(e))
// err = ioutil.WriteFile(path, []byte(string(e)), 0)
// if err != nil {
// fmt.Println(err)
// }
//fmt.Printf("Door: \n", door)
state_read_ecf = true
// if Debug == 2 {
// file.Println(file.ReadFile(Path_engine_config))
// }
}
func main() {
// Bat debug
mqtt.DEBUG = log.New(os.Stderr, "DEBUG ", log.Ltime)
fmt.Println("======== START MAIN ==========")
time.Sleep(1 * time.Second)
if state_read_ecf == false {
LoadConfig(Path_config)
fmt.Println("Read config done")
//fmt.Println(door.Servers)
//fmt.Println(door.Clients)
CMS_HOST_BI = door.Servers.Host
CMS_ACCESS_TOKEN_BI = door.Servers.User
CMS_PASS_BI = door.Servers.Pass
CMS_TOPIC_IN = door.Clients.Topic
fmt.Println(door)
}
fmt.Println(door)
//SetConnectionLostHandler(connLostHandler)
// mqtt_cms_bi.Subscribe(CMS_TOPIC_IN, 0, mqtt_messageHandler)
// Open and map memory to access gpio, check for errors
if err := rpio.Open(); err != nil {
if Debug == 1 {
fmt.Println(err)
}
fmt.Println(err)
//os.Exit(1)
}
defer rpio.Close()
// Set pin to output mode
relay.Output()
//relay.PullUp()
relay.PullDown()
// Toggle pin 20 times
//go Check_door()
mqtt_begin()
for {
Check_door()
}
}
func Check_door() {
if door_state == true {
time.Sleep(time.Second * time_hold)
//relay.Low()
relay.High()
if Debug == 1 {
fmt.Println("Close Door")
fmt.Println("--------------------------------")
}
door_state = false
}
}
func mqtt_begin() {
fmt.Println(CMS_HOST_BI)
fmt.Println(CMS_ACCESS_TOKEN_BI)
fmt.Println(CMS_PASS_BI)
opts_cms_bi := mqtt.NewClientOptions()
opts_cms_bi.AddBroker(CMS_HOST_BI)
opts_cms_bi.SetUsername(CMS_ACCESS_TOKEN_BI)
opts_cms_bi.SetPassword(CMS_PASS_BI)
opts_cms_bi.SetCleanSession(true)
mqtt_cms_bi = mqtt.NewClient(opts_cms_bi)
opts_cms_bi.SetConnectionLostHandler(MQTTLostConnectHandler)
opts_cms_bi.SetOnConnectHandler(MQTTOnConnectHandler)
if token_1 := mqtt_cms_bi.Connect(); token_1.Wait() && token_1.Error() == nil {
//file.Write_log("MQTT CMS Beetsoft Connected\n", path_log)
if Debug == 1 {
fmt.Printf("MQTT Server Connected\n")
}
} else {
//file.Write_log("MQTT CMS Beetsoft cant not Connected\n", path_log)
if Debug == 1 {
fmt.Printf("MQTT Server cant not Connected\n")
fmt.Printf("Loi Server : %v \n", token_1.Error())
fmt.Printf("-------------------\n")
}
}
// opts_cms_bi.OnConnect = func(c mqtt.Client) {
// fmt.Printf("Client connected, subscribing to: " + CMS_TOPIC_IN)
// c.Subscribe(CMS_TOPIC_IN, 0, mqtt_messageHandler)
// }
}
func MQTTLostConnectHandler(c mqtt.Client, err error) {
// file.Write_log("MQTT CMS Beetsoft Lost Connect\n", box.Path_log_luncher)
fmt.Println("MQTT SERVER Lost Connect\n")
fmt.Println(err)
}
func MQTTOnConnectHandler(client mqtt.Client) {
// file.Write_log("Reconnect: MQTT_OnConnectHandler\n", box.Path_log_luncher)
fmt.Println("Reconnect: MQTT_OnConnectHandler\n")
//mqtt_cms_bi.Unsubscribe(CMS_TOPIC_IN)
//time.Sleep(10)
//mqtt_cms_bi.Subscribe(CMS_TOPIC_IN, 0, mqtt_messageHandler)
if token := client.Subscribe(CMS_TOPIC_IN, 0, mqtt_messageHandler); token.Wait() && token.Error() != nil {
fmt.Println(token.Error())
} else {
fmt.Println("Subcriber is MQTTOnConnectHandler () OKIE ")
}
//fmt.Println("Recall function Subscribe MQTT\n")
// file.Write_log("Recall function Subscribe MQTT\n", box.Path_log_luncher)
}
/************************************************************************/
var k int
// mqtt callback server beetswoft
func mqtt_messageHandler(mqtt_bi mqtt.Client, message mqtt.Message) {
if Debug == 1 {
fmt.Printf("TOPIC: %s\n", message.Topic())
fmt.Printf("MSG:\n %s\n", message.Payload())
}
//file.Write_log(string(message.Topic()), path_log)
//file.Write_log(string(message.Payload()), path_log)
dec := json.NewDecoder(bytes.NewReader(message.Payload()))
var list map[string]interface{}
if err := dec.Decode(&list); err != nil {
fmt.Printf("Error:%v\n", err)
//return
}
fmt.Println(list)
//************************************************//
if Debug == 1 {
fmt.Println(k)
}
if list["method"] == "gpio" {
topic := CMS_TOPIC_OUT
if Debug == 1 {
fmt.Println(topic)
}
if list["params"] == "1" {
if door_state == true {
} else {
//relay.High()
relay.Low()
Name = (list["name"]).(string)
fmt.Println("Xin Chao Mung " + Name)
}
//msg := `{"method":"gpio","params":"1"}`
//CmsResponse(mqtt_bi, topic, msg)
if Debug == 1 {
fmt.Println("Open Door")
fmt.Println("--------------------------------")
}
door_state = true
} else if list["params"] == "0" {
//relay.Low()
//msg := `{"method":"gpio","params":"0"}`
//CmsResponse(mqtt_bi, topic, msg)
relay.Low()
if Debug == 1 {
fmt.Println("Close Door")
fmt.Println("--------------------------------")
}
door_state = false
}
//fmt.Print("Set gpio done\n")
}
}
/************************************************************************/
func CmsResponse(c mqtt.Client, topic string, msg string) {
c.Publish(topic, 0, false, msg)
if Debug == 1 {
fmt.Println("Publish message done")
}
}
//{"method":"gpio","params": "0"}
//{"method":"gpio","params": "1"}