关于合宙luat开发ota(远程升级)自建服务器的说明---服务器端100多行代码搞定

<?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差不多,细节功能完善中,,,,未完待续

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值