protocol.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package reporter
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "net/url"
  6. "hnyfkj.com.cn/rtu/linux/utils/jsonrpc2"
  7. )
  8. func makeLoginReq(imei, iccid, rssi, appVersion, inheritDUI string) ([]byte, error) {
  9. type params struct {
  10. DeviceType string `json:"deviceType"`
  11. IMEI string `json:"imei"`
  12. ICCID string `json:"iccid"`
  13. RSSI string `json:"rssi"`
  14. AppVersion string `json:"appVersion"`
  15. InheritID string `json:"inheritDUI,omitempty"` // 继承的DUI, 可选可为空
  16. }
  17. devParams := params{
  18. DeviceType: "-1", // Todo: 拍照性诱智能监测设备的产品类型暂时未知 ????????
  19. IMEI: imei,
  20. ICCID: iccid,
  21. RSSI: rssi,
  22. AppVersion: appVersion,
  23. InheritID: inheritDUI,
  24. }
  25. req, err := jsonrpc2.BuildRequest("login", devParams)
  26. if err != nil {
  27. return nil, err
  28. }
  29. return json.Marshal(req)
  30. }
  31. func parseLoginResp(data []byte) (string, string, error) {
  32. resp, err := jsonrpc2.ParseResponse(data)
  33. if err != nil {
  34. return "", "", err
  35. }
  36. if resp.Error != nil {
  37. return "", "", fmt.Errorf("服务器返回错误: %d, %s", resp.Error.Code, resp.Error.Message)
  38. }
  39. var result struct {
  40. IMEI string `json:"imei"`
  41. DUI string `json:"DUI"`
  42. }
  43. if err := json.Unmarshal(resp.Result, &result); err != nil {
  44. return "", "", err
  45. }
  46. if len(result.DUI) != 14 || !IsDecimal(result.DUI) {
  47. return "", "", fmt.Errorf("无效DUI: %q", result.DUI)
  48. }
  49. return result.IMEI, result.DUI, nil
  50. }
  51. func makeLogoutNotif(imei string) ([]byte, error) {
  52. type params struct {
  53. IMEI string `json:"imei"`
  54. }
  55. devParams := params{
  56. IMEI: imei,
  57. }
  58. msg, err := jsonrpc2.BuildNotification("logout", devParams)
  59. if err != nil {
  60. return nil, err
  61. }
  62. return json.Marshal(msg)
  63. }
  64. func parseUpgradeAppReq(params json.RawMessage) (serverAddr, loginUser, loginPass, remoteFile, md5value string, err error) {
  65. if len(params) == 0 {
  66. return "", "", "", "", "", fmt.Errorf("missing params")
  67. }
  68. var upgrade struct {
  69. URL string `json:"url"` // 升级包的URL地址
  70. MD5 string `json:"md5"` // 升级包的MD5校验值, 32个十六进制数字组成, 16字节
  71. }
  72. if err := json.Unmarshal(params, &upgrade); err != nil {
  73. return "", "", "", "", "", err
  74. }
  75. u, err := url.Parse(upgrade.URL)
  76. if err != nil {
  77. return "", "", "", "", "", fmt.Errorf("invalid URL: %s", upgrade.URL)
  78. }
  79. if u.Scheme != "ftp" {
  80. return "", "", "", "", "", fmt.Errorf("unsupported scheme: %s", u.Scheme)
  81. }
  82. host := u.Hostname()
  83. port := u.Port()
  84. if port == "" {
  85. port = "21"
  86. }
  87. serverAddr = fmt.Sprintf("%s:%s", host, port)
  88. loginUser = u.User.Username()
  89. loginPass, _ = u.User.Password()
  90. remoteFile = u.Path
  91. if remoteFile == "" {
  92. return "", "", "", "", "", fmt.Errorf("missing remote file path")
  93. }
  94. md5value = upgrade.MD5
  95. return serverAddr, loginUser, loginPass, remoteFile, md5value, nil
  96. }
  97. func buildResp(req *jsonrpc2.Request, result any, err error) *jsonrpc2.Response {
  98. if err != nil {
  99. return jsonrpc2.BuildError(req, -32700, err.Error())
  100. }
  101. resp, err := jsonrpc2.BuildResult(req, result)
  102. if err != nil {
  103. return jsonrpc2.BuildError(req, jsonrpc2.ErrInternal, "")
  104. }
  105. return resp
  106. }