别再纠结了!CAN、串口、蓝牙、TCP这四种通信协议,到底怎么选?附Android实战代码

张开发
2026/4/15 13:28:16 15 分钟阅读

分享文章

别再纠结了!CAN、串口、蓝牙、TCP这四种通信协议,到底怎么选?附Android实战代码
工程师实战指南四大通信协议选型决策与Android代码落地在物联网和嵌入式系统开发中通信协议的选择往往决定了项目的成败。当我第一次为车载诊断设备选型时面对CAN、串口、蓝牙和TCP这四种协议整整纠结了两周时间。后来才发现每种协议都有其独特的性格和适用场景就像选择交通工具一样——短途步行中途骑车长途开车跨国飞行。本文将用真实项目经验带你避开协议选型的常见陷阱。1. 协议特性深度解析与场景匹配1.1 CAN总线工业级可靠性的双刃剑去年为某车企开发OBD诊断工具时CAN总线是我们的首选。它的多主从架构和硬件级错误处理在电磁环境复杂的发动机舱表现优异。但第一次调试时我们忽略了CAN FD灵活数据速率与传统CAN的兼容性问题导致整个测试台架通信瘫痪。典型车载CAN参数配置// CAN帧结构定义 typedef struct { uint32_t id; // 11位标准ID或29位扩展ID uint8_t dlc; // 数据长度0-8(CAN)或0-64(CAN FD) uint8_t data[8]; } CAN_Frame; // Android内核配置 adb shell echo 500000 /sys/class/net/can0/can_bittiming/bitrate但要注意波特率超过1Mbps时需确认所有节点支持CAN FD标识符分配需遵循OBD-II标准如0x7DF用于广播请求1.2 串口通信老当益壮的工业老兵在为工厂改造旧设备时发现90%的PLC仍使用RS-485串口。它的毫秒级延迟和硬件流控在强干扰环境下表现稳定。曾有个项目因未启用RTS/CTS硬件流控导致传送带传感器数据丢失率达15%。Android串口优化关键代码// 启用硬件流控 termios.c_cflag | CRTSCTS; // 自定义工业协议帧结构 byte[] buildFrame(byte cmd, byte[] data) { ByteBuffer buf ByteBuffer.allocate(3 data.length 1); buf.put((byte)0xAA); // 帧头 buf.put((byte)data.length); buf.put(cmd); buf.put(data); buf.put(calculateCRC(buf.array(), buf.position()-1)); return buf.array(); }避坑提示RS-485总线必须配置终端电阻通常120Ω否则信号反射会导致通信失败1.3 蓝牙双模消费电子的平衡之道开发智能家居网关时BLE的低功耗和SPP的稳定传输让我们难以抉择。最终采用双模策略BLE4.2用于设备发现和状态上报经典蓝牙传输固件升级包。实测发现BLE5.0的2M PHY模式在同样功耗下传输速度提升4倍。Android BLE开发核心要点// 快速扫描配置 BluetoothLeScanner scanner bluetoothAdapter.getBluetoothLeScanner(); ScanSettings settings new ScanSettings.Builder() .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES) .build(); scanner.startScan(filters, settings, scanCallback); // 高吞吐量特征配置 BluetoothGattCharacteristic characteristic new BluetoothGattCharacteristic( UUID.fromString(0000ffe1-0000-1000-8000-00805f9b34fb), BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE | // 提升吞吐 BluetoothGattCharacteristic.PROPERTY_NOTIFY, BluetoothGattCharacteristic.PERMISSION_WRITE );1.4 TCP/IP云端连接的万能钥匙在远程医疗设备项目中TCP的全球可达性成为不二选择。但4G网络下的TCP连接经常遇到队头阻塞问题。通过优化内核参数我们将视频传输延迟从3秒降至800ms# Android TCP栈优化 echo net.ipv4.tcp_sack1 /proc/sys/net/ipv4/tcp_sack echo net.ipv4.tcp_fastopen3 /proc/sys/net/ipv4/tcp_fastopen echo 4096 87380 6291456 /proc/sys/net/ipv4/tcp_rmem2. 协议选型决策矩阵实战版2.1 车载诊断设备案例需求特点实时性要求高发动机数据100Hz强电磁干扰环境已有OBD-II标准约束选型过程排除蓝牙延迟不稳定和纯TCP无直接CAN访问采用CANWiFi双通道CAN用于实时数据采集WiFi用于诊断报告上传关键代码// CAN到TCP的桥接线程 void canBridgeThread() { CANFrame frame; while((frame canBus.receive()) ! null) { if(isCriticalFrame(frame.id)) { tcpSocket.write(frameToBytes(frame)); canDb.insert(frame); // 本地存储备份 } } }2.2 工业传感器网络案例需求矛盾20台老式PLC只支持RS-485工厂要求无线化改造部分节点距离超过100米混合方案区域采集器使用RS-485转LoRa车间网关采用TCPBLE双模BLE连接手持调试终端TCP上传数据到MES系统协议转换配置# 串口到TCP的转换脚本 ser serial.Serial(/dev/ttyUSB0, 115200, rtsctsTrue) sock socket.create_connection((192.168.1.100, 502)) while True: data ser.read_until(b\x55) # 自定义协议结束符 if validate_crc(data): sock.sendall(data[1:-1]) # 去掉头尾3. Android端开发实战技巧3.1 CAN总线集成方案非Root设备解决方案使用USB-CAN适配器如PCAN-USB通过USB Host模式访问UsbManager manager (UsbManager) getSystemService(USB_SERVICE); UsbDevice canDevice findCanAdapter(manager); UsbInterface iface canDevice.getInterface(0); UsbEndpoint epIn iface.getEndpoint(0); UsbDeviceConnection connection manager.openDevice(canDevice); connection.claimInterface(iface, true); byte[] buffer new byte[16]; int len connection.bulkTransfer(epIn, buffer, buffer.length, 100);3.2 蓝牙多设备管理并发连接优化使用Android 5.0引入的BluetoothGatt队列连接参数优化// BLE连接参数协商 gatt.requestConnectionPriority(BluetoothGatt.CONNECTION_PRIORITY_HIGH); // 经典蓝牙RFCOMM优化 BluetoothSocket socket device.createRfcommSocketToServiceRecord(UUID_SPP); socket.setPerformancePreferences(1, 2, 0); // 低延迟偏好4. 调试与性能优化工具箱4.1 协议分析工具对比协议硬件工具软件方案关键指标CANPEAK-CAN ProSavvyCAN错误帧计数串口USB逻辑分析仪PulseView波特率偏差BLENordic SniffernRF Connect连接间隔TCP端口镜像交换机Wireshark tshark重传率4.2 性能优化检查清单CAN总线[ ] 使用candump检查错误帧[ ] 测量总线负载率应70%[ ] 验证终端电阻阻值BLE连接[ ] 设置合适的MTUgatt.requestMtu(247)[ ] 禁用不必要的特征通知[ ] 使用BluetoothHciSnoopLog抓包TCP传输# 监控TCP状态 adb shell cat /proc/net/tcp | grep ESTABLISHED # 查看丢包率 adb shell netstat -s | grep -E segments retransmited|packet receive errors在完成一个农业物联网项目时我们最初选择了纯BLE方案结果在大棚金属结构内信号衰减严重。最终改用LoRaBLE网关的架构LoRa负责长距离传输BLE用于设备近场配置。这个教训让我明白没有最好的协议只有最合适的组合。

更多文章