PHP发送AT指令
需求: 发送短信到用户输入手机, 要求可以自定义信息内容
问题: 没有电信猫, 使用免费api接口无法自定义短信内容
解决方案: 通过4G网卡, 接在服务器上, 通过AT指令操作网卡, 发送短信
查阅发现, AT质量发送需要对信息进行多重编码, 而且发送超时, 但实际发送成功, 问题还未完全解决
代码如下:
<?php
send_message('8613800138000', '您好, 你正在申请注册服务平台, 您的验证码是: 97431'); function send_message($phone, $message) {
$phone = decode_phone($phone); $message_center = decode_message_center('+8613010200500'); //此步骤似乎没用 $message = decode_message($message); $length = get_message_length($phone, $message); set_time_limit(0); //根据情况选择COM口, 此处为COM4, 在管理设备中, 查看网络解调器的COM口 exec('mode COM4: baud=115200 data=8 stop=1 parity=n xon=on'); $fd = dio_open('COM4:', O_RDWR); $ff = dio_stat($fd); if (!$fd) {
die("failed open com4");
} //chr(13)是回车, chr(16)是Ctrl+Z dio_write($fd, "AT+CMGF=0" . chr(13)); //设置发送模式为PDU dio_write($fd, "AT+CMGS=" . $length . chr(13)); //发送信息长度 dio_write($fd, '11000D91' . $phone . '000800' . $message . chr(26) . chr(13)); //发送短信息 sleep(2); dio_close($fd);
} function decode_phone($phone) {
$phone = str_replace('+', '', $phone); if (strlen($phone) % 2 !== 0) {
$phone = $phone . 'F';
} $newPhone = '';
for ($i = 0; $i < strlen($phone); $i += 2) {
$newPhone = $newPhone . substr($phone, $i + 1, 1) . substr($phone, $i, 1);
} return $newPhone;
} function decode_message_center($phone) {
$newPhone = '91' . decode_phone($phone); $len = strtoupper(dechex(strlen($newPhone) / 2)); if (strlen($len) % 2 !== 0) {
$len = '0' . $len;
} $newPhone = $len . $newPhone; return $newPhone;
} function decode_message($message) {
$newMessage = utf8_unicode($message); $len = strtoupper(dechex(strlen($newMessage) / 2)); if (strlen($len) % 2 !== 0) {
$len = '0' . $len;
} $newMessage = $len . $newMessage; return $newMessage;
} function utf8_unicode($name) {
$name = iconv('UTF-8', 'UCS-2', $name);
$len = strlen($name);
$str = ''; for ($i = 0; $i < $len - 1; $i = $i + 2) {
$c = $name[$i];
$c2 = $name[$i + 1];
if (ord($c) > 0) { //两个字节的文字
$str .= base_convert(ord($c), 10, 16) . str_pad(base_convert(ord($c2), 10, 16), 2, 0, STR_PAD_LEFT);
} else {
$str .= str_pad(base_convert(ord($c2), 10, 16), 4, 0, STR_PAD_LEFT);
}
} $str = strtoupper($str); //转换为大写
return $str;
} function get_message_length($phone, $message) {
$str = '11000D91' . $phone . '000800' . $message; $length = strlen($str) / 2; if ($length < 10) {
$length = '0' . $length;
} return $length;
}
PHP发送AT指令的更多相关文章
- 老李分享:adb发送的指令都有哪些
老李分享:adb发送的指令都有哪些 这两天在poptest上课的时候,我们邀请了业内技术牛人为我们的学员讲解手机自动化方面的知识,每天大家都很踊跃,要学习到晚上11点多才能,有的学员跟我说都累傻了 ...
- AT Tool --- android手机发送at指令
之前网上也有一款类似的软件,估计是华为内部人员开发的,不过很变态,不但只支持华为的几款手机,而且只能发一条AT命令,然后就不让你发了:所以很气愤,今天花了一天时间自己写了这么款程序,而且是支持所有An ...
- 【嵌入式】arduino IDE串口监视器可以正常使用但其他软件发送串口指令没有反应的问题
解决办法: 1.检查 波特率baudrate 是否一致 2.检查 数据位长度databits 是否一致 3.检查 停止位长度stopbits 是否一致 4.检查 奇偶校验位 是否一致 5.(特殊)是否 ...
- 黄聪:发送键盘指令System.Windows.Forms.SendKeys.Send
若要指定在按键(如 Enter 或 Tab)时不显示的字符,以及表示操作而不表示字符的键,请使用下表中的代码: 键 代码 Backspace {BACKSPACE}.{BS} 或 {BKSP} B ...
- 【Android开发—智能家居系列】(四):UDP通信发送指令
思路回顾 [1]手机连接WIFI模块 [2]UDP通信对WIFI模块发送指令,以和WIFI模块保持连接状态 [3]UDP通信对WIFI模块发送指令,让其搜索可用的无线网,返回WIFI列表 [4]发送指 ...
- ESP8266MOD、刷可以使用AT指令的固件、作为客户端向贝壳云端发送固定数据
硬件部分 1. ESP8266MOD 2. Micro USB数据线一根 实物图:(小灯不必) 硬件准备好之后,直接用数据线连接到电脑即可,然后找到所对应的COM口,记下来备用! 为ESP8266刷A ...
- 【转】C#使用ESC指令控制POS打印机打印小票
.前言 C#打印小票可以与普通打印机一样,调用PrintDocument实现.也可以发送标注你的ESC指令实现.由于 调用PrintDocument类时,无法操作使用串口或TCP/IP接口连接的pos ...
- 关于XE10下Indy发送字符串编码的问题
在与硬件对接的过程中,之前用D7环境下的UDPServer.Post发送的指令,硬件可正常识别并正常显示, 后来使用到XE10,重新编译之前的源码,发现所有汉字乱码显示了: 后通过对接收数据发现,实际 ...
- C#使用ESC指令控制POS打印机打印小票
1.前言 C#打印小票可以与普通打印机一样,调用PrintDocument实现.也可以发送标注你的ESC指令实现.由于 调用PrintDocument类时,无法操作使用串口或TCP/IP接口连接的po ...
随机推荐
- HTML5 Canvas核心技术—图形、动画与游戏开发.pdf7
性能 运行putImageData()比drawImage()慢,同等条件下优先考虑drawImage() 操作图像数据需要遍历大量数据,应该注意几点: 1)避免在循环体中直接访问对象属性,应当保存在 ...
- (转载)TRS的WCM6漏洞权限绕过以及绕过密码的登陆方式
转载于:http://www.2cto.com/Article/201302/191261.html 1.由来:建立在 TRS的WCM6可直接获取管理员密码 漏洞的基础上 2.首先访问wcm目录, ...
- wxWidgets一个界面与数据分离的简单例子
/*************************************************************** * Name: MyApp.h * Purpose: Defines ...
- Linux方向职业规划
Linux方向职业分析 引言: 据了解,Linux普通网络管理人员的月薪大约5000元左右,负责编程的Linux软件工程师月薪大约在8000元到12000元之间,Linux嵌入式软件开发人员的月薪大约 ...
- Why do we need smart pointer and how to implement it.
Here are two simple questions. Problem A #include <string> include <iostream> using name ...
- opencv Installation in Linux and hello world
http://opencv.org/quickstart.html Installation in Linux These steps have been tested for Ubuntu 10.0 ...
- 广州Uber优步司机奖励政策(2月1日~2月7日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 使用int?来确保值类型也可以为null
基元类型为什么需要为null?考虑两个场景: 1)数据库中一个int字段可以被设置为null.在C#中,值被取出来后,为了将它赋值给int类型,不得不首先判断一下它是否为null.如果将null直接赋 ...
- hdoj 1509 Windows Message Queue【优先队列】
Windows Message Queue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- linux 下信号处理命令trap && linux下各种信号的意义
1.用途说明 trap是一个shell内建命令,它用来在脚本中指定信号如何处理.比如,按Ctrl+C会使脚本终止执行,实际上系统发送了SIGINT信号给脚本进程,SIGINT信号的默认处理方式就是退出 ...