bparamoam.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560
  1. // OAM模块-基站参数
  2. // 秒寻科技
  3. // zt 2024-10-2
  4. package bparamoam
  5. import (
  6. "bytes"
  7. "encoding/binary"
  8. "ipsomc/module/bparam/bparammodel"
  9. "ipsomc/module/oam"
  10. "ipsomc/module/ps/psdl"
  11. "ipsomc/module/ps/psmodel"
  12. "ipsomc/util"
  13. "strconv"
  14. )
  15. type BparamOam struct {
  16. psDlApi psdl.PsDl
  17. }
  18. // 组织查询LTV-A数据结构
  19. func (obj *BparamOam) OamOrganizeQueryLtvA(wLen uint16, wCmd uint16, dataList *bytes.Buffer) {
  20. dataLen := wLen - 4
  21. binary.Write(dataList, binary.LittleEndian, wLen) //长度
  22. binary.Write(dataList, binary.LittleEndian, wCmd) //命令
  23. binary.Write(dataList, binary.LittleEndian, make([]byte, dataLen)) //数据
  24. }
  25. // 组织设置LTV-A数据结构
  26. func (obj *BparamOam) OamOrganizeSetLtvA(wLen uint16, wCmd uint16, value []byte, dataList *bytes.Buffer) {
  27. dataLen := wLen - 4
  28. tmpSlice := make([]byte, dataLen) //定义该命令所需的数据切片
  29. copy(tmpSlice, value)
  30. binary.Write(dataList, binary.LittleEndian, wLen) //长度
  31. binary.Write(dataList, binary.LittleEndian, wCmd) //命令
  32. binary.Write(dataList, binary.LittleEndian, tmpSlice) //数据
  33. }
  34. // 查询基站设备参数
  35. // dataModel:基站参数
  36. func (obj *BparamOam) OamQueryDeviceParam(dataModel *bparammodel.BtsBaseParam) error {
  37. ////组织查询参数数据
  38. var dataList bytes.Buffer
  39. zeroBuffer := make([]byte, 20)
  40. //设备类型
  41. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_DEVICE_TYPE), &dataList)
  42. //设备序列号
  43. binary.Write(&dataList, binary.LittleEndian, uint16(24)) //长度
  44. binary.Write(&dataList, binary.LittleEndian, uint16(oam.ORDER_DEVICE_SERIAL_NO)) //命令
  45. binary.Write(&dataList, binary.LittleEndian, zeroBuffer) //数据
  46. //设备型号
  47. binary.Write(&dataList, binary.LittleEndian, uint16(24)) //长度
  48. binary.Write(&dataList, binary.LittleEndian, uint16(oam.ORDER_DEVICE_MODEL)) //命令
  49. binary.Write(&dataList, binary.LittleEndian, zeroBuffer) //数据
  50. //软件版本
  51. binary.Write(&dataList, binary.LittleEndian, uint16(24)) //长度
  52. binary.Write(&dataList, binary.LittleEndian, uint16(oam.ORDER_DEVICE_MCU_VERSION)) //命令
  53. binary.Write(&dataList, binary.LittleEndian, zeroBuffer) //数据
  54. //蓝牙名称
  55. binary.Write(&dataList, binary.LittleEndian, uint16(32)) //长度
  56. binary.Write(&dataList, binary.LittleEndian, uint16(oam.ORDER_DEVICE_BLE_BTS_NAME)) //命令
  57. binary.Write(&dataList, binary.LittleEndian, make([]byte, 28)) //数据
  58. //发送数据给基站
  59. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_QUERY, dataList.Bytes()); err != nil {
  60. return err
  61. }
  62. return nil
  63. }
  64. // 查询基站网管参数
  65. // dataModel:基站参数
  66. func (obj *BparamOam) OamQueryNetworkParam(dataModel *bparammodel.BtsBaseParam) error {
  67. var dataList bytes.Buffer
  68. ////组织查询参数
  69. obj.OamOrganizeQueryLtvA(24, uint16(oam.ORDER_NETWORK_WIFI_NAME), &dataList) //wifi名称
  70. obj.OamOrganizeQueryLtvA(24, uint16(oam.ORDER_NETWORK_WIFI_PWD), &dataList) //wifi密码
  71. obj.OamOrganizeQueryLtvA(36, uint16(oam.ORDER_NETWORK_SERVICE_IP), &dataList) //管理中心IP
  72. obj.OamOrganizeQueryLtvA(6, uint16(oam.ORDER_NETWORK_SERVICE_PORT), &dataList) //管理中心端口
  73. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_NETWORK_SWITCH), &dataList) //管理中心使能
  74. //发送数据给基站
  75. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_QUERY, dataList.Bytes()); err != nil {
  76. return err
  77. }
  78. return nil
  79. }
  80. // 设置基站网管参数
  81. // dataModel:基站参数
  82. func (obj *BparamOam) OamSetNetworkParam(dataModel *bparammodel.BtsBaseParam) error {
  83. var dataList bytes.Buffer
  84. tmpBytes := make([]byte, 32)
  85. ////组织查询参数
  86. tmpBytes = []byte(dataModel.WifiName)
  87. obj.OamOrganizeSetLtvA(24, uint16(oam.ORDER_NETWORK_WIFI_NAME), tmpBytes, &dataList) //wifi名称
  88. tmpBytes = []byte(dataModel.WifiPwd)
  89. obj.OamOrganizeSetLtvA(24, uint16(oam.ORDER_NETWORK_WIFI_PWD), tmpBytes, &dataList) //wifi密码
  90. tmpBytes = []byte(dataModel.ServiceIP)
  91. obj.OamOrganizeSetLtvA(36, uint16(oam.ORDER_NETWORK_SERVICE_IP), tmpBytes, &dataList) //管理中心IP
  92. binary.LittleEndian.PutUint16(tmpBytes, uint16(dataModel.ServicePort))
  93. obj.OamOrganizeSetLtvA(6, uint16(oam.ORDER_NETWORK_SERVICE_PORT), tmpBytes, &dataList) //管理中心端口
  94. tmpBytes = []byte{dataModel.NetworkSwitch}
  95. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_NETWORK_SWITCH), tmpBytes, &dataList) //管理中心使能
  96. //发送数据给基站
  97. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_CONFIGURE, dataList.Bytes()); err != nil {
  98. return err
  99. }
  100. return nil
  101. }
  102. // 查询基站同步参数
  103. // dataModel:基站参数
  104. func (obj *BparamOam) OamQuerySyncParam(dataModel *bparammodel.BtsBaseParam) error {
  105. var dataList bytes.Buffer
  106. ////组织查询参数
  107. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_SYNC_CENTER_FREQ), &dataList) //中心频率
  108. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_SYNC_TX_POWER), &dataList) //发射功率
  109. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_SYNC_RSSI), &dataList) //接收电平
  110. //发送数据给基站
  111. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_QUERY, dataList.Bytes()); err != nil {
  112. return err
  113. }
  114. return nil
  115. }
  116. // 设置基站同步参数
  117. // dataModel:基站参数
  118. func (obj *BparamOam) OamSetSyncParam(dataModel *bparammodel.BtsBaseParam) error {
  119. var dataList bytes.Buffer
  120. tmpBytes := make([]byte, 1)
  121. ////组织参数
  122. tmpBytes = []byte{byte(dataModel.CenterFreq)}
  123. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_SYNC_CENTER_FREQ), tmpBytes, &dataList)
  124. tmpBytes = []byte{byte(dataModel.TxPower)}
  125. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_SYNC_TX_POWER), tmpBytes, &dataList) //发射功率
  126. //发送数据给基站
  127. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_CONFIGURE, dataList.Bytes()); err != nil {
  128. return err
  129. }
  130. return nil
  131. }
  132. // 查询基站增益参数
  133. // dataModel:基站参数
  134. func (obj *BparamOam) OamQueryGainParam(dataModel *bparammodel.BtsDeviceParam) error {
  135. var dataList bytes.Buffer
  136. ////组织查询参数
  137. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_CONFIG_DAC_SWITCH), &dataList) //中心频率
  138. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_CONFIG_DAC_GAIN), &dataList) //发射功率
  139. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_CONFIG_PA_SWITCH), &dataList) //中心频率
  140. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_CONFIG_PA_GAIN), &dataList) //发射功率
  141. //发送数据给基站
  142. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_QUERY, dataList.Bytes()); err != nil {
  143. return err
  144. }
  145. return nil
  146. }
  147. // 设置基站增益参数
  148. // dataModel:基站参数
  149. func (obj *BparamOam) OamSetGainParam(dataModel *bparammodel.BtsBaseParam) error {
  150. var dataList bytes.Buffer
  151. tmpBytes := make([]byte, 32)
  152. ////组织参数
  153. tmpBytes = []byte{byte(dataModel.DaSwitch)}
  154. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_CONFIG_DAC_SWITCH), tmpBytes, &dataList)
  155. tmpBytes = []byte{byte(dataModel.DaGain)}
  156. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_CONFIG_DAC_GAIN), tmpBytes, &dataList)
  157. tmpBytes = []byte{byte(dataModel.PaSwitch)}
  158. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_CONFIG_PA_SWITCH), tmpBytes, &dataList)
  159. tmpBytes = []byte{byte(dataModel.PaGain)}
  160. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_CONFIG_PA_GAIN), tmpBytes, &dataList)
  161. //发送数据给基站
  162. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_CONFIGURE, dataList.Bytes()); err != nil {
  163. return err
  164. }
  165. return nil
  166. }
  167. // 查询安装参数
  168. // dataModel:基站参数
  169. func (obj *BparamOam) OamQueryInstallParam(dataModel *bparammodel.BtsDeviceParam) error {
  170. var dataList bytes.Buffer
  171. ////组织查询参数
  172. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_INSTALL_BUILD_ID), &dataList) //
  173. obj.OamOrganizeQueryLtvA(6, uint16(oam.ORDER_INSTALL_LAYER_ID), &dataList) //
  174. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_INSTALL_LAYER_BLOCK_ID), &dataList) //
  175. obj.OamOrganizeQueryLtvA(36, uint16(oam.ORDER_INSTALL_LAYER_BLOCK_DESC), &dataList) //
  176. obj.OamOrganizeQueryLtvA(36, uint16(oam.ORDER_INSTALL_LAYER_POSITION), &dataList) //
  177. obj.OamOrganizeQueryLtvA(8, uint16(oam.ORDER_INSTALL_LAYER_COORD_X), &dataList) //
  178. obj.OamOrganizeQueryLtvA(8, uint16(oam.ORDER_INSTALL_LAYER_COORD_Y), &dataList) //
  179. obj.OamOrganizeQueryLtvA(8, uint16(oam.ORDER_INSTALL_LAYER_COORD_Z), &dataList) //
  180. //发送数据给基站
  181. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_QUERY, dataList.Bytes()); err != nil {
  182. return err
  183. }
  184. return nil
  185. }
  186. // 设置安装参数
  187. // dataModel:基站参数
  188. func (obj *BparamOam) OamSetInstallParam(dataModel *bparammodel.BtsBaseParam) error {
  189. var dataList bytes.Buffer
  190. tmpBytes := make([]byte, 32)
  191. ////组织参数
  192. tmpBytes = []byte{byte(dataModel.BuildID)}
  193. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_INSTALL_BUILD_ID), tmpBytes, &dataList)
  194. layerBytes := make([]byte, 2)
  195. binary.LittleEndian.PutUint16(layerBytes, uint16(dataModel.LayerID))
  196. obj.OamOrganizeSetLtvA(6, uint16(oam.ORDER_INSTALL_LAYER_ID), layerBytes, &dataList)
  197. tmpBytes = []byte{byte(dataModel.BlockID)}
  198. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_INSTALL_LAYER_BLOCK_ID), tmpBytes, &dataList)
  199. tmpBytes = []byte(dataModel.BlockDesc) //UTF-8编码
  200. blockDesc, _ := util.CharTransUtf8ToGb(tmpBytes)
  201. obj.OamOrganizeSetLtvA(36, uint16(oam.ORDER_INSTALL_LAYER_BLOCK_DESC), blockDesc, &dataList)
  202. tmpBytes = []byte(dataModel.Position)
  203. position, _ := util.CharTransUtf8ToGb(tmpBytes)
  204. obj.OamOrganizeSetLtvA(36, uint16(oam.ORDER_INSTALL_LAYER_POSITION), position, &dataList)
  205. binary.LittleEndian.PutUint32(tmpBytes, uint32(dataModel.CoordX))
  206. obj.OamOrganizeSetLtvA(8, uint16(oam.ORDER_INSTALL_LAYER_COORD_X), tmpBytes, &dataList)
  207. binary.LittleEndian.PutUint32(tmpBytes, uint32(dataModel.CoordY))
  208. obj.OamOrganizeSetLtvA(8, uint16(oam.ORDER_INSTALL_LAYER_COORD_Y), tmpBytes, &dataList)
  209. binary.LittleEndian.PutUint32(tmpBytes, uint32(dataModel.CoordZ))
  210. obj.OamOrganizeSetLtvA(8, uint16(oam.ORDER_INSTALL_LAYER_COORD_Z), tmpBytes, &dataList)
  211. //发送数据给基站
  212. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_CONFIGURE, dataList.Bytes()); err != nil {
  213. return err
  214. }
  215. return nil
  216. }
  217. // 查询基站参数
  218. // dataModel:基站参数
  219. func (obj *BparamOam) OamQueryBtsParam(dataModel *bparammodel.BtsDeviceParam) error {
  220. var dataList bytes.Buffer
  221. ////组织查询参数
  222. obj.OamOrganizeQueryLtvA(8, uint16(oam.ORDER_BTS_ID), &dataList) //基站ID
  223. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_BTS_CARRIER_ID), &dataList) //载波ID
  224. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_BTS_TIMESLOT), &dataList) //时隙ID
  225. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_BTS_LOCATION_TYPE), &dataList) //定位类型
  226. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_BTS_TWO_BTS_NUM), &dataList) //两站定位基站数量
  227. obj.OamOrganizeQueryLtvA(52, uint16(oam.ORDER_BTS_TWO_BTS_LIST), &dataList) //两站定位基站列表
  228. //发送数据给基站
  229. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_QUERY, dataList.Bytes()); err != nil {
  230. return err
  231. }
  232. return nil
  233. }
  234. // 设置基站参数
  235. // dataModel:基站参数
  236. func (obj *BparamOam) OamSetBtsParam(dataModel *bparammodel.BtsBaseParam) error {
  237. var dataList bytes.Buffer
  238. tmpBytes := make([]byte, 32)
  239. ////组织参数
  240. binary.LittleEndian.PutUint32(tmpBytes, uint32(dataModel.BtsID))
  241. obj.OamOrganizeSetLtvA(8, uint16(oam.ORDER_BTS_ID), tmpBytes, &dataList)
  242. tmpBytes = []byte{byte(dataModel.CarrierID)}
  243. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_BTS_CARRIER_ID), tmpBytes, &dataList)
  244. tmpBytes = []byte{byte(dataModel.Timeslot)}
  245. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_BTS_TIMESLOT), tmpBytes, &dataList)
  246. tmpBytes = []byte{byte(dataModel.LocationType)} //定位类型
  247. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_BTS_LOCATION_TYPE), tmpBytes, &dataList)
  248. tmpBytes = []byte{byte(dataModel.TwoBtsNum)} //两站数量
  249. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_BTS_TWO_BTS_NUM), tmpBytes, &dataList)
  250. tmpBytes = []byte(dataModel.TwoBtsList) //两站列表
  251. obj.OamOrganizeSetLtvA(52, uint16(oam.ORDER_BTS_TWO_BTS_LIST), tmpBytes, &dataList)
  252. //发送数据给基站
  253. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_CONFIGURE, dataList.Bytes()); err != nil {
  254. return err
  255. }
  256. return nil
  257. }
  258. // 查询定位类型参数
  259. // dataModel:基站参数
  260. func (obj *BparamOam) OamQueryLocationTypeParam(dataModel *bparammodel.BtsDeviceParam) error {
  261. var dataList bytes.Buffer
  262. ////组织查询参数
  263. //定位类型
  264. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_BTS_LOCATION_TYPE), &dataList)
  265. //一维定位基站数量
  266. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_BTS_TWO_BTS_NUM), &dataList)
  267. //一维定位基站列表
  268. obj.OamOrganizeQueryLtvA(52, uint16(oam.ORDER_BTS_TWO_BTS_LIST), &dataList)
  269. //发送数据给基站
  270. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_QUERY, dataList.Bytes()); err != nil {
  271. return err
  272. }
  273. return nil
  274. }
  275. // 设置定位类型参数
  276. // dataModel:基站参数
  277. func (obj *BparamOam) OamSetLocationTypeParam(dataModel *bparammodel.BtsBaseParam) error {
  278. var dataList bytes.Buffer
  279. tmpBytes := make([]byte, 48)
  280. ////组织参数
  281. //定位类型
  282. tmpBytes = []byte{byte(dataModel.LocationType)}
  283. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_BTS_LOCATION_TYPE), tmpBytes, &dataList)
  284. //一维基站数量
  285. tmpBytes = []byte{byte(dataModel.TwoBtsNum)}
  286. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_BTS_TWO_BTS_NUM), tmpBytes, &dataList)
  287. //一维基站列表
  288. tmpBytes = []byte(dataModel.TwoBtsList)
  289. obj.OamOrganizeSetLtvA(52, uint16(oam.ORDER_BTS_TWO_BTS_LIST), tmpBytes, &dataList)
  290. //发送数据给基站
  291. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_CONFIGURE, dataList.Bytes()); err != nil {
  292. return err
  293. }
  294. return nil
  295. }
  296. // 查询RTC参数
  297. // dataModel:基站参数
  298. func (obj *BparamOam) OamQueryRtcParam(dataModel *bparammodel.BtsBaseParam) error {
  299. var dataList bytes.Buffer
  300. ////rtc当前时间
  301. obj.OamOrganizeQueryLtvA(10, uint16(oam.ORDER_SYNC_TIMER_CURRENT_TIME), &dataList)
  302. //同步定时开关
  303. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_SYNC_TIMER_SWITCH), &dataList)
  304. //同步定时数量
  305. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_SYNC_TIMER_NUM), &dataList)
  306. //同步定时1开始时间
  307. obj.OamOrganizeQueryLtvA(6, uint16(oam.ORDER_SYNC_TIMER1_START), &dataList)
  308. //同步定时1结束时间
  309. obj.OamOrganizeQueryLtvA(6, uint16(oam.ORDER_SYNC_TIMER1_STOP), &dataList)
  310. //同步定时2开始时间
  311. obj.OamOrganizeQueryLtvA(6, uint16(oam.ORDER_SYNC_TIMER2_START), &dataList)
  312. //同步定时2结束时间
  313. obj.OamOrganizeQueryLtvA(6, uint16(oam.ORDER_SYNC_TIMER2_STOP), &dataList)
  314. //发送数据给基站
  315. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_QUERY, dataList.Bytes()); err != nil {
  316. return err
  317. }
  318. return nil
  319. }
  320. // 设置RTC参数
  321. // dataModel:基站参数
  322. func (obj *BparamOam) OamSetRtcParam(dataModel *bparammodel.BtsBaseParam) error {
  323. var dataList bytes.Buffer
  324. tmpBytes := make([]byte, 32)
  325. var rtcTime uint16 = 0
  326. ////组织参数
  327. //RTC初始时间
  328. dataTmp := obj.OrganizeDateTime(dataModel.RtcDateTime)
  329. obj.OamOrganizeSetLtvA(10, uint16(oam.ORDER_SYNC_TIMER_CURRENT_TIME), dataTmp, &dataList)
  330. //同步定时开关
  331. tmpBytes = []byte{byte(dataModel.SyncTimerSwitch)}
  332. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_SYNC_TIMER_SWITCH), tmpBytes, &dataList)
  333. //同步定时数量
  334. tmpBytes = []byte{byte(dataModel.SyncTimerNum)}
  335. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_SYNC_TIMER_NUM), tmpBytes, &dataList)
  336. //同步定时1开始时间
  337. rtcTime = obj.OrganizeTime((dataModel.SyncTimer1Start))
  338. start1Bytes := make([]byte, 2)
  339. binary.LittleEndian.PutUint16(start1Bytes, rtcTime)
  340. obj.OamOrganizeSetLtvA(6, uint16(oam.ORDER_SYNC_TIMER1_START), start1Bytes, &dataList)
  341. //同步定时1结束时间
  342. rtcTime = obj.OrganizeTime((dataModel.SyncTimer1Stop))
  343. stop1Bytes := make([]byte, 2)
  344. binary.LittleEndian.PutUint16(stop1Bytes, rtcTime)
  345. obj.OamOrganizeSetLtvA(6, uint16(oam.ORDER_SYNC_TIMER1_STOP), stop1Bytes, &dataList)
  346. //同步定时2开始时间
  347. rtcTime = obj.OrganizeTime((dataModel.SyncTimer2Start))
  348. start2Bytes := make([]byte, 2)
  349. binary.LittleEndian.PutUint16(start2Bytes, rtcTime)
  350. obj.OamOrganizeSetLtvA(6, uint16(oam.ORDER_SYNC_TIMER2_START), start2Bytes, &dataList)
  351. //同步定时2结束时间
  352. rtcTime = obj.OrganizeTime((dataModel.SyncTimer2Stop))
  353. stop2Bytes := make([]byte, 2)
  354. binary.LittleEndian.PutUint16(stop2Bytes, rtcTime)
  355. obj.OamOrganizeSetLtvA(6, uint16(oam.ORDER_SYNC_TIMER2_STOP), stop2Bytes, &dataList)
  356. //发送数据给基站
  357. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_CONFIGURE, dataList.Bytes()); err != nil {
  358. return err
  359. }
  360. return nil
  361. }
  362. func (obj *BparamOam) OrganizeDateTime(rtcDateTime string) []uint8 {
  363. dateTimeList := make([]uint8, 6)
  364. strTmp := ""
  365. //年
  366. strTmp = rtcDateTime[0:4]
  367. year, _ := strconv.Atoi(strTmp)
  368. year -= 2000
  369. dateTimeList[5] = uint8(year)
  370. //月
  371. strTmp = rtcDateTime[5:7]
  372. month, _ := strconv.Atoi(strTmp)
  373. dateTimeList[4] = uint8(month)
  374. //日
  375. strTmp = rtcDateTime[8:10]
  376. day, _ := strconv.Atoi(strTmp)
  377. dateTimeList[3] = uint8(day)
  378. //小时
  379. strTmp = rtcDateTime[11:13]
  380. hour, _ := strconv.Atoi(strTmp)
  381. dateTimeList[2] = uint8(hour)
  382. //分钟
  383. strTmp = rtcDateTime[14:16]
  384. minute, _ := strconv.Atoi(strTmp)
  385. dateTimeList[1] = uint8(minute)
  386. //秒
  387. strTmp = rtcDateTime[17:19]
  388. second, _ := strconv.Atoi(strTmp)
  389. dateTimeList[0] = uint8(second)
  390. return dateTimeList
  391. }
  392. // 组织时间
  393. func (obj *BparamOam) OrganizeTime(rtcTime string) uint16 {
  394. strTmp := ""
  395. hourMinute := 0
  396. //小时
  397. strTmp = rtcTime[0:2]
  398. hour, _ := strconv.Atoi(strTmp)
  399. hour <<= 8
  400. //分钟
  401. strTmp = rtcTime[3:5]
  402. minute, _ := strconv.Atoi(strTmp)
  403. hourMinute = (hour | minute)
  404. return uint16(hourMinute)
  405. }
  406. // 保存参数
  407. // dataModel:基站参数
  408. func (obj *BparamOam) OamSaveParam(dataModel *bparammodel.BtsBaseParam) error {
  409. var dataList bytes.Buffer
  410. ////组织参数
  411. tmpBytes := []byte{dataModel.SaveParam}
  412. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_CONFIG_SAVE), tmpBytes, &dataList)
  413. //发送数据给基站
  414. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_CONFIGURE, dataList.Bytes()); err != nil {
  415. return err
  416. }
  417. return nil
  418. }
  419. // 设备复位
  420. // dataModel:基站参数
  421. func (obj *BparamOam) OamResetBts(dataModel *bparammodel.BtsBaseParam) error {
  422. var dataList bytes.Buffer
  423. ////组织参数
  424. tmpBytes := []byte{byte(dataModel.ResetBts)}
  425. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_CONFIG_RESET), tmpBytes, &dataList)
  426. //发送数据给基站
  427. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_CONFIGURE, dataList.Bytes()); err != nil {
  428. return err
  429. }
  430. return nil
  431. }