Updated 2026-10-09
What they are and who sends them
The Signal Request Message (SRM, DSRCmsgID 29) is sent by a vehicle that wants the traffic signal to favor it: a transit bus running late, a snow plow on a route, a freight truck that should not have to stop, an ambulance on a call. It names the intersection, the lane it will arrive on and leave by, when it expects to be there, and who it is. The Signal Status Message (SSM, DSRCmsgID 30) is the roadside's reply: for each active request at the intersection it echoes the requester and says whether the request is granted, rejected, processing or something else. The messages are a conversation; the rest of the system, from the priority request server to the controller's priority logic, is described in signal priority. This article is about the bytes.
When they are broadcast
| Property | SRM | SSM |
|---|---|---|
| Sender | Vehicle OBU | RSU, on behalf of the priority request server or controller |
| Rate | Once per second while approaching, or on change; J2945/B gives the rules | Once per second while any request is active, or on change |
| PSID | 0xE0000016 (p-encoded E0000016) | 0xE0000015 (p-encoded E0000015) |
| Signing | Signed with a certificate whose PSID 0xE0000016 and service-specific permissions (SSP) authorize the vehicle's role; an RSU checks the SSP before honoring a request | Signed with the RSU's 0xE0000015 application certificate |
| Size | 50 to 120 bytes | 30 to 80 bytes |
SRM structure
| Field | Meaning | Units and range | Typical value | Where it comes from |
|---|---|---|---|---|
timeStamp | Minute of the year | optional | 403680 | OBU clock |
second | Milliseconds in the minute when the SRM was built | 0 … 59999 | 45000 | OBU clock |
sequenceNumber | Increments per SRM from this vehicle | 0 … 127 | 1 | OBU |
requests[].request.id | Intersection region and id; must match the MAP and SPaT | region 0, id 1201 | from the MAP the vehicle heard | |
requests[].request.requestID | Chosen by the vehicle; echoed in the SSM | 0 … 255 | 7 | OBU |
requests[].request.requestType | priorityRequest (new), priorityRequestUpdate (changed arrival time), priorityCancellation | enum | priorityRequest | OBU logic |
requests[].request.inBoundLane | CHOICE lane (MAP laneID), approach (ApproachID) or connection (LaneConnectionID) | lane 3 | matched from the MAP | |
requests[].request.outBoundLane | Same choice for the exit | optional | lane 4 | matched from the MAP |
requests[].minute, second | Expected time of arrival at the stop line | minute of year + ms | 403680, 45000 | OBU estimate |
requests[].duration | How long service is wanted | ms | 20000 | OBU estimate |
requestor.id | CHOICE entityID (4-byte TemporaryID) or stationID | entityID BEEF0001 | OBU | |
requestor.type.role | BasicVehicleRole: transit, truck, emergency, police, fire, ambulance, roadWork, dot, safetyCar… | enum | transit | vehicle configuration |
requestor.type.subrole | Agency-defined refinement, requestSubRole1 … 14 | enum | requestSubRole1 | agency policy |
requestor.type.request | Importance, requestImportanceLevel1 … 14 | enum | requestImportanceLevel3 | agency policy |
requestor.type.hpmsType | VehicleType: bus, car, axleCnt5Trailer… | enum | bus | vehicle configuration |
requestor.position | position (lat, long, elevation), heading (1.5° units), speed (transmisson and speed in 0.02 m/s) | GNSS | ||
requestor.name, routeName | Vehicle and route labels | up to 63 chars | "Metrobus 28A", "28A" | transit CAD |
requestor.transitStatus | 8-bit: loading, anADAuse, aBikeLoad, doorOpen, charging, atStopLine | bit string | 00000000 | vehicle |
requestor.transitOccupancy | occupancyEmpty … occupancyFull | enum | occupancyMed | passenger counter |
requestor.transitSchedule | Seconds ahead (+) or behind (−) schedule in 10 s units | −122 … 121 | −3 (30 s late) | transit CAD |
The spelling transmisson inside TransmissionAndSpeed is the standard's, not a typo in the portal.
SSM structure
| Field | Meaning | Units and range | Typical value |
|---|---|---|---|
timeStamp, second, sequenceNumber | As in the SRM, for the SSM itself | 403680, 45500, 1 | |
status[].sequenceNumber | Per-intersection counter | 0 … 127 | 1 |
status[].id | The intersection | region, id | 0, 1201 |
status[].sigStatus[] | One package per active request | 1 … 32 | |
sigStatus[].requester.id, request, sequenceNumber | Echo of the SRM's requestor.id, requestID and sequenceNumber so the vehicle can match the reply | BEEF0001, 7, 1 | |
sigStatus[].requester.role, typeData | Echo of the requester's role and type | optional | transit |
sigStatus[].inboundOn, outboundOn | Echo of the lanes | lane 3, lane 4 | |
sigStatus[].minute, second, duration | Echo of the requested service time | optional | |
sigStatus[].status | PrioritizationResponseStatus: unknown, requested, processing, watchOtherTraffic, granted, rejected, maxPresence, reserviceLocked | enum | granted |
maxPresence means the vehicle has been asking too long and the controller will not extend further; reserviceLocked means the same vehicle was just served and must wait; watchOtherTraffic is a grant with a caution that conflicting priority is also being served.
How to create a pair in this portal
- Open the creator and load SRM. The template is a late Metrobus on route 28A approaching intersection 1201 northbound on lane 3, leaving by lane 4, asking for 20 seconds of service.
- Set
request.id.idto your intersection andinBoundLane/outBoundLaneto lane IDs from your MAP (load the MAP template to see them). Setminuteandsecondto the expected arrival. Set theroleand importance that your agency's policy assigns; the?help lists the enumerations. - Encode / Validate. The hex begins
001D(messageId 29). The map shows the requestor's position and the intersection. - Load SSM. Copy the SRM's
requestor.id.entityID,requestIDandsequenceNumberintosigStatus[0].requester, mirror the lanes and times, and setstatus. Encode; the hex begins001E(messageId 30). - Decode both in the decoder and confirm the summary links the SSM to the SRM. In the live view, a vehicle with an outstanding request shows its state (requested, granted, rejected) on the intersection marker.
- For a bench test, push the SSM on PSID 0xE0000015 from the RSU to see an OBU display the grant. SRMs are vehicle messages; push one on 0xE0000016 only to exercise a priority request server with a synthetic vehicle.
How to read a decoded one
- The SRM's
request.idmust match the intersection the vehicle is actually approaching; a wrong ID is silently ignored by the server. inBoundLanemust be a lane that exists in the current MAP with aconnectsTo; a request on an egress lane or a crosswalk lane is rejected.minuteandsecondshould be a few seconds to a minute in the future; an arrival in the past is a stale or replayed request.- In the SSM,
requester.id,requestandsequenceNumbermust equal the SRM's; if the server regeneratesrequestIDthe vehicle cannot match the answer. - A
statusthat staysrequestedorprocessingfor many seconds usually means the controller side (NTCIP 1211 or the vendor priority server) never received the call; see the troubleshooting table in signal priority. - Check the SSM's
secondagainst the SRM's: a reply more than a second or two later points at a slow server path.
Related standards and further reading
- SAE J2735_202409, SignalRequestMessage and SignalStatusMessage modules; SAE J2945/B, requirements for signal priority and preemption applications; NTCIP 1211 for the controller-side request and status model.
- Signal priority, MAP, SPaT, MAP to SPaT, SCMS for the certificate permissions a requester needs.