bparamoam.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583
  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_RX_SYNC_WORD), &dataList) //接收同步字
  109. obj.OamOrganizeQueryLtvA(6, uint16(oam.ORDER_SYNC_RSSI), &dataList) //接收电平
  110. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_SYNC_TX_FLAG), &dataList) //转发开关
  111. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_SYNC_TX_CENTER_FREQ), &dataList) //转发频率
  112. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_SYNC_TX_SYNC_WORD), &dataList) //转发同步字
  113. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_SYNC_TX_POWER), &dataList) //发射功率
  114. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_SYNC_BD_GPS_ENABLE), &dataList) //北斗开关
  115. //发送数据给基站
  116. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_QUERY, dataList.Bytes()); err != nil {
  117. return err
  118. }
  119. return nil
  120. }
  121. // 设置基站同步参数
  122. // dataModel:基站参数
  123. func (obj *BparamOam) OamSetSyncParam(dataModel *bparammodel.BtsBaseParam) error {
  124. var dataList bytes.Buffer
  125. tmpBytes := make([]byte, 1)
  126. ////组织参数
  127. tmpBytes = []byte{byte(dataModel.CenterFreq)}
  128. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_SYNC_CENTER_FREQ), tmpBytes, &dataList) //中心频率(声波基站和同步基站)
  129. tmpBytes = []byte{byte(dataModel.RxSyncWordId)}
  130. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_SYNC_RX_SYNC_WORD), tmpBytes, &dataList) //接收同步字
  131. tmpBytes = []byte{byte(dataModel.TxSwitch)}
  132. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_SYNC_TX_FLAG), tmpBytes, &dataList) //转发开关
  133. tmpBytes = []byte{byte(dataModel.TxCenterFreq)}
  134. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_SYNC_TX_CENTER_FREQ), tmpBytes, &dataList) //转发频率
  135. tmpBytes = []byte{byte(dataModel.TxSyncWordId)}
  136. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_SYNC_TX_SYNC_WORD), tmpBytes, &dataList) //转发同步字
  137. tmpBytes = []byte{byte(dataModel.TxPower)}
  138. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_SYNC_TX_POWER), tmpBytes, &dataList) //发射功率(声波基站和同步基站)
  139. tmpBytes = []byte{byte(dataModel.BdGpsEnable)}
  140. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_SYNC_BD_GPS_ENABLE), tmpBytes, &dataList) //北斗GPS使能开关
  141. //发送数据给基站
  142. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_CONFIGURE, dataList.Bytes()); err != nil {
  143. return err
  144. }
  145. return nil
  146. }
  147. // 查询基站增益参数
  148. // dataModel:基站参数
  149. func (obj *BparamOam) OamQueryGainParam(dataModel *bparammodel.BtsDeviceParam) error {
  150. var dataList bytes.Buffer
  151. ////组织查询参数
  152. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_CONFIG_DAC_SWITCH), &dataList) //中心频率
  153. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_CONFIG_DAC_GAIN), &dataList) //发射功率
  154. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_CONFIG_PA_SWITCH), &dataList) //中心频率
  155. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_CONFIG_PA_GAIN), &dataList) //发射功率
  156. //发送数据给基站
  157. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_QUERY, dataList.Bytes()); err != nil {
  158. return err
  159. }
  160. return nil
  161. }
  162. // 设置基站增益参数
  163. // dataModel:基站参数
  164. func (obj *BparamOam) OamSetGainParam(dataModel *bparammodel.BtsBaseParam) error {
  165. var dataList bytes.Buffer
  166. tmpBytes := make([]byte, 32)
  167. ////组织参数
  168. tmpBytes = []byte{byte(dataModel.DaSwitch)}
  169. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_CONFIG_DAC_SWITCH), tmpBytes, &dataList)
  170. tmpBytes = []byte{byte(dataModel.DaGain)}
  171. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_CONFIG_DAC_GAIN), tmpBytes, &dataList)
  172. tmpBytes = []byte{byte(dataModel.PaSwitch)}
  173. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_CONFIG_PA_SWITCH), tmpBytes, &dataList)
  174. tmpBytes = []byte{byte(dataModel.PaGain)}
  175. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_CONFIG_PA_GAIN), tmpBytes, &dataList)
  176. //发送数据给基站
  177. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_CONFIGURE, dataList.Bytes()); err != nil {
  178. return err
  179. }
  180. return nil
  181. }
  182. // 查询安装参数
  183. // dataModel:基站参数
  184. func (obj *BparamOam) OamQueryInstallParam(dataModel *bparammodel.BtsDeviceParam) error {
  185. var dataList bytes.Buffer
  186. ////组织查询参数
  187. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_INSTALL_BUILD_ID), &dataList) //
  188. obj.OamOrganizeQueryLtvA(6, uint16(oam.ORDER_INSTALL_LAYER_ID), &dataList) //
  189. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_INSTALL_LAYER_BLOCK_ID), &dataList) //
  190. obj.OamOrganizeQueryLtvA(36, uint16(oam.ORDER_INSTALL_LAYER_BLOCK_DESC), &dataList) //
  191. obj.OamOrganizeQueryLtvA(36, uint16(oam.ORDER_INSTALL_LAYER_POSITION), &dataList) //
  192. obj.OamOrganizeQueryLtvA(8, uint16(oam.ORDER_INSTALL_LAYER_COORD_X), &dataList) //
  193. obj.OamOrganizeQueryLtvA(8, uint16(oam.ORDER_INSTALL_LAYER_COORD_Y), &dataList) //
  194. obj.OamOrganizeQueryLtvA(8, uint16(oam.ORDER_INSTALL_LAYER_COORD_Z), &dataList) //
  195. //发送数据给基站
  196. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_QUERY, dataList.Bytes()); err != nil {
  197. return err
  198. }
  199. return nil
  200. }
  201. // 设置安装参数
  202. // dataModel:基站参数
  203. func (obj *BparamOam) OamSetInstallParam(dataModel *bparammodel.BtsBaseParam) error {
  204. var dataList bytes.Buffer
  205. tmpBytes := make([]byte, 32)
  206. ////组织参数
  207. tmpBytes = []byte{byte(dataModel.BuildID)}
  208. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_INSTALL_BUILD_ID), tmpBytes, &dataList)
  209. layerBytes := make([]byte, 2)
  210. binary.LittleEndian.PutUint16(layerBytes, uint16(dataModel.LayerID))
  211. obj.OamOrganizeSetLtvA(6, uint16(oam.ORDER_INSTALL_LAYER_ID), layerBytes, &dataList)
  212. tmpBytes = []byte{byte(dataModel.BlockID)}
  213. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_INSTALL_LAYER_BLOCK_ID), tmpBytes, &dataList)
  214. tmpBytes = []byte(dataModel.BlockDesc) //UTF-8编码
  215. blockDesc, _ := util.CharTransUtf8ToGb(tmpBytes)
  216. obj.OamOrganizeSetLtvA(36, uint16(oam.ORDER_INSTALL_LAYER_BLOCK_DESC), blockDesc, &dataList)
  217. tmpBytes = []byte(dataModel.Position)
  218. position, _ := util.CharTransUtf8ToGb(tmpBytes)
  219. obj.OamOrganizeSetLtvA(36, uint16(oam.ORDER_INSTALL_LAYER_POSITION), position, &dataList)
  220. binary.LittleEndian.PutUint32(tmpBytes, uint32(dataModel.CoordX))
  221. obj.OamOrganizeSetLtvA(8, uint16(oam.ORDER_INSTALL_LAYER_COORD_X), tmpBytes, &dataList)
  222. binary.LittleEndian.PutUint32(tmpBytes, uint32(dataModel.CoordY))
  223. obj.OamOrganizeSetLtvA(8, uint16(oam.ORDER_INSTALL_LAYER_COORD_Y), tmpBytes, &dataList)
  224. binary.LittleEndian.PutUint32(tmpBytes, uint32(dataModel.CoordZ))
  225. obj.OamOrganizeSetLtvA(8, uint16(oam.ORDER_INSTALL_LAYER_COORD_Z), tmpBytes, &dataList)
  226. //发送数据给基站
  227. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_CONFIGURE, dataList.Bytes()); err != nil {
  228. return err
  229. }
  230. return nil
  231. }
  232. // 查询基站参数
  233. // dataModel:基站参数
  234. func (obj *BparamOam) OamQueryBtsParam(dataModel *bparammodel.BtsDeviceParam) error {
  235. var dataList bytes.Buffer
  236. ////组织查询参数
  237. obj.OamOrganizeQueryLtvA(8, uint16(oam.ORDER_BTS_ID), &dataList) //基站ID
  238. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_BTS_CARRIER_ID), &dataList) //载波ID
  239. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_BTS_TIMESLOT), &dataList) //时隙ID
  240. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_BTS_LOCATION_TYPE), &dataList) //定位类型
  241. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_BTS_TWO_BTS_NUM), &dataList) //两站定位基站数量
  242. obj.OamOrganizeQueryLtvA(52, uint16(oam.ORDER_BTS_TWO_BTS_LIST), &dataList) //两站定位基站列表
  243. //发送数据给基站
  244. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_QUERY, dataList.Bytes()); err != nil {
  245. return err
  246. }
  247. return nil
  248. }
  249. // 设置基站参数
  250. // dataModel:基站参数
  251. func (obj *BparamOam) OamSetBtsParam(dataModel *bparammodel.BtsBaseParam) error {
  252. var dataList bytes.Buffer
  253. tmpBytes := make([]byte, 32)
  254. ////组织参数
  255. binary.LittleEndian.PutUint32(tmpBytes, uint32(dataModel.BtsID))
  256. obj.OamOrganizeSetLtvA(8, uint16(oam.ORDER_BTS_ID), tmpBytes, &dataList)
  257. tmpBytes = []byte{byte(dataModel.CarrierID)}
  258. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_BTS_CARRIER_ID), tmpBytes, &dataList)
  259. tmpBytes = []byte{byte(dataModel.Timeslot)}
  260. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_BTS_TIMESLOT), tmpBytes, &dataList)
  261. tmpBytes = []byte{byte(dataModel.LocationType)} //定位类型
  262. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_BTS_LOCATION_TYPE), tmpBytes, &dataList)
  263. tmpBytes = []byte{byte(dataModel.TwoBtsNum)} //两站数量
  264. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_BTS_TWO_BTS_NUM), tmpBytes, &dataList)
  265. tmpBytes = []byte(dataModel.TwoBtsList) //两站列表
  266. obj.OamOrganizeSetLtvA(52, uint16(oam.ORDER_BTS_TWO_BTS_LIST), tmpBytes, &dataList)
  267. //发送数据给基站
  268. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_CONFIGURE, dataList.Bytes()); err != nil {
  269. return err
  270. }
  271. return nil
  272. }
  273. // 查询定位类型参数
  274. // dataModel:基站参数
  275. func (obj *BparamOam) OamQueryLocationTypeParam(dataModel *bparammodel.BtsDeviceParam) error {
  276. var dataList bytes.Buffer
  277. ////组织查询参数
  278. //定位类型
  279. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_BTS_LOCATION_TYPE), &dataList)
  280. //一维定位基站数量
  281. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_BTS_TWO_BTS_NUM), &dataList)
  282. //一维定位基站列表
  283. obj.OamOrganizeQueryLtvA(52, uint16(oam.ORDER_BTS_TWO_BTS_LIST), &dataList)
  284. //发送数据给基站
  285. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_QUERY, dataList.Bytes()); err != nil {
  286. return err
  287. }
  288. return nil
  289. }
  290. // 设置定位类型参数
  291. // dataModel:基站参数
  292. func (obj *BparamOam) OamSetLocationTypeParam(dataModel *bparammodel.BtsBaseParam) error {
  293. var dataList bytes.Buffer
  294. tmpBytes := make([]byte, 48)
  295. ////组织参数
  296. //定位类型
  297. tmpBytes = []byte{byte(dataModel.LocationType)}
  298. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_BTS_LOCATION_TYPE), tmpBytes, &dataList)
  299. //一维基站数量
  300. tmpBytes = []byte{byte(dataModel.TwoBtsNum)}
  301. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_BTS_TWO_BTS_NUM), tmpBytes, &dataList)
  302. //一维基站列表
  303. tmpBytes = []byte(dataModel.TwoBtsList)
  304. obj.OamOrganizeSetLtvA(52, uint16(oam.ORDER_BTS_TWO_BTS_LIST), tmpBytes, &dataList)
  305. //发送数据给基站
  306. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_CONFIGURE, dataList.Bytes()); err != nil {
  307. return err
  308. }
  309. return nil
  310. }
  311. // 查询RTC参数
  312. // dataModel:基站参数
  313. func (obj *BparamOam) OamQueryRtcParam(dataModel *bparammodel.BtsBaseParam) error {
  314. var dataList bytes.Buffer
  315. ////rtc当前时间
  316. obj.OamOrganizeQueryLtvA(10, uint16(oam.ORDER_SYNC_TIMER_CURRENT_TIME), &dataList)
  317. //同步定时开关
  318. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_SYNC_TIMER_SWITCH), &dataList)
  319. //同步定时数量
  320. obj.OamOrganizeQueryLtvA(5, uint16(oam.ORDER_SYNC_TIMER_NUM), &dataList)
  321. //同步定时1开始时间
  322. obj.OamOrganizeQueryLtvA(6, uint16(oam.ORDER_SYNC_TIMER1_START), &dataList)
  323. //同步定时1结束时间
  324. obj.OamOrganizeQueryLtvA(6, uint16(oam.ORDER_SYNC_TIMER1_STOP), &dataList)
  325. //同步定时2开始时间
  326. obj.OamOrganizeQueryLtvA(6, uint16(oam.ORDER_SYNC_TIMER2_START), &dataList)
  327. //同步定时2结束时间
  328. obj.OamOrganizeQueryLtvA(6, uint16(oam.ORDER_SYNC_TIMER2_STOP), &dataList)
  329. //发送数据给基站
  330. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_QUERY, dataList.Bytes()); err != nil {
  331. return err
  332. }
  333. return nil
  334. }
  335. // 设置RTC参数
  336. // dataModel:基站参数
  337. func (obj *BparamOam) OamSetRtcParam(dataModel *bparammodel.BtsBaseParam) error {
  338. var dataList bytes.Buffer
  339. tmpBytes := make([]byte, 32)
  340. var rtcTime uint16 = 0
  341. ////组织参数
  342. //RTC初始时间
  343. dataTmp := obj.OrganizeDateTime(dataModel.RtcDateTime)
  344. obj.OamOrganizeSetLtvA(10, uint16(oam.ORDER_SYNC_TIMER_CURRENT_TIME), dataTmp, &dataList)
  345. //同步定时开关
  346. tmpBytes = []byte{byte(dataModel.SyncTimerSwitch)}
  347. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_SYNC_TIMER_SWITCH), tmpBytes, &dataList)
  348. //同步定时数量
  349. tmpBytes = []byte{byte(dataModel.SyncTimerNum)}
  350. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_SYNC_TIMER_NUM), tmpBytes, &dataList)
  351. //同步定时1开始时间
  352. rtcTime = obj.OrganizeTime((dataModel.SyncTimer1Start))
  353. start1Bytes := make([]byte, 2)
  354. binary.LittleEndian.PutUint16(start1Bytes, rtcTime)
  355. obj.OamOrganizeSetLtvA(6, uint16(oam.ORDER_SYNC_TIMER1_START), start1Bytes, &dataList)
  356. //同步定时1结束时间
  357. rtcTime = obj.OrganizeTime((dataModel.SyncTimer1Stop))
  358. stop1Bytes := make([]byte, 2)
  359. binary.LittleEndian.PutUint16(stop1Bytes, rtcTime)
  360. obj.OamOrganizeSetLtvA(6, uint16(oam.ORDER_SYNC_TIMER1_STOP), stop1Bytes, &dataList)
  361. //同步定时2开始时间
  362. rtcTime = obj.OrganizeTime((dataModel.SyncTimer2Start))
  363. start2Bytes := make([]byte, 2)
  364. binary.LittleEndian.PutUint16(start2Bytes, rtcTime)
  365. obj.OamOrganizeSetLtvA(6, uint16(oam.ORDER_SYNC_TIMER2_START), start2Bytes, &dataList)
  366. //同步定时2结束时间
  367. rtcTime = obj.OrganizeTime((dataModel.SyncTimer2Stop))
  368. stop2Bytes := make([]byte, 2)
  369. binary.LittleEndian.PutUint16(stop2Bytes, rtcTime)
  370. obj.OamOrganizeSetLtvA(6, uint16(oam.ORDER_SYNC_TIMER2_STOP), stop2Bytes, &dataList)
  371. //发送数据给基站
  372. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_CONFIGURE, dataList.Bytes()); err != nil {
  373. return err
  374. }
  375. return nil
  376. }
  377. func (obj *BparamOam) OrganizeDateTime(rtcDateTime string) []uint8 {
  378. dateTimeList := make([]uint8, 6)
  379. strTmp := ""
  380. //年
  381. strTmp = rtcDateTime[0:4]
  382. year, _ := strconv.Atoi(strTmp)
  383. year -= 2000
  384. dateTimeList[5] = uint8(year)
  385. //月
  386. strTmp = rtcDateTime[5:7]
  387. month, _ := strconv.Atoi(strTmp)
  388. dateTimeList[4] = uint8(month)
  389. //日
  390. strTmp = rtcDateTime[8:10]
  391. day, _ := strconv.Atoi(strTmp)
  392. dateTimeList[3] = uint8(day)
  393. //小时
  394. strTmp = rtcDateTime[11:13]
  395. hour, _ := strconv.Atoi(strTmp)
  396. dateTimeList[2] = uint8(hour)
  397. //分钟
  398. strTmp = rtcDateTime[14:16]
  399. minute, _ := strconv.Atoi(strTmp)
  400. dateTimeList[1] = uint8(minute)
  401. //秒
  402. strTmp = rtcDateTime[17:19]
  403. second, _ := strconv.Atoi(strTmp)
  404. dateTimeList[0] = uint8(second)
  405. return dateTimeList
  406. }
  407. // 组织时间
  408. func (obj *BparamOam) OrganizeTime(rtcTime string) uint16 {
  409. strTmp := ""
  410. hourMinute := 0
  411. //小时
  412. strTmp = rtcTime[0:2]
  413. hour, _ := strconv.Atoi(strTmp)
  414. hour <<= 8
  415. //分钟
  416. strTmp = rtcTime[3:5]
  417. minute, _ := strconv.Atoi(strTmp)
  418. hourMinute = (hour | minute)
  419. return uint16(hourMinute)
  420. }
  421. // 保存参数
  422. // dataModel:基站参数
  423. func (obj *BparamOam) OamSaveParam(dataModel *bparammodel.BtsBaseParam) error {
  424. var dataList bytes.Buffer
  425. ////组织参数
  426. tmpBytes := []byte{dataModel.SaveParam}
  427. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_CONFIG_SAVE), tmpBytes, &dataList)
  428. //发送数据给基站
  429. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_CONFIGURE, dataList.Bytes()); err != nil {
  430. return err
  431. }
  432. return nil
  433. }
  434. // 设备复位
  435. // dataModel:基站参数
  436. func (obj *BparamOam) OamResetBts(dataModel *bparammodel.BtsBaseParam) error {
  437. var dataList bytes.Buffer
  438. ////组织参数
  439. tmpBytes := []byte{byte(dataModel.ResetBts)}
  440. obj.OamOrganizeSetLtvA(5, uint16(oam.ORDER_CONFIG_RESET), tmpBytes, &dataList)
  441. //发送数据给基站
  442. if err := obj.psDlApi.PsDlSendOamDataToBts(int(dataModel.ProjectID), dataModel.BtsID, psmodel.MCP_A, psmodel.MCP_A_CONFIGURE, dataList.Bytes()); err != nil {
  443. return err
  444. }
  445. return nil
  446. }