USSD 概述

您所在的位置:网站首页 中国移动余额查询指令是多少 USSD 概述

USSD 概述

2023-12-21 19:58| 来源: 网络整理| 查看: 265

USSD 概述 项目 06/15/2023

非结构化补充服务数据 (USSD) 是全球移动通信系统 (GSM) 设备用来与移动网络运营商通信的通信协议, (通常称为“MO”) 。

要了解 USSD,将其与最密切的同级版本进行比较会很有帮助:短信服务 (短信) 。 USSD 和 SMS 都是 GSM 标准,这意味着它们作为第二代移动设备中的功能引入。 但是,与短信相比,USSD 是基于会话的连接。 虽然 SMS 用于短时无会话消息传送,但 USSD 通常用于命令和控制移动设备。 由于需要维护会话,USSD 不支持像 SMS 一样支持存储和转发功能。 USSD 和短信都使用 7 位 GSM 兼容字符发送,但 USSD 的最大长度为 184 个字符,而短信为 160 个字符。

可以通过打开拨号器并键入代码从移动电话发送 USSD 消息。 并非所有代码都受每个电话或 MO 支持。 在某些情况下,手机软件或操作系统可能会阻止手动发送代码。 必须实现的一个必需代码是 *#06#。 此代码返回调制解调器的国际移动设备标识符 (IMEI) ,但某些电话会阻止你直接拨打此电话。 如果遵循通过手机设置查找调制解调器 IMEI 的传统方法,则使用此代码检索该号码。

如果手机硬件可以直接处理代码的命令,如 IMEI 示例中所示,则不会启动任何网络会话。 需要网络通信的其他代码将打开一个会话,然后发送包含命令和任何必要参数的消息(如果适用)。 其中一个示例是使用 MO 检查当前余额和计划状态的代码。

Windows 中的 USSD 作为 WinRT API 图面实现。 此接口的实现类充当 USSD 会话的状态机,但最终依赖于 WWAN 服务来执行繁重的工作。 这些 API 是使用工厂模式实现的。

实现 USSD

需要记住的关键是,面向公众的 API 由 IDL 定义。 因此,实现可能会造成混淆,尤其是在不熟悉 WinRT 的情况下。 部分混乱来自“工厂”一词看似模棱两可的用法。 工厂可以引用静态接口的类实现,也可以引用为运行时类提供可激活接口的真实工厂。

本主题回顾 WinRT 概念,然后根据这些概念描述实现。 你可以始终参考 IDL 以进一步说明。

接口

接口定义应用程序二进制接口 (ABI) 。 它们描述了可以在实现 接口的任何类上调用的函数。

运行时类

这些是实际的类。 它们按名称表示最终作为类名向 ABI 公开的内容。 每个运行时类可能具有零个或多个接口 (但必须声明至少一个默认接口(如果它有一个或多个) 接口、零个或多个静态接口以及可激活标记(如有必要)。 其中每个接口作为不同的“Impl”类在不同的文件中实现,但对于 ABI,它们似乎是一个统一的类。

典型接口显示为现有对象上的实例方法。

静态接口在客户端中显示为运行时类本身上的静态方法。

可激活标记定义将生成运行时类实例的工厂接口。 这完全模糊化到客户端,显示为该运行时类的构造函数。

USSD 实现

流:打开、发送、接收、关闭。 打开、发送

客户端使用静态函数 UssdSession.CreateFromNetworkAccountId 或 UssdSession.CreateFromNetworkInterfaceId 创建 UssdSession 对象。

无论调用哪种 API,都需要网络接口 ID 来初始化 UssdSession。 对于 *NetworkAccountID,将采取步骤从帐户 ID 检索网络接口 ID。 调用 CreateInternal () 以创建 UssdSession 的实例,并在新创建的实例上调用 Initialize () 。 在初始化步骤中,将启动一个工作线程,并创建一个事件句柄来触发线程的事件。 步骤 3 和 4 也发生在实例的 Initialize () 期间。

对 WwanWrapper 成员对象调用 Initialize () 。 此函数接受静态回调函数和上下文,以允许静态函数将回调映射到对象上下文。

WwanWrapper 打开 WwanService 的句柄,枚举接口,并通过提供静态回调函数指针和“this”作为上下文来订阅 USSD 通知。

UssdSession 对象返回到客户端。

客户端通过使用消息字符串调用构造函数来构造新的 UssdMessage。 WinRT 在此过程中模糊化 UssdMessageFactory。

客户端在会话对象上调用 SendMessageAndGetReplyAsync,并传递 UssdMessage 实例。

此时,SendMessageAndGetReplyAsync 创建一个名为 UssdSendMessageAndGetReplyOperation 的特殊操作对象。 从其名称来看,对象似乎封装了单个消息在堆栈 (下发送并等待答复) 的逻辑,但情况并非如此。 WinRT 需要一个特殊的 out 参数用于异步操作,我们可以将其视为此函数定义中的第二个参数。

HRESULT SendMessageAndGetReplyAsync( [in] UssdMessage* message, [out, retval] Windows.Foundation.IAsyncOperation** asyncInfo);

IUssdSendMessageAndGetReplyOperation(通过 typedef 命名的接口)通过承诺此操作将不可避免地返回 UssdReply 来满足此参数。 此接口未在 IDL 中定义,但由 UssdSendMessageAndGetReplyOperationImpl 类实现。 请注意,此类的 标头具有特殊扩展名:

class UssdSendMessageAndGetReplyOperationImpl : public Microsoft::WRL::RuntimeClass< Windows::Networking::NetworkOperators::IUssdSendMessageAndGetReplyOperation, Windows::Internal::AsyncBaseFTM>

UssdSendMessageAndGetReplyOperation 对象允许 WinRT 模糊化此异步操作的复杂性以及随之而来的所有分区化和内存代理。 有关详细信息,请参阅 SendMessageAndGetReplyAsync。

现在,请了解上述异步操作只是调用回 UssdSession 对象,其中实际包含此操作的逻辑。 为了简单起见,我们可以直观地了解 UssdSession 本身在此处封装了工作。 我们现在可以断言,尽管具有异步性质,但一次只能发送一个 UssdMessage。

SendMessageAndGetReplyAsync 函数实际执行的操作:

UssdSession 对象更改为忙碌状态,存储 UssdMessage 的内容,并触发异步操作。 OnOperationStart () 是异步逻辑的入口点。 对于此方案,假定没有活动会话。 此函数创建 RequestType=WwanUssdRequestInitiate 的 WWAN_USSD_REQUEST 对象。 步骤 9 和 10 作为此函数执行的操作发生。

调用 m_wwanWrapper.SendRequest 来处理将消息传递到 WwanService 的工作。

WwanWrapper 使用 WwanService 句柄调用 WwanService API 来执行该操作。

接收

在步骤 10 之后,我们保持的状态是,请求已发送到 WwanService 以初始化新的 USSD 会话,并在该会话下发送 USSD 消息。 一段时间后,回复将可用。

WwanService 将使用同样附加的上下文调用步骤 4 中提供的静态回调函数。 上下文将用于检索 WwanWrapper 实例并调用 NotificationCallback () 。 WwanWrapper 将遵循与步骤 11 相同的模式,调用 UssdSession 的静态回调,提供步骤 3 中存储的上下文。 与步骤 12 类似,上下文用于调用 UssdSession 实例上的回调。 UssdSession 将WWAN_USSD_EVENT (存储在锁) 下,并通知工作线程处理事件。 HandleOperationReply () 采用现有的 UssdSendMessageAndGetReplyOperationImpl 对象,并将事件数据传递给其内部处理程序。 该操作将构造 和 UssdReply 并调用 FireCompletion () 以将异步操作标记为已完成。 WinRT 对客户端异步操作的完成进行模糊处理。 (他们已等待操作或具有回调 logic.)

可以在同一会话下发送更多消息。 如果维护了会话,则未来的 RequestType 将为 WwanUssdRequestContinue。

关闭

步骤 18 后,客户端已收到对其 UssdMessage 的答复。 他们不一定继续使用活动的 UssdSession 发送其他消息。 假设将来的某个时候,客户端将在 UssdSession 上手动调用 Close () 。 如果客户端未显式调用 Close () ,则会在 UssdSession 的析构函数期间调用它。

客户端在 UssdSession 实例上调用 Close () 。 使用 RequestType=WwanUssdRequestCancel 创建WWAN_USSD_REQUEST。 请求将发送到m_wwanWrapper,如步骤 9 中所示。 请求将发送到 WwanService,如步骤 10 所示。

此请求的结果并不重要。 出于所有意向和目的,会话将关闭。 即使在消息从未以某种方式传递的极端边缘情况下,新的 USSD 会话也始终会替代现有会话。

硬件实验室工具包 (HLK) 测试

请参阅 安装 HLK 的步骤。

在 HLK Studio 中,连接到设备手机网络调制解调器驱动程序并运行测试: Win6_4.MB。Gsm。Data.TestUssd。

MB USSD 故障排除指南

使用 MB 收集日志中的说明 收集和解码日志。

用于筛选的关键字

OID_WWAN_USSD NDIS_STATUS_WWAN_USSD WWAN_USSD_REQUEST WWAN_USSD_EVENT 另请参阅

MB USSD 操作



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3