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
- Build and validate one or more
DeviceDefinitionvalues. - Start
Server::bind, spawnServer::run, and retain itsServerHandleand event receiver. - Consume events in order. Registration, call input, media acknowledgements, and disconnects all arrive through the same stream.
- Send commands through the handle. Use
ServerHandle::send_confirmedwhen later work depends on the complete frame having reached the station socket;ServerHandle::sendconfirms queue admission only. - Call
ServerHandle::shutdownand 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::ReconfigureResult;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 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::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;