首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用GSM调制解调器在PHP中发送SMS

使用GSM调制解调器在PHP中发送SMS
EN

Stack Overflow用户
提问于 2014-01-11 05:45:07
回答 1查看 9.4K关注 0票数 3

我是PHP新手。我在最近的一个项目中工作,需要通过短信通知客户。我知道我们可以使用短信服务,但我的老板想试着用GSM调制解调器。是否可以使用GSM调制解调器发送SMS?任何教程都会很有帮助。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2018-05-31 21:21:53

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
you can use following code, it works on my gsm modem. its zyxel

<?php

//SMS via GSM Modem - A PHP class to send SMS messages via a GSM modem attached to the computers serial port.

//Windows only (tested on XP with PHP 5.2.6)
//Tested with the EZ863 (Telit GE863) GSM modementer code here
//Requires that PHP has permission to access "COM" system device, and system "mode" command

error_reporting(E_ALL);

//Example

$gsm_send_sms = new gsm_send_sms();
$gsm_send_sms->debug = false;
$gsm_send_sms->port = 'COM6';
$gsm_send_sms->baud = 19200;
$gsm_send_sms->init();

$status = $gsm_send_sms->send('09360403533', 'testing 123');
if ($status) {
    echo "Message sent\n";
} else {
    echo "Message not sent\n";
}



$gsm_send_sms->close();







//Send SMS via serial SMS modem
class gsm_send_sms {

    public $port = 'COM1';
    public $baud = 115200;

    public $debug = false;

    private $fp;
    private $buffer;

    //Setup COM port
    public function init() {

        $this->debugmsg("Setting up port: \"{$this->port} @ \"{$this->baud}\" baud");

        exec("MODE {$this->port}: BAUD={$this->baud} PARITY=N DATA=8 STOP=1", $output, $retval);

        if ($retval != 0) {
            throw new Exception('Unable to setup COM port, check it is correct');
        }

        $this->debugmsg(implode("\n", $output));

        $this->debugmsg("Opening port");

        //Open COM port
        $this->fp = fopen($this->port . ':', 'r+');

        //Check port opened
        if (!$this->fp) {
            throw new Exception("Unable to open port \"{$this->port}\"");
        }

        $this->debugmsg("Port opened");
        $this->debugmsg("Checking for responce from modem");

        //Check modem connected
        fputs($this->fp, "AT\r");

        //Wait for ok
        $status = $this->wait_reply("OK\r\n", 5);

        if (!$status) {
            throw new Exception('Did not receive responce from modem');
        }

        $this->debugmsg('Modem connected');

        //Set modem to SMS text mode
        $this->debugmsg('Setting text mode');
        fputs($this->fp, "AT+CMGF=1\r");

        $status = $this->wait_reply("OK\r\n", 5);

        if (!$status) {
            throw new Exception('Unable to set text mode');
        }

        $this->debugmsg('Text mode set');

    }

    //Wait for reply from modem
    private function wait_reply($expected_result, $timeout) {

        $this->debugmsg("Waiting {$timeout} seconds for expected result");

        //Clear buffer
        $this->buffer = '';

        //Set timeout
        $timeoutat = time() + $timeout;

        //Loop until timeout reached (or expected result found)
        do {

            $this->debugmsg('Now: ' . time() . ", Timeout at: {$timeoutat}");

            $buffer = fread($this->fp, 1024);
            $this->buffer .= $buffer;

            usleep(200000);//0.2 sec

            $this->debugmsg("Received: {$buffer}");

            //Check if received expected responce
            if (preg_match('/'.preg_quote($expected_result, '/').'$/', $this->buffer)) {
                $this->debugmsg('Found match');
                return true;
                //break;
            } else if (preg_match('/\+CMS ERROR\:\ \d{1,3}\r\n$/', $this->buffer)) {
                return false;
            }

        } while ($timeoutat > time());

        $this->debugmsg('Timed out');

        return false;

    }

    //Print debug messages
    private function debugmsg($message) {

        if ($this->debug == true) {
            $message = preg_replace("%[^\040-\176\n\t]%", '', $message);
            echo $message . "\n";
        }

    }

    //Close port
    public function close() {

        $this->debugmsg('Closing port');
        var_dump($this->fp);
        fclose($this->fp);

    }

    //Send message
    public function send($tel, $message) {
        //Filter tel
        $tel = preg_replace("%[^0-9\+]%", '', $tel);

        //Filter message text
        //$message = preg_replace("%[^\040-\176\r\n\t]%", '', $message);

        $this->debugmsg("Sending message \"{$message}\" to \"{$tel}\"");

        //Start sending of message
        fputs($this->fp, "AT+CMGS=\"{$tel}\"\r");

        //Wait for confirmation
        $status = $this->wait_reply("\r\n> ", 5);

        if (!$status) {
            //throw new Exception('Did not receive confirmation from modem');
            $this->debugmsg('Did not receive confirmation from modem');
            return false;
        }

        //Send message text
         fputs($this->fp, $message);


        //Send message finished indicator
        fputs($this->fp, chr(26));

        //Wait for confirmation
        $status = $this->wait_reply("OK\r\n", 180);

        if (!$status) {
            //throw new Exception('Did not receive confirmation of messgage sent');
            $this->debugmsg('Did not receive confirmation of messgage sent');
            return false;
        }

        $this->debugmsg("Message sent");

        return true;

    }

}

?>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21058973

复制
相关文章
Winform 中 DesignMode 返回值不正确的问题。
本文转载:http://blog.csdn.net/sabty/article/details/5325260
跟着阿笨一起玩NET
2018/09/18
1.6K0
js --- return返回值 闭包
有权访问另一个函数作用域内变量的函数都是闭包。这里 inc 函数访问了构造函数 a 里面的变量 n,所以形成了一个闭包。
小蔚
2019/09/11
4.4K0
Go:命名返回值和直接返回值的使用与潜在隐患
在这个例子中,虽然给命名返回值result赋值了,但最终函数却直接返回了a + b的计算结果,而不是result的值。
运维开发王义杰
2023/08/21
3200
Go:命名返回值和直接返回值的使用与潜在隐患
带返回值的函数,闭包,沙箱,递归详解
那了解了函数 this 指向的不同场景之后,我们知道有些情况下我们为了使用某种特定环境的 this 引用, 这时候时候我们就需要采用一些特殊手段来处理了,例如我们经常在定时器外部备份 this 引用,然后在定时器函数内部使用外部 this 的引用。 然而实际上对于这种做法我们的 JavaScript 为我们专门提供了一些函数方法用来帮我们更优雅的处理函数内部 this 指向问题。 这就是接下来我们要学习的 call、apply、bind 三个函数方法。
Dream城堡
2018/10/09
1.9K0
toupper和tolower的返回值是int型值
如题,C++中函数库<cctype>定义了函数toupper和tolower,需要注意的是它们的返回值是int型的。直接上程序
用户7886150
2021/02/09
9000
Gorm Update 返回的影响条数不正确问题
Gorm 连接 mysql 使用的是 github.com/go-sql-driver/mysql 驱动, 但是这个驱动中 clientFoundRows 默认是 false, 也就是说返回的影响条数是实际的影响条数, 而不是匹配的条数, 也就是说如果要修改的数据和表中数据一样, 就不会返回影响条数, 这和 mysql 官方不一致
北漂的我
2021/11/25
2.5K0
scala:把函数作为值或参数进行传递、作为返回值进行返回,以及什么是闭包和柯里化
内层函数访问外层函数的局部变量,会自动延长外层函数局部变量的生命周期,与内层函数形成一个闭合的效果,我们称之为闭包
孙晨c
2021/02/25
1.9K0
Go语言函数的参数和返回值
第一类对象(first-class object)指可在运行期创建,可用作函数参数或返回值,可存入变量的实体。最常见的用法就是匿名函数。
博文视点Broadview
2020/06/12
2.5K0
Go语言函数的参数和返回值
一道正确率只有15%的命名返回值和闭包的问题
这道题考查的点就是命名返回值+闭包,把上面的代码换成等效的匿名返回值代码你就明白了:
Golang梦工厂
2022/07/11
5450
Go 100 mistakes之不正确的值比较
我们从一个具体的例子开始。我们将创建一个customer结构体,并使用 == 操作符来比较两个实例。下面的代码将会输出什么呢?
Go学堂
2023/01/31
1.1K0
HarmonyOS实战—滑动事件的坐标和返回值
1. 滑动事件获取手指位置 滑动事件的三个动作: [在这里插入图片描述] 获取手指的位置就涉及到坐标的概念,通过获取到 x、y、z就可以缺任意一个点的位置 [在这里插入图片描述] 手机中的坐标: [在这里插入图片描述] 除了 x、y轴,还有z轴,在鸿蒙手机当中,完整的坐标如下,是一个立体的三维体系,但平时z轴用的非常少,一般情况只需考虑x、y轴就行了。 [在这里插入图片描述] 结合滑动事件的三个动作和坐标来分析滑动 [在这里插入图片描述] [在这里插入图片描述] [在这里插入图片描述] 2. 获取按下时手指
兮动人
2021/08/23
1.1K0
HarmonyOS实战—滑动事件的坐标和返回值
Java 遍历对象的属性和值,封装返回 Map
有时候需要获取对象的属性值,属性少的话就好设置了,属性一多就不好设置了。 我们可以通过反射来遍历 UpdateWeb updateWeb = new UpdateWeb(); Field[] fields = updateWeb.getClass().getDeclaredFields(); for (Field field : fields){ field.setAccessible(true); String
Alone88
2019/11/11
7.6K0
ExecuteScalar()_getchar的返回值
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说ExecuteScalar()_getchar的返回值,希望能够帮助大家进步!!!
Java架构师必看
2022/06/19
1.7K0
[Python基础06]函数的参数&返回值
我们通常在进行一些功能处理的过程中,需要执行一行或者多行代码来完成整个业务流程的处理,如:
周小董
2022/04/12
4K0
[Python基础06]函数的参数&返回值
printf函数的返回值!
这样的题目第一眼看上去有一点懵,其实它考的就是printf函数的返回值,及输出字符的个数。 输出结果
lexingsen
2022/02/24
3.3K0
返回指针值的函数(2)
请自己理解,比较简单 /**对前面那个问题,输出有不及格成绩的学生的所有成绩**/ #include <stdio.h> #include <stdlib.h> int main() { float a[3][4]={{50,99,80,50},{55,60,85,90},{10,54,74,26}}; float *p; float *aa(float (*pt)[4]); int i; for(i=0;i<3;i++) { p=aa((
谙忆
2021/01/19
2.7K0
JS|函数的返回值
这个看似能输出结果,实则是在逻辑上是不合理的,我们函数是做某件事或者实现某种功能,而在上面的代码中,函数提供了‘aru’,结果自己却把该参数给输出了。这好比是鸡生了蛋,自己却把蛋给吃了。那我们吃蛋壳吗?所以,接下来我会介绍一种逻辑更严谨的代码。
算法与编程之美
2020/03/12
11.4K0
ExecuteScalar 返回值
Execute=执行; scalar=数量; so, 从字面意思来讲,可将ExecuteScalar 和ExecuteNonQuery对比来学习。 ExecuteScalar()方法的作用是: 执行查询,并返回查询所返回的结果集中第一行的第一列。所有其他的列和行将被忽略。
全栈程序员站长
2022/09/14
1.9K0
函数的变量+返回值
函数的变量: 局部变量 和 全局变量 Python中的任何变量都有特定的作用域 在函数中定义的变量一般只能在该函数内部使用,这些只能在程序的特定部分使用的变量我们称之为局部变量 在一个文件顶部定义的变量可供文件中的任何函数调用,这些可以为整个程序所使用的变量称为全局变量 (1)、局部函数: #!/usr/bin/python def fun(): x = 100 ##定义一个内部的函数是 x = 100,只在fun() 内部有效。 print x fun() 执行结果: [[e
老七Linux
2018/05/31
4.9K0
controller方法的返回值
需要方法结束时,定义ModelAndView,将model和view分别进行设置。
用户10325771
2023/03/14
2K0
controller方法的返回值

相似问题

雪碧包和colorWithPatternImage

31

雪碧包归还?

50

雪碧的位置不正确

24

雪碧工具包-如何移动雪碧?

12

iAds禁用触动雪碧包和Swift

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文