bparamoam.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547
  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. //发送数据给基站
  226. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_QUERY, dataList.Bytes()); err != nil {
  227. return err
  228. }
  229. return nil
  230. }
  231. // 设置基站参数
  232. // dataModel:基站参数
  233. func (obj *BparamOam) OamSetBtsParam(dataModel *bparammodel.BtsBaseParam) error {
  234. var dataList bytes.Buffer
  235. tmpBytes := make([]byte, 32)
  236. ////组织参数
  237. binary.LittleEndian.PutUint32(tmpBytes, uint32(dataModel.BtsID))
  238. obj.OamOrganizeSetLtvA(8, uint16(oam.ORDER_BTS_ID), tmpBytes, &dataList)
  239. tmpBytes = []byte{byte(dataModel.CarrierID)}
  240. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_BTS_CARRIER_ID), tmpBytes, &dataList)
  241. tmpBytes = []byte{byte(dataModel.Timeslot)}
  242. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_BTS_TIMESLOT), tmpBytes, &dataList)
  243. //发送数据给基站
  244. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_CONFIGURE, dataList.Bytes()); err != nil {
  245. return err
  246. }
  247. return nil
  248. }
  249. // 查询定位类型参数
  250. // dataModel:基站参数
  251. func (obj *BparamOam) OamQueryLocationTypeParam(dataModel *bparammodel.BtsDeviceParam) error {
  252. var dataList bytes.Buffer
  253. ////组织查询参数
  254. //定位类型
  255. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_BTS_LOCATION_TYPE), &dataList)
  256. //一维定位基站数量
  257. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_BTS_TWO_BTS_NUM), &dataList)
  258. //一维定位基站列表
  259. obj.OamOrganizeQueryLtvA(52, uint16(oam.ORDER_BTS_TWO_BTS_LIST), &dataList)
  260. //发送数据给基站
  261. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_QUERY, dataList.Bytes()); err != nil {
  262. return err
  263. }
  264. return nil
  265. }
  266. // 设置定位类型参数
  267. // dataModel:基站参数
  268. func (obj *BparamOam) OamSetLocationTypeParam(dataModel *bparammodel.BtsBaseParam) error {
  269. var dataList bytes.Buffer
  270. tmpBytes := make([]byte, 48)
  271. ////组织参数
  272. //定位类型
  273. tmpBytes = []byte{byte(dataModel.LocationType)}
  274. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_BTS_LOCATION_TYPE), tmpBytes, &dataList)
  275. //一维基站数量
  276. tmpBytes = []byte{byte(dataModel.TwoBtsNum)}
  277. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_BTS_TWO_BTS_NUM), tmpBytes, &dataList)
  278. //一维基站列表
  279. tmpBytes = []byte(dataModel.TwoBtsList)
  280. obj.OamOrganizeSetLtvA(52, uint16(oam.ORDER_BTS_TWO_BTS_LIST), tmpBytes, &dataList)
  281. //发送数据给基站
  282. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_CONFIGURE, dataList.Bytes()); err != nil {
  283. return err
  284. }
  285. return nil
  286. }
  287. // 查询RTC参数
  288. // dataModel:基站参数
  289. func (obj *BparamOam) OamQueryRtcParam(dataModel *bparammodel.BtsBaseParam) error {
  290. var dataList bytes.Buffer
  291. ////rtc当前时间
  292. obj.OamOrganizeQueryLtvA(10, uint16(oam.ORDER_SYNC_TIMER_CURRENT_TIME), &dataList)
  293. //同步定时开关
  294. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_SYNC_TIMER_SWITCH), &dataList)
  295. //同步定时数量
  296. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_SYNC_TIMER_NUM), &dataList)
  297. //同步定时1开始时间
  298. obj.OamOrganizeQueryLtvA(6, uint16(oam.ORDER_SYNC_TIMER1_START), &dataList)
  299. //同步定时1结束时间
  300. obj.OamOrganizeQueryLtvA(6, uint16(oam.ORDER_SYNC_TIMER1_STOP), &dataList)
  301. //同步定时2开始时间
  302. obj.OamOrganizeQueryLtvA(6, uint16(oam.ORDER_SYNC_TIMER2_START), &dataList)
  303. //同步定时2结束时间
  304. obj.OamOrganizeQueryLtvA(6, uint16(oam.ORDER_SYNC_TIMER2_STOP), &dataList)
  305. //发送数据给基站
  306. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_QUERY, dataList.Bytes()); err != nil {
  307. return err
  308. }
  309. return nil
  310. }
  311. // 设置RTC参数
  312. // dataModel:基站参数
  313. func (obj *BparamOam) OamSetRtcParam(dataModel *bparammodel.BtsBaseParam) error {
  314. var dataList bytes.Buffer
  315. tmpBytes := make([]byte, 32)
  316. var rtcTime uint16 = 0
  317. ////组织参数
  318. //RTC初始时间
  319. dataTmp := obj.OrganizeDateTime(dataModel.RtcDateTime)
  320. obj.OamOrganizeSetLtvA(10, uint16(oam.ORDER_SYNC_TIMER_CURRENT_TIME), dataTmp, &dataList)
  321. //同步定时开关
  322. tmpBytes = []byte{byte(dataModel.SyncTimerSwitch)}
  323. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_SYNC_TIMER_SWITCH), tmpBytes, &dataList)
  324. //同步定时数量
  325. tmpBytes = []byte{byte(dataModel.SyncTimerNum)}
  326. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_SYNC_TIMER_NUM), tmpBytes, &dataList)
  327. //同步定时1开始时间
  328. rtcTime = obj.OrganizeTime((dataModel.SyncTimer1Start))
  329. start1Bytes := make([]byte, 2)
  330. binary.LittleEndian.PutUint16(start1Bytes, rtcTime)
  331. obj.OamOrganizeSetLtvA(6, uint16(oam.ORDER_SYNC_TIMER1_START), start1Bytes, &dataList)
  332. //同步定时1结束时间
  333. rtcTime = obj.OrganizeTime((dataModel.SyncTimer1Stop))
  334. stop1Bytes := make([]byte, 2)
  335. binary.LittleEndian.PutUint16(stop1Bytes, rtcTime)
  336. obj.OamOrganizeSetLtvA(6, uint16(oam.ORDER_SYNC_TIMER1_STOP), stop1Bytes, &dataList)
  337. //同步定时2开始时间
  338. rtcTime = obj.OrganizeTime((dataModel.SyncTimer2Start))
  339. start2Bytes := make([]byte, 2)
  340. binary.LittleEndian.PutUint16(start2Bytes, rtcTime)
  341. obj.OamOrganizeSetLtvA(6, uint16(oam.ORDER_SYNC_TIMER2_START), start2Bytes, &dataList)
  342. //同步定时2结束时间
  343. rtcTime = obj.OrganizeTime((dataModel.SyncTimer2Stop))
  344. stop2Bytes := make([]byte, 2)
  345. binary.LittleEndian.PutUint16(stop2Bytes, rtcTime)
  346. obj.OamOrganizeSetLtvA(6, uint16(oam.ORDER_SYNC_TIMER2_STOP), stop2Bytes, &dataList)
  347. //发送数据给基站
  348. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_CONFIGURE, dataList.Bytes()); err != nil {
  349. return err
  350. }
  351. return nil
  352. }
  353. func (obj *BparamOam) OrganizeDateTime(rtcDateTime string) []uint8 {
  354. dateTimeList := make([]uint8, 6)
  355. strTmp := ""
  356. //年
  357. strTmp = rtcDateTime[0:4]
  358. year, _ := strconv.Atoi(strTmp)
  359. year -= 2000
  360. dateTimeList[5] = uint8(year)
  361. //月
  362. strTmp = rtcDateTime[5:7]
  363. month, _ := strconv.Atoi(strTmp)
  364. dateTimeList[4] = uint8(month)
  365. //日
  366. strTmp = rtcDateTime[8:10]
  367. day, _ := strconv.Atoi(strTmp)
  368. dateTimeList[3] = uint8(day)
  369. //小时
  370. strTmp = rtcDateTime[11:13]
  371. hour, _ := strconv.Atoi(strTmp)
  372. dateTimeList[2] = uint8(hour)
  373. //分钟
  374. strTmp = rtcDateTime[14:16]
  375. minute, _ := strconv.Atoi(strTmp)
  376. dateTimeList[1] = uint8(minute)
  377. //秒
  378. strTmp = rtcDateTime[17:19]
  379. second, _ := strconv.Atoi(strTmp)
  380. dateTimeList[0] = uint8(second)
  381. return dateTimeList
  382. }
  383. // 组织时间
  384. func (obj *BparamOam) OrganizeTime(rtcTime string) uint16 {
  385. strTmp := ""
  386. hourMinute := 0
  387. //小时
  388. strTmp = rtcTime[0:2]
  389. hour, _ := strconv.Atoi(strTmp)
  390. hour <<= 8
  391. //分钟
  392. strTmp = rtcTime[3:5]
  393. minute, _ := strconv.Atoi(strTmp)
  394. hourMinute = (hour | minute)
  395. return uint16(hourMinute)
  396. }
  397. // 保存参数
  398. // dataModel:基站参数
  399. func (obj *BparamOam) OamSaveParam(dataModel *bparammodel.BtsBaseParam) error {
  400. var dataList bytes.Buffer
  401. ////组织参数
  402. tmpBytes := []byte{dataModel.SaveParam}
  403. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_CONFIG_SAVE), tmpBytes, &dataList)
  404. //发送数据给基站
  405. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_CONFIGURE, dataList.Bytes()); err != nil {
  406. return err
  407. }
  408. return nil
  409. }
  410. // 设备复位
  411. // dataModel:基站参数
  412. func (obj *BparamOam) OamResetBts(dataModel *bparammodel.BtsBaseParam) error {
  413. var dataList bytes.Buffer
  414. ////组织参数
  415. tmpBytes := []byte{byte(dataModel.ResetBts)}
  416. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_CONFIG_RESET), tmpBytes, &dataList)
  417. //发送数据给基站
  418. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_CONFIGURE, dataList.Bytes()); err != nil {
  419. return err
  420. }
  421. return nil
  422. }