恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

Ubuntu下CAN测试实战:从SocketCAN到自动化回归

  • 首页
  • 资讯中心
  • /
  • Ubuntu下CAN测试实战:从SocketCAN到自动化回归

相关资讯

离散数学电子版高效学习:从PDF到代码验证的实践指南 2026/10/14 5:58:15
阶梯碳机制与电制氢协同的综合能源系统热电优化:MATLAB+YALMIP建模实践 2026/10/14 5:58:15
SpringBoot旅游电商平台开发实战与技术解析 2026/10/14 5:58:15

最新资讯

C# 反射获取接口特性:从 InterfaceMapping 到通用扩展方法全解析
Java+SSM+Flask学生考勤管理系统:从架构设计到答辩全攻略
仿生机器人控制器Rust重写实战:从Python裸奔到钢铁版
数据库及数据库编程
有向工作流图如何转换为结构树:并行分支与网关处理实战
大模型私有化部署到生产环境:从选型到运维的完整实战指南

今日推荐

IBM Verify Identity Access 修复 22 个漏洞:两个 9.8 严重 RCE 无需认证
小区物业管理系统
小型超市仓库管理系统

本周热门

UE动画修改实战:从资产编辑到重定向与蒙太奇驱动
统计随机数生成器攻击下的KLJN安全密钥交换协议Matlab仿真
政务API安全治理:资产测绘、低代码编排与行标对标实践

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

Ubuntu下CAN测试实战:从SocketCAN到自动化回归

发布时间:2026/10/14 5:58:15
Ubuntu下CAN测试实战:从SocketCAN到自动化回归 去年我在某个嵌入式项目里调两套控制板之间的CAN通信数据时通时断现场没有Windows调试器身边只有一台Ubuntu笔记本。也就是从那次开始我把Linux下的CAN测试方法整套梳理了一遍虚拟接口、真实USB转CAN适配器、命令行抓包、自动化脚本每一层都自己踩过。这篇文章就把我平时在Ubuntu上做CAN测试的完整手法和踩坑笔记分享出来涵盖内核支持检查、工具安装、vcan虚拟总线验证、真实硬件接入、常用命令组合以及自动化回归的思路。无论你是刚开始接触CAN总线还是已经在调车载控制器、工业设备或机器人内部通信这套方法都可以直接参考。我尽量把每一步背后的“为什么”也讲清楚而不是只贴命令。1. 为什么要在Ubuntu上做CAN测试场景、硬件形态与SocketCAN框架1.1 哪些项目会用到Ubuntu CAN测试CAN总线在汽车电子、工业控制、医疗设备、机器人领域非常普遍。常见的使用场景包括调试整车控制器和BMS之间的报文、验证充电桩通信协议、读取伺服驱动器的状态帧、对传感器网络做压力测试等。这些项目里控制板往往运行在RTOS或裸机上但开发调试主机是Ubuntu。在Ubuntu上做CAN测试核心价值不在于“能收发”而在于测试能力可以脚本化、自动化、可重复。相比Windows上许多图形软件Linux下的SocketCAN框架能把CAN网络接口当作普通网络接口处理配合命令行工具和编程库很容易把一次手动测试变成一个可回放的回归用例。这种能力在批量验证节点配置、压测总线负载时非常有用。1.2 常见硬件形态与选型差异我自己接触过的CAN测试硬件主要有四种形态各有适用场景硬件形态典型用途优点需要注意的点USB转CAN适配器笔记本/工控机临时调试即插即用便携驱动兼容性差异大延迟偏高PCIe/迷你PCIe CAN卡长时间测试机稳定多通道安装稍复杂价格偏高板载CAN控制器嵌入式Linux板卡自测集成度高性能好引脚外接线调试样机才方便vcan虚拟接口无硬件环境验证协议零成本可重复没有物理层测不了电磁兼容和接线问题如果只是做协议解析和报文逻辑验证vcan虚拟接口就够用。如果需要验证真实总线通信和物理层稳定性至少要一个USB转CAN适配器同时对端最好再接一个真实CAN节点否则没法判断总线上的信号质量。1.3 Linux下CAN测试的技术栈SocketCAN为什么值得依赖Linux内核里有一套名叫SocketCAN的CAN总线实现框架它不是某个单独驱动而是一整套协议栈。SocketCAN把每个CAN接口抽象成网络接口设备用户可以用socket接口、网络工具、抓包工具去操作比如candump抓包本质上是读取AF_CAN套接字的数据tcpdump也能直接捕获CAN接口的报文。选SocketCAN的好处有很多。首先它对上层应用是统一接口底层无论接的是USB适配器还是板载控制器应用层代码不用改。其次它对标准CAN和CAN FD、SJA1000等控制器都有支持测试工具链成熟。最后配合Linux的权限管理、网络命名空间、systemd服务测试环境可以做成自动化服务。当然SocketCAN也不是万能的。它主要工作在链路层和应用层不会帮你分析电磁干扰、总线终端电阻、线束长度等物理层问题。物理层问题需要靠示波器、CAN分析仪或者总线错误统计来辅助判断。也就是说Ubuntu上的CAN测试重点解决“协议通不通、数据对不对、压力大不大”这三类问题。2. 环境搭建从内核模块到 can-utils 的完整准备链路2.1 先确认内核有没有CAN支持大多数现代Ubuntu发行版默认内核已经包含CAN子系统但不同内核版本的模块启用情况不一样。裸机安装的Ubuntu Server往往裁剪较多需要手动确认和安装相关内核模块。第一步是看内核版本和已加载模块uname -r modinfo can # 查看can模块信息能看到说明内核支持CAN lsmod | grep can # 看当前是否已加载如果没有输出版本信息或缺少必要模块先更新内核或安装linux-modules-extra对应版本包sudo apt update sudo apt install linux-modules-extra-$(uname -r)SocketCAN核心涉及的模块包括can总线核心、can_raw裸CAN协议、can_bcm广播管理、can_dev设备驱动基础、vcan虚拟CAN接口。USB转CAN适配器常用的是gs_usb或厂商提供的兼容模块。确认这些模块存在的方法是modinfo can_raw modinfo vcan modinfo gs_usb只要这几个模块能查到信息基础环境就没什么问题。2.2 安装测试工具包Ubuntu下最常用的CAN测试工具是can-utils里面包含candump、cansend、cangen、canplayer、cansniffer等实用命令。安装很简单sudo apt install can-utils安装完成后可以用dpkg -L can-utils查看工具列表。除了can-utils我建议再装两个辅助工具iproute2几乎所有Ubuntu都有和wireshark抓包分析用。Wireshark体积较大如果只是简单看报文can-utils就够用但要做深度过滤和协议解析Wireshark的CAN dissector非常值得装。2.3 加载内核模块并配置用户权限模块加载有两种方式。临时生效直接modprobesudo modprobe can sudo modprobe can_raw sudo modprobe vcan要让模块开机自动加载可以写入/etc/modules-load.d/can.conf每行一个模块名can can_raw can_dev vcan gs_usb如果设备插入后没有自动创建设备节点或者普通用户执行ip link set can0 up提示Operation not permitted需要配置udev规则。比较通用的做法是创建一个/etc/udev/rules.d/50-can.rules把CAN设备和网络管理权限放开SUBSYSTEMnet, ACTIONadd, KERNELcan*, NAMEcan%n, MODE0660这里can%n是动态编号规则配置完重新插拔设备或执行sudo udevadm control --reload。需要注意MODE0660只是节点权限实际使用网络接口仍然需要root或对应的capability。日常调试直接用sudo就够了自动化服务里再用systemd的CapabilityBoundingSet来限制权限。还有一个小经验USB转CAN适配器插入后接口名可能是can0也可能是can1和插入顺序有关。如果系统有多个物理设备最好通过udev规则按设备序列号绑定固定名称比如KERNELcan*, SUBSYSTEMnet, ATTR{device/serial}xxx, NAMEcan_ecu1。否则测试脚本里写死can0换一次插拔顺序就全乱套。3. 零硬件跑通测试vcan 虚拟接口的部署与收发验证3.1 为什么先玩vcan很多刚从Windows图形调试软件转过来的朋友不太理解vcan的价值总觉得虚拟接口没有真实硬件测了没意义。实际上vcan跑通的是一次完整的SocketCAN链路网络接口配置、can协议套接字、上层解析程序。它对应用层逻辑验证、协议栈自测、脚本调试非常高效且完全可重复。我通常的做法是先在vcan上把命令验证一遍确认抓包格式、过滤规则、发送内容都符合预期再切换到真实总线上。这样能隔离问题范围避免把“命令敲错”和“总线物理层异常”混在一起排查。3.2 创建vcan接口并配置加载vcan模块后创建虚拟接口的命令如下sudo modprobe vcan sudo ip link add dev vcan0 type vcan sudo ip link set vcan0 up注意ip link add这一步如果提示RTNETLINK answers: File exists说明接口已存在直接用ip link set vcan0 up即可。vcan接口没有位速率概念因为它不经过物理收发器不需要配置bitrate。但如果你后续用脚本统一配置真实接口可以保留一条ip link set can0 type can bitrate 500000的命令在vcan上不让加这一点踩坑时要注意区分。查看接口信息ip link show vcan0输出里能看到vcan0状态为UP说明虚拟接口已经可用。3.3 跑通第一条报文candump和cansend的配合现在开两个终端。终端A先抓包candump vcan0终端B发送一条标准帧cansend vcan0 123#DEADBEEF终端A会看到类似输出vcan0 123 [8] DE AD BE EF这里的格式是接口名、仲裁ID、数据长度、十六进制数据。123#DEADBEEF中的#前后分别是ID和数据数据长度由实际字节数决定。如果要发零字节帧写法是cansend vcan0 123#。如果要发扩展帧或RTR帧可以在工具参数里指定不过标准CAN帧已经覆盖绝大多数调试场景。还可以用cangen发连续的随机报文快速验证接收端是否稳定cangen vcan0 -g 5 -I 0x123 -L 8 -n 100-g 5表示每5毫秒发一帧-I固定ID-L固定长度-n限制只发100帧。这个组合很适合做简单的吞吐测试和抓包稳定测试。验证收发计数可以用ip -details -statistics link show vcan0输出中包含RX: bytes packets errors dropped overrun mcast以及TX:统计一旦看到发送和接收计数的packets都在增长说明整个SocketCAN数据通路没问题。4. 接上真实设备USB转CAN适配器的连接、驱动与双节点实测4.1 设备识别与驱动自动加载vcan验证只能证明软件层通顺真实CAN总线要看的物理层稳定、终端匹配、波特率一致性必须靠实际设备测试。把USB转CAN适配器插到Ubuntu机器上先执行dmesg | tail -20正常情况能看到类似usb 1-2: new full-speed USB device以及gs_usb或can0相关的日志。如果dmesg里没有任何USB设备事件先检查线缆和接口。如果识别到了USB设备但没出现can0接口多半是驱动没匹配需要手动加载对应模块sudo modprobe gs_usb加载后再ip link应该能看到can0。有些适配器芯片方案不同可能需要加载c_can、mcp251x等平台驱动具体以modinfo查询结果为准。4.2 配置位速率、采样点与状态机真实CAN接口的配置项比vcan多核心技术参数是位速率和采样点。在我常用的方法中配置命令是sudo ip link set can0 type can bitrate 500000 sample-point 0.875 sudo ip link set can0 upbitrate 500000就是500kbps这是汽车动力CAN最常见的速率之一。sample-point 0.875表示采样点位于位时间87.5%的位置这个参数影响抗干扰能力和传输距离。对125kbps或250kbps的工业总线采样点通常建议在80%左右。配置完成后查看接口ip -details link show can0输出里会显示can0 state UP以及bitrate 500000 sample-point 0.875。如果配置完后直接up就失败提示RTNETLINK answers: Device or resource busy通常是因为link set can0 up之前已经设置过一次参数再次修改参数需要先down再setsudo ip link set can0 down sudo ip link set can0 type can bitrate 500000 sudo ip link set can0 up4.3 双节点互联从线缆到协议真实总线测试至少要两个节点一端是Ubuntu加USB适配器另一端可以是另一个相同适配器也可以是开发板上的CAN控制器。接线需要把CAN_H接CAN_HCAN_L接CAN_L并且共地。共地问题经常被忽略两个设备如果各用各的电源即使CAN_H和CAN_L接对了也可能由于地电位差导致大量错误帧。两端都接好后分别在两个端抓包。一端发送cansend can0 1A0#0102030405060708另一端用candump can0接收。如果链路没问题另一端能看到同样ID和数据的帧。如果想测试总线错误统计可以故意把两端的波特率配置成不一致一端的ip -s -details link show can0里会看到error计数不断上涨。有一种很实用的操作是让一端用cangen持续发送另一端用candump -c统计收到的帧数cangen can0 -g 10 -n 1000 # 后台发1000帧 candump -c can0 # 实时计数实际跑下来如果接收计数最终稳定在1000左右且没有任何错误计数说明物理链路和协议层都正常。4.4 终端电阻和普通节点负载CAN总线要求两端各有一个120欧姆终端电阻但如果测试时只在USB适配器这一端能看到电阻对端设备或电脑没有终端电阻信号反射会造成通信不稳定。以前我遇到过一次短距离测试时一切正常线拉长到两米后偶发超时后来才发现是总线只有单端终端电阻。检查方法很直接总线空闲时用万用表测CAN_H和CAN_L之间的阻值应该在60欧姆左右因为两个120欧姆电阻并联。若测得120欧姆说明只有一端有终端如果接近0或无穷大说明接线有问题或者没接电阻。如果手头没有电阻可以借对端设备的终端电阻关闭功能许多CAN适配器都有内置终端电阻开关插上后总线阻值自然正确。这一点在测试前检查清楚能省去很多莫名其妙的排障时间。5. 收发只是一半candump、cansend、cangen 的组合用法与数据解读5.1 candump的过滤规则与输出格式candump是抓包主力默认输出所有经过该接口的报文。如果要按ID过滤比如只看ID为0x123的帧candump can0 -f 0x123如果要看一个ID范围用掩码语法candump can0 -f 0x100:0x1FF这里的0x100:0x1FF并不是简单的区间而是CAN ID过滤掩码表达可以理解为“包含起始ID到结束ID的范围”用起来直观足够日常调试。输出格式默认带接口名和ID想看时间戳可以加-t d输出格式类似(0.123456) can0 123 [8] 01 02 03 04 05 06 07 08如果想保存成文本日志方便后续用canplayer回放可以执行candump -L can0 canlog.txt5.2 cangen做压力测试cangen的用途是生成CAN报文既可以做随机流量也可以按固定ID和内容生成。压力测试时常见做法是cangen can0 -g 1 -I 0x100 -L 8 -x -n 100000其中-x表示生成扩展帧。通过调整-g可以模拟不同的总线负载率。计算总线负载率有一个简单公式帧长度约等于1 ID位数 数据字节数 帧间隔的换算以500kbps、标准帧8字节为例单帧约占用240微秒每毫秒发一帧的负载率约24%。如果-g 1跑起来接收端报错说明总线处理能力或物理层存在问题。cangen还支持从文件读取序列配合cansend逐条回放。这在复现bug时很好用把现场抓的log用canplayer重放观察问题是否能复现。5.3 数据解读DLC、字节序与常见协议特征CAN报文的DLC字段表示数据长度而数据本身没有字节序标准。同样一个16位的数值可以是高字节在前也可以是低字节在前取决于具体协议定义。调试时最容易踩的坑就是把发送端和接收端的字节序理解反了。以CANopen协议为例对象字典的数据通常是低字节在前。调试时先用已知值测试例如发送0x0102如果收到的是02 01说明双方字节序不一致需要调整。不要试图通过抓包软件自动推断字节序软件只能识别协议无法判断物理量到底按什么字节序传输必须回到协议文档确认。5.4 用Wireshark分析CAN抓包文件虽然can-utils命令行已经能满足大部分需求但面对大量报文时Wireshark的过滤和图形化界面更直观。Capture时可以直接让tcpdump从CAN接口抓包sudo tcpdump -i can0 -w can.pcap抓够时间后CtrlC停止然后把can.pcap用Wireshark打开。Wireshark对SocketCAN的pcap有专门解析器能看到每个报文的ID、DLC、数据字段以及错误帧标记。它的显示过滤规则类似can.id 0x123配合时间线视图能快速看清某一段时间里总线上到底有哪些报文。如果没有root权限tcpdump会给出权限提示要么用sudo要么把用户加入对应组并配置capability。不建议长期用root跑测试机但抓包临时用sudo是最快路径。6. 最容易被卡住的五个问题CAN测试实战中的踩坑与排查思路6.1 接口存在但状态无法变UP现象ip link set can0 up命令报RTNETLINK answers: Device or resource busy。这个错误最常见的原因是接口处于down状态时先设置了bitrate然后直接再次设置或者是有其他程序占用了接口。解决方法是先down再set再up另外可以用ip -details link show can0看当前状态。如果确认没有占用程序加restart-ms参数解决总线关闭状态的恢复时间sudo ip link set can0 type can bitrate 500000 restart-ms 100 sudo ip link set can0 uprestart-ms表示在总线错误导致控制器进入Bus Off状态后经过100毫秒自动恢复。没加这个参数时控制器一旦Bus Off就只能手动重启接口测试中很容易出现“程序还活着但CAN不收了”的诡异现象。6.2 通讯失败但接口状态显示UP这是最隐蔽的一类问题。接口是UP的candump也有输出但就是收不到对端报文。排查顺序我建议按以下链路走先用ip -details -statistics link show can0看错误计数如果RX error或TX error持续增长问题在物理层。确认两端位速率一致用ip -details link show can0查看本端配置再和对端配置比对。位速率差一点都会导致错误帧风暴。确认终端电阻和共地用万用表测量CAN_H和CAN_L之间阻值理想应为60欧姆左右。检查线序CAN_H和CAN_L接反是最常见的低级错误。如果以上都正常把对端接到另一个USB适配器上测试排除对端硬件问题。实际操作中我发现第2和第3项的坑概率最高尤其是对端设备可能默认速率是250kbps而本端设成500kbps。调试到这里时先用candump can0观察是否出现大量错误帧或总线错误日志再决定是否修改速率。6.3 权限不足导致无法操作Ubuntu桌面版一般创建网络接口需要root权限。如果不想每次sudo可以把用户加入sudo组或者给can工具程序特定capability。对于个人调试最稳妥的方式仍然是sudo执行关键命令不要给普通用户放开全部权限尤其是自动化服务脚本。如果遇到Operation not permitted且你确定自己是root检查是否开启了SELinux或者容器环境限制。容器里跑SocketCAN测试时需要--cap-add NET_ADMIN等权限否则即使root也无法操作网络接口。这一点在Docker测试环境里是高频坑。6.4 抓包只有本端发送、看不到对端报文出现这个现象往往不是物理链路坏了而是对端设备没有真正发帧。比如对端板卡的程序没跑起来或者对端波特率不匹配导致发送失败。先换一台已知正常的CAN节点测试确认本端接收能力没问题再回头查对端软件。另一种情况是过滤规则把目标报文拦掉了。candump默认不过滤但如果你之前用了-f或-g参数记得重启终端或去掉过滤参数再试。6.5 总线错误计数上升但数据还能收这个现象容易让人误判“通信正常”。错误帧会持续消耗总线带宽传输距离长后问题会爆发。建议用ip -s -details link show can0观察bus error计数如果持续增长优先检查线束长度、终端电阻、共地质量并降低位速率或调整采样点测试。我遇到过一种情况CAN_H和CAN_L线过长且没有终端电阻短距离偶尔能通拉长后错误计数线性上升。把终端电阻补上并把位速率从1M降到500k后错误清零。这说明测试时不要只看“报文有没有收到”还要看错误统计错误帧本身就是总线健康度的重要指标。7. 从手动测试到自动化脚本化CAN回归测试与报文分析7.1 用Shell脚本做一套最小回归测试手动测试没法保证每次敲的命令一致自动化回归能快速发现代码改动引起的通信问题。我常用一套简单脚本发送端固定频率发1000帧接收端统计收到的帧数与理论值对比。#!/bin/bash set -e IFACE${IFACE:-vcan0} EXPECTED${EXPECTED:-1000} candump $IFACE -n $EXPECTED -e stat.csv /dev/null DUMP_PID$! sleep 0.5 cangen $IFACE -g 5 -I 0x123 -L 8 -n $EXPECTED wait $DUMP_PID echo 测试完成接收帧数应为 $EXPECTED实际执行时如果接收端没有收到全部帧脚本退出码或输出计数会暴露问题。更严谨的做法是把接收到的帧写文件再用wc -l统计行数candump $IFACE recv.log CANDUMP_PID$! sleep 0.5 cangen $IFACE -g 5 -n $EXPECTED /dev/null wait $CANDUMP_PID RECV$(grep -c can recv.log)注意如果接口是真实can0先确保接口已经up再跑脚本。这个脚本的容错能力有限但它是一个自动化基础骨架你可以在上面加错误率判断、重启节点、告警通知。7.2 用python-can扩展自动化能力Shell脚本适合简单场景复杂协议验证可以换用python-can库。先安装pip install python-can最简单的一段收发代码import can bus can.interface.Bus(channelvcan0, bustypesocketcan) msg can.Message(arbitration_id0x123, data[0x01, 0x02, 0x03], is_extended_idFalse) bus.send(msg) received bus.recv(timeout1.0) print(received)这里的关键是bustypesocketcanpython-can在Linux下就是调用SocketCAN接口。它可以实现按周期发送、监听指定ID、统计错误帧比Shell脚本更容易处理复杂逻辑。比如判断某ID的周期是否超过阈值这在真实总线监控中非常有用。如果项目里已经用Wireshark的tshark做协议分析可以把它和python-can串起来先用python-can向总线灌测试报文再用tshark从pcap文件提取关键字段做断言。7.3 从冒烟到回归测试向量文件与一键回放测试向量文件是我从can-utils里最喜欢的特性。先用candump -L can0 vector.txt把一次合法报文序列存下来之后用canplayer -I vector.txt回放canplayer -I vector.txt这种方式特别适合复现偶发问题。现场抓到异常报文后保存回到实验室反复回放观察被测设备是否能稳定处理。回放时建议加-v参数查看每条回放帧一旦发现回放过程中对端掉线能立刻定位到触发帧。回放文件也可以手工编辑把某一帧的数据改掉再回放。这在协议兼容性测试里很好用可以一次性构造一个包含边界值、非法字节的报文集。7.4 自动化测试的最终目标可重复、可追溯整个CAN测试工作最终追求的就是两件事可重复和可追溯。可重复意味着相同环境下跑相同测试结论一致可追溯意味着每一次测试用的是什么配置、什么工具版本、什么报文序列都能查得到。在我自己的工程习惯里每个项目目录下会维护一个can_test/文件夹里面放着接口初始化脚本、can-utils回放文件、python-can测试脚本、测试日志。初始化脚本统一设置bitrate、采样点、restart-ms回放文件和脚本保证每次执行的报文序列一致日志带上时间戳方便对比。这套东西建好之后不管是换电脑、交接项目还是回归测试都能快速进入状态而不是重新敲一遍命令。如果测试过程中发现了新问题直接在回放文件或测试脚本里加一条用例跑失败后把当时的日志和配置一起贴到问题单里后续定位效率会高出不少。最后再分享一个实际经验无论多自信但凡要测真实总线一定先把vcan环境跑熟再接USB适配器。vcan排除的不仅是软件问题还能帮你提前发现脚本里的逻辑错误。真正接真线时一次成功会节省大量时间而万一失败问题范围也被缩小到了物理层和硬件配置不会再怀疑SocketCAN本身。另外测试时记得给每个适配器贴个标签标注默认速率避免来回调试时“这设备以前设置过什么”的困惑。这个细节看起来小但真的会救你一次。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号