public void processMediaMsg(T808Message msg) { T808MessageHeader header = msg.getHeader(); JT_0304 pic = (JT_0304)msg.getMessageContents(); int packetNo = pic.getPicNo(); String key = msg.getSimNo() + "_" + msg.getMessageType() + "_" + pic.getPicSum()+"_"+pic.getPicName(); MediaPacket mp = msgMap.get(key); if(packetNo == 1 ) { String tip = key + "拍照第一包"; if(mp != null) tip += "包已经存在:" + mp.toString(); logger.error(tip); } if (mp == null) { mp = new MediaPacket(msg); mp.setKey(key); msgMap.put(key, mp); } if( mp.containPacket(packetNo) == false) mp.addPacket(packetNo, pic.getPicData()); else logger.error(key + "异常,该分包号已经存在,分包号:" + packetNo + ",mp:" + mp.toString()); }这段代码是干嘛的
时间: 2024-01-28 08:05:42 浏览: 77
这段代码是一个处理媒体消息的方法,其输入参数是一个T808Message类型的消息对象。该方法首先获取消息头,然后获取消息内容中的JT_0304类型的对象(pic),并从该对象中获取图片的分包号(packetNo)。接着,该方法根据SIM卡号、消息类型、图片总数和图片名称生成一个唯一的key,并从msgMap中获取对应的MediaPacket对象(mp)。如果当前分包号为1,则输出一条日志信息。如果mp为空,则创建一个新的MediaPacket对象,并将其加入到msgMap中。最后,如果该分包号还未存在于mp中,则将该分包的图片数据加入到mp中,否则输出一条异常日志信息。
相关问题
private ConcurrentLinkedQueue<T808Message> dataQueue = new ConcurrentLinkedQueue();
这是一个 Java 中的并发队列(ConcurrentLinkedQueue),用于存储 T808Message 类型的数据。它是线程安全的,可以在多线程环境下使用。在使用时,可以通过调用 offer() 方法将元素添加到队列的末尾,通过调用 poll() 方法从队列头部获取并移除元素,或通过 peek() 方法仅获取队列头部的元素而不将其移除。这个队列通常用于生产者-消费者模型中,其中生产者将数据放入队列,消费者从队列中取出数据进行处理。
jt/t808V2011消息结构代码
以下是一个简单的JT/T808-2011消息结构的代码示例,以位置信息汇报消息为例:
```python
# 定义消息头格式
class MessageHeader:
def __init__(self, msg_id, msg_attr, phone_num, msg_seq):
self.msg_id = msg_id
self.msg_attr = msg_attr
self.phone_num = phone_num
self.msg_seq = msg_seq
def to_bytes(self):
# 将消息头打包为字节流
return struct.pack("!H2BH6sH", self.msg_id, self.msg_attr,
self.phone_num, self.msg_seq)
# 定义位置信息汇报消息体格式
class LocationReport:
def __init__(self, warning_flag, status_flag, lat, lon, altitude,
speed, direction, timestamp):
self.warning_flag = warning_flag
self.status_flag = status_flag
self.lat = lat
self.lon = lon
self.altitude = altitude
self.speed = speed
self.direction = direction
self.timestamp = timestamp
def to_bytes(self):
# 将位置信息汇报消息体打包为字节流
return struct.pack("!B3I2HB5s", self.warning_flag, self.status_flag,
self.lat, self.lon, self.altitude, self.speed,
self.direction, self.timestamp)
# 构造位置信息汇报消息
msg_id = 0x0200 # 消息ID
msg_attr = 0x0000 # 消息体属性
phone_num = '123456789012' # 终端手机号
msg_seq = 1 # 消息流水号
header = MessageHeader(msg_id, msg_attr, phone_num, msg_seq) # 消息头
warning_flag = 0x00 # 报警标识
status_flag = 0x0001 # 状态标识
lat = 116300000 # 纬度,单位为1/10^6度
lon = 40000000 # 经度,单位为1/10^6度
altitude = 1000 # 海拔高度,单位为米
speed = 60 # 速度,单位为千米/小时
direction = 90 # 方向,单位为度
timestamp = 1234567890 # 时间戳
location = LocationReport(warning_flag, status_flag, lat, lon, altitude,
speed, direction, timestamp) # 消息体
msg_body = location.to_bytes() # 将消息体打包为字节流
msg_length = len(msg_body) # 消息体长度
msg_attr = 0x0000 | msg_length # 更新消息体属性中的消息体长度
header.msg_attr = msg_attr # 更新消息头
msg = header.to_bytes() + msg_body # 将消息头和消息体组合为完整消息
checksum = 0
for byte in msg:
checksum ^= byte # 计算校验码
msg += struct.pack("B", checksum) # 将校验码添加到消息尾部
msg += b"\x7e" # 添加消息尾
# 发送消息
send_msg(msg)
```
以上代码仅为示例,实际应用中需要根据具体需求进行修改和完善。
阅读全文