联通增值业务“定位之星”L1协议服务端的模拟器

去年接触了联通的“定位之星”增值业务,客户端都是php的(说到php,真的发现以前太小看php了,功能还是很强大的,呵呵),因为联通不开通开发测试,所以自己写了这个模拟器,功能非常简陋,纯粹是为了测试通信存在。

废话少说,源码贴上(赘姆烂壳的老规矩,没多少注释)

frmMain.frm

VERSION 5.00
Object = "{248DD890-BB45-11CF-9ABC-0080C7E7B78D}#1.0#0"; "MSWINSCK.OCX"
Begin VB.Form frmMain
   BorderStyle     =   1  'Fixed Single
   Caption         =   "L1 Protocol GateWay"
   ClientHeight    =   5430
   ClientLeft      =   45
   ClientTop       =   330
   ClientWidth     =   7995
   Icon            =   "frmMain.frx":0000
   LinkTopic       =   "Form1"
   MaxButton       =   0   'False
   ScaleHeight     =   5430
   ScaleWidth      =   7995
   StartUpPosition =   2  'CenterScreen
   Begin VB.Timer tmrTimeOut
      Interval        =   1000
      Left            =   7560
      Top             =   4980
   End
   Begin VB.CommandButton cmdExit
      Caption         =   "E&xit"
      Height          =   495
      Left            =   6660
      TabIndex        =   5
      Top             =   4800
      Width           =   1215
   End
   Begin VB.CommandButton cmdStop
      Caption         =   "S&top"
      Height          =   495
      Left            =   6660
      TabIndex        =   4
      Top             =   4200
      Width           =   1215
   End
   Begin VB.CommandButton cmdLTRTask
      Caption         =   "&LTR Task"
      Height          =   495
      Left            =   5340
      TabIndex        =   3
      Top             =   4800
      Width           =   1215
   End
   Begin VB.CommandButton cmdStart
      Caption         =   "&Start"
      Height          =   495
      Left            =   5340
      TabIndex        =   2
      Top             =   4200
      Width           =   1215
   End
   Begin VB.TextBox txtLTR
      Height          =   1095
      Left            =   120
      MultiLine       =   -1  'True
      ScrollBars      =   2  'Vertical
      TabIndex        =   1
      Top             =   4200
      Width           =   5115
   End
   Begin VB.TextBox txtLog
      Height          =   3975
      Left            =   120
      MultiLine       =   -1  'True
      ScrollBars      =   2  'Vertical
      TabIndex        =   0
      Top             =   120
      Width           =   7755
   End
   Begin MSWinsockLib.Winsock sckServer
      Index           =   0
      Left            =   0
      Top             =   0
      _ExtentX        =   741
      _ExtentY        =   741
      _Version        =   393216
   End
End
Attribute VB_Name = "frmMain"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit

Dim intCurIdx As Integer

Private Sub cmdExit_Click()
    Unload Me
End Sub

Private Sub cmdStart_Click()
    sckServer(0).LocalPort = SvrPort
    sckServer(0).Listen
    Call WriteLog("Start..." & vbCrLf)
End Sub

Private Sub cmdStop_Click()
    sckServer(0).Close
    Call WriteLog("Stop..." & vbCrLf)
End Sub

Private Sub Form_Load()
    ReDim LCSClient(1)
    With LCSClient(0)
        .IP = "61.181.74.13"
        .PassWord = "12345"
        .UserName = "tta"
        .Port = 2001
    End With

    ReDim Client(0)
   
    ReDim CloseList(0)

    intCurIdx = 0

    SvrPort = 2000
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    End
End Sub

Private Sub sckServer_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    Dim i As Integer
   
    If Index <> 0 Then Exit Sub
   
    For i = 1 To intCurIdx
        If Not IsObject(sckServer(i)) Then
            Load sckServer(i)
            sckServer(i).Accept requestID
            Client(i).IP = sckServer(i).RemoteHostIP
            Call WriteLog(sckServer(i).RemoteHostIP & " is connected..." & vbCrLf)
            Exit Sub
        Else
            If sckServer(i).State = sckClosed Then
                sckServer(i).Accept requestID
                Client(i).IP = sckServer(i).RemoteHostIP
                Call WriteLog(sckServer(i).RemoteHostIP & " is connected..." & vbCrLf)
                Exit Sub
            End If
        End If
    Next
    intCurIdx = intCurIdx + 1
    Load sckServer(intCurIdx)
    sckServer(intCurIdx).Accept requestID
    ReDim Preserve Client(intCurIdx)
    With Client(intCurIdx)
        .IP = sckServer(intCurIdx).RemoteHostIP
    End With
    Call WriteLog(sckServer(intCurIdx).RemoteHostIP & " is connected..." & vbCrLf)
End Sub

Private Sub sckServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
    Dim str As String
   
    If Index = 0 Then Exit Sub
    sckServer(Index).GetData str
   
    txtLog.Text = txtLog.Text & str & vbCrLf
    txtLog.SelStart = Len(txtLog.Text)
   
    If Left(str, 4) <> "POST" Then
        Call SendMsg(Index, "couldn't support the operation")
        Call RemoveClient(Index)
        Exit Sub
    End If
    Do
        str = Mid(str, InStr(str, vbCrLf) + 2)
    Loop While InStr(str, vbCrLf) <> 1
    str = Mid(str, InStr(str, vbCrLf) + 2)
   
    Call ParseXML(Index, str)
    txtLog.Text = txtLog.Text & "send complete" & vbCrLf
End Sub

Private Sub sckServer_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
    If Index = 0 Then
        sckServer(0).LocalPort = SvrPort
        sckServer(0).Listen
        Exit Sub
    End If
    If sckServer(Index).State <> sckClosed Then sckServer(Index).Close
End Sub

Private Sub sckServer_SendComplete(Index As Integer)
    Dim i As Integer
   
    For i = 0 To UBound(CloseList) - 1
        If CloseList(i) = Index Then
            sckServer(Index).Close
            Exit Sub
        End If
    Next
End Sub

modMain.bas

Attribute VB_Name = "modMain"
Option Explicit

Private Type typeClient
    IP As String
    SocketIdx As Integer
End Type
Public Client() As typeClient

Private Type typeLCSClient
    UserName As String
    PassWord As String
    IP As String
    Port As String
End Type
Public LCSClient() As typeLCSClient

Public CloseList() As Integer

Public Const MaxCon As Byte = 5
Public SvrPort As String

Public Sub ParseXML(ByVal idx As Integer, ByVal str As String)
    Dim xml As MSXML.DOMDocument
    Dim nodeREQ As IXMLDOMNode
    Dim nodeCLIENT As IXMLDOMNode
    Dim nodeORIGINATOR As IXMLDOMNode
    Dim nodeLIR As IXMLDOMNode
    Dim nodeLTR As IXMLDOMNode
    Dim nodeLCTR As IXMLDOMNode
   
    Set xml = New MSXML.DOMDocument
    If Not xml.loadXML(str) Then
        Call SendMsg(idx, "not valid XML")
        Exit Sub
    End If
   
    '取REQ节点
    Set nodeREQ = xml.selectSingleNode("REQ")
    If nodeREQ Is Nothing Then
        '没有REQ节点,返回错误
        Call SendMsg(idx, "couldn't support the operation")
        Exit Sub
    End If
   
    '取CLIENT节点
    Set nodeCLIENT = nodeREQ.selectSingleNode("CLIENT")
    If nodeCLIENT Is Nothing Then
        '没有CLIENT节点,返回错误
        Call SendMsg(idx, "couldn't support the operation")
        Exit Sub
    End If
   
    '鉴权
    Dim nodeLCSCLIENTID As IXMLDOMNode
    Dim nodePASSWORD As IXMLDOMNode
    Set nodeLCSCLIENTID = nodeCLIENT.selectSingleNode("LCSCLIENTID")
    Set nodePASSWORD = nodeCLIENT.selectSingleNode("PASSWORD")
    If nodeCLIENT Is Nothing Or nodePASSWORD Is Nothing Then
        Call SendMsg(idx, "couldn't support the operation")
        Exit Sub
    End If
    If Not IsValidSP(nodeLCSCLIENTID.Text, nodePASSWORD.Text, frmMain.sckServer(idx).RemoteHostIP) Then
        Call SendMsg(idx, "access defined")
        Exit Sub
    End If
   
    '取数据
    Set nodeORIGINATOR = nodeREQ.selectSingleNode("ORIGINATOR")
    Set nodeLIR = nodeREQ.selectSingleNode("LIR")
    Set nodeLTR = nodeREQ.selectSingleNode("LTR")
    Set nodeLCTR = nodeREQ.selectSingleNode("LCTR")
    If nodeORIGINATOR Is Nothing Then
        'LCTR
        If nodeLCTR Is Nothing Then
            Call SendMsg(idx, "couldn't support the operation")
            Exit Sub
        End If
        Dim nodeREQ_ID As IXMLDOMNode
        Set nodeREQ_ID = nodeLCTR.selectSingleNode("REQ_ID")
        If nodeREQ_ID Is Nothing Then
            Call SendMsg(idx, "has no REQ_ID")
            Exit Sub
        End If
       
    Else
        'LIR or LTR
        If ((nodeLIR Is Nothing) And (nodeLTR Is Nothing)) Or ((Not nodeLIR Is Nothing) And (Not nodeLTR Is Nothing)) Then
            Call SendMsg(idx, "couldn't support the operation")
            Exit Sub
        End If
        If nodeLTR Is Nothing Then
            'LIR
            Dim nodeORID As IXMLDOMNode
            Set nodeORID = nodeORIGINATOR.selectSingleNode("ORID")
            If nodeORID Is Nothing Then
                Call SendMsg(idx, "has no ORID")
                Exit Sub
            End If
           
            Dim nodePQOS As IXMLDOMNode
            Set nodePQOS = nodeLIR.selectSingleNode("PQOS")
            If nodePQOS Is Nothing Then
                Call SendMsg(idx, "PQOS Field missing")
                Exit Sub
            End If
           
            Dim nodeRESPTIMER As IXMLDOMNode
            Set nodeRESPTIMER = nodePQOS.selectSingleNode("RESP_TIMER")
           
            Dim wt As Long
            wt = CLng(nodeRESPTIMER.Text)
            frmMain.txtLog.Text = frmMain.txtLog.Text & "wait " & wt & " sec..." & vbCrLf
            Dim o As Long
            o = Timer
            Do Until Timer - o > wt
                DoEvents
            Loop
            frmMain.txtLog.Text = frmMain.txtLog.Text & "send xml" & vbCrLf
           
            Dim strLIA As String
            strLIA = createLIA(nodeLCSCLIENTID.Text, nodeORID.Text)
           
            frmMain.txtLog.Text = frmMain.txtLog.Text & vbCrLf & strLIA & vbCrLf & vbCrLf
           
            Call SendMsg(idx, strLIA)
        Else
            'LTR没有写,实际几乎没有此需求,毕竟太耗费系统资源,好像当时联通也不支持,不知现在如何了
           
        End If
    End If
End Sub

Public Sub SendMsg(ByVal idx As Integer, ByVal str As String)
    If IsObject(frmMain.sckServer(idx)) Then
        If frmMain.sckServer(idx).State <> sckClosed Then
            frmMain.sckServer(idx).SendData str
            ReDim Preserve CloseList(UBound(CloseList) + 1)
            CloseList(UBound(CloseList) - 1) = idx
        End If
    End If
End Sub

Public Sub RemoveClient(ByVal socket As Integer)
    If IsObject(frmMain.sckServer(socket)) Then
        If frmMain.sckServer(socket).State <> sckClosed Then frmMain.sckServer(socket).Close
    End If
End Sub

Public Sub WriteLog(ByVal str As String)
    frmMain.txtLog.Text = frmMain.txtLog.Text & str
End Sub

Private Function IsValidSP(ByVal uid As String, ByVal pwd As String, ByVal cip As String) As Boolean
    Dim i As Integer
   
    For i = 0 To UBound(LCSClient) - 1
        If LCSClient(i).UserName = uid And LCSClient(i).PassWord = pwd And LCSClient(i).IP = cip Then
            IsValidSP = True
            Exit Function
        End If
    Next
    IsValidSP = False
End Function

Public Function createLIA(ByVal lcscid As String, ByVal orid As String) As String
    Dim xml As MSXML.DOMDocument
   
    Dim strHeader As String
    Dim strLIA As String
    Dim sngLatitude As Single, sngLongitude As Single
   
    Randomize Timer
   
    strHeader = "<?xml version = ""1.0"" ?><!DOCTYPE ANS SYSTEM ""LOCANS.DTD"">"
    strLIA = "<ANS VER=""0.01"">" & _
               "<LCSCLIENTID>TheClient</LCSCLIENTID>" & _
               "<ORID>13300000000</ORID>" & _
               "<LIA>" & _
                 "<POSINFOS>" & _
                   "<POSINFO>" & _
                     "<POSITIONRESULT>1</POSITIONRESULT>" & _
                     "<MSID>13300000001</MSID>" & _
                     "<MSID_TYPE>0</MSID_TYPE>" & _
                     "<AREACODE>25</AREACODE>" & _
                     "<LOCALTIME>20020420142020</LOCALTIME>" & _
                     "<LATITUDETYPE>0</LATITUDETYPE>" & _
                     "<LATITUDE>301628.312</LATITUDE>" & _
                     "<LONGITUDETYPE>0</LONGITUDETYPE>" & _
                     "<LONGITUDE>451533.431</LONGITUDE>" & _
                     "<RADIUS>200</RADIUS>" & _
                     "<POSOUR>6</POSOUR>" & _
                   "</POSINFO>" & _
                 "</POSINFOS>" & _
               "</LIA>" & _
              "</ANS>"

   
    Set xml = New MSXML.DOMDocument
    xml.loadXML strLIA
   
    xml.selectSingleNode("/ANS/LCSCLIENTID").Text = lcscid
    xml.selectSingleNode("/ANS/ORID").Text = orid
    xml.selectSingleNode("/ANS/LIA/POSINFOS/POSINFO/MSID").Text = orid
    xml.selectSingleNode("/ANS/LIA/POSINFOS/POSINFO/LOCALTIME").Text = Format(Now, "yyyymmddhhmmss")
   
    sngLatitude = Rnd * 100000000 / 1000
    xml.selectSingleNode("/ANS/LIA/POSINFOS/POSINFO/LATITUDE").Text = sngLatitude
    sngLongitude = Rnd * 100000000 / 1000
    xml.selectSingleNode("/ANS/LIA/POSINFOS/POSINFO/LONGITUDE").Text = sngLongitude
   
    createLIA = strHeader & xml.xml
End Function

附L1协议的简介

1           概述1.1         L1接口根据PN4747,L1接口是CDMA移动定位中心(MPC)与位置服务客户机(LCS Client)之间的接口。 L1接口协议(CDMA移动定位协议)是应用级协议,用于使用CDMA无线定位技术定位时MPC和SP位置应用的通讯接口。本文将介绍移动定位中心(MPC)应该能够执行的操作的核心集合。1.2         承载方式L1移动定位承载协议采用HTTP/XML,通过SSL 保证数据传输的安全。XML(eXtensible Markup Language),是一种可延伸或扩展的标记语言,它的优点是可根据设计的需要自行定义标签,SP和MPC间的接口往往会根据功能或业务的需要自行定义参数,使用该语言可以自行定义标签,建立数据非常灵活。    MPC对SP设置两个HTTP 端口,一个通过SSL来保证数据安全,一个不需要采用SSL。前者主要提供给非信任域、非安全域的用户,如通过Internet 来访问的用户确保数据安全;后者提供给信任域、安全域的用户,如通过局域网来访问的用户,同时由于不采用SSL可提高数据传输速度。可以选择两个端口号码作为建议的标准端口。端口应该由IANA(Internet指定的号码机构)登记。对CDMA中用到两个端口号码的建议如下:·         700 用于SSL传输·         701用于非安全传输MPC和位置服务器可以选择基于其它端口的技术或HTTP透明技术实现安全传输。但是,无论使用哪种技术,都不能使用上述两个端口。HTTP 版本为1.1,关于HTTP,请参见:http://www.w3.org。 1.3         L1语法1.3.1          约定特殊符号的标识:回车(ASCII码为13)               CR换行(ASCII码为10)               LF空格(ASCII码为32)               SP[a-z]                                  表示可以为所有小写字母[A-Z]                                 表示可以为所有大写字母[0-9]                                  表示可以为从0到9的任何数字{min,max}                            表示长度在min和max之间[a-z,A-Z,0-9]                         表示可以为所有小写字母、所有大写字母、0到9的所有数字 举例:[0-9] {7,8}表示长度为7位或8位的数字串,如8787767即符合要求,而119不符合要求[B-D]{3,4}表示长度为3位或4位的B-D的字符串,如BBC符合要求,BBCCD和ABC不符合要求[a,C,7-9]{1}表示可以为a或C或7或8或91.3.2          DTD语法+                                          大于或等于1个*                                          大于或等于0个?                                           0或者1个()                                          一组标签|                                           或,                                           与,但有前后顺序<space>                                   与,但没有前后顺序

时间: 2016-02-06

联通增值业务“定位之星”L1协议服务端的模拟器的相关文章

golang实现简单的udp协议服务端与客户端示例_Golang

本文实例讲述了golang实现简单的udp协议服务端与客户端.分享给大家供大家参考,具体如下: 其实udp没有什么服务端和客户端的概念了,只是一个发一个收而已,只是这样较方便能识别和理解. 服务端: 复制代码 代码如下: package main import (     "fmt"     "net" ) func main() {     // 创建监听     socket, err := net.ListenUDP("udp4", &am

江苏联通打造无忧增值业务监控管理系统

随着电信市场竞争的日趋激烈,电信运营商一直在利用层出不穷的新技术拓展自身的增值业务.江苏联通增值业务部在总部相关机构的组织与指导下,为用户开展了一系列的增值业务,为了保证这些增值业务的开展,联通江苏分公司建设了多套支撑系统.目前增值业务维护共有30多套业务支撑系统,其共同的特点是硬件设备品牌型号多样.运行环境不一.业务系统独立,没有完善的系统监控.统计展现和业务分析的功能,这些工作目前基本靠后台手工完成.随着对前台支持力度的加大,统计分析的工作量不断增加,这造成工作效率低,数据实时性差,系统安全

联通混改 流量大数据及增值业务或将成重点

传闻已久的联通混改终于进入倒计时.4月5日,中国联通发布公告称,混改可能涉及A股公司的股份变动,这意味着联通会在上市公司层面引入外部资本.谁能入局?混改率先在哪个板块业务试水?分析人士指出,考虑到未来的发展前景,在联通众多的业务中,流量大数据以及增值业务或将是联通混改的重点,资金注入成为混改关键,不过,资金到来能否快速改善联通目前被动状况还尚不能确定. 混改冲刺 4月5日早间,中国联通在沪港交易所均停牌,称待发出一份有关公司内幕消息的公告.晚间,中国联通H股披露混改方案,称控股股东联通集团正在筹

联通用户被订阅多项增值业务客服称有待调查

5个月内被多扣230多元 客服称增值服务捆绑原因有待后台调查 □晨报热线记者 谢 磊 近日,读者蔡先生致电晨报热线称,平日只用手机拨打市话的他,无意间发现自己的联通手机上竟被捆绑了四五个增值项目,5个月内因此被扣掉230多元的话费.尽管经过交涉,上海联通将多收取的增值项目服务费退还给了蔡先生,但对于今后会不会再有类似事情发生,蔡先生心里没底:"我希望联通能够提高服务质量,将这种乱收费的情况加以改善. " 用户每月手机费用激增 蔡先生有两部手机,其中一部属于中国联通的如意通号码,主要用来

联通3G增值业务确定按内容计费:视频1元/M

6月5日消息,中国联通透露了其3G增值业务的计费方式,将按内容收费,而不是按时长收费:视频图像等联通3G多媒体业务为1元/M,文本内容为0.2元/T,试商用期间则在此基础上资费减半. 联通3G资费与欧洲标准接轨 此前在推广3G无线上网业务时,中国移动和中国电信分别采取了不同的计费模式,移动坚持按流量计费,电信则按上网时长计费,中国联通则宣布推出一种被称为M/T的无线上网计费模式. 中国联通表示,这是一种与欧洲标准接轨的计费方式,将使用户在使用3G多媒体业务时更加明明白白的消费,创新出新的计量单位

传联通拟整顿子公司增值业务“首当其冲”

继2月份中国联通总部机构改革和人员重新聘任后,联通近期又将启动一次重大的业务调整.昨日(11月25日),<每日经济新闻>记者从联通内部了解到,公司近期将对旗下的增值业务子公司进行相应的调整,涉及4家子公司,其中3家将被合并. 整顿或涉及4家子公司 据联通内部人士透露,此次调整涉及联通音乐公司.联通视频公司.联通新时讯公司和联通宽带在线公司,其中联通音乐公司或将并入中国联通音乐基地,联通视频公司和联通新时讯可能将被并入联通宽带在线公司. 据<每日经济新闻>了解,此次整顿所涉及的4家子

3G时代增值业务业绩决定运营商成败

联通版iPhone已经开始出售,但是徐巍丝毫不惧怕联通有苹果公司这样一个巨无霸的合作伙伴.徐巍是苏州智童科技有限公司总裁.这是一家专注儿童互联网应用的企业,目前正在与联通联合研发一款针对儿童使用的手机终端,可以融合视频通话.GPS定位等多种增值服务. "我们完全是自主研发.自主创新,联通很需要这样的3G合作伙伴.因为苹果的iPhone只是简单的采购和被采购,增值服务方面没有合作."在徐巍看来,在这场3G大戏台上,即使是一个"跑龙套"的配角,也许戏份不多,但同样有一个

联通“全业务”发力渠道创新

"沃",这个与感叹词"WOW"谐音的联通全业务品牌,似乎要以不断的创新,紧紧抓住人们的眼球. 6月1日,北京西单,中国联通"沃"品牌再次成为焦点.川流不息的人群停下脚步,见证了联通"沃"品牌店的成立.这不仅是中国联通第一家"沃"品牌店,也是联通全业务品牌战略在渠道的一次创新.不同于传统营业厅的是,"沃"品牌店将承担联通"沃"品牌形象传播.3G业务和终端体验的渠道使命,

运营商普遍面临增值业务难题

(记者 张九陆)10月26日消息,从运营商近日发布的前三季财报中,可以看到当前运营商不同程度地面临业务发展难题.由于3G增值业务尚未找到"杀手"应用,2G增值业务竞争日益激烈,数据增值业务的发展也面临着新的挑战. 数据显示,中国移动增值业务使用客户数为4.59亿,与去年同期基本持平,由于新增用户市场竞争激烈以及自身基数已经较大,中国移动的无线音乐使用客户数.彩信使用客户数等增值业务的增长已经放缓,彩信使用客户数为1.32亿,同比去年的1.34亿微增6%;无线音乐使用客户数为3.98亿,