obix.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package obix
  2. import (
  3. "city_chips/internal/model"
  4. "crypto/tls"
  5. "encoding/base64"
  6. "encoding/xml"
  7. "fmt"
  8. "io"
  9. "net/http"
  10. "net/url"
  11. "strconv"
  12. )
  13. // SendSecureRequest 发送 GET 请求到指定 URL,使用用户名和密码构造认证 Header
  14. func SendSecureRequest(fullURL, username, password string) (string, error) {
  15. // 创建不验证证书的 HTTP Client
  16. client := &http.Client{
  17. Transport: &http.Transport{
  18. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  19. },
  20. }
  21. // 创建请求
  22. req, err := http.NewRequest("GET", fullURL, nil)
  23. if err != nil {
  24. return "", fmt.Errorf("failed to create request: %w", err)
  25. }
  26. // 构造 Authorization 头(Basic Auth)
  27. auth := username + ":" + password
  28. req.Header.Add("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(auth)))
  29. // 构造 Cookie 中的 niagara_origin_uri 参数(包含认证信息)
  30. encodedUser := url.QueryEscape(username)
  31. encodedPass := url.QueryEscape(password)
  32. originURI := req.URL.Path + "?Username=" + encodedUser + "&Password=" + encodedPass
  33. req.Header.Add("Cookie", "JSESSIONID=6ee85d04496e56251021fff41d3a690a53bb09f3524d5828e5.node0; niagara_origin_uri="+originURI)
  34. // 发送请求
  35. res, err := client.Do(req)
  36. if err != nil {
  37. return "", fmt.Errorf("request failed: %w", err)
  38. }
  39. defer res.Body.Close()
  40. // 读取响应体
  41. body, err := io.ReadAll(res.Body)
  42. if err != nil {
  43. return "", fmt.Errorf("failed to read response body: %w", err)
  44. }
  45. return string(body), nil
  46. }
  47. func ParseTemperatureFromXML(xmlData []byte) (*model.RealPoint, error) {
  48. var realPoint model.RealPoint
  49. err := xml.Unmarshal(xmlData, &realPoint)
  50. if err != nil {
  51. return nil, fmt.Errorf("failed to unmarshal XML: %w", err)
  52. }
  53. return &realPoint, nil
  54. }
  55. func DetectType(s string) interface{} {
  56. // 1. 尝试转为整数
  57. if i, err := strconv.Atoi(s); err == nil {
  58. return i
  59. }
  60. // 2. 尝试转为浮点数
  61. if f, err := strconv.ParseFloat(s, 64); err == nil {
  62. return f
  63. }
  64. // 3. 尝试转为布尔值
  65. if b, err := strconv.ParseBool(s); err == nil {
  66. return b
  67. }
  68. // 4. 如果都不是,则返回原字符串
  69. return s
  70. }