JNative 参数问题,求解

cattle_tao cattle_tao 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
do_read_proc
函数声明
DSCDLLAPI int HDCALL do_read_proc(data_record *recdPtr,char *mess,BOOL reply);
描述
本函数用来读取DTU发送过来的数据,并且进行处理:
收到的数据是DTU的注册包时,将自动给DTU返回确认信息,并改写recdPtr参数(该参数的具体值请看DTU数据结构);
收到的数据是DTU的数据包时,将把数据分解到recdPtr参数,如果reply参数设置为TRUE,将对本次收到的DTU数据进行应答(一般测试程序时可设置为TRUE,发布程序时设置为FALSE);
收到的是无效数据包时,表明DSC上一次发送给DTU的数据包存在错误,这种情况通常出现在参数配置时,对参数的赋值出现错误;
收到的是参数查询应答包时,用户可以调用GetParam函数来对参数进行读取;
收到的是参数设置成功应答包时,表明DTU已经成功完成参数设置。

由于do_read_proc内部集合了处理DDP协议包的功能,因此编程时必须保证该函数被高频率的执行,以保证DTU注册和心跳可以成功。可以采用消息模式(SetWorkMode(2)),当消息触发的时候,马上执行do_read_proc;或者采用非阻塞方式,启用一个定时器,每过一小段时间(最好小于500毫秒)执行一次do_read_proc。

do_read_proc函数有三种读取方式:阻塞、非阻塞、消息方式,这些方式可由SetWorkMode函数来设定。
当SetWorkMode设置为0时,do_read_proc处于阻塞读取方式,do_read_proc函数只有读取到数据时才会返回。在这种方式下程序应该设计为多线程方式,当要关闭服务时,需要调用cancel_read_block函数。
当SetWorkMode设置为1时,do_read_proc处于非阻塞方式,无论能否读取到数据,do_read_proc函数都将立即返回。这种方式下的程序可以采用多线程或定时器方式进行设计。
当SetWorkMode设置为2时,start_net_service函数的hWnd参数和wMsg参数必须设置成有意义的值,当有DTU数据到达DSC时,将触发wMsg消息到hWnd,此时程序应该马上执行do_read_proc。

参数
recdPtr 存放数据的结构指针。可以根据其成员m_data_type来判断收到的数据类型。
mess 执行信息缓存,如果不需要,可以设置为NULL。
reply 收到用户数据后是否给DTU应答。

返回值
如果读取到数据,返回0;否则返回-1。
需要注意的时,当设置为非阻塞方式时,返回-1只是表明没有读取到数据,而不是发生错误。


public class DataRecord extends AbstractBasicData<DataRecord> {

private static final int MAX_RECEIVE_BUF = 1024;

byte[] m_userid = new byte[12]; // 终端模块号码m_userid(1 To 12) As Byte
byte[] m_recv_date = new byte[20]; // 接收到数据包的时间m_recv_date(1 To 20) As Byte
byte[] m_data_buf = new byte[MAX_RECEIVE_BUF]; // 存储接收到的数据m_data_buf(1 To MAX_RECEIVE_BUF) As Byte
short m_data_len; // 接收到的数据包长度m_data_len As Integer
byte m_data_type; // 接收到的数据包类型m_data_type As Byte

public DataRecord() throws NativeException {
super(null);
createPointer();
mValue = this;
}

public Pointer createPointer() throws NativeException {
pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(getSizeOf()));
return pointer;

}

public int getSizeOf() {
return 12 + 20 + 1024 + 16 + 1; // 8 WORDS of 2 bytes
}

public DataRecord getValueFromPointer() throws NativeException {
for(int i=0; i< m_userid.length; i++){
m_userid[i] = getNextByte();
}
for(int i=0; i< m_recv_date.length; i++){
m_recv_date[i] = getNextByte();
}
for(int i=0; i< m_data_buf.length; i++){
m_data_buf[i] = getNextByte();
}
m_data_len = getNextShort();
m_data_type = getNextByte();
return this;
}

public static DataRecord nGetDataRecord() throws NativeException, IllegalAccessException {
JNative nGetDataRecord = new JNative("wcomm_dll.dll", "do_read_proc");
DataRecord dataRecord = new DataRecord();
nGetDataRecord.setParameter(0, dataRecord.getPointer());
nGetDataRecord.setParameter(1, new NullPointer());
//nGetDataRecord.setParameter(2, ??);
nGetDataRecord.invoke();// 调用方法
return dataRecord.getValueFromPointer();
}

public static void main(String[] args) throws NativeException, IllegalAccessException {
DataRecord dataRecord = nGetDataRecord();
System.out.println("m_data_type:"+dataRecord.m_data_type);
System.out.println("m_data_len:"+dataRecord.m_data_len);
System.out.print("m_userid:");
for(int i=0; i< dataRecord.m_userid.length; i++){
System.out.print(dataRecord.m_userid[i]);
}
System.out.println();
System.out.print("m_recv_date:");
for(int i=0; i< dataRecord.m_recv_date.length; i++){
System.out.print(dataRecord.m_recv_date[i]);
}
System.out.println();
System.out.print("m_data_buf:");
for(int i=0; i< dataRecord.m_data_buf.length; i++){
System.out.print(dataRecord.m_data_buf[i]);
}
System.out.println();
}


}


第三个参数为boolean类型参数,各位大侠帮忙。
...全文
评论 13
收藏 已收藏
分享
返回顶部
cattle_tao
Java EE 67,535 成员 225,843 内容