STM32F105双路隔离型CAN总线转4G控制板 - 把CAN数据发送到自建MQTT服务器,实现通过MQTT透传通信
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/product/STM32F105_2CAN/index.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
说明
这节是把设备从CAN总线接收的数据发送到MQTT, 设备从MQTT接收的数据通过CAN总线输出
测试
1,打开工程
2,根据自己的设备设置CAN波特率
3,默认连接这边的服务器进行测试,用户也可修改为自己的服务器
设备订阅的主题为: user/000001
设备发布的主题为: device/000001
4,设备日志打印如下说明连接成功
5,打开MQTT调试助手
按照下面的步骤操作
6,接上CAN总线设备
7,如果设备接收到CAN数据,将会通过MQTT服务器发送到调试助手上
数据格式说明: 01 00 00 01 02 55 55 55 55 55 55 55 55
最前面一位是0x01; 最前面的0代表这个数据是数据帧,后面的1代表第一路CAN数据,;
中间 00 00 01 02 四位是帧 ID; 最后 55 55 55 55 55 55 55 55 8位是数据
数据格式说明: 11 00 00 01 02 00 00 00 00 00 00 00 00
最前面一位是0x11; 最前面的1代表这个数据是遥控帧,后面的1代表第一路CAN数据,;
中间 00 00 01 02 四位是帧 ID; 最后 00 00 00 00 00 00 00 00 8位是数据
如果是第二路:
7,通过MQTT调试助手发送数据给设备(数据格式和上面的一致)
测试1:
假设给第一路CAN发送一个数据帧, 然后ID是 0x1234 数据是 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
这边用了CAN分析仪监测的设备数据
测试2:
假设给第一路CAN发送一个遥控帧, 然后ID是 0x1234
提示如果是遥控帧,就把第一个数据的高四位变为1
测试3:
假设给第二路CAN发送一个数据帧, 然后ID是 0x1234 数据是 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
测试4:
假设给第二路CAN发送一个遥控帧, 然后ID是 0x1234 ,后面的数据随意
提示如果是遥控帧,就把第一个数据的高四位变为1
程序说明
1,串口2接收模组数据的时候,单独使用一个缓存,缓存了TCP/IP接收的数据
2,初始化MQTT变量,注册相应的回调函数
3,连接MQTT服务器
4,发送MQTT连接协议
4.把服务器返回的数据交给mqtt_function_connect_ack 函数处理
如果返回的数据是连接成功,此函数便会调用上面注册的连接成功回调函数
5.在连接成功回调函数中订阅主题
5.连接成功MQTT服务器以后解析服务器下发的MQTT数据是下面的函数
把接收的mqtt数据交给这个函数,函数内部解析之后会调用相应的回调函数
6.接收处理MQTT消息
7.发送CAN数据
10.提示
只要是连接上MQTT了,用户只需要在任意地方调用订阅主题和发布消息就可以.
用户调用其api函数所打包的数据会存储在mqtt内部缓存管理里面,然后内部自动把数据通过tcp发送出去.
把打包好的MQTT协议数据提取出来并发送给服务器的地方是这里
其它细节
1,CAN接收的数据是存储到了环形队列
2,由于使用AT命令发送数据约有10ms左右的延迟, 如果CAN数据接收很快推荐组包发送
2,程序里面默认还获取了 IMEI,ICCID,CSQ,时间等,都解析好了,用户可以直接选择对应的变量使用
用户可以在这里更改定时获取时间参数
.