数据库接口在数据库的操作过程中主要注意以下两个问题: (1) 二进制数据的处理方式。 (2) 不同短信息的填写格式。将以MS SQL Server为例子来讲述,其他类型的数据库可以找到对应的SQL语句。 1二进制数据的处理方式在讲解对数据库的操作过程中,主要先要简单说明一下不同数据库对二进制数据的处理方式有所不同。 1.1 MySQL数据库在MySQL数据库下,二进制数据的准确表达方式为:以0x开头,后面紧跟十六进制方式的编码,每两个字符代表一个字节。例如:0x30313233343536373839就代表字符串:“0123456789”。 二进制数据与字符串可以直接混合使用,不需要特殊的转换函数。也就是说下面两种方法是一样的结果: (1) insert into cmpp_submit
(dest_terminal_id,msg_fmt) (2) insert into cmpp_submit
(dest_terminal_id,msg_fmt) 在做数据库直接查询的时候,数据库会将内容直接按照可显示的字符串来显示。不需要其他转换函数。 1.2 MS SQL Server数据库在MS SQL Server数据库中,二进制数据的准确表达方式为:以0x开头,后面紧跟十六进制方式的编码,每两个字符代表一个字节。例如:0x30313233343536373839就代表字符串:“0123456789”。 二进制数据与字符串不可以混合使用,需要特殊的内置SQL转换函数(convert)来实现。典型的转换语句如下: insert into cmpp_submit (dest_terminal_id,msg_content) 在做数据库直接查询的时候,数据库会按照十六进制的方式显示二进制的内容,因此如果想从数据库中直接查看相关内容,请使用convert函数,将二进制内容转换成字符串。例如: select dest_terminal_id,convert(varchar(255),msg_content) 注意:如果没有带长度规定,那么数据库会按照缺省的长度来处理。这个长度很可能小于数据的实际长度。这个时候就会出现数据被截断的现象。 1.3 Oracle数据库在Oracle数据库中,二进制数据的准确表达方式为:十六进制编码,每两个字符代表一个字节。例如:30313233343536373839就代表字符串:“0123456789”。 二进制数据与字符串不可以混合使用,需要特殊的内置SQL转换函数(HEXTORAW/RAWTOHEX)来实现。或者直接十六进制编码串。使用典型的转换语句如下: (1) insert into cmpp_submit
(dest_terminal_id,msg_content) (2) insert into cmpp_submit
(dest_terminal_id,msg_content) 在做数据库选择的时候,数据库会按照十六进制的方式来显示二进制内容。 2发送英文insert cmpp_submit (dest_terminal_id,msg_fmt,msg_content) values ('13910139946',0,convert(varbinary(255),'Hello World !')); 注意:msg_length是msg_content的字节长度。msg_fmt缺省为0,意味着发送英文。最长为160字符。 3发送中文insert cmpp_submit (dest_terminal_id,msg_fmt,msg_content) values ('13910139946',15,convert(varbinary(255),'你好!')); 注意:将msg_fmt设置为15。请参见CMPP协议。最长为70个汉字。 4发送Unicodeinsert cmpp_submit (dest_terminal_id,msg_fmt,msg_content) values ('13910139946',8,0x9FA6); 注意:将msg_fmt设置为8。可以采用Unicode来发送中文,或者其他类型的文字。例如:日文、繁体中文等等。 5发送中文英文混合发送方式有两种:一种是采用方法6.3,直接按照中文方式发送。另外一种是将内容先转换成Unicode再使用方法6.4发送。 注意:一个英文也将被当做是一个汉字。最多70个字。 6需要收条在发送的时候将registered_deliver设置为1就是需要收条。以确认对方收到该条短信息。 注意:收条的msg_mr参数应与cmpp_submit表中的msg_id相对应。如果不完全一致,那么低16位应该一致。 7设置发送级别请将msg_level设置为0~9的数值。级别从0到9递增。具体情况要看移动网关的支持。 注意:我们的系统支持msg_level的排序,但是请勿滥用该参数。 8发送二进制数据常见的二进制数据为Nokia的标准图片和铃声。请将msg_fmt设置为4,根据具体情况选择tp_udhi和tp_pid。详细情况请参见《Nokia铃声、图片和LOGO样例》。 8.1图片insert cmpp_submit (tp_udhi,dest_terminal_id,msg_fmt,msg_content) values (0x40,'13971629662;13901032746;',4,0x0605041583158300480E011F07C00FC1F003E0F820FC20107E08041F044E03902700E409C07234016D9A6C59B6802C09B092446C22490D900890904400220909103C01E89E7E7917803C43E015208104A807C284100A40A502500821855008408102100AA1841008407E0210082143E0102000040807C230006018381806000C0D01800600600180B0); 8.2铃声insert cmpp_submit (tp_udhi,dest_terminal_id,msg_fmt,msg_content) values (0x40,'13971629662;13901032746;',4,0x06050415811581024A3A519195B5BC04004ED8C49321C4289B126186927186884C8690698618692718708612A2AC2A826C24C2692AC2642084956288B08B1271869861868000); 9如何填写收费字段CMPP协议中有关资费的填写请参见CMPP协议后面的部分。这里只做简要说明。 9.1 fee_user_type 字段0 — 对接收方(即dest_terminal_id所指定的接收方)收费。可用于用户为自己点播短消息。 1 — 对发送方(即src_terminal_id所指定的接收方)收费。可用于用户使用自己的帐号为别人点播短消息。 2 — 对SP收费(即msg_src所指定的发送方)。可用于对用户实现广告信息的发布。 3 — 对第三方收费(即fee_terminal_id所指定的发送方)。可用于用户使用自己的帐号为别人点播服务。 9.2 fee_terminal_id字段当fee_user_type为0~2时,该字段无效(空)。当fee_user_type字段为3时,该字段不能为空。该字段还有另外一个特点:能够对任何种类的手机收取费用。即:全球通的SIM卡或神州行的SIM卡。但是使用src_terminal_id可能只能够对全球通的SIM卡实现收费。详细情况请向当地移动询问。 9.3 fee_type字段一共有五种设置: 01 — 免费 02 — 按条 03 — 包月 04 — 封顶 05 — SP自己实现收费。 这五种收费的支持情况与本地移动相关。 9.4 fee_code字段以分计算,左补零。 例如:按条计算,每条一角。那么: fee_type = "02" fee_code = "000010" 免费的短信息: fee_type = "01" fee_code = "000000" 包月的短信息(看当地移动是否支持) fee_type = "02" fee_code = "002000" 9.5产生话单当registered_deliver为2的时候就表示该条短信息将产生用户话单,但是该信息不发送到用户。一般是每个月的16日到21日发送给移动。换句话说:即通知当地移动应该向用户收取的费用,但是该信息不发送给用户。主要是在月底结帐的时候比较有用。 注意:在发送联通的话单的时候,高四位被用来控制mt_related_to_mo_flag。因此,registered_delivery应该为0x32,即十进制的50。 为了确保系统在发送话单的时候不会失误,请在新系统安装或更新完毕后,发送话单前提前与我们联系。 10常用缺省值pk_total = 1 pk_number = 1 registered_delivery = 要收条 service_id = 空 msg_src = 企业代码 src_terminal_id = 特服号码 11指定出口当同时连接多个网关的时候,设置ih_gateway的数值就可以指定出口。 设置ih_gateway=’’(空字符串,但是不是NULL)。那么就意味着不指定网关的出口。由系统选择出口。 设置ih_gateway=’hubei’。那么就意味着指定从湖北网关出口走。如果湖北网关没有启动或者湖北网关暂时无法接通,那么系统将不会选择该数据进入系统。直到网关启动或接通。 如果ih_gateway的名称错误。那么系统将被系统抛弃。 12如何接收短消息所有接收的短消息均在cmpp_deliver数据中,包括短信息的状态报告(收条)。两者的区别主要在于registered_delivery的数值不同。如果registered_delivery为0,那么就是普通的上行短信息,否则为短消息状态报告。 注意:请不要随意修改ih_process的数值,如果需要,那么请在ih_process变成’cmpp_deliver_responsed’之后再进行。 13数据库字段的意义以下将讲解数据库内部各个字段的意义,将以MS SQL Server中的描述为基础来讲述。其中cmpp_submit负责发送,cmpp_deliver负责接收,cmpp_query负责查询(如果网关支持的话)。 13.1 cmpp_submit(1) 负责处理发送短信息的数据表。 (2) 该表将的数目将不断增加。请在系统空闲的时候,备份或清除数据。 13.1.1 id(数据表主键)/*数据表主键*/ /* 自动按照次序增加。 也可以指定一个不重复的数值。 在Oracle数据库中,可以通过触发器来实现类似的功能。 */ [id] [int] IDENTITY (1, 1) NOT NULL PRIMARY KEY, 13.1.2 msg_id(信息标识)/*信息标识*/ /* 提交短信息时,用户无须填写该数值。 该数值由网关返回。 该数值是16进制数值,一共16个char长。 */ [msg_id] [char] (16) NOT NULL DEFAULT '0000000000000001', 13.1.3 pk_total、pk_number(分包标记)/*分包标记*/ /* 该字段的支持看网关的处理。 */ /* 数据包总数。 */ [pk_total] [smallint] NOT NULL DEFAULT 1, /* 数据包当前序号。从1到总数。 */ [pk_number] [smallint] NOT NULL DEFAULT 1, 13.1.4 registered_deliver(是否需要返回状态报告)/*是否需要返回状态报告*/ /* 0 -- 不需要 1 -- 需要状态报告 使用状态报告可以确认用户是否真正接收到短信息。 */ [registered_delivery] [smallint] NOT NULL DEFAULT 0, 13.1.5 msg_level(信息级别)/*信息级别*/ /* 系统内部将根据信息级别排序。 级别从0到9依次增高。 系统会针对级别不同而判断处理的优先级别,请不要滥用该数值。 */ [msg_level] [smallint] NOT NULL DEFAULT 0, 13.1.6 service_id(业务类型)/*业务类型*/ /* 业务类型也就是在移动方面登记的业务类型。 例如:天气预报(TQYB) */ [service_id] [varchar] (10) NULL, 13.1.7 fee_user_type(计费用户类型)/*计费用户类型*/ /* 1. 对源终端计费 2. 对SP计费 3. 本字段无效,对fee_terminal_id所指定的终端计费。 */ [fee_user_type] [smallint] NOT NULL DEFAULT 0, 13.1.8 fee_terminal_id(被计费用户号码)/*被计费用户号码*/ [fee_terminal_id] [varchar] (21) NULL , 13.1.9 tp_pid(协议类型)/*GSM协议类型*/ [tp_pid] [smallint] NOT NULL DEFAULT 0, 13.1.10 tp_udhi(用户数据头标识)/*GSM协议类型*/ [tp_udhi] [smallint] NOT NULL DEFAULT 0, 13.1.11 msg_fmt(信息格式)/*信息格式*/ /* 0 -- ASCII码 3 -- 短信息写卡操作 4 -- 二进制信息 8 -- UCS2编码 15 -- 含GB汉字 */ [msg_fmt] [smallint] NOT NULL DEFAULT 0, 13.1.12 msg_src(信息来源)/*信息来源*/ /* 必须为企业代码。 */ [msg_src] [varchar] (6) NOT NULL DEFAULT '926026', 13.1.13 fee_type(计费类型)/*计费类型*/ /* 1. '01' -- 免费 2. '02' -- 按条 3. '03' -- 包月 4. '04' -- 封顶 5. '05' -- SP自己收费 */ [fee_type] [char] (2) NOT NULL DEFAULT '01', 13.1.14 fee_code(费用代码)/*费用代码*/ /* 按照分计算的费用。例如:0.20元,fee_code = '000020'。 */ [fee_code] [char] (6) NOT NULL DEFAULT '000000', 13.1.15 valid_time(有效时间)/*有效时间*/ /* 一般缺省最大为24小时,无须填写该数值。 如果要填写,则需要按照SMPP 3.3中的协议执行。 */ [valid_time] [char] (17) NULL , 13.1.16 at_time(定时发送)/*定时发送*/ /* 一般为及时发送。无须填写该数值。 如果要填写,则需要按照SMPP 3.3中的协议执行。 */ [at_time] [char] (17) NULL , 13.1.17 src_terminal_id(短消息发送方)/*短消息发送方*/ /* 一般为特别服务号码。 也可以为第三方的手机号码或特别服务号码。 具体支持情况看网关的处理。 */ [src_terminal_id] [varchar] (21) NOT NULL DEFAULT '08000', 13.1.18 dest_usr_tl(接收用户数目)/*接收用户数目*/ /* 一次最多为100个。 */ [dest_usr_tl] [int] NOT NULL DEFAULT 0, 13.1.19 dest_terminal_id(接收用户)/*接收用户*/ /* 多个用户之间使用分号分隔。 个数要与dest_usr_tl所指定的保持一致。 系统不对用户个数做强制性限制,但是需要根据具体的网关做一定的调整。 例如:有的地区允许最多2个群发,有的则允许255个群发。 */ [dest_terminal_id] [text] NULL , 13.1.20 msg_length(信息长度)/*信息长度(无需填写,系统自动处理;如果填写,则作为SGIP里面的given_value来处理)*/ /* 英文:160。 中文:70。 */ [msg_length] [int] NOT NULL DEFAULT 0, 13.1.21 msg_content(信息内容)/*信息内容*/ /* 长度要与msg_length的保持一致。 */ [msg_content] [varbinary] (255) NULL , 13.1.22 ih_process(事务处理过程)/*事务处理过程(此字段已经在UMS系统中已经简化,以下为SMP-1的流程)*/ /* 1.用户填写成insert_cmpp_submit才能被发送。 2.提交到ISMG网关之后,立即变更为wait_for_response,同时ih_retry减一。 3.ISMG网关响应失败: 3.1 如果ih_retry > 0,并且等待超过了30秒,则自动重新发送。 3.2 如果ih_retry <= 0,则不再发送。 4.ISMG网关响应: 4.1 如果网关报告失败,则将错误填写在ih_result和ih_report中。 4.2 如果网关报告成功,则变更为cmpp_submit_success,同时填写msg_id。 */ [ih_process] [varchar] (64) NOT NULL DEFAULT 'insert_cmpp_submit', 13.1.23 ih_result(状态报告)/*状态报告*/ /* 0 -- 成功 1 -- 消息结构错 2 -- 命令字错 ...... 该字段的意义与具体的网关有密切的关系! */ [ih_result] [smallint] NOT NULL DEFAULT 0, 13.1.24 ih_gateway(网关标识)/*网关标识*/ /* 如果不填写该内容,那么系统将会自动选择一个网关将短信息发送出去。 所指定的网关名称必须与配置文件中所给的名称一致。 如果填写了错误的网关名称,程序将不会做出任何响应。 */ [ih_gateway] [varchar] (32) NOT NULL DEFAULT ‘’, 13.1.25 ih_retry(重试次数)/*重试次数(此字段已经在UMS系统中不再使用)*/ /* 如果发送后在30秒内未能得到网关响应且ih_retry大于零,系统将自动组织重发。 当ih_retry等于或小于零的时候,系统将不再组织重发。 */ [ih_retry] [int] NOT NULL DEFAULT 3, 13.1.26 ih_session(会话标识)/*会话标识(此字段已经在UMS系统中不再使用)*/ /* 对应着每一个出口。 请不要擅自修改该数值。 */ [ih_session] [int] NOT NULL DEFAULT 0, 13.1.27 ih_timestamp(时间标记)/*时间标记*/ /* 记录数据最后一次被更改的时间。 */ [ih_timestamp] [datetime] NOT NULL DEFAULT GetDate() 13.2 cmpp_deliver(1) 负责处理接收短信息的数据表。 (2) 该表将的数目将不断增加。请在系统空闲的时候,备份或清除数据。 13.2.1 id(数据表主键)/*数据表主键*/ /* 自动按照次序增加。 在Oracle数据库中,可以通过触发器来实现类似的功能。 */ [id] [int] IDENTITY (1, 1) NOT NULL PRIMARY KEY, 13.2.2 msg_id(信息标识)/*信息标识。*/ /* 在cmpp_deliver中为网关提交的消息编号。 */ [msg_id] [char] (16) NOT NULL DEFAULT '0000000000000001', 13.2.3 destination_id(SP的特服号码)/*SP的特服号码*/ /* 开头为SP的特服号码,后面可能还有其他数据。 */ [destination_id] [varchar] (21) NULL , 13.2.4 service_id(业务类型)/*业务类型*/ [service_id] [varchar] (10) NULL , 13.2.5 tp_pid(应用协议标识)/*GSM协议类型*/ [tp_pid] [smallint] NOT NULL DEFAULT 0, 13.2.6 tp_udhi(用户数据头标识)/*GSM协议类型*/ [tp_udhi] [smallint] NOT NULL DEFAULT 0, 13.2.7 msg_fmt(信息格式)/*信息格式*/ /* 0 -- ASCII码 3 -- 短信息写卡操作 4 -- 二进制信息 8 -- UCS2编码 15 -- 含GB汉字 */ [msg_fmt] [smallint] NOT NULL DEFAULT 0, 13.2.8 src_terminal_id(源终端号码)/*源终端号码*/ /* 该号码一般都带有’86’的国别标记。 */ [src_terminal_id] [varchar] (21) NULL , 13.2.9 registered_delivery(是否为应答信息)/*是否为应答信息*/ /* 0 -- 非应答信息 1 -- 状态报告 只有当该数值为1的时候,后面的status、submit_time、done_time才有意义。 */ [registered_delivery] [smallint] NOT NULL DEFAULT 0, 13.2.10 msg_length(消息长度)/*消息长度*/ [msg_length] [int] NOT NULL DEFAULT 0, 13.2.11 msg_content(消息内容)/*消息内容*/ /* 如果是在MSSQLServer中可以使用convert指令来显示该部分的内容。 */ [msg_content] [varbinary] (255) NULL , 13.2.12 msg_mr(返回消息标识)/*返回的消息标识*/ /* 在使用收条的时候,该字段对应着submit的msg_id。 如果不全相同,那么低16bit应该相互对应。 */ [msg_mr] [char] (16) NULL , 13.2.13 status(状态报告)/*状态报告*/ /* 除DELIVRD表示用户接收到以外,其他内容都为否定。 详细情况请参见SMPP 3.4中的说明。 */ [status] [char] (7) NULL , 13.2.14 submit_time(提交时间)/*提交时间*/ /* 用户提交到短信息中心的时间。 */ [submit_time] [char] (10) NULL , 13.2.15 done_time(报告时间)/*报告时间*/ /* 短信息报告生成的时间。 */ [done_time] [char] (10) NULL , 13.2.16 dest_terminal_id(目的终端号码)/*目的终端号码*/ [dest_terminal_id] [varchar] (21) NULL , 13.2.17 smsc_sequence(短信息中心的消息序列号)/*短信息中心的消息序列号*/ [smsc_sequence] [int] NOT NULL DEFAULT 0, 13.2.18 ih_process(事务处理过程)/*事务处理过程*/ /* 1. 当有短信息下发的时候,ih_process设置为'insert_cmpp_deliver'。 2. 当响应成功之后,ih_process设置为'cmpp_deliver_responsed'。
如果用户有自己的处理,不要修改msg_id、ih_process与ih_sequence。 最好是在cmpp_deliver_responsed之后再做相关操作。 */ [ih_process] [varchar] (64) NOT NULL DEFAULT 'insert_cmpp_deliver', 13.2.19 ih_gateway(网关标识)/*网关标识*/ /* 指定响应的网关出口。 在cmpp_deliver中,用户不要修改该字段的数值。 */ [ih_gateway] [varchar] (32) NOT NULL DEFAULT ‘’, 13.2.20 ih_session(会话标识)/*会话标识(该字段在UMS系统中已经不再使用)*/ /* 对应着每一个入口。从它可以发现该条信息的来源。 在cmpp_deliver中,用户不要修改该字段的数值。 */ [ih_session] [int] NOT NULL DEFAULT 0, 13.2.21 ih_sequence(序列号)/*序列号*/ /* 对应着每一条信息的序列号,供应答用。 在cmpp_deliver中,用户不要修改该字段的数值。 */ [ih_sequence] [int] NOT NULL DEFAULT 0, 13.2.22 ih_timestamp(时间标记)/*时间标记*/ /* 记录数据最后一次被更改的时间。 */ [ih_timestamp] [datetime] NOT NULL DEFAULT GetDate() 13.3 cmpp_query(1) 该表在UMS系统中不再使用,仅SMP系统还在使用。 (2) 负责处理查询短信息的数据表。 (3) 不能够查询某条短信息的状态,只可以查询总体的情况! (4) 该表将的数目将不断增加。请在系统空闲的时候,备份或清除数据。 13.3.1 id(数据表主键)/*数据表主键*/ /* 自动按照次序增加。 也可以指定一个不重复的数值。 */ [id] [int] IDENTITY (1, 1) NOT NULL PRIMARY KEY, 13.3.2 query_time(查询时间)/*查询时间*/ /* 如果不不填写就是当前时间。 例如:20010101 */ [query_time] [char] (8) NULL , 13.3.3 query_type(查询类型)/*查询类型*/ /* 0 -- 按总数查询 1 -- 按业务代码查询 */ [query_type] [int] NOT NULL DEFAULT 0, 13.3.4 query_code(业务代码)/*业务代码*/ [query_code] [char] (10) NULL, 13.3.5 MT_TLMsg(从SP接收的信息总数)/*从SP接收的信息总数*/ [MT_TLMsg] [int] NOT NULL DEFAULT 0, 13.3.6 MT_TLUsr(从SP接收的用户总数)/*从SP接收的用户总数*/ [MT_TLUsr] [int] NOT NULL DEFAULT 0, 13.3.7 MT_Scs(成功转发数量)/*成功转发数量*/ [MT_Scs] [int] NOT NULL DEFAULT 0, 13.3.8 MT_WT(待转发数量)/*待转发数量*/ [MT_WT] [int] NOT NULL DEFAULT 0, 13.3.9 MT_FL(转发失败数量)/*转发失败数量*/ [MT_FL] [int] NOT NULL DEFAULT 0, 13.3.10 MO_Scs(向SP成功送达数量)/*向SP成功送达数量*/ [MO_Scs] [int] NOT NULL DEFAULT 0, 13.3.11 MO_WT(向SP待送达数量)/*向SP待送达数量*/ [MO_WT] [int] NOT NULL DEFAULT 0, 13.3.12 MO_FL(向SP送达失败数量)/*向SP送达失败数量*/ [MO_FL] [int] NOT NULL DEFAULT 0, 13.3.13 ih_process(事务处理过程)/*事务处理过程*/ /* 1. 用户插入时填写'insert_cmpp_query'。 2. 发送后,该字段变成'wait_for_response'。 3. 接收到正确响应之后,该字段变成'cmpp_query_success'。 */ [ih_process] [varchar] (64) NOT NULL DEFAULT 'insert_cmpp_query', 13.3.14 ih_gateway(网关标识)/*网关标识*/ /* 如果不填写该内容,那么系统将会自动选择一个网关将短信息发送出去。 所指定的网关名称必须与配置文件中所给的名称一致。 如果填写了错误的网关名称,程序将不会做出任何响应。 */ [ih_gateway] [varchar] (32) NOT NULL DEFAULT ‘’, 13.3.15 ih_session(会话标识)/*会话标识*/ /* 对应着每一个出口。 */ [ih_session] [int] NOT NULL DEFAULT 0, 13.3.16 ih_timestamp(时间标记)/*时间标记*/ /* 记录数据最后一次被更改的时间。 */ [ih_timestamp] [datetime] NOT NULL DEFAULT GetDate(),
|