<?php
use Workerman\Worker;
require_once __DIR__ . '/../../vendor/autoload.php';
require_once 'SQL/Connection.php';
use Workerman\Protocols\Http\Request;
use Workerman\Protocols\Http\Response;
use Workerman\Connection\TcpConnection;
//差分工具
//http://doc.openluat.com/chafen
$http_worker = new Worker("http://0.0.0.0:12303");
$http_worker->count = 1;
date_default_timezone_set('PRC');//设置时区,PRC是中华人民共和国
$http_worker->onWorkerStart = function($connection)
{
global $db;
$db = new \Workerman\MySQL\Connection('127.0.0.1','3306','root','999966--37@','GZD');
echo "Worker starting...\n";
};
//?project_key=OzRmBgUpxBrgsH2Z8biYi4s3AAhjpEkj&imei=866714043397909&firmware_name=LUAT_IOT_SERVER_UPDATE_Luat_RDA8910&core_version=17&dfota=1&version=1.0.0
$http_worker->onMessage = function(TcpConnection $connection, Request $request)
{
global $db;
$method = $request->method();
$imei = $request->get('imei', 'null');
if($imei != "null" && $method == "GET")
{
//echo($request->uri()."\n");
$project_key = $request->get('project_key', 'null');//终端当前参数
$firmware=$request->get('firmware', 'null');
$uid=$request->get('uid', 'null');
$time_t = date("Y/m/d H:i:s");
$firmware_t = $db->single("SELECT firmware FROM `Device_s` WHERE imei = '$imei'");//查询终端参数是否注册
if($firmware_t != null)//注册过,更新数据
{
if($firmware_t!=$firmware)//版本不等于服务器版本,升级成功@+1,更新参数
{
$db->query("UPDATE `Device_s` SET `update_flag`='0' WHERE imei = '$imei'");
$success_counts = $db->single("SELECT csq FROM `Device_s` WHERE imei = '$project_key'");
$success_counts = strval(intval($success_counts)+1);
$db->query("UPDATE `Device_s` SET `csq`='$success_counts' WHERE imei = '$project_key'");
}
$db->query("UPDATE `Device_s`
SET `project_key` = '$project_key',
`uid`= '$uid',
`firmware`='$firmware',
`datetime`= '$time_t'
WHERE imei = '$imei'");
//$firmware_t = $db->single("SELECT firmware FROM `Device_s` WHERE imei = '$project_key'");//查询更新计划@同一系类版本控制
$update_flag = $db->single("SELECT update_flag FROM `Device_s` WHERE imei = '$imei'");//查询终端参数是否允许升级
if($update_flag !="0")
{
if($update_flag == $project_key)$firmware_t = $db->single("SELECT firmware FROM `Device_s` WHERE imei = '$project_key'");//查询更新计划@同一系类版本控制
else $firmware_t=$update_flag;
$firmware_t= isset($firmware_t)==true ? $firmware_t : null;
if($firmware!= $firmware_t && $firmware_t != null && $update_flag!="0")
{
echo "准备升级\r\n".$firmware_t.".bin";
$response = (new Response())->withFile($firmware_t.".bin");
$connection->send($response);
}
}
else
{
echo "不用升级\r\n";
$connection->send(new Response(400));
}
}
else//未登记@要判断数据的合法性
{
$db->query("INSERT INTO `Device_s`(`imei`,`uid`,`project_key`,`firmware`,`datetime`)
VALUES ('$imei','$uid','$project_key','$firmware','$time_t')");
$connection->send(new Response(400));
}
}
else if($method == "POST")//其他协议数据
{
//echo $request->rawBody()."\r\n";
$message_data = json_decode($request->rawBody(), true);
$imei = isset($message_data['imei'])== true ? $message_data['imei'] : "null";
if($imei != "null")
{
$uid = isset($message_data['uid'])== true ? $message_data['uid'] : "null";
$ccid = isset($message_data['ccid'])== true ? $message_data['ccid'] : "null";
$location = isset($message_data['location'])== true ? $message_data['location'] : "null";
$csq = isset($message_data['csq'])== true ? $message_data['csq'] : "null";
//$firmware = isset($message_data['firmware'])== true ? $message_data['firmware'] : "null";
$time_t = date("Y/m/d H:i:s");
$uid_t = $db->single("SELECT uid FROM `Device_s` WHERE imei = '$imei'");//查询是否登记
if($uid_t != null)//更新参数
{
$db->query("UPDATE `Device_s`
SET `uid`= '$uid',
`ccid`='$ccid',
`location`='$location',
`csq`='$csq',
`datetime`= '$time_t'
WHERE imei = '$imei'"); //`firmware`='$firmware',
}
else//未首次登记@要判断数据的合法性
{
$db->query("INSERT INTO `Device_s`(`imei`,`uid`,`ccid`,`location`,`csq`,`firmware`,`datetime`)
VALUES ('$imei','$uid','$ccid','$location','$csq','$firmware','$time_t')");
}
}
}
};
$http_worker->onClose = function( $connection)
{
echo $connection->getRemoteIp()." closed\n";
};
Worker::runAll();
ime:模块唯一序列号;可以作为主键,不可更改;
prodect_key:产品类型,批量升级,版本控制可用;
uid:用户自定义设备号,可以修改;
fireware:终端当前固件版本;
csq:终端信号强度;
location:基站定位坐标,不是太准确;
ccid:终端物联网卡卡号;
update_flag:要升级的的固件名称;
datetime:终端更新表的时间。
代码测试实际可用,带负载能力,与workerman差不多,细节功能完善中,,,,未完待续