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
服务启动成功! --------------------编程问答--------------------
搞定了? --------------------编程问答-------------------- 没有搞定, 现在只是服务启动成功, 数据还没读到。。第三个Boolean类型的参数怎么传递 ?
--------------------编程问答-------------------- 补充:
--------------------编程问答-------------------- 有木有人? --------------------编程问答--------------------
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();
}
}
}
你需要传true还是false,那取决于你是否需要发送应答
JNative没用过,不过从你的代码来看
nGetDataRecord.setParameter(2, Boolean.FALSE); //or Boolean.TRUE或者直接用简单的布尔类型应该就可以了
--------------------编程问答-------------------- 结构体为
Public Type data_record--------------------编程问答-------------------- 传false
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
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);
--------------------编程问答-------------------- boolean传0和1? --------------------编程问答-------------------- 传0或1 也没有得到数据.
--------------------编程问答-------------------- have a try
setParameter(int pos, Type type, String value);
setParameter(int pos, Boolean.class, "false");
--------------------编程问答-------------------- 我想知道C++如何实现
补充:Java , Java EE