You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Zebra DataWedge 11.3.28 Intent广播检测RFD40+TC21扳机按下

如何在RFD40 + TC21设备上通过Zebra DataWedge 11.3.28的Intent广播编程检测RFID枪扳机按下状态?

要实现检测RFID硬件扳机的按下/释放状态,需调整DataWedge配置以触发对应Intent广播,并在应用中监听这些事件。以下是具体步骤和代码修改:

1. 修改DataWedge配置,启用扳机状态事件输出

在你的DataWedgeUtility.createDWProfile方法中,需在RFID插件参数列表里添加启用扳机状态事件的配置,确保Intent输出插件能传递这些状态信息:

object DataWedgeUtility {
    private const val PROFILE_NAME = "DW_my_app"
    private const val ACTION_DATAWEDGE = "com.symbol.datawedge.api.ACTION"
    private const val EXTRA_CREATE_PROFILE = "com.symbol.datawedge.api.CREATE_PROFILE"
    private const val EXTRA_SET_CONFIG = "com.symbol.datawedge.api.SET_CONFIG"

    fun createDWProfile(context: Context) {
        sendDataWedgeIntentWithExtra(
            context,
            ACTION_DATAWEDGE,
            EXTRA_CREATE_PROFILE,
            PROFILE_NAME
        )

        val profileConfig = Bundle()
        profileConfig.putString("PROFILE_NAME", PROFILE_NAME)
        profileConfig.putString("PROFILE_ENABLED", "true")
        profileConfig.putString("CONFIG_MODE", "UPDATE")
        val rfidConfig = Bundle()
        rfidConfig.putString("PLUGIN_NAME", "RFID")
        rfidConfig.putString("RESET_CONFIG", "true")

        val rfidProps = Bundle()
        // 保留原有RFID配置参数
        rfidProps.putString("rfid_input_enabled", "true")
        rfidProps.putString("rfid_beeper_enable", "true")
        rfidProps.putString("rfid_antenna_transmit_power", "25")
        rfidProps.putString("rfid_memory_bank", "0")
        rfidProps.putString("rfid_session", "1")
        rfidProps.putString("rfid_filter_duplicate_tags", "true")
        rfidProps.putString("rfid_hardware_trigger_enabled", "true")
        rfidProps.putString("rfid_trigger_mode", "1")
        rfidProps.putString("rfid_tag_read_duration", "100")
        
        // 新增:启用扳机状态事件广播
        rfidProps.putString("rfid_trigger_event_enabled", "true")
        // 设置扳机状态事件的自定义Intent Action
        rfidProps.putString("rfid_trigger_event_intent_action", 
            context.resources.getString(R.string.rfid_trigger_intent_action))
        // 设置Intent传递模式:0为广播模式
        rfidProps.putString("rfid_trigger_event_intent_delivery", "0")

        rfidConfig.putBundle("PARAM_LIST", rfidProps)
        profileConfig.putBundle("PLUGIN_CONFIG", rfidConfig)
        val appConfig = Bundle()
        appConfig.putString(
            "PACKAGE_NAME",
            context.packageName
        )
        appConfig.putStringArray("ACTIVITY_LIST", arrayOf("*"))
        profileConfig.putParcelableArray("APP_LIST", arrayOf(appConfig))
        sendDataWedgeIntentWithExtra(context, ACTION_DATAWEDGE, EXTRA_SET_CONFIG, profileConfig)

        // 保留原有Intent输出、键盘输出配置代码...
    }

    // 保留原有sendDataWedgeIntentWithExtra方法...
}

2. 在Activity中监听扳机状态Intent

基于你现有的单Activity+EventBus架构,扩展onNewIntent逻辑以处理扳机状态事件:

首先在strings.xml中添加自定义的扳机Intent Action:

<string name="rfid_trigger_intent_action">com.yourpackage.rfid.TRIGGER_EVENT</string>

然后修改MainActivity代码:

class MainActivity : AppCompatActivity() {
    private var readingFlag = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        DataWedgeUtility.createDWProfile(this)
        // 其他初始化代码...
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        val action = intent.action
        val scanAction = resources.getString(R.string.activity_intent_filter_action)
        val triggerAction = resources.getString(R.string.rfid_trigger_intent_action)

        when(action) {
            scanAction -> handleScanData(intent)
            triggerAction -> handleTriggerEvent(intent)
        }
    }

    private fun handleScanData(intent: Intent) {
        // 保留原有处理RFID扫描数据的逻辑
        try {
            val epc = intent.getStringExtra(resources.getString(R.string.datawedge_intent_key_data))
            epc?.takeIf { it.isNotBlank() }?.let {
                val tagList = it.split("\n")
                tagList.forEach { tag ->
                    EventBus.getDefault().post(TagReadEvent(epc = tag))
                }
            }
        } catch (e: Exception) {
            // 异常处理
        }
    }

    private fun handleTriggerEvent(intent: Intent) {
        // 获取扳机状态:1为按下,0为释放
        val triggerState = intent.getIntExtra("com.symbol.datawedge.api.TRIGGER_STATE", -1)
        when(triggerState) {
            1 -> {
                readingFlag = true
                // 发送扳机按下事件给Fragment
                EventBus.getDefault().post(RfidTriggerEvent(isPressed = true))
            }
            0 -> {
                readingFlag = false
                // 发送扳机释放事件给Fragment
                EventBus.getDefault().post(RfidTriggerEvent(isPressed = false))
            }
        }
    }

    // 保留原有softRfidTrigger方法...
}

3. 定义Trigger事件类

创建EventBus事件类,用于Activity与Fragment间传递扳机状态:

data class RfidTriggerEvent(val isPressed: Boolean)

关键说明

  • rfid_trigger_event_enabled设为"true"后,DataWedge会在扳机按下、释放时分别发送Intent广播
  • 扳机状态通过com.symbol.datawedge.api.TRIGGER_STATE Extra传递,值1表示按下,0表示释放
  • 建议将扫描数据Intent与扳机状态Intent的Action区分开,避免逻辑混淆

内容的提问来源于stack exchange,提问作者MarioV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 19:22:04