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类型参数,各位大侠帮忙。

解决方案 »

  1.   

    没有搞定, 现在只是服务启动成功, 数据还没读到。。第三个Boolean类型的参数怎么传递 ?
      

  2.   

    补充:package test;import org.xvolks.jnative.JNative;
    import org.xvolks.jnative.Type;
    import org.xvolks.jnative.pointers.NullPointer;public class JnativeCall implements Runnable {
    public static void main(String[] args) {
    try {
    JnativeCall jnativeCall = new JnativeCall();
    //设置传输模式
    System.out.println("传输模式:" + jnativeCall.SetWorkMode(0));
    //设置传输协议
    System.out.println("传输协议:" + jnativeCall.SelectProtocol(1));
    //启动服务并设置端口
    String startFlag = jnativeCall.startNetService();
    if(startFlag.equals("0")){
    System.out.println("服务启动成功!");
    }else{
    System.out.println("服务启动失败!");
    }
    DataRecord dataRecord = jnativeCall.doReadProc();
    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();
    System.out.println("---------------------------------");
    // Thread thread = new Thread(jnativeCall);
    // thread.start();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    public String SetWorkMode(int mode) throws Exception{
    JNative start = null;
    try {
    start = new JNative("wcomm_dll.dll", "SetWorkMode");
    start.setRetVal(Type.INT);
    start.setParameter(0, mode);

    start.invoke();// 调用方法
    return start.getRetVal();
    }finally{
    if (start != null) {
    start.dispose();// 释放
    }
    }
    }
    public String SelectProtocol(int protocal) throws Exception{
    JNative start = null;
    try {
    start = new JNative("wcomm_dll.dll", "SelectProtocol");
    start.setRetVal(Type.INT);
    start.setParameter(0, protocal);

    start.invoke();// 调用方法
    return start.getRetVal();
    }finally{
    if (start != null) {
    start.dispose();// 释放
    }
    }
    }

    public String startNetService() throws Exception{
    JNative start = null;
    try {
    start = new JNative("wcomm_dll.dll", "start_net_service");
    start.setRetVal(Type.INT);
    start.setParameter(0, new NullPointer());
    start.setParameter(1, 0);
    start.setParameter(2, 3000);
    start.setParameter(3, new NullPointer());

    start.invoke();// 调用方法
    return start.getRetVal();
    }finally{
    if (start != null) {
    start.dispose();// 释放
    }
    }
    }

    public String stopNetService() throws Exception{
    JNative start = null;
    try {
    start = new JNative("wcomm_dll.dll", "stop_net_service");
    start.setRetVal(Type.INT);

    start.invoke();// 调用方法
    return start.getRetVal();
    }finally{
    if (start != null) {
    start.dispose();// 释放
    }
    }
    }

    public DataRecord doReadProc() throws Exception{
    JNative start = null;
    DataRecord dataRecord = new DataRecord();
    try {
    start = new JNative("wcomm_dll.dll", "do_read_proc");
    start.setRetVal(Type.VOID);
    start.setParameter(0, dataRecord.getPointer());
    start.setParameter(1, new NullPointer());

    start.invoke();// 调用方法
    return dataRecord.getValueFromPointer();
    }finally{
    if (start != null) {
    start.dispose();// 释放
    }
    }
    } /**
     * 让代码再飞一会
     */
    public void run() {
    System.out.println("JnativeCall run ...");
    try {
    boolean flag = true;
    while(flag){
    doReadProc();
    Thread.sleep(3000);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
      

  3.   

    你需要传true还是false,那取决于你是否需要发送应答
    JNative没用过,不过从你的代码来看
    nGetDataRecord.setParameter(2, Boolean.FALSE); //or Boolean.TRUE或者直接用简单的布尔类型应该就可以了
      

  4.   

    结构体为
    Public Type data_record
        m_userid(1 To 12) As Byte                   '终端模块号码
        m_recv_date(1 To 20) As Byte                '接收到数据包的时间
        m_data_buf(1 To MAX_RECEIVE_BUF) As Byte    '存储接收到的数据
        m_data_len As Integer                       '接收到的数据包长度
        m_data_type   As Byte                       '接收到的数据包类型
    End Type
      

  5.   

    传false
    setParameter(int pos, int value);
    setParameter(int pos, String value);
    setParameter(int pos, Pointer pointer);
    setParameter(int pos, Type agr1, byte[] agr2);
    setParameter(int pos, Type type, String value);
    参数类型并没有 Boolean 类型选择nGetDataRecord.setParameter(2, Boolean.FALSE); 
      

  6.   

    have a try
    setParameter(int pos, Type type, String value);
    setParameter(int pos, Boolean.class, "false");