当前位置:编程学习 > JAVA >>

JNative 参数问题,求解

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类型参数,各位大侠帮忙。 --------------------编程问答-------------------- 在线等... --------------------编程问答-------------------- 传输模式:0
传输协议:1
服务启动成功! --------------------编程问答--------------------
引用 2 楼 cattle_tao 的回复:
传输模式:0
传输协议:1
服务启动成功!


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

引用 3 楼 alexandertech 的回复:
引用 2 楼 cattle_tao 的回复:

传输模式:0
传输协议:1
服务启动成功!


搞定了?
--------------------编程问答-------------------- 补充:

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();
}
}
}

--------------------编程问答-------------------- 有木有人? --------------------编程问答--------------------
引用 4 楼 cattle_tao 的回复:
没有搞定, 现在只是服务启动成功, 数据还没读到。。第三个Boolean类型的参数怎么传递 ?


引用 3 楼 alexandertech 的回复:
引用 2 楼 cattle_tao 的回复:

传输模式:0
传输协议:1
服务启动成功!


搞定了?

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

--------------------编程问答-------------------- 结构体为
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
--------------------编程问答-------------------- 传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); 


引用 7 楼 qybao 的回复:
引用 4 楼 cattle_tao 的回复:
没有搞定, 现在只是服务启动成功, 数据还没读到。。第三个Boolean类型的参数怎么传递 ?


引用 3 楼 alexandertech 的回复:
引用 2 楼 cattle_tao 的回复:

传输模式:0
传输协议:1
服务启动成功!


搞定了?

你需要传true还是false,那取决于你是否需要发送应答
JN……
--------------------编程问答-------------------- boolean传0和1? --------------------编程问答-------------------- 传0或1 也没有得到数据.
引用 10 楼 liboofsc 的回复:
boolean传0和1?
--------------------编程问答-------------------- have a try
setParameter(int pos, Type type, String value);
setParameter(int pos, Boolean.class, "false");

--------------------编程问答-------------------- 我想知道C++如何实现
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,