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