本篇記錄一下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>