PHP发送AT指令

需求: 发送短信到用户输入手机, 要求可以自定义信息内容

问题: 没有电信猫, 使用免费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 }
时间: 2024-10-19 21:15:45

PHP发送AT指令的相关文章

C语言通过串口发送AT指令

以下代码是通过串口发送AT指令: atcmd.c: #include <stdio.h> #include <string.h> #include "atcmd.h" static HANDLE hCom; static char com_name[32] = {0}; static int BaudRate; FILE *fp; int AT_ComOpen() { fp = fopen("debug.txt", "w"

老李分享:adb发送的指令都有哪些

老李分享:adb发送的指令都有哪些 这两天在poptest上课的时候,我们邀请了业内技术牛人为我们的学员讲解手机自动化方面的知识,每天大家都很踊跃,要学习到晚上11点多才能,有的学员跟我说都累傻了,呵呵. 下面把adb的指令和大家做一些分享. 发送返回键:adb shell input event 4     那么还有那些其他键呢? public class KeyEvent extends InputEvent implements Parcelable { /** Key code cons

Android实例-手机安全卫士(二十九)-接受安全号码发送的指令

一.目标 1.利用广播接收者接受安全号码发送的短信: 2.根据短信内容完成相应指令操作(此处暂以Toast形式代替).        二.代码实现 1.在receiver包下新建一个SMSReceiver类继承BroadcastReceiver,并在功能清单文件(AndroidManifest.xml)中的<application>内注册该receiver,名称为其全路径名称,意图过滤器(<intent-filter>)中设置优先级(android:priority)高一些(如10

jdk1.6 java语言 连接pcsc读卡器 发送APDU指令

java语言操作读卡器  jdk1.6 提供的Package javax.smartcardio可以直接连接pcsc读卡器.和读卡器进行指令交互 Package javax.smartcardio详细信息 http://docs.oracle.com/javase/6/docs/jre/api/security/smartcardio/spec/javax/smartcardio/package-summary.html java语言代码实例 /** *connectpcsc.java */ i

黄聪:发送键盘指令System.Windows.Forms.SendKeys.Send

若要指定在按键(如 Enter 或 Tab)时不显示的字符,以及表示操作而不表示字符的键,请使用下表中的代码: 键 代码 Backspace {BACKSPACE}.{BS} 或 {BKSP} Break {BREAK} Caps Lock {CAPSLOCK} Del 或 Delete {DELETE} 或 {DEL} 向下键 {DOWN} End {END} Enter {ENTER} 或 ~ Esc {ESC} Help {HELP} Home {HOME} Ins 或 Insert {I

【Android开发—智能家居系列】(四):UDP通信发送指令

思路回顾 [1]手机连接WIFI模块 [2]UDP通信对WIFI模块发送指令,以和WIFI模块保持连接状态 [3]UDP通信对WIFI模块发送指令,让其搜索可用的无线网,返回WIFI列表 [4]发送指令,让WIFI模块接入指定路由 [5]手机连接路由 [6]发送指令,获得WIFI模块的动态IP地址 UDP通信线程类 package com.jczb.smartlife.common; import java.io.IOException; import java.net.DatagramPack

9.PMAC上位机-上位机发送指令

通常我们说PC控制其他硬件工作,指的是PC给相应的硬件发送指令来控制对应硬件.同时在发送完指令后可能会接受到相对应的反馈消息,告诉PC当前硬件的状态和参数等数据,这就是常见的PC和硬件通信.PMAC已经帮我们封装好了这通信过程,直接调用相关函数即可,这里讲通过上位机给PMAC发送指令控制电机运动或设置参数或返回当前指定参数值等. PMAC提供PmacGetResponse和PmacGetResponseEX给PMAC发送指令.这一过程非常类似在Terminal中我们手动给PMAC发送指令,这里两

向串口连续发送指令,断点调试与直接运行不一致

向一个串口连续发送多条指令: private void OnOnebyOne(String[] str) { int i; String[] offstr = str; for (i = 0; i < offstr.Length; i++) { string oneoff = offstr[i]; Send(oneoff); } } 1.断点调试,逐步执行所有指令都可以执行. 2.直接运行,只执行第一条指令. 原因:如果串口设置的BaudRate是9600,那一个byte为需要的发送时间:1/9

学习笔记之邮件发送篇

用脚本语言发送邮件是系统管理员必备技能 对系统定期检查或者当服务器受到攻击时生成文档和报表. 发布这些文档最快速有效的方法就是发送邮件. python中email模块使得处理邮件变得比较简单 发送邮件主要用到了smtplib和email两个模块,这里首先就两个模块进行一下简单的介绍: 本段摘录于    http://www.cnblogs.com/xiaowuyi/archive/2012/03/17/2404015.html 1.smtplib模块 smtplib.SMTP([host[, p