l17.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package main
  2. import (
  3. "log"
  4. "github.com/joho/godotenv"
  5. "os"
  6. "strings"
  7. "net/http"
  8. "time"
  9. "encoding/json"
  10. mqtt "github.com/eclipse/paho.mqtt.golang"
  11. "fmt"
  12. )
  13. type OpenWeather struct{
  14. City string `json:"name"`
  15. Main struct {
  16. Temp float64 `json:"temp"`
  17. } `json:"main"`
  18. }
  19. func WeatherReq() (string, float64) {
  20. err := godotenv.Load()
  21. if err != nil {
  22. log.Fatalf("%v\n", err)
  23. }
  24. api := os.Getenv("openweathermap")
  25. city := os.Getenv("city_openweather")
  26. client := &http.Client{
  27. Timeout: 20 * time.Second,
  28. }
  29. link := "https://api.openweathermap.org/data/2.5/weather?q=" + city + "&units=metric&appid=" + api
  30. url := strings.ReplaceAll(link, " ", "%20")
  31. req, err := http.NewRequest("GET", url, nil)
  32. if err != nil {
  33. log.Fatalf("%v\n", err)
  34. }
  35. resp, err := client.Do(req)
  36. if err != nil {
  37. log.Fatalf("%v\n", err)
  38. }
  39. defer resp.Body.Close()
  40. var WeatherData OpenWeather
  41. err = json.NewDecoder(resp.Body).Decode(&WeatherData)
  42. if err != nil {
  43. log.Fatalf("%v\n", err)
  44. }
  45. return WeatherData.City, WeatherData.Main.Temp
  46. }
  47. func main() {
  48. err := godotenv.Load()
  49. if err != nil { log.Fatalf("%v\n", err) }
  50. broker := os.Getenv("broker_mqtt")
  51. ClientID := os.Getenv("clientid_mqtt")
  52. topic := os.Getenv("topic_mqtt")
  53. username := os.Getenv("login_mqtt")
  54. password := os.Getenv("password_mqtt")
  55. opts := mqtt.NewClientOptions()
  56. opts.AddBroker(broker)
  57. opts.SetClientID(ClientID)
  58. opts.SetConnectTimeout(5 * time.Second)
  59. opts.SetUsername(username)
  60. opts.SetPassword(password)
  61. client := mqtt.NewClient(opts)
  62. if token := client.Connect(); token.Wait() && token.Error() != nil { log.Fatalf("%v\n", token.Error()) }
  63. defer client.Disconnect(250)
  64. fmt.Println("Connect to a broker")
  65. city, temp := WeatherReq()
  66. payload := fmt.Sprintf("City: %s, Temperature: %.2f°C", city, temp)
  67. token := client.Publish(topic, 1, false, payload)
  68. ticket := time.NewTicker(2 * time.Second)
  69. defer ticket.Stop()
  70. token.Wait()
  71. if err = token.Error(); err != nil {
  72. log.Fatalf("%v\n", token.Error)
  73. } else {
  74. fmt.Println("Sent in", topic)
  75. }
  76. }