万维盈创W3100SM-S短信猫使用说明书,打开包装盒,这是网口的,带根网线,GSM天线,有张光盘,光盘里有这么个软件,如下图:
默认IP地址是:192.168.1.24,端口:1234。但这不是我想要的,我要用程序调用接口,或是DLL,或是协议发送。打电话给客服务。
客服MM告诉我:哥,咱们这款不支持接口的。
我:哦。
找技术,技术可以的,把协议发给我,等了好久邮箱里都没有收到,什么情况,然后在垃圾邮件中找到了。
短信发送格式 输入: 01113910013712你好abc。 意义: 0:数据类型为发送短信 11:对方号码长度为11位。 13910013712:对方号码。 你好abc:要发送的短信内容。 短信接收格式 输出: 01386135210003291404013113162432你好abc。 意义: 0:数据类型为收到短信,后面为短信相关内容。 13:发送方号码长度为13位。 8613521000329:发送方号码。 14:时间戳长度。 04013113162432:时间戳,表示发送时间为04年01月31日13点16分24秒,时区是32。 你好abc:收到的短信内容。 接收格式例子(十六进制): 30 00 31 00 33 00 38 00 36 00 31 00 35 00 39 00 31 00 31 00 30 00 37 00 30 00 33 00 38 00 32 00 31 00 34 00 31 00 33 00 30 00 31 00 32 00 34 00 31 00 31 00 32 00 38 00 33 00 34 00 33 00 32 00 31 00 32 00 33 00 61 00 62 00 63 00 60 4F 7D 59 接收报文:123abc你好(unicode编码格式为两个字节表示,如果为汉字,本身就是两个字节表示,如果是数字及字幕,则在转化为十六进制后用00补全两个字节)
告诉我要用十六进制发送,我问没有DEMO,我是个懒人呀,有DEMO可以省事不少。回答我没有,那好吧!我用TCP调试助手发,选择上十六进制,然后发送,很可惜,不成功,返回个4,手机也没有收到段信,当然这不是我的手机号,在这里我只是用了协议里的。
然后再问技术,技术说发送的时候也要如下这般(unicode编码格式为两个字节表示,如果为汉字,本身就是两个字节表示,如果是数字及字幕,则在转化为十六进制后用00补全两个字节),好吧,我服了,我做了一个很艰难的决定,自己搞定吧,不提供DEMO,自己动手丰衣足食。
/// <summary> /// 短信unicode编码格式转换 /// </summary> /// <param name="srcText"></param> /// <returns></returns> private string StringToUnicodeMode(string srcText) { string dst = ""; char[] src = srcText.ToCharArray(); for (int i = 0; i < src.Length; i++) { byte[] bytes = Encoding.Unicode.GetBytes(src[i].ToString()); string str = bytes[0].ToString("X2") +" "+ bytes[1].ToString("X2"); dst += str+" "; } return dst.TrimEnd(' '); } /// <summary> /// 收取到的编码转短信 /// </summary> /// <param name="srcText"></param> /// <returns></returns> private string UnicodeToStringMode(string srcText) { string dst = ""; string src = srcText.Replace(" ",""); int len = src.Length / 4; for (int i = 0; i <= len-1; i++) { string str = ""; str = src.Substring(0, 4); src = src.Substring(4); byte[] bytes = new byte[2]; bytes[0] = byte.Parse(int.Parse(str.Substring(0, 2), NumberStyles.HexNumber).ToString()); bytes[1] = byte.Parse(int.Parse(str.Substring(2, 2), NumberStyles.HexNumber).ToString()); dst += Encoding.Unicode.GetString(bytes); } return dst; }
这两种转换代码只适合在此使用,在别的地方用是不对的,正常的是不够两个字节在前面,这个是在后面补全的,所以在反过来转换的时候也要把顺序反过来。
这是按照协议的格式编码的,可以复制到剪切板,然后粘贴到TCP调试助手里,然后选中十六进制发送,一定要改成自己的手机码,要不你是收不到的,小心人家告你骚扰!