UK啊UK,想说爱你不容易!和你说句话费老大劲了~
这两天的工作就是和UK进行联系,想来想去,把UK作为唠嗑儿的对象再合适不过了,没错儿,我就是想把它当小黄鸡使唤,能陪人聊天的UK多贴心哪!
凡是都是想起来简单做起来难,让UK变身小黄鸡真是费了我好大的功夫,且不说C语言的函数名儿都得用内置的新函数,就连正常C的功能也不一定能如你所愿,这就是硬件开发和软件的开发的最大的区别吧!短短的几行程序,其中出现了多少的狗血问题我就不说了,单单是调试的时候没办法知道变量的值就让人很憋屈,想用printf把值输出来都不行,哪有控制台啊!以后达叔就要和它相依为命了,好可怜啊。
一顿折腾之后有了最后的C程序
#include"ses_v3.h"
#include"string.h"
main()
{
int ret = 0,i=0;
char in;
char out[80]="";
char test[30]="";
char news[10][50] = { "干掉熊猫,我就是国宝!",
"不吃饱哪有力气减肥啊?",
"我喜欢你离我远一点!",
"人又不聪明,还学别人秃顶。",
"你喜欢我一下会死啊? " ,
"我能抵抗一切,除了诱惑",
"跌倒了,爬起来再哭",
"还没来得及表白,愚人节就过去了。",
"格式化自己,就是为了删除你。",
"天哪,我的衣服又瘦了!"};
char message[40]="客官,你总得说点儿什么吧";//不说话时UK返回的语句
ret = _mem_copy(&in, (char*)&pbInBuff,1);
//_set_response(2,(BYTE *)&i);
if(in==NULL)
{
_set_response(strlen(message),message);
_exit();
}
/*随机选择一个句子,复制到输出数组中*/
_rand(1,(BYTE *)&i);
i=i%10;
ret = _mem_copy(out,news[i],strlen(news[i]));
if(ret != SES_SUCCESS)
{
_set_response(strlen(message),message);
_exit();
}
/*将数据内容传出*/
_set_response(strlen(out),(BYTE *)out);
/*终止程序*/
_exit();
return 0;
}
好在开发商提供了模拟器,可以模拟执行的结果,模拟器界面如下
执行完之后会返回结果
接下来是java程序,有例子就好办,经过修改后的程序为
import com.sun.jna.*;
import java.util.Date;
import com.sun.jna.Library;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.*;
import java.io.*;
public class Sense4Demo
{
public Sense4Demo()
{
}
public static void main(String agrs[])
{
Sense4Lib lib = Sense4Lib.instance;
Sense4Lib.Sense4_CONTEXT ctx[] = null;
IntByReference pSize = new IntByReference(0);
IntByReference fsize = new IntByReference(0);
byte old_pin [] ={49,50,51,52,53,54,55,56};
byte new_pin [] ={56,55,54,53,52,51,50,49};
byte dev_pin [] ={49,50,51,52,53,54,55,56,49,50,51,52,53,54,55,56,49,50,51,52,53,54,55,56};
byte []sn=new byte[8];
byte device_id []={83,69,78,83,69,101,108};
byte para1 []={01};
byte para2 []={00};
byte []out = new byte[60];
int ret=0;
// 列举锁,第一次获取锁信息列表大小pSize,
lib.S4Enum(null,pSize);
// 根据列表大小,分配本地空间
ctx = new Sense4Lib.Sense4_CONTEXT[pSize.getValue()/92];
for (int i = 0; i < pSize.getValue()/92; i++)
ctx[i] = new Sense4Lib.Sense4_CONTEXT();
// 列举锁,第二次将信息填入本地分配的列表ctx[0]
ret=lib.S4Enum(ctx[0],pSize);
if(ret!=lib.S4_SUCCESS)
{
System.out.printf("enum device failed! 0x%08x\n", ret);
}
else
System.out.println("enum device successed! ");
// 打开锁
ret = lib.S4Open(ctx[0]);
if(ret!=lib.S4_SUCCESS)
{
System.out.printf("open device failed! 0x%08x\n", ret);
}
else
System.out.println("open device successed! ");
// 获取序列号
ret = lib.S4Control(ctx[0],lib.S4_GET_SERIAL_NUMBER,null,0,sn,8,pSize);
if(ret!=lib.S4_SUCCESS)
{
System.out.printf("get serial number failed! 0x%08x\n", ret);
lib.S4Close(ctx[0]);
}
else
System.out.println("get serial number successed! ");
// 验证管理员PIN
ret = lib.S4VerifyPin(ctx[0],dev_pin,24,Sense4Lib.S4_DEV_PIN);
if(ret!=lib.S4_SUCCESS)
{
System.out.printf("verify pin failed! 0x%08x\n", ret);
lib.S4Close(ctx[0]);
}
else
System.out.println("verify pin successed! ");
// 擦除目录
ret=lib.S4EraseDir(ctx[0],null);
if(ret!=lib.S4_SUCCESS)
{
System.out.printf("erase dir failed! 0x%08x\n", ret);
lib.S4Close(ctx[0]);
}
else
System.out.println("erase dir successed! ");
// 重新建立目录
Sense4Lib.S4CREATEDIRINFO dir_info =new Sense4Lib.S4CREATEDIRINFO();
dir_info.dwS4CreateDirInfoSize = 272;//sizeof(Sense4Lib.S4CREATEDIRINFO);
dir_info.szAtr = device_id;
ret =lib.S4CreateDirEx(ctx[0],"\\",0,Sense4Lib.S4_CREATE_ROOT_DIR,dir_info);
if(ret!=lib.S4_SUCCESS)
{
System.out.printf("create root dir failed! 0x%08x\n", ret);
lib.S4Close(ctx[0]);
}
else
System.out.println("create root dir successed! ");
// 定位锁内错做目录
ret=lib.S4ChangeDir(ctx[0],"\\");
if(ret!=lib.S4_SUCCESS)
{
System.out.printf("change dir failed! 0x%08x\n", ret);
lib.S4Close(ctx[0]);
}
else
System.out.println("change dir successed! ");
// 修改用户PIN
ret = lib.S4ChangePin(ctx[0],old_pin,8,new_pin,8,Sense4Lib.S4_USER_PIN);
if(ret!=lib.S4_SUCCESS)
{
System.out.printf("change pin failed! 0x%08x\n", ret);
lib.S4Close(ctx[0]);
}
else
System.out.println("change pin successed! ");
// 还原用户PIN
ret = lib.S4ChangePin(ctx[0],new_pin,8,old_pin,8,Sense4Lib.S4_USER_PIN);
// 验证管理员PIN
ret = lib.S4VerifyPin(ctx[0],dev_pin,24,Sense4Lib.S4_DEV_PIN);
if(ret!=lib.S4_SUCCESS)
{
System.out.printf("verify pin failed! 0x%08x\n", ret);
lib.S4Close(ctx[0]);
}
else
System.out.println("verify pin successed! ");
// 写入文件,需要管理员权限
ret = lib.PS4WriteFile(ctx[0],"0001","test.hex",fsize,Sense4Lib.S4_CREATE_NEW,Sense4Lib.S4_HEX_FILE,pSize);
if(ret!=lib.S4_SUCCESS)
{
System.out.printf("write hex file failed! 0x%08x\n", ret);
lib.S4Close(ctx[0]);
}
else
System.out.println("write hex file successed! ");
// 验证用户PIN
ret = lib.S4VerifyPin(ctx[0],old_pin,8,Sense4Lib.S4_USER_PIN);
if(ret!=lib.S4_SUCCESS)
{
System.out.printf("verify pin failed! 0x%08x\n", ret);
lib.S4Close(ctx[0]);
}
else
System.out.println("verify pin successed! ");
// 执行锁内程序
while(true)
{
String input = new String();
System.out.print("你: ");
try
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
input = br.readLine();
//System.out.println(input);
}
catch(IOException ex)
{
ex.printStackTrace();
}
//System.out.println("你: "string);
if(input.equals(""))
{
ret =lib.S4Execute(ctx[0],"0001",para2,1,out,50,pSize);
//System.out.println("是空");
}
else
{
ret =lib.S4Execute(ctx[0],"0001",para1,1,out,60,pSize);
//System.out.println("不是空");
}
if(ret!=lib.S4_SUCCESS)
{
System.out.printf("execute hex file failed! 0x%08x\n", ret);
lib.S4Close(ctx[0]);
}
else
{
//System.out.println("execute hex file successed! ");
String string = new String(out);
System.out.println("UK: "+string);
for(int i=0;i<60;i++)
{
out[i]=0;
}
}
}
}
}
开始运行的结果如下
用户输入句子时,UK会从数组中随机挑出一句话来回答,如果什么都不输入,UK会回答“客官,你总得说点儿什么吧“
看上图发现,回答内容有乱码,下一句如果比上一句短,则上一句的超出内容也会显示出来,看着相当别扭。
开始我以为是UK的程序有问题,改了很多次后还是出现问题,经过仔细思考后,发现是因为java程序的接受数组没有清0导致的(上方程序加粗部分)
修改后结果如下
还有最后一个问题,就是当说很多句话以后,UK会执行错误,提示外部指针引用错误(0x00200000),这个思考后也不太理解为什么?就交给达叔来处理吧!
总算是能够和聊天了,虽然说不了几句,而且反反复复就那么几句话,但总之是成功和UK交流了。它离真正的小黄鸡差了十万八千里,就叫它小小小黄鸡吧!
希望达叔能尽快给他升级!~