短信模块{ #android_sdk_sms_module }¶
SMS模块可用作Internet连接不可用时的后备方法,以上传数据。它需要在服务器中进行其他设置:必须在服务器中配置SMS网关才能接收SMS;可选地,服务器可能具有将SMS发送回带有响应的客户端的功能。
取决于移动提供商,发送SMS可能意味着额外的费用。因此,SMS模块仅用于**粒度数据上传**。它不用于元数据下载或批量数据下载/上传。此外,数据是使用[SMS压缩库](https://github.com/dhis2/sms-compression)压缩的,因此内容可以容纳较少的消息。该库与后端共享。
出于测试目的,您可以使用[DHIS2 Android SMS网关](https://github.com/dhis2/dhis2-sms-android-gateway)。
在 SDK 中,可通过 D2 访问 SMS 模块。
d2.smsModule()
默认情况下禁用此模块,并且必须明确启用和配置该模块。它包括三个可以访问模块功能的组件。
- ConfigCase:用于设置所有短信发送任务通用的初始数据,如网关号码、超时、执行下载 元数据 ids 对象。
- 短信提交案例。它用于转换Sdk将发送的*DHIS2*数据,通过短信发送并检查提交进度和结果。
- QrCodeCase:用于将 DHIS2 数据转换为字符串。该字符串是 DHIS2 数据的压缩表示。这对于避免通过短信发送大量内容很有用。
使用SMS模块的典型工作流程如下:
- 启用短信模块。
- 同步元数据。 SMS 模块从服务器下载其他元数据,因此必须在 Internet 连接可用时且**在**模块启用后完成此步骤。
- 使用短信模块发送数据。
这是典型工作流程的代码示例(为了简化代码,它使用了阻塞方法):
// Enable SMS Module
d2.smsModule().configCase().setModuleEnabled(true).blockingAwait();
// Sync SMS Module metadata using SMS Module
d2.smsModule().configCase().refreshMetadataIds().blockingAwait();
// or using metadata module
d2.metadataModule().blockingDownload();
// Configure, at least, the gateway number. See ConfigCase for more parameters
d2.smsModule().configCase().setGatewayNumber("gateway-number").blockingAwait();
// Send data. For example a tracker event:
SmsSubmitCase case = d2.smsModule().smsSubmitCase();
Integer numSMSs = case.convertTrackerEvent("event-uid").blockingGet();
case.send().blockingSubscribe();
短信版本¶
SMS以压缩格式从服务器发送到服务器。该任务由[SMS压缩库](https://github.com/dhis2/sms-compression)完成,它负责在纯文本和压缩格式之间进行转换。
SDK包含压缩库的最新可用版本,但不能保证服务器也正在使用它。因此,需要检查服务器版本才能启用/禁用某些功能。可以通过以下方式检查服务器中的SMS版本:
d2.systemInfoModule().versionManager().getSmsVersion()
版本概述-功能:
版本1:
- 汇总数据。
- 跟踪器/事件数据,但存在一些已知的错误。我们建议不要在版本1中启用跟踪器SMS同步。
版本2:
- 添加对空列表的支持。
- 添加对事件中几何图形的支持(POINT)。
- 在事件(事件数据,截止日期)和注册(执行日期,事件日期)中添加缺少的属性。
- 添加对在同一SMS提交案例中发送注册和事件的支持。
有关更多信息,请检查[SMS压缩存储库](https://github.com/dhis2/sms-compression)。
ConfigCase¶
d2.smsModule().configCase()
使用此情况之前,请先配置SMS模块。至少需要:
- 启用模块。
- 设置网关号。
- 下载元数据ID。
还有其他可选参数可控制SDK是否应等待服务器的响应以及响应超时。另外,可以指定发件人编号,以便忽略从其他发件人收到的消息。
SmsSubmitCase¶
使用这种情况创建一个新的提交并发送。提交案例不可重复使用,只能发送一次。要创建新的提交案例,请调用方法:
SmsSubmitCase case = d2.smsModule().smsSubmitCase();
发送短信有两种选择:请求权限和直接在应用程序内发送短信;或者获取压缩消息并使用外部应用程序发送短信。
在应用程序内发送短信{ #android_sdk_sms_embedded_submit_case }¶
提交涉及以下步骤:
- 指定要提交的数据。这意味着要调用类似
convert*()这样的方法。 - 发送消息。
- (可选)检查确认短信。
例如,发送跟踪事件将类似于:
SmsSubmitCase case = d2.smsModule().smsSubmitCase();
Integer numSMSs = case.convertTrackerEvent("event-uid").blockingGet();
case.send().blockingSubscribe();
重要
该应用负责向用户询问权限(READ_PHONE_STATE,SEND_SMS,READ_SMS,RECEIVE_SMS)。否则,SMS模块将失败。
以下方法可用于设置要发送的 DHIS2 数据:
convertSimpleEvent()。设置一个简单的事件。convertTrackerEvent()。设置跟踪事件。convertEnrollment()。设置注册。convertDataSet()。设置数据集。convertRelationship()。建立关系。convertDeletion()。删除事件。
上面的方法返回一个包含消息数量的单个 物品占用。使用这些方法的示例显示在 下一个片段。
Single<Integer> convertTask = d2.smsModule().smsSubmitCase()
.convertEnrollment("enrollment_uid")
要发送之前转换的数据,Sdk 提供了一个 send() 方法。 方法,该方法会返回一个当前状态流。此外,还可以通过调用 提交 ID。
d2.smsModule().smsSubmitCase().send()
也可以通过调用 方法等待短信结果。它会返回一个 Completable 对象,其中 完成表示短信已成功接收。如果 则返回错误信息。接受的日期是 将被检查确认的最小日期。 用于跳过可能具有相同提交 ID 的旧短信。
d2.smsModule().smsSubmitCase().checkConfirmationSms(new Date());
如果某些条件未满足,这些方法可能会失败,并返回一个 PreconditionFailed 对象。 对象。前提条件错误包括
NO_NETWORK。NO_CHECK_NETWORK_PERMISSION。NO_RECEIVE_SMS_PERMISSION。NO_SEND_SMS_PERMISSION。NO_GATEWAY_NUMBER_SET。NO_USER_LOGGED_IN。NO_METADATA_DOWNLOADED。SMS_MODULE_DISABLED。
使用外部应用程序发送短信¶
使用外部应用程序提交涉及以下步骤:
- 指定要提交的数据并获取压缩信息。这意味着要调用类似
compress*()的方法。 - 使用外部应用程序发送消息。
- 如果您知道消息已发送,则可以选择标记为 SENT_VIA_SMS。
- (可选)检查确认短信。
例如,发送跟踪事件将类似于:
``java SmsSubmitCase 案例 = d2.smsModule().smsSubmitCase(); String message = case.compressTrackerEvent("event-uid").blockingGet();
// 使用外部应用程序发送短信
// 可选择将案例标记为 SENT_VIA_SMS case.markAsSentViaSMS();
// 如果你收到服务器的响应,你可以检查该消息是否与情况相符。 boolean isResponseMessage = case.isConfirmationMessage("sender_number", "message").blockingGet(); ````
QrCodeCase¶
java d2.smsModule().qrCodeCase()
使用此方法可获得数据的压缩表示形式。
QrCodeCase 可以转换下一个类型的 DHIS2 对象:
- 简单事件。使用
generateSimpleEventCode()方法并传递事件 uid。 - 跟踪事件。使用
generateTrackerEventCode()方法并传递事件 uid。 - 注册。使用
GenerateEnrollmentCode()方法并传递注册 uid。 - 关系。使用
GenerateRelationshipCode()方法并传递关系 uid。 - 数据集。使用 "生成数据集代码()"方法并传递数据集 uid、组织单位 uid、属性选项组合和周期 id。
还可以获取可用于删除事件的压缩字符串:
- 删除。使用
generateDeletionCode()方法并传递事件的 uid。
These methods returns a Single with the compressed data. The next code snippet shows an example of how it can be used.
java Single<String> convertTask = d2.smsModule().qrCodeCase().generateEnrollmentCode(enrollmentUid);