MQTT 4 ——MQTT的Spring Mvc 配置接收字節流數據


本篇記錄一下MQTT整合Spring Mvc配置直接收發字節流數據


設備方是純C開發,並且為了交互數據的安全,將傳送的數據用了AES CBC進行了加密。

接下來正常方便做法應該是

將加密后的字節流轉換成16進制字符串 或 Base64字符串進行傳送;接收方收到字符串后,再轉換成字節流進行解密即可。

但是,設備開發方堅持不改,直接把加密后的字節流數據放到MQTT里面傳過來了。所以之前配置的SPRING MQTT,就無法正常轉換數據了,接收到的字節流不論怎么進行轉換都是亂碼的格式,無法正常進行AES CBC解密。

解決辦法

解決辦法也很簡單直接,修改原來的Spring-mqtt配置文件,引入一個新的converter,並且配置payloadAsBytes為true即可

與正常的配置文件相比,區別就是在MqttPahoMessageHandler 和 message-driven-channel-adapter 中都引入一個自定義的myConvert;然后配置myConvert bean,直接繼承DefaultPahoMessageConverter,設置payloadAsBytes 為ture.

 

下面是詳細的spring-mqtt.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:int="http://www.springframework.org/schema/integration"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:int-mqtt="http://www.springframework.org/schema/integration/mqtt"
       xsi:schemaLocation="
        http://www.springframework.org/schema/integration
        http://www.springframework.org/schema/integration/spring-integration-4.1.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/integration/mqtt
        http://www.springframework.org/schema/integration/mqtt/spring-integration-mqtt-4.1.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.1.xsd  ">

    <context:property-placeholder location="classpath:mqtt.properties" ignore-unresolvable="true"/>

    <!--MQTT配置-->
    <bean id="clientFactory"
          class="org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory">
        <property name="userName" value="${mqtt.username}"/>
        <property name="password" value="${mqtt.password}"/>
        <property name="cleanSession" value="${mqtt.cleanSession}"/>
        <property name="keepAliveInterval" value="${mqtt.keepAliveInterval}"/>
        <property name="serverURIs">
            <array>
                <value>${mqtt.serverURI1}</value>
            </array>
        </property>
    </bean>

    <bean id="mqttHandler" class="org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler">
        <constructor-arg name="clientId" value="${mqtt.clientId}"/>
        <constructor-arg name="clientFactory" ref="clientFactory"/>
        <property name="converter" ref="myConvert"/>
        <property name="async" value="${mqtt.async}"/>
        <property name="defaultQos" value="${mqtt.defaultQos}"/>
        <property name="completionTimeout" value="${mqtt.completionTimeout}"/>
    </bean>

    <!-- 消息適配器  -->
    <int-mqtt:message-driven-channel-adapter
            id="mqttInbound" client-id="${mqtt.clientId}" url="${mqtt.serverURI1}"
            topics="${mqtt.topic}" qos="${mqtt.defaultQos}" client-factory="clientFactory"  auto-startup="true"
            converter="myConvert"
            send-timeout="${mqtt.completionTimeout}" channel="startCase" />
    <int:channel id="startCase" />
    <!-- 消息處理類 -->
    <int:service-activator id="handlerService"
                           input-channel="startCase" ref="mqttCaseService" method="handler" />

    <bean id="myConvert" class="org.springframework.integration.mqtt.support.DefaultPahoMessageConverter">
        <property name="payloadAsBytes" value="true" />
    </bean>

    <!-- 消息處理 -->
    <bean id="mqttCaseService" class="com.loong.mqtt.service.impl.MqttServiceImpl" />

</beans>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM