|
| 1 | +<?php |
| 2 | + |
| 3 | +/** |
| 4 | + * Example demonstrating the factory methods for creating Call and CallResult objects |
| 5 | + * from raw OCPP message arrays. |
| 6 | + * |
| 7 | + * This eliminates boilerplate code when parsing incoming OCPP messages. |
| 8 | + */ |
| 9 | + |
| 10 | +require __DIR__ . '/../../../vendor/autoload.php'; |
| 11 | + |
| 12 | +use SolutionForest\OcppPhp\Ocpp\JsonSchemaRegistry; |
| 13 | +use SolutionForest\OcppPhp\Ocpp\JsonSchemaValidator; |
| 14 | +use SolutionForest\OcppPhp\Ocpp\Messages\Call; |
| 15 | +use SolutionForest\OcppPhp\Ocpp\Messages\CallResult; |
| 16 | + |
| 17 | +echo "=== OCPP v1.6 Factory Methods Example ===\n\n"; |
| 18 | + |
| 19 | +$registry = new JsonSchemaRegistry(); |
| 20 | + |
| 21 | +// ============================================ |
| 22 | +// Example 1: Create a Call from raw message array |
| 23 | +// ============================================ |
| 24 | +echo "--- Example 1: Creating Call from raw array ---\n"; |
| 25 | + |
| 26 | +// This is how a raw OCPP Call message looks when received via WebSocket |
| 27 | +$rawBootNotification = [ |
| 28 | + 2, // messageTypeID (2 = Call) |
| 29 | + "19223201", // messageId |
| 30 | + "BootNotification", // action |
| 31 | + [ // payload |
| 32 | + "chargePointVendor" => "VendorX", |
| 33 | + "chargePointModel" => "ModelY", |
| 34 | + "chargePointSerialNumber" => "SN123456", |
| 35 | + "firmwareVersion" => "1.0.0" |
| 36 | + ] |
| 37 | +]; |
| 38 | + |
| 39 | +// Using Call::fromArray() static method |
| 40 | +$bootCall = Call::fromArray($rawBootNotification, 'v1.6'); |
| 41 | + |
| 42 | +echo "Created BootNotification Call:\n"; |
| 43 | +echo " - Vendor: {$bootCall->chargePointVendor}\n"; |
| 44 | +echo " - Model: {$bootCall->chargePointModel}\n"; |
| 45 | +echo " - Serial: {$bootCall->chargePointSerialNumber}\n"; |
| 46 | +echo " - Message ID: {$bootCall->messageId}\n"; |
| 47 | + |
| 48 | +// Validate the object |
| 49 | +JsonSchemaValidator::validate($bootCall, 'v1.6'); |
| 50 | +echo " - Validation: PASSED\n\n"; |
| 51 | + |
| 52 | +// ============================================ |
| 53 | +// Example 2: Create a Call using the registry |
| 54 | +// ============================================ |
| 55 | +echo "--- Example 2: Creating Call via JsonSchemaRegistry ---\n"; |
| 56 | + |
| 57 | +$rawHeartbeat = [ |
| 58 | + 2, |
| 59 | + "19223202", |
| 60 | + "Heartbeat", |
| 61 | + [] |
| 62 | +]; |
| 63 | + |
| 64 | +$heartbeatCall = $registry->createFromArray($rawHeartbeat, 'v1.6'); |
| 65 | +echo "Created Heartbeat Call via registry\n"; |
| 66 | +echo " - Message ID: {$heartbeatCall->messageId}\n"; |
| 67 | +echo " - Type: " . get_class($heartbeatCall) . "\n\n"; |
| 68 | + |
| 69 | +// ============================================ |
| 70 | +// Example 3: Create a Call with constructor payload |
| 71 | +// ============================================ |
| 72 | +echo "--- Example 3: Creating Call with constructor payload ---\n"; |
| 73 | + |
| 74 | +use SolutionForest\OcppPhp\Ocpp\v16\Calls\StatusNotification; |
| 75 | + |
| 76 | +$statusCall = new StatusNotification([ |
| 77 | + 'connectorId' => 1, |
| 78 | + 'status' => 'Available', |
| 79 | + 'errorCode' => 'NoError', |
| 80 | + 'timestamp' => date('c') |
| 81 | +]); |
| 82 | + |
| 83 | +echo "Created StatusNotification with constructor payload:\n"; |
| 84 | +echo " - Connector ID: {$statusCall->connectorId}\n"; |
| 85 | +echo " - Status: {$statusCall->status}\n"; |
| 86 | +echo " - Error Code: {$statusCall->errorCode}\n\n"; |
| 87 | + |
| 88 | +// ============================================ |
| 89 | +// Example 4: Create a CallResult from raw message array |
| 90 | +// ============================================ |
| 91 | +echo "--- Example 4: Creating CallResult from raw array ---\n"; |
| 92 | + |
| 93 | +// This is how a raw OCPP CallResult message looks when received |
| 94 | +$rawBootResponse = [ |
| 95 | + 3, // messageTypeID (3 = CallResult) |
| 96 | + "19223201", // messageId (matches the original Call) |
| 97 | + [ // payload |
| 98 | + "status" => "Accepted", |
| 99 | + "currentTime" => date('c'), |
| 100 | + "interval" => 300 |
| 101 | + ] |
| 102 | +]; |
| 103 | + |
| 104 | +// For CallResult, we need to specify which action this is a response to |
| 105 | +$bootResult = CallResult::fromArray($rawBootResponse, 'BootNotification', 'v1.6'); |
| 106 | + |
| 107 | +echo "Created BootNotification CallResult:\n"; |
| 108 | +echo " - Status: {$bootResult->status}\n"; |
| 109 | +echo " - Interval: {$bootResult->interval}\n"; |
| 110 | +echo " - Message ID: {$bootResult->messageId}\n"; |
| 111 | + |
| 112 | +// Validate the object |
| 113 | +JsonSchemaValidator::validate($bootResult, 'v1.6'); |
| 114 | +echo " - Validation: PASSED\n\n"; |
| 115 | + |
| 116 | +// ============================================ |
| 117 | +// Example 5: Using registry for CallResult |
| 118 | +// ============================================ |
| 119 | +echo "--- Example 5: Creating CallResult via JsonSchemaRegistry ---\n"; |
| 120 | + |
| 121 | +$rawHeartbeatResponse = [ |
| 122 | + 3, |
| 123 | + "19223202", |
| 124 | + [ |
| 125 | + "currentTime" => date('c') |
| 126 | + ] |
| 127 | +]; |
| 128 | + |
| 129 | +// When using the registry, pass the action as third parameter |
| 130 | +$heartbeatResult = $registry->createFromArray($rawHeartbeatResponse, 'v1.6', 'Heartbeat'); |
| 131 | +echo "Created Heartbeat CallResult via registry\n"; |
| 132 | +echo " - Current Time: {$heartbeatResult->currentTime}\n"; |
| 133 | +echo " - Type: " . get_class($heartbeatResult) . "\n\n"; |
| 134 | + |
| 135 | +// ============================================ |
| 136 | +// Example 6: Full round-trip simulation |
| 137 | +// ============================================ |
| 138 | +echo "--- Example 6: Full round-trip simulation ---\n"; |
| 139 | + |
| 140 | +// Simulate receiving a raw message (as if from WebSocket) |
| 141 | +$incomingJson = '[2, "msg-001", "MeterValues", {"connectorId": 1, "meterValue": []}]'; |
| 142 | +$incomingMessage = json_decode($incomingJson, true); |
| 143 | + |
| 144 | +echo "Received raw JSON: {$incomingJson}\n"; |
| 145 | + |
| 146 | +// Parse into typed object |
| 147 | +$meterValuesCall = Call::fromArray($incomingMessage, 'v1.6'); |
| 148 | +echo "Parsed into: " . get_class($meterValuesCall) . "\n"; |
| 149 | + |
| 150 | +// Convert back to array for sending |
| 151 | +$outgoingArray = $meterValuesCall->toArray(); |
| 152 | +$outgoingJson = json_encode($outgoingArray); |
| 153 | +echo "Converted back to JSON: {$outgoingJson}\n\n"; |
| 154 | + |
| 155 | +echo "=== Example Complete ===\n"; |
0 commit comments