Commit a656beef by banice

nb下发开始充电成功

parent eb1d1234
......@@ -38,8 +38,9 @@ $app->configure('auth');
$app->configure('database');
$app->withFacades();
$app->configure('iot');
$app->withFacades();
$app->withEloquent();
......
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/9/29
* Time: 上午10:34
*/
return [
'cert_path' => storage_path('cert/key.pem'),
'password' => 'IoM@1234',
'host' => 'https://180.101.147.89:8743/',
'app_key' => 'tWVEY6ruJIYnQ1XdadMZHU9IR0sa',
];
<?php
namespace Lib;
class Crc
{
const CRC_TABLE = [
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
];
/**
* @param $data
* @return int
*/
public static function crc($data)
{
$crc = 0xffffffff;
$size = strlen($data);
for ($i = 0; $i < $size; $i += 2) {
$numHex = substr($data, $i, 2);
$number = hexdec($numHex);
$tmp = ($crc ^ $number) & 0xff;
$crcRightMove = (hexdec(sprintf("%08x", $crc >> 8)));
$crc = ($crcRightMove) ^ (self::CRC_TABLE[$tmp]);
}
return $crc ^ 0xffffffff;
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/11/2
* Time: 下午8:48
*/
namespace Lib;
use GuzzleHttp\Client;
use Lib\iot\AccessToken;
use Illuminate\Support\Facades\Log;
class IotGateway
{
public static $appId = '';
public static $deviceId = '';
public static $command = '';
public static $expireTime = 0;
public static $maxRetransmit = 1;
private static function init()
{
static::$appId = env('IOT_APP_ID');
}
public static function bindUid(string $clientId, string $uid)
{
}
public static function sendToClient(string $clientId, string $message)
{
Log::debug('send message' . $message);
$client = new Client();
$request = [
'verify' => false,
'cert' => [
config('iot.cert_path'),
'IoM@1234',
]
];
$request['headers'] = [
'app_key' => env('IOT_APP_ID'),
'Authorization' => 'Bearer ' . AccessToken::getAccessTokenCache(),
'Content-Type' => 'application/json',
];
// 'appId' => env('IOT_APP_ID'),
$request['json'] = [
'deviceId' => $clientId,
'command' =>
['serviceId' => 'Transmission',
'method' => 'Cmd_Res',
'paras' => ['downData' => strtoupper($message)],
],
'expireTime' => static::$expireTime,
'maxRetransmit' => static::$maxRetransmit
];
Log::debug('response = ' . $message);
$response = $client->request('POST', config('iot.host') . 'iocm/app/cmd/v1.4.0/deviceCommands', $request);
if ($response->getStatusCode() === 201) {
return true;
}
return false;
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/9/29
* Time: 下午2:27
*/
namespace Lib;
class ToHex
{
public static function toHex(int $data, int $length): string
{
return sprintf('%0' . $length * 2 . 'x', $data);
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/8/29
* Time: 上午10:25
*/
namespace Lib;
class Tool
{
public static function padding($data, $length)
{
$length *= 2;
return sprintf('%0' . $length . 'x', $data);
}
}
\ No newline at end of file
......@@ -14,6 +14,7 @@ use Lib\balance\BalanceOrder;
use Lib\balance\charger\handle\fail\StopChargerHandle;
use Lib\balance\charger\HandleClient;
use Lib\gateway\Gateway;
use Lib\IotGateway;
use Lib\order_exception\OrderState;
use Lib\send\command\BalanceChargerCommand;
use Lib\send\command\ChargerCommand;
......@@ -51,23 +52,39 @@ class ChargerHandle extends Handle
$gatewayModel = GatewayModel::find($gatewayId);
$gatewayType = $gatewayModel->type_id;
$nbDeviceId = $gatewayModel->nb_device_id;
$sendResult = false;
if ($gatewayType === 5) {
$chargerCommand = new \Lib\iot\command\ChargerCommand();
$chargerCommand->setOrderId($balanceOrder->getOrderId());
$chargerCommand->setTime($balanceOrder->getTime());
$chargerCommand->setType(1);
$chargerCommand->setPortLogic($portLogicNum);
$send = new \Lib\iot\command\Send($chargerCommand);
$chargerCommand->setServiceId(time() . rand(10000, 99999));
$chargerCommand->setPortLogic(0);
$chargerCommand->organizeMessage();
$send = $chargerCommand;
if (IotGateway::sendToClient($nbDeviceId, $chargerCommand->getMessage())) {
Log::debug('send nb charger command success');
$sendResult = true;
} else {
Log::error('send nb charger fail');
};
} else {
$balanceChargerCommand = new BalanceChargerCommand($balanceOrder);
$send = new Send($balanceChargerCommand);
$sendResult = $send->send();
}
if ($send->send() === true) {
if ($sendResult) {
DB::table('gateway_log')->insert([
'gateway_id' => $balanceOrder->getGatewayId(),
......
......@@ -9,7 +9,7 @@
namespace Lib\iot;
use Illuminate\Support\Facades\Cache;
use Lib\redis\RedisSingle;
use Psr\Http\Message\ResponseInterface;
class AccessToken implements Request
......@@ -60,24 +60,32 @@ class AccessToken implements Request
$this->accessToken = $body['accessToken'];
$expiresLn = $body['expiresIn'];
$this->refreshToken = $body['refreshToken'];
Cache::put(self::ACCESS_CACHE_KEY, $this->accessToken, $expiresLn / 60);
Cache::put(self::REFRESH_ACCESS_CACHE_KEY, $this->refreshToken, 25 * 24 * 60);
$redis = RedisSingle::getRedis();
if ($redis instanceof \Redis) {
$redis->set(self::ACCESS_CACHE_KEY, $this->accessToken, $expiresLn);
$redis->set(self::REFRESH_ACCESS_CACHE_KEY, $this->refreshToken, 25 * 24 * 60);
}
}
public static function getAccessTokenCache()
{
// Cache::forget(self::ACCESS_CACHE_KEY);
// Cache::forget(self::REFRESH_ACCESS_CACHE_KEY);
if (Cache::has(self::ACCESS_CACHE_KEY) === true) {
$redis = RedisSingle::getRedis();
// $redis->del(self::ACCESS_CACHE_KEY);
// $redis->del(self::REFRESH_ACCESS_CACHE_KEY);
if ($redis->exists(self::ACCESS_CACHE_KEY) == true) {
return Cache::get(self::ACCESS_CACHE_KEY);
} else if (Cache::has(self::REFRESH_ACCESS_CACHE_KEY) === true) {
return $redis->get(self::ACCESS_CACHE_KEY);
} else if ($redis->exists(self::REFRESH_ACCESS_CACHE_KEY) === true) {
//todo refresh 换取token 并缓存新的token和新的refresh
$refreshToken = new RefreshToken();
$refreshToken->setRefreshToken(Cache::get(self::REFRESH_ACCESS_CACHE_KEY));
$refreshToken->setRefreshToken($redis->get(self::REFRESH_ACCESS_CACHE_KEY));
$iotClient = new IotClient($refreshToken);
if ($iotClient->request() === true) {
$response = $iotClient->getResponse();
......
......@@ -27,8 +27,12 @@ class ChargerCommand extends Command
public function organizeMessage()
{
$nonce = ToHex::toHex(rand(1, 255), 1);
$length = 7 + strlen($this->message) / 2;
$this->message = ToHex::toHex($this->type, 1) . ToHex::toHex($this->portLogic, 1) . ToHex::toHex($this->orderId, 6) . ToHex::toHex($this->time, 2);
$this->message = 'ffaa' . $this->encrypt . $this->command . ToHex::toHex($length, 2) . $nonce . $this->message;
}
/**
......
......@@ -25,7 +25,7 @@ abstract class Command
protected $serviceId = '';
protected $method = '';
protected $method = 'Cmd_Res';
protected $paras = [];
......
......@@ -88,6 +88,8 @@ class Send implements Request
public
function send(): bool
{
Log::debug('send');
$iotClient = new IotClient($this);
$iotClient->setHeaders([
......@@ -97,6 +99,8 @@ class Send implements Request
'Content-Type' => 'application/json'
]);
Log::debug($iotClient->getHeaders());
if ($iotClient->request($this->getReturnCode()) === true) {
$this->response = $iotClient->getResponse();
......
Bag Attributes
localKeyID: E2 22 EC 85 05 50 93 61 45 50 EA 4C 0D 72 95 38 AC CC C8 73
subject=/C=CN/ST=GD/L=SZ/O=Huawei/OU=CN/CN=www.smarthome-demo.com
issuer=/C=CN/ST=GD/L=SZ/O=Huawei/OU=CN/CN=IOT
-----BEGIN CERTIFICATE-----
MIIDVjCCAj6gAwIBAgIJAJCrWqXqdcxuMA0GCSqGSIb3DQEBCwUAMFMxCzAJBgNV
BAYTAkNOMQswCQYDVQQIEwJHRDELMAkGA1UEBxMCU1oxDzANBgNVBAoTBkh1YXdl
aTELMAkGA1UECxMCQ04xDDAKBgNVBAMTA0lPVDAeFw0xNjA1MDQxMjM1NTRaFw0y
NjA1MDIxMjM1NTRaMGYxCzAJBgNVBAYTAkNOMQswCQYDVQQIEwJHRDELMAkGA1UE
BxMCU1oxDzANBgNVBAoTBkh1YXdlaTELMAkGA1UECxMCQ04xHzAdBgNVBAMTFnd3
dy5zbWFydGhvbWUtZGVtby5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQDXabyOJ/boRw8kqMOGzlVqoq6eSeeeeYPni7QL3IlTYCIP4AdZ3W4S4Tki
tSE7YwwVDlIipEhqDVHthR2YPU7sYELhqrDqxHtjXGnMEmmWCvauV6kstrMSQMKT
DFD3ATlJwVGqBRw81GtpRSeo2lCibXMk8Y4mZJy1d7U70VgRaq/Vhjv6oTPcFLsW
IVevMuMwZj3/+C4oLIr6WARo84stMhEFMR0IIbaVbmy8sbt28bq33fz6+n5V2R+g
r97DbQ9wEtb+q2aPPyGYJke3F4j8F/Kw0QTlYcnpO6+Ghs37Iv10r6cN7meigD5/
gYr8O1VAFmeIqldKjIPQkoFFfOXBAgMBAAGjGjAYMAkGA1UdEwQCMAAwCwYDVR0P
BAQDAgXgMA0GCSqGSIb3DQEBCwUAA4IBAQCQebgg89ZZMW9R3yQ7tSeOVCt2M/tO
gZRaLrKMxWRJZngQeg+SVeJvkXcxlRTgwqElcVG/i7zguZjO/ff39Y8MPcWAaNIy
yTmt7kuP7YAS6Jf7unUA2y76mXsPiFJAOMLVm/CO+/BP2a0HJGm+6B+1TZzBZeQl
zeOxesFrEAJxopBkHpmgQNJM/E/5AAgrI1gNB5DrG2Zn3/M0FF+FLDv9QGWZJ5ay
R1Wn5WCMpPqFm6PP7qG2n+a4wzqxjaeVBBmv6X2cvHNVVUZ/zDdIMOtzQs6KMqWo
wZIpeAax6+fhzGh3X482oJRpSS8ZNSFBycN9tYlk69NuPB9bD6Kxhnrv
-----END CERTIFICATE-----
Bag Attributes
localKeyID: E2 22 EC 85 05 50 93 61 45 50 EA 4C 0D 72 95 38 AC CC C8 73
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDXabyOJ/boRw8k
qMOGzlVqoq6eSeeeeYPni7QL3IlTYCIP4AdZ3W4S4TkitSE7YwwVDlIipEhqDVHt
hR2YPU7sYELhqrDqxHtjXGnMEmmWCvauV6kstrMSQMKTDFD3ATlJwVGqBRw81Gtp
RSeo2lCibXMk8Y4mZJy1d7U70VgRaq/Vhjv6oTPcFLsWIVevMuMwZj3/+C4oLIr6
WARo84stMhEFMR0IIbaVbmy8sbt28bq33fz6+n5V2R+gr97DbQ9wEtb+q2aPPyGY
Jke3F4j8F/Kw0QTlYcnpO6+Ghs37Iv10r6cN7meigD5/gYr8O1VAFmeIqldKjIPQ
koFFfOXBAgMBAAECggEAbfdcenWMZidgY6aDql3K3RUPb17rDsuZuqpmz2dV82ov
+Uq0dfvEJX80W7N7s4VstZMJ+wVCsmD6YfaClSU3FRRPEETC7BZBpweWOsdrf105
cObvRhQ+diL5MXgoHPBS/oPh3JmfQK5v5t2W0Wwhncmh7koh9xeFqF3j9xV3j+um
cTEq0IAxvlaWaR4fYq7xy/U6I8TuDsrHTnPgp8CdHSMMQ0oj+SxMCJMorYjRkHrx
VghrR/ZEcLCdQD43uNDT5YqsfX9GjkvbqAaTf/ZqgN9DRexEKi0uRzqyPxyHSL6Y
dmEExGI6AKGou8hqj0qOd+5ifHVECcZgsEODdFsQAQKBgQD6tgCwkwUarYPRkEC/
l2JtI9/1LZrdY4dcGAZtAh5uSptBC/+oXT1l8yyYs2WBxOz2EzH8cRnhXTzbj5tB
r+xqn6NvtxYjm6Hs4/+pMXTX0lwuHspLwSplr5B71eAOOnuokusYtI/UIu87gDUe
HjuVQk8VOnR9bjBlO3xSnWk6cQKBgQDb9RpTr8JHeLHPM+/0hWbFLWeCDMU+f2et
SHY0Y8MUFmAjDfUK3PajueRnrlI7Nz+kjywNorf+foJy811l7dnrh5m/nHWFcwtw
TBGYeRJj2rEVs5NRRaEbGeQPIYprPGKEWLJZ6G+bMIKdpS6BAlJI2TI+wZod8FvL
ZuYJ/WvoUQKBgQClFccqfgS0ZmEQUx5vii1jlGXaOedptCnjeGZyzRxgn3vPvyjf
IlZVlWReQHKsmpE2D7mwcoEKJqz2Hn+rJz5Tjz69Rx+q3sYnCJLGRCyeGIReUiP+
8fkK8CoBgPmCJPxcKjHoGK1EkKRa17ciV+IADKOqZM1j8nSnlB3vAHvT4QKBgAN7
2FTm/b7ADKDpg61tx3jsBS2sIhuhTPUTpruhsN9Kk286s1zerxFcyl9SBX9mmp1y
nxIAN8XSHyLO8/W/VKpEVY0RX1MjxVSb/9NYZ5ApUJC1bWnmHm0ddd0/fL/CDxVl
ij2eTtY4aHkyuo/Uh5Uby43u5w/+VJXeJVqXJvRhAoGAAuPkfKD6+OdB2HNREpK7
jJ4b0dFygj8EJf7sxxM/QARAxAUVMTIO+oE3sQCfAdT19YR/3bPY1VFZB6Z18mc6
tD0UfdzUFTs0XAtT5P/zHSsoRSWmFMIEPXTjjE+42MaXnHi2Ul7bqCHr8rr1hIkB
DY5UCch6GiVKxDjWpHb+J4s=
-----END PRIVATE KEY-----
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment