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

问题: 没有电信猫, 使用免费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指令的更多相关文章

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

    老李分享:adb发送的指令都有哪些   这两天在poptest上课的时候,我们邀请了业内技术牛人为我们的学员讲解手机自动化方面的知识,每天大家都很踊跃,要学习到晚上11点多才能,有的学员跟我说都累傻了 ...

  2. AT Tool --- android手机发送at指令

    之前网上也有一款类似的软件,估计是华为内部人员开发的,不过很变态,不但只支持华为的几款手机,而且只能发一条AT命令,然后就不让你发了:所以很气愤,今天花了一天时间自己写了这么款程序,而且是支持所有An ...

  3. 【嵌入式】arduino IDE串口监视器可以正常使用但其他软件发送串口指令没有反应的问题

    解决办法: 1.检查 波特率baudrate 是否一致 2.检查 数据位长度databits 是否一致 3.检查 停止位长度stopbits 是否一致 4.检查 奇偶校验位 是否一致 5.(特殊)是否 ...

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

    若要指定在按键(如 Enter 或 Tab)时不显示的字符,以及表示操作而不表示字符的键,请使用下表中的代码:   键 代码 Backspace {BACKSPACE}.{BS} 或 {BKSP} B ...

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

    思路回顾 [1]手机连接WIFI模块 [2]UDP通信对WIFI模块发送指令,以和WIFI模块保持连接状态 [3]UDP通信对WIFI模块发送指令,让其搜索可用的无线网,返回WIFI列表 [4]发送指 ...

  6. ESP8266MOD、刷可以使用AT指令的固件、作为客户端向贝壳云端发送固定数据

    硬件部分 1. ESP8266MOD 2. Micro USB数据线一根 实物图:(小灯不必) 硬件准备好之后,直接用数据线连接到电脑即可,然后找到所对应的COM口,记下来备用! 为ESP8266刷A ...

  7. 【转】C#使用ESC指令控制POS打印机打印小票

    .前言 C#打印小票可以与普通打印机一样,调用PrintDocument实现.也可以发送标注你的ESC指令实现.由于 调用PrintDocument类时,无法操作使用串口或TCP/IP接口连接的pos ...

  8. 关于XE10下Indy发送字符串编码的问题

    在与硬件对接的过程中,之前用D7环境下的UDPServer.Post发送的指令,硬件可正常识别并正常显示, 后来使用到XE10,重新编译之前的源码,发现所有汉字乱码显示了: 后通过对接收数据发现,实际 ...

  9. C#使用ESC指令控制POS打印机打印小票

    1.前言 C#打印小票可以与普通打印机一样,调用PrintDocument实现.也可以发送标注你的ESC指令实现.由于 调用PrintDocument类时,无法操作使用串口或TCP/IP接口连接的po ...

随机推荐

  1. Oracle Statspack报告中各项指标含义详解~~学习性能必看!!!

    Oracle Statspack报告中各项指标含义详解~~学习性能必看!!! Data Buffer Hit Ratio#<#90# 数据块在数据缓冲区中的命中率,通常应该在90%以上,否则考虑 ...

  2. VMware设置虚拟机,并配置远程连接桌面

    现在需要使用VMware虚拟出几个window7的机器,用来跑自动化测试. 在配置虚拟机的时候遇到了几个问题: 问题1:虚拟机无法与外界机器通信.(可ping通过). 问题2:外界机器无法链接虚拟机的 ...

  3. Ubuntu全新系统一些配置

    0.安装JDK,http://www.oracle.com/technetwork/java/javase/downloads/index.html 1.安装Intellij IDEA,https:/ ...

  4. [学习笔记]设计模式之Factory Method

    写在前面 为方便读者,本文已添加至索引: 设计模式 魔法手札索引 在上篇笔记Abstract Factory设计模式中,时の魔导士创建了一系列的FoodFactory,并教会了其中一名霍比特人theC ...

  5. nginx日志格式含义

  6. selenuim +python环境配置遇到的诸多问题

    自动化测试入门,总结一下安装selenium.python以及配置webdriver遇到的问题: 准备工作: 1.下载火狐浏览器并安装插件selenium IDE.Firebug~~ 2.下载安装py ...

  7. DevExpress 用户控件 分页(中)

    说明: 1)具体调用请关注 看DevExpress 用户控件 分页(下) datanavi_ButtonClick 是DataNavigator的ButtonClikc事件 视图设计器: 分页用户控件 ...

  8. Winform 换皮肤

    winform换肤流程如下: (1)程序入口,添加以下代码: //换肤 private void Skinjsj() { DevExpress.UserSkins.BonusSkins.Registe ...

  9. 通过rest接口获取自增id (twitter snowflake算法)

    1.  算法介绍 参考 http://www.lanindex.com/twitter-snowflake%EF%BC%8C64%E4%BD%8D%E8%87%AA%E5%A2%9Eid%E7%AE% ...

  10. 【Java】通过DES加密和解密工具,对字符串进行加密和解密操作

    分享一个非常不错的字符串加密和解密的程序. 可以指定不同的密钥对同一字符串进行不同的加密操作,增强加密性能. Java代码如下: package com.app; import java.securi ...