通过短信网关发送Wappush消息

  这一阵子工作内容比较杂,啥活都要干,这不,这两天公司需要通过sms短信网关,发送wappush消息。
因为已经有了另一个同事的工作基础,我所要作的就是使发送出去的消息尽量支持更多的手机型号。在网上搜关于wap和短信方面的资料,收获不多,而且不很具体。
最后经过不懈的努力,大量的试验,现在已经可以支持很多种机型了。如:索爱K750c, 索爱K700, MOTO A768, Nokia3230, Nokia6270。

下面这段介绍转自网上,已经不知道最初的作者是谁了:

--------------------------------------------------
基于短信网关发送WAP PUSH

WAP PUSH的发送有两种途径,一个是通过PPG网关,另外一个是通过SMPP协议。其中SMPP是一个基本协议,在中国主要有三个由其派生的协议:中国移动的CMPP协议,中国联通的SGIP(在CDMA上是ETIP),以及小灵通的SMGP。通过中国移动的PPG网关发送WAP PUSH有着开发周期长,调测流程较复杂等不足,而使用CMPP协议即基于短信网关来进行WAP PUSH发送灵活性比较高,相对比较简单。
--------------------------------------------------

我所使用的方式,就是通过中国移动的CMPP协议网关,发送wap push消息。消息格式整理如下:

1. 消息头,包含两部分,UDH和PUD,现在经过测试,有三种可以使用的包头数据.

 包头a:
  UDH: 06 05 04 0B 84 23 F0
  PUD: 01 06 03 AE 8D C4
 包头b:
  UDH: 0B 05 04 0B 84 23 F0 00 03 03 01 01
  PUD: 29 06 06 03 AE 81 EA 8D CA
 包头c:
  UDH: 06 05 04 0B 84 23 F0
  PUD: 81 06 06 03 AE 81 EA 8D 00

2. 消息体

 02
 05 //WAPFORUM//DTD SI 1.0//EN
 6A //UTF-8
 00 //字符串结束
 45 //<si>
 C6 //<indication
 08 //<action=signal-high>
 0C //href="http://"
 03 //字符串开始
 .... //URL字符串,要UTF8编码
 00 //字符串结束
 01 //>
 03 //字符串开始
 .... //内容描述字符串,要UTF8编码
 00 //字符串结束
 01 //</indication>
 01 //</si>


3.
生成消息包体后,要在PUD包头中设置包体的长度,PUD头中的最后一个字节表示包体的长度.

 PUD[len(PUD)-1] = len(BODY)/2 + 128;

4. 生成短信内容消息数据

 SMSDATA = UDH + PUD + BODY
 SMSDATA在短消息中作为消息内容

5. 短信息发送
 
 
使用CMPP协议向中国移动网关发送短消息时,要设定MsgFormat为4,表示数据是二进制格式.


6. 测试结果

 使用各种包头数据,所支持的手机型号不同.测试结果如下:
 包头a: 索爱K750c, Nokia3230, Nokia6270
 包头b: 索爱K750c, Nokia3230, Nokia6270, 多普达ppc696
 包头c: 索爱K750c, 索爱K700, MOTO A768, Nokia3230, Nokia6270

附1: 第三个包头的详细描述

 // UDH
 06 //User Data Header Length (6 bytes)
 05 //UDH Item Element id (Port Numbers)
 04 //UDH IE length (4 bytes)
 0B
 84 //destination port number
 23
 F0 //origin port number

 // PUD
 81 //transaction id (connectionless WSP)
 06 //pdu type (06=push)
 06 //Headers len
 03
 AE
 81
 EA //content type: application/vnd.wap.sic; charset=utf-8
 8D //content-length
 INT //body length


附2:封装的C++数据打包函数代码

BOOL GenWapPushMsg(const char *pszUrl,const char *pszInfo,char *pszData,int &nMsgLen)
{
 char szUTF8Url[256]={0},szUTF8Info[256]={0};
 if(!GB2UTF8((char*)pszUrl,szUTF8Url))
 {
  return FALSE;
 }
 
 if(!GB2UTF8((char*)pszInfo,szUTF8Info))
 {
  return FALSE;
 }

 // guanzhong 2006-2-22, 使用了第三个包头
 unsigned char szUDH[] = {0x06,0x05,0x04,0x0B,0x84,0x23,0xF0};
 unsigned char szPUD[] = {0x81,0x06,0x06,0x03,0xAE,0x81,0xEA,0x8D,0x00};
 // guanzhong

 unsigned char szMsg[280]={0};
 
 int nUDHLen = sizeof(szUDH);
 int nPUDLen = sizeof(szPUD);
 unsigned char *pszBody = szMsg + nUDHLen + nPUDLen;

 unsigned char *pszPos = pszBody;

 *pszPos++ = 0x02;;
 *pszPos++ = 0x05; //-//WAPFORUM//DTD SI 1.0//EN
 *pszPos++ = 0x6A; //UTF-8
 *pszPos++ = 0x00; //字符串结束
 *pszPos++ = 0x45; //<si>
 *pszPos++ = 0xC6; //<indication
 *pszPos++ = 0x08; //<action=signal-high>
 *pszPos++ = 0x0C; //href="http://"
 *pszPos++ = 0x03; //字符串开始
 strcpy((char*)pszPos,szUTF8Url);
 pszPos += strlen(szUTF8Url);

 *pszPos++ = 0x00; //字符串结束
 *pszPos++ = 0x01; //>
 *pszPos++ = 0x03; //字符串开始

 strcpy((char*)pszPos,szUTF8Info);
 pszPos += strlen(szUTF8Info);

 *pszPos++ = 0x00; //字符串结束
 *pszPos++ = 0x01; //</indication>"
 *pszPos++ = 0x01; //</si>

 //设置包体的长度
 //szPUD[nPUDLen-1] = pszPos-pszBody;
 // guanzhong 2006-3-3 修改,否则MOTO A768不能正常接收
 szPUD[nPUDLen-1] = (pszPos-pszBody)/2 + 128;

 memcpy(szMsg,szUDH,nUDHLen);
 memcpy(szMsg + nUDHLen,szPUD,nPUDLen);
 nMsgLen = pszPos - szMsg;

 memcpy(pszData,szMsg,nMsgLen);
 return TRUE;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: 要使用Java给网关发送数据,你可以使用MqttClient类来实现MQTT协议。首先,你需要引入Eclipse Paho MQTT客户端库,然后创建一个MqttClient对象并连接到网关的MQTT代理。接下来,你可以使用MqttMessage类创建一个包含你要发送的数据的消息对象,并使用MqttClient的publish方法将消息布到指定的主题上。以下是一个示例代码: ```java import org.eclipse.paho.client.mqttv3.*; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; public class GatewayDataSender { public static void main(String\[\] args) { String broker = "tcp://mqtt.example.com:1883"; // MQTT代理的地址 String clientId = "gateway-client"; // 客户端ID String topic = "gateway/data"; // 消息的主题 String payload = "{\"temperature\": 25, \"humidity\": 50}"; // 要发送的数据 try { MqttClient client = new MqttClient(broker, clientId, new MemoryPersistence()); MqttConnectOptions connOpts = new MqttConnectOptions(); connOpts.setCleanSession(true); client.connect(connOpts); MqttMessage message = new MqttMessage(payload.getBytes()); message.setQos(1); client.publish(topic, message); client.disconnect(); } catch (MqttException e) { e.printStackTrace(); } } } ``` 在上面的代码中,你需要将`broker`替换为你的MQTT代理的地址,`clientId`替换为你的客户端ID,`topic`替换为你要消息的主题,`payload`替换为你要发送的数据。然后,你可以运行这个代码来发送数据到网关。请确保你已经正确配置了MQTT代理的地址和主题。 #### 引用[.reference_title] - *1* *3* [利用tb gateway(网关)给thingsboard传json类型数据(mqtt协议 java实现,emqx消息中间件)](https://blog.csdn.net/weixin_46240244/article/details/127182392)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [java Feign远程调用,跳过网关gateway,网关数据丢失bug](https://blog.csdn.net/u010665359/article/details/110949264)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值