Вызов функции Dynami c в php для шаблонов синтаксиса SMS Определение - PullRequest
0 голосов
/ 05 февраля 2020

Для проекта IoT Я показываю здесь на форуме Raspberry, я пытаюсь определить синтаксис для SMS-команд. Я начал со следующей структуры папок:

├── assets/
│   ├── css/ ...
│   └── js/ ...
│
│   
├── lib/
│   ├── modemClass.php
│   └── smsClass.php
├─ config.ini
│ 
└─ commands.php

, позволяющей опытным пользователям определять API своего оборудования и упрощать определение команд SMS, изменяя два файла:

config.ini для обновления глобальных констант, которые будут анализироваться при необходимости в phpClasses:

ip=192.168.1.xxx
timeZone=+1
pwd=admin
smsKey=MYPWD

команды. php: Вдохновленный из структуры wordpress (functions. php), этот файл будет разрешать настройку синтаксиса SMS и определение команд ...

require_once('lib/modemClass.php');
$modem=new Mifi;
$commands = array();
$commands['REBOOT']['PI']='rebootPi';
$commands['REBOOT']['MODEM']='rebootModem';
$commands['SEND']['EMAIL']='sendEmail';
$commands['SET']['LIGHT']='setLight';
$commands['SET']['GARAGE']='setGarage';
$commands['SEND']['TEMP']='sendTemperature';
function rebootModem(){
    echo 'Modem will reboot!';
}
function setGarage($args){
    echo 'Garage would become: '.$args;
}
function sendTemperature($modem){
    $modem=new Mifi;
    $modem->check_modem();
    $modem->send(<SENDERNUMBER>,"Pi checks Sensor  Welcome API !");
}

function setLight($args){
    $lg=explode("#",$args);
    echo 'Light would become "'.$lg[1].'" in the '.$lg[0];
}

function sendEmail($sms){
    $filter= preg_split("/[\s]+/", $sms);
    $clean = array($filter[0],$filter[1],$filter[2]);
    $email=explode("#",str_replace($clean,'',$sms));
    echo 'smsTomail('.$email[0].','.$email[1].','.$email[2].')';
    //smsToEmail($email[0],$email[1],$email[2]);
}

smsClass. php: будет обрабатывать синтаксический анализ, проверку и запускать соответствующее действие (функцию) для команды, после чего предопределенный синтаксис.

<?php
include (ROOT_PATH.'/commands.php');
class smsHandle
{
    public function __construct() {
       $this->conf = parse_ini_file(ROOT_PATH.'/config.ini', true);
    }    

    public function parseSms($sms,$commands){
        $filter= preg_split("/[\s]+/", strtoupper($sms),4);
        if($filter[0]==$this->conf['smsKey']){
        if(array_key_exists($filter[1], $commands)){
            if(array_key_exists($filter[2], $commands[$filter[1]])){
                $args = $filter[3] ?? null;
                $args=($filter[2]=='EMAIL') ? $sms : $args;            
                call_user_func_array($commands[$filter[1]][$filter[2]], array(&$args));
            } else{
                echo 'TARGET is not identified!';
            }
        } else {
            echo 'Action Identifier is not clear!';
        }  

        } else {
            echo 'Unknown COMMAND ! PLZ verify your Syntax';            
        }        
    }
}
?>

Упрощенный синтаксис команд sms будет следовать этому шаблону:

PASSWORD  SETACTION  TARGET  PARAMETERS/VALUES

И это может быть:

PASSWORD GET TARGET DATA

Некоторые электроны c команды могут логически ожидать дополнительные параметры (аргументы), а другие - нет! Итак, я подумал об использовании массива в качестве модели, чтобы проверить синтаксис и вернуть его функцию соответствия. Затем на неопределенных дополнительных уровнях я проверяю исключения ... И я позволяю соответствующей функции справляться с аномалиями. Как и в случае с электронной почтой, в котором предполагается, что его параметры будут разделены на #

В конце использования будет выглядеть следующим образом:

$modem->check_modem();
$hand=new smsHandle;
//$sms='MYPWD SEND TEMP';
$sms='MYPWD
SET
LIGHT  GARDEN#ON';
$hand->parseSms($sms,$commands);

Это работает! но если подумать о легкой настройке, расширяемом коде и производительности, то является ли правильным подход использовать динамический вызов функций c в php для определения синтаксиса команд? использование массивов ...

[ОБНОВЛЕНИЕ] Для пояснения представленный код не обрабатывает несколько команд. И модель может быть дополнена функциями, которые могут ожидать разные аргументы. Вопрос больше касается эффективности массивов для определения и проверки синтаксиса.

...