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 ...
随机推荐
- C# TypeConverter 数据转换
提供一种将值的类型转换为其他类型以及访问标准值和子属性的统一方法. 自定义Converter: public class GenericListTypeConverter<T> : Typ ...
- Installing Windows Identity Foundation on Windows 8 - The Certificate for the signer of the message is invalid or not found.
Just a very quick note here, in case you’re struggling to get Windows Identity Foundation installed ...
- 3 weekend110的job提交的逻辑及YARN框架的技术机制 + MR程序的几种提交运行模式
途径1: 途径2: 途径3: 成功! 由此,可以好好比较下,途径1和途径2 和途径3 的区别. 现在,来玩玩weekend110的joba提交的逻辑之源码跟踪 原来如此,weekend110的job提 ...
- Shell until循环
until 循环执行一系列命令直至条件为 true 时停止.until 循环与 while 循环在处理方式上刚好相反.一般while循环优于until循环,但在某些时候,也只是极少数情况下,until ...
- kafka consumer 分区reblance算法
转载请注明原创地址 http://www.cnblogs.com/dongxiao-yang/p/6238029.html 最近需要详细研究下kafka reblance过程中分区计算的算法细节,网上 ...
- 第一个小项目(天气预报软件)——称"酷狗天气"
一.创建数据库和表 分析: 二.遍历全国省市县数据 分析: 三.显示天气信息 分析: 四.切换城市和手动更新天气 分析: 五.后台自动更新天气 分析:
- 改变JVM中的参数以提高Eclipse的运行速度
首先建立评估体系,将workspace里所有的项目close掉,关闭eclipse.优化的用例就是启动eclipse,open一个项目,eclipse会自动build这个项目,保证没有感觉到明显的卡, ...
- CSS3之设计动态立体盒子
CSS3设计3D效果图 使用到CSS3中的变形.缩放.倾斜. 只写了兼容Gecto的.发张图片鼓励自己 <!DOCTYPE html> <html> <head> ...
- Chrome/Chromium HTML5 video 视频播放硬件加速
Chromium站点上有个大致的框图.描写叙述了Chromium的video在各个平台 - 包含Android - 上是怎样使用硬件资源来做视频编解码加速的: 而依据Android Kitkat上的C ...
- oracle本月、上月、去年同月第一天最后一天
select trunc(sysdate, 'month') 本月第一天, trunc(last_day(sysdate)) 本月最后一天, trunc(add_month ...