AS的APP接收HC-06蓝牙模块数据
这是我的一次课程设计,要求是下位机端用阅读器、单片机读出高频卡的卡号,上位机端通过HC-06蓝牙模块进行数据的接收,并做成小型的图书馆系统,具有借书、还书、注册登录、查询等功能。
虽然我是物联网的学生,但是无奈硬件知识很垃圾,使用的是51单片机和RC522阅读器,进行刷卡,显示卡号,首先要确保在串口上有正确的卡号输出,这样下位机才算完成。
上位机端的代码其实就是51单片机的代码,用的是KEIL软件编写的,其实是复制粘贴的,代码很好用,我会上传上来的。具体操作就是编译生成二进制文件(.hex),利用串口调试助手下载到单片机上,再打开串口,会发现接收到:+12f34e37.
+12f34e37.
+12f34e37.
其中(12f34e37)为高频卡的卡号,每一张卡都是不一样的,我在输出中添加了+.是为了传到上位机后,来作为识别一串卡号的标志,当然其它标志或其他方法都是可以的。
关于使用的软件:
这学期课程有Android Studio的学习,所以用这个软件进行APP的设计开发,另外其带有轻量级的数据库,所以就没有使用MYSQL、SQL,还下载了SQLiteStudio,以方便的进行数据库的建立与表的动态操作。
关于设计思路
1.首先接收下位机端传来的数据,即读到的卡号,这里采用了蓝牙模块,因此上位机端要设置蓝牙适配器,获得已配对的设备,从设备中找到要连接的设备建立连接并获取输入流。
以下为java的代码,布局文件先不贴了
public class Library extends Activity {
private BluetoothAdapter mBtAdapter;
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
private Button bt_dk;
private TextView rl_error;
InputStream inStream = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_library);
bt_dk = (Button) findViewById(R.id.bt_dk);
rl_error = (TextView) findViewById(R.id.rl_error);
//取得蓝牙适配器
mBtAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBtAdapter != null) {
if (!mBtAdapter.isEnabled()) {
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivity(intent);
}
}
// 获得已经配对的设备
Set pairedDevices = mBtAdapter.getBondedDevices();
BluetoothSocket socket = null;
if (pairedDevices.size() > 0) {
for (BluetoothDevice device : pairedDevices) {
// 从已经配对的设备中找到要连接的设备,在测试时将hello改成自己的蓝牙模块的名字
if ("hello".equals(device.getName())) {
rl_error.append(device.getName() + "\n" + device.getAddress() + "\n");
try {
//和已经配对的要连接的设备建立连接
socket = device.createRfcommSocketToServiceRecord(MY_UUID);
socket.connect();
} catch (IOException e) {
rl_error.append("创建或连接异常!\n");
if (socket != null) {
try {
socket.close();
} catch (IOException e1) {
rl_error.append("关闭异常!\n");
}
}
}
rl_error.append("创建成功!\n");
try {
// 获取输入
inStream = socket.getInputStream();
} catch (IOException e) {
rl_error.append("获取流异常!\n");
}
rl_error.append("获取流成功!\n");
}
}
}
bt_dk.setOnClickListener(new View.OnClickListener() {//点击读卡按钮,对获取的流进行读操作
@Override
public void onClick(View v) {
StringBuffer str=new StringBuffer();
try{
for(int i=1;i<=13;i++) {
str.append("" + (char) (inStream.read()));//不断的读并转化为char型
}
int begin=(str.toString()).indexOf("+");//这里就是对下位机的标志的使用
int end=(str.toString()).indexOf(".",begin);
String newStr=str.substring(begin+1,end);//得到一串正确的卡号
rl_et.setText(newStr);
}
catch (IOException e) {
rl_error.append("传输失败!\n");
}
}
});
class MyHelper extends SQLiteOpenHelper{//创建该类用以数据库的创建
public MyHelper(Context context){
super(context,"mydb.db",null,1);
}
@Override
public void onCreate(SQLiteDatabase db) {//在创建库的时候第一次调用,而后不再调用
db.execSQL("CREATE TABLE user(user_id varchar(30) primary key autoincrement,user_name varchar(20))");
db.execSQL("CREATE TABLE book(book_id text primary key autoincrement,book_name text,book_author text,book_date Date,book_public text)");
db.execSQL("CREATE TABLE lend(book_id text,user_id text,book_jdate Date,book_hdate Date)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
}
}
//在代码中使用MyHelper myhelper=new MyHelper();即表示创建了数据库的其三张表,以后可利用myhelper的相关操作进行数据库的打开
//这是数据库的插入操作
SQLiteDatabase db=myhelper.getWritableDatabase();
ContentValues values=new ContentValues();//用来放插入值得values对象
values.put("user_id",id);//i为卡号字符串,user_id是要插入的列的名
values.put("user_name",name);
values.put("money",new Double(10));
db.insert("user",null,values);
Toast.makeText(registerLibrary.this,"信息添加成功",Toast.LENGTH_LONG).show();
db.close();
//也可以使用execSQL("insert into user values(id,name,10.00)");这样使用SQL语句也比较方便
//查询操作
public int find(String id,String name){
int result=0;
SQLiteDatabase db=myhelper.getReadableDatabase();
Cursor cursor=db.query("user",null,"user_name=?",new String[]{name},
null,null,null);
if(cursor.moveToNext()){
result=1;//表示在user表中查到了user_name=name的一条记录
}
cursor=db.query("user",null,"user_id=?",new String[]{id},
null,null,null);
if(cursor.moveToNext()){
result=2;//表示在user表中查到了user_id=id的一条记录
}
cursor.close();
db.close();
return result;
}
}
//删除操作
SQLiteDatabase db=myhelper.getReadableDatabase();
db.delete("lend","user_id=? and book_id=?",new String[]{uid,newStr});
db.close();
//修改操作,建立于查操作之上
cur=db.query("user",null,"user_id=?",new String[]{uid},
null,null,null);
cur.moveToFirst();
double mon=cur.getDouble(2);//要修改的列是第三列money,注意下标从0开始
ContentValues values=new ContentValues();
values.put("money",new Double(mon-0.1*Math.abs(days)));
db.update("user",values,"user_id=?",new String[]{uid});
接下来数据库的查看,我使用的是SQLiteStudio,它需要一些配置,不过很简单了,百度一你就知道了,打开后一定要运行着手机上的软件,或者虚拟机的软件,这样才能查看数据库,很方便的,也可以修改等等。
SQLiteStudio的安装配置: https://blog.csdn.net/ware00/article/details/80595496.
代码我会等下上传到码云并给出链接,有很多不足的地方还需要改进,欢迎大家指点。
上位机和下位机的链接:https://gitee.com/w9z7/codes