6

我目前正在搜索 WLAN 协议的规范以获取 OBDII 数据。市场上有一些 ELM327 类似的适配器,可以让 iPhone 连接到带有 WLAN 的 OBDII 接口。这是因为蓝牙串口因为配件接口被打乱了。Torque for android 等其他程序也可以使用这种通信协议。但是我没有找到创建网络客户端的规范。

欢迎任何帮助,

谢谢

4

3 回答 3

9

好的,经过更多研究,我找到了两个来源:

  1. Michael Gile有一个适用于 iOS 设备的开源库,用于与 OBDII WiFi 和蓝牙设备进行通信。
  2. PLX 设备(KiWi 的创建者)描述了如何与 KiWi 通信。描述太大,无法在此处包含,但归结为:
    • 使用 WiFi(插座)连接
    • 等到设备返回>
    • 发出命令并等待响应

可以通过发送以下格式(ASCII 字符)的命令来请求信息:

MM PP\r

其中MM是测试模式,PP是 PID,\r是回车(十六进制:)0x0d。Kiwi 会忽略所有空白字符。*测试模式 03 和 04 不需要 PID 值。

所说的“测试模式”是SAE J1979标准中定义的十种诊断模式:

Test mode   Description
01  Show current data
02  Show freeze frame data
03  Show diagnostic trouble codes
04  Clear trouble codes and stored values
05  Test results, oxygen sensors
06  Test results, non-continuously monitored
07  Show 'pending' trouble codes
08  Special control mode
09  Request vehicle information
0A  Request permanent trouble codes  

PID 值是车内传感器的代码。可能的 PID 值的(非详尽的)列表在 Wikipedia 上。

于 2013-02-28T13:02:27.533 回答
1

查看ELM327 数据表 Wifi 加密狗将 ELM327 RS232 端口透明地绑定到 TCP 服务器。没有真正的WIFI协议。您可以改为通过原始 TCP 连接使用 ELM327 协议。

您可以使用 telnet 命令发送 AT 命令和称为 PID 的 OBD2 命令:

telnet 192.168.0.1 35000

成功连接后,您可以尝试发送:

AT Z

服务器应以“ELM327”和版本号进行响应。

于 2020-04-11T23:30:29.897 回答
1

这是我在 C 和套接字中所做的:

int sockfd = 0, n = 0;
char recvBuff[1024];
struct sockaddr_in serv_addr; 
char *ip = "192.168.0.10";
char str [128];
int i;

memset(recvBuff, '0',sizeof(recvBuff));
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
    printf("\n Error : Could not create socket \n");
    return 1;
} 

memset(&serv_addr, '0', sizeof(serv_addr)); 

serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(35000); 

if(inet_pton(AF_INET, ip, &serv_addr.sin_addr)<=0)
{
    printf("\n inet_pton error occured\n");
    return 1;
} 

if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
   printf("\n Error : Connect Failed \n");
   return 1;
} 

printf ("reading...\n");
strcpy (str,"AT Z\x0d");
sleep(2);
write (sockfd, str, strlen (str)); 
while ( (n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0)
{
    recvBuff[n] = 0;
    printf ("received: ");
    if(fputs(recvBuff, stdout) == EOF)
    {
        printf("\n Error : Fputs error\n");
    }
    printf ("\r\ntype: ");
    fgets (str, sizeof (str), stdin);
    i = strlen (str);
    if (str [i-1] == 0x0a)
        str [i-1] = 0;
    strcat (str, "\x0d");
    write (sockfd, str, strlen (str)); 
    printf ("\r\n");
} 

输入 1 或 2 输入,您应该会看到提示:ELM327,然后输入您想要的任何内容,例如:AT RV(将显示电压)然后使用此 pdf 获取所有代码: https://www.obd-2 .de/carcode/dl/ELM327DS.pdf

于 2018-05-18T20:07:24.273 回答