package main import ( "beetai/file" "bytes" "encoding/json" "fmt" "io/ioutil" "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(6) // (10.200)GPIO 6- raspberry pi 3 === GPIO 9 - raspberry 3B+ (10.201) ) // { // "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() // 201 //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) opts_cms_bi.SetConnectionLostHandler(MQTTLostConnectHandler) opts_cms_bi.SetOnConnectHandler(MQTTOnConnectHandler) mqtt_cms_bi = mqtt.NewClient(opts_cms_bi) 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") } } if token := mqtt_cms_bi.Subscribe(CMS_TOPIC_IN, 0, mqtt_messageHandler); token.Wait() && token.Error() != nil { fmt.Println(token.Error()) } else { fmt.Println("Subcriber is MQTTOnConnectHandler () OKIE ") } // 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()) } if string(message.Payload()) == `{"method":"gpio","params":"1"}` { fmt.Println("MO KHOA") if door_state == true { } else { relay.High() // 201 //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 } //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() //201 //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"}