`
sunnylocus
  • 浏览: 870342 次
  • 性别: Icon_minigender_1
  • 来自: 美国图森
社区版块
存档分类
最新评论

中国联通SP业务接入开发总结(SGIP1.2 协议)

    博客分类:
  • Java
阅读更多

    当短信成功下发到手机终端时,一个多星期的联通业务接入程序终于完成,由于以前没有类似的开发经验,中间走了不少弯路,浪费了很多时间。总结下开发经验为下一步开发移动的业务接入打下一个基础。

 

 

开发过程遇到的几个难点:

1、 序列号的定义
2、 int转byte[]及字节序
3、 重复收到联通上行(MO)
4、 收到用户的定购命令但无法下行(MT)

 

1、序列号的定义

SGIP1.2 第7页 序列号的定义 写道

 

 

      序列号分成三部分,每部分为一个32位整数,第一部分表示命令源节点的编号,第二部分表示命令产生的日期和时间(网关系统中的任何命令的保存时间都不应该超过一年),格式为十进制的mmddhhmmss,比如11月20日20时32分25秒产生的命令,其第二部分为1120203225;第三部分由0开始,循环进位,直到进位满了之后再清零,重新开始计数。接收方在返回应答时,应答的序列号必须和相对应的命令的序列号相同。                                        

 

 

SGIP1.2 第7页 源节点编号规则 写道
   在整个网关系统中,所有的通信节点(SMG、GNS、SP和SMSC)都有一个唯一的数字编号,不同的SP或SMSC或SMG或GNS编号不能相同,编号由系统管理人员负责分配。编号规则如下:
 SMG的编号规则:1AAAAX
 SMSC的编号规则:2AAAAX
 SP的编号规则:3AAAAQQQQQ
 GNS的编号规则:4AAAAX
 其中,AAAA表示四位长途区号(不足四位的长途区号,左对齐,右补零),X表示1位序号,QQQQQ表示5位企业代码。

  由于java只有byte,short,int,long等数据类型,不像c/c++那样,有unsigned int,所以java语言中普通的int变量不能存储如此大的数据

比如说,我所在的城市济南,区号为0531,公司的企业代码为41211,按照源节点编码规则为3053141211,共10位,而int变量的范围为-2147483648~2147483647

    int srcnode = 3053141211;显然不能通过编译因为已经超过int的表示范围。

    还好,Java提供了超大整型类BigInteger

  int srcnode =new BigInteger("3053141211").intValue();    //源节点编号

  byte[] srcnodeBytes = IntToBytes4(srcnode);

用于Java采用补码srcnode的字节长度为5,不要使用toByteArray()方法获得字节数组,应单独编写一个方法用于int转byte[]的方法,注意必须以网络字节序的方式转换,即高位放在低地址,低位放在高地址

 

 

/** 
	 * 将int转换为byte数组 
	 *@param i 待转换的int变量 
	 *@return byte[] 转换后的byte数组 */
	public static byte[] intToBytes4(int i) {
		byte[] tmpbytes = new byte[4];
		tmpbytes[3] = (byte) (0xFF & i);
		tmpbytes[2] = (byte) ((0xFF00 & i) >> 8);
		tmpbytes[1] = (byte) ((0xFF0000 & i) >> 16);
		tmpbytes[0] = (byte) ((0xFF000000 & i) >> 24);
		return tmpbytes;
	}

 

2、int转byte[]及字节序

  在将int转为byte[],须注意字节的顺序。字节顺序分网络字节序和本地字节序,网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解析。网络字节顺序采用big endian排序方式。sgip1.2规定数据传输采用网络字节顺序Big endian(将高字节存储在低地址处,将低字节存储在高地址处)。具体转换及移位操作的使用见http://blog.csdn.net/Mailbomb/archive/2008/05/30/2496168.aspx

    

3、重复收到联通上行(MO)

  重复收到联通上行困扰了我好几天,仔细检查命令的格式都没有错误,上网搜索在csdn看到一个遇到同样问题的帖子,加他QQ,问他这个问题时一直不肯告诉我原因,真的太小气了。想想也是,说不定他解决这个问题费了好多的时间和精力,怎么能让自己辛苦劳动的结果让别人拿去呢,真没有开源精神,鄙视下!

     最后实在找不出原因,打电话请济南联通的张工在后台跟踪下,最终找出原因:

     在SMG向SP递交上行时,SP收到上行必须给SMG一个deliver_resp应答,且应答的序列号必须和相对应的命令的序列号相同。 问题出在我返回了应答,但是返回的应答序列号和之前的上行的deliver命令的序列号不同,SMG认为SP没有收到上行,所以才会重复发送上行给SP.

 

4、收到用户的定购命令但无法下行(MT)

   实施SPMS系统后,凡是订购(定制)业务都需要SPMS给用户发送确认短信,得到用户确认后,才形成临时订购关系;SP的订购成功欢迎短信通知成功下发后,才生成正式订购(定制)关系

  根据“联通在信”SGIP1.2协议修改部分说明,在给用户下发短信时,必须附加linkID且SP下发时UserCount必须填写1,否则视为业务非法包处理。

Submit命令中Reserve字段说明:

 

 

   该Reserve字段为8个字节的保留字段;现将该字段作为MOMT之间一一对应的LinkID来用。Reserve字段的值(LinkID)由SPMS业务鉴权平台生成,传给SMGSPMS将对MO所引起的下发MT进行ReserveLinkID)值的匹配校验。

   SP收到SMG网关发送的MO包后,要将MO中的Reserve字段原封不动拷贝出,并赋到该MO所引起的MT(1个或多个)包的Reserve字段中。该操作适用于进行定制命令、退订命令、MO所引起的MT点播之间的对应关系。如果SP不填,SPMS将因为匹配关系不合法,进行过滤。没有成功下发的原因就是因为没将MO中的Reserve字段赋值到Submit的Reserve字段造成的。

 

SMG返回的错误码及含义

 

1 消息结构错
2 命令字错误
3 消息序列号重复
4 消息长度错
5 资费代码错
6 超过最大信息长
7 业务代码错
8 流量控制错(user_phone单填写CDMA号码不在白名单中或charge_phone和user_phone填写的CDMA号码不在白名单)
9 本网关不负责此计费号码(如意通和外省号码)
10 Src_ID错(手机因关机或内存满消息超时删除返回的状态报告)
11 CorpID错(如是MT消息出现很多,可能是他的提交submit消息接口与回状态报告的接口冲突,建议SP不要使用手机上行接口来下发SUBMIT消息;还有一种情况是corp_id填写错误)
12 计费地址错(user_phone单填写GSM号码不在白名单中或charge_phone和user_phone填写的GSM号码不在白名单)
13 目的地址错
14~49 扩展
23(英斯克定义) 路由错误。路由不存在,指消息路由的节点在路由表中不存在
24(英斯克定义) 黑名单用户。计费号码无效,鉴权不成功时反馈的错误信息
40(英斯克定义) 网关对如意通用户进行拦截
50(英斯克定义) 短消息内容非法
51 尚未建立连接
52 尚未成功登录
53 发送消息失败
54 超时未接收到响应消息(一般是tp_udhi一项填写不对,应该填写0)
55 等待状态报告超时
56 用户鉴权时用户状态不正常(charge_phone不在白名单)
60 保留
61 有效时间已经过期(charge_phone和user_phone填写的GSM号码不在白名单)
62 定时发送时间已经过期
63 不能识别的FeeType
64 发送服务源地址鉴权失败
65 发送服务目的地址鉴权失败
66 接收服务源地址鉴权失败(手机内存满或关机等待下发已经到达10条后,SP再发就会出现此错误)
67 接收服务目的地址鉴权失败
68 用户鉴权失败
69 此用户为黑名单用户
70 网络断连或目的设备关闭接口
71 超过最大节点数
72 找不到路由
73 等待应答超时
74 送SCP失败
75 送SCP鉴权等待应答超时
76 信息安全鉴权失败
77 超过最大Submit提交数
78 SPID 为空
79 业务类型为空
80 CPCode错误
81 发送接收接口重复
82 循环路由
83 超过接收侧短消息MTU
84 送DSMP重发失败
85 DSMP系统忙重发
86 DSMP系统忙,且缓存满重发
87 DSMP流控重发
88 流控错误,流量超过最大限制
89
90 SGIP消息等待处理
91 SGIP协议状态报告请求标识错误
92 SGIP协议MT标识错
93 SGIP协议SP节点编号错
94 没有配置帐号
101 /* 定购业务失败 */
102 /* 退定业务失败 */
103 /* 非法SP */
104 /* 非法用户 */
105 /* 用户未定购此项业务,鉴权失败 */
106 /* 非法费用,鉴权失败 */
107 /* 重复包月话单 */
108 /* 非法指令*/
109 /* 非法业务代码*/
110 /* 已定购该业务 */
111 /*--需要用户回复的定制信息--*/
112 /*--需要用户回复的定制信息--*/
113 /*--需要用户回复的定制信息--*/
114 /*--用户回复的定制信息不存在--*/
115 /*--SP回复的定制信息不存在--*/
116 /* 用户未点播此项业务,鉴权失败 */
117 /* 等待用户作二次确认*/
118 /* 等待sp作定制确认*/
119 /* sp定制确认返回ERROR定制不成功要求复位*/
121 /* 下行对应多个目的号码*/
199 /* SPMS 修正了SUBMIT */
122 /* 非法SERVICE */
123 /* 非法SERVICE */

 

 

0 无错误,命令正确接收
1 非法登录,如登录名、口令出错、登录名与口令不符等。
2 重复登录,如在同一TCP/IP连接中连续两次以上请求登录。
3 连接过多,指单个节点要求同时建立的连接数过多。
4 登录类型错,指bind命令中的logintype字段出错。
5 参数格式错,指命令中参数值与参数类型不符或与协议规定的范围不符。
6 非法手机号码,协议中所有手机号码字段出现非86130号码或手机号码前未加“86”时都应报错。
7 消息ID错
8 信息长度错
9 非法序列号,包括序列号重复、序列号格式错误等
10 非法操作GNS (黑名单用户)
11 节点忙,指本节点存储队列满或其他原因,暂时不能提供服务的情况
21 目的地址不可达,指路由表存在路由且消息路由正确但被路由的节点暂时不能提供服务的情况
22 路由错,指路由表存在路由但消息路由出错的情况,如转错SMG等
23 路由不存在,指消息路由的节点在路由表中不存在
24 计费号码无效,鉴权不成功时反馈的错误信息
25 用户不能通信(如不在服务区、未开机等情况)
26 手机内存不足
27 手机不支持短消息
28 手机接收短消息出现错误
29 不知道的用户
30 不提供此功能
31 非法设备
32 系统失败
33 短信中心队列满
34 智能网平台扣费失败
35-99 其它错误码(待定义)

以下错误指SMG收到SPMS鉴权错误的原因
100 鉴权成功
101 SPNumber与SP企业代码匹配错
102 SPNumber未分配或不合法
103 业务代码未分配
104 业务资费类型填错
105 业务信息费率填写错误
106 用户未订制的SP非法下发
107 LinkID不匹配(MT与MO)
108 停机用户鉴权不通过,无法下发
109 计费号码无效
110 黑名单用户鉴权不通过,包括未启用状态、预开户状态及销户状态,即除正常通话状态、停机状态以外的所有其他状态
111 MT消息SPMS鉴权超时
112 包月话单SPMS鉴权超时
113 该包格式错误,MT话单的用户号码为空,或者CHARGENUMBER为空,或者SPNUMBER为空,或者CORPID为空,或者SERVICETYPE为空,或MT包里没有LINKID但根据业务代码判断却又不是订制类业务。
112 下发的MT超过最大条数,对点播类业务使用同一个LINKID下发的MT条数不能超过申报的数量
113 下发MT超过允许携带信息费的MT消息上限
114 USERCOUNT字段不为1,该字段必须填写1
115 SP不能将MOFLAG填为3,SP下发的MT包(除包月话单)中MOFLAG字段不能填3
116 将发NOTIUSER包,原流程需要终止。SPMS发通知信息给用户,MO不再上行发送给SP
117 WEB点播命令字不存在
118 包月话单被拦截
119 重复包月话单
120 订购业务失败
121 退订业务失败
123 重复订购
124 重复点播
125-255 其它错误码(待定义)

12为网关返回,说明SP NUMBER未分配或不合法

附各种常见错误码:
状态报告中常见错误码:
106:订购关系不存在,sp与vac订购关系不同步造成,建议sp进行全量同步;sp开通与vac每天ftp文件增量订购关系同步接口,以弥补vac通过sgip协议通知sp落订购关系的误差。
108:用户状态不正确,即用户处于非正常状态,不允许下发消息
10:短信中心下发失败,短信超过有效期
12:短信中心下发失败,被删除(超流量)

应答常见错误码:
SGIP协议登录网关错误码说明:
1:无权限(登录帐号或密码错误)
57:登录ip错误,sp连接网关的ip与sp申请资料中配置的ip不一样
93:SGIP协议SP节点编号错误,主要是节点编号中企业代码错误SGIP协议提交消息,网关应答错误码说明:
64:消息发送的源地址错误
93:SGIP协议SP节点编号错误,提交消息中的企业代码错误

联通最新更新定义

100 鉴权成功
102 SPNumber未分配
103 产品代码不存在
106 用户未订制的SP非法下发,即没有订购关系,或临时点播关系
107 LinkID不匹配(MT与MO)
108 用户状态不正常
109 计费号码不存在
110 黑名单用户鉴权不通过
115 SP不能将MOFLAG填为3,SP下发的MT包(除包月话单)中MOFLAG字段不能填3
117 WEB点播命令字不存在
118 包月话单被拦截
120 订购业务失败
121 退订业务失败
123 重复订购,订购关系已存在
162 超出用户消费限额
163 未发现用户归属地信息,用于按地市惩罚SP。
170 用户二次确认回复提示语出错
171 订购关系不存在,退订时用
172 订购关系不存在,SP不能主动HELP
173 订购关系处于中间状态(如待生效),业务不能用
175 QX分项退订之前没有查询
176 订购关系处于暂停状态
177 Sp下发的计费用户和VASP中定购关系的计费用户不一致,用于sp下包月话单。
179 Sp同步定购关系的产品代码和临时定购关系不一致
180 定购二次确认成功返回码; 0000,qxn,00000 发送到平台号码的返回码;0000,qxn,00000 发送到sp号码的返回码。 这些情况,网关不计上行通讯费。业务相关
181 超出业务发送时间段
182 超出业务当日下发次数
183 点播类业务不支持主动下行
185 不支持第三方订购
186 业务处于测试状态,非测试用户使用测试业务
187 业务处于异常状态
188 低信用度业务
190 用户点播的不是SP下行的业务,即SP点播下行业务代码与点播上行不一致SP相关
211 SP处于异常状态
212 SP的企业代码不存在
213 SP没有权限下发包月扣费消息
214 Sp没有被授权在该用户所在地市开展业务
215 Sp在该用户所在地市被暂停端口
216 Sp在该用户所在地市被暂停业务代收费
221 SP的IP地址不合法(仅用于HTTP接口反向操作)
222 SP的密钥无效(仅用于HTTP接口反向操作)
225 SP模拟mo定购未发现定购指令系统或数据配置错误
231 东软同步订购字段非法
248 系统不支持该服务,没有该系统指令
249 系统不支持帮助下发
251 (东软)捆绑业务不能退订
254 系统错误
255 缺省错

  

 

22
0
分享到:
评论
14 楼 zssggg 2014-01-10  
帮同事下载的,他说是好东西。指不定哪天我也用的上。
13 楼 liu19871112 2013-12-25  
您好,我想问下,SP方 在点播业务和包月业务的处理方面有没有不同之处?需不需要做什么特殊的处理?
   谢谢,期待您的回复!
12 楼 yeshuang 2013-10-29  
你好,我也是最近在基于SGIP做联通短信开发,也是遇到java.net.SocketException: Connection reset异常,Bind是成功的。
11 楼 kunsyliu 2012-09-06  
sunnylocus 写道
kunsyliu 写道
kunsyliu 写道
我单条能成功发送,群发是就报12的错误,

我把付费好改成“”,或全0依然出这个错误。

求帮助啊,很急,

小弟Q:1004143305

感激不尽啊


如果usercount只能是1了,用什么来指定要发送的手机数呢???还是根本就不用指定,只需

要将要发的手机号封装成string【】就可以直接完成群发了吗???

我的12错误还是没能解决,麻烦帮助下了。谢谢

------------------------------------------------------------------------------------------------------
在下发消息的结构体中,付费类型是必填值,这里我填充的字段。短信群发,根据sgip1.2的修改协议已经不支持了,你需要把群发的手机号一条一条的拆开,依次发下去。
Submit submit = new Submit();
submit.setSPNumber(mtreq.getSpNumber());
submit.setChargeNumber("000000000000000000000");// 长度21,如果全0表示由SP支付该条短信费用
submit.setUserNumber(new String[] { mtreq.getPhoneList().get(i) });
submit.setCorpId("41211"); //这里填你的企业id
submit.setFeeType((byte) 0);
submit.setFeeValue("0");
submit.setGivenValue("0");
submit.setAgentFlag((byte) 0);
submit.setMorelatetoMTFlag((byte) 2); // 0-MO点播引起的第一条MT信息
// 1-MO点播引起的非第一条信息
// 2-非MO点播引引起的MT消息(定购业务)
// 3系统反馈引起的MT消息
submit.setPriority((byte) 0);
submit.setExpireTime("");
submit.setScheduleTime("");
submit.setReportFlag(Byte.valueOf(mtreq.getReportFlag())); // 是否向SP报告状态
submit.setTP_pid((byte) 0);
submit.setTP_udhi((byte) 0);
submit.setMessageCoding((byte) 15);
submit.setMessageType((byte) 0);
submit.setMessageContent(mtreq.getMessageContent());
submit.setUserCoun((byte) 1); // 根据sgip1.2扩展协议必须填1,否则视为业务非法包处理
submit.setServiceType(mtreq.getServiceType());




我单条能通,就是群发搞了两天,都没搞好。郁闷死了。

谢谢你这么肯定的回答,不用在花时间在这上面了。  

真的太感谢了

我刚毕业,以后可以还有许多问题,需要请教,可以加你Q吗???

我的q:1004143305

再次谢过!!!!

10 楼 sunnylocus 2012-09-06  
kunsyliu 写道
kunsyliu 写道
我单条能成功发送,群发是就报12的错误,

我把付费好改成“”,或全0依然出这个错误。

求帮助啊,很急,

小弟Q:1004143305

感激不尽啊


如果usercount只能是1了,用什么来指定要发送的手机数呢???还是根本就不用指定,只需

要将要发的手机号封装成string【】就可以直接完成群发了吗???

我的12错误还是没能解决,麻烦帮助下了。谢谢

------------------------------------------------------------------------------------------------------
在下发消息的结构体中,付费类型是必填值,这里我填充的字段。短信群发,根据sgip1.2的修改协议已经不支持了,你需要把群发的手机号一条一条的拆开,依次发下去。
Submit submit = new Submit();
submit.setSPNumber(mtreq.getSpNumber());
submit.setChargeNumber("000000000000000000000");// 长度21,如果全0表示由SP支付该条短信费用
submit.setUserNumber(new String[] { mtreq.getPhoneList().get(i) });
submit.setCorpId("41211"); //这里填你的企业id
submit.setFeeType((byte) 0);
submit.setFeeValue("0");
submit.setGivenValue("0");
submit.setAgentFlag((byte) 0);
submit.setMorelatetoMTFlag((byte) 2); // 0-MO点播引起的第一条MT信息
// 1-MO点播引起的非第一条信息
// 2-非MO点播引引起的MT消息(定购业务)
// 3系统反馈引起的MT消息
submit.setPriority((byte) 0);
submit.setExpireTime("");
submit.setScheduleTime("");
submit.setReportFlag(Byte.valueOf(mtreq.getReportFlag())); // 是否向SP报告状态
submit.setTP_pid((byte) 0);
submit.setTP_udhi((byte) 0);
submit.setMessageCoding((byte) 15);
submit.setMessageType((byte) 0);
submit.setMessageContent(mtreq.getMessageContent());
submit.setUserCoun((byte) 1); // 根据sgip1.2扩展协议必须填1,否则视为业务非法包处理
submit.setServiceType(mtreq.getServiceType());
9 楼 kunsyliu 2012-09-06  
kunsyliu 写道
我单条能成功发送,群发是就报12的错误,

我把付费好改成“”,或全0依然出这个错误。

求帮助啊,很急,

小弟Q:1004143305

感激不尽啊


如果usercount只能是1了,用什么来指定要发送的手机数呢???还是根本就不用指定,只需

要将要发的手机号封装成string【】就可以直接完成群发了吗???

我的12错误还是没能解决,麻烦帮助下了。谢谢
8 楼 kunsyliu 2012-09-06  
我单条能成功发送,群发是就报12的错误,

我把付费好改成“”,或全0依然出这个错误。

求帮助啊,很急,

小弟Q:1004143305

感激不尽啊
7 楼 wan_xie2007 2012-08-01  
写的真好  赞一个 粉丝一下
6 楼 wan_xie2007 2012-08-01  
写的真好 不得不赞一个
5 楼 sunnylocus 2012-03-22  
retfu1 写道
你好,我问下状态报告返回-1的错误,是什么问题呢,谢谢

消息结构错。你发送的命令不符合sgip协议,网关认不出来。
4 楼 retfu1 2012-03-21  
你好,我问下状态报告返回-1的错误,是什么问题呢,谢谢
3 楼 sunnylocus 2011-11-13  
jqjbpxs 写道
我用你的代码重新配置后网关report返回
State:2
ErrorCode:103

作者的错误表中 103 /* 非法SP */ ,是联通监权那边没有我的注册信息?但是bind时可以成功,网上也另有错误代码说103:业务代码未配置

联系联通人又说他们没问题,你自己找自己的错误吧,迷茫中......,求给点解决思路!谢谢


呵呵,我估计有个地方你没有修改,将com.tdt.unicom.domains.SGIPHeader这个类里的3053141211,修改成你自己的,3代表是SP,0531代表你所在市的长途区号。41211代表SP标识,如果修改后问题还没有解决,请加我QQ:214899085
2 楼 jqjbpxs 2011-11-13  
我用你的代码重新配置后网关report返回
State:2
ErrorCode:103

作者的错误表中 103 /* 非法SP */ ,是联通监权那边没有我的注册信息?但是bind时可以成功,网上也另有错误代码说103:业务代码未配置

联系联通人又说他们没问题,你自己找自己的错误吧,迷茫中......,求给点解决思路!谢谢

1 楼 hellojinjie 2010-05-11  
项目中参考了你的代码,谢谢

相关推荐

    中国联通SGIP1.2短消息网关开发接口库

    1.接口说明 该接口库是用VC6.0开发的基于Windows平台上的SGIP1.2协议的实现,接口对中国联通SGIP协议进行了高度封装,目的是方便SP接入中国联通短消息网关。 2.功能特点 1)严格按照SGIP1.2协议实现,...

    中国联通sgip1.2模拟网关.rar

    联通网关.sgip网关,sp接入.联通sgip网关

    中国联通SGIP1.2

    通过应用SGIP协议,SP可以接入到SMG,实现SP应用的一点接入、全网服务

    SGIP.rar_sgip

    该接口库是用VC6.0开发的基于Windows平台上的SGIP1.2协议的实现,接口对中国联通SGIP协议进行了高度封装,目的是方便SP接入中国联通短消息网关。

    手机短信平台软件开发

    中国联通: SGIP1.2.CNGP 2.0(网通小灵通) 国际标准: SMPP 二、短信管理平台部分 2.1业务管理:针对短信业务的管理,支持定制,点播的取消以及包月扣费,以及业务添加进行管理 2.2内容管理:对用户设定的各个业务对应...

    sp短信平台软件资料

    中国联通: SGIP1.2 中国网通: CNGP 2.0 国际标准: SMPP 1.2协议适配模块:完成各种不同协议的短消息统一调度收发 1.3信息流量控制模块:滑动窗口的流量控制,内置数据包检测,自动重发机制,通讯层控制 1.4路由模块:...

    中国移动通信CMPP2.0短消息网关开发接口库

    本接口是用VC6.0遵循中国移动通信标准CMPP2.0协议开发的短消息网关接口,目的是简化SP接入移动短消息网关的复杂度。 本接口对网络通信和CMPP2.0协议进行了高度封,连接过所有类型的移动网关,暂时不支持CMPPE...

    易蝶短信平台

    EButterFlySMS (易蝶平台)具有完备的协议:支持最新的MISC 1.6、CMPP 2.03.0(中国移动)、SGIP1.2(中国联通)、SMGP 1.33.0(中国电信)、CNGP 2.0(中国 网通)通信协议。 良好的伸缩性,平台可以同时连接多个...

Global site tag (gtag.js) - Google Analytics