作者:mobiledu2502870073 | 来源:互联网 | 2018-03-25 06:25
需求: 发送短信到用户输入手机, 要求可以自定义信息内容
问题: 没有电信猫, 使用免费api接口无法自定义短信内容
解决方案: 通过4G网卡, 接在服务器上, 通过AT指令操作网卡, 发送短信
查阅发现, AT质量发送需要对信息进行多重编码, 而且发送超时, 但实际发送成功, 问题还未完全解决
代码如下:
1 php
2 send_message('8613800138000', '您好, 你正在申请注册服务平台, 您的验证码是: 97431');
3
4 function send_message($phone, $message) {
5 $phone = decode_phone($phone);
6
7 $message_center = decode_message_center('+8613010200500'); //此步骤似乎没用
8
9 $message = decode_message($message);
10
11 $length = get_message_length($phone, $message);
12
13 set_time_limit(0);
14
15 //根据情况选择COM口, 此处为COM4, 在管理设备中, 查看网络解调器的COM口
16
17 exec('mode COM4: baud=115200 data=8 stop=1 parity=n xon=on');
18
19 $fd = dio_open('COM4:', O_RDWR);
20
21 $ff = dio_stat($fd);
22
23 if (!$fd) {
24 die("failed open com4");
25 }
26
27 //chr(13)是回车, chr(16)是Ctrl+Z
28
29 dio_write($fd, "AT+CMGF=0" . chr(13)); //设置发送模式为PDU
30
31 dio_write($fd, "AT+CMGS=" . $length . chr(13)); //发送信息长度
32
33 dio_write($fd, '11000D91' . $phone . '000800' . $message . chr(26) . chr(13)); //发送短信息
34
35 sleep(2);
36
37 dio_close($fd);
38 }
39
40 function decode_phone($phone) {
41 $phone = str_replace('+', '', $phone);
42
43 if (strlen($phone) % 2 !== 0) {
44 $phone = $phone . 'F';
45 }
46
47 $newPhone = '';
48 for ($i = 0; $i <strlen($phone); $i += 2) {
49 $newPhone = $newPhone . substr($phone, $i + 1, 1) . substr($phone, $i, 1);
50 }
51
52 return $newPhone;
53 }
54
55 function decode_message_center($phone) {
56 $newPhone = '91' . decode_phone($phone);
57
58 $len = strtoupper(dechex(strlen($newPhone) / 2));
59
60 if (strlen($len) % 2 !== 0) {
61 $len = '0' . $len;
62 }
63
64 $newPhone = $len . $newPhone;
65
66 return $newPhone;
67 }
68
69 function decode_message($message) {
70 $newMessage = utf8_unicode($message);
71
72 $len = strtoupper(dechex(strlen($newMessage) / 2));
73
74 if (strlen($len) % 2 !== 0) {
75 $len = '0' . $len;
76 }
77
78 $newMessage = $len . $newMessage;
79
80 return $newMessage;
81 }
82
83 function utf8_unicode($name) {
84 $name = iconv('UTF-8', 'UCS-2', $name);
85 $len = strlen($name);
86 $str = '';
87
88 for ($i = 0; $i <$len - 1; $i = $i + 2) {
89 $c = $name[$i];
90 $c2 = $name[$i + 1];
91 if (ord($c) > 0) { //两个字节的文字
92 $str .= base_convert(ord($c), 10, 16) . str_pad(base_convert(ord($c2), 10, 16), 2, 0, STR_PAD_LEFT);
93 } else {
94 $str .= str_pad(base_convert(ord($c2), 10, 16), 4, 0, STR_PAD_LEFT);
95 }
96 }
97
98 $str = strtoupper($str); //转换为大写
99 return $str;
100 }
101
102 function get_message_length($phone, $message) {
103 $str = '11000D91' . $phone . '000800' . $message;
104
105 $length = strlen($str) / 2;
106
107 if ($length <10) {
108 $length = '0' . $length;
109 }
110
111 return $length;
112 }