Skip to main content

Crate sccp_protocol

Crate sccp_protocol 

Source
Expand description

Typed Skinny Client Control Protocol messages and an asynchronous station server.

The crate separates the phone-facing wire protocol from the call-control application. Server owns station connections and translates inbound packets into semantic Event values. Applications respond through a cloneable ServerHandle using typed Command values; no SIP or PBX policy is built into this crate.

§Typical workflow

  1. Build and validate one or more DeviceDefinition values.
  2. Start Server::bind, spawn Server::run, and retain its ServerHandle and event receiver.
  3. Consume events in order. Registration, call input, media acknowledgements, and disconnects all arrive through the same stream.
  4. Send commands through the handle. Use ServerHandle::send_confirmed when later work depends on the complete frame having reached the station socket; ServerHandle::send confirms queue admission only.
  5. Call ServerHandle::shutdown and await the server task during orderly application shutdown.
use sccp_protocol::{
    ButtonDefinition, DeviceDefinition, DeviceId, LineAppearance, LineDefinition,
    Server, ServerConfig, SoftKeyProfile, StationTransportRequirement, StationUiPolicy,
};

let station = DeviceDefinition {
    id: DeviceId::new("SEP001122334455")?,
    description: "Front desk".into(),
    transport: StationTransportRequirement::Either,
    signaling_qos: None,
    buttons: vec![ButtonDefinition::Line(LineAppearance::new(
        1,
        LineDefinition {
            number: "1001".into(),
            display_name: "Reception".into(),
        },
    ))],
    soft_keys: SoftKeyProfile::default(),
    ui: StationUiPolicy::default(),
};
station.validate()?;

let (server, handle, mut events) = Server::bind(ServerConfig::default(), [station]).await?;
let server_task = tokio::spawn(server.run());

if let Some(event) = events.recv().await {
    println!("{event:?}");
}

handle.shutdown().await?;
server_task.await??;

§Choosing an API layer

Most applications use the crate-root re-exports plus server and types. message exposes framing, message IDs, codecs, and typed wire models for protocol tools or custom transports. phone contains bounded phone-hosted XML, authentication, service, and provisioning models. qos owns service-node reservation transitions without sharing handset session state. To supply an externally accepted transport—such as a TLS stream—construct the server with Server::with_ingress and feed streams through ServerIngress.

Re-exports§

pub use message::capabilities::CapabilityUpdate;
pub use message::capabilities::CapabilityUpdateVariant;
pub use message::capabilities::ConferenceResource;
pub use message::capabilities::ConferenceServiceResource;
pub use message::capabilities::CustomPictureFormat;
pub use message::capabilities::DataCapability;
pub use message::capabilities::StationMediaCapabilities;
pub use message::capabilities::VideoCapability;
pub use message::capabilities::VideoLevelPreference;
pub use message::catalog::MessageDirection;
pub use message::catalog::MessageId;
pub use message::catalog::MessageRoute;
pub use message::values::AddParticipantResult;
pub use message::values::AlarmSeverity;
pub use message::values::AnnouncementPlayMode;
pub use message::values::AnnouncementPlayStatus;
pub use message::values::AuditParticipantResult;
pub use message::values::BusyLampFieldState;
pub use message::values::ButtonType;
pub use message::values::CallForwardKind;
pub use message::values::CallHistoryDisposition;
pub use message::values::CallInfoVisibility;
pub use message::values::CallPriority;
pub use message::values::CallSecurityState;
pub use message::values::CallState;
pub use message::values::CallType;
pub use message::values::Codec;
pub use message::values::CodecKind;
pub use message::values::ConferenceResourceType;
pub use message::values::CreateConferenceResult;
pub use message::values::DeleteConferenceResult;
pub use message::values::DeviceType;
pub use message::values::Digit;
pub use message::values::DtmfMode;
pub use message::values::DynamicCallInfoLayout;
pub use message::values::EchoCancellation;
pub use message::values::EncryptionCapability;
pub use message::values::EncryptionMethod;
pub use message::values::EndOfAnnouncementAck;
pub use message::values::G723BitRate;
pub use message::values::IpAddressType;
pub use message::values::KeyMode;
pub use message::values::LampMode;
pub use message::values::LayoutProfile;
pub use message::values::MediaPathCapability;
pub use message::values::MediaPathEvent;
pub use message::values::MediaPathId;
pub use message::values::MediaStatus;
pub use message::values::MediaTransport;
pub use message::values::MediaType;
pub use message::values::MessageWaitingResult;
pub use message::values::MicrophoneMode;
pub use message::values::MiscCommandType;
pub use message::values::ModifyConferenceResult;
pub use message::values::NotificationPriority;
pub use message::values::PartyInformationRestrictions;
pub use message::values::PhoneFeatures;
pub use message::values::ProtocolVersion;
pub use message::values::QosDirection;
pub use message::values::QosErrorCode;
pub use message::values::QosReservationStyle;
pub use message::values::RFC2833_TELEPHONE_EVENT_PAYLOAD;
pub use message::values::ReceiveTransmit;
pub use message::values::ResetType;
pub use message::values::RingDuration;
pub use message::values::RingerMode;
pub use message::values::RsvpErrorCode;
pub use message::values::SilenceSuppression;
pub use message::values::SoftKey;
pub use message::values::SpeakerMode;
pub use message::values::StationSessionContext;
pub use message::values::StatisticsProcessing;
pub use message::values::Stimulus;
pub use message::values::SubscriptionCause;
pub use message::values::Tone;
pub use message::values::ToneDirection;
pub use message::values::UnregisterStatus;
pub use message::values::VideoFormat;
pub use message::wire::CodecError;
pub use message::wire::Frame;
pub use message::wire::FrameDecoder;
pub use message::wire::MAX_FRAME_SIZE;
pub use message::AddParticipantRequest;
pub use message::AddParticipantResponse;
pub use message::AnnouncementEntry;
pub use message::AudioStreamControl;
pub use message::AuditConferenceEntry;
pub use message::AuditConferenceResponse;
pub use message::AuditParticipantResponse;
pub use message::BoundedBytes;
pub use message::BoundedBytesError;
pub use message::ButtonTemplateEntry;
pub use message::CALL_COUNT_REQUEST_EXTENDED_BYTES;
pub use message::CALL_COUNT_RESPONSE_MAX_LINE_ENTRIES;
pub use message::CONNECTION_QUALITY_MAX_BYTES;
pub use message::CallCountLineData;
pub use message::CallCountRequestPayload;
pub use message::CallCountResponse;
pub use message::ChangeParticipantRequest;
pub use message::ClientMessage;
pub use message::ConferenceParticipant;
pub use message::ConferenceParticipantChange;
pub use message::ConfigurationStatus;
pub use message::ConnectionQualityStatistics;
pub use message::ConnectionStatistics;
pub use message::ControlMessage;
pub use message::CreateConferenceRequest;
pub use message::CreateConferenceResponse;
pub use message::DtmfPayloadIdentity;
pub use message::DtmfPayloadRequest;
pub use message::DtmfToneControl;
pub use message::ExtensionDeviceCapabilities;
pub use message::KnownOpaqueMessage;
pub use message::MAX_MULTIMEDIA_PICTURE_FORMATS;
pub use message::MAX_SIGNALING_SERVERS;
pub use message::MEDIA_PORT_LIST_MAX_PORTS;
pub use message::MULTIMEDIA_CAPABILITY_BYTES;
pub use message::MediaCapability;
pub use message::MediaEncryption;
pub use message::MediaEndpointAddress;
pub use message::MediaFailureDetection;
pub use message::MediaPortList;
pub use message::MediaResourceNotification;
pub use message::MediaTransmissionAck;
pub use message::MessageWaitingCounts;
pub use message::MessageWaitingNotification;
pub use message::MiscellaneousCommand;
pub use message::ModifyConferenceRequest;
pub use message::ModifyConferenceResponse;
pub use message::MulticastMediaReception;
pub use message::MulticastMediaTransmission;
pub use message::MultimediaCapabilityError;
pub use message::MultimediaPayload;
pub use message::MultimediaPayloadDescriptor;
pub use message::MultimediaPictureFormat;
pub use message::MultimediaStreamControl;
pub use message::MultimediaVideoCapability;
pub use message::MultimediaVideoCapabilityArm;
pub use message::OpenMultimediaChannel;
pub use message::OpenMultimediaReceiveChannelAck;
pub use message::ParticipantChangeRouting;
pub use message::PortClose;
pub use message::PortEndpoint;
pub use message::PortRequest;
pub use message::QosApplicationIdentifier;
pub use message::QosFlow;
pub use message::QosTrafficSpecification;
pub use message::RawMessage;
pub use message::RegisterTokenMessage;
pub use message::RegistrationMessage;
pub use message::RegistrationWireDetails;
pub use message::RegistrationWireLayout;
pub use message::RtpPayloadNumber;
pub use message::RtpPayloadNumberError;
pub use message::ServerMessage;
pub use message::SessionTransmission;
pub use message::SignalingServerEndpoint;
pub use message::SpcpRegisterTokenMessage;
pub use message::StartMultimediaTransmission;
pub use message::StartMultimediaTransmissionAck;
pub use message::SubscriptionRequest;
pub use message::UserDataMessage;
pub use message::UserDataV1Message;
pub use message::VideoFlowControl;
pub use message::XML_ALARM_CANONICAL_DOCUMENT_BYTES;
pub use message::XML_ALARM_CANONICAL_WIRE_BYTES;
pub use message::XML_ALARM_MAX_WIRE_BYTES;
pub use message::XmlAlarmMessage;
pub use phone::authentication::OpaquePhoneAuthenticationResponse;
pub use phone::authentication::PHONE_AUTHENTICATION_MAX_PASSWORD_BYTES;
pub use phone::authentication::PHONE_AUTHENTICATION_MAX_QUERY_BYTES;
pub use phone::authentication::PHONE_AUTHENTICATION_MAX_RESPONSE_BYTES;
pub use phone::authentication::PHONE_AUTHENTICATION_MAX_USER_ID_BYTES;
pub use phone::authentication::PhoneAuthenticationError;
pub use phone::authentication::PhoneAuthenticationPassword;
pub use phone::authentication::PhoneAuthenticationRequest;
pub use phone::authentication::PhoneAuthenticationResponse;
pub use phone::authentication::PhoneAuthenticationUserId;
pub use phone::service::CiscoIpPhoneError;
pub use phone::service::CiscoIpPhoneResponse;
pub use phone::service::CiscoIpPhoneResponseItem;
pub use phone::service::PhoneExecuteStatus;
pub use phone::service::PhoneServiceError;
pub use phone::service::PhoneServiceErrorCode;
pub use phone::service::PhoneServiceEvent;
pub use phone::service::PhoneServiceExtendedRouting;
pub use phone::service::PhoneServiceMessageKind;
pub use phone::service::PhoneServicePayload;
pub use phone::service::PhoneServiceRouting;
pub use phone::service::PhoneServiceSubmission;
pub use phone::service::PhoneServiceSubmittedValue;
pub use phone::service::parse_phone_service_payload;
pub use phone::xml::CiscoIpPhoneAlarm;
pub use phone::xml::CiscoIpPhoneAlarmEntry;
pub use phone::xml::CiscoIpPhoneAlarmEnum;
pub use phone::xml::CiscoIpPhoneAlarmParameter;
pub use phone::xml::CiscoIpPhoneAlarmParameterList;
pub use phone::xml::CiscoIpPhoneAlarmString;
pub use phone::xml::CiscoIpPhoneBackground;
pub use phone::xml::CiscoIpPhoneDirectory;
pub use phone::xml::CiscoIpPhoneDirectoryEntry;
pub use phone::xml::CiscoIpPhoneExecute;
pub use phone::xml::CiscoIpPhoneExecuteItem;
pub use phone::xml::CiscoIpPhoneGraphicFileMenu;
pub use phone::xml::CiscoIpPhoneGraphicMenu;
pub use phone::xml::CiscoIpPhoneIconFileItem;
pub use phone::xml::CiscoIpPhoneIconFileMenu;
pub use phone::xml::CiscoIpPhoneIconItem;
pub use phone::xml::CiscoIpPhoneIconMenu;
pub use phone::xml::CiscoIpPhoneIconMenuItem;
pub use phone::xml::CiscoIpPhoneIconTitle;
pub use phone::xml::CiscoIpPhoneImage;
pub use phone::xml::CiscoIpPhoneImageFile;
pub use phone::xml::CiscoIpPhoneImageList;
pub use phone::xml::CiscoIpPhoneImageListItem;
pub use phone::xml::CiscoIpPhoneInput;
pub use phone::xml::CiscoIpPhoneInputItem;
pub use phone::xml::CiscoIpPhoneKeyItem;
pub use phone::xml::CiscoIpPhoneLocationInformation;
pub use phone::xml::CiscoIpPhoneMenu;
pub use phone::xml::CiscoIpPhoneMenuItem;
pub use phone::xml::CiscoIpPhoneOffPremises;
pub use phone::xml::CiscoIpPhoneSetBackground;
pub use phone::xml::CiscoIpPhoneSetBackgroundPreview;
pub use phone::xml::CiscoIpPhoneSetRingTone;
pub use phone::xml::CiscoIpPhoneSoftKeyItem;
pub use phone::xml::CiscoIpPhoneStatus;
pub use phone::xml::CiscoIpPhoneStatusFile;
pub use phone::xml::CiscoIpPhoneText;
pub use phone::xml::CiscoIpPhoneTouchAreaMenuItem;
pub use phone::xml::CiscoIpPhoneWifiLocation;
pub use phone::xml::ConferenceListAction;
pub use phone::xml::ConferenceListDocument;
pub use phone::xml::ConferenceListEntry;
pub use phone::xml::ConferenceMenuFamily;
pub use phone::xml::ConferenceParticipantActionsDocument;
pub use phone::xml::OpaquePhoneAlarm;
pub use phone::xml::OpaquePhoneLocation;
pub use phone::xml::PHONE_ALARM_MAX_BYTES;
pub use phone::xml::PHONE_BACKGROUND_APPLICATION_ID;
pub use phone::xml::PHONE_BACKGROUND_CONTROL_MAX_BYTES;
pub use phone::xml::PHONE_BACKGROUND_LIST_MAX_BYTES;
pub use phone::xml::PHONE_BACKGROUND_LIST_MAX_ITEMS;
pub use phone::xml::PHONE_DIRECTORY_MAX_BYTES;
pub use phone::xml::PHONE_DIRECTORY_MAX_ENTRIES;
pub use phone::xml::PHONE_EXECUTE_MAX_BYTES;
pub use phone::xml::PHONE_EXECUTE_MAX_ITEMS;
pub use phone::xml::PHONE_GRAPHIC_FILE_MENU_MAX_ITEMS;
pub use phone::xml::PHONE_GRAPHIC_MENU_MAX_ITEMS;
pub use phone::xml::PHONE_ICON_MENU_MAX_ICONS;
pub use phone::xml::PHONE_ICON_MENU_MAX_ITEMS;
pub use phone::xml::PHONE_IMAGE_BITMAP_MAX_BYTES;
pub use phone::xml::PHONE_IMAGE_MAX_BYTES;
pub use phone::xml::PHONE_INPUT_MAX_BYTES;
pub use phone::xml::PHONE_INPUT_MAX_ITEMS;
pub use phone::xml::PHONE_LOCATION_MAX_BYTES;
pub use phone::xml::PHONE_MENU_MAX_BYTES;
pub use phone::xml::PHONE_MENU_MAX_ITEMS;
pub use phone::xml::PHONE_RINGTONE_APPLICATION_ID;
pub use phone::xml::PHONE_RINGTONE_MAX_BYTES;
pub use phone::xml::PHONE_STATUS_BITMAP_MAX_BYTES;
pub use phone::xml::PHONE_STATUS_MAX_BYTES;
pub use phone::xml::PHONE_TEXT_APPLICATION_ID;
pub use phone::xml::PHONE_TEXT_LEGACY_MAX_CHARS;
pub use phone::xml::PHONE_TEXT_MAX_BYTES;
pub use phone::xml::PHONE_TEXT_MAX_CHARS;
pub use phone::xml::PHONE_XML_MAX_NESTING_DEPTH;
pub use phone::xml::PhoneActionKind;
pub use phone::xml::PhoneAlarmKind;
pub use phone::xml::PhoneAlarmSummary;
pub use phone::xml::PhoneAlarmTelemetry;
pub use phone::xml::PhoneBackgroundControlDocument;
pub use phone::xml::PhoneBackgroundHttpUrl;
pub use phone::xml::PhoneBackgroundTftpUrl;
pub use phone::xml::PhoneBitmapData;
pub use phone::xml::PhoneBssid;
pub use phone::xml::PhoneExecutePriority;
pub use phone::xml::PhoneExecuteUrl;
pub use phone::xml::PhoneImageDocument;
pub use phone::xml::PhoneImageUrl;
pub use phone::xml::PhoneInputFlags;
pub use phone::xml::PhoneInputParameterName;
pub use phone::xml::PhoneKeypadTarget;
pub use phone::xml::PhoneLocationKind;
pub use phone::xml::PhoneLocationSummary;
pub use phone::xml::PhoneLocationTelemetry;
pub use phone::xml::PhoneRingtoneUrl;
pub use phone::xml::PhoneServicePriority;
pub use phone::xml::PhoneSoftKeyPosition;
pub use phone::xml::PhoneStatusDocument;
pub use phone::xml::PhoneTouchArea;
pub use phone::xml::PhoneXmlError;
pub use phone::xml::PhoneXmlKey;
pub use phone::xml::PhoneXmlRefresh;
pub use phone::xml::from_bytes as parse_phone_xml;
pub use phone::xml::parse_phone_alarm;
pub use phone::xml::parse_phone_location;
pub use phone::xml::to_string as serialize_phone_xml;
pub use qos::QosReservationController;
pub use qos::QosReservationError;
pub use qos::QosReservationEvent;
pub use qos::QosReservationFailure;
pub use qos::QosReservationId;
pub use qos::QosReservationLimits;
pub use qos::QosReservationPolicy;
pub use qos::QosReservationRequest;
pub use qos::QosReservationSetup;
pub use qos::QosReservationState;
pub use qos::QosTransition;
pub use server::AnonymousHotlineDefinition;
pub use server::CallSelectionOrder;
pub use server::Command;
pub use server::CommandAction;
pub use server::DeviceEvent;
pub use server::DeviceEventKind;
pub use server::DoNotDisturbButtonMode;
pub use server::DoNotDisturbMode;
pub use server::Event;
pub use server::HandsetAcknowledgement;
pub use server::HandsetStatusMessage;
pub use server::IncomingOfferDelivery;
pub use server::IncomingOfferReceipt;
pub use server::IncomingPresentation;
pub use server::IncomingRing;
pub use server::MAX_REGISTRATION_BACKOFF;
pub use server::MIN_REGISTRATION_BACKOFF;
pub use server::MediaStatisticsSnapshot;
pub use server::MulticastMediaRoute;
pub use server::MultimediaReceiveDescriptor;
pub use server::MultimediaTransmitControl;
pub use server::MultimediaTransmitDescriptor;
pub use server::PARKING_MENU_MAX_ITEMS;
pub use server::ParkingMenuEntry;
pub use server::ReceiveChannelPurpose;
pub use server::ReconfigureResult;
pub use server::RecordingButtonState;
pub use server::RegistrationFallback;
pub use server::RegistrationTokenPolicy;
pub use server::Server;
pub use server::ServerConfig;
pub use server::ServerError;
pub use server::ServerHandle;
pub use server::ServerIngress;
pub use server::SignalingServerRoute;
pub use server::SignalingSocket;
pub use server::SocketQosFailure;
pub use server::SocketQosMark;
pub use server::SocketQosPolicy;
pub use server::SocketQosReport;
pub use server::StationIo;
pub use server::StationSessionTarget;
pub use server::StationSocketQos;
pub use server::TransmitOpenOutcome;
pub use server::VideoPictureReference;
pub use server::VideoPictureReferences;
pub use server::apply_socket_qos;
pub use server::ObservationConnectionId;
pub use server::ServerObservation;
pub use server::ServerObservationKind;
pub use server::SignalingDirection;
pub use server::SignalingFidelity;
pub use server::SignalingObservation;
pub use server::StationDisconnectReason;
pub use types::AddonModuleDefinition;
pub use types::AppearanceId;
pub use types::AppearanceRingMode;
pub use types::ApplicationId;
pub use types::AudioProcessingPolicy;
pub use types::BlfCallerInfo;
pub use types::BlfSpeedDialDefinition;
pub use types::BlfState;
pub use types::ButtonDefinition;
pub use types::CallDirection;
pub use types::CallId;
pub use types::CallInfo;
pub use types::CallReference;
pub use types::CallerIdOverride;
pub use types::ConferenceId;
pub use types::DEFAULT_AUDIO_MAX_FRAMES_PER_PACKET;
pub use types::DEFAULT_AUDIO_PACKET_MS;
pub use types::DateTemplate;
pub use types::DeviceDefinition;
pub use types::DeviceId;
pub use types::DeviceRegistration;
pub use types::FeatureDefinition;
pub use types::LegacyCodePage;
pub use types::LineAppearance;
pub use types::LineDefinition;
pub use types::LineInstance;
pub use types::MediaEndpoint;
pub use types::MediaTrafficClass;
pub use types::ParticipantId;
pub use types::PassthroughPartyId;
pub use types::RecordingButtonDefinition;
pub use types::ServiceDefinition;
pub use types::SessionGeneration;
pub use types::SignalingQos;
pub use types::SoftKeyProfile;
pub use types::SpeedDialDefinition;
pub use types::StationTransport;
pub use types::StationTransportRequirement;
pub use types::StationUiPolicy;
pub use types::TransactionId;

Modules§

message
Typed SCCP messages used by the server.
phone
Phone-facing HTTP and XML protocol models.
qos
Bounded reservation ownership for service-node QoS messages.
server
Stateful SCCP station-session boundary.
types
Application-facing identities, station configuration, and call/media data.