upgrade.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. //升级模块
  2. // 秒寻科技
  3. // zt 2024-11-11
  4. package upgrade
  5. import (
  6. "bytes"
  7. "encoding/binary"
  8. "ipsomc/module/ps/psdl"
  9. "ipsomc/module/ps/psmodel"
  10. "ipsomc/module/ps/pspublic"
  11. "ipsomc/module/uploadfile/uploadfilemodel"
  12. "ipsomc/public"
  13. )
  14. var (
  15. Gupgrade_stManageParam OAM_UPGRADE_T //升级管理模块
  16. Gupgrade_abyFileData []byte //升级文件
  17. )
  18. // 升级
  19. type Upgrade struct {
  20. psDlApi psdl.PsDl
  21. }
  22. // 升级管理结构
  23. type OAM_UPGRADE_T struct {
  24. UpgradeStatus uint8 `json:"upgrade_status"` //1:升级中,2:升级成功,3:升级失败,4:超时
  25. FileSize uint32 `json:"file_size"` //升级文件大小
  26. TotalTimes uint32 `json:"total_times"` //发送总次数
  27. SendingTimes uint32 `json:"sending_times"` //当前发送次数
  28. RemainderLen uint32 `json:"remainder_len"` //最后一次数据长度
  29. }
  30. // 远程升级,接收文件
  31. func (obj *Upgrade) UpgradeReceiveFile(dataModel *uploadfilemodel.UploadFileParam, dataList []byte, dwLen uint32) error {
  32. fileSize := dwLen //文件长度
  33. //4字节对齐
  34. remainderLen := fileSize % 4 //余数
  35. if remainderLen > 0 {
  36. fileSize = fileSize + 4 - remainderLen
  37. }
  38. Gupgrade_stManageParam.FileSize = fileSize //文件字节数
  39. //保存文件数据
  40. Gupgrade_abyFileData = make([]byte, fileSize)
  41. copy(Gupgrade_abyFileData, dataList)
  42. //组织升级管理结构
  43. totalTimes := fileSize / psmodel.PS_MCP_B_DATA_LEN
  44. remainderLen = fileSize % psmodel.PS_MCP_B_DATA_LEN
  45. if remainderLen > 0 {
  46. Gupgrade_stManageParam.TotalTimes = totalTimes + 1
  47. Gupgrade_stManageParam.RemainderLen = remainderLen
  48. } else {
  49. Gupgrade_stManageParam.TotalTimes = totalTimes
  50. Gupgrade_stManageParam.RemainderLen = psmodel.PS_MCP_B_DATA_LEN
  51. }
  52. //切换工作模式
  53. if err := obj.UpgradeSwitchSoftMode(dataModel, 1); err != nil {
  54. return err
  55. }
  56. return nil
  57. }
  58. // 组织设置LTV数据结构
  59. func (obj *Upgrade) UpgradeOrganizeLtv(wLen uint16, wCmd uint16, value []byte, dataList *bytes.Buffer) {
  60. dataLen := wLen - 4
  61. tmpSlice := make([]byte, dataLen) //定义该命令所需的数据切片
  62. copy(tmpSlice, value)
  63. binary.Write(dataList, binary.LittleEndian, wLen) //长度
  64. binary.Write(dataList, binary.LittleEndian, wCmd) //命令
  65. binary.Write(dataList, binary.LittleEndian, tmpSlice) //数据
  66. }
  67. // 切换升级模式
  68. // dataModel:升级文件参数
  69. // upgradeStatus:升级状态
  70. func (obj *Upgrade) UpgradeSwitchSoftMode(dataModel *uploadfilemodel.UploadFileParam, upgradeStatus uint8) error {
  71. var dataList bytes.Buffer
  72. tmpBytes := make([]byte, 1)
  73. //组织参数
  74. tmpBytes = append(tmpBytes, upgradeStatus)
  75. obj.UpgradeOrganizeLtv(5, uint16(pspublic.OAM_UPGRADE_SWITCH_SOFT_WORK_MODE), tmpBytes, &dataList) //切换软件模式
  76. //发送数据给基站
  77. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_B, psmodel.MCP_B_CONTROL, dataList.Bytes()); err != nil {
  78. obj.UpgradeDeinit()
  79. return err
  80. }
  81. Gupgrade_stManageParam.UpgradeStatus = 1 //升级中
  82. Gupgrade_stManageParam.SendingTimes = 0 //发送次数复位
  83. return nil
  84. }
  85. // 通知升级文件大小
  86. // ProjectID:项目编号
  87. // BtsID:基站编号
  88. func (obj *Upgrade) UpgradeNoticeFileSize(ProjectID int, BtsID int) error {
  89. var dataList bytes.Buffer
  90. tmpBytes := make([]byte, 4)
  91. ////组织参数
  92. binary.LittleEndian.PutUint32(tmpBytes, Gupgrade_stManageParam.FileSize)
  93. obj.UpgradeOrganizeLtv(8, uint16(pspublic.OAM_UPGRADE_NOTICE_FILE_SIZE_), tmpBytes, &dataList)
  94. //发送数据给基站
  95. if err := obj.psDlApi.PsDlSendOamDataToBts(ProjectID, BtsID, psmodel.MCP_B, psmodel.MCP_B_CONTROL, dataList.Bytes()); err != nil {
  96. obj.UpgradeDeinit()
  97. return err
  98. }
  99. return nil
  100. }
  101. // 传输升级文件
  102. // ProjectID:项目编号
  103. // BtsID:基站编号
  104. func (obj *Upgrade) UpgradeTransferFile(ProjectID int, BtsID int) error {
  105. var payloadLen uint32 = psmodel.PS_MCP_B_DATA_LEN //载荷长度
  106. var dwStartIndex uint32 = 0
  107. var dwStopIndex uint32 = 0
  108. var dataList bytes.Buffer
  109. var dwLen uint32 = 0
  110. var stUpgradeStatus public.PublicUpgradeStatus //升级状态管理结构
  111. if Gupgrade_stManageParam.SendingTimes < Gupgrade_stManageParam.TotalTimes {
  112. if Gupgrade_stManageParam.SendingTimes == (Gupgrade_stManageParam.TotalTimes - 1) {
  113. payloadLen = Gupgrade_stManageParam.RemainderLen
  114. }
  115. payload := make([]byte, payloadLen) //载荷数据空间
  116. //组织数据
  117. dwStartIndex = Gupgrade_stManageParam.SendingTimes * psmodel.PS_MCP_B_DATA_LEN
  118. dwStopIndex = dwStartIndex + payloadLen
  119. copy(payload, Gupgrade_abyFileData[dwStartIndex:dwStopIndex])
  120. Gupgrade_stManageParam.SendingTimes++
  121. //组织ltv数据
  122. dwLen = 8 + payloadLen
  123. binary.Write(&dataList, binary.LittleEndian, uint16(dwLen)) //长度
  124. binary.Write(&dataList, binary.LittleEndian, uint16(pspublic.OAM_UPGRADE_SEND_UPGRADE_FILE)) //命令
  125. binary.Write(&dataList, binary.LittleEndian, Gupgrade_stManageParam.SendingTimes) //帧号
  126. binary.Write(&dataList, binary.LittleEndian, payload) //数据
  127. //发送数据给基站
  128. if err := obj.psDlApi.PsDlSendOamDataToBts(ProjectID, BtsID, psmodel.MCP_B, psmodel.MCP_B_FILE_TRANSFER, dataList.Bytes()); err != nil {
  129. obj.UpgradeDeinit() //反向初始化
  130. stUpgradeStatus.Flag = 1 //失败
  131. stUpgradeStatus.Percent = 0
  132. public.Gpub_chanWebSocketMsg <- stUpgradeStatus //通过通道发送数据到http模块
  133. return err
  134. }
  135. stUpgradeStatus.Flag = 2 //成功
  136. stUpgradeStatus.Percent = uint8((Gupgrade_stManageParam.SendingTimes * 100) / Gupgrade_stManageParam.TotalTimes)
  137. public.Gpub_chanWebSocketMsg <- stUpgradeStatus //通过通道发送数据到http模块
  138. } else {
  139. //通知升级结束
  140. if err := obj.UpgradeNoticeOver(ProjectID, BtsID); err != nil {
  141. obj.UpgradeDeinit() //反向初始化
  142. stUpgradeStatus.Flag = 1 //失败
  143. stUpgradeStatus.Percent = 0
  144. public.Gpub_chanWebSocketMsg <- stUpgradeStatus //通过通道发送数据到http模块
  145. return err
  146. }
  147. obj.UpgradeDeinit() //反向初始化
  148. }
  149. return nil
  150. }
  151. // 通知升级结束
  152. // ProjectID:项目编号
  153. // BtsID:基站编号
  154. func (obj *Upgrade) UpgradeNoticeOver(ProjectID int, BtsID int) error {
  155. var dataList bytes.Buffer
  156. tmpBytes := make([]byte, 4)
  157. ////组织参数
  158. binary.LittleEndian.PutUint32(tmpBytes, Gupgrade_stManageParam.FileSize)
  159. obj.UpgradeOrganizeLtv(8, uint16(pspublic.OAM_UPGRADE_NOTICE_UPGRADE_OVER), tmpBytes, &dataList)
  160. //发送数据给基站
  161. if err := obj.psDlApi.PsDlSendOamDataToBts(ProjectID, BtsID, psmodel.MCP_B, psmodel.MCP_B_CONTROL, dataList.Bytes()); err != nil {
  162. obj.UpgradeDeinit() //反向初始化
  163. return err
  164. }
  165. obj.UpgradeDeinit() //反向初始化
  166. return nil
  167. }
  168. // 升级成功
  169. func (obj *Upgrade) UpgradeSuccess() {
  170. obj.UpgradeDeinit() //反向初始化
  171. }
  172. // 升级模块反向初始化
  173. func (obj *Upgrade) UpgradeDeinit() {
  174. Gupgrade_stManageParam = OAM_UPGRADE_T{}
  175. }