1.开发包介绍
此开发主要是针对AOVX的产品,对设备上行数据进行解码以及平台下行控制命令进行组包的工具包。使用的目标框架是.NET Framework 4.5.2,如果您的开发程序不是使用的此框架,可以拿到开发包的框架源码后修改工具包的目标框架,修改方法如下:
1.1.修改目标框架
选中工具源码中的项目,点击“属性”
然后在目标框架下拉框找到自己项目相同的框架即可。
2.源码说明
2.1.源码简介
工具包一共包含了3个项目:
Jt808CommandEncoder:给平台设备下发控制命令时对平台下行命令进行组包,然后管理设备接入的系统可以将组包后的数据下发至设备。
Jt808DataParser:管理设备接入的系统当接收到设备上报的数据后可以调用此项目中的解析数据方法,将设备上报到平台的数据进行解码,解析成JSON格式字符串。
Test:测试工具,用来验证对数据解码与下行指令组包。
2.2.Jt808CommandEncoder
CommandEncoder:是平台下行指令组包的入口方法类。
是按指令消息ID进行方法封装,每个消息ID封装为两个不同返回类型的消息,别人是返回16进制字符串和byte[]
2.2.1 0x8103(设置终端参数)
public static string setDeviceParameterForHex(string deviceId, int msgFlowId, Dictionary<Int32,Object> dicParameters)
public static byte[] setDeviceParameterForBytes(string deviceId, int msgFlowId, Dictionary<Int32, Object> dicParameters)
方法:setDeviceParameterForHex:对命令进行组包并返回16进制字符串
方法:setDeviceParameterForBytes:对命令进行组包并返回字节数组
参数1:deviceId:设备S/N码,即设备12位的编号
参数2:msgFlowId:下发指令的流水号(2个字节(1~65535)),这个需要进行存储,用来匹配设备对此命令的应答
参数3:dicParameters:下发参数字典;其中:key对应的是下图中的“参数ID”
value对应的是对应参数ID填入需要设置的参数内容。
2.2.2 0x8104(查询终端参数)
public static string queryDeviceParameterForHex(string deviceId, int msgFlowId)
public static byte[] queryDeviceParameterForBytes(string deviceId, int msgFlowId)
方法:queryDeviceParameterForHex:对命令进行组包并返回16进制字符串
方法:queryDeviceParameterForBytes:对命令进行组包并返回字节数组
参数1:deviceId:设备S/N码,即设备12位的编号
参数2:msgFlowId:下发指令的流水号(2个字节(1~65535)),这个需要进行存储,用来匹配设备对此命令的应答
2.2.3 0x8105(终端控制命令)
public static string deviceControlCommandForHex(string deviceId, int msgFlowId, Dictionary<int, Object> dicParameter)
public static byte[] deviceControlCommandForBytes(string deviceId, int msgFlowId, Dictionary<int, Object> dicParameter)
方法:queryDeviceParameterForHex:对命令进行组包并返回16进制字符串
方法:queryDeviceParameterForBytes:对命令进行组包并返回字节数组
参数1:deviceId:设备S/N码,即设备12位的编号
参数2:msgFlowId:下发指令的流水号(2个字节(1~65535)),这个需要进行存储,用来匹配设备对此命令的应答
参数3:dicParameters:下发参数字典;其中:key对应的是下图中的“命令字”
value对应的是对应命令字的特定参数。
如果命令字是4或者5,则value对应null或者""
如果命令字是32,则value对应是一个字典Dictionary<String, String>,其中key为TYPE、MODE、VERSION、PROTOCOL、URL、MD5
value为他们对应的内容。
如果命令字是33,则value为0(开)或者1(关)
如果命令字是34,则value为0(关)或者1(开)
如果命令字是35,则value对应是一个字典Dictionary<String, String>,CHANNEL、MODE
value为他们对应的内容。
如果命令字是36,则value对应的是AT命令字符串
2.3.Jt808DataParser
DataParser:是设备上行数据解包入口方法类。
如果传过来的是16进制字符串,则调用
public static string receiveData(string strData)
将16进制字符串解析成为JSON字符串并输出
如果传过来的是byte[],则调用
public static string receiveData(byte[] bytes)
将二进制数据解析成为JOSN字符串并输出
解析方法返回的统一格式为
public class Result
{
/// <summary>
/// Device ID
/// </summary>
public string DeviceID { get; set; }
/// <summary>
/// Message type
/// </summary>
public string MsgType { get; set; }
/// <summary>
/// Message serial number
/// </summary>
public int MsgFlowId { get; set; }
/// <summary>
/// Message body(Json)
/// </summary>
public object DataBody { get; set; }
/// <summary>
/// Need reply content
/// </summary>
public string ReplyMsg { get; set; }
}
根据MsgType的不同,DataBody对应的实体类会不同。
ReplyMsg是此消息是否需要平台进行应答,如果需要对数据进行应答则ReplyMsg是对应的应答内容(16进制字符串),如果不需要应答则ReplyMsg是空值。
2.3.1.MsgType=0x0200
则DataBody为LocationData
public class LocationData
{
/// <summary>
/// Device packaging time,(UTC+0)
/// </summary>
public string GpsTime { get; set; }
/// <summary>
/// latitude
/// </summary>
public double Latitude { get; set; }
/// <summary>
/// Longitude
/// </summary>
public double Longitude { get; set; }
/// <summary>
/// Location type(1:GNSS located;0:Not located)
/// </summary>
public int LocationType { get; set; }
/// <summary>
/// Speed(km/h)
/// </summary>
public int Speed { get; set; }
/// <summary>
/// Direction(0~360)
/// </summary>
public int Direction { get; set; }
/// <summary>
/// Mileage(km)
/// </summary>
public long Mileage { get; set; }
/// <summary>
/// Altitude(m)
/// </summary>
public int Altitude { get; set; }
/// <summary>
/// ACC
/// </summary>
public int ACC { get; set; }
/// <summary>
/// Gnss signal
/// </summary>
public int GpsSignal { get; set; }
/// <summary>
/// GSM signal
/// </summary>
public int GSMSignal { get; set; }
/// <summary>
/// Alarm value list
/// </summary>
public List<int> AlarmTypeList { get; set; }
/// <summary>
/// Expansion Information Map
/// </summary>
public Dictionary<string, Object> ExtraInfoMap { get; set; }
}
2.3.2.如果MsgType=0x0001
则DataBody为GeneralResponse
public class GeneralResponse
{
/// <summary>
/// Response serial number
/// </summary>
public int ResponseSequence { get; set; }
/// <summary>
/// Response message ID
/// </summary>
public string ResponseID { get; set; }
/// <summary>
/// Response result
/// </summary>
public int Result { get; set; }
}
2.3.3.如果MsgType=0x0002
则DataBody为null,0x0002是心跳包
2.3.4.如果MsgType=0x0100
则DataBody为DeviceRegistration
public class DeviceRegistration
{
public int ProvinceId { get; set; }
public int CityId { get; set; }
public string ProducerId { get; set; }
public string DeviceType { get; set; }
public string DeviceID { get; set; }
public int LicensePlateColor { get; set; }
public string VehicleNo { get; set; }
}
2.3.5.如果MsgType=0x0102
则DataBody为String,内容是终端鉴权码
2.3.6.如果MsgType=0x0104
则DataBody为DeviceParameter
public class DeviceParameter
{
/// <summary>
/// Response serial number
/// </summary>
public int ReplyMsgFlowId { get; set; }
/// <summary>
/// Number of response parameters
/// </summary>
public int ItemCount { get; set; }
/// <summary>
/// Response parameter list
/// </summary>
public Dictionary<string,object> ItemMap { get; set; }
}
2.3.7.如果MsgType=0x0900
则DataBody为TransparentMessage
public class TransparentMessage
{
/// <summary>
/// Transparent message type
/// </summary>
public int MsgType;
/// <summary>
/// Transparent message content
/// </summary>
public string MsgContent;
}
2.4.Test
测试工具,这里代码不进行过多说明,仅仅进行简单的使用介绍
Uplink decoding 是对设备上报的数据进行解码
左侧是拆包说明,即对原始数据进行分包介绍
右侧是将原始数据解析成JSON字符串
Downlink encoding 是对指令数据进行组包
上述是我给终端设置主IP的命令组包,其中:
Server APN:CMIOT
APN username:TEST
APN password:123456
Main server address:124.223.60.234
Server port:6608
在下面Encoded message:会显示出组包的指令内容
7E8103003C7300579323640001050000001005434D494F540000001104544553540000001206313233343536000000130F3132342E3232332E3036302E3233340000001804000019D0F37E
最后编辑:admin 更新时间:2024-10-08 16:49